Compare commits

...

25 Commits
main ... 5.12.x

Author SHA1 Message Date
Evan Hahn 85792621df v5.12.2 2021-08-04 16:21:21 -05:00
Fedor Indutny 52880b5a8f
Fix onOffline in SocketManager 2021-08-04 14:10:37 -07:00
Evan Hahn 20f13cd515 v5.12.1 2021-08-04 14:52:50 -05:00
Fedor Indutny c506e0de49
confirmCode endpoint shouldn't reconnect socket 2021-08-04 12:46:37 -07:00
Evan Hahn b137d65128
Update translations 2021-08-04 13:09:01 -05:00
Scott Nonnenberg 18a4327005 v5.12.0 2021-08-03 17:04:10 -07:00
Scott Nonnenberg 017b63d3d2 Update translations 2021-08-03 17:04:10 -07:00
automated-signal 59b305668f
Fix undefined log function
Co-authored-by: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com>
2021-08-03 10:59:07 -07:00
Scott Nonnenberg 6f66efe390 v5.12.0-beta.3 2021-08-02 18:09:45 -07:00
Scott Nonnenberg 6357ba46f8 Add new language 2021-08-02 18:09:45 -07:00
Scott Nonnenberg f97369791d Update translations 2021-08-02 18:08:55 -07:00
automated-signal 6df1cf41dd
Sender Key: Proper 409-handling, save new members earlier
Co-authored-by: Scott Nonnenberg <scott@signal.org>
2021-08-02 18:01:57 -07:00
Fedor Indutny 12b10af63c
Revert "Process read syncs after batches of messages"
This reverts commit 8d49a6a8c5.
2021-08-02 16:18:22 -07:00
Scott Nonnenberg e715125d72
Unseal envelope in a separate step for better logs
Co-authored-by: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com>
2021-08-02 14:43:48 -07:00
automated-signal 1cd784e29a
Remove "delete for everyone" option from failed messages
Co-authored-by: Evan Hahn <69474926+EvanHahn-Signal@users.noreply.github.com>
2021-08-02 15:17:21 -05:00
Scott Nonnenberg 350c8fef42 v5.12.0-beta.2 2021-07-30 14:16:16 -07:00
Scott Nonnenberg ed82df4e54 Add new language 'pa' 2021-07-30 14:15:57 -07:00
Scott Nonnenberg 316518b2dc Update translations 2021-07-30 14:06:42 -07:00
automated-signal 8d49a6a8c5
Process read syncs after batches of messages
Co-authored-by: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com>
2021-07-30 13:56:36 -07:00
automated-signal e23eb38477
DeliveryIssueDialog: Add learn more button linking to support
Co-authored-by: Scott Nonnenberg <scott@signal.org>
2021-07-30 13:43:54 -07:00
automated-signal 9b37066139
Use 'aws s3 rsync' to upload linux builds, not aptly
Co-authored-by: Scott Nonnenberg <scott@signal.org>
2021-07-30 13:08:03 -07:00
automated-signal fa34394d65
Sender Key: Track registrationIds in senderKeyState
Co-authored-by: Scott Nonnenberg <scott@signal.org>
2021-07-30 13:07:42 -07:00
automated-signal 165e385a84
Use smaller batches for receipts and syncs
Co-authored-by: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com>
2021-07-29 18:42:41 -07:00
automated-signal 49c7a70a75
Properly handle connection timeout on unauthenticated websocket
Co-authored-by: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com>
2021-07-29 09:46:23 -07:00
automated-signal aca88f5592
Add assert to messages endpoint
Co-authored-by: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com>
2021-07-29 09:32:22 -05:00
106 changed files with 15345 additions and 2452 deletions

View File

@ -1,12 +0,0 @@
{
"S3PublishEndpoints": {
"signal-desktop-apt": {
"region": "us-east-1",
"bucket": "updates.signal.org",
"prefix": "desktop/apt",
"acl": "public-read",
"plusWorkaround": false,
"disableMultiDel": false
}
}
}

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Continue Without Verifying?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "تعذر توصيل رسالة نصية، ملصقة، رد فعل، وصل القراءة، أو وسيط من $sender$. يُحتمَل أنها أُرسلَت إليك مباشرة أو أنها قد أُرسلَت في مجموعة.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "لم يتمكن $sender$ من توصيل رسالة أو ملصق أو رد فعل أو وصل القراءة إليك في هذه المحادثة.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "هَل تُريد المُتابعة دُونَ تَحقُّق؟",
"message": "أأتابع دون تَحقُّق ؟",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Continue Without Verifying?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

File diff suppressed because it is too large Load Diff

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "No s'ha pogut lliurar cap missatge, adhesiu, reacció, rebut de lectura o contingut multimèdia de $sender$. És possible que hagin intentat enviar-vos-ho directament o en grup.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "No se us ha pogut lliurar un missatge, adhesiu, reacció, rebut de lectura o mitjà de $sender$ en aquesta conversa.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Zpráva, nálepka, reakce, doručenka nebo média od $sender$ vám nemohla být doručena. Možná se vám ji pokusili poslat přímo nebo ve skupině.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "Z tohoto chatu vám od $sender$ nemohla být doručena zpráva, nálepka, reakce, potvrzení o přečtení nebo médium.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Nid oedd modd trosglwyddo neges, sticer, ymateb, derbynneb ddarllen na chyfryngau i chi gan $sender$. Efallai eu bod wedi ceisio ei anfon atoch yn uniongyrchol, neu mewn grŵp.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "Methwyd anfon atoch neges, sticer, ymateb, derbynneb ddarllen neu gyrfryngau gan $sender$ yn y sgwrs hon.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Parhau Heb Wirio?",
"message": "Parhau heb wirio?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "En besked, klistermærke, reaktion, læsekvittering eller medier kunne ikke leveres til dig fra $sender$. De har muligvis forsøgt at sende det direkte til dig eller i en gruppe.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Vil du fortsætte uden at bekræfte?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Eine Nachricht, ein Sticker, eine Reaktion, eine Lesebestätigung oder ein Medieninhalt von $sender$ konnte dir nicht zugestellt werden. Der Versand wurde in einer direkten Unterhaltung oder einer Gruppenunterhaltung versucht.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "Eine Nachricht, ein Sticker, eine Reaktion, eine Lesebestätigung oder ein Medieninhalt von $sender$ konnte dir in dieser Unterhaltung nicht zugestellt werden.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Κάποιο μήνυμα, αντίδραση, αποδεικτικό ανάγνωσης ή πολυμέσο από τον/την $sender$ δεν μπόρεσε να σου παραδοθεί. Προσπάθησε να στο στείλει σε σένα απ' ευθείας ή σε κάποια ομάδα.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "Κάποιο μήνυμα, αυτοκόλλητο, αντίδραση, αποδεικτικό ανάγνωσης ή πολυμέσο από τον/την $sender$ σε αυτή τη συνομιλία δεν μπόρεσε να σου παραδοθεί.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Continue Without Verifying?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Un mensaje, sticker, reacción, justificante de recibo o adjunto de $sender$ no se ha podido entregar. Lo ha enviado en un chat o en un grupo común.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "No se ha podido entregar un mensaje, sticker, adjunto, reacción, justificante de recibo de $sender$ en este chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -3546,7 +3556,7 @@
"description": "Shown in toast when you attempt to forward a message to an announcement only group"
},
"GroupV2--add--missing-capability": {
"message": "Estas persona deben actualizar Signal para participar en el grupo. ",
"message": "Estas personas deben actualizar Signal para participar en el grupo. ",
"description": "Shown in a confirmation dialog when members who cannot view announcement only group cannot be added"
},
"GroupV2--cannot-start-group-call": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Kas jätkata ilma kinnitamata?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Continue Without Verifying?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -4726,7 +4736,7 @@
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--admin--you": {
"message": "You changed the group settings to only allow admins to send messages.",
"message": "شما تنظیمات گروه را تغییر دادید تا فقط به مدیران اجازهٔ ارسال پیام بدهید.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--admin--other": {
@ -4744,7 +4754,7 @@
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--member--you": {
"message": "You changed the group settings to allow all members to send messages.",
"message": "شما تنظیمات گروه را تغییر دادید تا به همهٔ اعضا اجازهٔ ارسال پیام بدهید.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--member--other": {
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "ادامه بدون تأیید کردن؟",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {
@ -5812,7 +5822,7 @@
"description": "Error message when something goes wrong updating your profile."
},
"AnnouncementsOnlyGroupBanner--modal": {
"message": "Message an admin",
"message": "به یک مدیر پیام دهید",
"description": "Modal title for the list of admins in a group"
},
"AnnouncementsOnlyGroupBanner--announcements-only": {
@ -5826,7 +5836,7 @@
}
},
"AnnouncementsOnlyGroupBanner--admins": {
"message": "admins",
"message": "مدیران",
"description": "Clickable text describing administrators of a group, used in the message an admin label"
}
}

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Continue Without Verifying?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Un message, un autocollant, une réaction, un accusé de lecture ou un contenu multimédia de $sender$ na pas pu vous être remis. Cette personne pourrait avoir tenté de vous lenvoyer directement ou dans un groupe.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "Un message, un autocollant, une réaction ou un accusé de lecture de $sender$ na pas pu vous être remis dans cette conversation.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",

5842
_locales/gu/messages.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "הודעה, מדבקה, תגובה, אישור קריאה או מדיה לא יכלו להימסר אליך מאת $sender$. הצד השני ניסה אולי לשלוח זאת ישירות אליך, או בקבוצה.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "הודעה, מדבקה, תגובה, אישור קריאה או מדיה לא יכלו להימסר אליך מאת $sender$ בהתכתבות זו.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "$sender$ की ओर से आपको कोई मैसेज, स्टिकर, रिएक्शन, रीड रिसीट या मीडिया डिलीवर नहीं किया जा सका। हो सकता है कि उन्होंने इसे सीधे आपको या किसी समूह में भेजने का प्रयास किया हो।",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -4726,7 +4736,7 @@
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--admin--you": {
"message": "You changed the group settings to only allow admins to send messages.",
"message": "आपने ग्रुप सेटिंग को केवल व्यवस्थापकों को संदेश भेजने की अनुमति देने के लिए बदल दिया है।",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--admin--other": {
@ -4744,7 +4754,7 @@
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--member--you": {
"message": "You changed the group settings to allow all members to send messages.",
"message": "आपने सभी सदस्यों को संदेश भेजने की अनुमति देने के लिए ग्रुप सेटिंग्स बदल दी हैं।",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--member--other": {
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "सत्यापित किए बिना जारी रखें?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {
@ -5738,7 +5748,7 @@
"description": "In the message details screen, shown above contacts who have read this message"
},
"MessageDetailsHeader--Viewed": {
"message": "Viewed by",
"message": "के द्वारा देखा गया",
"description": "In the message details screen, shown above contacts who have viewed this message"
},
"ProfileEditor--about": {
@ -5780,7 +5790,7 @@
"description": "A default bio option"
},
"Bio--encrypted": {
"message": "Encrypted",
"message": "एन्क्रिप्टेड",
"description": "A default bio option"
},
"Bio--free-to-chat": {
@ -5812,7 +5822,7 @@
"description": "Error message when something goes wrong updating your profile."
},
"AnnouncementsOnlyGroupBanner--modal": {
"message": "Message an admin",
"message": "व्यवस्थापक को संदेश भेजें",
"description": "Modal title for the list of admins in a group"
},
"AnnouncementsOnlyGroupBanner--announcements-only": {
@ -5826,7 +5836,7 @@
}
},
"AnnouncementsOnlyGroupBanner--admins": {
"message": "admins",
"message": "व्यवस्थापक",
"description": "Clickable text describing administrators of a group, used in the message an admin label"
}
}

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Poruka, naljepnica, reakcija, potvrda o čitanju ili medijski zapis nisu vam mogli biti dostavljeni od $sender$. Možda pokušali poslati vama izravno ili u grupi.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Nastavi bez provjere?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Folytatod ellenőrzés nélkül?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Sebuah pesan, stiker, tanggapan, tanda pesan terbaca atau media tidak dapat Anda terima dari$sender$. Mereka mungkin mencoba mengirimkannya secara langsung, atau di dalam grup.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Lanjutkan Tanpa Verifikasi?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Ekki var hægt að afhenda til þín skilaboð, límmerki, viðbrögð eða leskvittun frá $sender$. Mögulega var reynt að senda þetta til þín beint eða í hópi.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "Ekki var hægt að afhenda til þín skilaboð, límmerki, viðbrögð eða leskvittun frá $sender$ í þessu spjalli.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -3542,11 +3552,11 @@
"description": "Shown if you click on a sgnl:// link not currently supported by Desktop"
},
"GroupV2--cannot-send": {
"message": "You cannot send messages to that group.",
"message": "Þú getur ekki sent skilaboð á þennan hóp.",
"description": "Shown in toast when you attempt to forward a message to an announcement only group"
},
"GroupV2--add--missing-capability": {
"message": "These people cannot be added to the group until they upgrade Signal.",
"message": "Þessum aðilum er ekki hægt að bæta í hópinn fyrr en þeir uppfæra Signal.",
"description": "Shown in a confirmation dialog when members who cannot view announcement only group cannot be added"
},
"GroupV2--cannot-start-group-call": {
@ -3650,7 +3660,7 @@
"description": "Shown if something went wrong when you try to join via a group link"
},
"GroupV2--join--general-join-failure": {
"message": "Couldn't join group. Try again later.",
"message": "Gat ekki gengið í hópinn. Prófaðu aftur síðar.",
"description": "Shown if something went wrong when you try to join via a group link"
},
"GroupV2--admin": {
@ -4984,11 +4994,11 @@
"description": "This is the additional info for the 'who can add members' panel"
},
"ConversationDetails--announcement-label": {
"message": "Who can send messages",
"message": "Hverjir geta sent skilaboð",
"description": "This is the additional info for the 'who can send messages' panel"
},
"ConversationDetails--announcement-info": {
"message": "Choose who can send messages to the group.",
"message": "Veldu hverjir geta sent skilaboð á þennan hóp.",
"description": "This is the additional info for the 'who can send mesages' panel"
},
"ConversationDetails--requests-and-invites": {
@ -5232,7 +5242,7 @@
"description": "The label for the avatar uploader when no group photo is selected"
},
"AvatarInput--no-photo-label--profile": {
"message": "Add a photo",
"message": "Bæta við ljósmynd",
"description": "The label for the avatar uploader when no profile photo is selected"
},
"AvatarInput--change-photo-label": {
@ -5746,7 +5756,7 @@
"description": "Default text for about field"
},
"ProfileEditor--about-placeholder": {
"message": "Write something about yourself...",
"message": "Skrifaðu nokkur orð um sjálfa/n þig...",
"description": "Placeholder text for about input field"
},
"ProfileEditor--first-name": {
@ -5762,7 +5772,7 @@
"description": "ConfirmationDialog text for discarding changes"
},
"ProfileEditor--info": {
"message": "Your profile is encrypted. Your profile and changes to it will be visible to your contacts and when you start or accept new chats. $learnMore$",
"message": "Notandasniðið þitt er dulritað. Notandasniðið þitt og breytingar á því verður sýnilegt tengiliðunum þínum þegar þú byrjar eða samþykkir ný samtöl.\n$learnMore$",
"description": "Information shown at the bottom of the profile editor section",
"placeholders": {
"learnMore": {
@ -5812,11 +5822,11 @@
"description": "Error message when something goes wrong updating your profile."
},
"AnnouncementsOnlyGroupBanner--modal": {
"message": "Message an admin",
"message": "Senda stjórnanda skilaboð",
"description": "Modal title for the list of admins in a group"
},
"AnnouncementsOnlyGroupBanner--announcements-only": {
"message": "Only $admins$ can send messages",
"message": "Einungis $admins$ geta sent skilaboð",
"description": "Displayed if sending of messages is disabled to non-admins",
"placeholders": {
"admins": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Non è stato possibile consegnarti un messaggio, un adesivo, una reazione, una conferma di lettura o un media da $sender$. Potrebbero aver provato a inviartelo direttamente o in gruppo.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "Non è stato possibile consegnarti un messaggio, un adesivo, una reazione, una conferma di lettura o un media da $sender$ in questa chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "$sender$ からのメッセージ、ステッカー、リアクション、既読通知またはメディアを、あなたに配信できませんでした。直接またはグループで、送信しようとしているかもしれません。",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "このチャットで、$sender$からのメッセージ、ステッカー、メディア、リアクションまたは既読通知をあなたに配信できませんでした。",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "認証なしに続けますか?",
"message": "認証せずに続けますか?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Continue Without Verifying?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

File diff suppressed because it is too large Load Diff

View File

@ -56,7 +56,7 @@
"description": "The label that is used for the Preferences menu in the program main menu. This should be consistent with the standard naming for Preferences on the operating system."
},
"appMenuServices": {
"message": "Services",
"message": "서비스",
"description": "Application menu item for macOS 'Services'"
},
"appMenuHide": {
@ -622,7 +622,7 @@
}
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error. Click to submit a debug log.",
"message": "데스크톱에 해독 오류가 발생했습니다. 클릭하여 디버그 로그를 제출해 주세요.",
"description": "An error popup when we haven't added an error for decryption error."
},
"oneNonImageAtATimeToast": {
@ -678,7 +678,7 @@
"description": "View menu item to open the debug log (title case)"
},
"forceUpdate": {
"message": "Force Update",
"message": "강제 업데이트",
"description": "View menu item to force the app to update download and install"
},
"helpMenuShowKeyboardShortcuts": {
@ -770,7 +770,7 @@
}
},
"noSearchResults--sms-only": {
"message": "SMS/MMS contacts are not available on Desktop.",
"message": "SMS/MMS 연락처는 데스크톱에서 사용할 수 없습니다.",
"description": "Shown in the search left pane when no results were found and primary device has SMS/MMS handling enabled"
},
"noSearchResultsInConversation": {
@ -1170,12 +1170,22 @@
"description": "Shown in timeline when message delivery issue happens, to provide access to a popup info dialog"
},
"DeliveryIssue--title": {
"message": "Delivery Issue",
"message": "전달 문제",
"description": "Shown on explainer dialog available from delivery issue timeline events"
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"message": "$sender$ 님이 보낸 메시지, 스티커, 리액션, 수신 확인 또는 미디어를 전달할 수 없습니다. 직접 또는 그룹으로 전달하려고 했을 수 있습니다.",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "채팅에서 $sender$ 님이 보낸 메시지, 스티커, 리액션, 수신 확인 또는 미디어를 전달할 수 없습니다.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -1328,15 +1338,15 @@
"description": "Button tooltip label for turning on the microphone"
},
"calling__button--presenting-disabled": {
"message": "Presenting disabled",
"message": "표시 비활성화됨",
"description": "Button tooltip label for when screen sharing is disabled"
},
"calling__button--presenting-on": {
"message": "Start presenting",
"message": "표시 시작",
"description": "Button tooltip label for starting to share screen"
},
"calling__button--presenting-off": {
"message": "Stop presenting",
"message": "표시 중단",
"description": "Button tooltip label for stopping screen sharing"
},
"calling__your-video-is-off": {
@ -1452,15 +1462,15 @@
"description": "Label for the \"scroll down\" button in a call's overflow area"
},
"calling__presenting--notification-title": {
"message": "You're presenting to everyone.",
"message": "모든 사람에게 표시하고 있습니다.",
"description": "Title for the share screen notification"
},
"calling__presenting--notification-body": {
"message": "Click here to return to the call when you're ready to stop presenting.",
"message": "표시를 중단할 준비가 되었을 때 통화로 돌아가려면 여기를 클릭하세요.",
"description": "Body text for the share screen notification"
},
"calling__presenting--info": {
"message": "Signal is sharing $window$.",
"message": "Signal이 $window$ 창을 공유하고 있습니다.",
"description": "Text that appears in the screen sharing controller to inform person that they are presenting",
"placeholders": {
"name": {
@ -1474,11 +1484,11 @@
"description": "Button for stopping screen sharing"
},
"calling__presenting--you-stopped": {
"message": "You stopped presenting",
"message": "표시를 중단했습니다.",
"description": "Toast that appears when someone stops presenting"
},
"calling__presenting--person-ongoing": {
"message": "$name$ is presenting",
"message": "$name$ 님이 표시 중입니다.",
"description": "Title of call when someone is presenting",
"placeholders": {
"name": {
@ -1488,7 +1498,7 @@
}
},
"calling__presenting--person-stopped": {
"message": "$name$ stopped presenting",
"message": "$name$ 님이 표시를 중단했습니다.",
"description": "Toast that appears when someone stops presenting",
"placeholders": {
"name": {
@ -1506,19 +1516,19 @@
"description": "Shown as the description for the modal that requests screen recording permissions"
},
"calling__presenting--permission-instruction-step1": {
"message": "Go to System Preferences.",
"message": "시스템 환경 설정으로 이동하세요.",
"description": "Shown as the description for the modal that requests screen recording permissions"
},
"calling__presenting--permission-instruction-step2": {
"message": "Click on the lock icon on the bottom left and enter your computers password.",
"message": "왼쪽 하단의 자물쇠 아이콘을 클릭하고 컴퓨터의 비밀번호를 입력하세요.",
"description": "Shown as the description for the modal that requests screen recording permissions"
},
"calling__presenting--permission-instruction-step3": {
"message": "On the right, check the box next to Signal. If you dont see Signal in the list, click the + to add it.",
"message": "오른쪽에서 Signal 옆의 체크 박스를 선택하세요. 목록에 Signal이 표시되지 않으면 +를 클릭하여 추가하세요.",
"description": "Shown as the description for the modal that requests screen recording permissions"
},
"calling__presenting--permission-open": {
"message": "Open System Preferences",
"message": "시스템 환경 설정 열기",
"description": "The button that opens your system preferences for the needs screen record permissions modal"
},
"calling__presenting--permission-cancel": {
@ -1550,7 +1560,7 @@
"description": "Header for general options on the settings screen"
},
"spellCheckDescription": {
"message": "Enable spell check",
"message": "맞춤법 검사 활성화",
"description": "Description of the spell check setting"
},
"spellCheckWillBeEnabled": {
@ -1562,15 +1572,15 @@
"description": "Shown when the user disables spellcheck to indicate that they must restart Signal."
},
"SystemTraySetting__minimize-to-system-tray": {
"message": "Minimize to system tray",
"message": "시스템 트레이로 최소화",
"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": "Start minimized to tray",
"message": "트레이로 최소화 시작",
"description": "In the settings, shown next to the checkbox option for starting in the system tray"
},
"autoLaunchDescription": {
"message": "Open at computer login",
"message": "컴퓨터 로그인 시 열기",
"description": "Description for the automatic launch setting"
},
"clearDataHeader": {
@ -1688,7 +1698,7 @@
"description": "Shown on outgoing message if it fails to send"
},
"sendPaused": {
"message": "Send paused",
"message": "전송 일시 정지됨",
"description": "Shown on outgoing message if it cannot be sent immediately"
},
"partiallySent": {
@ -2036,7 +2046,7 @@
"description": "Shown in the alert when you add the maximum number of group members"
},
"chooseGroupMembers__maximum-group-size__body": {
"message": "Signal groups can have a maximum of $max$ members.",
"message": "Signal 그룹에는 최대 $max$명의 구성원이 있을 수 있습니다.",
"description": "Shown in the alert when you add the maximum number of group members",
"placeholders": {
"max": {
@ -2050,7 +2060,7 @@
"description": "Shown in the alert when you add the maximum recommended number of group members"
},
"chooseGroupMembers__maximum-recommended-group-size__body": {
"message": "Signal groups perform best with $max$ members or less. Adding more members will cause delays sending and receiving messages.",
"message": "Signal 그룹은 $max$명 이하의 구성원이 있을 때 최고의 성능을 보여줍니다. 구성원을 더 많이 추가하면 메시지 송수신이 지연됩니다.",
"description": "Shown in the alert when you add the maximum recommended number of group members",
"placeholders": {
"max": {
@ -2064,7 +2074,7 @@
"description": "Shown in the alert when you try to add someone who can't be added to a group"
},
"chooseGroupMembers__cant-add-member__body": {
"message": "\"$name$\" cant be added to the group because theyre using an old version of Signal. You can add them to the group after theyve updated Signal.",
"message": "'$name$' 님은 이전 버전의 Signal을 사용하고 있기 때문에 그룹에 추가할 수 없습니다. Signal을 업데이트한 후 그룹에 추가할 수 있습니다.",
"description": "Shown in the alert when you try to add someone who can't be added to a group",
"placeholders": {
"max": {
@ -2098,7 +2108,7 @@
"description": "The header for the members list in the 'set group metadata' left pane screen"
},
"setGroupMetadata__error-message": {
"message": "This group couldnt be created. Check your connection and try again.",
"message": "그룹을 생성할 수 없습니다. 연결 상태를 확인하고 다시 시도하세요.",
"description": "Shown in the modal when we can't create a group"
},
"updateGroupAttributes__title": {
@ -2106,7 +2116,7 @@
"description": "Shown in the modal when we want to update a group"
},
"updateGroupAttributes__error-message": {
"message": "Failed to update the group. Check your connection and try again.",
"message": "그룹을 업데이트하지 못했습니다. 연결 상태를 확인하고 다시 시도하세요.",
"description": "Shown in the modal when we can't update a group"
},
"notSupportedSMS": {
@ -3256,7 +3266,7 @@
"description": "Shown to indicate this user is not a member of any groups"
},
"no-groups-in-common-warning": {
"message": "No groups in common. Review requests carefully.",
"message": "공통된 그룹이 없습니다. 요청을 주의 깊게 검토하세요.",
"description": "When a user has no common groups, show this warning"
},
"acceptCall": {
@ -3434,19 +3444,19 @@
"description": "Title for hang up button"
},
"calling__SelectPresentingSourcesModal--title": {
"message": "Share your screen",
"message": "화면 공유",
"description": "Title for the select your screen sharing sources modal"
},
"calling__SelectPresentingSourcesModal--confirm": {
"message": "Share screen",
"message": "화면 공유",
"description": "Confirm button for sharing screen modal"
},
"calling__SelectPresentingSourcesModal--entireScreen": {
"message": "Entire screen",
"message": "전체 화면",
"description": "Title for the select your screen sharing sources modal and 'Entire Screen' source"
},
"calling__SelectPresentingSourcesModal--screen": {
"message": "Screen $id$",
"message": "화면 $id$",
"description": "Title for `Screen #N` source in screen sharing sources modal and overlay",
"placeholders": {
"id": {
@ -3456,7 +3466,7 @@
}
},
"calling__SelectPresentingSourcesModal--window": {
"message": "A window",
"message": "",
"description": "Title for the select your screen sharing sources modal"
},
"callingDeviceSelection__label--video": {
@ -3542,15 +3552,15 @@
"description": "Shown if you click on a sgnl:// link not currently supported by Desktop"
},
"GroupV2--cannot-send": {
"message": "You cannot send messages to that group.",
"message": "해당 그룹에 메시지를 전송할 수 없습니다.",
"description": "Shown in toast when you attempt to forward a message to an announcement only group"
},
"GroupV2--add--missing-capability": {
"message": "These people cannot be added to the group until they upgrade Signal.",
"message": "해당 사용자는 Signal을 업그레이드할 때까지 그룹에 추가할 수 없습니다.",
"description": "Shown in a confirmation dialog when members who cannot view announcement only group cannot be added"
},
"GroupV2--cannot-start-group-call": {
"message": "Only admins of the group can start a call.",
"message": "그룹의 관리자만 통화를 시작할 수 있습니다.",
"description": "Shown in toast when a non-admin starts a group call in an announcements only group"
},
"GroupV2--join--invalid-link--title": {
@ -3650,7 +3660,7 @@
"description": "Shown if something went wrong when you try to join via a group link"
},
"GroupV2--join--general-join-failure": {
"message": "Couldn't join group. Try again later.",
"message": "그룹에 가입할 수 없습니다. 나중에 다시 시도하세요.",
"description": "Shown if something went wrong when you try to join via a group link"
},
"GroupV2--admin": {
@ -4690,7 +4700,7 @@
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--description--remove--you": {
"message": "You removed the group description.",
"message": "그룹 설명을 제거했습니다.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--description--remove--other": {
@ -4726,11 +4736,11 @@
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--admin--you": {
"message": "You changed the group settings to only allow admins to send messages.",
"message": "관리자만 메시지를 전송할 수 있도록 그룹 설정을 변경했습니다.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--admin--other": {
"message": "$memberName$ changed the group settings to only allow admins to send messages.",
"message": "$memberName$ 님이 관리자만 메시지를 전송할 수 있도록 그룹 설정을 변경했습니다.",
"description": "Shown in timeline or conversation preview when v2 group changes",
"placeholders": {
"adminName": {
@ -4740,15 +4750,15 @@
}
},
"GroupV2--announcements--admin--unknown": {
"message": "The group was changed to only allow admins to send messages.",
"message": "관리자만 메시지를 전송할 수 있도록 그룹이 변경되었습니다.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--member--you": {
"message": "You changed the group settings to allow all members to send messages.",
"message": "모든 구성원이 메시지를 전송할 수 있도록 그룹 설정을 변경했습니다.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--member--other": {
"message": "$memberName$ changed the group settings to allow all members to send messages.",
"message": "$memberName$ 님이 모든 구성원이 메시지를 전송할 수 있도록 그룹 설정을 변경했습니다.",
"description": "Shown in timeline or conversation preview when v2 group changes",
"placeholders": {
"adminName": {
@ -4758,7 +4768,7 @@
}
},
"GroupV2--announcements--member--unknown": {
"message": "The group was changed to allow all members to send messages.",
"message": "모든 회원이 메시지를 전송할 수 있도록 그룹이 변경되었습니다.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV1--Migration--disabled": {
@ -4900,11 +4910,11 @@
"description": "Title for the composition area for the SMS-only contact"
},
"CompositionArea--sms-only__body": {
"message": "Signal Desktop does not support messaging non-Signal contacts. Ask this person to install Signal for a more secure messaging experience.",
"message": "Signal Desktop은 Signal 외부 연락처 메시징을 지원하지 않습니다. 보다 안전한 메시징 경험을 위해 해당 인물에게 Signal을 설치하도록 요청하세요.",
"description": "Body for the composition area for the SMS-only contact"
},
"CompositionArea--sms-only__spinner-label": {
"message": "Checking contact's registration status",
"message": "연락처 등록 상태 확인",
"description": "Displayed while checking if the contact is SMS-only"
},
"countMutedConversationsDescription": {
@ -4972,7 +4982,7 @@
"description": "This is the label for the 'who can edit the group' panel"
},
"ConversationDetails--group-info-info": {
"message": "Choose who can edit group name, photo, description, and disappearing messages timer.",
"message": "그룹 이름, 사진, 설명과 사라지는 메시지 타이머를 편집할 수 있는 사람을 선택하세요.",
"description": "This is the additional info for the 'who can edit the group' panel"
},
"ConversationDetails--add-members-label": {
@ -4984,11 +4994,11 @@
"description": "This is the additional info for the 'who can add members' panel"
},
"ConversationDetails--announcement-label": {
"message": "Who can send messages",
"message": "메시지를 전송할 수 있는 사람",
"description": "This is the additional info for the 'who can send messages' panel"
},
"ConversationDetails--announcement-info": {
"message": "Choose who can send messages to the group.",
"message": "그룹에 메시지를 전송할 수 있는 사람을 선택하세요.",
"description": "This is the additional info for the 'who can send mesages' panel"
},
"ConversationDetails--requests-and-invites": {
@ -5232,7 +5242,7 @@
"description": "The label for the avatar uploader when no group photo is selected"
},
"AvatarInput--no-photo-label--profile": {
"message": "Add a photo",
"message": "사진 추가",
"description": "The label for the avatar uploader when no profile photo is selected"
},
"AvatarInput--change-photo-label": {
@ -5260,7 +5270,7 @@
"description": "When creating a new group and inviting users, this is shown in the dialog"
},
"NewlyCreatedGroupInvitedContactsDialog--title--many": {
"message": "$count$ invitations sent",
"message": "$count$개의 초대장을 보냈습니다.",
"description": "When creating a new group and inviting users, this is shown in the dialog",
"placeholders": {
"count": {
@ -5270,7 +5280,7 @@
}
},
"NewlyCreatedGroupInvitedContactsDialog--body--user-paragraph--one": {
"message": "$name$ cant be automatically added to this group by you.",
"message": "$name$ 님을 그룹에 자동으로 추가할 수 없습니다.",
"description": "When creating a new group and inviting users, this is shown in the dialog",
"placeholders": {
"name": {
@ -5280,11 +5290,11 @@
}
},
"NewlyCreatedGroupInvitedContactsDialog--body--user-paragraph--many": {
"message": "These users cant be automatically added to this group by you.",
"message": "해당 사용자는 사용자가 그룹에 자동으로 추가할 수 없습니다.",
"description": "When creating a new group and inviting users, this is shown in the dialog"
},
"NewlyCreatedGroupInvitedContactsDialog--body--info-paragraph": {
"message": "Theyve been invited to join, and wont see any group messages until they accept.",
"message": "가입 초대를 받았으며 수락할 때까지 그룹 메시지가 표시되지 않습니다.",
"description": "When creating a new group and inviting users, this is shown in the dialog"
},
"NewlyCreatedGroupInvitedContactsDialog--body--learn-more": {
@ -5372,11 +5382,11 @@
"description": "Aria label for pending audio attachment spinner"
},
"MessageAudio--slider": {
"message": "Playback time of audio attachment",
"message": "오디오 첨부 파일 재생 시간",
"description": "Aria label for audio attachment's playback time slider"
},
"emptyInboxMessage": {
"message": "Click the $composeIcon$ above and search for your contacts or groups to message.",
"message": "위 $composeIcon$ 아이콘을 클릭하고 메시지를 전송할 연락처 또는 그룹을 검색하세요.",
"description": "Shown in the left-pane when the inbox is empty",
"placeholders": {
"composeIcon": {
@ -5386,7 +5396,7 @@
}
},
"composeIcon": {
"message": "compose button",
"message": "구성 버튼",
"description": "Shown in the left-pane when the inbox is empty. Describes the button that composes a new message."
},
"ForwardMessageModal--continue": {
@ -5398,15 +5408,15 @@
"description": "Shown on the message request warning. Clicking this button will open a dialog with more information"
},
"MessageRequestWarning__dialog__details": {
"message": "You have no groups in common with this person. Review requests carefully before accepting to avoid unwanted messages.",
"message": "해당 사용자와 공유하는 그룹이 없습니다. 원치 않는 메시지를 피하기 위해 수락하기 전 요청을 주의 깊게 검토하세요.",
"description": "Shown in the message request warning dialog. Gives more information about message requests"
},
"MessageRequestWarning__dialog__learn-even-more": {
"message": "About Message Requests",
"message": "메시지 요청 정보",
"description": "Shown in the message request warning dialog. Clicking this button will open a page on Signal's support site"
},
"ContactSpoofing__same-name": {
"message": "Review requests carefully. Signal found another contact with the same name. $link$",
"message": "요청을 주의 깊게 검토하세요. Signal이 같은 이름의 다른 연락처를 찾았습니다. $link$",
"description": "Shown in the timeline warning when you have a message request from someone with the same name as someone else",
"placeholders": {
"link": {
@ -5416,7 +5426,7 @@
}
},
"ContactSpoofing__same-name-in-group": {
"message": "$count$ group members have the same name. $link$",
"message": "$count$ 그룹 구성원 중 이름이 같은 사람이 있습니다. $link$",
"description": "Shown in the timeline warning when you multiple group members have the same name",
"placeholders": {
"count": {
@ -5430,15 +5440,15 @@
}
},
"ContactSpoofing__same-name__link": {
"message": "Review request",
"message": "검토 요청",
"description": "Shown in the timeline warning when you have a message request from someone with the same name as someone else"
},
"ContactSpoofing__same-name-in-group__link": {
"message": "Click to review",
"message": "클릭하여 검토",
"description": "Shown in the timeline warning when you multiple group members have the same name"
},
"ContactSpoofingReviewDialog__title": {
"message": "Review request",
"message": "검토 요청",
"description": "Title for the contact name spoofing review dialog"
},
"ContactSpoofingReviewDialog__description": {
@ -5454,11 +5464,11 @@
"description": "Header in the contact spoofing review dialog, shown above the \"safe\" user"
},
"ContactSpoofingReviewDialog__group__title": {
"message": "Review members",
"message": "구성원 검토",
"description": "Title for the contact name spoofing review dialog in groups"
},
"ContactSpoofingReviewDialog__group__description": {
"message": "$count$ group members have similar names. Review the members below or choose to take action.",
"message": "$count$ 그룹 구성원 중 이름이 비슷한 사람이 있습니다. 다음 구성원을 검토하거나 조치를 선택하세요.",
"description": "Description for the group contact spoofing review dialog"
},
"ContactSpoofingReviewDialog__group__members-header": {
@ -5466,7 +5476,7 @@
"description": "Header in the group contact spoofing review dialog. After this header, there will be a list of members"
},
"ContactSpoofingReviewDialog__group__name-change-info": {
"message": "Recently changed their profile name from $oldName$ to $newName$",
"message": "최근에 프로필 이름을 $oldName$에서 $newName$(으)로 변경했습니다.",
"description": "In the group contact spoofing review dialog, this text is shown when someone has changed their name recently",
"placeholders": {
"oldName": {
@ -5494,39 +5504,39 @@
}
},
"CaptchaDialog__title": {
"message": "Verify to continue messaging",
"message": "메시지를 계속 전송하려면 검증하세요.",
"description": "Header in the captcha dialog"
},
"CaptchaDialog__first-paragraph": {
"message": "To help prevent spam on Signal, please complete verification.",
"message": "Signal에서 스팸을 방지하려면 검증을 완료하세요.",
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog__second-paragraph": {
"message": "After verifying, you can continue messaging. Any paused messages will automatically be sent.",
"message": "검증 후 메시지를 계속 전달할 수 있습니다. 일시 정지된 메시지는 자동으로 전송됩니다.",
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Continue Without Verifying?",
"message": "검증하지 않고 계속하시겠습니까?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {
"message": "If you choose to skip verification, you may miss messages from other people and your messages may fail to send.",
"message": "검증을 건너뛰도록 선택하면 다른 사람이 전송한 메시지를 놓칠 수 있고 메시지가 전송되지 않을 수 있습니다.",
"description": "Body of the captcha dialog that can be closed"
},
"CaptchaDialog--can_close__skip-verification": {
"message": "Skip verification",
"message": "검증 건너뛰기",
"description": "Skip button of the captcha dialog that can be closed"
},
"verificationComplete": {
"message": "Verification complete.",
"message": "검증이 완료되었습니다.",
"description": "Displayed after successful captcha"
},
"verificationFailed": {
"message": "Verification failed. Please retry later.",
"message": "검증에 실패했습니다. 나중에 다시 시도하세요.",
"description": "Displayed after unsuccessful captcha"
},
"deleteForEveryoneFailed": {
"message": "Failed to delete message for everyone. Please retry later.",
"message": "모든 사람의 메시지를 삭제하지 못했습니다. 나중에 다시 시도하세요.",
"description": "Displayed when delete-for-everyone has failed to send to all recepients"
},
"ChatColorPicker__delete--title": {
@ -5534,7 +5544,7 @@
"description": "Confirm title for deleting custom color"
},
"ChatColorPicker__delete--message": {
"message": "This custom color is used in $num$ chats. Do you want to delete it for all chats?",
"message": "사용자 정의 색상은 $num$ 채팅에서 사용됩니다. 모든 채팅에서 삭제하시겠습니까?",
"description": "Confirm message for deleting custom color",
"placeholders": {
"num": {
@ -5544,7 +5554,7 @@
}
},
"ChatColorPicker__global-chat-color": {
"message": "Global Chat Color",
"message": "모두 적용되는 채팅 색상",
"description": "Modal title for the chat color picker and editor for all conversations"
},
"ChatColorPicker__menu-title": {
@ -5552,19 +5562,19 @@
"description": "View title for the chat color picker and editor"
},
"ChatColorPicker__reset": {
"message": "Reset chat color",
"message": "채팅 색상 재설정",
"description": "Button label for resetting chat colors"
},
"ChatColorPicker__resetDefault": {
"message": "Reset Chat Colors",
"message": "채팅 색상 재설정",
"description": "Confirmation dialog title for resetting all chat colors or only the global default one"
},
"ChatColorPicker__resetAll": {
"message": "Reset all chat colors",
"message": "모든 채팅 색상 재설정",
"description": "Button label for resetting all chat colors"
},
"ChatColorPicker__confirm-reset-default": {
"message": "Reset default",
"message": "기본값 재설정",
"description": "Button label for resetting only global chat color"
},
"ChatColorPicker__confirm-reset": {
@ -5572,27 +5582,27 @@
"description": "Confirm button label for resetting chat colors"
},
"ChatColorPicker__confirm-reset-message": {
"message": "Would you like to override all chat colors?",
"message": "모든 채팅 색상을 무시하시겠습니까?",
"description": "Modal message text for confirming resetting of chat colors"
},
"ChatColorPicker__custom-color--label": {
"message": "Show custom color editor",
"message": "사용자 정의 색상 편집기 표시",
"description": "aria-label for custom color editor button"
},
"ChatColorPicker__sampleBubble1": {
"message": "Here's a preview of the chat color.",
"message": "다음은 채팅 색상의 미리 보기입니다.",
"description": "An example message bubble for selecting the chat color"
},
"ChatColorPicker__sampleBubble2": {
"message": "Another bubble.",
"message": "또 다른 거품이군요.",
"description": "An example message bubble for selecting the chat color"
},
"ChatColorPicker__sampleBubble3": {
"message": "The color is visible to only you.",
"message": "색상은 사용자에게만 보입니다.",
"description": "An example message bubble for selecting the chat color"
},
"ChatColorPicker__context--edit": {
"message": "Edit color",
"message": "색상 편집",
"description": "Option in the custom color bubble context menu"
},
"ChatColorPicker__context--duplicate": {
@ -5604,7 +5614,7 @@
"description": "Option in the custom color bubble context menu"
},
"CustomColorEditor__solid": {
"message": "Solid",
"message": "견고함",
"description": "Tab label for selecting solid colors"
},
"CustomColorEditor__gradient": {
@ -5664,15 +5674,15 @@
"description": "Name of the 'weeks' unit select for the custom disappearing message timeout dialog"
},
"settings__DisappearingMessages__footer": {
"message": "Set a default disappearing message timer for all new chats started by you.",
"message": "내가 시작한 모든 새 채팅에 대해 기본으로 사라지는 메시지 타이머를 설정하세요.",
"description": "Footer for the Disappearing Messages settings section"
},
"settings__DisappearingMessages__timer__label": {
"message": "Default timer for new chats",
"message": "새 채팅을 위한 기본 타이머",
"description": "Label for the Disapearring Messages default timer setting"
},
"UniversalTimerNotification__text": {
"message": "The disappearing message time will be set to $timeValue$ when you message them.",
"message": "메시지가 사라지는 시간은 메시지를 전송할 때 $timeValue$(으)로 설정됩니다.",
"description": "A message displayed when default disappearing message timeout is about to be applied",
"placeholders": {
"timeValue": {
@ -5686,7 +5696,7 @@
"description": "Button text when the group description is too long"
},
"EditConversationAttributesModal__description-warning": {
"message": "Group descriptions will be visible to members of this group and people who have been invited.",
"message": "그룹 설명은 이 그룹의 구성원과 초대받은 사람들에게 표시됩니다.",
"description": "Label text shown when editing group description"
},
"ConversationDetailsHeader--add-group-description": {
@ -5694,11 +5704,11 @@
"description": "Placeholder text in the details header for those that can edit the group description"
},
"MediaQualitySelector--button": {
"message": "Select media quality",
"message": "미디어 품질 선택",
"description": "aria-label for the media quality selector button"
},
"MediaQualitySelector--title": {
"message": "Media Quality",
"message": "미디어 품질",
"description": "Popup selector title"
},
"MediaQualitySelector--standard-quality-title": {
@ -5738,7 +5748,7 @@
"description": "In the message details screen, shown above contacts who have read this message"
},
"MessageDetailsHeader--Viewed": {
"message": "Viewed by",
"message": "조회자",
"description": "In the message details screen, shown above contacts who have viewed this message"
},
"ProfileEditor--about": {
@ -5746,7 +5756,7 @@
"description": "Default text for about field"
},
"ProfileEditor--about-placeholder": {
"message": "Write something about yourself...",
"message": "나를 소개해 보세요...",
"description": "Placeholder text for about input field"
},
"ProfileEditor--first-name": {
@ -5762,7 +5772,7 @@
"description": "ConfirmationDialog text for discarding changes"
},
"ProfileEditor--info": {
"message": "Your profile is encrypted. Your profile and changes to it will be visible to your contacts and when you start or accept new chats. $learnMore$",
"message": "프로필이 암호화되었습니다. 프로필과 프로필 변경 사항은 연락처와 새 채팅을 시작하거나 수락할 때 볼 수 있습니다. $learnMore$",
"description": "Information shown at the bottom of the profile editor section",
"placeholders": {
"learnMore": {
@ -5800,7 +5810,7 @@
"description": "Title for profile editing"
},
"ProfileEditorModal--name": {
"message": "Your Name",
"message": "내 이름",
"description": "Title for editing your name"
},
"ProfileEditorModal--about": {
@ -5808,15 +5818,15 @@
"description": "Title for about editing"
},
"ProfileEditorModal--error": {
"message": "Your profile could not be updated. Please try again.",
"message": "프로필을 업데이트할 수 없습니다. 다시 시도하세요.",
"description": "Error message when something goes wrong updating your profile."
},
"AnnouncementsOnlyGroupBanner--modal": {
"message": "Message an admin",
"message": "관리자에게 메시지 전송",
"description": "Modal title for the list of admins in a group"
},
"AnnouncementsOnlyGroupBanner--announcements-only": {
"message": "Only $admins$ can send messages",
"message": "$admins$만 메시지를 전송할 수 있습니다.",
"description": "Displayed if sending of messages is disabled to non-admins",
"placeholders": {
"admins": {
@ -5826,7 +5836,7 @@
}
},
"AnnouncementsOnlyGroupBanner--admins": {
"message": "admins",
"message": "관리자",
"description": "Clickable text describing administrators of a group, used in the message an admin label"
}
}

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Continue Without Verifying?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Continue Without Verifying?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Nepavyko jums nuo $sender$ pristatyti žinutės, lipduko, reakcijos, pranešimo apie žinutės skaitymą ar medijos. Gali būti, kad šis žmogus bandė siųsti jums tiesiogiai arba grupėje.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "Šiame pokalbyje nepavyko jums nuo $sender$ pristatyti žinutės, lipduko, reakcijos, pranešimo apie žinutės skaitymą ar medijos.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Tęsti be patikrinimo?",
"message": "Tęsti be patvirtinimo?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1152,7 +1152,7 @@
"description": "Shown on explainer dialog available from chat session refreshed timeline events"
},
"DeliveryIssue--preview": {
"message": "Delivery issue",
"message": "Проблем со испорака",
"description": "Shown in left pane preview when message delivery issue happens"
},
"DeliveryIssue--notification": {
@ -1170,12 +1170,22 @@
"description": "Shown in timeline when message delivery issue happens, to provide access to a popup info dialog"
},
"DeliveryIssue--title": {
"message": "Delivery Issue",
"message": "Проблем со испорака",
"description": "Shown on explainer dialog available from delivery issue timeline events"
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -1688,7 +1698,7 @@
"description": "Shown on outgoing message if it fails to send"
},
"sendPaused": {
"message": "Send paused",
"message": "Испраќањето е паузирано",
"description": "Shown on outgoing message if it cannot be sent immediately"
},
"partiallySent": {
@ -3056,7 +3066,7 @@
"description": "Shown as a button to let the user block a message request and report spam"
},
"MessageRequests--block-and-report-spam-success-toast": {
"message": "Reported as spam and blocked.",
"message": "Пријавено како спам и блокирано.",
"description": "Shown in a toast when you successfully block a user and report them as spam"
},
"MessageRequests--block-direct-confirm-title": {
@ -4726,7 +4736,7 @@
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--admin--you": {
"message": "You changed the group settings to only allow admins to send messages.",
"message": "Ги сменивте поставките на групата за да дозволите само администраторите да испраќаат пораки.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--admin--other": {
@ -4744,7 +4754,7 @@
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--member--you": {
"message": "You changed the group settings to allow all members to send messages.",
"message": "Ги сменивте поставките на групата за да дозволите сите членови да испраќаат пораки.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--member--other": {
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Continue Without Verifying?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {
@ -5530,7 +5540,7 @@
"description": "Displayed when delete-for-everyone has failed to send to all recepients"
},
"ChatColorPicker__delete--title": {
"message": "Delete color",
"message": "Избриши боја",
"description": "Confirm title for deleting custom color"
},
"ChatColorPicker__delete--message": {
@ -5552,7 +5562,7 @@
"description": "View title for the chat color picker and editor"
},
"ChatColorPicker__reset": {
"message": "Reset chat color",
"message": "Ресетирај ги боите на разговорот",
"description": "Button label for resetting chat colors"
},
"ChatColorPicker__resetDefault": {
@ -5572,7 +5582,7 @@
"description": "Confirm button label for resetting chat colors"
},
"ChatColorPicker__confirm-reset-message": {
"message": "Would you like to override all chat colors?",
"message": "Дали сакате да ги смените сите бои на разговорите?",
"description": "Modal message text for confirming resetting of chat colors"
},
"ChatColorPicker__custom-color--label": {
@ -5596,7 +5606,7 @@
"description": "Option in the custom color bubble context menu"
},
"ChatColorPicker__context--duplicate": {
"message": "Duplicate",
"message": "Дупликат",
"description": "Option in the custom color bubble context menu"
},
"ChatColorPicker__context--delete": {
@ -5608,15 +5618,15 @@
"description": "Tab label for selecting solid colors"
},
"CustomColorEditor__gradient": {
"message": "Gradient",
"message": "Градиент",
"description": "Tab label for selecting a gradient"
},
"CustomColorEditor__hue": {
"message": "Hue",
"message": "Нијанса",
"description": "Label for the hue slider"
},
"CustomColorEditor__saturation": {
"message": "Saturation",
"message": "Сатурација",
"description": "Label for the saturation slider"
},
"CustomColorEditor__title": {
@ -5668,7 +5678,7 @@
"description": "Footer for the Disappearing Messages settings section"
},
"settings__DisappearingMessages__timer__label": {
"message": "Default timer for new chats",
"message": "Стандарден тајмер за нови разговори",
"description": "Label for the Disapearring Messages default timer setting"
},
"UniversalTimerNotification__text": {
@ -5686,7 +5696,7 @@
"description": "Button text when the group description is too long"
},
"EditConversationAttributesModal__description-warning": {
"message": "Group descriptions will be visible to members of this group and people who have been invited.",
"message": "Описот на групата ќе им биде видлив на членовите на оваа група и луѓето кои што се поканети.",
"description": "Label text shown when editing group description"
},
"ConversationDetailsHeader--add-group-description": {
@ -5738,7 +5748,7 @@
"description": "In the message details screen, shown above contacts who have read this message"
},
"MessageDetailsHeader--Viewed": {
"message": "Viewed by",
"message": "Видено од",
"description": "In the message details screen, shown above contacts who have viewed this message"
},
"ProfileEditor--about": {
@ -5812,7 +5822,7 @@
"description": "Error message when something goes wrong updating your profile."
},
"AnnouncementsOnlyGroupBanner--modal": {
"message": "Message an admin",
"message": "Испрати порака на админ",
"description": "Modal title for the list of admins in a group"
},
"AnnouncementsOnlyGroupBanner--announcements-only": {
@ -5826,7 +5836,7 @@
}
},
"AnnouncementsOnlyGroupBanner--admins": {
"message": "admins",
"message": "администраторид",
"description": "Clickable text describing administrators of a group, used in the message an admin label"
}
}

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "$sender$ पासून संदेश, स्टिकर, प्रतिक्रिया, वाचल्याची पावती किंवा मिडिया आपल्यापर्यंत डिलिव्हर केली जाऊ शकली नाही. त्यांनी आपल्याला थेट किंवा गटात पाठवण्याचा प्रयत्न केला असेल.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "या चॅटमध्ये $sender$ पासून संदेश, स्टिकर, प्रतिक्रिया किंवा मिडिया आपल्यापर्यंत पोहोचवली जाऊ शकली नाही.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Continue Without Verifying?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Fortsett uten å verifisere?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -622,7 +622,7 @@
}
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error. Click to submit a debug log.",
"message": "In Signal-Desktop is bij het ontsleutelen een fout opgetreden. Klik hier om een foutopsporingslog te uploaden.",
"description": "An error popup when we haven't added an error for decryption error."
},
"oneNonImageAtATimeToast": {
@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Een bericht, media, sticker, emoji-reactie, of een bevestiging dat een bericht gelezen is van $sender$ kan niet aan jou worden afgeleverd. Het kan zijn dat hij of zij iets probeerde naar je te verzenden in een één-op-één gesprek of in een groepsgesprek.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "Een bericht, media, sticker, emoji-reactie, of een bevestiging dat een bericht gelezen is van $sender$ kan in dit gesprek niet aan jou worden afgeleverd. ",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -3542,15 +3552,15 @@
"description": "Shown if you click on a sgnl:// link not currently supported by Desktop"
},
"GroupV2--cannot-send": {
"message": "You cannot send messages to that group.",
"message": "Je kunt naar die groep geen berichten doorsturen.",
"description": "Shown in toast when you attempt to forward a message to an announcement only group"
},
"GroupV2--add--missing-capability": {
"message": "These people cannot be added to the group until they upgrade Signal.",
"message": "Deze personen kunnen niet aan de groep worden toegevoegd totdat ze hun Signal app hebben bijgewerkt.",
"description": "Shown in a confirmation dialog when members who cannot view announcement only group cannot be added"
},
"GroupV2--cannot-start-group-call": {
"message": "Only admins of the group can start a call.",
"message": "Alleen beheerders van deze groep kunnen een groepsoproep beginnen.",
"description": "Shown in toast when a non-admin starts a group call in an announcements only group"
},
"GroupV2--join--invalid-link--title": {
@ -3650,7 +3660,7 @@
"description": "Shown if something went wrong when you try to join via a group link"
},
"GroupV2--join--general-join-failure": {
"message": "Couldn't join group. Try again later.",
"message": "Je kunt niet lid worden van deze groep. Probeer het later opnieuw.",
"description": "Shown if something went wrong when you try to join via a group link"
},
"GroupV2--admin": {
@ -4748,7 +4758,7 @@
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--member--other": {
"message": "$memberName$ changed the group settings to allow all members to send messages.",
"message": "$memberName$ heeft de groepsinstellingen aangepast om alle groepsleden de mogelijkheid te geven om berichten te verzenden.",
"description": "Shown in timeline or conversation preview when v2 group changes",
"placeholders": {
"adminName": {
@ -4758,7 +4768,7 @@
}
},
"GroupV2--announcements--member--unknown": {
"message": "The group was changed to allow all members to send messages.",
"message": "De groepsinstellingen zijn aangepast om alle groepsleden de mogelijkheid te geven om berichten te verzenden.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV1--Migration--disabled": {
@ -4988,7 +4998,7 @@
"description": "This is the additional info for the 'who can send messages' panel"
},
"ConversationDetails--announcement-info": {
"message": "Choose who can send messages to the group.",
"message": "Kies wie berichten mag verzenden aan deze groep.",
"description": "This is the additional info for the 'who can send mesages' panel"
},
"ConversationDetails--requests-and-invites": {
@ -5232,7 +5242,7 @@
"description": "The label for the avatar uploader when no group photo is selected"
},
"AvatarInput--no-photo-label--profile": {
"message": "Add a photo",
"message": "Voeg een foto of afbeelding toe",
"description": "The label for the avatar uploader when no profile photo is selected"
},
"AvatarInput--change-photo-label": {
@ -5762,7 +5772,7 @@
"description": "ConfirmationDialog text for discarding changes"
},
"ProfileEditor--info": {
"message": "Your profile is encrypted. Your profile and changes to it will be visible to your contacts and when you start or accept new chats. $learnMore$",
"message": "Signal-profielen worden eind-tot-eind-versleuteld uitgewisseld. Je profielinformatie is alleen zichtbaar voor personen die zijn opgeslagen in jouw contactenlijst, personen naar wie je zelf een nieuw gesprek initieert, personen van wie je een gespreksverzoek aanvaard en alle leden van een groep waarvan jij lid bent. $learnMore$",
"description": "Information shown at the bottom of the profile editor section",
"placeholders": {
"learnMore": {
@ -5816,7 +5826,7 @@
"description": "Modal title for the list of admins in a group"
},
"AnnouncementsOnlyGroupBanner--announcements-only": {
"message": "Only $admins$ can send messages",
"message": "Alleen $admins$ kunnen berichten verzenden",
"description": "Displayed if sending of messages is disabled to non-admins",
"placeholders": {
"admins": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -4726,7 +4736,7 @@
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--admin--you": {
"message": "You changed the group settings to only allow admins to send messages.",
"message": "Du endra gruppeinnstillingane til at berre administratorar kan senda meldingar.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--admin--other": {
@ -4744,7 +4754,7 @@
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--member--you": {
"message": "You changed the group settings to allow all members to send messages.",
"message": "Du endra gruppeinnstillingane til å la alle medlemmar senda meldingar.",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--member--other": {
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Continue Without Verifying?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {
@ -5812,7 +5822,7 @@
"description": "Error message when something goes wrong updating your profile."
},
"AnnouncementsOnlyGroupBanner--modal": {
"message": "Message an admin",
"message": "Send melding til ein administrator",
"description": "Modal title for the list of admins in a group"
},
"AnnouncementsOnlyGroupBanner--announcements-only": {
@ -5826,7 +5836,7 @@
}
},
"AnnouncementsOnlyGroupBanner--admins": {
"message": "admins",
"message": "administratorar",
"description": "Clickable text describing administrators of a group, used in the message an admin label"
}
}

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Continue Without Verifying?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

5842
_locales/pa/messages.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Nie udało się dostarczyć Ci wiadomości, naklejki, reakcji, potwierdzenia przeczytania lub multimediów od $sender$. Ten kontakt mógł próbować przesłać Ci tę wiadomość bezpośrednio lub w rozmowie grupowej.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "Nie udało się dostarczyć Ci wiadomości, naklejki, reakcji, potwierdzenia przeczytania lub multimediów od $sender$, w tej rozmowie.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Não foi possível entregar para você uma mensagem (texto, figurinha, reação, confirmação de leitura ou mídia) de $sender$. Essa pessoa tentou enviar para você diretamente ou em um grupo.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "Não foi possível entregar para você uma mensagem (texto, figurinha, reação, confirmação de leitura ou mídia) de $sender$ nessa conversa.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Uma mensagem, autocolante, reação, recibo de leitura ou multimédia enviada por $sender$ não pode ser entregue a si. Essa mensagem poderá ter sido tentada enviada para si diretamente ou através de um grupo.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "Não lhe foi possível entregar para uma mensagem, autocolante, reação, confirmação de leitura ou multimédia de $sender$ nesta conversa.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",

File diff suppressed because it is too large Load Diff

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Сообщение, стикер, реакцию, уведомление о прочтении или медиа-файл от $sender$ не удалось доставить вам. Этот человек мог отправить вышеуказанное напрямую вам или в какую-нибудь группу.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "Сообщение, стикер, реакцию, уведомление о прочтении или медиа-файл от $sender$ не удалось доставить вам в этом чате.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Správu, nálepku, reakciu, potvrdenie o prečítaní, alebo médium od $sender$ vám nebolo možné doručiť. Možno sa vám pokúsili poslať ho priamo, alebo v skupine.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "Správu, nálepku, reakciu, potvrdenku o prečítaní, alebo médium vám nebolo možné doručiť od $sender$ v tejto konverzií.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Pokračovať bez overenia?",
"message": "Chcete pokračovať bez overenia?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Sporočilo, nalepka, reakcija, obvestilo o prebranem sporočilu ali medijska datoteka uporabnika/ce $sender$ vam ne morejo biti dostavljeni. Lahko so bili poslani osebno ali prek skupine.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "Sporočilo, nalepka, reakcija, obvestilo o prebranem sporočilu ali medijska datoteka uporabnika/ce $sender$ niso mogli biti dostavljeni.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Su dërgua dot te ju një mesazh, ngjitës, reagim, dëftesë leximi ose media nga $sender$. Mund të ketë provuar ta dërgojë drejtpërsëdrejti për ju, ose në një grup.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "Su dorëzua dot për ju një mesazh, ngjitës, reagim, dëftesë leximi ose media nga $sender$ në këtë fjalosje.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Të Vazhdohet Pa Verifikim?",
"message": "Të vazhdohet pa e verifikuar?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Порука, налепница, реакција, потврда о читању или медиј од $sender$ није могло да се испоручи. Можда су то покушали да вам пошаљу директно или у групи.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "Порука, налепница, реакција, потврда о читању или медиј од $sender$ није вам достављен.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Ett meddelande, klistermärke, reaktion, läskvitto eller media kunde inte levereras till dig från$sender$. Personen kan ha försökt att skicka det direkt till dig eller i en grupp.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "Ett meddelande, klistermärke, reaktion, läskvitto eller media kunde inte levereras till dig från $sender$ i den här chatten.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5686,7 +5696,7 @@
"description": "Button text when the group description is too long"
},
"EditConversationAttributesModal__description-warning": {
"message": "Gruppbeskrivningar kommer att vara synliga för medlemmar i denna grupp och personer som har bjudits in.",
"message": "Gruppbeskrivningar kommer att vara synliga för medlemmar i denna grupp och inbjudna personer.",
"description": "Label text shown when editing group description"
},
"ConversationDetailsHeader--add-group-description": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Continue Without Verifying?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "ஒரு செய்தி, ஓட்டி, எதிர்வினை, ரசீதைப் படியுங்கள் அல்லது மீடியா உங்களிடமிருந்து வழங்க முடியவில்லை $sender$. அவர்கள் அதை உங்களுக்கு நேரடியாக அனுப்ப முயற்சித்திருக்கலாம், அல்லது ஒருகுழு.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "ஒரு செய்தி, ஓட்டி, எதிர்வினை, ரசீது வாசிக்கவும் அல்லது ஊடகம் இருந்து உங்களுக்கு வழங்க முடியவில்லை$sender$ இதில் அரட்டை.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "$sender$ నుండి సందేశం, స్టిక్కర్, ప్రతిచర్య, చదివిన రసీదులు లేదా మీడియా మీకు పంపబడవు. వారు మీకు నేరుగా లేదా సమూహంలో పంపించడానికి ప్రయత్నించారు.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "ధృవీకరించకుండా కొనసాగించాలా?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {
@ -5812,7 +5822,7 @@
"description": "Error message when something goes wrong updating your profile."
},
"AnnouncementsOnlyGroupBanner--modal": {
"message": "Message an admin",
"message": "నిర్వాహకుడికి సందేశం పంపండి",
"description": "Modal title for the list of admins in a group"
},
"AnnouncementsOnlyGroupBanner--announcements-only": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "ทำต่อโดยไม่ตรวจยืนยันหรือไม่?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "$sender$ tarafından gönderilen bir ileti, çıkartma, tepki, okundu bilgisi veya medya size teslim edilemedi. Size doğrudan veya grup içerisinden göndermeye çalışmış olabilirler.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Doğrulamadan devam et?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "سىزگە $sender$ ئەۋەتكەن ئۇچۇر، چاپلاق، ئىنكاس، ئوقۇلدى خېتى ياكى ۋاسىتىنى يەتكۈزەلمەيدۇ. ئۇلار ئۇنى بىۋاسىتە سىزگە ياكى گۇرۇپپىدا يوللاشنى سىنىغان بولۇشى مۇمكىن.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "دەلىللىمەي داۋاملاشتۇرامدۇ؟",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1,6 +1,6 @@
{
"softwareAcknowledgments": {
"message": "Software Acknowledgments",
"message": "Подяки програмному забезпеченню",
"description": "Shown in the about box for the link to software acknowledgments"
},
"privacyPolicy": {
@ -32,7 +32,7 @@
"description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt-<letter> combination."
},
"mainMenuCreateStickers": {
"message": "Create/upload sticker pack",
"message": "Створіть/завантажте пакет наліпок",
"description": "The label that is used for the Create/upload sticker pack option in the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt-<letter> combination."
},
"mainMenuEdit": {
@ -120,15 +120,15 @@
"description": "Window menu command to close the current window"
},
"windowMenuMinimize": {
"message": "Minimize",
"message": "Згорнути",
"description": "Window menu command to minimize the current window"
},
"windowMenuZoom": {
"message": "Zoom",
"message": "Збільшити",
"description": "Window menu command to make the current window the size of the whole screen"
},
"windowMenuBringAllToFront": {
"message": "Bring All to Front",
"message": "Перемістити Все на Передній План",
"description": "Window menu command to bring all windows of current application to front"
},
"viewMenuResetZoom": {
@ -144,11 +144,11 @@
"description": "View menu command to make everything smaller"
},
"viewMenuToggleFullScreen": {
"message": "Toggle Full Screen",
"message": "Переключити на Повний Екран",
"description": "View menu command to enter or leave Full Screen mode"
},
"viewMenuToggleDevTools": {
"message": "Toggle Developer Tools",
"message": "Переключити Інструменти Розробника",
"description": "View menu command to show or hide the developer tools"
},
"menuSetupAsNewDevice": {
@ -156,7 +156,7 @@
"description": "When the application is not yet set up, menu option to start up the set up as fresh device"
},
"menuSetupAsStandalone": {
"message": "Set Up as Standalone Device",
"message": "Налаштувати як Самостійний Пристрій",
"description": "Only available on development modes, menu option to open up the standalone device setup sequence"
},
"messageContextMenuButton": {
@ -254,7 +254,7 @@
"description": "Header shown on the first screen in the data import process"
},
"loadDataDescription": {
"message": "You've just gone through the export process, and your contacts and messages are waiting patiently on your computer. Select the folder that contains your saved Signal data.",
"message": "Ви щойно пройшли процес експорту, і ваші контакти та повідомлення з нетерпінням чекають вас на вашому комп'ютері. Виберіть папку, що містить ваші збережені дані Signal.",
"description": "Introduction to the process of importing messages and contacts from disk"
},
"importChooserTitle": {
@ -270,11 +270,11 @@
"description": "Header of screen shown as data is import"
},
"importErrorFirst": {
"message": "Make sure you have chosen the correct directory that contains your saved Signal data. Its name should begin with 'Signal Export.' You can also save a new copy of your data from the Chrome App.",
"message": "Переконайтеся, що ви вибрали правильний каталог який містить ваші збережені дані Signal. Його назва повинна починатися з “Signal Export”. Також ви можете зберегти нову копію своїх даних з програми для Chrome.",
"description": "Message shown if the import went wrong; first paragraph"
},
"importErrorSecond": {
"message": "If these steps don't work for you, please submit a debug log (View -> Debug Log) so that we can help you get migrated!",
"message": "Якщо ці кроки не працюють для вас, будь ласка, подайте журнал налагодження (Вид -> Журнал Налагодження), щоб ми могли допомогти вам з міграцією!",
"description": "Message shown if the import went wrong; second paragraph"
},
"importAgain": {
@ -456,7 +456,7 @@
"description": ""
},
"debugLogError": {
"message": "Something went wrong with the upload! Please consider manually adding your log to the bug you file.",
"message": "Щось пішло не так із завантаженням! Будь ласка, подумайте про те, щоб додати вручну журнал до вашого повідомлення про помилку.",
"description": ""
},
"debugLogCopy": {
@ -588,11 +588,11 @@
"description": "Shown in toast when user attempts to send .exe file, for example"
},
"loadingPreview": {
"message": "Loading Preview...",
"message": "Завантаження Попереднього перегляду...",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area"
},
"stagedPreviewThumbnail": {
"message": "Draft thumbnail link preview for $domain$",
"message": "Чернетка мініатюри попереднього перегляду посилання для $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
@ -602,7 +602,7 @@
}
},
"previewThumbnail": {
"message": "Thumbnail link preview for $domain$",
"message": "Мініатюра попереднього перегляду посилання для $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
@ -612,7 +612,7 @@
}
},
"stagedImageAttachment": {
"message": "Draft image attachment: $path$",
"message": "Чернетка вкладення зображення: $path$",
"description": "Alt text for staged attachments",
"placeholders": {
"path": {
@ -622,19 +622,19 @@
}
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error. Click to submit a debug log.",
"message": "В Signal Desktop сталася помилка розшифрування. Натисніть, щоб відправити журнал налагодження.",
"description": "An error popup when we haven't added an error for decryption error."
},
"oneNonImageAtATimeToast": {
"message": "When including a non-image attachment, the limit is one attachment per message.",
"message": "При включенні вкладень, що не відносяться до зображень, обмеження становить по одному вкладенню на повідомлення.",
"description": "An error popup when the user has attempted to add an attachment"
},
"cannotMixImageAndNonImageAttachments": {
"message": "You cannot mix non-image and image attachments in one message.",
"message": "Ви не можете змішувати вкладення, що не належать до зображень, із зображеннями в одному повідомленні.",
"description": "An error popup when the user has attempted to add an attachment"
},
"maximumAttachments": {
"message": "You cannot add any more attachments to this message.",
"message": "Ви не можете додати більше вкладень до цього повідомлення.",
"description": "An error popup when the user has attempted to add an attachment"
},
"fileSizeWarning": {
@ -678,11 +678,11 @@
"description": "View menu item to open the debug log (title case)"
},
"forceUpdate": {
"message": "Force Update",
"message": "Примусово Обновити",
"description": "View menu item to force the app to update download and install"
},
"helpMenuShowKeyboardShortcuts": {
"message": "Show Keyboard Shortcuts",
"message": "Показати Гарячі Клавіші",
"description": "Item under the help menu, pops up a screen showing the application's keyboard shortcuts"
},
"contactUs": {
@ -690,7 +690,7 @@
"description": "Item under the help menu, takes you to the contact us support page"
},
"goToReleaseNotes": {
"message": "Go to Release Notes",
"message": "Перейти до Нотаток про Випуск",
"description": "Item under the help menu, takes you to GitHub page for release notes"
},
"goToForums": {
@ -770,7 +770,7 @@
}
},
"noSearchResults--sms-only": {
"message": "SMS/MMS contacts are not available on Desktop.",
"message": "Контакти SMS/MMS недоступні в Signal Desktop.",
"description": "Shown in the search left pane when no results were found and primary device has SMS/MMS handling enabled"
},
"noSearchResultsInConversation": {
@ -886,23 +886,23 @@
"description": "Shown in toast if user clicks on quote that references message no longer in database"
},
"messageFoundButNotLoaded": {
"message": "Original message found, but not loaded. Scroll up to load it.",
"message": "Оригінал тексту повідомлення знайдено, але його не було завантажено. Прокрутіть вгору, щоб завантажити його.",
"description": "Shown in toast if user clicks on quote references messages not loaded in view, but in database"
},
"voiceRecordingInterruptedMax": {
"message": "Voice message recording stopped because the maximum time limit was reached.",
"message": "Запис голосового повідомлення зупинився, тому що був досягнутий максимальний поріг тривалості.",
"description": "Confirmation dialog message for when the voice recording is interrupted due to max time limit"
},
"voiceRecordingInterruptedBlur": {
"message": "Voice message recording stopped because you switched to another app.",
"message": "Запис голосового повідомлення зупинився, тому що ви переключилися на іншу програму.",
"description": "Confirmation dialog message for when the voice recording is interrupted due to app losing focus"
},
"voiceNoteLimit": {
"message": "Voice messages are limited to five minutes. Recording will stop if you switch to another app.",
"message": "Голосові повідомлення обмежені п'ятьма хвилинами. Запис зупиниться, якщо ви перейдете на інший додаток.",
"description": "Shown in toast to warn user about limited time and that window must be in focus"
},
"voiceNoteMustBeOnlyAttachment": {
"message": "A voice message must have only one attachment.",
"message": "Голосове повідомлення повинно містити тільки одне вкладення.",
"description": "Shown in toast if tries to record a voice note with any staged attachments"
},
"attachmentSaved": {
@ -934,11 +934,11 @@
"description": "Shown if the user attempts to send an audio message without audio permissions turned on"
},
"audioCallingPermissionNeeded": {
"message": "For calling, you must allow Signal Desktop to access your microphone.",
"message": "Щоб здійснювати дзвінки, ви повинні дозволити Signal Desktop отримати доступ до вашого мікрофона.",
"description": "Shown if the user attempts access the microphone for calling without audio permissions turned on"
},
"videoCallingPermissionNeeded": {
"message": "For video calling, you must allow Signal Desktop to access your camera.",
"message": "Щоб здійснювати відео дзвінки, ви повинні дозволити Signal Desktop отримати доступ до вашої камери.",
"description": "Shown if the user attempts access the camera for video calling without video permissions turned on"
},
"allowAccess": {
@ -966,7 +966,7 @@
"description": "Shown as the title of our update error dialogs on windows"
},
"cannotUpdateDetail": {
"message": "Signal Desktop failed to update, but there is a new version available. Please go to $url$ and install the new version manually, then either contact support or file a bug about this problem.",
"message": "Signal Desktop не вдалося оновитись, але нова версія доступна. Будь ласка, перейдіть на $url$ і встановіть нову версію вручну, потім зв'яжіться з підтримкою або подайте файл помилки щодо цієї проблеми.",
"description": "Shown if a general error happened while trying to install update package",
"placeholders": {
"url": {
@ -976,7 +976,7 @@
}
},
"readOnlyVolume": {
"message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving $app$ to $folder$ with Finder.",
"message": "Швидше за все, Signal Desktop знаходиться в карантині macOS і не зможе автоматично оновлюватись. Будь ласка, спробуйте перемістити $app$ в $folder$ за допомогою Finder.",
"description": "Shown on MacOS if running on a read-only volume and we cannot update",
"placeholders": {
"app": {
@ -1030,7 +1030,7 @@
"description": "Label for when something is turned off"
},
"deleteWarning": {
"message": "This message will be deleted from this device.",
"message": "Це повідомлення буде видалено з цього пристрою.",
"description": "Text shown in the confirmation dialog for deleting a message locally"
},
"deleteForEveryoneWarning": {
@ -1156,7 +1156,7 @@
"description": "Shown in left pane preview when message delivery issue happens"
},
"DeliveryIssue--notification": {
"message": "A message from $sender$ couldnt be delivered",
"message": "Повідомлення від $sender$ не вдалось доставити ",
"description": "Shown in timeline when message delivery issue happens",
"placeholders": {
"name": {
@ -1174,8 +1174,18 @@
"description": "Shown on explainer dialog available from delivery issue timeline events"
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"message": "Не вдалось доставити повідомлення, стікер, реакцію або повідомлення про прочитання від $sender$ до вас. Ця людина могла відправити вищевказане безпосередньо вам або в яку-небудь групу.",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "Не вдалося доставити повідомлення, стікер, реакцію, повідомлення про прочитання або медіа файл від $sender$ вам в цьому чаті. ",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -1184,23 +1194,23 @@
}
},
"quoteThumbnailAlt": {
"message": "Thumbnail of image from quoted message",
"message": "Мініатюрні зображення з цитованих повідомлень",
"description": "Used in alt tag of thumbnail images inside of an embedded message quote"
},
"imageAttachmentAlt": {
"message": "Image attached to message",
"message": "Зображення, прикріплене до повідомлення",
"description": "Used in alt tag of image attachment"
},
"videoAttachmentAlt": {
"message": "Screenshot of video attached to message",
"message": "Скріншот відео, прикріпленого до повідомлення",
"description": "Used in alt tag of video attachment preview"
},
"lightboxImageAlt": {
"message": "Image sent in conversation",
"message": "Зображення, відправлене в розмову",
"description": "Used in the alt tag for the image shown in a full-screen lightbox view"
},
"imageCaptionIconAlt": {
"message": "Icon showing that this image has a caption",
"message": "Значок який показує, що в цьому зображенні є підпис",
"description": "Used for the icon layered on top of an image in message bubbles"
},
"addACaption": {
@ -1236,7 +1246,7 @@
"description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app"
},
"plusButton": {
"message": "'+' Button",
"message": "'+' Кнопка",
"description": "The button used in Signal Android to add a new linked device"
},
"linkNewDevice": {
@ -1328,15 +1338,15 @@
"description": "Button tooltip label for turning on the microphone"
},
"calling__button--presenting-disabled": {
"message": "Presenting disabled",
"message": "Представлення відключено",
"description": "Button tooltip label for when screen sharing is disabled"
},
"calling__button--presenting-on": {
"message": "Start presenting",
"message": "Почати представлення",
"description": "Button tooltip label for starting to share screen"
},
"calling__button--presenting-off": {
"message": "Stop presenting",
"message": "Зупинити представлення",
"description": "Button tooltip label for stopping screen sharing"
},
"calling__your-video-is-off": {
@ -1348,7 +1358,7 @@
"description": "Shown in the calling lobby to describe who is in the call"
},
"calling__lobby-summary--single": {
"message": "$first$ is in this call",
"message": "$first$ у цьому дзвінку",
"description": "Shown in the calling lobby to describe who is in the call",
"placeholders": {
"first": {
@ -1362,7 +1372,7 @@
"description": "Shown in the calling lobby to describe when it is just you"
},
"calling__lobby-summary--double": {
"message": "$first$ and $second$ are in this call",
"message": "$first$ і $second$ у цьому дзвінку",
"description": "Shown in the calling lobby to describe who is in the call",
"placeholders": {
"first": {
@ -1376,7 +1386,7 @@
}
},
"calling__lobby-summary--triple": {
"message": "$first$, $second$, and $third$ are in this call",
"message": "$first$, $second$, і $third$ у цьому дзвінку",
"description": "Shown in the calling lobby to describe who is in the call",
"placeholders": {
"first": {
@ -1444,23 +1454,23 @@
"description": "Shown in the modal dialog to describe how blocking works in a gorup call"
},
"calling__overflow__scroll-up": {
"message": "Scroll up",
"message": "Прокрутити вгору",
"description": "Label for the \"scroll up\" button in a call's overflow area"
},
"calling__overflow__scroll-down": {
"message": "Scroll down",
"message": "Прокрутити вниз",
"description": "Label for the \"scroll down\" button in a call's overflow area"
},
"calling__presenting--notification-title": {
"message": "You're presenting to everyone.",
"message": "Ви покажете всім свій екран.",
"description": "Title for the share screen notification"
},
"calling__presenting--notification-body": {
"message": "Click here to return to the call when you're ready to stop presenting.",
"message": "Натисніть тут, щоб повернутися до дзвінка, коли ви будете готові зупинити показ.",
"description": "Body text for the share screen notification"
},
"calling__presenting--info": {
"message": "Signal is sharing $window$.",
"message": "Signal обмінюється $window$.",
"description": "Text that appears in the screen sharing controller to inform person that they are presenting",
"placeholders": {
"name": {
@ -1470,15 +1480,15 @@
}
},
"calling__presenting--stop": {
"message": "Stop sharing",
"message": "Припинити обмін",
"description": "Button for stopping screen sharing"
},
"calling__presenting--you-stopped": {
"message": "You stopped presenting",
"message": "Ви зупинили представлення",
"description": "Toast that appears when someone stops presenting"
},
"calling__presenting--person-ongoing": {
"message": "$name$ is presenting",
"message": "$name$ поширює",
"description": "Title of call when someone is presenting",
"placeholders": {
"name": {
@ -1488,7 +1498,7 @@
}
},
"calling__presenting--person-stopped": {
"message": "$name$ stopped presenting",
"message": "$name$ припинив презентацію",
"description": "Toast that appears when someone stops presenting",
"placeholders": {
"name": {
@ -1498,27 +1508,27 @@
}
},
"calling__presenting--permission-title": {
"message": "Permission needed",
"message": "Потрібен дозвіл",
"description": "Shown as the title for the modal that requests screen recording permissions"
},
"calling__presenting--macos-permission-description": {
"message": "Signal needs permission to access your computer's screen recording.",
"message": "Signal необхідний дозвіл, щоб отримати доступ до запису вашого екрану.",
"description": "Shown as the description for the modal that requests screen recording permissions"
},
"calling__presenting--permission-instruction-step1": {
"message": "Go to System Preferences.",
"message": "Перейти в Системні Налаштування.",
"description": "Shown as the description for the modal that requests screen recording permissions"
},
"calling__presenting--permission-instruction-step2": {
"message": "Click on the lock icon on the bottom left and enter your computers password.",
"message": "Натисніть на значок замка в нижньому нижньому кутику та введіть пароль від свого комп'ютера.",
"description": "Shown as the description for the modal that requests screen recording permissions"
},
"calling__presenting--permission-instruction-step3": {
"message": "On the right, check the box next to Signal. If you dont see Signal in the list, click the + to add it.",
"message": "Справа поставте галочку біля Signal. Якщо ви не бачите Signal у списку, натисніть +, щоб додати його.",
"description": "Shown as the description for the modal that requests screen recording permissions"
},
"calling__presenting--permission-open": {
"message": "Open System Preferences",
"message": "Відкрити Системні Налаштування.",
"description": "The button that opens your system preferences for the needs screen record permissions modal"
},
"calling__presenting--permission-cancel": {
@ -1562,11 +1572,11 @@
"description": "Shown when the user disables spellcheck to indicate that they must restart Signal."
},
"SystemTraySetting__minimize-to-system-tray": {
"message": "Minimize to system tray",
"message": "Згорнути в системний трей",
"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": "Start minimized to tray",
"message": "Запускати згорнутим в треї",
"description": "In the settings, shown next to the checkbox option for starting in the system tray"
},
"autoLaunchDescription": {
@ -1590,7 +1600,7 @@
"description": "Header of the full-screen delete data confirmation screen"
},
"deleteAllDataBody": {
"message": "You are about to delete all of this application's saved account information, including all contacts and all messages. You can always link with your mobile device again, but that will not restore deleted messages.",
"message": "Ви збираєтеся видалити всю збережену інформацію про обліковий запис цієї програми, включаючи всі контакти і всі повідомлення. Ви завжди зможете повторно прив'язати ваш мобільний пристрій, але це не відновить ваші видалені повідомлення.",
"description": "Text describing what exactly will happen if the user clicks the button to delete all data"
},
"deleteAllDataButton": {
@ -1598,7 +1608,7 @@
"description": "Text of the button that deletes all data"
},
"deleteAllDataProgress": {
"message": "Disconnecting and deleting all data",
"message": "Відключається і видаляє всі дані",
"description": "Message shown to user when app is disconnected and data deleted"
},
"deleteOldIndexedDBData": {
@ -1796,11 +1806,11 @@
"description": "Brief message shown when trying to message a blocked number"
},
"unblockGroupToSend": {
"message": "Unblock this group to send a message.",
"message": "Розблокувати цю групу щоб надіслати повідомлення.",
"description": "Brief message shown when trying to message a blocked group"
},
"youChangedTheTimer": {
"message": "You set the disappearing message time to $time$.",
"message": "Ви встановлюєте час зникнення повідомлення на $time$.",
"description": "Message displayed when you change the message expiration timer in a conversation.",
"placeholders": {
"time": {
@ -1810,7 +1820,7 @@
}
},
"timerSetOnSync": {
"message": "Updated the disappearing message time to $time$.",
"message": "Оновлено час зникнення повідомлення на $time$.",
"description": "Message displayed when timer is set on initial link of desktop device.",
"placeholders": {
"time": {
@ -1820,7 +1830,7 @@
}
},
"timerSetByMember": {
"message": "A member set the disappearing message time to $time$.",
"message": "Один із учасників встановив час зникнення повідомлення на $time$.",
"description": "Message displayed when timer is by an unknown group member.",
"placeholders": {
"time": {
@ -1830,7 +1840,7 @@
}
},
"theyChangedTheTimer": {
"message": "$name$ set the disappearing message time to $time$.",
"message": "$name$ встановив (-ла) час зникнення повідомлення на $time$.",
"description": "Message displayed when someone else changes the message expiration timer in a conversation.",
"placeholders": {
"name": {
@ -1856,11 +1866,11 @@
"description": "Displayed in the left pane when the timer is turned off"
},
"disappearingMessagesDisabledByMember": {
"message": "A member disabled disappearing messages.",
"message": "Учасник групи вимкнув зникаючі повідомлення.",
"description": "Displayed in the left pane when the timer is turned off"
},
"disabledDisappearingMessages": {
"message": "$name$ disabled disappearing messages.",
"message": "$name$ вимкнув зникаючі повідомлення.",
"description": "Displayed in the conversation list when the timer is turned off",
"placeholders": {
"name": {
@ -1888,7 +1898,7 @@
"description": "Description for audio notification setting"
},
"callRingtoneNotificationDescription": {
"message": "Play calling sounds",
"message": "Програвати звуки дзвінків",
"description": "Description for call ringtone notification setting"
},
"callSystemNotificationDescription": {
@ -1896,11 +1906,11 @@
"description": "Description for call notification setting"
},
"incomingCallNotificationDescription": {
"message": "Enable incoming calls",
"message": "Включити вхідні дзвінки",
"description": "Description for incoming calls setting"
},
"contactChangedProfileName": {
"message": "$sender$ changed their profile name from $oldProfile$ to $newProfile$.",
"message": "$sender$змінив (-ла) своє ім'я профілю з $oldProfile$ на $newProfile$.",
"description": "Description for incoming calls setting",
"placeholders": {
"sender": {
@ -1918,7 +1928,7 @@
}
},
"changedProfileName": {
"message": "$oldProfile$ changed their profile name to $newProfile$.",
"message": "$oldProfile$змінив (-ла) своє ім'я профілю на $newProfile$.",
"description": "Shown when a contact not in your address book changes their profile name",
"placeholders": {
"oldProfile": {
@ -1988,7 +1998,7 @@
"description": "Description for the Note to Self conversation"
},
"notificationDrawAttention": {
"message": "Draw attention to this window when a notification arrives",
"message": "Привернути увагу до цього вікна коли надійде сповіщення",
"description": "Label text for the setting that controls whether new notifications draw attention to the window"
},
"hideMenuBar": {
@ -2036,7 +2046,7 @@
"description": "Shown in the alert when you add the maximum number of group members"
},
"chooseGroupMembers__maximum-group-size__body": {
"message": "Signal groups can have a maximum of $max$ members.",
"message": "У групах Signal можуть перебувати максимум $max$ учасників.",
"description": "Shown in the alert when you add the maximum number of group members",
"placeholders": {
"max": {
@ -2050,7 +2060,7 @@
"description": "Shown in the alert when you add the maximum recommended number of group members"
},
"chooseGroupMembers__maximum-recommended-group-size__body": {
"message": "Signal groups perform best with $max$ members or less. Adding more members will cause delays sending and receiving messages.",
"message": "Групи у Signal найкраще працюють з $max$ учасниками або менше. Додавання більшої кількості учасників призведе до затримки у відправленні та отримуванні повідомлень.",
"description": "Shown in the alert when you add the maximum recommended number of group members",
"placeholders": {
"max": {
@ -2064,7 +2074,7 @@
"description": "Shown in the alert when you try to add someone who can't be added to a group"
},
"chooseGroupMembers__cant-add-member__body": {
"message": "\"$name$\" cant be added to the group because theyre using an old version of Signal. You can add them to the group after theyve updated Signal.",
"message": "\"$name$\" не може бути доданий (-а) в групу, так як він (-а) використовує стару версію Signal. Ви зможете додати цю людину в групу після того, як він оновить Signal.",
"description": "Shown in the alert when you try to add someone who can't be added to a group",
"placeholders": {
"max": {
@ -2086,7 +2096,7 @@
"description": "The placeholder for the group name placeholder"
},
"setGroupMetadata__group-description-placeholder": {
"message": "Description",
"message": "Опис",
"description": "The placeholder for the group description"
},
"setGroupMetadata__create-group": {
@ -2258,7 +2268,7 @@
"description": "Shown in notifications and in the left pane when a generic file is received."
},
"message--getNotificationText--stickers": {
"message": "Sticker message",
"message": "Повідомлення з стікером",
"description": "Shown in notifications and in the left pane instead of sticker image."
},
"message--getNotificationText--text-with-emoji": {
@ -2280,15 +2290,15 @@
"description": "Shown in notifications and in the left pane when a message has features too new for this signal install."
},
"message--getDescription--disappearing-media": {
"message": "View-once Media",
"message": "Одноразові Медіа",
"description": "Shown in notifications and in the left pane after view-once message is deleted. Also shown when quoting a view once media."
},
"message--getDescription--disappearing-photo": {
"message": "View-once Photo",
"message": "Одноразове Фото",
"description": "Shown in notifications and in the left pane when a message is a view once photo. Also shown when quoting a view once photo."
},
"message--getDescription--disappearing-video": {
"message": "View-once Video",
"message": "Одноразове Відео",
"description": "Shown in notifications and in the left pane when a message is a view once video. Also shown when quoting a view once video."
},
"message--deletedForEveryone": {
@ -2296,7 +2306,7 @@
"description": "Shown in a message's bubble when the message has been deleted for everyone."
},
"stickers--toast--InstallFailed": {
"message": "Sticker pack could not be installed",
"message": "Не вдалося встановити набір стікерів",
"description": "Shown in a toast if the user attempts to install a sticker pack and it fails"
},
"stickers--StickerManager--InstalledPacks": {
@ -2312,7 +2322,7 @@
"description": "Shown in the sticker pack manager above the default sticker packs."
},
"stickers--StickerManager--BlessedPacks--Empty": {
"message": "No Signal Artist stickers available",
"message": "Немає доступних стікерів від художників Signal",
"description": "Shown in the sticker pack manager when there are no blessed sticker packs available."
},
"stickers--StickerManager--ReceivedPacks": {
@ -2332,11 +2342,11 @@
"description": "Shown in the sticker pack manager next to sticker packs which are already installed."
},
"stickers--StickerManager--UninstallWarning": {
"message": "You may not be able to re-install this sticker pack if you no longer have the source message.",
"message": "Можливо, ви не зможете встановити цей набір стікерів знову, якщо у вас вже немає вихідного повідомлення.",
"description": "Shown in the sticker pack manager next to sticker packs which are already installed."
},
"stickers--StickerManager--Introduction--Image": {
"message": "Introducing Stickers: Bandit the Cat",
"message": "Представляємо стікери: Bandit the Cat (Кіт-Бандит)",
"description": "Alt text on a tooltip image when the user upgrades to a version of Signal supporting stickers."
},
"stickers--StickerManager--Introduction--Title": {
@ -2344,15 +2354,15 @@
"description": "Shown as the title on a tooltip when the user upgrades to a version of Signal supporting stickers."
},
"stickers--StickerManager--Introduction--Body": {
"message": "Why use words when you can use stickers?",
"message": "Навіщо використовувати слова, коли можна використовувати стікери?",
"description": "Shown as the body on a tooltip when the user upgrades to a version of Signal supporting stickers."
},
"stickers--StickerPicker--Open": {
"message": "Open the sticker picker",
"message": "Відкрити панель стікерів",
"description": "Label for the open button for the sticker picker"
},
"stickers--StickerPicker--AddPack": {
"message": "Add a sticker pack",
"message": "Додати набір стікерів",
"description": "Label for the add pack button in the sticker picker"
},
"stickers--StickerPicker--NextPage": {
@ -2372,23 +2382,23 @@
"description": "Shown in the sticker picker when one or more stickers could not be downloaded."
},
"stickers--StickerPicker--DownloadPending": {
"message": "Installing sticker pack...",
"message": "Установка набору стікерів...",
"description": "Shown in the sticker picker when one or more stickers are still downloading."
},
"stickers--StickerPicker--Empty": {
"message": "No stickers found",
"message": "Не знайдено жодних стікерів",
"description": "Shown in the sticker picker when there are no stickers to show."
},
"stickers--StickerPicker--Hint": {
"message": "New sticker packs from your messages are available to install",
"message": "Нові набори стікерів з ваших повідомлень доступні для установки",
"description": "Shown in the sticker picker the first time you have received new packs you can install."
},
"stickers--StickerPicker--NoPacks": {
"message": "No sticker packs found",
"message": "Не знайдено жодних наборів стікерів",
"description": "Shown in the sticker picker when there are no installed sticker packs."
},
"stickers--StickerPicker--NoRecents": {
"message": "Recently used stickers will appear here.",
"message": "Нещодавно використані стікери з'являться тут.",
"description": "Shown in the sticker picker when there are no recent stickers to show."
},
"stickers--StickerPreview--Title": {
@ -2396,11 +2406,11 @@
"description": "The title that appears in the sticker pack preview modal."
},
"stickers--StickerPreview--Error": {
"message": "Error opening sticker pack. Check your internet connection and try again.",
"message": "Помилка при відкриванні набору стікерів. Перевірте ваше підключення до інтернету і спробуйте ще раз.",
"description": "The message that appears in the sticker preview modal when there is an error."
},
"EmojiPicker--empty": {
"message": "No emoji found",
"message": "Емоджі не знайдено",
"description": "Shown in the emoji picker when a search yields 0 results."
},
"EmojiPicker--search-placeholder": {
@ -2408,7 +2418,7 @@
"description": "Shown as a placeholder inside the emoji picker search field."
},
"EmojiPicker--skin-tone": {
"message": "Skin tone $tone$",
"message": "відтінок шкіри $tone$",
"description": "Shown as a tooltip over the emoji tone buttons.",
"placeholders": {
"status": {
@ -2426,7 +2436,7 @@
"description": "Label for emoji emoji picker button"
},
"EmojiPicker__button--animal": {
"message": "Animal",
"message": "Тварина",
"description": "Label for animal emoji picker button"
},
"EmojiPicker__button--food": {
@ -2434,23 +2444,23 @@
"description": "Label for food emoji picker button"
},
"EmojiPicker__button--activity": {
"message": "Activity",
"message": "Активність",
"description": "Label for activity emoji picker button"
},
"EmojiPicker__button--travel": {
"message": "Travel",
"message": "Подорож",
"description": "Label for travel emoji picker button"
},
"EmojiPicker__button--object": {
"message": "Object",
"message": "Предмет",
"description": "Label for object emoji picker button"
},
"EmojiPicker__button--symbol": {
"message": "Symbol",
"message": "Символ",
"description": "Label for symbol emoji picker button"
},
"EmojiPicker__button--flag": {
"message": "Flag",
"message": "Прапор",
"description": "Label for flag emoji picker button"
},
"confirmation-dialog--Cancel": {
@ -2458,7 +2468,7 @@
"description": "Appears on the cancel button in confirmation dialogs."
},
"Message--unsupported-message": {
"message": "$contact$ sent you a message that can't be processed or displayed because it uses a new Signal feature.",
"message": "$contact$ відправив (-лa) вам повідомлення, яке не може бути оброблено або відображено, оскільки воно використовує нову функцію Signal.",
"description": "",
"placeholders": {
"contact": {
@ -2468,7 +2478,7 @@
}
},
"Message--unsupported-message-ask-to-resend": {
"message": "You can ask $contact$ to re-send this message now that you are using an up-to-date version of Signal.",
"message": "Ви можете попросити $contact$ повторно відправити це повідомлення, так як тепер ви використовуєте актуальну версію Signal.",
"description": "",
"placeholders": {
"contact": {
@ -2478,11 +2488,11 @@
}
},
"Message--from-me-unsupported-message": {
"message": "One of your devices sent a message that can't be processed or displayed because it uses a new Signal feature.",
"message": "Одне з ваших пристроїв відправило повідомлення, яке не може бути оброблено або відображено, оскільки воно використовує нову функцію Signal.",
"description": ""
},
"Message--from-me-unsupported-message-ask-to-resend": {
"message": "Future messages like this will be synchronized now that you are using an up-to-date version of Signal.",
"message": "Майбутні повідомлення, подібні до цього, будуть синхронізуватись, так як тепер ви використовуєте актуальну версію Signal.",
"description": ""
},
"Message--update-signal": {
@ -2502,7 +2512,7 @@
"description": "Shown when user clicks on an expired incoming view-once bubble"
},
"Message--tap-to-view--outgoing--expired-toast": {
"message": "View-once messages are not stored in your conversation history.",
"message": "Одноразові повідомлення не зберігаються в історії вашої розмови.",
"description": "Shown when user clicks on an expired outgoing view-once bubble"
},
"Message--tap-to-view--incoming": {
@ -2514,19 +2524,19 @@
"description": "Text shown on video messages with with individual timers, before user has viewed it"
},
"Conversation--getDraftPreview--attachment": {
"message": "(attachment)",
"message": "(вкладення)",
"description": "Text shown in left pane as preview for conversation with saved a saved draft message"
},
"Conversation--getDraftPreview--quote": {
"message": "(quote)",
"message": "(цитата)",
"description": "Text shown in left pane as preview for conversation with saved a saved draft message"
},
"Conversation--getDraftPreview--draft": {
"message": "(draft)",
"message": "(чорновик)",
"description": "Text shown in left pane as preview for conversation with saved a saved draft message"
},
"Keyboard--navigate-by-section": {
"message": "Navigate by section",
"message": "Навігація по секціях",
"description": "Shown in the shortcuts guide"
},
"Keyboard--previous-conversation": {
@ -2574,59 +2584,59 @@
"description": "Shown in the shortcuts guide"
},
"Keyboard--focus-composer": {
"message": "Focus composer",
"message": "Сфокусуватися на панелі введення",
"description": "Shown in the shortcuts guide"
},
"Keyboard--open-all-media-view": {
"message": "Open All Media view",
"message": "Відкрити вікно Всіх Медіа",
"description": "Shown in the shortcuts guide"
},
"Keyboard--open-emoji-chooser": {
"message": "Open emoji chooser",
"message": "Відкрийте програму вибору смайликів",
"description": "Shown in the shortcuts guide"
},
"Keyboard--open-sticker-chooser": {
"message": "Open sticker chooser",
"message": "Відкрийте програму вибору стікерів",
"description": "Shown in the shortcuts guide"
},
"Keyboard--begin-recording-voice-note": {
"message": "Begin recording voice note",
"message": "Почати запис аудіо повідомлення",
"description": "Shown in the shortcuts guide"
},
"Keyboard--default-message-action": {
"message": "Default action for selected message",
"message": "Дія за замовчуванням для вибраного повідомлення",
"description": "Shown in the shortcuts guide"
},
"Keyboard--view-details-for-selected-message": {
"message": "View selected message details",
"message": "Переглянути інформацію по обраному повідомленні",
"description": "Shown in the shortcuts guide"
},
"Keyboard--toggle-reply": {
"message": "Toggle reply to selected message",
"message": "Переключити: відповісти на вибране повідомлення",
"description": "Shown in the shortcuts guide"
},
"Keyboard--toggle-reaction-picker": {
"message": "Toggle emoji-reaction picker for selected message",
"message": "Показати/приховати панель реакцій на смайлики для вибраного повідомлення",
"description": "Shown in the shortcuts guide"
},
"Keyboard--save-attachment": {
"message": "Save attachment from selected message",
"message": "Зберегти вкладення з вибраного повідомлення",
"description": "Shown in the shortcuts guide"
},
"Keyboard--delete-message": {
"message": "Delete selected message",
"message": "Видалити вибране повідомлення",
"description": "Shown in the shortcuts guide"
},
"Keyboard--add-newline": {
"message": "Add newline to message",
"message": "Додати перехід на новий рядок до повідомлення",
"description": "Shown in the shortcuts guide"
},
"Keyboard--expand-composer": {
"message": "Expand composer",
"message": "Розгорнути панель введення",
"description": "Shown in the shortcuts guide"
},
"Keyboard--send-in-expanded-composer": {
"message": "Send (in expanded composer)",
"message": "Надіслати (в розгорнутій панелі введення)",
"description": "Shown in the shortcuts guide"
},
"Keyboard--attach-file": {
@ -2634,15 +2644,15 @@
"description": "Shown in the shortcuts guide"
},
"Keyboard--remove-draft-link-preview": {
"message": "Remove draft link preview",
"message": "Видалити чернетку попереднього перегляду посилання",
"description": "Shown in the shortcuts guide"
},
"Keyboard--remove-draft-attachments": {
"message": "Remove all draft attachments",
"message": "Видалити всі чернетки вкладень",
"description": "Shown in the shortcuts guide"
},
"Keyboard--conversation-by-index": {
"message": "Jump to conversation",
"message": "Перейти до певної розмови в списку",
"description": "A shortcut allowing direct navigation to conversations 1 to 9 in list"
},
"Keyboard--Key--ctrl": {
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Продовжити без підтвердження?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {
@ -5552,7 +5562,7 @@
"description": "View title for the chat color picker and editor"
},
"ChatColorPicker__reset": {
"message": "Reset chat color",
"message": "Скинути колір чату",
"description": "Button label for resetting chat colors"
},
"ChatColorPicker__resetDefault": {
@ -5580,7 +5590,7 @@
"description": "aria-label for custom color editor button"
},
"ChatColorPicker__sampleBubble1": {
"message": "Here's a preview of the chat color.",
"message": "Ось таким буде колір чату.",
"description": "An example message bubble for selecting the chat color"
},
"ChatColorPicker__sampleBubble2": {
@ -5592,7 +5602,7 @@
"description": "An example message bubble for selecting the chat color"
},
"ChatColorPicker__context--edit": {
"message": "Edit color",
"message": "Редагувати колір",
"description": "Option in the custom color bubble context menu"
},
"ChatColorPicker__context--duplicate": {
@ -5628,7 +5638,7 @@
"description": "Text for an option in Disappearing Messages menu and Conversation Details Disappearing Messages setting when no user value is available"
},
"selectedCustomDisappearingTimeOption": {
"message": "Custom time",
"message": "Власний час",
"description": "Text for an option in Conversation Details Disappearing Messages setting when user previously selected custom time"
},
"DisappearingTimeDialog__title": {
@ -5668,7 +5678,7 @@
"description": "Footer for the Disappearing Messages settings section"
},
"settings__DisappearingMessages__timer__label": {
"message": "Default timer for new chats",
"message": "Таймер за умовчанням для нових чатів",
"description": "Label for the Disapearring Messages default timer setting"
},
"UniversalTimerNotification__text": {
@ -5812,7 +5822,7 @@
"description": "Error message when something goes wrong updating your profile."
},
"AnnouncementsOnlyGroupBanner--modal": {
"message": "Message an admin",
"message": "Написати адміністратору",
"description": "Modal title for the list of admins in a group"
},
"AnnouncementsOnlyGroupBanner--announcements-only": {

View File

@ -56,7 +56,7 @@
"description": "The label that is used for the Preferences menu in the program main menu. This should be consistent with the standard naming for Preferences on the operating system."
},
"appMenuServices": {
"message": "Services",
"message": "خدمات",
"description": "Application menu item for macOS 'Services'"
},
"appMenuHide": {
@ -622,7 +622,7 @@
}
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error. Click to submit a debug log.",
"message": "Desktop ایک ڈکرپشن غلطی میں چلا گیا۔ debug لاگ جمع کرنے کے لئے کلک کریں۔",
"description": "An error popup when we haven't added an error for decryption error."
},
"oneNonImageAtATimeToast": {
@ -678,7 +678,7 @@
"description": "View menu item to open the debug log (title case)"
},
"forceUpdate": {
"message": "Force Update",
"message": "Force اپ ڈیٹ",
"description": "View menu item to force the app to update download and install"
},
"helpMenuShowKeyboardShortcuts": {
@ -718,7 +718,7 @@
"description": "Item under the Help menu, which opens a small about window"
},
"screenShareWindow": {
"message": "Sharing screen",
"message": "اسکرین کا اشتراک کرنا",
"description": "Title for screen sharing window"
},
"speech": {
@ -770,7 +770,7 @@
}
},
"noSearchResults--sms-only": {
"message": "SMS/MMS contacts are not available on Desktop.",
"message": "Dekstop پر SMS / MMS رابطے دستیاب نہیں ہیں۔",
"description": "Shown in the search left pane when no results were found and primary device has SMS/MMS handling enabled"
},
"noSearchResultsInConversation": {
@ -1030,7 +1030,7 @@
"description": "Label for when something is turned off"
},
"deleteWarning": {
"message": "This message will be deleted from this device.",
"message": "اس پیغام کو اس آلہ سے حذف کردیا جائے گا۔",
"description": "Text shown in the confirmation dialog for deleting a message locally"
},
"deleteForEveryoneWarning": {
@ -1156,7 +1156,7 @@
"description": "Shown in left pane preview when message delivery issue happens"
},
"DeliveryIssue--notification": {
"message": "A message from $sender$ couldnt be delivered",
"message": "$sender$ کا پیغام نہیں پہنچایا جاسکا",
"description": "Shown in timeline when message delivery issue happens",
"placeholders": {
"name": {
@ -1174,8 +1174,18 @@
"description": "Shown on explainer dialog available from delivery issue timeline events"
},
"DeliveryIssue--summary": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$. They may have tried sending it to you directly, or in a group.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"message": "$sender$ کا ایک پیغام ، اسٹیکر ، ردعمل ، پڑھنے کی رسید یا میڈیا آپ کو نہیں پہنچایا جاسکا۔ ہوسکتا ہے کہ انہوں نے اسے براہ راست یا کسی گروپ میں آپ کو بھیجنے کی کوشش کی ہو۔",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "اس چیٹ میں $sender$ سے آپ کو کوئی پیغام ، اسٹیکر ، ردعمل ، پڑھنے کی رسید یا میڈیا نہیں پہنچایا جاسکتا ہے۔",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -1328,15 +1338,15 @@
"description": "Button tooltip label for turning on the microphone"
},
"calling__button--presenting-disabled": {
"message": "Presenting disabled",
"message": "پیش کرنا غیر فعال ہے",
"description": "Button tooltip label for when screen sharing is disabled"
},
"calling__button--presenting-on": {
"message": "Start presenting",
"message": "پیش کرنا شروع کریں",
"description": "Button tooltip label for starting to share screen"
},
"calling__button--presenting-off": {
"message": "Stop presenting",
"message": "پیش کرنا بند کریں",
"description": "Button tooltip label for stopping screen sharing"
},
"calling__your-video-is-off": {
@ -1452,15 +1462,15 @@
"description": "Label for the \"scroll down\" button in a call's overflow area"
},
"calling__presenting--notification-title": {
"message": "You're presenting to everyone.",
"message": "آپ سب کے سامنے پیش کر رہے ہیں۔",
"description": "Title for the share screen notification"
},
"calling__presenting--notification-body": {
"message": "Click here to return to the call when you're ready to stop presenting.",
"message": "جب آپ پیش کرنا بند کردیں گے تو کال پر واپس آنے کے لئے یہاں کلک کریں۔",
"description": "Body text for the share screen notification"
},
"calling__presenting--info": {
"message": "Signal is sharing $window$.",
"message": "Signal $window$ شیئر کر رہا ہے۔ ",
"description": "Text that appears in the screen sharing controller to inform person that they are presenting",
"placeholders": {
"name": {
@ -1470,15 +1480,15 @@
}
},
"calling__presenting--stop": {
"message": "Stop sharing",
"message": "اشتراک بند کرو",
"description": "Button for stopping screen sharing"
},
"calling__presenting--you-stopped": {
"message": "You stopped presenting",
"message": "آپ نے پیش کرنا چھوڑ دیا",
"description": "Toast that appears when someone stops presenting"
},
"calling__presenting--person-ongoing": {
"message": "$name$ is presenting",
"message": "$name$ پیش کر رہا ہے",
"description": "Title of call when someone is presenting",
"placeholders": {
"name": {
@ -1488,7 +1498,7 @@
}
},
"calling__presenting--person-stopped": {
"message": "$name$ stopped presenting",
"message": "$name$ نے پیش کرنا چھوڑ دیا",
"description": "Toast that appears when someone stops presenting",
"placeholders": {
"name": {
@ -1498,27 +1508,27 @@
}
},
"calling__presenting--permission-title": {
"message": "Permission needed",
"message": "اجازت درکار ہے",
"description": "Shown as the title for the modal that requests screen recording permissions"
},
"calling__presenting--macos-permission-description": {
"message": "Signal needs permission to access your computer's screen recording.",
"message": "آپ کے کمپیوٹر کی اسکرین ریکارڈنگ تک رسائی کے لئے Signal کو اجازت کی ضرورت ہے۔",
"description": "Shown as the description for the modal that requests screen recording permissions"
},
"calling__presenting--permission-instruction-step1": {
"message": "Go to System Preferences.",
"message": "سسٹم کی ترجیحات پر جائیں۔",
"description": "Shown as the description for the modal that requests screen recording permissions"
},
"calling__presenting--permission-instruction-step2": {
"message": "Click on the lock icon on the bottom left and enter your computers password.",
"message": "نیچے بائیں طرف تالا آئکن پر کلک کریں اور اپنے کمپیوٹر کا پاس ورڈ درج کریں۔",
"description": "Shown as the description for the modal that requests screen recording permissions"
},
"calling__presenting--permission-instruction-step3": {
"message": "On the right, check the box next to Signal. If you dont see Signal in the list, click the + to add it.",
"message": "دائیں طرف ، Signal کے ساتھ والے باکس کو چیک کریں۔ اگر آپ کو فہرست میں Signal نظر نہیں آتا ہے تو ، اسے شامل کرنے کے لئے + پر کلک کریں۔",
"description": "Shown as the description for the modal that requests screen recording permissions"
},
"calling__presenting--permission-open": {
"message": "Open System Preferences",
"message": "سسٹم کی ترجیحات کو کھولیں",
"description": "The button that opens your system preferences for the needs screen record permissions modal"
},
"calling__presenting--permission-cancel": {
@ -1550,7 +1560,7 @@
"description": "Header for general options on the settings screen"
},
"spellCheckDescription": {
"message": "Enable spell check",
"message": "Spell check کو قابل بنائیں",
"description": "Description of the spell check setting"
},
"spellCheckWillBeEnabled": {
@ -1562,7 +1572,7 @@
"description": "Shown when the user disables spellcheck to indicate that they must restart Signal."
},
"SystemTraySetting__minimize-to-system-tray": {
"message": "Minimize to system tray",
"message": "سسٹم ٹرے سائز کو کم سے کم کریں",
"description": "In the settings, shown next to the checkbox option for minimizing to the system tray"
},
"SystemTraySetting__minimize-to-and-start-in-system-tray": {
@ -1570,7 +1580,7 @@
"description": "In the settings, shown next to the checkbox option for starting in the system tray"
},
"autoLaunchDescription": {
"message": "Open at computer login",
"message": "کمپیوٹر لاگ ان پر کھولیں",
"description": "Description for the automatic launch setting"
},
"clearDataHeader": {
@ -2004,19 +2014,19 @@
"description": "Label for header when starting a new conversation"
},
"contactSearchPlaceholder": {
"message": "Search by name or phone number",
"message": "نام یا فون نمبر کے ذریعہ تلاش کریں",
"description": "Placeholder to use when searching for contacts in the composer"
},
"noContactsFound": {
"message": "No contacts found",
"message": "کوئی رابطہ نہیں ملا",
"description": "Label shown when there are no contacts to compose to"
},
"noConversationsFound": {
"message": "No conversations found",
"message": "کوئی گفتگو نہیں ملی",
"description": "Label shown when there are no conversations to compose to"
},
"chooseGroupMembers__title": {
"message": "Choose members",
"message": "ممبروں کا انتخاب کریں",
"description": "The title for the 'choose group members' left pane screen"
},
"chooseGroupMembers__back-button": {
@ -2036,7 +2046,7 @@
"description": "Shown in the alert when you add the maximum number of group members"
},
"chooseGroupMembers__maximum-group-size__body": {
"message": "Signal groups can have a maximum of $max$ members.",
"message": "Signal گروپس میں زیادہ سے زیادہ $max$ ممبر ہوسکتے ہیں۔",
"description": "Shown in the alert when you add the maximum number of group members",
"placeholders": {
"max": {
@ -2050,7 +2060,7 @@
"description": "Shown in the alert when you add the maximum recommended number of group members"
},
"chooseGroupMembers__maximum-recommended-group-size__body": {
"message": "Signal groups perform best with $max$ members or less. Adding more members will cause delays sending and receiving messages.",
"message": "Signal گروپس $max$ ممبروں یا اس سے کم کے ساتھ بہترین کارکردگی کا مظاہرہ کرتے ہیں۔ مزید ممبروں کو شامل کرنے سے پیغامات بھیجنے اور وصول کرنے میں تاخیر ہوگی۔",
"description": "Shown in the alert when you add the maximum recommended number of group members",
"placeholders": {
"max": {
@ -2060,11 +2070,11 @@
}
},
"chooseGroupMembers__cant-add-member__title": {
"message": "Cant add member",
"message": "ممبر شامل نہیں کرسکتے ہیں",
"description": "Shown in the alert when you try to add someone who can't be added to a group"
},
"chooseGroupMembers__cant-add-member__body": {
"message": "\"$name$\" cant be added to the group because theyre using an old version of Signal. You can add them to the group after theyve updated Signal.",
"message": "\"$name$\" کو گروپ میں شامل نہیں کیا جاسکتا ہے کیونکہ وہ Signal کا پرانا ورژن استعمال کررہے ہیں۔ Signal کو اپ ڈیٹ کرنے کے بعد آپ انہیں گروپ میں شامل کرسکتے ہیں۔",
"description": "Shown in the alert when you try to add someone who can't be added to a group",
"placeholders": {
"max": {
@ -2078,7 +2088,7 @@
"description": "The title for the 'set group metadata' left pane screen"
},
"setGroupMetadata__back-button": {
"message": "Back to member selection",
"message": "ممبر کے انتخاب پر واپس جائیں",
"description": "Used as alt-text of the back button on the 'set group metadata' left pane screen"
},
"setGroupMetadata__group-name-placeholder": {
@ -2086,7 +2096,7 @@
"description": "The placeholder for the group name placeholder"
},
"setGroupMetadata__group-description-placeholder": {
"message": "Description",
"message": "تفصیل",
"description": "The placeholder for the group description"
},
"setGroupMetadata__create-group": {
@ -2098,7 +2108,7 @@
"description": "The header for the members list in the 'set group metadata' left pane screen"
},
"setGroupMetadata__error-message": {
"message": "This group couldnt be created. Check your connection and try again.",
"message": "یہ گروپ نہیں بنایا جاسکا۔ اپنا کنکشن چیک کریں اور دوبارہ کوشش کریں۔",
"description": "Shown in the modal when we can't create a group"
},
"updateGroupAttributes__title": {
@ -2106,7 +2116,7 @@
"description": "Shown in the modal when we want to update a group"
},
"updateGroupAttributes__error-message": {
"message": "Failed to update the group. Check your connection and try again.",
"message": "گروپ کو اپ ڈیٹ کرنے میں ناکام۔ اپنا کنکشن چیک کریں اور دوبارہ کوشش کریں۔",
"description": "Shown in the modal when we can't update a group"
},
"notSupportedSMS": {
@ -2554,7 +2564,7 @@
"description": "Shown in the shortcuts guide"
},
"Keyboard--new-conversation": {
"message": "Start new conversation",
"message": "نئی گفتگو شروع کریں",
"description": "Shown in the shortcuts guide"
},
"Keyboard--archive-conversation": {
@ -3434,19 +3444,19 @@
"description": "Title for hang up button"
},
"calling__SelectPresentingSourcesModal--title": {
"message": "Share your screen",
"message": "اپنی اسکرین کا اشتراک کریں",
"description": "Title for the select your screen sharing sources modal"
},
"calling__SelectPresentingSourcesModal--confirm": {
"message": "Share screen",
"message": "اسکرین کا اشتراک کریں",
"description": "Confirm button for sharing screen modal"
},
"calling__SelectPresentingSourcesModal--entireScreen": {
"message": "Entire screen",
"message": "پوری اسکرین",
"description": "Title for the select your screen sharing sources modal and 'Entire Screen' source"
},
"calling__SelectPresentingSourcesModal--screen": {
"message": "Screen $id$",
"message": "اسکرین $id$",
"description": "Title for `Screen #N` source in screen sharing sources modal and overlay",
"placeholders": {
"id": {
@ -3456,7 +3466,7 @@
}
},
"calling__SelectPresentingSourcesModal--window": {
"message": "A window",
"message": "ایک ونڈو",
"description": "Title for the select your screen sharing sources modal"
},
"callingDeviceSelection__label--video": {
@ -3488,7 +3498,7 @@
"description": "Label for muting the conversation"
},
"muteEightHours": {
"message": "Mute for eight hours",
"message": "آٹھ گھنٹے خاموش کرو",
"description": "Label for muting the conversation"
},
"muteDay": {
@ -3500,7 +3510,7 @@
"description": "Label for muting the conversation"
},
"muteAlways": {
"message": "Mute always",
"message": "ہمیشہ خاموش کرو",
"description": "Label for muting the conversation"
},
"unmute": {
@ -3508,7 +3518,7 @@
"description": "Label for unmuting the conversation"
},
"muteExpirationLabelAlways": {
"message": "Muted always",
"message": "ہمیشہ خاموش کیا ",
"description": "Shown in the mute notifications submenu whenever a conversation has been muted"
},
"muteExpirationLabel": {
@ -3542,15 +3552,15 @@
"description": "Shown if you click on a sgnl:// link not currently supported by Desktop"
},
"GroupV2--cannot-send": {
"message": "You cannot send messages to that group.",
"message": "آپ اس گروپ کو پیغامات نہیں بھیج سکتے۔",
"description": "Shown in toast when you attempt to forward a message to an announcement only group"
},
"GroupV2--add--missing-capability": {
"message": "These people cannot be added to the group until they upgrade Signal.",
"message": "جب تک وہ Signal کو اپ گریڈ نہیں کرتے ہیں ان لوگوں کو گروپ میں شامل نہیں کیا جاسکتا۔",
"description": "Shown in a confirmation dialog when members who cannot view announcement only group cannot be added"
},
"GroupV2--cannot-start-group-call": {
"message": "Only admins of the group can start a call.",
"message": "صرف گروپ کے ایڈمن کال شروع کرسکتے ہیں۔",
"description": "Shown in toast when a non-admin starts a group call in an announcements only group"
},
"GroupV2--join--invalid-link--title": {
@ -3650,7 +3660,7 @@
"description": "Shown if something went wrong when you try to join via a group link"
},
"GroupV2--join--general-join-failure": {
"message": "Couldn't join group. Try again later.",
"message": "گروپ میں شامل نہیں ہوسکے۔ بعد میں دوبارہ کوشش کریں۔",
"description": "Shown if something went wrong when you try to join via a group link"
},
"GroupV2--admin": {
@ -4694,7 +4704,7 @@
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--description--remove--other": {
"message": "$memberName$ removed the group description.",
"message": "$memberName$ نے گروپ کی تفصیل ہٹا دی۔",
"description": "Shown in timeline or conversation preview when v2 group changes",
"placeholders": {
"adminName": {
@ -4712,7 +4722,7 @@
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--description--change--other": {
"message": "$memberName$ changed the group description.",
"message": "$memberName$ نے گروپ کی تفصیل کو تبدیل کردیا۔",
"description": "Shown in timeline or conversation preview when v2 group changes",
"placeholders": {
"adminName": {
@ -4730,7 +4740,7 @@
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--admin--other": {
"message": "$memberName$ changed the group settings to only allow admins to send messages.",
"message": "$memberName$ نے گروپ کی ترتیبات کو تبدیل کیا تاکہ منتظمین کو صرف پیغامات بھیج سکیں۔",
"description": "Shown in timeline or conversation preview when v2 group changes",
"placeholders": {
"adminName": {
@ -4740,7 +4750,7 @@
}
},
"GroupV2--announcements--admin--unknown": {
"message": "The group was changed to only allow admins to send messages.",
"message": "گروپ کو صرف منتظمین کو پیغامات بھیجنے کی اجازت دینے کے لئے تبدیل کیا گیا تھا۔",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--member--you": {
@ -4748,7 +4758,7 @@
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV2--announcements--member--other": {
"message": "$memberName$ changed the group settings to allow all members to send messages.",
"message": "$memberName$ نے تمام ممبروں کو پیغامات بھیجنے کی اجازت دینے کے لئے گروپ کی ترتیبات کو تبدیل کیا۔",
"description": "Shown in timeline or conversation preview when v2 group changes",
"placeholders": {
"adminName": {
@ -4758,7 +4768,7 @@
}
},
"GroupV2--announcements--member--unknown": {
"message": "The group was changed to allow all members to send messages.",
"message": "گروپ کو تبدیل کیا گیا تاکہ تمام ممبروں کو پیغامات بھیج سکیں۔",
"description": "Shown in timeline or conversation preview when v2 group changes"
},
"GroupV1--Migration--disabled": {
@ -4896,15 +4906,15 @@
"description": "Aria label for file attachment button in composition area"
},
"CompositionArea--sms-only__title": {
"message": "This person isnt using Signal",
"message": "یہ شخص Signal استعمال نہیں کررہا ہے",
"description": "Title for the composition area for the SMS-only contact"
},
"CompositionArea--sms-only__body": {
"message": "Signal Desktop does not support messaging non-Signal contacts. Ask this person to install Signal for a more secure messaging experience.",
"message": "Signal Desktop پیغام رسانی غیر Signal رابطوں کی حمایت نہیں کرتا ہے۔ مزید محفوظ پیغام رسانی کے تجربے کے لئے اس شخص سے Signal انسٹال کرنے کو کہیں۔",
"description": "Body for the composition area for the SMS-only contact"
},
"CompositionArea--sms-only__spinner-label": {
"message": "Checking contact's registration status",
"message": "رابطے کی رجسٹریشن کی حیثیت کی جانچ ہو رہی ہے",
"description": "Displayed while checking if the contact is SMS-only"
},
"countMutedConversationsDescription": {
@ -4972,7 +4982,7 @@
"description": "This is the label for the 'who can edit the group' panel"
},
"ConversationDetails--group-info-info": {
"message": "Choose who can edit group name, photo, description, and disappearing messages timer.",
"message": "منتخب کریں کہ کون گروپ کے نام ، تصویر ، وضاحت اور غائب پیغامات کے ٹائمر میں ترمیم کرسکتا ہے۔",
"description": "This is the additional info for the 'who can edit the group' panel"
},
"ConversationDetails--add-members-label": {
@ -4984,11 +4994,11 @@
"description": "This is the additional info for the 'who can add members' panel"
},
"ConversationDetails--announcement-label": {
"message": "Who can send messages",
"message": "کون پیغامات بھیج سکتا ہے",
"description": "This is the additional info for the 'who can send messages' panel"
},
"ConversationDetails--announcement-info": {
"message": "Choose who can send messages to the group.",
"message": "منتخب کریں کہ کون گروپ کو پیغام بھیج سکتا ہے۔",
"description": "This is the additional info for the 'who can send mesages' panel"
},
"ConversationDetails--requests-and-invites": {
@ -5228,19 +5238,19 @@
"description": "Information shown below the invite list"
},
"AvatarInput--no-photo-label--group": {
"message": "Add a group photo",
"message": "ایک گروپ فوٹو شامل کریں",
"description": "The label for the avatar uploader when no group photo is selected"
},
"AvatarInput--no-photo-label--profile": {
"message": "Add a photo",
"message": "تصویر شامل کریں",
"description": "The label for the avatar uploader when no profile photo is selected"
},
"AvatarInput--change-photo-label": {
"message": "Change photo",
"message": "تصویر تبدیل کریں",
"description": "The label for the avatar uploader when a photo is selected"
},
"AvatarInput--upload-photo-choice": {
"message": "Upload photo",
"message": "تصویر اپلوڈ کریں",
"description": "The button text when you click on an uploaded avatar and want to upload a new one"
},
"AvatarInput--remove-photo-choice": {
@ -5248,7 +5258,7 @@
"description": "The button text when you click on an uploaded avatar and want to remove it"
},
"ContactPill--remove": {
"message": "Remove contact",
"message": "رابطہ ہٹا دیں",
"description": "The label for the 'remove' button on the contact pill"
},
"ComposeErrorDialog--close": {
@ -5256,11 +5266,11 @@
"description": "The text on the button when there's an error in the composer"
},
"NewlyCreatedGroupInvitedContactsDialog--title--one": {
"message": "Invitation sent",
"message": "دعوت نامہ بھیجا گیا",
"description": "When creating a new group and inviting users, this is shown in the dialog"
},
"NewlyCreatedGroupInvitedContactsDialog--title--many": {
"message": "$count$ invitations sent",
"message": "$count$ دعوت نامے بھیجے گئے",
"description": "When creating a new group and inviting users, this is shown in the dialog",
"placeholders": {
"count": {
@ -5270,7 +5280,7 @@
}
},
"NewlyCreatedGroupInvitedContactsDialog--body--user-paragraph--one": {
"message": "$name$ cant be automatically added to this group by you.",
"message": "$name$ آپ کے ذریعہ خود بخود اس گروپ میں شامل نہیں ہوسکتے ہیں۔",
"description": "When creating a new group and inviting users, this is shown in the dialog",
"placeholders": {
"name": {
@ -5280,11 +5290,11 @@
}
},
"NewlyCreatedGroupInvitedContactsDialog--body--user-paragraph--many": {
"message": "These users cant be automatically added to this group by you.",
"message": "یہ صارفین آپ کے ذریعہ خود بخود اس گروپ میں شامل نہیں ہوسکتے ہیں۔",
"description": "When creating a new group and inviting users, this is shown in the dialog"
},
"NewlyCreatedGroupInvitedContactsDialog--body--info-paragraph": {
"message": "Theyve been invited to join, and wont see any group messages until they accept.",
"message": "انہیں شرکت کے لئے مدعو کیا گیا ہے ، اور جب تک وہ قبول نہیں کریں گے کوئی گروپ پیغامات نہیں دیکھیں گے۔",
"description": "When creating a new group and inviting users, this is shown in the dialog"
},
"NewlyCreatedGroupInvitedContactsDialog--body--learn-more": {
@ -5300,7 +5310,7 @@
"description": "When adding new members to an existing group, this is shown in the dialog"
},
"AddGroupMembersModal--confirm-title--one": {
"message": "Add $person$ to \"$group$\"?",
"message": "$group$ میں $person$ شامل کریں؟",
"description": "When adding new members to an existing group, this is shown in the confirmation dialog",
"placeholders": {
"person": {
@ -5314,7 +5324,7 @@
}
},
"AddGroupMembersModal--confirm-title--many": {
"message": "Add $count$ members to \"$group$\"?",
"message": "$group$ میں $count$ ممبران شامل کریں؟",
"description": "When adding new members to an existing group, this is shown in the confirmation dialog",
"placeholders": {
"count": {
@ -5328,7 +5338,7 @@
}
},
"AddGroupMembersModal--confirm-button--one": {
"message": "Add member",
"message": "ممبر شامل کریں",
"description": "When adding new members to an existing group, this is shown on the confirmation dialog button"
},
"AddGroupMembersModal--confirm-button--many": {
@ -5340,15 +5350,15 @@
"description": "The text of the button to create new groups"
},
"selectContact": {
"message": "Select contact",
"message": "رابطہ منتخب کریں",
"description": "The label for contact checkboxes that are non-selected (clicking them should select the contact)"
},
"deselectContact": {
"message": "De-select contact",
"message": "رابطہ غیر منتخب کریں",
"description": "The label for contact checkboxes that are selected (clicking them should de-select the contact)"
},
"cannotSelectContact": {
"message": "Cannot select contact",
"message": "رابطہ منتخب نہیں کیا جاسکتا",
"description": "The label for contact checkboxes that are disabled"
},
"alreadyAMember": {
@ -5356,27 +5366,27 @@
"description": "The label for contact checkboxes that are disabled because they're already a member"
},
"MessageAudio--play": {
"message": "Play audio attachment",
"message": "منسلک آڈیو چلائیں",
"description": "Aria label for audio attachment's Play button"
},
"MessageAudio--pause": {
"message": "Pause audio attachment",
"message": "منسلک آڈیو کو روکیں",
"description": "Aria label for audio attachment's Pause button"
},
"MessageAudio--download": {
"message": "Download audio attachment",
"message": "منسلک آڈیو ڈاؤن لوڈ کریں",
"description": "Aria label for audio attachment's Download button"
},
"MessageAudio--pending": {
"message": "Downloading audio attachment...",
"message": "منسلک آڈیو ڈاؤن لوڈ کیا جا رہا ہے…",
"description": "Aria label for pending audio attachment spinner"
},
"MessageAudio--slider": {
"message": "Playback time of audio attachment",
"message": "منسلک آڈیو کے پلے بیک وقت",
"description": "Aria label for audio attachment's playback time slider"
},
"emptyInboxMessage": {
"message": "Click the $composeIcon$ above and search for your contacts or groups to message.",
"message": "مذکورہ $composeIcon$ پر کلک کریں اور پیغام دینے کیلئے اپنے رابطوں یا گروپس کو تلاش کریں۔",
"description": "Shown in the left-pane when the inbox is empty",
"placeholders": {
"composeIcon": {
@ -5386,7 +5396,7 @@
}
},
"composeIcon": {
"message": "compose button",
"message": "compose بٹن",
"description": "Shown in the left-pane when the inbox is empty. Describes the button that composes a new message."
},
"ForwardMessageModal--continue": {
@ -5406,7 +5416,7 @@
"description": "Shown in the message request warning dialog. Clicking this button will open a page on Signal's support site"
},
"ContactSpoofing__same-name": {
"message": "Review requests carefully. Signal found another contact with the same name. $link$",
"message": "درخواستوں کا بغور جائزہ لیں۔ Signal کو اسی نام سے دوسرا رابطہ ملا۔ $link$",
"description": "Shown in the timeline warning when you have a message request from someone with the same name as someone else",
"placeholders": {
"link": {
@ -5416,7 +5426,7 @@
}
},
"ContactSpoofing__same-name-in-group": {
"message": "$count$ group members have the same name. $link$",
"message": "گروپ کے $count$ ممبران کا ایک ہی نام ہے۔ $link$",
"description": "Shown in the timeline warning when you multiple group members have the same name",
"placeholders": {
"count": {
@ -5430,15 +5440,15 @@
}
},
"ContactSpoofing__same-name__link": {
"message": "Review request",
"message": "نظرثانی کی درخواست",
"description": "Shown in the timeline warning when you have a message request from someone with the same name as someone else"
},
"ContactSpoofing__same-name-in-group__link": {
"message": "Click to review",
"message": "جائزہ لینے کے لئے کلک کریں",
"description": "Shown in the timeline warning when you multiple group members have the same name"
},
"ContactSpoofingReviewDialog__title": {
"message": "Review request",
"message": "نظرثانی کی درخواست",
"description": "Title for the contact name spoofing review dialog"
},
"ContactSpoofingReviewDialog__description": {
@ -5454,11 +5464,11 @@
"description": "Header in the contact spoofing review dialog, shown above the \"safe\" user"
},
"ContactSpoofingReviewDialog__group__title": {
"message": "Review members",
"message": "ممبران کا جائزہ لیں",
"description": "Title for the contact name spoofing review dialog in groups"
},
"ContactSpoofingReviewDialog__group__description": {
"message": "$count$ group members have similar names. Review the members below or choose to take action.",
"message": "گروپ کے $count$ ممبران کے نام ایک جیسے ہیں۔ ذیل کے ممبران کا جائزہ لیں یا کارروائی کرنے کا انتخاب کریں۔",
"description": "Description for the group contact spoofing review dialog"
},
"ContactSpoofingReviewDialog__group__members-header": {
@ -5466,7 +5476,7 @@
"description": "Header in the group contact spoofing review dialog. After this header, there will be a list of members"
},
"ContactSpoofingReviewDialog__group__name-change-info": {
"message": "Recently changed their profile name from $oldName$ to $newName$",
"message": "حال ہی میں ان کے پروفائل کا نام $oldName$ سے تبدیل کرکے $newName$ کردیا گیا ہے",
"description": "In the group contact spoofing review dialog, this text is shown when someone has changed their name recently",
"placeholders": {
"oldName": {
@ -5484,7 +5494,7 @@
"description": "When confirming the removal of a group member, show this text in the button"
},
"RemoveGroupMemberConfirmation__description": {
"message": "Remove \"$name$\" from the group?",
"message": "\"$name$\" کو گروپ سے ہٹائیں؟",
"description": "When confirming the removal of a group member, show this text in the dialog",
"placeholders": {
"name": {
@ -5506,27 +5516,27 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Continue Without Verifying?",
"message": "بغیر تصدیق کیے جاری رکھیں؟",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {
"message": "If you choose to skip verification, you may miss messages from other people and your messages may fail to send.",
"message": "اگر آپ تصدیق کو چھوڑنا چاہتے ہیں تو ، آپ دوسرے لوگوں کے پیغامات چھو سکتے ہیں اور آپ کے پیغامات بھیجنے میں ناکام ہو سکتے ہیں۔",
"description": "Body of the captcha dialog that can be closed"
},
"CaptchaDialog--can_close__skip-verification": {
"message": "Skip verification",
"message": "تصدیق چھوڑ دیں",
"description": "Skip button of the captcha dialog that can be closed"
},
"verificationComplete": {
"message": "Verification complete.",
"message": "توثیق مکمل۔",
"description": "Displayed after successful captcha"
},
"verificationFailed": {
"message": "Verification failed. Please retry later.",
"message": "توثیق ناکام ہوگئی۔ براہ کرم بعد میں دوبارہ کوشش کریں۔",
"description": "Displayed after unsuccessful captcha"
},
"deleteForEveryoneFailed": {
"message": "Failed to delete message for everyone. Please retry later.",
"message": "سب کے لئے پیغام حذف کرنے میں ناکام۔ براہ کرم بعد میں دوبارہ کوشش کریں۔",
"description": "Displayed when delete-for-everyone has failed to send to all recepients"
},
"ChatColorPicker__delete--title": {
@ -5534,7 +5544,7 @@
"description": "Confirm title for deleting custom color"
},
"ChatColorPicker__delete--message": {
"message": "This custom color is used in $num$ chats. Do you want to delete it for all chats?",
"message": "یہ کسٹم رنگ $num$ چیٹس میں استعمال ہوتا ہے۔ کیا آپ اسے تمام چیٹس کیلئے حذف کرنا چاہتے ہیں؟",
"description": "Confirm message for deleting custom color",
"placeholders": {
"num": {
@ -5544,7 +5554,7 @@
}
},
"ChatColorPicker__global-chat-color": {
"message": "Global Chat Color",
"message": "گلوبل چیٹ کا رنگ",
"description": "Modal title for the chat color picker and editor for all conversations"
},
"ChatColorPicker__menu-title": {
@ -5556,15 +5566,15 @@
"description": "Button label for resetting chat colors"
},
"ChatColorPicker__resetDefault": {
"message": "Reset Chat Colors",
"message": "چیٹ کے رنگوں کو دوبارہ ترتیب دیں",
"description": "Confirmation dialog title for resetting all chat colors or only the global default one"
},
"ChatColorPicker__resetAll": {
"message": "Reset all chat colors",
"message": "چیٹ کے تمام رنگوں کو دوبارہ ترتیب دیں",
"description": "Button label for resetting all chat colors"
},
"ChatColorPicker__confirm-reset-default": {
"message": "Reset default",
"message": "ڈیفالٹ کو دوبارہ ترتیب دیں",
"description": "Button label for resetting only global chat color"
},
"ChatColorPicker__confirm-reset": {
@ -5576,7 +5586,7 @@
"description": "Modal message text for confirming resetting of chat colors"
},
"ChatColorPicker__custom-color--label": {
"message": "Show custom color editor",
"message": "کسٹم کلر ایڈیٹر دکھائیں",
"description": "aria-label for custom color editor button"
},
"ChatColorPicker__sampleBubble1": {
@ -5584,7 +5594,7 @@
"description": "An example message bubble for selecting the chat color"
},
"ChatColorPicker__sampleBubble2": {
"message": "Another bubble.",
"message": "ایک اور بلبلا۔",
"description": "An example message bubble for selecting the chat color"
},
"ChatColorPicker__sampleBubble3": {
@ -5624,7 +5634,7 @@
"description": "Modal title for the custom color editor"
},
"customDisappearingTimeOption": {
"message": "Custom time...",
"message": "کسٹم ٹائم ...",
"description": "Text for an option in Disappearing Messages menu and Conversation Details Disappearing Messages setting when no user value is available"
},
"selectedCustomDisappearingTimeOption": {
@ -5636,7 +5646,7 @@
"description": "Title for the custom disappearing message timeout dialog"
},
"DisappearingTimeDialog__body": {
"message": "Choose a custom time for disappearing messages.",
"message": "میسجز کو غائب کرنے کے لئے کسٹم ٹائم کا انتخاب کریں۔",
"description": "Body for the custom disappearing message timeout dialog"
},
"DisappearingTimeDialog__set": {
@ -5644,23 +5654,23 @@
"description": "Text for the dialog button confirming the custom disappearing message timeout"
},
"DisappearingTimeDialog__seconds": {
"message": "Seconds",
"message": "سیکنڈز",
"description": "Name of the 'seconds' unit select for the custom disappearing message timeout dialog"
},
"DisappearingTimeDialog__minutes": {
"message": "Minutes",
"message": "منٹٹس",
"description": "Name of the 'minutes' unit select for the custom disappearing message timeout dialog"
},
"DisappearingTimeDialog__hours": {
"message": "Hours",
"message": "گھنٹے",
"description": "Name of the 'hours' unit select for the custom disappearing message timeout dialog"
},
"DisappearingTimeDialog__days": {
"message": "Days",
"message": "دن",
"description": "Name of the 'days' unit select for the custom disappearing message timeout dialog"
},
"DisappearingTimeDialog__weeks": {
"message": "Weeks",
"message": "ہفتے",
"description": "Name of the 'weeks' unit select for the custom disappearing message timeout dialog"
},
"settings__DisappearingMessages__footer": {
@ -5672,7 +5682,7 @@
"description": "Label for the Disapearring Messages default timer setting"
},
"UniversalTimerNotification__text": {
"message": "The disappearing message time will be set to $timeValue$ when you message them.",
"message": "جب آپ انہیں پیغام دیں گے تو غائب ہونے والے پیغام کا وقت $timeValue$ پر مقرر کیا جائے گا۔",
"description": "A message displayed when default disappearing message timeout is about to be applied",
"placeholders": {
"timeValue": {
@ -5682,7 +5692,7 @@
}
},
"GroupDescription__read-more": {
"message": "read more",
"message": "مزید پڑھ",
"description": "Button text when the group description is too long"
},
"EditConversationAttributesModal__description-warning": {
@ -5694,11 +5704,11 @@
"description": "Placeholder text in the details header for those that can edit the group description"
},
"MediaQualitySelector--button": {
"message": "Select media quality",
"message": "میڈیا کے معیار کو منتخب کریں",
"description": "aria-label for the media quality selector button"
},
"MediaQualitySelector--title": {
"message": "Media Quality",
"message": "میڈیا کا معیار",
"description": "Popup selector title"
},
"MediaQualitySelector--standard-quality-title": {
@ -5746,7 +5756,7 @@
"description": "Default text for about field"
},
"ProfileEditor--about-placeholder": {
"message": "Write something about yourself...",
"message": "اپنے بارے میں کچھ لکھیں...",
"description": "Placeholder text for about input field"
},
"ProfileEditor--first-name": {
@ -5762,7 +5772,7 @@
"description": "ConfirmationDialog text for discarding changes"
},
"ProfileEditor--info": {
"message": "Your profile is encrypted. Your profile and changes to it will be visible to your contacts and when you start or accept new chats. $learnMore$",
"message": "آپ کا پروفائل خفیہ شدہ ہے۔ آپ کا پروفائل اور اس میں ہونے والی تبدیلیاں آپ کے رابطوں پر مرئی ہوں گی اور جب آپ نیا چیٹ شروع کریں گے یا قبول کریں گے۔$learnMore$",
"description": "Information shown at the bottom of the profile editor section",
"placeholders": {
"learnMore": {
@ -5808,15 +5818,15 @@
"description": "Title for about editing"
},
"ProfileEditorModal--error": {
"message": "Your profile could not be updated. Please try again.",
"message": "آپ کے پروفائل کو اپ ڈیٹ نہیں کیا جاسکا۔ دوبارہ کوشش کریں.",
"description": "Error message when something goes wrong updating your profile."
},
"AnnouncementsOnlyGroupBanner--modal": {
"message": "Message an admin",
"message": "کسی ایڈمن کو پیغام دیں",
"description": "Modal title for the list of admins in a group"
},
"AnnouncementsOnlyGroupBanner--announcements-only": {
"message": "Only $admins$ can send messages",
"message": "صرف $admins$ ہی پیغامات بھیج سکتا ہے",
"description": "Displayed if sending of messages is disabled to non-admins",
"placeholders": {
"admins": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "Một tin nhắn, nhãn dán, phản ứng, nhãn đã đọc hoặc đa phương tiện không thể được gửi đến bạn từ $sender$. Họ có thể đã cố gửi cho bạn trực tiếp, hoặc trong một nhóm.",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "Tiếp tục mà Không Xác minh?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "无法将来自 $sender$ 的消息、贴纸、反应、已读回执或媒体发送给您。它们可能是直接发送或在群组中发送。",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "A message, sticker, reaction, read receipt or media couldnt be delivered to you from $sender$ in this chat.",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "是否继续且不验证?",
"message": "Continue without verifying?",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -1175,7 +1175,17 @@
},
"DeliveryIssue--summary": {
"message": "無法從 $sender$向你傳送訊息、貼圖、回應、已讀回執或媒體。 他們可能已經嘗試將其直接傳送給你,或以群組形式傳送給你。",
"description": "Shown on explainer dialog available from delivery issue timeline events",
"description": "Shown on explainer dialog available from delivery issue timeline events in 1:1 conversations",
"placeholders": {
"name": {
"content": "$1",
"example": "Alice"
}
}
},
"DeliveryIssue--summary--group": {
"message": "無法從$sender$聊天中向你傳送訊息、貼圖、回應、已讀回執或媒體檔。",
"description": "Shown on explainer dialog available from delivery issue timeline events in groups",
"placeholders": {
"name": {
"content": "$1",
@ -5506,7 +5516,7 @@
"description": "First paragraph in the captcha dialog"
},
"CaptchaDialog--can-close__title": {
"message": "繼續而不驗證?",
"message": "不驗證繼續",
"description": "Header in the captcha dialog that can be closed"
},
"CaptchaDialog--can-close__body": {

View File

@ -3,26 +3,7 @@
# Copyright 2017-2021 Signal Messenger, LLC
# SPDX-License-Identifier: AGPL-3.0-only
# Setup - creates the local repo which will be mirrored up to S3, then back-fill it. Your
# future deploys will eliminate all old versions without these backfill steps:
# aptly repo create signal-desktop
# aptly mirror create -ignore-signatures backfill-mirror https://updates.signal.org/desktop/apt xenial
# aptly mirror update -ignore-signatures backfill-mirror
# aptly repo import backfill-mirror signal-desktop signal-desktop signal-desktop-beta
# aptly repo show -with-packages signal-desktop
#
# First run on a machine - uncomment the first set of 'aptly publish snapshot' commands,
# comment the other two. Sets up the two publish channels, one local, one to S3.
#
# Testing - comment out the lines with s3:$ENDPOINT to publish only locally. To eliminate
# effects of testing, remove package from repo, then move back to old snapshot:
# aptly repo remove signal-desktop signal-desktop_1.0.35_amd64
# aptly publish switch -gpg-key=57F6FB06 xenial signal-desktop_v1.0.34
#
# Pruning package set - we generally want 2-3 versions of each stream available,
# production and beta. You can remove old packages like this:
# aptly repo show -with-packages signal-desktop
# aptly repo remove signal-desktop signal-desktop_1.0.34_amd64
# First run on a machine - uncomment the two 'first run' sections below, comment out the 'later runs' section.
#
# Release:
# NAME=signal-desktop(-beta) VERSION=X.X.X ./aptly.sh
@ -31,30 +12,47 @@ set -e
set -u
set -o pipefail
echo "Releasing $NAME build version $VERSION"
echo
echo "aptly.sh: Releasing $NAME build version $VERSION"
REPO=signal-desktop
CURRENT=xenial
# PREVIOUS=xenial
ENDPOINT=signal-desktop-apt # Matches endpoint name in .aptly.conf
SNAPSHOT="signal-desktop_v$VERSION"
GPG_KEYID=57F6FB06
# FIRST RUN
# echo
# echo "aptly.sh: Setting up repo and mirror"
# aptly repo create signal-desktop
# aptly mirror create -ignore-signatures backfill-mirror https://updates.signal.org/desktop/apt xenial
echo
echo "aptly.sh: Fetching latest released files so we don't erase anything"
aptly mirror update -ignore-signatures backfill-mirror
aptly repo import backfill-mirror signal-desktop signal-desktop signal-desktop-beta
echo
echo "aptly.sh: Adding newly-built deb to repo"
aptly repo add "$REPO" release/"$NAME"_"$VERSION"_*.deb
echo
echo "aptly.sh: Creating a snapshot from the current state of the repo"
aptly snapshot create "$SNAPSHOT" from repo "$REPO"
# run these only on first release to a given repo from a given machine. the first set is
# for local testing, the second set is to set up the production server.
# https://www.aptly.info/doc/aptly/publish/snapshot/
# FIRST RUN - https://www.aptly.info/doc/aptly/publish/snapshot/
# echo
# echo "aptly.sh: Setting up local publish with current snapshot"
# aptly publish snapshot -gpg-key="$GPG_KEYID" -distribution="$CURRENT" "$SNAPSHOT"
# aptly publish snapshot -gpg-key="$GPG_KEYID" -distribution="$PREVIOUS" "$SNAPSHOT"
# aptly publish snapshot -gpg-key="$GPG_KEYID" -distribution="$CURRENT" -config=.aptly.conf "$SNAPSHOT" "s3:$ENDPOINT:"
# aptly publish snapshot -gpg-key="$GPG_KEYID" -distribution="$PREVIOUS" -config=.aptly.conf "$SNAPSHOT" "s3:$ENDPOINT:"
# these update already-published repos, run every time after that
# https://www.aptly.info/doc/aptly/publish/switch/
# LATER RUNS - https://www.aptly.info/doc/aptly/publish/switch/
echo
echo "aptly.sh: Switching local publish to current snapshot"
aptly publish switch -gpg-key="$GPG_KEYID" "$CURRENT" "$SNAPSHOT"
# aptly publish switch -gpg-key="$GPG_KEYID" "$PREVIOUS" "$SNAPSHOT"
aptly publish switch -gpg-key="$GPG_KEYID" -config=.aptly.conf "$CURRENT" "s3:$ENDPOINT:" "$SNAPSHOT"
# aptly publish switch -gpg-key="$GPG_KEYID" -config=.aptly.conf "$PREVIOUS" "s3:$ENDPOINT:" "$SNAPSHOT"
echo
echo "aptly.sh: Syncing local publish to s3"
/usr/bin/aws s3 sync ~/.aptly/public/pool/ s3://updates.signal.org/desktop/apt/pool/
/usr/bin/aws s3 sync ~/.aptly/public/dists/ s3://updates.signal.org/desktop/apt/dists/
echo
echo "aptly.sh: Complete!"

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.12.0-beta.1",
"version": "5.12.2",
"license": "AGPL-3.0-only",
"author": {
"name": "Open Whisper Systems",

View File

@ -10084,9 +10084,20 @@ $contact-modal-padding: 18px;
padding: 3px;
}
.module-delivery-issue-dialog__button {
}
.module-delivery-issue-dialog__learn-more-button {
@include button-reset;
@include button-secondary;
@include font-body-1-bold;
border-radius: 4px;
padding: 7px 14px;
}
.module-delivery-issue-dialog__close-button {
@include button-reset;
@include button-primary;
@include font-body-1-bold;
border-radius: 4px;
padding: 7px 14px;

View File

@ -967,13 +967,17 @@ export class SignalProtocolStore extends EventsMixin {
conversationIds.has(session.fromDB.conversationId)
);
const openEntries: Array<
SessionCacheEntry | undefined
| undefined
| {
entry: SessionCacheEntry;
record: SessionRecord;
}
> = await Promise.all(
entries.map(async entry => {
if (entry.hydrated) {
const record = entry.item;
if (record.hasCurrentState()) {
return entry;
return { record, entry };
}
return undefined;
@ -981,7 +985,7 @@ export class SignalProtocolStore extends EventsMixin {
const record = await this._maybeMigrateSession(entry.fromDB);
if (record.hasCurrentState()) {
return entry;
return { record, entry };
}
return undefined;
@ -989,10 +993,11 @@ export class SignalProtocolStore extends EventsMixin {
);
const devices = openEntries
.map(entry => {
if (!entry) {
.map(item => {
if (!item) {
return undefined;
}
const { entry, record } = item;
const { conversationId } = entry.fromDB;
conversationIds.delete(conversationId);
@ -1015,9 +1020,12 @@ export class SignalProtocolStore extends EventsMixin {
);
}
const registrationId = record.remoteRegistrationId();
return {
identifier,
id,
registrationId,
};
})
.filter(isNotNil);

View File

@ -142,13 +142,6 @@ export async function startApp(): Promise<void> {
);
window.textsecure.server = server;
window.textsecure.storage.user.on('credentialsChange', async () => {
strictAssert(server !== undefined, 'WebAPI not ready');
await server.authenticate(
window.textsecure.storage.user.getWebAPICredentials()
);
});
initializeAllJobQueues({
server,
});
@ -320,7 +313,7 @@ export async function startApp(): Promise<void> {
{
name: 'Whisper.deliveryReceiptBatcher',
wait: 500,
maxSize: 500,
maxSize: 100,
processBatch: async items => {
const byConversationId = window._.groupBy(items, item =>
window.ConversationController.ensureContactIds({
@ -1906,6 +1899,11 @@ export async function startApp(): Promise<void> {
window.log.info('listening for registration events');
window.Whisper.events.on('registration_done', () => {
window.log.info('handling registration event');
strictAssert(server !== undefined, 'WebAPI not ready');
server.authenticate(
window.textsecure.storage.user.getWebAPICredentials()
);
connect(true);
});
@ -2296,6 +2294,10 @@ export async function startApp(): Promise<void> {
'private'
);
me.updateUuid(uuid);
await server.authenticate(
window.textsecure.storage.user.getWebAPICredentials()
);
} catch (error) {
window.log.error(
'Error: Unable to retrieve UUID from service.',
@ -2503,7 +2505,7 @@ export async function startApp(): Promise<void> {
window.reduxActions.app.initialLoadComplete();
window.logAppLoadedEvent({
window.logAppLoadedEvent?.({
processedCount: messageReceiver && messageReceiver.getProcessedCount(),
});
if (messageReceiver) {

View File

@ -23,7 +23,6 @@ export type Props = {
} & AvatarProps;
export const AvatarPopup = (props: Props): JSX.Element => {
const focusRef = React.useRef<HTMLButtonElement>(null);
const {
i18n,
name,
@ -42,7 +41,7 @@ export const AvatarPopup = (props: Props): JSX.Element => {
// Note: mechanisms to dismiss this view are all in its host, MainHeader
// Focus first button after initial render, restore focus on teardown
useRestoreFocus(focusRef);
const [focusRef] = useRestoreFocus();
return (
<div style={style} className="module-avatar-popup">

View File

@ -39,6 +39,7 @@ export function CaptchaDialog(props: Readonly<PropsType>): JSX.Element {
moduleClassName="module-Modal"
i18n={i18n}
title={i18n('CaptchaDialog--can-close__title')}
onClose={() => setIsClosing(false)}
>
<section>
<p>{i18n('CaptchaDialog--can-close__body')}</p>

View File

@ -29,6 +29,7 @@ export const NeedsScreenRecordingPermissionsModal = ({
i18n={i18n}
title={i18n('calling__presenting--permission-title')}
theme={Theme.Dark}
onClose={toggleScreenRecordingPermissionsDialog}
>
<p>{i18n('calling__presenting--macos-permission-description')}</p>
<ol style={{ paddingLeft: 16 }}>

View File

@ -54,7 +54,7 @@ export const SafetyNumberChangeDialog = ({
if (selectedContact) {
return (
<Modal i18n={i18n}>
<Modal i18n={i18n} onClose={onClose}>
{renderSafetyNumber({ contactID: selectedContact.id, onClose })}
</Modal>
);

View File

@ -205,12 +205,11 @@ const CALLING_SHORTCUTS: Array<ShortcutType> = [
];
export const ShortcutGuide = (props: Props): JSX.Element => {
const focusRef = React.useRef<HTMLDivElement>(null);
const { i18n, close, hasInstalledStickers, platform } = props;
const isMacOS = platform === 'darwin';
// Restore focus on teardown
useRestoreFocus(focusRef);
const [focusRef] = useRestoreFocus();
return (
<div className="module-shortcut-guide">

View File

@ -6,6 +6,8 @@ import classNames from 'classnames';
import { Modal } from '../Modal';
import { useRestoreFocus } from '../../util/hooks';
import { LocalizerType } from '../../types/Util';
export type PropsType = {
@ -19,8 +21,11 @@ export function ChatSessionRefreshedDialog(
): React.ReactElement {
const { i18n, contactSupport, onClose } = props;
// Focus first button after initial render, restore focus on teardown
const [focusRef] = useRestoreFocus();
return (
<Modal hasXButton={false} i18n={i18n}>
<Modal hasXButton={false} onClose={onClose} i18n={i18n}>
<div className="module-chat-session-refreshed-dialog">
<div className="module-chat-session-refreshed-dialog__image">
<img
@ -50,6 +55,7 @@ export function ChatSessionRefreshedDialog(
<button
type="button"
onClick={onClose}
ref={focusRef}
className="module-chat-session-refreshed-dialog__button"
>
{i18n('Confirmation--confirm')}

View File

@ -21,6 +21,7 @@ storiesOf('Components/Conversation/DeliveryIssueDialog', module).add(
i18n={i18n}
sender={sender}
inGroup={false}
learnMoreAboutDeliveryIssue={action('learnMoreAboutDeliveryIssue')}
onClose={action('onClose')}
/>
);
@ -35,6 +36,7 @@ storiesOf('Components/Conversation/DeliveryIssueDialog', module).add(
i18n={i18n}
sender={sender}
inGroup
learnMoreAboutDeliveryIssue={action('learnMoreAboutDeliveryIssue')}
onClose={action('onClose')}
/>
);

View File

@ -8,24 +8,30 @@ import { Modal } from '../Modal';
import { Intl } from '../Intl';
import { Emojify } from './Emojify';
import { useRestoreFocus } from '../../util/hooks';
import { LocalizerType } from '../../types/Util';
export type PropsType = {
i18n: LocalizerType;
sender: ConversationType;
inGroup: boolean;
learnMoreAboutDeliveryIssue: () => unknown;
onClose: () => unknown;
};
export function DeliveryIssueDialog(props: PropsType): React.ReactElement {
const { i18n, inGroup, sender, onClose } = props;
const { i18n, inGroup, learnMoreAboutDeliveryIssue, sender, onClose } = props;
const key = inGroup
? 'DeliveryIssue--summary--group'
: 'DeliveryIssue--summary';
// Focus first button after initial render, restore focus on teardown
const [focusRef] = useRestoreFocus();
return (
<Modal hasXButton={false} i18n={i18n}>
<Modal hasXButton={false} onClose={onClose} i18n={i18n}>
<div className="module-delivery-issue-dialog">
<div className="module-delivery-issue-dialog__image">
<img
@ -48,10 +54,18 @@ export function DeliveryIssueDialog(props: PropsType): React.ReactElement {
/>
</div>
<div className="module-delivery-issue-dialog__buttons">
<button
type="button"
onClick={learnMoreAboutDeliveryIssue}
className="module-delivery-issue-dialog__learn-more-button"
>
{i18n('DeliveryIssue--learnMore')}
</button>
<button
type="button"
onClick={onClose}
className="module-delivery-issue-dialog__button"
ref={focusRef}
className="module-delivery-issue-dialog__close-button"
>
{i18n('Confirmation--confirm')}
</button>

View File

@ -6,6 +6,7 @@
import * as React from 'react';
import { storiesOf } from '@storybook/react';
import { action } from '@storybook/addon-actions';
import { setup as setupI18n } from '../../../js/modules/i18n';
import enMessages from '../../../_locales/en/messages.json';
@ -19,7 +20,12 @@ storiesOf('Components/Conversation/DeliveryIssueNotification', module).add(
'Default',
() => {
return (
<DeliveryIssueNotification i18n={i18n} inGroup={false} sender={sender} />
<DeliveryIssueNotification
i18n={i18n}
inGroup={false}
learnMoreAboutDeliveryIssue={action('learnMoreAboutDeliveryIssue')}
sender={sender}
/>
);
}
);
@ -27,6 +33,13 @@ storiesOf('Components/Conversation/DeliveryIssueNotification', module).add(
storiesOf('Components/Conversation/DeliveryIssueNotification', module).add(
'In Group',
() => {
return <DeliveryIssueNotification i18n={i18n} inGroup sender={sender} />;
return (
<DeliveryIssueNotification
i18n={i18n}
inGroup
learnMoreAboutDeliveryIssue={action('learnMoreAboutDeliveryIssue')}
sender={sender}
/>
);
}
);

View File

@ -15,16 +15,22 @@ export type PropsDataType = {
inGroup: boolean;
};
export type PropsActionsType = {
learnMoreAboutDeliveryIssue: () => unknown;
};
type PropsHousekeepingType = {
i18n: LocalizerType;
};
export type PropsType = PropsDataType & PropsHousekeepingType;
export type PropsType = PropsDataType &
PropsActionsType &
PropsHousekeepingType;
export function DeliveryIssueNotification(
props: PropsType
): ReactElement | null {
const { i18n, inGroup, sender } = props;
const { i18n, inGroup, sender, learnMoreAboutDeliveryIssue } = props;
const [isDialogOpen, setIsDialogOpen] = useState<boolean>(false);
const openDialog = useCallback(() => {
@ -61,6 +67,7 @@ export function DeliveryIssueNotification(
<DeliveryIssueDialog
i18n={i18n}
inGroup={inGroup}
learnMoreAboutDeliveryIssue={learnMoreAboutDeliveryIssue}
sender={sender}
onClose={closeDialog}
/>

View File

@ -40,7 +40,6 @@ export const ReactionPicker = React.forwardRef<HTMLDivElement, Props>(
ref
) => {
const [pickingOther, setPickingOther] = React.useState(false);
const focusRef = React.useRef<HTMLButtonElement>(null);
// Handle escape key
React.useEffect(() => {
@ -70,7 +69,7 @@ export const ReactionPicker = React.forwardRef<HTMLDivElement, Props>(
);
// Focus first button and restore focus on unmount
useRestoreFocus(focusRef);
const [focusRef] = useRestoreFocus();
const otherSelected = selected && !emojis.includes(selected);

View File

@ -124,8 +124,6 @@ export const ReactionViewer = React.forwardRef<HTMLDivElement, Props>(
selectedReactionCategory,
setSelectedReactionCategory,
] = React.useState(pickedReaction || 'all');
const focusRef = React.useRef<HTMLButtonElement>(null);
// Handle escape key
React.useEffect(() => {
const handler = (e: KeyboardEvent) => {
@ -142,7 +140,7 @@ export const ReactionViewer = React.forwardRef<HTMLDivElement, Props>(
}, [onClose]);
// Focus first button and restore focus on unmount
useRestoreFocus(focusRef);
const [focusRef] = useRestoreFocus();
// If we have previously selected a reaction type that is no longer present
// (removed on another device, for instance) we should select another

View File

@ -304,6 +304,7 @@ const actions = () => ({
),
setLoadCountdownStart: action('setLoadCountdownStart'),
setIsNearBottom: action('setIsNearBottom'),
learnMoreAboutDeliveryIssue: action('learnMoreAboutDeliveryIssue'),
loadAndScroll: action('loadAndScroll'),
loadOlderMessages: action('loadOlderMessages'),
loadNewerMessages: action('loadNewerMessages'),

View File

@ -135,6 +135,7 @@ type PropsActionsType = {
}>
) => void;
learnMoreAboutDeliveryIssue: () => unknown;
loadAndScroll: (messageId: string) => unknown;
loadOlderMessages: (messageId: string) => unknown;
loadNewerMessages: (messageId: string) => unknown;

View File

@ -55,6 +55,7 @@ const getDefaultProps = () => ({
deleteMessage: action('deleteMessage'),
deleteMessageForEveryone: action('deleteMessageForEveryone'),
kickOffAttachmentDownload: action('kickOffAttachmentDownload'),
learnMoreAboutDeliveryIssue: action('learnMoreAboutDeliveryIssue'),
markAttachmentAsCorrupted: action('markAttachmentAsCorrupted'),
showMessageDetail: action('showMessageDetail'),
openConversation: action('openConversation'),

View File

@ -21,6 +21,7 @@ import {
} from './ChatSessionRefreshedNotification';
import {
DeliveryIssueNotification,
PropsActionsType as DeliveryIssueActionProps,
PropsDataType as DeliveryIssueProps,
} from './DeliveryIssueNotification';
import { CallingNotificationType } from '../../util/callingNotification';
@ -156,6 +157,7 @@ type PropsLocalType = {
type PropsActionsType = MessageActionsType &
CallingNotificationActionsType &
DeliveryIssueActionProps &
PropsChatSessionRefreshedActionsType &
UnsupportedMessageActionsType &
SafetyNumberActionsType;
@ -226,7 +228,9 @@ export class TimelineItem extends React.PureComponent<PropsType> {
/>
);
} else if (item.type === 'deliveryIssue') {
notification = <DeliveryIssueNotification {...item.data} i18n={i18n} />;
notification = (
<DeliveryIssueNotification {...item.data} {...this.props} i18n={i18n} />
);
} else if (item.type === 'linkNotification') {
notification = (
<div className="module-message-unsynced">

View File

@ -70,7 +70,6 @@ export const StickerPicker = React.memo(
}: Props,
ref
) => {
const focusRef = React.useRef<HTMLButtonElement>(null);
const tabIds = React.useMemo(
() => ['recents', ...packs.map(({ id }) => id)],
[packs]
@ -124,7 +123,7 @@ export const StickerPicker = React.memo(
}, [onClose]);
// Focus popup on after initial render, restore focus on teardown
useRestoreFocus(focusRef);
const [focusRef] = useRestoreFocus();
const isEmpty = stickers.length === 0;
const addPackRef = isEmpty ? focusRef : undefined;

View File

@ -76,12 +76,11 @@ export const StickerPreviewModal = React.memo((props: Props) => {
installStickerPack,
uninstallStickerPack,
} = props;
const focusRef = React.useRef<HTMLButtonElement>(null);
const [root, setRoot] = React.useState<HTMLElement | null>(null);
const [confirmingUninstall, setConfirmingUninstall] = React.useState(false);
// Restore focus on teardown
useRestoreFocus(focusRef, root);
const [focusRef] = useRestoreFocus();
React.useEffect(() => {
const div = document.createElement('div');

View File

@ -5,6 +5,7 @@
import * as z from 'zod';
import * as moment from 'moment';
import { chunk } from 'lodash';
import { getSendOptions } from '../util/getSendOptions';
import { handleMessageSend } from '../util/handleMessageSend';
import { isNotNil } from '../util/isNotNil';
@ -21,6 +22,8 @@ import { parseIntWithFallback } from '../util/parseIntWithFallback';
import { JobQueue } from './JobQueue';
import { jobQueueDatabaseStore } from './JobQueueDatabaseStore';
const CHUNK_SIZE = 100;
const MAX_RETRY_TIME = moment.duration(1, 'day').asMilliseconds();
const readSyncJobDataSchema = z.object({
@ -79,17 +82,21 @@ export class ReadSyncJobQueue extends JobQueue<ReadSyncJobData> {
await sleep(exponentialBackoffSleepTime(attempt));
const messageIds = readSyncs.map(item => item.messageId).filter(isNotNil);
const ourConversation = window.ConversationController.getOurConversationOrThrow();
const sendOptions = await getSendOptions(ourConversation.attributes, {
syncMessage: true,
});
try {
await handleMessageSend(
window.textsecure.messaging.syncReadMessages(readSyncs, sendOptions),
{ messageIds, sendType: 'readSync' }
await Promise.all(
chunk(readSyncs, CHUNK_SIZE).map(batch => {
const messageIds = batch.map(item => item.messageId).filter(isNotNil);
return handleMessageSend(
window.textsecure.messaging.syncReadMessages(batch, sendOptions),
{ messageIds, sendType: 'readSync' }
);
})
);
} catch (err: unknown) {
if (!(err instanceof Error)) {

View File

@ -38,6 +38,7 @@ import { AttachmentType, isVoiceMessage } from '../../types/Attachment';
import { CallingNotificationType } from '../../util/callingNotification';
import { missingCaseError } from '../../util/missingCaseError';
import { isNotNil } from '../../util/isNotNil';
import { isMoreRecentThan } from '../../util/timestamp';
import { ConversationType } from '../ducks/conversations';
@ -1153,23 +1154,25 @@ export function canReply(
return false;
}
export function canDeleteForEveryone(message: MessageAttributesType): boolean {
// is someone else's message
if (isIncoming(message)) {
return false;
}
// has already been deleted for everyone
if (message.deletedForEveryone) {
return false;
}
// is too old to delete
if (Date.now() - message.sent_at > THREE_HOURS) {
return false;
}
return true;
export function canDeleteForEveryone(
message: Pick<
MessageAttributesType,
'type' | 'deletedForEveryone' | 'sent_at' | 'sendStateByConversationId'
>
): boolean {
return (
// Is this a message I sent?
isOutgoing(message) &&
// Has the message already been deleted?
!message.deletedForEveryone &&
// Is it too old to delete?
isMoreRecentThan(message.sent_at, THREE_HOURS) &&
// Is it pending/sent to anyone?
someSendStatus(
message.sendStateByConversationId,
sendStatus => sendStatus !== SendStatus.Failed
)
);
}
export function canDownload(

View File

@ -44,4 +44,12 @@ describe('createTaskWithTimeout', () => {
});
await assert.isRejected(taskWithTimeout(), 'Task is throwing!');
});
it('passes arguments to the underlying function', async () => {
const task = (arg: string) => Promise.resolve(arg);
const taskWithTimeout = createTaskWithTimeout(task, 'test');
const result = await taskWithTimeout('hi!');
assert.strictEqual(result, 'hi!');
});
});

View File

@ -1330,18 +1330,22 @@ describe('SignalProtocolStore', () => {
{
id: 1,
identifier: number,
registrationId: 243,
},
{
id: 2,
identifier: number,
registrationId: 243,
},
{
id: 3,
identifier: number,
registrationId: 243,
},
{
id: 10,
identifier: number,
registrationId: 243,
},
],
emptyIdentifiers: ['blah', 'blah2'],

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: AGPL-3.0-only
import { assert } from 'chai';
import * as moment from 'moment';
import { v4 as uuid } from 'uuid';
import { SendStatus } from '../../../messages/MessageSendState';
import {
@ -11,6 +12,7 @@ import {
import { ConversationType } from '../../../state/ducks/conversations';
import {
canDeleteForEveryone,
canReply,
getMessagePropStatus,
isEndSession,
@ -26,6 +28,98 @@ describe('state/selectors/messages', () => {
ourConversationId = uuid();
});
describe('canDeleteForEveryone', () => {
it('returns false for incoming messages', () => {
const message = {
type: 'incoming' as const,
sent_at: Date.now() - 1000,
};
assert.isFalse(canDeleteForEveryone(message));
});
it('returns false for messages that were already deleted for everyone', () => {
const message = {
type: 'outgoing' as const,
deletedForEveryone: true,
sent_at: Date.now() - 1000,
sendStateByConversationId: {
[ourConversationId]: {
status: SendStatus.Read,
updatedAt: Date.now(),
},
[uuid()]: {
status: SendStatus.Delivered,
updatedAt: Date.now(),
},
},
};
assert.isFalse(canDeleteForEveryone(message));
});
it('returns false for messages that were are too old to delete', () => {
const message = {
type: 'outgoing' as const,
sent_at: Date.now() - moment.duration(4, 'hours').asMilliseconds(),
sendStateByConversationId: {
[ourConversationId]: {
status: SendStatus.Read,
updatedAt: Date.now(),
},
[uuid()]: {
status: SendStatus.Delivered,
updatedAt: Date.now(),
},
},
};
assert.isFalse(canDeleteForEveryone(message));
});
it('returns false for messages that failed to send to anyone', () => {
const message = {
type: 'outgoing' as const,
sent_at: Date.now() - 1000,
sendStateByConversationId: {
[ourConversationId]: {
status: SendStatus.Failed,
updatedAt: Date.now(),
},
[uuid()]: {
status: SendStatus.Failed,
updatedAt: Date.now(),
},
},
};
assert.isFalse(canDeleteForEveryone(message));
});
it('returns true for messages that meet all criteria for deletion', () => {
const message = {
type: 'outgoing' as const,
sent_at: Date.now() - 1000,
sendStateByConversationId: {
[ourConversationId]: {
status: SendStatus.Pending,
updatedAt: Date.now(),
},
[uuid()]: {
status: SendStatus.Pending,
updatedAt: Date.now(),
},
[uuid()]: {
status: SendStatus.Failed,
updatedAt: Date.now(),
},
},
};
assert.isTrue(canDeleteForEveryone(message));
});
});
describe('canReply', () => {
const defaultConversation: ConversationType = {
id: uuid(),

View File

@ -14,14 +14,17 @@ describe('sendToGroup', () => {
{
identifier: 'ident-guid-one',
id: 1,
registrationId: 11,
},
{
identifier: 'ident-guid-one',
id: 2,
registrationId: 22,
},
{
identifier: 'ident-guid-two',
id: 2,
registrationId: 33,
},
];
}
@ -60,10 +63,12 @@ describe('sendToGroup', () => {
{
identifier: 'ident-guid-one',
id: 2,
registrationId: 22,
},
{
identifier: 'ident-guid-two',
id: 2,
registrationId: 33,
},
]);
assert.deepEqual(newToMemberUuids, ['ident-guid-one', 'ident-guid-two']);
@ -90,10 +95,12 @@ describe('sendToGroup', () => {
{
identifier: 'ident-guid-one',
id: 2,
registrationId: 22,
},
{
identifier: 'ident-guid-two',
id: 2,
registrationId: 33,
},
]);
assert.deepEqual(removedFromMemberUuids, [

View File

@ -521,7 +521,7 @@ export default class AccountManager extends EventTarget {
password,
registrationId,
encryptedDeviceName,
{ accessKey }
{ accessKey, uuid }
);
const uuidChanged = previousUuid && uuid && previousUuid !== uuid;
@ -622,11 +622,6 @@ export default class AccountManager extends EventTarget {
);
await window.textsecure.storage.put('regionCode', regionCode);
await window.textsecure.storage.protocol.hydrateCaches();
// We are finally ready to reconnect
window.textsecure.storage.user.emitCredentialsChanged(
'AccountManager.createAccount'
);
}
async clearSessionsAndPreKeys() {

View File

@ -919,21 +919,27 @@ export default class MessageReceiver
stores: LockedStores,
envelope: ProcessedEnvelope
): Promise<DecryptResult> {
const id = this.getEnvelopeId(envelope);
window.log.info('queueing envelope', id);
let logId = this.getEnvelopeId(envelope);
window.log.info('queueing envelope', logId);
const task = this.decryptEnvelope.bind(this, stores, envelope);
const taskWithTimeout = createTaskWithTimeout(
task,
`queueEncryptedEnvelope ${id}`
);
const task = createTaskWithTimeout(async (): Promise<DecryptResult> => {
const unsealedEnvelope = await this.unsealEnvelope(stores, envelope);
if (!unsealedEnvelope) {
// Envelope was dropped or sender is blocked
return { envelope, plaintext: undefined };
}
logId = this.getEnvelopeId(unsealedEnvelope);
return this.decryptEnvelope(stores, unsealedEnvelope);
}, `MessageReceiver: unseal and decrypt ${logId}`);
try {
return await this.addToQueue(taskWithTimeout, TaskType.Encrypted);
return await this.addToQueue(task, TaskType.Encrypted);
} catch (error) {
const args = [
'queueEncryptedEnvelope error handling envelope',
this.getEnvelopeId(envelope),
logId,
':',
Errors.toLogFormat(error),
];
@ -993,15 +999,86 @@ export default class MessageReceiver
throw new Error('Received message with no content and no legacyMessage');
}
private async decryptEnvelope(
private async unsealEnvelope(
stores: LockedStores,
initialEnvelope: ProcessedEnvelope
): Promise<DecryptResult> {
let envelope: UnsealedEnvelope = initialEnvelope;
let logId = this.getEnvelopeId(envelope);
envelope: ProcessedEnvelope
): Promise<UnsealedEnvelope | undefined> {
const logId = this.getEnvelopeId(envelope);
if (this.stoppingProcessing) {
window.log.info(`MessageReceiver.decryptEnvelope(${logId}): dropping`);
window.log.info(`MessageReceiver.unsealEnvelope(${logId}): dropping`);
return undefined;
}
if (envelope.type !== Proto.Envelope.Type.UNIDENTIFIED_SENDER) {
return envelope;
}
const ciphertext = envelope.content || envelope.legacyMessage;
if (!ciphertext) {
this.removeFromCache(envelope);
throw new Error('Received message with no content and no legacyMessage');
}
window.log.info(
`MessageReceiver.unsealEnvelope(${logId}): unidentified message`
);
const messageContent = await sealedSenderDecryptToUsmc(
Buffer.from(ciphertext),
stores.identityKeyStore
);
// Here we take this sender information and attach it back to the envelope
// to make the rest of the app work properly.
const certificate = messageContent.senderCertificate();
const originalSource = envelope.source;
const originalSourceUuid = envelope.sourceUuid;
const newEnvelope: UnsealedEnvelope = {
...envelope,
// Overwrite Envelope fields
source: dropNull(certificate.senderE164()),
sourceUuid: normalizeUuid(
certificate.senderUuid(),
'MessageReceiver.unsealEnvelope.UNIDENTIFIED_SENDER.sourceUuid'
),
sourceDevice: certificate.senderDeviceId(),
// UnsealedEnvelope-only fields
unidentifiedDeliveryReceived: !(originalSource || originalSourceUuid),
contentHint: messageContent.contentHint(),
groupId: messageContent.groupId()?.toString('base64'),
usmc: messageContent,
certificate,
unsealedContent: messageContent,
};
const newLogId = this.getEnvelopeId(newEnvelope);
const validationResult = await this.validateUnsealedEnvelope(newEnvelope);
if (validationResult && validationResult.isBlocked) {
this.removeFromCache(envelope);
return undefined;
}
window.log.info(
`MessageReceiver.unsealEnvelope(${logId}): unwrapped into ${newLogId}`
);
return newEnvelope;
}
private async decryptEnvelope(
stores: LockedStores,
envelope: UnsealedEnvelope
): Promise<DecryptResult> {
const logId = this.getEnvelopeId(envelope);
if (this.stoppingProcessing) {
window.log.info(
`MessageReceiver.decryptEnvelope(${logId}): dropping unsealed`
);
return { plaintext: undefined, envelope };
}
@ -1019,58 +1096,10 @@ export default class MessageReceiver
isLegacy = true;
} else {
this.removeFromCache(envelope);
throw new Error('Received message with no content and no legacyMessage');
}
if (envelope.type === Proto.Envelope.Type.UNIDENTIFIED_SENDER) {
window.log.info(
`MessageReceiver.decryptEnvelope(${logId}): unidentified message`
strictAssert(
false,
'Contentless envelope should be handled by unsealEnvelope'
);
const messageContent = await sealedSenderDecryptToUsmc(
Buffer.from(ciphertext),
stores.identityKeyStore
);
// Here we take this sender information and attach it back to the envelope
// to make the rest of the app work properly.
const certificate = messageContent.senderCertificate();
const originalSource = envelope.source;
const originalSourceUuid = envelope.sourceUuid;
const newEnvelope: UnsealedEnvelope = {
...envelope,
// Overwrite Envelope fields
source: dropNull(certificate.senderE164()),
sourceUuid: normalizeUuid(
certificate.senderUuid(),
'MessageReceiver.decryptEnvelope.UNIDENTIFIED_SENDER.sourceUuid'
),
sourceDevice: certificate.senderDeviceId(),
// UnsealedEnvelope-only fields
unidentifiedDeliveryReceived: !(originalSource || originalSourceUuid),
contentHint: messageContent.contentHint(),
groupId: messageContent.groupId()?.toString('base64'),
usmc: messageContent,
certificate,
unsealedContent: messageContent,
};
const newLogId = this.getEnvelopeId(newEnvelope);
const validationResult = await this.validateUnsealedEnvelope(newEnvelope);
if (validationResult && validationResult.isBlocked) {
this.removeFromCache(envelope);
return { plaintext: undefined, envelope };
}
window.log.info(
`MessageReceiver.decryptEnvelope(${logId}): unwrapped into ${newLogId}`
);
envelope = newEnvelope;
logId = newLogId;
}
window.log.info(
@ -1079,7 +1108,7 @@ export default class MessageReceiver
const plaintext = await this.decrypt(stores, envelope, ciphertext);
if (!plaintext) {
window.log.warn('MessageReceiver.decrryptEnvelope: plaintext was falsey');
window.log.warn('MessageReceiver.decryptEnvelope: plaintext was falsey');
return { plaintext, envelope };
}
@ -1105,7 +1134,7 @@ export default class MessageReceiver
}
} catch (error) {
window.log.error(
'MessageReceiver.decrryptEnvelope: Failed to process sender ' +
'MessageReceiver.decryptEnvelope: Failed to process sender ' +
`key distribution message: ${Errors.toLogFormat(error)}`
);
}

View File

@ -212,7 +212,7 @@ export class SocketManager extends EventListener {
window.log.info('SocketManager: connected authenticated socket');
window.logAuthenticatedConnect();
window.logAuthenticatedConnect?.();
this.backOff.reset();
authenticated.addEventListener('close', ({ code, reason }): void => {
@ -378,6 +378,8 @@ export class SocketManager extends EventListener {
this.authenticated?.abort();
this.unauthenticated?.abort();
this.authenticated = undefined;
this.unauthenticated = undefined;
}
//
@ -407,7 +409,17 @@ export class SocketManager extends EventListener {
});
this.unauthenticated = process;
const unauthenticated = await this.unauthenticated.getResult();
let unauthenticated: WebSocketResource;
try {
unauthenticated = await this.unauthenticated.getResult();
} catch (error) {
window.log.info(
'SocketManager: failed to connect unauthenticated socket ' +
` due to error: ${Errors.toLogFormat(error)}`
);
this.dropUnauthenticated(process);
throw error;
}
window.log.info('SocketManager: connected unauthenticated socket');
@ -540,8 +552,10 @@ export class SocketManager extends EventListener {
{
abort() {
if (resource) {
window.log.warn(`SocketManager closing socket ${path}`);
resource.close(3000, 'aborted');
} else {
window.log.warn(`SocketManager aborting connection ${path}`);
clearTimeout(timer);
client.abort();
}

View File

@ -1,16 +1,16 @@
// Copyright 2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
export default function createTaskWithTimeout<T>(
task: () => Promise<T>,
export default function createTaskWithTimeout<T, Args extends Array<unknown>>(
task: (...args: Args) => Promise<T>,
id: string,
options: { timeout?: number } = {}
): () => Promise<T> {
): (...args: Args) => Promise<T> {
const timeout = options.timeout || 1000 * 60 * 2; // two minutes
const errorForStack = new Error('for stack');
return async () =>
return async (...args: Args) =>
new Promise((resolve, reject) => {
let complete = false;
let timer: NodeJS.Timeout | null = setTimeout(() => {
@ -58,7 +58,7 @@ export default function createTaskWithTimeout<T>(
let promise;
try {
promise = task();
promise = task(...args);
} catch (error) {
clearTimer();
throw error;

View File

@ -32,6 +32,7 @@ export type WebAPICredentials = {
export type DeviceType = {
id: number;
identifier: string;
registrationId: number;
};
// How the legacy APIs generate these types

View File

@ -29,7 +29,7 @@ import { v4 as getGuid } from 'uuid';
import { z } from 'zod';
import Long from 'long';
import { assert } from '../util/assert';
import { assert, strictAssert } from '../util/assert';
import { getUserAgent } from '../util/getUserAgent';
import { toWebSafeBase64 } from '../util/webSafeBase64';
import { SocketStatus } from '../types/SocketStatus';
@ -686,6 +686,7 @@ const URL_CALLS = {
const WEBSOCKET_CALLS = new Set<keyof typeof URL_CALLS>([
// MessageController
'messages',
'multiRecipient',
'reportMessage',
// ProfileController
@ -801,7 +802,7 @@ export type WebAPIType = {
newPassword: string,
registrationId: number,
deviceName?: string | null,
options?: { accessKey?: ArrayBuffer }
options?: { accessKey?: ArrayBuffer; uuid?: string }
) => Promise<any>;
createGroup: (
group: Proto.IGroup,
@ -1472,7 +1473,7 @@ export function initialize({
newPassword: string,
registrationId: number,
deviceName?: string | null,
options: { accessKey?: ArrayBuffer } = {}
options: { accessKey?: ArrayBuffer; uuid?: string } = {}
) {
const capabilities: CapabilitiesUploadType = {
announcementGroup: true,
@ -1481,7 +1482,7 @@ export function initialize({
senderKey: false,
};
const { accessKey } = options;
const { accessKey, uuid } = options;
const jsonData: any = {
capabilities,
fetchesMessages: true,
@ -1497,8 +1498,17 @@ export function initialize({
const call = deviceName ? 'devices' : 'accounts';
const urlPrefix = deviceName ? '/' : '/code/';
// We update our saved username and password, since we're creating a new account
await authenticate({ username: number, password: newPassword });
// Reset old websocket credentials and disconnect.
// AccountManager is our only caller and it will trigger
// `registration_done` which will update credentials.
await socketManager.authenticate({
username: '',
password: '',
});
// Update REST credentials, though. We need them for the call below
username = number;
password = newPassword;
const response = await _ajax({
call,
@ -1508,11 +1518,9 @@ export function initialize({
jsonData,
});
// From here on out, our username will be our UUID or E164 combined with device
await authenticate({
username: `${response.uuid || number}.${response.deviceId || 1}`,
password,
});
// Set final REST credentials to let `registerKeys` succeed.
username = `${uuid || response.uuid || number}.${response.deviceId || 1}`;
password = newPassword;
return response;
}
@ -1707,6 +1715,12 @@ export function initialize({
}).then(handleKeys);
}
function validateMessages(messages: Array<unknown>): void {
for (const message of messages) {
strictAssert(message !== null, 'Attempting to send `null` message');
}
}
async function sendMessagesUnauth(
destination: string,
messageArray: Array<MessageType>,
@ -1720,6 +1734,8 @@ export function initialize({
jsonData.online = true;
}
validateMessages(messageArray);
return _ajax({
call: 'messages',
httpType: 'PUT',
@ -1743,6 +1759,8 @@ export function initialize({
jsonData.online = true;
}
validateMessages(messageArray);
return _ajax({
call: 'messages',
httpType: 'PUT',
@ -1765,6 +1783,7 @@ export function initialize({
data,
urlParameters: `?ts=${timestamp}&online=${online ? 'true' : 'false'}`,
responseType: 'json',
unauthenticated: true,
headers: {
'Unidentified-Access-Key': arrayBufferToBase64(accessKeys),
},

View File

@ -36,6 +36,8 @@ import { SignalService as Proto } from '../protobuf';
const THIRTY_SECONDS = 30 * 1000;
const MAX_MESSAGE_SIZE = 64 * 1024;
export class IncomingWebSocketRequest {
private readonly id: Long | number;
@ -207,6 +209,10 @@ export default class WebSocketResource extends EventTarget {
});
});
strictAssert(
bytes.length <= MAX_MESSAGE_SIZE,
'WebSocket request byte size exceeded'
);
this.socket.sendBytes(Buffer.from(bytes));
return promise;
@ -291,6 +297,10 @@ export default class WebSocketResource extends EventTarget {
(bytes: Buffer): void => {
this.removeActive(incomingRequest);
strictAssert(
bytes.length <= MAX_MESSAGE_SIZE,
'WebSocket response byte size exceeded'
);
this.socket.sendBytes(bytes);
}
);

View File

@ -1,8 +1,6 @@
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { EventEmitter } from 'events';
import { WebAPICredentials } from '../Types.d';
import { StorageInterface } from '../../types/Storage.d';
@ -17,10 +15,8 @@ export type SetCredentialsOptions = {
password: string;
};
export class User extends EventEmitter {
constructor(private readonly storage: StorageInterface) {
super();
}
export class User {
constructor(private readonly storage: StorageInterface) {}
public async setUuidAndDeviceId(
uuid: string,
@ -29,7 +25,6 @@ export class User extends EventEmitter {
await this.storage.put('uuid_id', `${uuid}.${deviceId}`);
window.log.info('storage.user: uuid and device id changed');
this.emit('credentialsChange');
}
public getNumber(): string | undefined {
@ -83,11 +78,6 @@ export class User extends EventEmitter {
]);
}
public emitCredentialsChanged(reason: string): void {
window.log.info(`storage.user: credentials changed, ${reason}`);
this.emit('credentialsChange');
}
public async removeCredentials(): Promise<void> {
window.log.info('storage.user: removeCredentials');
@ -118,25 +108,4 @@ export class User extends EventEmitter {
if (numberId === undefined) return undefined;
return Helpers.unencodeNumber(numberId)[1];
}
//
// EventEmitter typing
//
public on(type: 'credentialsChange', callback: () => void): this;
public on(
type: string | symbol,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
listener: (...args: Array<any>) => void
): this {
return super.on(type, listener);
}
public emit(type: 'credentialsChange'): boolean;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
public emit(type: string | symbol, ...args: Array<any>): boolean {
return super.emit(type, ...args);
}
}

View File

@ -13,34 +13,47 @@ export function usePrevious<T>(initialValue: T, currentValue: T): T {
return result;
}
type CallbackType = (toFocus: HTMLElement | null | undefined) => void;
// Restore focus on teardown
export const useRestoreFocus = (
// The ref for the element to receive initial focus
focusRef: React.RefObject<HTMLElement>,
// Allow for an optional root element that must exist
root: boolean | HTMLElement | null = true
): void => {
export const useRestoreFocus = (): Array<CallbackType> => {
const toFocusRef = React.useRef<HTMLElement | null>(null);
const lastFocusedRef = React.useRef<HTMLElement | null>(null);
// We need to use a callback here because refs aren't necessarily populated on first
// render. For example, ModalHost makes a top-level parent div first, and then renders
// into it. And the children you pass it don't have access to that root div.
const setFocusRef = React.useCallback(
(toFocus: HTMLElement | null | undefined) => {
if (!toFocus) {
return;
}
// We only want to do this once.
if (toFocusRef.current) {
return;
}
toFocusRef.current = toFocus;
// Remember last-focused element, focus this new target element.
lastFocusedRef.current = document.activeElement as HTMLElement;
toFocus.focus();
},
[]
);
React.useEffect(() => {
if (!root) {
return undefined;
}
const lastFocused = document.activeElement as HTMLElement;
if (focusRef.current) {
focusRef.current.focus();
}
return () => {
// This ensures that the focus is returned to
// previous element
// On unmount, returned focus to element focused before we set the focus
setTimeout(() => {
if (lastFocused && lastFocused.focus) {
lastFocused.focus();
if (lastFocusedRef.current && lastFocusedRef.current.focus) {
lastFocusedRef.current.focus();
}
});
};
}, [focusRef, root]);
}, []);
return [setFocusRef];
};
export const useBoundActions = <T extends ActionCreatorsMapObject>(

Some files were not shown because too many files have changed in this diff Show More