From 91d6502270358974936eb0324e1e8b40984f409b Mon Sep 17 00:00:00 2001 From: Jamie Kyle Date: Wed, 7 Jan 2026 15:12:20 -0800 Subject: [PATCH 01/49] v7.87.0-alpha.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a963485622..eb0f872219 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "description": "Private messaging from your desktop", "desktopName": "signal.desktop", "repository": "https://github.com/signalapp/Signal-Desktop.git", - "version": "7.86.0-alpha.1", + "version": "7.87.0-alpha.1", "license": "AGPL-3.0-only", "author": { "name": "Signal Messenger, LLC", From c9281f7f95f7c3799c6023227d63135d8d7124ff Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Fri, 9 Jan 2026 01:44:28 +1000 Subject: [PATCH 02/49] CallScreen: On ringing screen, remove Avatar in center of screen --- ts/components/CallScreen.dom.tsx | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/ts/components/CallScreen.dom.tsx b/ts/components/CallScreen.dom.tsx index 38f2baaca3..3245f68f85 100644 --- a/ts/components/CallScreen.dom.tsx +++ b/ts/components/CallScreen.dom.tsx @@ -979,26 +979,7 @@ export function CallScreen({ ) : (
- -
- -
-
+
); break; From c36c3296453b90e132b8faf1ad8e3eaf1ecd94a3 Mon Sep 17 00:00:00 2001 From: yash-signal Date: Thu, 8 Jan 2026 12:49:46 -0600 Subject: [PATCH 03/49] View-once media: backend send support --- ts/jobs/helpers/sendNormalMessage.preload.ts | 10 +++++ ts/messages/handleDataMessage.preload.ts | 2 +- ts/models/conversations.preload.ts | 3 ++ ts/state/ducks/composer.preload.ts | 3 ++ ts/textsecure/SendMessage.preload.ts | 9 +++++ ts/util/cleanup.preload.ts | 1 + ts/windows/main/start.preload.ts | 39 +++++++++++++++----- 7 files changed, 56 insertions(+), 11 deletions(-) diff --git a/ts/jobs/helpers/sendNormalMessage.preload.ts b/ts/jobs/helpers/sendNormalMessage.preload.ts index 53683e91c1..7de46cb538 100644 --- a/ts/jobs/helpers/sendNormalMessage.preload.ts +++ b/ts/jobs/helpers/sendNormalMessage.preload.ts @@ -86,6 +86,7 @@ import { uuidToBytes } from '../../util/uuidToBytes.std.js'; import { fromBase64 } from '../../Bytes.std.js'; import { MIMETypeToString } from '../../types/MIME.std.js'; import { canReuseExistingTransitCdnPointerForEditedMessage } from '../../util/Attachment.std.js'; +import { eraseMessageContents } from '../../util/cleanup.preload.js'; const { isNumber } = lodash; @@ -231,6 +232,7 @@ export async function sendNormalMessage( contact, deletedForEveryoneTimestamp, expireTimer, + isViewOnce, bodyRanges, preview, quote, @@ -365,6 +367,7 @@ export async function sendNormalMessage( deletedForEveryoneTimestamp, expireTimer, groupV2: groupV2Info, + isViewOnce, body, preview, profileKey, @@ -432,6 +435,7 @@ export async function sendNormalMessage( deletedForEveryoneTimestamp, expireTimer, expireTimerVersion: conversation.getExpireTimerVersion(), + isViewOnce, preview, profileKey, quote, @@ -495,6 +499,10 @@ export async function sendNormalMessage( } throw new Error('message did not fully send'); } + + if (isViewOnce) { + await eraseMessageContents(message, 'view-once-sent'); + } } catch (thrownError: unknown) { const errors = [thrownError, ...messageSendErrors]; await handleMultipleSendErrors({ @@ -626,6 +634,7 @@ async function getMessageSendData({ deletedForEveryoneTimestamp: undefined | number; expireTimer: undefined | DurationInSeconds; bodyRanges: undefined | ReadonlyArray; + isViewOnce?: boolean; preview: Array | undefined; quote: OutgoingQuoteType | undefined; sticker: OutgoingStickerType | undefined; @@ -753,6 +762,7 @@ async function getMessageSendData({ contact, deletedForEveryoneTimestamp: message.get('deletedForEveryoneTimestamp'), expireTimer: message.get('expireTimer'), + isViewOnce: message.get('isViewOnce'), bodyRanges: getPropForTimestamp({ log, message: message.attributes, diff --git a/ts/messages/handleDataMessage.preload.ts b/ts/messages/handleDataMessage.preload.ts index 12e2ff6914..1075fc48cc 100644 --- a/ts/messages/handleDataMessage.preload.ts +++ b/ts/messages/handleDataMessage.preload.ts @@ -728,7 +728,7 @@ export async function handleDataMessage( } if (isTapToView(message.attributes) && type === 'outgoing') { - await eraseMessageContents(message, 'view-once-viewed'); + await eraseMessageContents(message, 'view-once-sent'); } if ( diff --git a/ts/models/conversations.preload.ts b/ts/models/conversations.preload.ts index c64b53ff7b..4cab3357f4 100644 --- a/ts/models/conversations.preload.ts +++ b/ts/models/conversations.preload.ts @@ -4087,6 +4087,7 @@ export class ConversationModel { body, contact, bodyRanges, + isViewOnce, preview, quote, sticker, @@ -4096,6 +4097,7 @@ export class ConversationModel { body: string | undefined; contact?: Array; bodyRanges?: DraftBodyRanges; + isViewOnce?: boolean; preview?: Array; quote?: QuotedMessageType; sticker?: StickerWithHydratedData; @@ -4230,6 +4232,7 @@ export class ConversationModel { received_at_ms: now, expirationStartTimestamp, expireTimer, + isViewOnce, readStatus: ReadStatus.Read, seenStatus: SeenStatus.NotApplicable, sticker, diff --git a/ts/state/ducks/composer.preload.ts b/ts/state/ducks/composer.preload.ts index d5ff905f1f..b2acd42693 100644 --- a/ts/state/ducks/composer.preload.ts +++ b/ts/state/ducks/composer.preload.ts @@ -613,6 +613,7 @@ function sendMultiMediaMessage( options: WithPreSendChecksOptions & { bodyRanges?: DraftBodyRanges; draftAttachments?: ReadonlyArray; + isViewOnce?: boolean; timestamp?: number; } ): ThunkAction< @@ -635,6 +636,7 @@ function sendMultiMediaMessage( const { draftAttachments, bodyRanges, + isViewOnce, message = '', timestamp = Date.now(), voiceNoteAttachment, @@ -676,6 +678,7 @@ function sendMultiMediaMessage( quote, preview: getLinkPreviewForSend(message), bodyRanges, + isViewOnce, }, { sendHQImages, diff --git a/ts/textsecure/SendMessage.preload.ts b/ts/textsecure/SendMessage.preload.ts index 6302891196..2dd8007792 100644 --- a/ts/textsecure/SendMessage.preload.ts +++ b/ts/textsecure/SendMessage.preload.ts @@ -212,6 +212,7 @@ export type SharedMessageOptionsType = Readonly<{ flags?: number; groupCallUpdate?: GroupCallUpdateType; groupV2?: GroupV2InfoType; + isViewOnce?: boolean; pinMessage?: SendPinMessageType; pollVote?: OutgoingPollVote; pollCreate?: PollCreateType; @@ -272,6 +273,8 @@ class Message { groupV2?: GroupV2InfoType; + isViewOnce?: boolean; + preview?: ReadonlyArray; profileKey?: Uint8Array; @@ -314,6 +317,7 @@ class Message { this.expireTimerVersion = options.expireTimerVersion; this.flags = options.flags; this.groupV2 = options.groupV2; + this.isViewOnce = options.isViewOnce; this.preview = options.preview; this.profileKey = options.profileKey; this.quote = options.quote; @@ -584,6 +588,9 @@ class Message { if (this.profileKey) { proto.profileKey = this.profileKey; } + if (this.isViewOnce) { + proto.isViewOnce = true; + } if (this.deletedForEveryoneTimestamp) { proto.delete = { targetSentTimestamp: Long.fromNumber(this.deletedForEveryoneTimestamp), @@ -1125,6 +1132,7 @@ export class MessageSender { flags, groupCallUpdate, groupV2, + isViewOnce, body, preview, profileKey, @@ -1173,6 +1181,7 @@ export class MessageSender { flags, groupCallUpdate, groupV2, + isViewOnce, preview, profileKey, quote, diff --git a/ts/util/cleanup.preload.ts b/ts/util/cleanup.preload.ts index 4604552b21..ff26fc5ada 100644 --- a/ts/util/cleanup.preload.ts +++ b/ts/util/cleanup.preload.ts @@ -46,6 +46,7 @@ export async function eraseMessageContents( | 'view-once-viewed' | 'view-once-invalid' | 'view-once-expired' + | 'view-once-sent' | 'unsupported-message' | 'delete-for-everyone', additionalProperties = {} diff --git a/ts/windows/main/start.preload.ts b/ts/windows/main/start.preload.ts index fa2198ea67..777966abe4 100644 --- a/ts/windows/main/start.preload.ts +++ b/ts/windows/main/start.preload.ts @@ -1,6 +1,7 @@ // Copyright 2017 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only +import { fabric } from 'fabric'; import lodash from 'lodash'; import { contextBridge } from 'electron'; @@ -31,11 +32,7 @@ import { Environment, getEnvironment } from '../../environment.std.js'; import { isProduction } from '../../util/version.std.js'; import { benchmarkConversationOpen } from '../../CI/benchmarkConversationOpen.preload.js'; import { itemStorage } from '../../textsecure/Storage.preload.js'; -import { enqueuePollCreateForSend } from '../../util/enqueuePollCreateForSend.dom.js'; -import { - isPollSendEnabled, - type PollCreateType, -} from '../../types/Polls.dom.js'; +import { IMAGE_PNG } from '../../types/MIME.std.js'; const { has } = lodash; @@ -120,17 +117,39 @@ if ( calling._iceServerOverride = override; }, - sendPollInSelectedConversation: async (poll: PollCreateType) => { - if (!isPollSendEnabled()) { - throw new Error('Poll sending is not enabled'); - } + sendViewOnceImageInSelectedConversation: async () => { const conversationId = window.reduxStore.getState().conversations.selectedConversationId; const conversation = window.ConversationController.get(conversationId); if (!conversation) { throw new Error('No conversation selected'); } - await enqueuePollCreateForSend(conversation, poll); + + const canvas = new fabric.StaticCanvas(null, { + width: 100, + height: 100, + backgroundColor: '#3b82f6', + }); + const dataURL = canvas.toDataURL({ format: 'png' }); + const base64Data = dataURL.split(',')[1]; + const data = Uint8Array.from(atob(base64Data), c => c.charCodeAt(0)); + + await conversation.enqueueMessageForSend( + { + body: undefined, + attachments: [ + { + contentType: IMAGE_PNG, + size: data.byteLength, + data, + }, + ], + isViewOnce: true, + }, + {} + ); + + log.info('Sent view-once test image'); }, ...(window.SignalContext.config.ciMode === 'benchmark' ? { From 4431d0cc7b945671d0434a28a60c1c4c47f93d04 Mon Sep 17 00:00:00 2001 From: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com> Date: Thu, 8 Jan 2026 20:59:44 +0100 Subject: [PATCH 04/49] Add option to sort by file size in Media Gallery --- _locales/en/messages.json | 16 + .../media-gallery/AttachmentSection.dom.tsx | 18 +- .../MediaGallery.dom.stories.tsx | 39 +- .../media-gallery/MediaGallery.dom.tsx | 26 ++ .../MediaGridItem.dom.stories.tsx | 1 + .../media-gallery/MediaGridItem.dom.tsx | 23 +- .../media-gallery/PanelHeader.dom.tsx | 61 ++- .../media-gallery/utils/storybook.dom.tsx | 7 +- ts/sql/Interface.std.ts | 19 +- ts/sql/Server.node.ts | 111 +++-- .../migrations/1620-sort-bigger-media.std.ts | 15 + ts/sql/migrations/index.node.ts | 2 + ts/state/ducks/mediaGallery.preload.ts | 395 +++++++++++------- ts/state/smart/AllMedia.preload.tsx | 2 + ts/state/smart/AllMediaHeader.preload.tsx | 14 +- ts/state/smart/MediaItem.preload.tsx | 5 + ts/types/MediaItem.std.ts | 2 + 17 files changed, 531 insertions(+), 225 deletions(-) create mode 100644 ts/sql/migrations/1620-sort-bigger-media.std.ts diff --git a/_locales/en/messages.json b/_locales/en/messages.json index a3b409fe72..9b9f9e6b0c 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -6872,6 +6872,22 @@ "messageformat": "Links", "description": "Header of the links pane in the media gallery, showing links" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by", + "description": "Accessible label of the drop down trigger for sorting media gallery" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by", + "description": "Header displayed on top of the drop down menu for sorting media gallery" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date", + "description": "Sort by date option of drop down menu in media gallery" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size", + "description": "Sort by file size option of drop down menu in media gallery" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "No Media", "description": "Title of the empty state view of media gallery for media tab" diff --git a/ts/components/conversation/media-gallery/AttachmentSection.dom.tsx b/ts/components/conversation/media-gallery/AttachmentSection.dom.tsx index 962c07fb9d..7123ebcf5b 100644 --- a/ts/components/conversation/media-gallery/AttachmentSection.dom.tsx +++ b/ts/components/conversation/media-gallery/AttachmentSection.dom.tsx @@ -88,9 +88,11 @@ export function AttachmentSection({ case 'media': return (
-

- {header} -

+ {header != null && ( +

+ {header} +

+ )}
-

- {header} -

+ {header != null && ( +

+ {header} +

+ )}
{verified.entries.map(mediaItem => { return ( diff --git a/ts/components/conversation/media-gallery/MediaGallery.dom.stories.tsx b/ts/components/conversation/media-gallery/MediaGallery.dom.stories.tsx index 4f8dd15c54..0d8f8d2679 100644 --- a/ts/components/conversation/media-gallery/MediaGallery.dom.stories.tsx +++ b/ts/components/conversation/media-gallery/MediaGallery.dom.stories.tsx @@ -4,7 +4,10 @@ import React, { useState, useCallback } from 'react'; import { action } from '@storybook/addon-actions'; import type { Meta } from '@storybook/react'; -import type { MediaTabType } from '../../../types/MediaItem.std.js'; +import type { + MediaTabType, + MediaSortOrderType, +} from '../../../types/MediaItem.std.js'; import type { Props } from './MediaGallery.dom.js'; import { MediaGallery } from './MediaGallery.dom.js'; import { PanelHeader } from './PanelHeader.dom.js'; @@ -39,6 +42,7 @@ const createProps = (overrideProps: Partial = {}): Props => ({ links: overrideProps.links || [], documents: overrideProps.documents || [], tab: overrideProps.tab || 'media', + sortOrder: overrideProps.sortOrder || 'date', initialLoad: action('initialLoad'), loadMore: action('loadMore'), @@ -54,6 +58,7 @@ const createProps = (overrideProps: Partial = {}): Props => ({ function Panel(props: Props): React.JSX.Element { const [tab, setTab] = useState(props.tab); + const [sortOrder, setSortOrder] = useState('date'); const [loading, setLoading] = useState(false); @@ -71,14 +76,30 @@ function Panel(props: Props): React.JSX.Element { ); return ( -
- - +
+
+
+
+ +
); } diff --git a/ts/components/conversation/media-gallery/MediaGallery.dom.tsx b/ts/components/conversation/media-gallery/MediaGallery.dom.tsx index a52c65bf71..7f642ed3af 100644 --- a/ts/components/conversation/media-gallery/MediaGallery.dom.tsx +++ b/ts/components/conversation/media-gallery/MediaGallery.dom.tsx @@ -7,6 +7,7 @@ import React, { useRef, useCallback, useState, + useMemo, } from 'react'; import moment from 'moment'; @@ -15,6 +16,7 @@ import type { ItemClickEvent } from './types/ItemClickEvent.std.js'; import type { LocalizerType } from '../../../types/Util.std.js'; import type { MediaTabType, + MediaSortOrderType, LinkPreviewMediaItemType, ContactMediaItemType, MediaItemType, @@ -49,6 +51,7 @@ export type Props = { links: ReadonlyArray; documents: ReadonlyArray; tab: MediaTabType; + sortOrder: MediaSortOrderType; saveAttachment: SaveAttachmentActionCreatorType; pushPanelForConversation: PushPanelForConversationActionType; kickOffAttachmentDownload: (options: { messageId: string }) => void; @@ -71,6 +74,7 @@ function MediaSection({ i18n, loading, tab, + sortOrder, mediaItems, saveAttachment, pushPanelForConversation, @@ -92,6 +96,7 @@ function MediaSection({ | 'renderMediaItem' > & { tab: MediaTabType; + sortOrder: MediaSortOrderType; mediaItems: ReadonlyArray; }): React.JSX.Element { const onItemClick = useCallback( @@ -142,6 +147,10 @@ function MediaSection({ ] ); + const reversedMediaItems = useMemo(() => { + return mediaItems.toReversed(); + }, [mediaItems]); + if (mediaItems.length === 0) { if (loading) { return
; @@ -155,6 +164,20 @@ function MediaSection({ const isGrid = mediaItems.at(0)?.type === 'media'; + if (sortOrder === 'size') { + return ( +
+
+ +
+
+ ); + } + const sections = groupedItems.map((section, index) => { const isLast = index === groupedItems.length - 1; const first = section.mediaItems[0]; @@ -219,6 +242,7 @@ export function MediaGallery({ links, documents, tab, + sortOrder, saveAttachment, pushPanelForConversation, kickOffAttachmentDownload, @@ -266,6 +290,7 @@ export function MediaGallery({ audio.length, links.length, documents.length, + sortOrder, ]); const [setObserverRef, observerEntry] = useIntersectionObserver(); @@ -339,6 +364,7 @@ export function MediaGallery({ i18n={i18n} loading={loading} tab={tab} + sortOrder={sortOrder} mediaItems={mediaItems} saveAttachment={saveAttachment} pushPanelForConversation={pushPanelForConversation} diff --git a/ts/components/conversation/media-gallery/MediaGridItem.dom.stories.tsx b/ts/components/conversation/media-gallery/MediaGridItem.dom.stories.tsx index 17f2022049..5baa69b423 100644 --- a/ts/components/conversation/media-gallery/MediaGridItem.dom.stories.tsx +++ b/ts/components/conversation/media-gallery/MediaGridItem.dom.stories.tsx @@ -32,6 +32,7 @@ const createProps = ( i18n, theme, mediaItem: overrideProps.mediaItem, + showSize: false, onClick: action('onClick'), }; }; diff --git a/ts/components/conversation/media-gallery/MediaGridItem.dom.tsx b/ts/components/conversation/media-gallery/MediaGridItem.dom.tsx index 04f0510fab..c344c9b009 100644 --- a/ts/components/conversation/media-gallery/MediaGridItem.dom.tsx +++ b/ts/components/conversation/media-gallery/MediaGridItem.dom.tsx @@ -28,6 +28,7 @@ import { export type Props = Readonly<{ mediaItem: ReadonlyDeep; + showSize: boolean; onClick?: (attachmentState: AttachmentStatusType['state']) => void; i18n: LocalizerType; theme?: ThemeType; @@ -36,6 +37,7 @@ export type Props = Readonly<{ export function MediaGridItem(props: Props): React.JSX.Element { const { mediaItem: { attachment }, + showSize, i18n, theme, onClick, @@ -93,7 +95,12 @@ export function MediaGridItem(props: Props): React.JSX.Element { > {imageOrBlurHash} - + ); @@ -145,25 +152,31 @@ type MetadataOverlayProps = Readonly<{ i18n: LocalizerType; status: AttachmentStatusType; attachment: AttachmentForUIType; + showSize: boolean; }>; function MetadataOverlay( props: MetadataOverlayProps ): React.JSX.Element | undefined { - const { i18n, status, attachment } = props; + const { i18n, status, attachment, showSize } = props; if ( status.state === 'ReadyToShow' && !isGIF([attachment]) && - !isVideoAttachment(attachment) + !isVideoAttachment(attachment) && + !showSize ) { return undefined; } let text: string; - if (isGIF([attachment]) && status.state === 'ReadyToShow') { + if (!showSize && isGIF([attachment]) && status.state === 'ReadyToShow') { text = i18n('icu:message--getNotificationText--gif'); - } else if (isVideoAttachment(attachment) && attachment.duration != null) { + } else if ( + !showSize && + isVideoAttachment(attachment) && + attachment.duration != null + ) { text = formatDuration(attachment.duration); } else { text = formatFileSize(attachment.size); diff --git a/ts/components/conversation/media-gallery/PanelHeader.dom.tsx b/ts/components/conversation/media-gallery/PanelHeader.dom.tsx index 699ddb9267..231031825d 100644 --- a/ts/components/conversation/media-gallery/PanelHeader.dom.tsx +++ b/ts/components/conversation/media-gallery/PanelHeader.dom.tsx @@ -6,17 +6,30 @@ import React, { useCallback } from 'react'; import { tw } from '../../../axo/tw.dom.js'; import { ExperimentalAxoSegmentedControl } from '../../../axo/AxoSegmentedControl.dom.js'; import { AxoSelect } from '../../../axo/AxoSelect.dom.js'; +import { AxoDropdownMenu } from '../../../axo/AxoDropdownMenu.dom.js'; +import { AxoIconButton } from '../../../axo/AxoIconButton.dom.js'; import type { LocalizerType } from '../../../types/Util.std.js'; -import type { MediaTabType } from '../../../types/MediaItem.std.js'; +import type { + MediaTabType, + MediaSortOrderType, +} from '../../../types/MediaItem.std.js'; // Provided by smart layer export type Props = Readonly<{ i18n: LocalizerType; tab: MediaTabType; setTab: (newTab: MediaTabType) => void; + sortOrder: MediaSortOrderType; + setSortOrder: (newOrder: MediaSortOrderType) => void; }>; -export function PanelHeader({ i18n, tab, setTab }: Props): React.JSX.Element { +export function PanelHeader({ + i18n, + tab, + setTab, + sortOrder, + setSortOrder, +}: Props): React.JSX.Element { const setSelectedTabWithDefault = useCallback( (value: string | null) => { switch (value) { @@ -36,16 +49,14 @@ export function PanelHeader({ i18n, tab, setTab }: Props): React.JSX.Element { [setTab] ); + const isNonDefaultSorting = sortOrder !== 'date'; + return (
+
+
+ +
+ + + + + + + + {i18n('icu:MediaGallery__sort--header')} + + setSortOrder('date')} + > + {i18n('icu:MediaGallery__sort__date')} + + setSortOrder('size')} + > + {i18n('icu:MediaGallery__sort__size')} + + + + +
); } diff --git a/ts/components/conversation/media-gallery/utils/storybook.dom.tsx b/ts/components/conversation/media-gallery/utils/storybook.dom.tsx index 2c16cbf48e..8379817f77 100644 --- a/ts/components/conversation/media-gallery/utils/storybook.dom.tsx +++ b/ts/components/conversation/media-gallery/utils/storybook.dom.tsx @@ -44,7 +44,12 @@ export function MediaItem({ ); case 'media': return ( - + ); case 'document': return ( diff --git a/ts/sql/Interface.std.ts b/ts/sql/Interface.std.ts index edd8a34419..22c3cca155 100644 --- a/ts/sql/Interface.std.ts +++ b/ts/sql/Interface.std.ts @@ -610,24 +610,29 @@ export type GetSortedMediaOptionsType = Readonly<{ messageId?: string; receivedAt?: number; sentAt?: number; - order: 'older' | 'newer'; + size?: number; + order: 'older' | 'newer' | 'bigger'; type: 'media' | 'audio' | 'documents'; }>; -export type GetOlderDocumentsOptionsType = Readonly<{ +export type GetSortedDocumentsOptionsType = Readonly<{ conversationId: string; limit: number; messageId?: string; receivedAt?: number; sentAt?: number; + size?: number; + order: 'older' | 'bigger'; }>; -export type GetOlderNonAttachmentMediaOptionsType = Readonly<{ +export type GetSortedNonAttachmentMediaOptionsType = Readonly<{ conversationId: string; limit: number; messageId?: string; receivedAt?: number; sentAt?: number; + size?: number; + order: 'older' | 'bigger'; type: 'links' | 'contacts'; }>; @@ -886,11 +891,11 @@ type ReadableInterface = { getSortedMedia: ( options: GetSortedMediaOptionsType ) => Array; - getOlderNonAttachmentMedia: ( - options: GetOlderNonAttachmentMediaOptionsType + getSortedNonAttachmentMedia: ( + options: GetSortedNonAttachmentMediaOptionsType ) => Array; - getOlderDocuments: ( - options: GetOlderDocumentsOptionsType + getSortedDocuments: ( + options: GetSortedDocumentsOptionsType ) => Array; getAllStories: (options: { conversationId?: string; diff --git a/ts/sql/Server.node.ts b/ts/sql/Server.node.ts index 5129398cdf..eb8d9b279a 100644 --- a/ts/sql/Server.node.ts +++ b/ts/sql/Server.node.ts @@ -49,7 +49,7 @@ import { isNormalNumber } from '../util/isNormalNumber.std.js'; import { isNotNil } from '../util/isNotNil.std.js'; import { parseIntOrThrow } from '../util/parseIntOrThrow.std.js'; import { updateSchema } from './migrations/index.node.js'; -import type { JSONRows, QueryFragment } from './util.std.js'; +import type { JSONRows, QueryFragment, QueryTemplate } from './util.std.js'; import { batchMultiVarQuery, bulkAdd, @@ -136,8 +136,8 @@ import type { GetKnownMessageAttachmentsResultType, GetNearbyMessageFromDeletedSetOptionsType, GetSortedMediaOptionsType, - GetOlderNonAttachmentMediaOptionsType, - GetOlderDocumentsOptionsType, + GetSortedNonAttachmentMediaOptionsType, + GetSortedDocumentsOptionsType, GetRecentStoryRepliesOptionsType, GetUnreadByConversationAndMarkReadResultType, IdentityKeyIdType, @@ -479,8 +479,8 @@ export const DataReader: ServerReadableInterface = { hasMedia, getSortedMedia, - getOlderNonAttachmentMedia, - getOlderDocuments, + getSortedNonAttachmentMedia, + getSortedDocuments, getAllNotificationProfiles, getNotificationProfileById, @@ -5332,19 +5332,23 @@ function getSortedMedia( messageId, receivedAt: givenReceivedAt, sentAt: givenSentAt, + size: givenSize, type, }: GetSortedMediaOptionsType ): Array { - let timeFilters: { + let index: QueryFragment; + let sortFilters: { first: QueryFragment; second: QueryFragment; + third?: QueryFragment; }; - let timeOrder: QueryFragment; + let orderFragment: QueryFragment; if (order === 'older') { const maxReceivedAt = givenReceivedAt ?? Number.MAX_VALUE; const maxSentAt = givenSentAt ?? Number.MAX_VALUE; - timeFilters = { + index = sqlFragment`message_attachments_getOlderMedia`; + sortFilters = { first: sqlFragment` message_attachments.receivedAt = ${maxReceivedAt} AND @@ -5352,12 +5356,16 @@ function getSortedMedia( `, second: sqlFragment`message_attachments.receivedAt < ${maxReceivedAt}`, }; - timeOrder = sqlFragment`DESC`; + orderFragment = sqlFragment` + message_attachments.receivedAt DESC, + message_attachments.sentAt DESC + `; } else if (order === 'newer') { const minReceivedAt = givenReceivedAt ?? Number.MIN_VALUE; const minSentAt = givenSentAt ?? Number.MIN_VALUE; - timeFilters = { + index = sqlFragment`message_attachments_getOlderMedia`; + sortFilters = { first: sqlFragment` message_attachments.receivedAt = ${minReceivedAt} AND @@ -5365,7 +5373,38 @@ function getSortedMedia( `, second: sqlFragment`message_attachments.receivedAt > ${minReceivedAt}`, }; - timeOrder = sqlFragment`ASC`; + orderFragment = sqlFragment` + message_attachments.receivedAt ASC, + message_attachments.sentAt ASC + `; + } else if (order === 'bigger') { + const maxSize = givenSize ?? Number.MAX_VALUE; + const maxReceivedAt = givenReceivedAt ?? Number.MAX_VALUE; + const maxSentAt = givenSentAt ?? Number.MAX_VALUE; + + index = sqlFragment`message_attachments_sortBiggerMedia`; + sortFilters = { + first: sqlFragment` + message_attachments.size = ${maxSize} + AND + message_attachments.receivedAt = ${maxReceivedAt} + AND + message_attachments.sentAt < ${maxSentAt} + `, + second: sqlFragment` + message_attachments.size = ${maxSize} + AND + message_attachments.receivedAt < ${maxReceivedAt} + `, + third: sqlFragment` + message_attachments.size < ${maxSize} + `, + }; + orderFragment = sqlFragment` + message_attachments.size DESC, + message_attachments.receivedAt DESC, + message_attachments.sentAt DESC + `; } else { throw missingCaseError(order); } @@ -5401,7 +5440,7 @@ function getSortedMedia( throw missingCaseError(type); } - const createQuery = (timeFilter: QueryFragment): QueryFragment => sqlFragment` + const createQuery = (sortFilter: QueryFragment): QueryFragment => sqlFragment` SELECT message_attachments.*, messages.json -> '$.sendStateByConversationId' AS messageSendState, @@ -5411,7 +5450,7 @@ function getSortedMedia( messages.source AS messageSource, messages.sourceServiceId AS messageSourceServiceId FROM message_attachments - INDEXED BY message_attachments_getOlderMedia + INDEXED BY ${index} INNER JOIN messages ON messages.id = message_attachments.messageId WHERE @@ -5419,23 +5458,37 @@ function getSortedMedia( message_attachments.editHistoryIndex IS -1 AND message_attachments.attachmentType IS 'attachment' AND ( - ${timeFilter} + ${sortFilter} ) AND (${contentFilter}) AND message_attachments.isViewOnce IS NOT 1 AND message_attachments.messageType IN ('incoming', 'outgoing') AND (${messageId ?? null} IS NULL OR message_attachments.messageId IS NOT ${messageId ?? null}) - ORDER BY - message_attachments.receivedAt ${timeOrder}, - message_attachments.sentAt ${timeOrder} + ORDER BY ${orderFragment} LIMIT ${limit} `; - const [query, params] = sql` - SELECT first.* FROM (${createQuery(timeFilters.first)}) as first - UNION ALL - SELECT second.* FROM (${createQuery(timeFilters.second)}) as second - `; + let template: QueryTemplate; + if (order === 'older' || order === 'newer') { + template = sql` + SELECT first.* FROM (${createQuery(sortFilters.first)}) as first + UNION ALL + SELECT second.* FROM (${createQuery(sortFilters.second)}) as second + `; + } else if (order === 'bigger') { + strictAssert(sortFilters.third != null, 'file size filter is required'); + template = sql` + SELECT first.* FROM (${createQuery(sortFilters.first)}) as first + UNION ALL + SELECT second.* FROM (${createQuery(sortFilters.second)}) as second + UNION ALL + SELECT third.* FROM (${createQuery(sortFilters.third)}) as third + `; + } else { + throw missingCaseError(order); + } + + const [query, params] = template; const results: Array< MessageAttachmentDBType & { @@ -5486,7 +5539,7 @@ function getSortedMedia( }); } -function getOlderNonAttachmentMedia( +function getSortedNonAttachmentMedia( db: ReadableDB, { conversationId, @@ -5495,7 +5548,7 @@ function getOlderNonAttachmentMedia( receivedAt: maxReceivedAt = Number.MAX_VALUE, sentAt: maxSentAt = Number.MAX_VALUE, type, - }: GetOlderNonAttachmentMediaOptionsType + }: GetSortedNonAttachmentMediaOptionsType ): Array { const timeFilters = { first: sqlFragment`received_at = ${maxReceivedAt} AND sent_at < ${maxSentAt}`, @@ -5557,7 +5610,7 @@ function getOlderNonAttachmentMedia( if (type === 'links') { strictAssert( row.preview != null && row.preview.length >= 1, - `getOlderNonAttachmentMedia: got message without preview ${row.id}` + `getSortedNonAttachmentMedia: got message without preview ${row.id}` ); return { @@ -5570,7 +5623,7 @@ function getOlderNonAttachmentMedia( if (type === 'contacts') { strictAssert( row.contact != null && row.contact.length >= 1, - `getOlderNonAttachmentMedia: got message without contact ${row.id}` + `getSortedNonAttachmentMedia: got message without contact ${row.id}` ); return { @@ -5584,9 +5637,9 @@ function getOlderNonAttachmentMedia( }); } -function getOlderDocuments( +function getSortedDocuments( db: ReadableDB, - options: GetOlderDocumentsOptionsType + options: GetSortedDocumentsOptionsType ): Array { return db.transaction(() => { const documents = getSortedMedia(db, { @@ -5594,7 +5647,7 @@ function getOlderDocuments( order: 'older', type: 'documents', }); - const contacts = getOlderNonAttachmentMedia(db, { + const contacts = getSortedNonAttachmentMedia(db, { ...options, type: 'contacts', }) as Array; diff --git a/ts/sql/migrations/1620-sort-bigger-media.std.ts b/ts/sql/migrations/1620-sort-bigger-media.std.ts new file mode 100644 index 0000000000..cbc60896ed --- /dev/null +++ b/ts/sql/migrations/1620-sort-bigger-media.std.ts @@ -0,0 +1,15 @@ +// Copyright 2026 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only + +import type { WritableDB } from '../Interface.std.js'; + +export default function updateToSchemaVersion1620(db: WritableDB): void { + db.exec(` + CREATE INDEX message_attachments_sortBiggerMedia ON message_attachments + (conversationId, attachmentType, size DESC, receivedAt DESC, sentAt DESC) + WHERE + editHistoryIndex IS -1 AND + messageType IN ('incoming', 'outgoing') AND + isViewOnce IS NOT 1; + `); +} diff --git a/ts/sql/migrations/index.node.ts b/ts/sql/migrations/index.node.ts index 4854e4cfa9..880b51d7ee 100644 --- a/ts/sql/migrations/index.node.ts +++ b/ts/sql/migrations/index.node.ts @@ -138,6 +138,7 @@ import updateToSchemaVersion1580 from './1580-expired-group-replies.std.js'; import updateToSchemaVersion1590 from './1590-megaphones.std.js'; import updateToSchemaVersion1600 from './1600-deduplicate-usernames.std.js'; import updateToSchemaVersion1610 from './1610-has-contacts.std.js'; +import updateToSchemaVersion1620 from './1620-sort-bigger-media.std.js'; import { DataWriter } from '../Server.node.js'; @@ -1636,6 +1637,7 @@ export const SCHEMA_VERSIONS: ReadonlyArray = [ { version: 1600, update: updateToSchemaVersion1600 }, { version: 1610, update: updateToSchemaVersion1610 }, + { version: 1620, update: updateToSchemaVersion1620 }, ]; export class DBVersionFromFutureError extends Error { diff --git a/ts/state/ducks/mediaGallery.preload.ts b/ts/state/ducks/mediaGallery.preload.ts index aea6e3b5ea..74d77de0d5 100644 --- a/ts/state/ducks/mediaGallery.preload.ts +++ b/ts/state/ducks/mediaGallery.preload.ts @@ -30,11 +30,14 @@ import type { } from './conversations.preload.js'; import type { MediaTabType, + MediaSortOrderType, MediaItemMessageType, MediaItemType, LinkPreviewMediaItemType, ContactMediaItemType, + GenericMediaItemType, } from '../../types/MediaItem.std.js'; +import type { AttachmentForUIType } from '../../types/Attachment.std.js'; import { isFile, isVisualMedia, @@ -52,6 +55,7 @@ const log = createLogger('mediaGallery'); export type MediaGalleryStateType = ReadonlyDeep<{ tab: MediaTabType; + sortOrder: MediaSortOrderType; conversationId: string | undefined; haveOldestMedia: boolean; haveOldestAudio: boolean; @@ -70,6 +74,7 @@ const INITIAL_LOAD = 'mediaGallery/INITIAL_LOAD'; const LOAD_MORE = 'mediaGallery/LOAD_MORE'; const SET_LOADING = 'mediaGallery/SET_LOADING'; const SET_TAB = 'mediaGallery/SET_TAB'; +const SET_SORT_ORDER = 'mediaGallery/SET_SORT_ORDER'; type InitialLoadActionType = ReadonlyDeep<{ type: typeof INITIAL_LOAD; @@ -103,6 +108,12 @@ type SetTabActionType = ReadonlyDeep<{ tab: MediaGalleryStateType['tab']; }; }>; +type SetSortOrderActionType = ReadonlyDeep<{ + type: typeof SET_SORT_ORDER; + payload: { + sortOrder: MediaGalleryStateType['sortOrder']; + }; +}>; type MediaGalleryActionType = ReadonlyDeep< | ConversationUnloadedActionType @@ -113,16 +124,107 @@ type MediaGalleryActionType = ReadonlyDeep< | MessageExpiredActionType | SetLoadingActionType | SetTabActionType + | SetSortOrderActionType >; +function getMediaItemSize(item: GenericMediaItemType): number { + switch (item.type) { + case 'media': + case 'audio': + case 'document': + return item.attachment.size; + case 'link': + case 'contact': + return 0; + default: + throw missingCaseError(item); + } +} + +function _updateMedia({ + message, + haveOldest, + media, + newMedia, + sortOrder, +}: { + message: ReadonlyMessageAttributesType; + haveOldest: boolean; + media: ReadonlyArray; + newMedia: ReadonlyArray; + sortOrder: MediaSortOrderType; +}): [ReadonlyArray, boolean] { + const mediaWithout = media.filter(item => item.message.id !== message.id); + const difference = media.length - mediaWithout.length; + + if (message.deletedForEveryone || message.isErased) { + // If message is erased and there was media from this message - update state + if (difference > 0) { + return [mediaWithout, haveOldest]; + } + return [media, haveOldest]; + } + + const oldest = media[0]; + + let inMediaTimeRange: boolean; + + if (oldest == null) { + inMediaTimeRange = true; + } else if (sortOrder === 'date') { + inMediaTimeRange = + message.received_at >= oldest.message.receivedAt && + message.sent_at >= oldest.message.sentAt; + } else if (sortOrder === 'size') { + const messageLatest = _sortItems(newMedia, sortOrder).at(-1); + inMediaTimeRange = + messageLatest == null || + (getMediaItemSize(messageLatest) >= getMediaItemSize(oldest) && + message.received_at >= oldest.message.receivedAt && + message.sent_at >= oldest.message.sentAt); + } else { + throw missingCaseError(sortOrder); + } + + // If message is updated out of current range - it means that the oldest + // message in the view might no longer be the oldest in the database. + if (!inMediaTimeRange) { + return [media, false]; + } + + // If the message is in the view and attachments might have changed - update + if (difference > 0 || newMedia.length > 0) { + return [_sortItems(mediaWithout.concat(newMedia), sortOrder), haveOldest]; + } + + return [media, haveOldest]; +} + function _sortItems< - Item extends ReadonlyDeep<{ message: MediaItemMessageType }>, ->(items: ReadonlyArray): ReadonlyArray { - return orderBy(items, [ - 'message.receivedAt', - 'message.sentAt', - 'message.index', - ]); + Item extends ReadonlyDeep<{ + attachment?: AttachmentForUIType; + message: MediaItemMessageType; + }>, +>( + items: ReadonlyArray, + sortOrder: MediaSortOrderType +): ReadonlyArray { + if (sortOrder === 'date') { + return orderBy(items, [ + 'message.receivedAt', + 'message.sentAt', + 'message.index', + ]); + } + if (sortOrder === 'size') { + return orderBy(items, [ + 'attachment.size', + 'message.receivedAt', + 'message.sentAt', + 'message.index', + ]); + } + throw missingCaseError(sortOrder); } function _cleanMessage( @@ -163,6 +265,28 @@ function _cleanAttachments( return rawMedia.map(media => _cleanAttachment(type, media)); } +function _cleanContact(raw: ContactMediaItemDBType): ContactMediaItemType { + const { message, contact } = raw; + return { + type: 'contact', + contact: { + ...contact, + avatar: + contact.avatar?.avatar == null + ? undefined + : { + ...contact.avatar, + avatar: getPropsForAttachment( + contact.avatar.avatar, + 'contact', + message + ), + }, + }, + message, + }; +} + function _cleanDocuments( rawDocuments: ReadonlyArray ): ReadonlyArray { @@ -175,26 +299,7 @@ function _cleanDocuments( rawDocument.type === 'contact', `Unexpected documen type ${rawDocument.type}` ); - - const { message, contact } = rawDocument; - return { - type: 'contact', - contact: { - ...contact, - avatar: - contact.avatar?.avatar == null - ? undefined - : { - ...contact.avatar, - avatar: getPropsForAttachment( - contact.avatar.avatar, - 'contact', - message - ), - }, - }, - message, - }; + return _cleanContact(rawDocument); }); } @@ -219,6 +324,17 @@ function _cleanLinkPreviews( }); } +function sortOrderToOrder(sortOrder: MediaSortOrderType): 'older' | 'bigger' { + switch (sortOrder) { + case 'date': + return 'older'; + case 'size': + return 'bigger'; + default: + throw missingCaseError(sortOrder); + } +} + function initialLoad( conversationId: string ): ThunkAction< @@ -227,35 +343,42 @@ function initialLoad( unknown, InitialLoadActionType | SetLoadingActionType > { - return async dispatch => { + return async (dispatch, getState) => { dispatch({ type: SET_LOADING, payload: { loading: true }, }); + const { + mediaGallery: { sortOrder }, + } = getState(); + const order = sortOrderToOrder(sortOrder); + const [rawMedia, rawAudio, rawDocuments, rawLinkPreviews] = await Promise.all([ DataReader.getSortedMedia({ conversationId, limit: FETCH_CHUNK_COUNT, type: 'media', - order: 'older', + order, }), DataReader.getSortedMedia({ conversationId, limit: FETCH_CHUNK_COUNT, type: 'audio', - order: 'older', + order, }), - // Note: `getOlderDocuments` mixes in contacts - DataReader.getOlderDocuments({ + // Note: `getSortedDocuments` mixes in contacts + DataReader.getSortedDocuments({ conversationId, limit: FETCH_CHUNK_COUNT, + order, }), - DataReader.getOlderNonAttachmentMedia({ + DataReader.getSortedNonAttachmentMedia({ conversationId, limit: FETCH_CHUNK_COUNT, type: 'links', + order, }), ]); @@ -288,7 +411,7 @@ function loadMore( > { return async (dispatch, getState) => { const { mediaGallery } = getState(); - const { conversationId: previousConversationId } = mediaGallery; + const { conversationId: previousConversationId, sortOrder } = mediaGallery; if (conversationId !== previousConversationId) { log.warn('loadMore: conversationId mismatch; calling initialLoad()'); @@ -331,6 +454,8 @@ function loadMore( messageId, receivedAt, sentAt, + size: getMediaItemSize(oldestLoadedItem), + order: sortOrderToOrder(sortOrder), }; let media: ReadonlyArray = []; @@ -338,9 +463,10 @@ function loadMore( let documents: ReadonlyArray = []; let links: ReadonlyArray = []; if (type === 'media' || type === 'audio') { + strictAssert(oldestLoadedItem.type === type, 'must be a media item'); + const rawMedia = await DataReader.getSortedMedia({ ...sharedOptions, - order: 'older', type, }); @@ -353,12 +479,12 @@ function loadMore( throw missingCaseError(type); } } else if (type === 'documents') { - // Note: `getOlderDocuments` mixes in contacts - const rawDocuments = await DataReader.getOlderDocuments(sharedOptions); + // Note: `getSortedDocuments` mixes in contacts + const rawDocuments = await DataReader.getSortedDocuments(sharedOptions); documents = _cleanDocuments(rawDocuments); } else if (type === 'links') { - const rawPreviews = await DataReader.getOlderNonAttachmentMedia({ + const rawPreviews = await DataReader.getSortedNonAttachmentMedia({ ...sharedOptions, type, }); @@ -389,10 +515,22 @@ function setTab(tab: MediaGalleryStateType['tab']): SetTabActionType { }; } +function setSortOrder( + sortOrder: MediaGalleryStateType['sortOrder'] +): SetSortOrderActionType { + return { + type: SET_SORT_ORDER, + payload: { + sortOrder, + }, + }; +} + export const actions = { initialLoad, loadMore, setTab, + setSortOrder, }; export const useMediaGalleryActions = (): BoundActionCreatorsMapObject< @@ -402,6 +540,7 @@ export const useMediaGalleryActions = (): BoundActionCreatorsMapObject< export function getEmptyState(): MediaGalleryStateType { return { tab: 'media', + sortOrder: 'date', conversationId: undefined, haveOldestDocument: false, haveOldestMedia: false, @@ -433,16 +572,17 @@ export function reducer( return { tab: 'media', + sortOrder: state.sortOrder, loading: false, conversationId: payload.conversationId, haveOldestMedia: payload.media.length === 0, haveOldestAudio: payload.audio.length === 0, haveOldestLink: payload.links.length === 0, haveOldestDocument: payload.documents.length === 0, - media: _sortItems(payload.media), - audio: _sortItems(payload.audio), - links: _sortItems(payload.links), - documents: _sortItems(payload.documents), + media: _sortItems(payload.media, state.sortOrder), + audio: _sortItems(payload.audio, state.sortOrder), + links: _sortItems(payload.links, 'date'), + documents: _sortItems(payload.documents, state.sortOrder), }; } @@ -459,10 +599,10 @@ export function reducer( haveOldestAudio: audio.length === 0, haveOldestDocument: documents.length === 0, haveOldestLink: links.length === 0, - media: _sortItems(media.concat(state.media)), - audio: _sortItems(audio.concat(state.audio)), - links: _sortItems(links.concat(state.links)), - documents: _sortItems(documents.concat(state.documents)), + media: _sortItems(media.concat(state.media), state.sortOrder), + audio: _sortItems(audio.concat(state.audio), state.sortOrder), + links: _sortItems(links.concat(state.links), 'date'), + documents: _sortItems(documents.concat(state.documents), state.sortOrder), }; } @@ -475,6 +615,17 @@ export function reducer( }; } + if (action.type === SET_SORT_ORDER) { + const { sortOrder } = action.payload; + + return { + ...getEmptyState(), + loading: true, + tab: state.tab, + sortOrder, + }; + } + // A time-ordered subset of all conversation media is loaded at once. // When a message changes, check that the changed message falls within this time range, // and if so insert it into the loaded media. @@ -486,46 +637,6 @@ export function reducer( return state; } - const mediaWithout = state.media.filter( - item => item.message.id !== message.id - ); - const audioWithout = state.audio.filter( - item => item.message.id !== message.id - ); - const documentsWithout = state.documents.filter( - item => item.message.id !== message.id - ); - const linksWithout = state.links.filter( - item => item.message.id !== message.id - ); - const mediaDifference = state.media.length - mediaWithout.length; - const audioDifference = state.audio.length - audioWithout.length; - const documentDifference = state.documents.length - documentsWithout.length; - const linkDifference = state.links.length - linksWithout.length; - - if (message.deletedForEveryone || message.isErased) { - if ( - mediaDifference > 0 || - audioDifference > 0 || - documentDifference > 0 || - linkDifference > 0 - ) { - return { - ...state, - media: mediaWithout, - audio: audioWithout, - documents: documentsWithout, - links: linksWithout, - }; - } - return state; - } - - const oldestLoadedMedia = state.media[0]; - const oldestLoadedAudio = state.audio[0]; - const oldestLoadedDocument = state.documents[0]; - const oldestLoadedLink = state.links[0]; - const messageMediaItems: Array = ( message.attachments ?? [] ).map((attachment, index) => { @@ -547,10 +658,6 @@ export function reducer( ({ attachment }) => isVoiceMessage(attachment) || isAudio([attachment]) ) ); - const newDocuments = _cleanAttachments( - 'documents', - messageMediaItems.filter(({ attachment }) => isFile(attachment)) - ); const newLinks = _cleanLinkPreviews( message.preview != null && message.preview.length > 0 ? [ @@ -562,75 +669,51 @@ export function reducer( ] : [] ); - const newContacts = _cleanDocuments( - message.contact != null && message.contact.length > 0 - ? [ - { - type: 'contact', - contact: message.contact[0], - message: _cleanMessage(message), - }, - ] - : [] - ); - - let { - media, - audio, - links, - documents, - haveOldestMedia, - haveOldestAudio, - haveOldestLink, - haveOldestDocument, - } = state; - - const inMediaTimeRange = - !oldestLoadedMedia || - (message.received_at >= oldestLoadedMedia.message.receivedAt && - message.sent_at >= oldestLoadedMedia.message.sentAt); - if ((mediaDifference > 0 || newMedia.length > 0) && inMediaTimeRange) { - media = _sortItems(mediaWithout.concat(newMedia)); - } else if (!inMediaTimeRange) { - haveOldestMedia = false; - } - - const inAudioTimeRange = - !oldestLoadedAudio || - (message.received_at >= oldestLoadedAudio.message.receivedAt && - message.sent_at >= oldestLoadedAudio.message.sentAt); - if ((audioDifference > 0 || newAudio.length > 0) && inAudioTimeRange) { - audio = _sortItems(audioWithout.concat(newAudio)); - } else if (!inAudioTimeRange) { - haveOldestAudio = false; - } - - const inDocumentTimeRange = - !oldestLoadedDocument || - (message.received_at >= oldestLoadedDocument.message.receivedAt && - message.sent_at >= oldestLoadedDocument.message.sentAt); - if ( - (documentDifference > 0 || - newDocuments.length > 0 || - newContacts.length > 0) && - inDocumentTimeRange - ) { - documents = _sortItems( - documentsWithout.concat(newDocuments, newContacts) + let newDocuments: ReadonlyArray = + _cleanAttachments( + 'documents', + messageMediaItems.filter(({ attachment }) => isFile(attachment)) + ); + if (message.contact != null && message.contact.length > 0) { + newDocuments = newDocuments.concat( + _cleanContact({ + type: 'contact', + contact: message.contact[0], + message: _cleanMessage(message), + }) ); - } else if (!inDocumentTimeRange) { - haveOldestDocument = false; } - const inLinkTimeRange = - !oldestLoadedLink || - (message.received_at >= oldestLoadedLink.message.receivedAt && - message.sent_at >= oldestLoadedLink.message.sentAt); - if ((linkDifference > 0 || newLinks.length > 0) && inLinkTimeRange) { - links = _sortItems(linksWithout.concat(newLinks)); - } else if (!inLinkTimeRange) { - haveOldestLink = false; - } + const { sortOrder } = state; + + const [media, haveOldestMedia] = _updateMedia({ + message, + haveOldest: state.haveOldestMedia, + media: state.media, + newMedia, + sortOrder, + }); + const [audio, haveOldestAudio] = _updateMedia({ + message, + haveOldest: state.haveOldestAudio, + media: state.audio, + newMedia: newAudio, + sortOrder, + }); + const [documents, haveOldestDocument] = _updateMedia({ + message, + haveOldest: state.haveOldestDocument, + media: state.documents, + newMedia: newDocuments, + sortOrder, + }); + const [links, haveOldestLink] = _updateMedia({ + message, + haveOldest: state.haveOldestLink, + media: state.links, + newMedia: newLinks, + sortOrder: 'date', + }); if ( state.haveOldestMedia !== haveOldestMedia || diff --git a/ts/state/smart/AllMedia.preload.tsx b/ts/state/smart/AllMedia.preload.tsx index 9a60cfb9f1..8640dc0742 100644 --- a/ts/state/smart/AllMedia.preload.tsx +++ b/ts/state/smart/AllMedia.preload.tsx @@ -42,6 +42,7 @@ export const SmartAllMedia = memo(function SmartAllMedia({ haveOldestDocument, loading, tab, + sortOrder, } = useSelector(getMediaGalleryState); const { initialLoad, loadMore } = useMediaGalleryActions(); const { @@ -107,6 +108,7 @@ export const SmartAllMedia = memo(function SmartAllMedia({ links={links} documents={documents} tab={tab} + sortOrder={sortOrder} showLightbox={showLightbox} playAudio={playAudio} kickOffAttachmentDownload={kickOffAttachmentDownload} diff --git a/ts/state/smart/AllMediaHeader.preload.tsx b/ts/state/smart/AllMediaHeader.preload.tsx index 83ab1133a6..0dd438ff22 100644 --- a/ts/state/smart/AllMediaHeader.preload.tsx +++ b/ts/state/smart/AllMediaHeader.preload.tsx @@ -8,9 +8,17 @@ import { getIntl } from '../selectors/user.std.js'; import { useMediaGalleryActions } from '../ducks/mediaGallery.preload.js'; export const SmartAllMediaHeader = memo(function SmartAllMediaHeader() { - const { tab } = useSelector(getMediaGalleryState); - const { setTab } = useMediaGalleryActions(); + const { tab, sortOrder } = useSelector(getMediaGalleryState); + const { setTab, setSortOrder } = useMediaGalleryActions(); const i18n = useSelector(getIntl); - return ; + return ( + + ); }); diff --git a/ts/state/smart/MediaItem.preload.tsx b/ts/state/smart/MediaItem.preload.tsx index 0652eecd15..a117e6dddc 100644 --- a/ts/state/smart/MediaItem.preload.tsx +++ b/ts/state/smart/MediaItem.preload.tsx @@ -19,6 +19,7 @@ import { getUserConversationId, } from '../selectors/user.std.js'; import { getConversationSelector } from '../selectors/conversations.dom.js'; +import { getMediaGalleryState } from '../selectors/mediaGallery.std.js'; import { useConversationsActions } from '../ducks/conversations.preload.js'; export type PropsType = Readonly<{ @@ -34,6 +35,7 @@ export const MediaItem = memo(function MediaItem({ const theme = useSelector(getTheme); const ourConversationId = useSelector(getUserConversationId); const getConversation = useSelector(getConversationSelector); + const { sortOrder } = useSelector(getMediaGalleryState); const { showConversation } = useConversationsActions(); @@ -58,6 +60,8 @@ export const MediaItem = memo(function MediaItem({ }); }, [message.conversationId, message.id, showConversation]); + const showSize = sortOrder === 'size'; + switch (mediaItem.type) { case 'audio': return ( @@ -74,6 +78,7 @@ export const MediaItem = memo(function MediaItem({ return ( Date: Thu, 8 Jan 2026 15:04:58 -0500 Subject: [PATCH 05/49] Exclude mentionAciBinary in processedRange --- ts/util/BodyRange.node.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ts/util/BodyRange.node.ts b/ts/util/BodyRange.node.ts index fe1a07a249..7db8deb662 100644 --- a/ts/util/BodyRange.node.ts +++ b/ts/util/BodyRange.node.ts @@ -60,7 +60,10 @@ export function filterAndClean( if ('mentionAci' in range) { rawMentionAci = dropNull(range.mentionAci); } - if ('mentionAciBinary' in range) { + if ( + 'mentionAciBinary' in range && + range.mentionAciBinary instanceof Uint8Array + ) { mentionAciBinary = dropNull(range.mentionAciBinary); } @@ -80,7 +83,6 @@ export function filterAndClean( } return { - ...restOfRange, start, length, mentionAci, From b6f9c17bea7264e782a480aa09eefea59a216520 Mon Sep 17 00:00:00 2001 From: trevor-signal <131492920+trevor-signal@users.noreply.github.com> Date: Thu, 8 Jan 2026 16:19:51 -0500 Subject: [PATCH 06/49] Improve focus management for AxoContextMenu --- ts/axo/AxoContextMenu.dom.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ts/axo/AxoContextMenu.dom.tsx b/ts/axo/AxoContextMenu.dom.tsx index 70f6fe0464..2a475f7117 100644 --- a/ts/axo/AxoContextMenu.dom.tsx +++ b/ts/axo/AxoContextMenu.dom.tsx @@ -232,6 +232,7 @@ export namespace AxoContextMenu { * Uses a portal to render the content part into the `body`. */ export const Content: FC = memo(props => { + const { open } = useStrictContext(RootContext); return ( {props.children} From 77ddee4ff2c255801a3a81bb41151f0f1f5ebf2d Mon Sep 17 00:00:00 2001 From: trevor-signal <131492920+trevor-signal@users.noreply.github.com> Date: Fri, 9 Jan 2026 12:52:05 -0500 Subject: [PATCH 07/49] Fix focus state when forwarding --- ts/components/ForwardMessagesModal.dom.tsx | 8 +------- ts/components/conversation/MessageContextMenu.dom.tsx | 9 ++++++++- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ts/components/ForwardMessagesModal.dom.tsx b/ts/components/ForwardMessagesModal.dom.tsx index 257ded19bb..a26adb17f2 100644 --- a/ts/components/ForwardMessagesModal.dom.tsx +++ b/ts/components/ForwardMessagesModal.dom.tsx @@ -264,13 +264,7 @@ export function ForwardMessagesModal({ }; useEffect(() => { - const timeout = setTimeout(() => { - inputRef.current?.focus(); - }, 100); - - return () => { - clearTimeout(timeout); - }; + inputRef.current?.focus(); }, []); const footer = ( diff --git a/ts/components/conversation/MessageContextMenu.dom.tsx b/ts/components/conversation/MessageContextMenu.dom.tsx index 26c9142257..245cfec936 100644 --- a/ts/components/conversation/MessageContextMenu.dom.tsx +++ b/ts/components/conversation/MessageContextMenu.dom.tsx @@ -96,7 +96,14 @@ export function MessageContextMenu({ )} {onForward && ( - + { + // forward modal takes focus + shouldReturnFocusToTrigger.current = false; + onForward(); + }} + > {i18n('icu:MessageContextMenu__forward')} )} From e64ea74e11c0f0c030902aa83a1f6f2e66100f1d Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Sat, 10 Jan 2026 07:25:22 +1000 Subject: [PATCH 08/49] Update Electron to v39.2.7 Co-authored-by: ayumi-signal <143036029+ayumi-signal@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index eb0f872219..2bb4538d17 100644 --- a/package.json +++ b/package.json @@ -312,7 +312,7 @@ "csv-parse": "5.5.6", "danger": "12.3.3", "debug": "4.3.7", - "electron": "39.2.4", + "electron": "39.2.7", "electron-builder": "26.0.14", "electron-mocha": "13.0.1", "endanger": "7.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b838f50b9a..1da5d43a08 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -661,8 +661,8 @@ importers: specifier: 4.3.7 version: 4.3.7(supports-color@8.1.1) electron: - specifier: 39.2.4 - version: 39.2.4 + specifier: 39.2.7 + version: 39.2.7 electron-builder: specifier: 26.0.14 version: 26.0.14(electron-builder-squirrel-windows@26.0.14) @@ -5856,8 +5856,8 @@ packages: engines: {node: '>= 12.20.55'} hasBin: true - electron@39.2.4: - resolution: {integrity: sha512-KxPtwpFceQKSxRtUY39piHLYhJMMyHfOhc70e6zRnKGrbRdK6hzEqssth8IGjlKOdkeT4KCvIEngnNraYk39+g==} + electron@39.2.7: + resolution: {integrity: sha512-KU0uFS6LSTh4aOIC3miolcbizOFP7N1M46VTYVfqIgFiuA2ilfNaOHLDS9tCMvwwHRowAsvqBrh9NgMXcTOHCQ==} engines: {node: '>= 12.20.55'} hasBin: true @@ -17095,7 +17095,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron@39.2.4: + electron@39.2.7: dependencies: '@electron/get': 2.0.3 '@types/node': 22.19.1 From 8ca20a37ade3917ab068ba60b09404cb07bd6f53 Mon Sep 17 00:00:00 2001 From: Jamie <113370520+jamiebuilds-signal@users.noreply.github.com> Date: Mon, 12 Jan 2026 14:04:23 -0800 Subject: [PATCH 09/49] Add backup support for pinned messages Co-authored-by: Scott Nonnenberg --- .github/workflows/ci.yml | 2 +- ACKNOWLEDGMENTS.md | 446 +++++++++++------- package.json | 2 +- pnpm-lock.yaml | 10 +- protos/Backups.proto | 40 ++ test/test.js | 7 +- .../conversation/TimelineItem.dom.tsx | 3 +- .../PinnedMessageNotification.dom.tsx | 11 +- ts/messageModifiers/PinnedMessages.preload.ts | 5 +- ts/model-types.d.ts | 7 +- ts/services/backups/export.preload.ts | 85 +++- ts/services/backups/import.preload.ts | 116 ++++- ts/sql/Interface.std.ts | 5 + ts/sql/Server.node.ts | 33 ++ .../1630-message-pin-message-data.std.ts | 79 ++++ ts/sql/migrations/index.node.ts | 2 + ts/sql/server/pinnedMessages.std.ts | 10 + ts/state/ducks/composer.preload.ts | 17 +- ts/state/ducks/conversations.preload.ts | 5 +- ts/state/selectors/message.preload.ts | 4 +- ...ckup_groupv2_notifications_test.preload.ts | 2 - .../backup/integration_test.preload.ts | 11 +- ts/test-node/sql/migration_1630_test.node.ts | 162 +++++++ ts/types/Message.std.ts | 2 +- ts/types/Storage.d.ts | 2 + 25 files changed, 858 insertions(+), 210 deletions(-) create mode 100644 ts/sql/migrations/1630-message-pin-message-data.std.ts create mode 100644 ts/test-node/sql/migration_1630_test.node.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 09ff5c1a6c..b6c3c7f8e5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -234,7 +234,7 @@ jobs: uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 with: repository: 'signalapp/Signal-Message-Backup-Tests' - ref: '551f9ad1186d196e8698df4a5750b239f0796a70' + ref: '50336e18dc0171551b1684ff81690b2f515dd217' path: 'backup-integration-tests' - run: xvfb-run --auto-servernum pnpm run test-electron diff --git a/ACKNOWLEDGMENTS.md b/ACKNOWLEDGMENTS.md index 996a315fd4..20c4b8bcc4 100644 --- a/ACKNOWLEDGMENTS.md +++ b/ACKNOWLEDGMENTS.md @@ -6092,7 +6092,7 @@ Signal Desktop makes use of the following open source projects. libsignal makes use of the following open source projects. -## spqr 1.2.0, partial-default-derive 0.1.0, partial-default 0.1.0 +## spqr 1.3.0, partial-default-derive 0.1.0, partial-default 0.1.0 ``` GNU AFFERO GENERAL PUBLIC LICENSE @@ -7000,6 +7000,189 @@ You should also get your employer (if you work as a programmer) or school, if an ``` +## sync_wrapper 1.0.2 + +``` + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + +``` + ## nonzero_ext 0.3.0 ``` @@ -7486,7 +7669,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## hax-lib-macros 0.2.0, hax-lib-macros 0.3.4, hax-lib 0.2.0, hax-lib 0.3.4 +## hax-lib-macros 0.3.5, hax-lib 0.3.5 ``` @@ -8097,7 +8280,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## libcrux-hacl-rs 0.0.2, libcrux-hkdf 0.0.2, libcrux-hmac 0.0.2, libcrux-intrinsics 0.0.2, libcrux-intrinsics 0.0.3, libcrux-macros 0.0.2, libcrux-ml-kem 0.0.2, libcrux-platform 0.0.2, libcrux-sha2 0.0.2, libcrux-sha3 0.0.2, libcrux-sha3 0.0.3, libcrux-traits 0.0.2 +## libcrux-hacl-rs 0.0.4, libcrux-hmac 0.0.4, libcrux-intrinsics 0.0.4, libcrux-macros 0.0.3, libcrux-ml-kem 0.0.4, libcrux-platform 0.0.2, libcrux-secrets 0.0.4, libcrux-sha2 0.0.4, libcrux-sha3 0.0.4, libcrux-traits 0.0.4 ``` Apache License @@ -8474,7 +8657,7 @@ END OF TERMS AND CONDITIONS ``` -## debugid 0.8.0, prost-build 0.13.5, prost-derive 0.13.5, prost-types 0.13.5, prost 0.13.5 +## debugid 0.8.0, prost-build 0.14.1, prost-derive 0.14.1, prost-types 0.14.1, prost 0.14.1 ``` Apache License @@ -9251,10 +9434,10 @@ SOFTWARE. ``` -## backtrace 0.3.75, cc 1.2.37, cfg-if 1.0.3, cmake 0.1.48, find-msvc-tools 0.1.1, openssl-probe 0.1.6, pkg-config 0.3.32, rustc-demangle 0.1.26, socket2 0.6.0 +## percent-encoding 2.3.2 ``` -Copyright (c) 2014 Alex Crichton +Copyright (c) 2013-2025 The rust-url developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated @@ -9282,11 +9465,10 @@ DEALINGS IN THE SOFTWARE. ``` -## boring-sys 4.18.0 +## backtrace 0.3.75, cc 1.2.37, cfg-if 1.0.3, cmake 0.1.48, find-msvc-tools 0.1.1, openssl-probe 0.1.6, rustc-demangle 0.1.26, socket2 0.6.0 ``` Copyright (c) 2014 Alex Crichton -Copyright (c) 2020 Ivan Nikulin Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated @@ -9314,11 +9496,11 @@ DEALINGS IN THE SOFTWARE. ``` -## libz-sys 1.1.22 +## boring-sys 4.18.0 ``` Copyright (c) 2014 Alex Crichton -Copyright (c) 2020 Josh Triplett +Copyright (c) 2020 Ivan Nikulin Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated @@ -9400,32 +9582,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -## mime 0.3.17 - -``` -Copyright (c) 2014 Sean McArthur - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - ``` ## base64ct 1.8.0 @@ -9578,32 +9734,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -## headers-core 0.3.0 - -``` -Copyright (c) 2014-2023 Sean McArthur - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - ``` ## flate2 1.1.2 @@ -9660,32 +9790,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -## headers 0.4.1 - -``` -Copyright (c) 2014-2025 Sean McArthur - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - ``` ## either 1.15.0, itertools 0.13.0, itertools 0.14.0, petgraph 0.7.1, serde_with 3.14.0, serde_with_macros 3.14.0 @@ -10239,31 +10343,6 @@ DEALINGS IN THE SOFTWARE. ``` -## httpdate 1.0.3 - -``` -Copyright (c) 2016 Pyfisch - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -``` - ## rustc_version 0.4.1 ``` @@ -10707,38 +10786,6 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -## vcpkg 0.2.15 - -``` -Copyright (c) 2017 Jim McGrath - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - ``` ## foreign-types-macros 0.2.3, foreign-types-shared 0.3.1, foreign-types 0.5.0 @@ -11499,6 +11546,37 @@ DEALINGS IN THE SOFTWARE. ``` +## tower-layer 0.3.3, tower-service 0.3.3 + +``` +Copyright (c) 2019 Tower Contributors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +``` + ## universal-hash 0.5.1 ``` @@ -12117,6 +12195,31 @@ SOFTWARE. ``` +## tonic 0.14.2 + +``` +Copyright (c) 2025 Lucio Franco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +``` + ## toml_datetime 0.7.1, toml_edit 0.23.5, toml_parser 1.0.2 ``` @@ -12874,30 +12977,6 @@ SOFTWARE. ``` -## async-compression 0.4.30, compression-codecs 0.4.30, compression-core 0.4.29 - -``` -MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO -EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - ## tokio-stream 0.1.17, tokio-util 0.7.16, tokio 1.47.1 ``` @@ -13333,6 +13412,33 @@ SOFTWARE. ``` +## async-compression 0.4.30, compression-codecs 0.4.30, compression-core 0.4.29 + +``` +The MIT License (MIT) + +Copyright (c) 2018 the rustasync developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## atomic-take 1.1.0 ``` @@ -13532,7 +13638,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## hpke-rs-crypto 0.3.0, hpke-rs 0.3.0 +## hpke-rs-crypto 0.3.0, hpke-rs 0.4.0 ``` Mozilla Public License Version 2.0 diff --git a/package.json b/package.json index 2bb4538d17..969baeb8a4 100644 --- a/package.json +++ b/package.json @@ -133,7 +133,7 @@ "@react-aria/utils": "3.25.3", "@react-spring/web": "10.0.3", "@react-types/shared": "3.27.0", - "@signalapp/libsignal-client": "0.86.3", + "@signalapp/libsignal-client": "0.86.9", "@signalapp/minimask": "1.0.1", "@signalapp/mute-state-change": "workspace:1.0.0", "@signalapp/quill-cjs": "2.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1da5d43a08..157458f724 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -129,8 +129,8 @@ importers: specifier: 3.27.0 version: 3.27.0(react@18.3.1) '@signalapp/libsignal-client': - specifier: 0.86.3 - version: 0.86.3 + specifier: 0.86.9 + version: 0.86.9 '@signalapp/minimask': specifier: 1.0.1 version: 1.0.1 @@ -3495,8 +3495,8 @@ packages: '@signalapp/libsignal-client@0.76.7': resolution: {integrity: sha512-iGWTlFkko7IKlm96Iy91Wz5sIN089nj02ifOk6BWtLzeVi0kFaNj+jK26Sl1JRXy/VfXevcYtiOivOg43BPqpg==} - '@signalapp/libsignal-client@0.86.3': - resolution: {integrity: sha512-aN/pgT9YqacuABrtxBtBbQ0AMesZJIHVNqU8nUq75kRTleIU5aKeuOXt7ZHYUUJW7ot4O2n6O6eaMnMLbwBXFQ==} + '@signalapp/libsignal-client@0.86.9': + resolution: {integrity: sha512-1s7kBgFdXuHTqSJECep+AM/SvhZ66w9V4yMfHELpkNAmXBZlZ4CZLduWRvyUpfpVj2guLFadBExqcDej8JJKJA==} '@signalapp/minimask@1.0.1': resolution: {integrity: sha512-QAwo0joA60urTNbW9RIz6vLKQjy+jdVtH7cvY0wD9PVooD46MAjE40MLssp4xUJrph91n2XvtJ3pbEUDrmT2AA==} @@ -14279,7 +14279,7 @@ snapshots: type-fest: 4.26.1 uuid: 11.0.2 - '@signalapp/libsignal-client@0.86.3': + '@signalapp/libsignal-client@0.86.9': dependencies: node-gyp-build: 4.8.4 type-fest: 4.26.1 diff --git a/protos/Backups.proto b/protos/Backups.proto index fa9332f7df..c8ee0ffbd6 100644 --- a/protos/Backups.proto +++ b/protos/Backups.proto @@ -90,6 +90,20 @@ message AccountData { AutoDownloadOption documents = 4; } + enum AppTheme { + UNKNOWN_APP_THEME = 0; // Interpret as "System" + SYSTEM = 1; + LIGHT = 2; + DARK = 3; + } + + enum CallsUseLessDataSetting { + UNKNOWN_CALL_DATA_SETTING = 0; // Interpret as "Never" + NEVER = 1; + MOBILE_DATA_ONLY = 2; + WIFI_AND_MOBILE_DATA = 3; + } + message AccountSettings { bool readReceipts = 1; bool sealedSenderIndicators = 2; @@ -119,6 +133,9 @@ message AccountData { reserved /* wifiAutoDownloadSettings */ 25; optional uint32 screenLockTimeoutMinutes = 26; // If unset, consider screen lock to be disabled. optional bool pinReminders = 27; // If unset, consider pin reminders to be enabled. + AppTheme appTheme = 28; // If unset, treat the same as "Unknown" case + CallsUseLessDataSetting callsUseLessDataSetting = 29; // If unset, treat the same as "Unknown" case + bool allowSealedSenderFromAnyone = 30; } message SubscriberData { @@ -140,8 +157,15 @@ message AccountData { } message AndroidSpecificSettings { + enum NavigationBarSize { + UNKNOWN_BAR_SIZE = 0; // Intepret as "Normal" + NORMAL = 1; + COMPACT = 2; + } + bool useSystemEmoji = 1; bool screenshotSecurity = 2; + NavigationBarSize navigationBarSize = 3; // If unset, treat the same as "Unknown" case } bytes profileKey = 1; @@ -438,6 +462,14 @@ message ChatItem { message DirectionlessMessageDetails { } + message PinDetails { + uint64 pinnedAtTimestamp = 1; + oneof pinExpiry { + uint64 pinExpiresAtTimestamp = 2; // timestamp when the pin should expire + bool pinNeverExpires = 3; + } + } + uint64 chatId = 1; // conversation id uint64 authorId = 2; // recipient id uint64 dateSent = 3; @@ -466,6 +498,8 @@ message ChatItem { DirectStoryReplyMessage directStoryReplyMessage = 19; // group story reply messages are not backed up Poll poll = 20; } + + PinDetails pinDetails = 21; // only set if message is pinned } message SendStatus { @@ -876,6 +910,7 @@ message ChatUpdateMessage { GroupCall groupCall = 8; LearnedProfileChatUpdate learnedProfileChange = 9; PollTerminateUpdate pollTerminate = 10; + PinMessageUpdate pinMessage = 11; } } @@ -1246,6 +1281,11 @@ message PollTerminateUpdate { string question = 2; // Between 1-100 characters } +message PinMessageUpdate { + uint64 targetSentTimestamp = 1; + uint64 authorId = 2; // recipient id +} + message StickerPack { bytes packId = 1; bytes packKey = 2; diff --git a/test/test.js b/test/test.js index a979b79a9d..9884f9716e 100644 --- a/test/test.js +++ b/test/test.js @@ -8,8 +8,13 @@ mocha.setup('bdd'); mocha.setup({ timeout: 10000 }); +let themeSetting = 'light'; + window.Events = { - getThemeSetting: () => 'light', + getThemeSetting: () => themeSetting, + setThemeSetting: (newSetting) => { + themeSetting = newSetting; + }, addDarkOverlay: () => undefined, }; diff --git a/ts/components/conversation/TimelineItem.dom.tsx b/ts/components/conversation/TimelineItem.dom.tsx index 6d0735d6c5..2abba033e7 100644 --- a/ts/components/conversation/TimelineItem.dom.tsx +++ b/ts/components/conversation/TimelineItem.dom.tsx @@ -68,6 +68,7 @@ import { } from './MessageRequestResponseNotification.dom.js'; import type { MessageRequestState } from './MessageRequestActionsConfirmation.dom.js'; import type { MessageInteractivity } from './Message.dom.js'; +import type { PinMessageData } from '../../model-types.js'; type CallHistoryType = { type: 'callHistory'; @@ -206,7 +207,7 @@ type PropsLocalType = { isGroup: boolean; isNextItemCallingNotification: boolean; isTargeted: boolean; - scrollToPinnedMessage: (pinnedMessageId: string) => void; + scrollToPinnedMessage: (pinMessage: PinMessageData) => void; scrollToPollMessage: (messageId: string, conversationId: string) => unknown; targetMessage: (messageId: string, conversationId: string) => unknown; shouldRenderDateHeader: boolean; diff --git a/ts/components/conversation/pinned-messages/PinnedMessageNotification.dom.tsx b/ts/components/conversation/pinned-messages/PinnedMessageNotification.dom.tsx index 571e8456ef..07f7ff77ac 100644 --- a/ts/components/conversation/pinned-messages/PinnedMessageNotification.dom.tsx +++ b/ts/components/conversation/pinned-messages/PinnedMessageNotification.dom.tsx @@ -7,26 +7,27 @@ import { I18n } from '../../I18n.dom.js'; import { SystemMessage } from '../SystemMessage.dom.js'; import { UserText } from '../../UserText.dom.js'; import { Button, ButtonSize, ButtonVariant } from '../../Button.dom.js'; +import type { PinMessageData } from '../../../model-types.js'; export type PinnedMessageNotificationData = Readonly<{ sender: ConversationType; - pinnedMessageId: string; + pinMessage: PinMessageData; }>; export type PinnedMessageNotificationProps = PinnedMessageNotificationData & Readonly<{ i18n: LocalizerType; - onScrollToPinnedMessage: (messageId: string) => void; + onScrollToPinnedMessage: (pinMessage: PinMessageData) => void; }>; export function PinnedMessageNotification( props: PinnedMessageNotificationProps ): React.JSX.Element { - const { i18n, sender, pinnedMessageId, onScrollToPinnedMessage } = props; + const { i18n, sender, pinMessage, onScrollToPinnedMessage } = props; const onClick = useCallback(() => { - onScrollToPinnedMessage(pinnedMessageId); - }, [onScrollToPinnedMessage, pinnedMessageId]); + onScrollToPinnedMessage(pinMessage); + }, [onScrollToPinnedMessage, pinMessage]); return ( ; + type MessageType = | 'call-history' | 'change-number-notification' @@ -213,7 +218,7 @@ export type MessageAttributesType = { payment?: AnyPaymentEvent; quote?: QuotedMessageType; reactions?: ReadonlyArray; - pinnedMessageId?: string; + pinMessage?: PinMessageData; poll?: PollMessageAttribute; pollTerminateNotification?: { question: string; diff --git a/ts/services/backups/export.preload.ts b/ts/services/backups/export.preload.ts index 8f075d622e..55dcb23ae7 100644 --- a/ts/services/backups/export.preload.ts +++ b/ts/services/backups/export.preload.ts @@ -184,6 +184,8 @@ import { KIBIBYTE } from '../../types/AttachmentSize.std.js'; import { itemStorage } from '../../textsecure/Storage.preload.js'; import { ChatFolderType } from '../../types/ChatFolder.std.js'; import { expiresTooSoonForBackup } from './util/expiration.std.js'; +import type { PinnedMessage } from '../../types/PinnedMessage.std.js'; +import type { ThemeType } from '../../util/preload.preload.js'; const { isNumber } = lodash; @@ -222,6 +224,7 @@ type GetRecipientIdOptionsType = type ToChatItemOptionsType = Readonly<{ aboutMe: AboutMe; callHistoryByCallId: Record; + pinnedMessagesByMessageId: Record; }>; type NonBubbleOptionsType = Pick< @@ -752,6 +755,9 @@ export class BackupExportStream extends Readable { const callHistory = await DataReader.getAllCallHistory(); const callHistoryByCallId = makeLookup(callHistory, 'callId'); + const pinnedMessages = await DataReader.getAllPinnedMessages(); + const pinnedMessagesByMessageId = makeLookup(pinnedMessages, 'messageId'); + const me = window.ConversationController.getOurConversationOrThrow(); const serviceId = me.get('serviceId'); const aci = isAciString(serviceId) ? serviceId : undefined; @@ -779,6 +785,7 @@ export class BackupExportStream extends Readable { const chatItem = await this.#toChatItem(message, { aboutMe, callHistoryByCallId, + pinnedMessagesByMessageId, }); if (chatItem === undefined) { @@ -952,6 +959,9 @@ export class BackupExportStream extends Readable { 'auto-download-attachment-primary' ); + const themeSetting = await window.Events.getThemeSetting(); + const appTheme = toAppTheme(themeSetting); + return { profileKey: itemStorage.get('profileKey'), username: me.get('username') || null, @@ -1017,12 +1027,20 @@ export class BackupExportStream extends Readable { customChatColors: this.#toCustomChatColors(), defaultChatStyle: this.#toDefaultChatStyle(), backupTier: backupTier != null ? Long.fromNumber(backupTier) : null, + appTheme, + callsUseLessDataSetting: + itemStorage.get('callsUseLessDataSetting') || + Backups.AccountData.CallsUseLessDataSetting.MOBILE_DATA_ONLY, + // Test only values ...(isTestOrMockEnvironment() ? { optimizeOnDeviceStorage: itemStorage.get( 'optimizeOnDeviceStorage' ), + allowSealedSenderFromAnyone: itemStorage.get( + 'allowSealedSenderFromAnyone' + ), pinReminders: itemStorage.get('pinReminders'), screenLockTimeoutMinutes: itemStorage.get( 'screenLockTimeoutMinutes' @@ -1325,7 +1343,11 @@ export class BackupExportStream extends Readable { async #toChatItem( message: MessageAttributesType, - { aboutMe, callHistoryByCallId }: ToChatItemOptionsType + { + aboutMe, + callHistoryByCallId, + pinnedMessagesByMessageId, + }: ToChatItemOptionsType ): Promise { const conversation = window.ConversationController.get( message.conversationId @@ -1697,6 +1719,25 @@ export class BackupExportStream extends Readable { result.incoming = this.#getIncomingMessageDetails(message); } + const pinnedMessage = pinnedMessagesByMessageId[message.id]; + if (pinnedMessage != null) { + const pinnedAtTimestamp = Long.fromNumber(pinnedMessage.pinnedAt); + + let pinExpiresAtTimestamp: Long | null = null; + let pinNeverExpires: true | null = null; + if (pinnedMessage.expiresAt != null) { + pinExpiresAtTimestamp = Long.fromNumber(pinnedMessage.expiresAt); + } else { + pinNeverExpires = true; + } + + result.pinDetails = { + pinnedAtTimestamp, + pinExpiresAtTimestamp, + pinNeverExpires, + }; + } + return result; } @@ -1857,6 +1898,9 @@ export class BackupExportStream extends Readable { const sourceServiceId = message.expirationTimerUpdate?.sourceServiceId; if (conversation && isGroup(conversation.attributes)) { + patch.authorId = this.#getRecipientId({ + serviceId: options.aboutMe.aci, + }); const groupChatUpdate = new Backups.GroupChangeChatUpdate(); const timerUpdate = new Backups.GroupExpirationTimerUpdate(); @@ -1933,8 +1977,30 @@ export class BackupExportStream extends Readable { } if (isPinnedMessageNotification(message)) { - // TODO(jamie): Implement backups for pinned messages - return { kind: NonBubbleResultKind.Drop }; + let targetAuthorId: Long | null = null; + let targetSentTimestamp: Long | null = null; + + if (message.pinMessage == null) { + log.warn( + 'toChatItemUpdate/pinnedMessageNotification: pinMessage details not found', + message.id + ); + return { kind: NonBubbleResultKind.Drop }; + } + + targetSentTimestamp = Long.fromNumber( + message.pinMessage.targetSentTimestamp + ); + targetAuthorId = this.#getOrPushPrivateRecipient({ + serviceId: message.pinMessage.targetAuthorAci, + }); + + updateMessage.pinMessage = new Backups.PinMessageUpdate({ + targetSentTimestamp, + authorId: targetAuthorId, + }); + + return { kind: NonBubbleResultKind.Directionless, patch }; } if (isProfileChange(message)) { @@ -3580,3 +3646,16 @@ function toAvatarColor( return undefined; } } + +function toAppTheme(theme: ThemeType): Backups.AccountData.AppTheme { + const ENUM = Backups.AccountData.AppTheme; + + if (theme === 'light') { + return ENUM.LIGHT; + } + if (theme === 'dark') { + return ENUM.DARK; + } + + return ENUM.SYSTEM; +} diff --git a/ts/services/backups/import.preload.ts b/ts/services/backups/import.preload.ts index 7fd7e848df..1759aa2a85 100644 --- a/ts/services/backups/import.preload.ts +++ b/ts/services/backups/import.preload.ts @@ -167,6 +167,9 @@ import { itemStorage } from '../../textsecure/Storage.preload.js'; import { ChatFolderType } from '../../types/ChatFolder.std.js'; import type { ChatFolderId, ChatFolder } from '../../types/ChatFolder.std.js'; import { expiresTooSoonForBackup } from './util/expiration.std.js'; +import { getPinnedMessagesLimit } from '../../util/pinnedMessages.dom.js'; +import type { PinnedMessageParams } from '../../types/PinnedMessage.std.js'; +import type { ThemeType } from '../../util/preload.preload.js'; const { isNumber } = lodash; @@ -277,6 +280,7 @@ export class BackupImportStream extends Writable { #releaseNotesRecipientId: Long | undefined; #releaseNotesChatId: Long | undefined; #pendingGroupAvatars = new Map(); + #pinnedMessages: Array = []; #frameErrorCount: number = 0; #backupTier: BackupLevel | undefined; @@ -372,6 +376,23 @@ export class BackupImportStream extends Writable { await this.#flushConversations(); log.info(`${this.#logId}: flushed messages and conversations`); + // Save pinned messages after messages + const pinnedMessageLimit = getPinnedMessagesLimit(); + const sortedPinnedMessages = this.#pinnedMessages.toSorted((a, b) => { + return a.pinnedAt - b.pinnedAt; + }); + for (const params of sortedPinnedMessages) { + try { + // eslint-disable-next-line no-await-in-loop + await DataWriter.appendPinnedMessage(pinnedMessageLimit, params); + } catch (error) { + log.error( + `${this.#logId}: failed to append pinned message`, + Errors.toLogFormat(error) + ); + } + } + // Store sticker packs and schedule downloads await createPacksFromBackup(this.#stickerPacks); @@ -868,6 +889,10 @@ export class BackupImportStream extends Writable { await itemStorage.put('svrPin', svrPin); } + await window.Events.setThemeSetting( + toThemeSetting(accountSettings?.appTheme) + ); + if (isTestOrMockEnvironment()) { // Only relevant for tests await itemStorage.put( @@ -883,6 +908,15 @@ export class BackupImportStream extends Writable { dropNull(accountSettings?.screenLockTimeoutMinutes) ); + await itemStorage.put( + 'callsUseLessDataSetting', + accountSettings?.callsUseLessDataSetting + ); + await itemStorage.put( + 'allowSealedSenderFromAnyone', + accountSettings?.allowSealedSenderFromAnyone + ); + const autoDownload = accountSettings?.autoDownloadSettings; if (autoDownload) { const autoDownloadEnum = @@ -1748,6 +1782,32 @@ export class BackupImportStream extends Writable { chatConvo.messageCount = (chatConvo.messageCount ?? 0) + 1; } + if (item.pinDetails != null) { + strictAssert( + item.pinDetails.pinnedAtTimestamp != null, + 'pinDetails: Missing pinnedAtTimestamp' + ); + const pinnedAt = item.pinDetails.pinnedAtTimestamp.toNumber(); + + let expiresAt: number | null; + if (item.pinDetails.pinExpiresAtTimestamp != null) { + expiresAt = item.pinDetails.pinExpiresAtTimestamp.toNumber(); + } else { + strictAssert( + item.pinDetails.pinNeverExpires === true, + 'pinDetails: pinNeverExpires should be true if theres no pinExpiresAtTimestamp' + ); + expiresAt = null; + } + + this.#pinnedMessages.push({ + conversationId: chatConvo.id, + messageId: attributes.id, + pinnedAt, + expiresAt, + }); + } + await this.#updateConversation(chatConvo); } @@ -2849,6 +2909,40 @@ export class BackupImportStream extends Writable { }; } + if (updateMessage.pinMessage) { + strictAssert( + updateMessage.pinMessage.authorId != null, + 'pinMessage: Missing authorId' + ); + const targetAuthor = this.#recipientIdToConvo.get( + updateMessage.pinMessage.authorId.toNumber() + ); + strictAssert(targetAuthor != null, 'pinMessage: Missing target author'); + const targetAuthorAci = targetAuthor.serviceId; + strictAssert( + isAciString(targetAuthorAci), + 'pinMessage: Target author missing aci' + ); + + strictAssert( + updateMessage.pinMessage.targetSentTimestamp != null, + 'pinMessage: Missing targetSentTimestamp' + ); + const targetSentTimestamp = + updateMessage.pinMessage.targetSentTimestamp.toNumber(); + + return { + message: { + type: 'pinned-message-notification', + pinMessage: { + targetAuthorAci, + targetSentTimestamp, + }, + }, + additionalMessages: [], + }; + } + if (updateMessage.pollTerminate) { // TODO (DESKTOP-9282) log.warn('Skipping pollTerminate update (not yet supported)'); @@ -2867,7 +2961,7 @@ export class BackupImportStream extends Writable { } ): Promise { const { updates } = groupChange; - const { aboutMe, timestamp, author } = options; + const { aboutMe, timestamp } = options; const logId = `fromGroupUpdateMessage${timestamp}`; const details: Array = []; @@ -3380,13 +3474,9 @@ export class BackupImportStream extends Writable { if (update.groupExpirationTimerUpdate) { const { updaterAci, expiresInMs } = update.groupExpirationTimerUpdate; let sourceServiceId: AciString | undefined; - let source = author?.e164; if (Bytes.isNotEmpty(updaterAci)) { sourceServiceId = fromAciObject(Aci.fromUuidBytes(updaterAci)); - if (sourceServiceId !== author?.serviceId) { - source = undefined; - } } const expireTimer = expiresInMs @@ -3395,7 +3485,6 @@ export class BackupImportStream extends Writable { additionalMessages.push({ type: 'timer-notification', sourceServiceId, - source, flags: SignalService.DataMessage.Flags.EXPIRATION_TIMER_UPDATE, expirationTimerUpdate: { expireTimer, @@ -4150,3 +4239,18 @@ function fromAvatarColor( throw missingCaseError(color); } } + +function toThemeSetting( + theme: Backups.AccountData.AppTheme | undefined | null +): ThemeType { + const ENUM = Backups.AccountData.AppTheme; + + if (theme === ENUM.LIGHT) { + return 'light'; + } + if (theme === ENUM.DARK) { + return 'dark'; + } + + return 'system'; +} diff --git a/ts/sql/Interface.std.ts b/ts/sql/Interface.std.ts index 22c3cca155..422c5a5985 100644 --- a/ts/sql/Interface.std.ts +++ b/ts/sql/Interface.std.ts @@ -867,6 +867,10 @@ type ReadableInterface = { ) => ReactionType | undefined; _getAllReactions: () => Array; + getMessageByAuthorAciAndSentAt: ( + authorAci: AciString, + sentAtTimestamp: number + ) => MessageType | null; getMessageBySender: (options: { source?: string; sourceServiceId?: ServiceIdString; @@ -1016,6 +1020,7 @@ type ReadableInterface = { getAllMegaphones: () => ReadonlyArray; hasMegaphone: (megaphoneId: RemoteMegaphoneId) => boolean; + getAllPinnedMessages: () => ReadonlyArray; getPinnedMessagesPreloadDataForConversation: ( conversationId: string ) => ReadonlyArray; diff --git a/ts/sql/Server.node.ts b/ts/sql/Server.node.ts index eb8d9b279a..52897bd6c6 100644 --- a/ts/sql/Server.node.ts +++ b/ts/sql/Server.node.ts @@ -261,6 +261,7 @@ import { deleteExpiredChatFolders, } from './server/chatFolders.std.js'; import { + getAllPinnedMessages, getPinnedMessagesPreloadDataForConversation, getNextExpiringPinnedMessageAcrossConversations, appendPinnedMessage, @@ -447,6 +448,7 @@ export const DataReader: ServerReadableInterface = { countStoryReadsByConversation, getReactionByTimestamp, _getAllReactions, + getMessageByAuthorAciAndSentAt, getMessageBySender, getMessageById, getMessagesById, @@ -497,6 +499,7 @@ export const DataReader: ServerReadableInterface = { getAllMegaphones, hasMegaphone, + getAllPinnedMessages, getPinnedMessagesPreloadDataForConversation, getNextExpiringPinnedMessageAcrossConversations, @@ -3316,6 +3319,36 @@ function getAllMessageIds(db: ReadableDB): Array { return rows.map(row => row.id); } +function getMessageByAuthorAciAndSentAt( + db: ReadableDB, + authorAci: AciString, + sentAtTimestamp: number +): MessageType | null { + return db.transaction(() => { + const [query, params] = sql` + SELECT ${MESSAGE_COLUMNS_SELECT} + FROM messages + WHERE sourceServiceId = ${authorAci} + AND sent_at = ${sentAtTimestamp} + LIMIT 2; + `; + + const rows = db.prepare(query).all(params); + + if (rows.length > 1) { + logger.warn( + `getMessageByAuthorAciAndSentAt(${authorAci}, ${sentAtTimestamp}): More than one message found` + ); + } + + if (rows.length < 1) { + return null; + } + + return hydrateMessage(db, rows[0]); + })(); +} + function getMessageBySender( db: ReadableDB, { diff --git a/ts/sql/migrations/1630-message-pin-message-data.std.ts b/ts/sql/migrations/1630-message-pin-message-data.std.ts new file mode 100644 index 0000000000..622e868f08 --- /dev/null +++ b/ts/sql/migrations/1630-message-pin-message-data.std.ts @@ -0,0 +1,79 @@ +// Copyright 2026 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only +import type { LoggerType } from '../../types/Logging.std.js'; +import { isAciString } from '../../util/isAciString.std.js'; +import type { WritableDB } from '../Interface.std.js'; +import { sql } from '../util.std.js'; + +type Pin = Readonly<{ + pinMessageId: string; + targetAuthorAci: string | null; + targetSentTimestamp: number | null; +}>; + +function getAllPins(db: WritableDB): ReadonlyArray { + const [query, params] = sql` + SELECT + pin.id AS pinMessageId, + target.sourceServiceId AS targetAuthorAci, + target.sent_at AS targetSentTimestamp + FROM messages AS pin + LEFT JOIN messages AS target + ON pin.json ->> '$.pinnedMessageId' = target.id + WHERE pin.type IS 'pinned-message-notification' + `; + return db.prepare(query).all(params); +} + +function getReasonCannotUpdate(pin: Pin): string | null { + if (pin.targetSentTimestamp == null) { + return 'target message not found'; + } + if (pin.targetAuthorAci == null) { + return 'target message missing sourceServiceId'; + } + if (!isAciString(pin.targetAuthorAci)) { + return 'target message sourceServiceId is not aci'; + } + return null; +} + +function updatePin(db: WritableDB, pin: Pin): void { + const [query, params] = sql` + UPDATE messages + SET json = json_patch(json, ${JSON.stringify({ + pinnedMessageId: null, + pinMessage: { + targetAuthorAci: pin.targetAuthorAci, + targetSentTimestamp: pin.targetSentTimestamp, + }, + })}) + WHERE id = ${pin.pinMessageId}; + `; + db.prepare(query).run(params); +} + +function deletePin(db: WritableDB, pin: Pin) { + const [query, params] = sql` + DELETE FROM messages + WHERE id = ${pin.pinMessageId}; + `; + db.prepare(query).run(params); +} + +export default function updateToSchemaVersion1630( + db: WritableDB, + logger: LoggerType +): void { + for (const pin of getAllPins(db)) { + const reason = getReasonCannotUpdate(pin); + if (reason == null) { + updatePin(db, pin); + } else { + deletePin(db, pin); + logger.warn( + `Dropped pin message ${pin.pinMessageId} (reason: ${reason})` + ); + } + } +} diff --git a/ts/sql/migrations/index.node.ts b/ts/sql/migrations/index.node.ts index 880b51d7ee..7c75ef85aa 100644 --- a/ts/sql/migrations/index.node.ts +++ b/ts/sql/migrations/index.node.ts @@ -139,6 +139,7 @@ import updateToSchemaVersion1590 from './1590-megaphones.std.js'; import updateToSchemaVersion1600 from './1600-deduplicate-usernames.std.js'; import updateToSchemaVersion1610 from './1610-has-contacts.std.js'; import updateToSchemaVersion1620 from './1620-sort-bigger-media.std.js'; +import updateToSchemaVersion1630 from './1630-message-pin-message-data.std.js'; import { DataWriter } from '../Server.node.js'; @@ -1638,6 +1639,7 @@ export const SCHEMA_VERSIONS: ReadonlyArray = [ { version: 1600, update: updateToSchemaVersion1600 }, { version: 1610, update: updateToSchemaVersion1610 }, { version: 1620, update: updateToSchemaVersion1620 }, + { version: 1630, update: updateToSchemaVersion1630 }, ]; export class DBVersionFromFutureError extends Error { diff --git a/ts/sql/server/pinnedMessages.std.ts b/ts/sql/server/pinnedMessages.std.ts index a36fe48116..639900513b 100644 --- a/ts/sql/server/pinnedMessages.std.ts +++ b/ts/sql/server/pinnedMessages.std.ts @@ -46,6 +46,16 @@ function _getPinnedMessagePreloadData( return { pinnedMessage, message }; } +export function getAllPinnedMessages( + db: ReadableDB +): ReadonlyArray { + const [query, params] = sql` + SELECT * FROM pinnedMessages; + `; + + return db.prepare(query).all(params); +} + export function getPinnedMessagesPreloadDataForConversation( db: ReadableDB, conversationId: string diff --git a/ts/state/ducks/composer.preload.ts b/ts/state/ducks/composer.preload.ts index b2acd42693..20292c1e87 100644 --- a/ts/state/ducks/composer.preload.ts +++ b/ts/state/ducks/composer.preload.ts @@ -24,7 +24,10 @@ import { DataReader, DataWriter } from '../../sql/Client.preload.js'; import type { BoundActionCreatorsMapObject } from '../../hooks/useBoundActions.std.js'; import type { DraftBodyRanges } from '../../types/BodyRange.std.js'; import type { LinkPreviewForUIType } from '../../types/message/LinkPreviews.std.js'; -import type { ReadonlyMessageAttributesType } from '../../model-types.d.ts'; +import type { + PinMessageData, + ReadonlyMessageAttributesType, +} from '../../model-types.d.ts'; import type { NoopActionType } from './noop.std.js'; import type { ShowToastActionType } from './toast.preload.js'; import type { StateType as RootStateType } from '../reducer.preload.js'; @@ -384,10 +387,13 @@ function scrollToQuotedMessage({ } function scrollToPinnedMessage( - pinnedMessageId: string + pinMessage: PinMessageData ): StateThunk { return async (dispatch, getState) => { - const pinnedMessage = await getMessageById(pinnedMessageId); + const pinnedMessage = await DataReader.getMessageByAuthorAciAndSentAt( + pinMessage.targetAuthorAci, + pinMessage.targetSentTimestamp + ); if (!pinnedMessage) { dispatch( @@ -399,13 +405,12 @@ function scrollToPinnedMessage( } const selectedConversationId = getSelectedConversationId(getState()); - const pinnedMessageConversationId = pinnedMessage.get('conversationId'); - if (selectedConversationId !== pinnedMessageConversationId) { + if (selectedConversationId !== pinnedMessage.conversationId) { return; } - dispatch(scrollToMessage(pinnedMessageConversationId, pinnedMessageId)); + dispatch(scrollToMessage(pinnedMessage.conversationId, pinnedMessage.id)); }; } diff --git a/ts/state/ducks/conversations.preload.ts b/ts/state/ducks/conversations.preload.ts index 37b20b19f2..12b8827fa0 100644 --- a/ts/state/ducks/conversations.preload.ts +++ b/ts/state/ducks/conversations.preload.ts @@ -5219,7 +5219,10 @@ function onPinnedMessageAdd( drop(pinnedMessagesCleanupService.trigger('onPinnedMessageAdd')); await targetConversation.addNotification('pinned-message-notification', { - pinnedMessageId: targetMessageId, + pinMessage: { + targetSentTimestamp: target.targetSentTimestamp, + targetAuthorAci: target.targetAuthorAci, + }, sourceServiceId: itemStorage.user.getCheckedAci(), }); diff --git a/ts/state/selectors/message.preload.ts b/ts/state/selectors/message.preload.ts index a454d1dd38..3ffa41aa0e 100644 --- a/ts/state/selectors/message.preload.ts +++ b/ts/state/selectors/message.preload.ts @@ -1747,10 +1747,10 @@ export function getPropsForPinnedMessageNotification( message: MessageWithUIFieldsType, { conversationSelector }: GetPropsForBubbleOptions ): PinnedMessageNotificationData { - strictAssert(message.pinnedMessageId, 'Missing pinnedMessageId'); + strictAssert(message.pinMessage, 'Missing pinMessage'); return { sender: conversationSelector(message.sourceServiceId), - pinnedMessageId: message.pinnedMessageId, + pinMessage: message.pinMessage, }; } diff --git a/ts/test-electron/backup/backup_groupv2_notifications_test.preload.ts b/ts/test-electron/backup/backup_groupv2_notifications_test.preload.ts index e6417195a1..e0ca2f3111 100644 --- a/ts/test-electron/backup/backup_groupv2_notifications_test.preload.ts +++ b/ts/test-electron/backup/backup_groupv2_notifications_test.preload.ts @@ -2033,7 +2033,6 @@ describe('backup/groupv2/notifications', () => { readStatus: ReadStatus.Read, seenStatus: SeenStatus.Seen, sourceServiceId: CONTACT_A, - source: CONTACT_A_E164, }; counter += 1; @@ -2052,7 +2051,6 @@ describe('backup/groupv2/notifications', () => { readStatus: ReadStatus.Read, seenStatus: SeenStatus.Seen, sourceServiceId: CONTACT_A, - source: CONTACT_A_E164, }; const messages: Array = [ diff --git a/ts/test-electron/backup/integration_test.preload.ts b/ts/test-electron/backup/integration_test.preload.ts index e6ac4653d7..4c211c8898 100644 --- a/ts/test-electron/backup/integration_test.preload.ts +++ b/ts/test-electron/backup/integration_test.preload.ts @@ -10,7 +10,7 @@ import { ComparableBackup, Purpose, } from '@signalapp/libsignal-client/dist/MessageBackup.js'; -import { assert } from 'chai'; +import assert from 'node:assert/strict'; import { clearData } from './helpers.preload.js'; import { loadAllAndReinitializeRedux } from '../../services/allLoaders.preload.js'; @@ -87,8 +87,13 @@ describe('backup/integration', () => { return; } - // We need "deep*" for fancy diffs - assert.deepStrictEqual(actualString, expectedString); + if (actualString !== expectedString) { + const actualJson = JSON.parse(actualString); + const expectedJson = JSON.parse(expectedString); + + // parsing as json produces a more detailed diff + assert.deepEqual(actualJson, expectedJson); + } }); } }); diff --git a/ts/test-node/sql/migration_1630_test.node.ts b/ts/test-node/sql/migration_1630_test.node.ts new file mode 100644 index 0000000000..7be5205e0f --- /dev/null +++ b/ts/test-node/sql/migration_1630_test.node.ts @@ -0,0 +1,162 @@ +// Copyright 2025 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only + +import { assert } from 'chai'; +import { v4 as generateUuid } from 'uuid'; +import type { WritableDB } from '../../sql/Interface.std.js'; +import { + createDB, + getTableData, + insertData, + updateToVersion, +} from './helpers.node.js'; + +type MessageRow = Readonly<{ + type: 'incoming' | 'pinned-message-notification'; + id: string; + sent_at: number; + sourceServiceId: string | null; + json: { + pinnedMessageId?: string; + pinMessage?: { + targetAuthorAci: string; + targetSentTimestamp: number; + }; + }; +}>; + +describe('SQL/updateToSchemaVersion1630', () => { + let db: WritableDB; + + beforeEach(() => { + db = createDB(); + updateToVersion(db, 1620); + }); + afterEach(() => { + db.close(); + }); + + function check( + input: ReadonlyArray, + expected: ReadonlyArray + ) { + insertData(db, 'messages', input); + updateToVersion(db, 1630); + + const result = getTableData(db, 'messages').map(row => { + return { + id: row.id ?? null, + type: row.type ?? null, + sent_at: row.sent_at ?? null, + sourceServiceId: row.sourceServiceId ?? null, + json: row.json ?? null, + } as MessageRow; + }); + + const actual = result.toSorted((a, b) => a.sent_at - b.sent_at); + + assert.deepStrictEqual(actual, expected); + } + + it('replaces pinnedMessageId with pinMessage data', () => { + const targetMessageId = '1-target'; + const targetAuthorAci = generateUuid(); + const targetSentTimestamp = 1000; + + const target: MessageRow = { + id: targetMessageId, + type: 'incoming', + sent_at: targetSentTimestamp, + sourceServiceId: targetAuthorAci, + json: {}, + }; + + const pinBefore: MessageRow = { + id: '2-pin', + type: 'pinned-message-notification', + sent_at: 2000, + sourceServiceId: null, + json: { pinnedMessageId: targetMessageId }, + }; + + const pinAfter: MessageRow = { + id: '2-pin', + type: 'pinned-message-notification', + sent_at: 2000, + sourceServiceId: null, + json: { + pinMessage: { targetAuthorAci, targetSentTimestamp }, + }, + }; + + check([target, pinBefore], [target, pinAfter]); + }); + + it('drops the pinned message when target message sourceServiceId is null', () => { + const targetMessageId = '1-target'; + + const target: MessageRow = { + id: targetMessageId, + type: 'incoming', + sent_at: 1000, + sourceServiceId: null, + json: {}, + }; + + const pinBefore: MessageRow = { + id: '2-pin', + type: 'pinned-message-notification', + sent_at: 2000, + sourceServiceId: null, + json: { pinnedMessageId: targetMessageId }, + }; + + check([target, pinBefore], [target]); // dropped + }); + + it('drops the pinned message when target message sourceServiceId is not an aci', () => { + const targetMessageId = '1-target'; + + const target: MessageRow = { + id: targetMessageId, + type: 'incoming', + sent_at: 1000, + sourceServiceId: 'not-a-valid-aci', + json: {}, + }; + + const pinBefore: MessageRow = { + id: '2-pin', + type: 'pinned-message-notification', + sent_at: 2000, + sourceServiceId: null, + json: { pinnedMessageId: targetMessageId }, + }; + + check([target, pinBefore], [target]); // dropped + }); + + it('drops the pinned message when target message does not exist', () => { + const pinBefore: MessageRow = { + id: 'pin', + type: 'pinned-message-notification', + sent_at: 2000, + sourceServiceId: null, + json: { pinnedMessageId: 'TARGET_MESSAGE_DOES_NOT_EXIST' }, + }; + + check([pinBefore], []); + }); + + it('drops the pinned message when it is missing a pinnedMessageId', () => { + const pinBefore: MessageRow = { + id: 'pin', + type: 'pinned-message-notification', + sent_at: 2000, + sourceServiceId: null, + json: {}, + }; + + check([pinBefore], []); + }); +}); diff --git a/ts/types/Message.std.ts b/ts/types/Message.std.ts index 1d165adb01..eb1ae6191b 100644 --- a/ts/types/Message.std.ts +++ b/ts/types/Message.std.ts @@ -170,7 +170,7 @@ const messageAttrsToErase = [ 'messageTimer', 'payment', 'phoneNumberDiscovery', - 'pinnedMessageId', + 'pinMessage', 'poll', 'pollTerminateNotification', 'preview', diff --git a/ts/types/Storage.d.ts b/ts/types/Storage.d.ts index 7691c92626..61fb2b0973 100644 --- a/ts/types/Storage.d.ts +++ b/ts/types/Storage.d.ts @@ -260,6 +260,8 @@ export type StorageAccessType = { documents: number; }; androidSpecificSettings: unknown; + callsUseLessDataSetting: unknown; + allowSealedSenderFromAnyone: unknown; postRegistrationSyncsStatus: 'incomplete' | 'complete'; From 897c051c99a3cd264293e7be65d7843cb42912c4 Mon Sep 17 00:00:00 2001 From: Jamie <113370520+jamiebuilds-signal@users.noreply.github.com> Date: Tue, 13 Jan 2026 10:12:10 -0800 Subject: [PATCH 10/49] Add expiration timer to pinned message notification --- ts/background.preload.ts | 2 ++ ts/messageModifiers/PinnedMessages.preload.ts | 7 +++-- ts/models/conversations.preload.ts | 31 +++++++++++++++++++ ts/sql/Server.node.ts | 17 ++++------ ts/state/ducks/conversations.preload.ts | 6 ++-- ts/types/Message2.preload.ts | 15 +-------- 6 files changed, 49 insertions(+), 29 deletions(-) diff --git a/ts/background.preload.ts b/ts/background.preload.ts index dc0a10a1e1..cde3da358a 100644 --- a/ts/background.preload.ts +++ b/ts/background.preload.ts @@ -2493,6 +2493,7 @@ export async function startApp(): Promise { targetAuthorAci: data.message.pinMessage.targetAuthorAci, pinDuration: data.message.pinMessage.pinDuration, pinnedByAci: data.sourceAci, + sentAtTimestamp: data.timestamp, receivedAtTimestamp: data.receivedAtDate, }); confirm(); @@ -3000,6 +3001,7 @@ export async function startApp(): Promise { targetAuthorAci: data.message.pinMessage.targetAuthorAci, pinDuration: data.message.pinMessage.pinDuration, pinnedByAci: sourceServiceId, + sentAtTimestamp: data.timestamp, receivedAtTimestamp: data.receivedAtDate, }); confirm(); diff --git a/ts/messageModifiers/PinnedMessages.preload.ts b/ts/messageModifiers/PinnedMessages.preload.ts index 0315b1d920..c7a583b9c5 100644 --- a/ts/messageModifiers/PinnedMessages.preload.ts +++ b/ts/messageModifiers/PinnedMessages.preload.ts @@ -27,6 +27,7 @@ export type PinnedMessageAddProps = Readonly<{ targetAuthorAci: AciString; pinDuration: DurationInSeconds | null; pinnedByAci: AciString; + sentAtTimestamp: number; receivedAtTimestamp: number; }>; @@ -115,12 +116,14 @@ export async function onPinnedMessageAdd( drop(pinnedMessagesCleanupService.trigger('onPinnedMessageAdd')); if (result.change?.inserted) { - await targetConversation.addNotification('pinned-message-notification', { + await targetConversation.addPinnedMessageNotification({ pinMessage: { targetSentTimestamp: props.targetSentTimestamp, targetAuthorAci: props.targetAuthorAci, }, - sourceServiceId: props.pinnedByAci, + senderAci: props.pinnedByAci, + sentAtTimestamp: props.sentAtTimestamp, + receivedAtTimestamp: props.receivedAtTimestamp, }); } diff --git a/ts/models/conversations.preload.ts b/ts/models/conversations.preload.ts index 4cab3357f4..3876a624fc 100644 --- a/ts/models/conversations.preload.ts +++ b/ts/models/conversations.preload.ts @@ -12,6 +12,7 @@ import type { ConversationLastProfileType, ConversationRenderInfoType, MessageAttributesType, + PinMessageData, QuotedMessageType, SenderKeyInfoType, SettableConversationAttributesType, @@ -3561,6 +3562,36 @@ export class ConversationModel { await maybeNotify({ message: message.attributes, conversation: this }); } + async addPinnedMessageNotification(params: { + pinMessage: PinMessageData; + senderAci: AciString; + sentAtTimestamp: number; + receivedAtTimestamp: number; + }): Promise { + const ourAci = itemStorage.user.getCheckedAci(); + const senderIsMe = params.senderAci === ourAci; + + const message = new MessageModel({ + ...generateMessageId(incrementMessageCounter()), + conversationId: this.id, + type: 'pinned-message-notification', + sent_at: params.sentAtTimestamp, + received_at_ms: params.receivedAtTimestamp, + timestamp: params.sentAtTimestamp, + readStatus: senderIsMe ? ReadStatus.Read : ReadStatus.Unread, + seenStatus: senderIsMe ? SeenStatus.Seen : SeenStatus.Unseen, + sourceServiceId: params.senderAci, + expireTimer: this.get('expireTimer'), + expirationStartTimestamp: senderIsMe ? params.sentAtTimestamp : null, + pinMessage: params.pinMessage, + }); + + await window.MessageCache.saveMessage(message, { forceSave: true }); + window.MessageCache.register(message); + + drop(this.onNewMessage(message)); + } + async addNotification( type: MessageAttributesType['type'], extra: Partial = {} diff --git a/ts/sql/Server.node.ts b/ts/sql/Server.node.ts index 52897bd6c6..83545f841b 100644 --- a/ts/sql/Server.node.ts +++ b/ts/sql/Server.node.ts @@ -3462,7 +3462,7 @@ function getUnreadByConversationAndMarkRead( WHERE conversationId = ${conversationId} AND ${storyReplyFilter} AND - type IN ('incoming', 'poll-terminate') AND + type IS NOT 'outgoing' AND hasExpireTimer IS 1 AND received_at <= ${readMessageReceivedAt} `; @@ -5901,16 +5901,11 @@ function getMessagesUnexpectedlyMissingExpirationStartTimestamp( INDEXED BY messages_unexpectedly_missing_expiration_start_timestamp WHERE expireTimer > 0 AND - expirationStartTimestamp IS NULL AND - ( - type IS 'outgoing' OR - (type IS 'incoming' AND ( - readStatus = ${ReadStatus.Read} OR - readStatus = ${ReadStatus.Viewed} OR - readStatus IS NULL - )) OR - (type IS 'poll-terminate') - ); + expirationStartTimestamp IS NULL AND ( + readStatus = ${ReadStatus.Read} OR + readStatus = ${ReadStatus.Viewed} OR + readStatus IS NULL + ) ` ) .all(); diff --git a/ts/state/ducks/conversations.preload.ts b/ts/state/ducks/conversations.preload.ts index 12b8827fa0..ac9c006f20 100644 --- a/ts/state/ducks/conversations.preload.ts +++ b/ts/state/ducks/conversations.preload.ts @@ -5218,12 +5218,14 @@ function onPinnedMessageAdd( }); drop(pinnedMessagesCleanupService.trigger('onPinnedMessageAdd')); - await targetConversation.addNotification('pinned-message-notification', { + await targetConversation.addPinnedMessageNotification({ pinMessage: { targetSentTimestamp: target.targetSentTimestamp, targetAuthorAci: target.targetAuthorAci, }, - sourceServiceId: itemStorage.user.getCheckedAci(), + senderAci: itemStorage.user.getCheckedAci(), + sentAtTimestamp: pinnedAt, + receivedAtTimestamp: pinnedAt, }); dispatch(onPinnedMessagesChanged(target.conversationId)); diff --git a/ts/types/Message2.preload.ts b/ts/types/Message2.preload.ts index 41180b8622..46e99fb633 100644 --- a/ts/types/Message2.preload.ts +++ b/ts/types/Message2.preload.ts @@ -251,7 +251,7 @@ export const _withSchemaVersion = ({ upgradedMessage = await upgrade(message, context); } catch (error) { logger.error( - `Message._withSchemaVersion: error updating message ${message.id}, + `Message._withSchemaVersion: error updating message ${message.id}, attempt ${message.schemaMigrationAttempts}:`, Errors.toLogFormat(error) ); @@ -1121,20 +1121,7 @@ export async function migrateBodyAttachmentToDisk( export const isUserMessage = (message: MessageAttributesType): boolean => message.type === 'incoming' || message.type === 'outgoing'; -// NB: if adding more expiring message types, be sure to also update -// getUnreadByConversationAndMarkRead & -// getMessagesUnexpectedlyMissingExpirationStartTimestamp -export const EXPIRING_MESSAGE_TYPES = new Set([ - 'incoming', - 'outgoing', - 'poll-terminate', -]); - export const isExpiringMessage = (message: MessageAttributesType): boolean => { - if (!EXPIRING_MESSAGE_TYPES.has(message.type)) { - return false; - } - const { expireTimer } = message; return typeof expireTimer === 'number' && expireTimer > 0; From 078cce6b1047148c65d769fa8db565ac11dfa70b Mon Sep 17 00:00:00 2001 From: ayumi-signal <143036029+ayumi-signal@users.noreply.github.com> Date: Tue, 13 Jan 2026 11:27:46 -0800 Subject: [PATCH 11/49] Fix raised hand count showing 0 --- ts/components/CallScreen.dom.stories.tsx | 2 +- ts/components/CallingRaisedHandsList.dom.tsx | 37 ++++++++++++++++---- ts/util/lint/exceptions.json | 16 +++++++++ 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/ts/components/CallScreen.dom.stories.tsx b/ts/components/CallScreen.dom.stories.tsx index 376301aa63..48f3a58105 100644 --- a/ts/components/CallScreen.dom.stories.tsx +++ b/ts/components/CallScreen.dom.stories.tsx @@ -960,7 +960,7 @@ export function GroupCallSuggestLowerHand(): React.JSX.Element { // are raised function useHandRaiser( activeCall: ActiveGroupCallType, - frequency = 3000, + frequency = 2000, min = 0, max = 5 ) { diff --git a/ts/components/CallingRaisedHandsList.dom.tsx b/ts/components/CallingRaisedHandsList.dom.tsx index 1e6b187246..445a045eff 100644 --- a/ts/components/CallingRaisedHandsList.dom.tsx +++ b/ts/components/CallingRaisedHandsList.dom.tsx @@ -1,7 +1,7 @@ // Copyright 2023 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only -import React from 'react'; +import React, { useEffect, useRef } from 'react'; import { animated, useSpring } from '@react-spring/web'; import { Avatar, AvatarSize } from './Avatar.dom.js'; @@ -205,9 +205,16 @@ export function CallingRaisedHandsListButton({ syncedLocalHandRaised, syncedLocalHandRaised ); + const prevShownRaisedHandsCountRef = useRef(raisedHandsCount); + const prevShownSyncedLocalHandRaisedRef = useRef( + syncedLocalHandRaised + ); - React.useEffect(() => { - if (raisedHandsCount > prevRaisedHandsCount) { + useEffect(() => { + if ( + raisedHandsCount > prevRaisedHandsCount || + (raisedHandsCount > 0 && !isVisible) + ) { setIsVisible(true); opacitySpringApi.stop(); drop(Promise.all(opacitySpringApi.start({ opacity: 1 }))); @@ -237,6 +244,7 @@ export function CallingRaisedHandsListButton({ ); } }, [ + isVisible, raisedHandsCount, prevRaisedHandsCount, opacitySpringApi, @@ -244,6 +252,18 @@ export function CallingRaisedHandsListButton({ setIsVisible, ]); + useEffect(() => { + if (isVisible && raisedHandsCount === 0 && prevRaisedHandsCount > 0) { + prevShownRaisedHandsCountRef.current = prevRaisedHandsCount; + prevShownSyncedLocalHandRaisedRef.current = prevSyncedLocalHandRaised; + } + }, [ + isVisible, + prevRaisedHandsCount, + prevSyncedLocalHandRaised, + raisedHandsCount, + ]); + if (!isVisible) { return null; } @@ -252,9 +272,14 @@ export function CallingRaisedHandsListButton({ // abrupt label changes. let shownSyncedLocalHandRaised: boolean = syncedLocalHandRaised; let shownRaisedHandsCount: number = raisedHandsCount; - if (raisedHandsCount === 0 && prevRaisedHandsCount) { - shownRaisedHandsCount = prevRaisedHandsCount; - shownSyncedLocalHandRaised = prevSyncedLocalHandRaised; + if (raisedHandsCount === 0) { + if (prevRaisedHandsCount > 0) { + shownRaisedHandsCount = prevRaisedHandsCount; + shownSyncedLocalHandRaised = prevSyncedLocalHandRaised; + } else { + shownRaisedHandsCount = prevShownRaisedHandsCountRef.current; + shownSyncedLocalHandRaised = prevShownSyncedLocalHandRaisedRef.current; + } } return ( diff --git a/ts/util/lint/exceptions.json b/ts/util/lint/exceptions.json index 907b39be68..827808cd4a 100644 --- a/ts/util/lint/exceptions.json +++ b/ts/util/lint/exceptions.json @@ -1050,6 +1050,22 @@ "reasonCategory": "usageTrusted", "updated": "2025-12-30T20:46:48.849Z" }, + { + "rule": "React-useRef", + "path": "ts/components/CallingRaisedHandsList.dom.tsx", + "line": " const prevShownRaisedHandsCountRef = useRef(raisedHandsCount);", + "reasonCategory": "usageTrusted", + "updated": "2026-01-09T21:23:45.188Z", + "reasonDetail": "Maintain last shown raised hand count to prevent 0" + }, + { + "rule": "React-useRef", + "path": "ts/components/CallingRaisedHandsList.dom.tsx", + "line": " const prevShownSyncedLocalHandRaisedRef = useRef(", + "reasonCategory": "usageTrusted", + "updated": "2026-01-09T21:23:45.188Z", + "reasonDetail": "Maintain last shown raised hands to prevent 0" + }, { "rule": "React-useRef", "path": "ts/components/CallingToast.dom.tsx", From a27a87a934f90b9d765ca659c830099e7bff0e5b Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Wed, 14 Jan 2026 05:46:09 +1000 Subject: [PATCH 12/49] sendToGroup: Move to libsignal typed API --- ts/RemoteConfig.dom.ts | 2 + ts/textsecure/SocketManager.preload.ts | 9 +- ts/textsecure/WebAPI.preload.ts | 67 +++++++- ts/util/sendToGroup.preload.ts | 208 +++++++++++++++++++++---- 4 files changed, 250 insertions(+), 36 deletions(-) diff --git a/ts/RemoteConfig.dom.ts b/ts/RemoteConfig.dom.ts index 21eb03b54f..a16544d52e 100644 --- a/ts/RemoteConfig.dom.ts +++ b/ts/RemoteConfig.dom.ts @@ -31,6 +31,8 @@ const SemverKeys = [ 'desktop.pinnedMessages.send.prod', 'desktop.plaintextExport.beta', 'desktop.plaintextExport.prod', + 'desktop.retireAccessKeyGroupSend.beta', + 'desktop.retireAccessKeyGroupSend.prod', ] as const; export type SemverKeyType = (typeof SemverKeys)[number]; diff --git a/ts/textsecure/SocketManager.preload.ts b/ts/textsecure/SocketManager.preload.ts index da98a0507f..343a4cdd39 100644 --- a/ts/textsecure/SocketManager.preload.ts +++ b/ts/textsecure/SocketManager.preload.ts @@ -15,7 +15,10 @@ import EventListener from 'node:events'; import type { IncomingMessage } from 'node:http'; import { setTimeout as sleep } from 'node:timers/promises'; -import type { UnauthUsernamesService } from '@signalapp/libsignal-client/dist/net'; +import type { + UnauthMessagesService, + UnauthUsernamesService, +} from '@signalapp/libsignal-client/dist/net'; import { strictAssert } from '../util/assert.std.js'; import { explodePromise } from '../util/explodePromise.std.js'; @@ -431,7 +434,9 @@ export class SocketManager extends EventListener { }).getResult(); } - public async getUnauthenticatedLibsignalApi(): Promise { + public async getUnauthenticatedLibsignalApi(): Promise< + UnauthUsernamesService & UnauthMessagesService + > { const resource = await this.#getUnauthenticatedResource(); return resource.libsignalWebsocket; } diff --git a/ts/textsecure/WebAPI.preload.ts b/ts/textsecure/WebAPI.preload.ts index 7cf6fce973..41fdb682d5 100644 --- a/ts/textsecure/WebAPI.preload.ts +++ b/ts/textsecure/WebAPI.preload.ts @@ -15,6 +15,7 @@ import { v4 as getGuid } from 'uuid'; import { z } from 'zod'; import type { Readable } from 'node:stream'; import qs from 'node:querystring'; +import { LibSignalErrorBase, ErrorCode } from '@signalapp/libsignal-client'; import type { KEMPublicKey, PublicKey, @@ -22,6 +23,7 @@ import type { Pni, } from '@signalapp/libsignal-client'; import { AccountAttributes } from '@signalapp/libsignal-client/dist/net.js'; +import { GroupSendFullToken } from '@signalapp/libsignal-client/zkgroup.js'; import { assertDev, strictAssert } from '../util/assert.std.js'; import * as durations from '../util/durations/index.std.js'; @@ -58,6 +60,7 @@ import { serviceIdSchema, aciSchema, untaggedPniSchema, + fromServiceIdObject, } from '../types/ServiceId.std.js'; import type { BackupPresentationHeadersType } from '../types/backups.node.js'; import { HTTPError } from '../types/HTTPError.std.js'; @@ -295,6 +298,9 @@ export const multiRecipient200ResponseSchema = z.object({ export type MultiRecipient200ResponseType = z.infer< typeof multiRecipient200ResponseSchema >; +export type SendMultiResponseType = { + uuids404: Array; +}; export const multiRecipient409ResponseSchema = z.array( z.object({ @@ -642,11 +648,16 @@ async function _retry( try { return await f(); } catch (e) { + const httpNoNetwork = e instanceof HTTPError && e.code === -1; + const libsignalNoNetwork = + e instanceof LibSignalErrorBase && + (e.code === ErrorCode.IoError || + e.code === ErrorCode.ChatServiceInactive); + if ( - e instanceof HTTPError && - e.code === -1 && count < limit && - !abortSignal?.aborted + !abortSignal?.aborted && + (httpNoNetwork || libsignalNoNetwork) ) { return new Promise(resolve => { setTimeout(() => { @@ -3583,7 +3594,51 @@ function booleanToString(value: boolean | undefined): string { return value ? 'true' : 'false'; } -export async function sendWithSenderKey( +export async function sendMulti( + payload: Uint8Array, + groupSendToken: GroupSendToken | null, + timestamp: number, + { + online = false, + urgent = true, + story = false, + }: { + online?: boolean; + story?: boolean; + urgent?: boolean; + } +): Promise { + log.info(`send/${timestamp}//sendMulti`); + + let auth: 'story' | GroupSendFullToken; + if (story) { + if (groupSendToken?.length) { + log.warn('sendMulti: story=true and groupSendToken was provided'); + } + auth = 'story'; + } else if (groupSendToken?.length) { + auth = new GroupSendFullToken(groupSendToken); + } else { + throw new Error('sendMulti: missing groupSendToken and story=false'); + } + + const result = await _retry(async () => { + const chat = await socketManager.getUnauthenticatedLibsignalApi(); + return chat.sendMultiRecipientMessage({ + payload, + timestamp, + auth, + onlineOnly: online, + urgent, + }); + }); + + return { + uuids404: result.unregisteredIds.map(fromServiceIdObject), + }; +} + +export async function sendMultiLegacy( data: Uint8Array, accessKeys: Uint8Array | null, groupSendToken: GroupSendToken | null, @@ -3602,7 +3657,7 @@ export async function sendWithSenderKey( const urgentParam = `&urgent=${booleanToString(urgent)}`; const storyParam = `&story=${booleanToString(story)}`; - log.info(`send/${timestamp}//sendWithSenderKey`); + log.info(`send/${timestamp}//sendMultiLegacy`); const response = await _ajax({ host: 'chatService', call: 'multiRecipient', @@ -3626,7 +3681,7 @@ export async function sendWithSenderKey( } log.error( - 'invalid response from sendWithSenderKey', + 'sendMultiLegacy: invalid response from server', toLogFormat(parseResult.error) ); return response as MultiRecipient200ResponseType; diff --git a/ts/util/sendToGroup.preload.ts b/ts/util/sendToGroup.preload.ts index 7496a569b6..02e3041f34 100644 --- a/ts/util/sendToGroup.preload.ts +++ b/ts/util/sendToGroup.preload.ts @@ -14,6 +14,10 @@ import { SenderCertificate, UnidentifiedSenderMessageContent, } from '@signalapp/libsignal-client'; +import type { + MismatchedDevicesError, + RateLimitedError, +} from '@signalapp/libsignal-client'; import { signalProtocolStore, GLOBAL_ZONE, @@ -31,7 +35,7 @@ import * as Errors from '../types/errors.std.js'; import { DataWriter } from '../sql/Client.preload.js'; import { getValue } from '../RemoteConfig.dom.js'; import type { ServiceIdString } from '../types/ServiceId.std.js'; -import { ServiceIdKind } from '../types/ServiceId.std.js'; +import { fromServiceIdObject, ServiceIdKind } from '../types/ServiceId.std.js'; import * as Bytes from '../Bytes.std.js'; import { isRecord } from './isRecord.std.js'; @@ -70,12 +74,13 @@ import { SEALED_SENDER, ZERO_ACCESS_KEY } from '../types/SealedSender.std.js'; import { HTTPError } from '../types/HTTPError.std.js'; import { parseIntOrThrow } from './parseIntOrThrow.std.js'; import { - sendWithSenderKey, getKeysForServiceId as doGetKeysForServiceId, getKeysForServiceIdUnauth as doGetKeysForServiceIdUnauth, multiRecipient200ResponseSchema, multiRecipient409ResponseSchema, multiRecipient410ResponseSchema, + sendMulti, + sendMultiLegacy, } from '../textsecure/WebAPI.preload.js'; import { SignalService as Proto } from '../protobuf/index.std.js'; @@ -91,6 +96,7 @@ import type { GroupSendToken } from '../types/GroupSendEndorsements.std.js'; import { isAciString } from './isAciString.std.js'; import { safeParseStrict, safeParseUnknown } from './schemas.std.js'; import { itemStorage } from '../textsecure/Storage.preload.js'; +import { isFeaturedEnabledNoRedux } from './isFeatureEnabled.dom.js'; const { differenceWith, omit } = lodash; @@ -301,9 +307,14 @@ export async function sendToGroupViaSenderKey( urgent, } = options; + const isAccessKeySendRetired = isFeaturedEnabledNoRedux({ + betaKey: 'desktop.retireAccessKeyGroupSend.beta', + prodKey: 'desktop.retireAccessKeyGroupSend.prod', + }); + const logId = `sendToGroupViaSenderKey/${sendTarget.idForLogging()}`; log.info( - `${logId}: Starting ${timestamp}, recursion count ${recursion.count}, reason: ${recursion.reason}...` + `${logId}: Starting ${timestamp}, recursion count ${recursion.count}, reason: ${recursion.reason}, accessKeyRetired: ${isAccessKeySendRetired}...` ); if (recursion.count > MAX_RECURSION) { @@ -537,10 +548,16 @@ export async function sendToGroupViaSenderKey( groupSendToken = groupSendEndorsementState.buildToken( new Set(senderKeyRecipients) ); - } else { + } else if (!isAccessKeySendRetired) { accessKeys = getXorOfAccessKeys(devicesForSenderKey, { story }); } + if (isAccessKeySendRetired && !groupSendToken && !story) { + throw new Error( + 'sendToGroup: missing groupSendToken and story=false. Failing over.' + ); + } + try { const messageBuffer = await encryptForSenderKey({ contentHint, @@ -550,35 +567,50 @@ export async function sendToGroupViaSenderKey( groupId, }); - const result = await sendWithSenderKey( - messageBuffer, - accessKeys, - groupSendToken, - timestamp, - { online, story, urgent } - ); - - const parsed = safeParseStrict(multiRecipient200ResponseSchema, result); - if (parsed.success) { - const { uuids404 } = parsed.data; - if (uuids404 && uuids404.length > 0) { + if (isAccessKeySendRetired) { + const result = await sendMulti(messageBuffer, groupSendToken, timestamp, { + online, + story, + urgent, + }); + if (result.uuids404.length > 0) { await waitForAll({ - tasks: uuids404.map( + tasks: result.uuids404.map( serviceId => async () => markServiceIdUnregistered(serviceId) ), }); } - - senderKeyRecipientsWithDevices = omit( - senderKeyRecipientsWithDevices, - uuids404 || [] - ); } else { - log.error( - `${logId}: Server returned unexpected 200 response ${JSON.stringify( - parsed.error.flatten() - )}` + const result = await sendMultiLegacy( + messageBuffer, + accessKeys, + groupSendToken, + timestamp, + { online, story, urgent } ); + + const parsed = safeParseStrict(multiRecipient200ResponseSchema, result); + if (parsed.success) { + const { uuids404 } = parsed.data; + if (uuids404 && uuids404.length > 0) { + await waitForAll({ + tasks: uuids404.map( + serviceId => async () => markServiceIdUnregistered(serviceId) + ), + }); + } + + senderKeyRecipientsWithDevices = omit( + senderKeyRecipientsWithDevices, + uuids404 || [] + ); + } else { + log.error( + `${logId}: Server returned unexpected 200 response ${JSON.stringify( + parsed.error.flatten() + )}` + ); + } } if (shouldSaveProto(sendType)) { @@ -597,6 +629,126 @@ export async function sendToGroupViaSenderKey( ); } } catch (error) { + if (error instanceof LibSignalErrorBase) { + if (error.code === ErrorCode.RequestUnauthorized) { + throw new HTTPError('libsignal threw RequestUnauthorized', { + code: 401, + headers: {}, + }); + } + if (error.code === ErrorCode.ChatServiceInactive) { + throw new HTTPError('libsignal threw ChatServiceInactive', { + code: -1, + headers: {}, + }); + } + if (error.code === ErrorCode.IoError) { + throw new HTTPError('libsignal threw IoError', { + code: -1, + headers: {}, + }); + } + if (error.code === ErrorCode.RateLimitedError) { + const rateLimitedError = error as unknown as RateLimitedError; + const { retryAfterSecs } = rateLimitedError; + throw new HTTPError( + `libsignal threw RateLimitedError with retryAfterSecs=${retryAfterSecs}`, + { + code: 429, + headers: { + 'retry-after': retryAfterSecs?.toString(), + }, + } + ); + } + if (error.code === ErrorCode.MismatchedDevices) { + const mismatchedError = error as unknown as MismatchedDevicesError; + const { entries } = mismatchedError; + const staleDevices: Array = []; + log.warn( + `${logId}: libsignal threw MismatchedDevices, with ${entries?.length} entries` + ); + + await waitForAll({ + maxConcurrency: 3, + tasks: entries.map(entry => async () => { + const uuid = fromServiceIdObject(entry.account); + const isEmpty = + entry.missingDevices.length === 0 && + entry.extraDevices.length === 0 && + entry.staleDevices.length === 0; + + if (isEmpty) { + log.warn( + `${logId}/MismatchedDevices: Entry for ${uuid} was empty - fetching all keys` + ); + await fetchKeysForServiceId( + uuid, + null, + groupSendEndorsementState + ); + } + + if (entry.missingDevices.length > 0) { + // Start new sessions; didn't have sessions before + await fetchKeysForServiceId( + uuid, + entry.missingDevices, + groupSendEndorsementState + ); + } + + // Clear unneeded sessions + await waitForAll({ + tasks: entry.extraDevices.map(deviceId => async () => { + await signalProtocolStore.archiveSession( + new QualifiedAddress(ourAci, Address.create(uuid, deviceId)) + ); + }), + }); + + await waitForAll({ + tasks: entry.staleDevices.map(device => async () => { + // Save all stale devices in one list for updating senderKeyInfo + staleDevices.push({ serviceId: uuid, id: device }); + + // Clear stale sessions + await signalProtocolStore.archiveSession( + new QualifiedAddress(ourAci, Address.create(uuid, device)) + ); + }), + }); + + if (entry.staleDevices.length > 0) { + // Start new sessions; previous session was stale + await fetchKeysForServiceId( + uuid, + entry.staleDevices, + groupSendEndorsementState + ); + } + }), + }); + + // Update sende senderKeyInfo in one update + if (staleDevices.length > 0) { + const toUpdate = sendTarget.getSenderKeyInfo(); + if (toUpdate) { + await sendTarget.saveSenderKeyInfo({ + ...toUpdate, + memberDevices: differenceWith( + toUpdate.memberDevices, + staleDevices, + partialDeviceComparator + ), + }); + } + } + + return startOver('error: mismatched devices'); + } + } + if (error.code === UNKNOWN_RECIPIENT) { onFailedToSendWithEndorsements(error); throw new UnknownRecipientError(); @@ -974,6 +1126,7 @@ async function handle409Response( ); if (parsed.success) { await waitForAll({ + maxConcurrency: 10, tasks: parsed.data.map(item => async () => { const { uuid, devices } = item; // Start new sessions with devices we didn't know about before @@ -998,7 +1151,6 @@ async function handle409Response( }); } }), - maxConcurrency: 10, }); } else { log.error( @@ -1356,11 +1508,11 @@ async function fetchKeysForServiceIds( try { await waitForAll({ + maxConcurrency: 50, tasks: serviceIds.map( serviceId => async () => fetchKeysForServiceId(serviceId, null, groupSendEndorsementState) ), - maxConcurrency: 50, }); } catch (error) { log.error( From 560224f5161eb593602c8d450ae4e4e353cee199 Mon Sep 17 00:00:00 2001 From: Jamie <113370520+jamiebuilds-signal@users.noreply.github.com> Date: Tue, 13 Jan 2026 12:01:07 -0800 Subject: [PATCH 13/49] Pinned messages UI fixes --- stylesheets/_modules.scss | 74 ++----------------- .../conversation/ExpireTimer.dom.stories.tsx | 35 --------- .../conversation/ExpireTimer.dom.tsx | 20 +---- .../conversation/MessageMetadata.dom.tsx | 4 - .../conversation/Quote.dom.stories.tsx | 2 +- .../conversation/Timeline.dom.stories.tsx | 2 +- .../TimelineMessage.dom.stories.tsx | 2 +- .../conversation/TimelineMessage.dom.tsx | 12 ++- .../PinnedMessagesBar.dom.stories.tsx | 24 +++++- .../pinned-messages/PinnedMessagesBar.dom.tsx | 65 ++++++++-------- ts/messageModifiers/PinnedMessages.preload.ts | 7 ++ ts/sql/server/pinnedMessages.std.ts | 2 +- ts/state/selectors/message.preload.ts | 15 +++- ts/state/smart/PinnedMessagesBar.preload.tsx | 56 ++++++++++---- 14 files changed, 133 insertions(+), 187 deletions(-) diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss index e07b3f412b..e23107ff86 100644 --- a/stylesheets/_modules.scss +++ b/stylesheets/_modules.scss @@ -1874,81 +1874,17 @@ $message-padding-horizontal: 12px; display: inline-block; margin-inline-start: 6px; margin-bottom: 2px; - - & { - @include mixins.dark-theme { - @include mixins.color-svg( - '../images/icons/v3/message_timer/messagetimer-60.svg', - variables.$color-white-alpha-80 - ); - } - } - & { - @include mixins.light-theme { - @include mixins.color-svg( - '../images/icons/v3/message_timer/messagetimer-60.svg', - variables.$color-white-alpha-80 - ); - } - } } $timer-icons: - '55', '50', '45', '40', '35', '30', '25', '20', '15', '10', '05', '00'; + '60', '55', '50', '45', '40', '35', '30', '25', '20', '15', '10', '05', '00'; @each $timer-icon in $timer-icons { .module-expire-timer--#{$timer-icon} { - & { - @include mixins.dark-theme { - @include mixins.color-svg( - '../images/icons/v3/message_timer/messagetimer-#{$timer-icon}.svg', - variables.$color-white-alpha-80 - ); - } - } - & { - @include mixins.light-theme { - @include mixins.color-svg( - '../images/icons/v3/message_timer/messagetimer-#{$timer-icon}.svg', - variables.$color-white-alpha-80 - ); - } - } - } -} - -.module-expire-timer--incoming { - background-color: variables.$color-white-alpha-80; - - @include mixins.light-theme { - background-color: variables.$color-gray-60; - } - @include mixins.dark-theme { - background-color: variables.$color-gray-25; - } -} -.module-expire-timer--with-sticker { - @include mixins.light-theme { - background-color: variables.$color-gray-60; - } -} - -// When status indicators are overlaid on top of an image, they use different colors -.module-expire-timer--with-image-no-caption { - @include mixins.light-theme { - background-color: variables.$color-white; - } - @include mixins.dark-theme { - background-color: variables.$color-gray-02; - } -} - -.module-expire-timer--outline-only-bubble { - @include mixins.light-theme { - background-color: variables.$color-gray-60; - } - @include mixins.dark-theme { - background-color: variables.$color-gray-25; + @include mixins.color-svg( + '../images/icons/v3/message_timer/messagetimer-#{$timer-icon}.svg', + currentColor + ); } } diff --git a/ts/components/conversation/ExpireTimer.dom.stories.tsx b/ts/components/conversation/ExpireTimer.dom.stories.tsx index 21a9280d45..b321077c42 100644 --- a/ts/components/conversation/ExpireTimer.dom.stories.tsx +++ b/ts/components/conversation/ExpireTimer.dom.stories.tsx @@ -11,12 +11,9 @@ export default { } satisfies Meta; const createProps = (overrideProps: Partial = {}): Props => ({ - direction: overrideProps.direction || 'outgoing', expirationLength: overrideProps.expirationLength || 30 * 1000, expirationTimestamp: overrideProps.expirationTimestamp || Date.now() + 30 * 1000, - withImageNoCaption: overrideProps.withImageNoCaption || false, - withSticker: overrideProps.withSticker || false, }); export const _30Seconds = (): React.JSX.Element => { @@ -51,38 +48,6 @@ export function Expired(): React.JSX.Element { return ; } -export function Sticker(): React.JSX.Element { - const props = createProps({ - withSticker: true, - }); - - return ; -} - -export function ImageNoCaption(): React.JSX.Element { - const props = createProps({ - withImageNoCaption: true, - }); - - return ( -
- -
- ); -} - -export function Incoming(): React.JSX.Element { - const props = createProps({ - direction: 'incoming', - }); - - return ( -
- -
- ); -} - export function ExpirationTooFarOut(): React.JSX.Element { const props = createProps({ expirationTimestamp: Date.now() + 150 * 1000, diff --git a/ts/components/conversation/ExpireTimer.dom.tsx b/ts/components/conversation/ExpireTimer.dom.tsx index ffa114d149..878ed367ee 100644 --- a/ts/components/conversation/ExpireTimer.dom.tsx +++ b/ts/components/conversation/ExpireTimer.dom.tsx @@ -6,22 +6,14 @@ import classNames from 'classnames'; import { getIncrement, getTimerBucket } from '../../util/timer.std.js'; -export type Props = { - direction?: 'incoming' | 'outgoing'; +export type Props = Readonly<{ expirationLength: number; expirationTimestamp?: number; - isOutlineOnlyBubble?: boolean; - withImageNoCaption?: boolean; - withSticker?: boolean; -}; +}>; export function ExpireTimer({ - direction, expirationLength, expirationTimestamp, - isOutlineOnlyBubble, - withImageNoCaption, - withSticker, }: Props): React.JSX.Element { const [, forceUpdate] = useReducer(() => ({}), {}); @@ -40,13 +32,7 @@ export function ExpireTimer({
); diff --git a/ts/components/conversation/MessageMetadata.dom.tsx b/ts/components/conversation/MessageMetadata.dom.tsx index 2dec39e2d9..dd512eada2 100644 --- a/ts/components/conversation/MessageMetadata.dom.tsx +++ b/ts/components/conversation/MessageMetadata.dom.tsx @@ -220,12 +220,8 @@ export const MessageMetadata = forwardRef>( ) : null} {expirationLength ? ( ) : null} {textPending ? ( diff --git a/ts/components/conversation/Quote.dom.stories.tsx b/ts/components/conversation/Quote.dom.stories.tsx index 5e3de36d5e..23c3ba653a 100644 --- a/ts/components/conversation/Quote.dom.stories.tsx +++ b/ts/components/conversation/Quote.dom.stories.tsx @@ -77,7 +77,7 @@ const defaultMessageProps: TimelineMessagesProps = { canEditMessage: true, canEndPoll: false, canForward: true, - canPinMessages: true, + canPinMessage: true, canReact: true, canReply: true, canRetry: true, diff --git a/ts/components/conversation/Timeline.dom.stories.tsx b/ts/components/conversation/Timeline.dom.stories.tsx index f248e147c0..5ecf7f81c8 100644 --- a/ts/components/conversation/Timeline.dom.stories.tsx +++ b/ts/components/conversation/Timeline.dom.stories.tsx @@ -47,7 +47,7 @@ function mockMessageTimelineItem( canEditMessage: true, canEndPoll: false, canForward: true, - canPinMessages: true, + canPinMessage: true, canReact: true, canReply: true, canRetry: true, diff --git a/ts/components/conversation/TimelineMessage.dom.stories.tsx b/ts/components/conversation/TimelineMessage.dom.stories.tsx index 41b2e1e24f..417b7c0190 100644 --- a/ts/components/conversation/TimelineMessage.dom.stories.tsx +++ b/ts/components/conversation/TimelineMessage.dom.stories.tsx @@ -239,7 +239,7 @@ const createProps = (overrideProps: Partial = {}): Props => ({ canCopy: true, canEditMessage: true, canEndPoll: overrideProps.direction === 'outgoing', - canPinMessages: overrideProps.canPinMessages ?? true, + canPinMessage: overrideProps.canPinMessage ?? true, canReact: true, canReply: true, canDownload: true, diff --git a/ts/components/conversation/TimelineMessage.dom.tsx b/ts/components/conversation/TimelineMessage.dom.tsx index a17c66b2bf..7fbb9be613 100644 --- a/ts/components/conversation/TimelineMessage.dom.tsx +++ b/ts/components/conversation/TimelineMessage.dom.tsx @@ -54,7 +54,7 @@ export type PropsData = { canRetryDeleteForEveryone: boolean; canReact: boolean; canReply: boolean; - canPinMessages: boolean; + canPinMessage: boolean; hasMaxPinnedMessages: boolean; selectedReaction?: string; isTargeted?: boolean; @@ -114,7 +114,7 @@ export function TimelineMessage(props: Props): React.JSX.Element { canReply, canRetry, canRetryDeleteForEveryone, - canPinMessages, + canPinMessage, containerElementRef, containerWidthBreakpoint, conversationId, @@ -368,11 +368,9 @@ export function TimelineMessage(props: Props): React.JSX.Element { }); }} onPinMessage={ - canPinMessages && !isPinned ? handleOpenPinMessageDialog : null - } - onUnpinMessage={ - canPinMessages && isPinned ? handleUnpinMessage : null + canPinMessage && !isPinned ? handleOpenPinMessageDialog : null } + onUnpinMessage={canPinMessage && isPinned ? handleUnpinMessage : null} onMoreInfo={() => pushPanelForConversation({ type: PanelType.MessageDetails, @@ -388,7 +386,7 @@ export function TimelineMessage(props: Props): React.JSX.Element { canCopy, canEditMessage, canForward, - canPinMessages, + canPinMessage, canRetry, canSelect, canEndPoll, diff --git a/ts/components/conversation/pinned-messages/PinnedMessagesBar.dom.stories.tsx b/ts/components/conversation/pinned-messages/PinnedMessagesBar.dom.stories.tsx index d56c2e4ff6..98be000336 100644 --- a/ts/components/conversation/pinned-messages/PinnedMessagesBar.dom.stories.tsx +++ b/ts/components/conversation/pinned-messages/PinnedMessagesBar.dom.stories.tsx @@ -182,10 +182,28 @@ export function Variants(): React.JSX.Element { title="Poll" message={{ poll: { question: `${SHORT_TEXT}?` } }} /> - - + + - + ); } diff --git a/ts/components/conversation/pinned-messages/PinnedMessagesBar.dom.tsx b/ts/components/conversation/pinned-messages/PinnedMessagesBar.dom.tsx index a51a62f055..a8114566c0 100644 --- a/ts/components/conversation/pinned-messages/PinnedMessagesBar.dom.tsx +++ b/ts/components/conversation/pinned-messages/PinnedMessagesBar.dom.tsx @@ -191,7 +191,7 @@ function TabsList(props: { return ( - {props.pins.toReversed().map((pin, pinIndex) => { + {props.pins.map((pin, pinIndex) => { return ( ; } - // 3. And everything else... + // 3. Check specific types of messages (before checking attachments) + if (message.payment) { + text ??= i18n('icu:PinnedMessagesBar__MessagePreview__Text--Payment'); + icon ??= { + symbol: 'creditcard', + label: i18n( + 'icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment' + ), + }; + } else if (message.poll != null) { + text ??= ; + icon ??= { + symbol: 'poll', + label: i18n('icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Poll'), + }; + } else if (message.sticker) { + text ??= i18n('icu:PinnedMessagesBar__MessagePreview__Text--Sticker'); + icon ??= { + symbol: 'sticker', + label: i18n( + 'icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Sticker' + ), + }; + } else if (message.contact != null) { + const name = message.contact.name ?? i18n('icu:unknownContact'); + text ??= ; + icon ??= { + symbol: 'person-circle', + label: name, + }; + } + + // 4. Check attachments (make sure to check types like sticker/contact first) if (message.attachment != null) { if (message.attachment.type === 'image') { text ??= i18n('icu:PinnedMessagesBar__MessagePreview__Text--Photo'); @@ -426,35 +458,6 @@ function getMessagePreview(i18n: LocalizerType, message: PinMessage): Preview { } else { throw missingCaseError(message.attachment); } - } else if (message.contact != null) { - const name = message.contact.name ?? i18n('icu:unknownContact'); - text ??= ; - icon ??= { - symbol: 'person-circle', - label: name, - }; - } else if (message.payment) { - text ??= i18n('icu:PinnedMessagesBar__MessagePreview__Text--Payment'); - icon ??= { - symbol: 'creditcard', - label: i18n( - 'icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment' - ), - }; - } else if (message.poll != null) { - text ??= ; - icon ??= { - symbol: 'poll', - label: i18n('icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Poll'), - }; - } else if (message.sticker) { - text ??= i18n('icu:PinnedMessagesBar__MessagePreview__Text--Sticker'); - icon ??= { - symbol: 'sticker', - label: i18n( - 'icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Sticker' - ), - }; } return { icon, text }; diff --git a/ts/messageModifiers/PinnedMessages.preload.ts b/ts/messageModifiers/PinnedMessages.preload.ts index c7a583b9c5..d85902d937 100644 --- a/ts/messageModifiers/PinnedMessages.preload.ts +++ b/ts/messageModifiers/PinnedMessages.preload.ts @@ -16,6 +16,7 @@ import { pinnedMessagesCleanupService } from '../services/expiring/pinnedMessage import { drop } from '../util/drop.std.js'; import type { AppendPinnedMessageResult } from '../sql/server/pinnedMessages.std.js'; import * as Errors from '../types/errors.std.js'; +import { isGiftBadge } from '../state/selectors/message.preload.js'; const { AccessRequired } = Proto.AccessControl; const { Role } = Proto.Member; @@ -209,6 +210,8 @@ function validatePinnedMessageTarget( target: MessageModifierTarget, sourceAci: AciString ): { error: string } | null { + const message = target.targetMessage.attributes; + if (!isValidSenderAciForConversation(target.targetConversation, sourceAci)) { return { error: 'Sender cannot send to target conversation' }; } @@ -217,5 +220,9 @@ function validatePinnedMessageTarget( return { error: 'Sender does not have access to edit group attributes' }; } + if (isGiftBadge(message)) { + return { error: 'Cannot pin gift badge messages' }; + } + return null; } diff --git a/ts/sql/server/pinnedMessages.std.ts b/ts/sql/server/pinnedMessages.std.ts index 639900513b..5a23bc90df 100644 --- a/ts/sql/server/pinnedMessages.std.ts +++ b/ts/sql/server/pinnedMessages.std.ts @@ -64,7 +64,7 @@ export function getPinnedMessagesPreloadDataForConversation( const [query, params] = sql` SELECT * FROM pinnedMessages WHERE conversationId = ${conversationId} - ORDER BY pinnedAt DESC + ORDER BY pinnedAt ASC `; return db diff --git a/ts/state/selectors/message.preload.ts b/ts/state/selectors/message.preload.ts index 3ffa41aa0e..128f71d4dc 100644 --- a/ts/state/selectors/message.preload.ts +++ b/ts/state/selectors/message.preload.ts @@ -946,7 +946,7 @@ export const getPropsForMessage = ( canDownload: canDownload(message, conversationSelector), canEndPoll: canEndPoll(message), canForward: canForward(message), - canPinMessages: canPinMessages(conversation), + canPinMessage: canPinMessage(conversation, message), canReact: canReact(message, ourConversationId, conversationSelector), canReply: canReply(message, ourConversationId, conversationSelector), canRetry: hasErrors(message), @@ -2414,6 +2414,19 @@ export function canPinMessages(conversation: ConversationType): boolean { return conversation.type === 'direct' || canEditGroupInfo(conversation); } +export function canPinMessage( + conversation: ConversationType, + message: ReadonlyMessageAttributesType +): boolean { + if (!canPinMessages(conversation)) { + return false; + } + if (isGiftBadge(message)) { + return false; + } + return true; +} + function getHasMaxPinnedMessages( pinnedMessagesMessageIds: ReadonlyArray ) { diff --git a/ts/state/smart/PinnedMessagesBar.preload.tsx b/ts/state/smart/PinnedMessagesBar.preload.tsx index f77e491573..2ed521416a 100644 --- a/ts/state/smart/PinnedMessagesBar.preload.tsx +++ b/ts/state/smart/PinnedMessagesBar.preload.tsx @@ -132,6 +132,10 @@ function getPinSender(props: MessagePropsType): PinSender { }; } +function getLastPinId(pins: ReadonlyArray): PinnedMessageId | null { + return pins.at(-1)?.id ?? null; +} + function getPrevPinId( pins: ReadonlyArray, pinnedMessageId: PinnedMessageId @@ -375,26 +379,45 @@ export const SmartPinnedMessagesBar = memo(function SmartPinnedMessagesBar() { useConversationsActions(); const [current, setCurrent] = useState(() => { - return pins.at(0)?.id ?? null; + return getLastPinId(pins); }); - const isCurrentOutOfDate = useMemo(() => { + const [prevPins, setPrevPins] = useState(pins); + if (pins !== prevPins) { + // Needed for `expectedCurrent` which might update `current` in the same render + setPrevPins(pins); + } + + const expectedCurrent = useMemo(() => { + const latestPinId = getLastPinId(pins); + + // If `current` is null, use the latest pin id if we have one. if (current == null) { - if (pins.length > 0) { - return true; - } - return false; + return latestPinId; } - const hasMatch = pins.some(pin => { - return pin.id === current; - }); + // If `current` is already the latest pin id, leave it. + if (current === latestPinId) { + return current; + } + + // Update `current` if it no longer exists. + const hasCurrent = pins.some(pin => pin.id === current); + if (!hasCurrent) { + return latestPinId; + } - return !hasMatch; - }, [current, pins]); + // Update `current` if it was previously the latest and there's a new latest. + const prevLatestPinId = getLastPinId(prevPins); + if (prevLatestPinId === current && latestPinId != null) { + return latestPinId; + } + + return current; + }, [current, pins, prevPins]); - if (isCurrentOutOfDate) { - setCurrent(pins.at(0)?.id ?? null); + if (current !== expectedCurrent) { + setCurrent(expectedCurrent); } const handleCurrentChange = useCallback( @@ -410,9 +433,10 @@ export const SmartPinnedMessagesBar = memo(function SmartPinnedMessagesBar() { if (current == null) { return; } - const prevPinId = getPrevPinId(pins, current); - if (prevPinId != null) { - setCurrent(prevPinId); + + const updatedCurrent = getPrevPinId(pins, current) ?? getLastPinId(pins); + if (updatedCurrent != null) { + setCurrent(updatedCurrent); } }, [scrollToMessage, conversationId, pins, current] From 91f8176c12d7c9c3ee6529ed8668c4cb38895e08 Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Wed, 14 Jan 2026 06:01:53 +1000 Subject: [PATCH 14/49] Make date-rendering consistent: show year if older than six months --- ts/util/formatTimestamp.dom.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ts/util/formatTimestamp.dom.ts b/ts/util/formatTimestamp.dom.ts index 45da02196a..c514369502 100644 --- a/ts/util/formatTimestamp.dom.ts +++ b/ts/util/formatTimestamp.dom.ts @@ -120,7 +120,7 @@ export function formatDateTimeShort( return formatTimestamp(timestamp, { weekday: 'short' }); } - if (m.isSame(now, 'year')) { + if (Math.abs(m.diff(Date.now())) < 6 * MONTH) { return formatTimestamp(timestamp, { day: 'numeric', month: 'short', @@ -157,7 +157,7 @@ export function formatDateTimeForAttachment( }); } - if (m.isSame(now, 'year')) { + if (Math.abs(m.diff(Date.now())) < 6 * MONTH) { return formatTimestamp(timestamp, { day: 'numeric', month: 'short', From 3fe00d80eaeaa16af455bab422149acad4919675 Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Wed, 14 Jan 2026 07:40:30 +1000 Subject: [PATCH 15/49] Reintroduce black bars around 1:1 remote video --- stylesheets/_modules.scss | 4 +-- ts/calling/VideoSupport.preload.ts | 52 +++++++++++++----------------- 2 files changed, 25 insertions(+), 31 deletions(-) diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss index e23107ff86..2134b9deb6 100644 --- a/stylesheets/_modules.scss +++ b/stylesheets/_modules.scss @@ -3557,8 +3557,8 @@ button.module-image__border-overlay:focus { } .module-ongoing-call { &__remote-video-enabled { - max-width: 100%; - max-height: 100%; + height: 100%; + width: 100%; position: relative; &--reconnecting { filter: blur(15px); diff --git a/ts/calling/VideoSupport.preload.ts b/ts/calling/VideoSupport.preload.ts index 4a9942ae98..cef7cd9b4c 100644 --- a/ts/calling/VideoSupport.preload.ts +++ b/ts/calling/VideoSupport.preload.ts @@ -514,43 +514,37 @@ export class CanvasVideoRenderer { width <= 2 || height <= 2 || width > MAX_VIDEO_CAPTURE_WIDTH || - height > MAX_VIDEO_CAPTURE_HEIGHT || - canvas.clientWidth <= 0 || - canvas.clientHeight <= 0 + height > MAX_VIDEO_CAPTURE_HEIGHT ) { return; } - const aspectRatio = width / height; + const frameAspectRatio = width / height; + const canvasAspectRatio = canvas.clientWidth / canvas.clientHeight; - const { parentElement } = canvas; - let parentAspectRatio = 1; + let dx = 0; + let dy = 0; - if (parentElement) { - parentAspectRatio = - parentElement.clientWidth / parentElement.clientHeight; - } - - let style; - if (aspectRatio >= 1) { - // landscape - style = 'width: 100%'; + if (frameAspectRatio > canvasAspectRatio) { + // Frame wider than view: We need bars at the top and bottom + canvas.width = width; + canvas.height = width / canvasAspectRatio; + dy = (canvas.height - height) / 2; + } else if (frameAspectRatio < canvasAspectRatio) { + // Frame narrower than view: We need pillars on the sides + canvas.width = height * canvasAspectRatio; + canvas.height = height; + dx = (canvas.width - width) / 2; } else { - // portrait - style = 'height: 100%'; - } - // container is more landscape than video - if (aspectRatio > 1 && parentAspectRatio > aspectRatio) { - style = 'height: 100%'; - } - // container is more portait than video - if (aspectRatio < 1 && parentAspectRatio < aspectRatio) { - style = 'width: 100%'; + // Will stretch perfectly with no bars + canvas.width = width; + canvas.height = height; } - canvas.width = width; - canvas.height = height; - canvas.setAttribute('style', style); + if (dx > 0 || dy > 0) { + context.fillStyle = 'black'; + context.fillRect(0, 0, canvas.width, canvas.height); + } const sizeChanged = this.imageData?.width !== width || this.imageData?.height !== height; @@ -559,7 +553,7 @@ export class CanvasVideoRenderer { this.imageData = new ImageData(width, height); } this.imageData.data.set(this.buffer.subarray(0, width * height * 4)); - context.putImageData(this.imageData, 0, 0); + context.putImageData(this.imageData, dx, dy); if (sizeChanged) { this.sizeCallback?.({ width, height }); From 040b3fe7b80cd05e1dec1f518cb98ce9051db66a Mon Sep 17 00:00:00 2001 From: Jamie <113370520+jamiebuilds-signal@users.noreply.github.com> Date: Wed, 14 Jan 2026 08:35:24 -0800 Subject: [PATCH 16/49] Add expire timers to pin/unpin data messages --- ts/background.preload.ts | 4 +++ ts/jobs/conversationJobQueue.preload.ts | 2 ++ .../helpers/createSendMessageJob.preload.ts | 27 ++++++++++++++----- .../helpers/sendDeleteForEveryone.preload.ts | 2 ++ ...sendDirectExpirationTimerUpdate.preload.ts | 1 + .../helpers/sendGroupCallUpdate.preload.ts | 1 + ts/jobs/helpers/sendGroupUpdate.preload.ts | 1 + ts/jobs/helpers/sendPinMessage.preload.ts | 7 +++-- ts/jobs/helpers/sendPollTerminate.preload.ts | 1 + ts/jobs/helpers/sendUnpinMessage.preload.ts | 7 +++-- ts/messageModifiers/PinnedMessages.preload.ts | 4 +++ ts/models/conversations.preload.ts | 6 +++-- ts/state/ducks/conversations.preload.ts | 7 ++++- ts/util/wrapWithSyncMessageSend.preload.ts | 4 ++- 14 files changed, 59 insertions(+), 15 deletions(-) diff --git a/ts/background.preload.ts b/ts/background.preload.ts index cde3da358a..cbe3289b53 100644 --- a/ts/background.preload.ts +++ b/ts/background.preload.ts @@ -2495,6 +2495,8 @@ export async function startApp(): Promise { pinnedByAci: data.sourceAci, sentAtTimestamp: data.timestamp, receivedAtTimestamp: data.receivedAtDate, + expireTimer: data.message.expireTimer, + expirationStartTimestamp: null, }); confirm(); return; @@ -3003,6 +3005,8 @@ export async function startApp(): Promise { pinnedByAci: sourceServiceId, sentAtTimestamp: data.timestamp, receivedAtTimestamp: data.receivedAtDate, + expireTimer: data.message.expireTimer, + expirationStartTimestamp: data.expirationStartTimestamp ?? null, }); confirm(); return; diff --git a/ts/jobs/conversationJobQueue.preload.ts b/ts/jobs/conversationJobQueue.preload.ts index 12460605b0..dee724de04 100644 --- a/ts/jobs/conversationJobQueue.preload.ts +++ b/ts/jobs/conversationJobQueue.preload.ts @@ -209,6 +209,7 @@ const pinMessageJobDataSchema = z.object({ targetAuthorAci: aciSchema, targetSentTimestamp: z.number(), pinDurationSeconds: z.number().nullable(), + pinnedAt: z.number(), }); export type PinMessageJobData = z.infer; @@ -290,6 +291,7 @@ const unpinMessageJobDataSchema = z.object({ targetMessageId: z.string(), targetAuthorAci: aciSchema, targetSentTimestamp: z.number(), + unpinnedAt: z.number(), }); export type UnpinMessageJobData = z.infer; diff --git a/ts/jobs/helpers/createSendMessageJob.preload.ts b/ts/jobs/helpers/createSendMessageJob.preload.ts index 8ec99b1bd3..2f8e190f57 100644 --- a/ts/jobs/helpers/createSendMessageJob.preload.ts +++ b/ts/jobs/helpers/createSendMessageJob.preload.ts @@ -27,9 +27,9 @@ export type SendMessageJobOptions = Readonly<{ sendType: SendTypesType; getMessageId: (data: Data) => string | null; getMessageOptions: ( - data: Data, - jobTimestamp: number + data: Data ) => Omit; + getExpirationStartTimestamp: (data: Data) => number | null; }>; export function createSendMessageJob( @@ -40,7 +40,13 @@ export function createSendMessageJob( job: ConversationQueueJobBundle, data: Data ): Promise { - const { sendName, sendType, getMessageId, getMessageOptions } = options; + const { + sendName, + sendType, + getMessageId, + getMessageOptions, + getExpirationStartTimestamp, + } = options; const logId = `${sendName}(${conversation.idForLogging()}/${job.timestamp})`; const log = job.log.child(logId); @@ -71,7 +77,12 @@ export function createSendMessageJob( } const messageId = getMessageId(data); - const messageOptions = getMessageOptions(data, job.timestamp); + const messageOptions = { + ...getMessageOptions(data), + expireTimer: conversation.get('expireTimer'), + expireTimerVersion: conversation.getExpireTimerVersion(), + }; + const expirationStartTimestamp = getExpirationStartTimestamp(data); try { if (recipientServiceIdsWithoutMe.length === 0) { @@ -96,7 +107,7 @@ export function createSendMessageJob( timestamp: job.timestamp, destinationE164: conversation.get('e164'), destinationServiceId: conversation.getServiceId(), - expirationStartTimestamp: null, + expirationStartTimestamp, isUpdate: false, options: sendOptions, urgent: false, @@ -128,7 +139,7 @@ export function createSendMessageJob( send: sender => { return sender.sendMessageToServiceId({ serviceId: recipientServiceId, - messageOptions: getMessageOptions(data, job.timestamp), + messageOptions, groupId: undefined, contentHint: ContentHint.Resendable, options: sendOptions, @@ -138,6 +149,7 @@ export function createSendMessageJob( }, sendType, timestamp: job.timestamp, + expirationStartTimestamp, }); } ); @@ -162,8 +174,8 @@ export function createSendMessageJob( abortSignal, contentHint: ContentHint.Resendable, groupSendOptions: { + ...messageOptions, groupV2: groupV2Info, - ...getMessageOptions(data, job.timestamp), }, messageId: messageId ?? undefined, sendOptions, @@ -174,6 +186,7 @@ export function createSendMessageJob( }, sendType, timestamp: job.timestamp, + expirationStartTimestamp, }); } ); diff --git a/ts/jobs/helpers/sendDeleteForEveryone.preload.ts b/ts/jobs/helpers/sendDeleteForEveryone.preload.ts index f96c1e9338..e065ab23d4 100644 --- a/ts/jobs/helpers/sendDeleteForEveryone.preload.ts +++ b/ts/jobs/helpers/sendDeleteForEveryone.preload.ts @@ -213,6 +213,7 @@ export async function sendDeleteForEveryone( }), sendType, timestamp, + expirationStartTimestamp: null, }); await updateMessageWithSuccessfulSends(message); @@ -252,6 +253,7 @@ export async function sendDeleteForEveryone( }), sendType, timestamp, + expirationStartTimestamp: null, }); await updateMessageWithSuccessfulSends(message); diff --git a/ts/jobs/helpers/sendDirectExpirationTimerUpdate.preload.ts b/ts/jobs/helpers/sendDirectExpirationTimerUpdate.preload.ts index 58ef6d7a60..9edfa54553 100644 --- a/ts/jobs/helpers/sendDirectExpirationTimerUpdate.preload.ts +++ b/ts/jobs/helpers/sendDirectExpirationTimerUpdate.preload.ts @@ -153,6 +153,7 @@ export async function sendDirectExpirationTimerUpdate( }), sendType, timestamp, + expirationStartTimestamp: null, }); } } catch (error: unknown) { diff --git a/ts/jobs/helpers/sendGroupCallUpdate.preload.ts b/ts/jobs/helpers/sendGroupCallUpdate.preload.ts index d58c51da88..81ef0f607f 100644 --- a/ts/jobs/helpers/sendGroupCallUpdate.preload.ts +++ b/ts/jobs/helpers/sendGroupCallUpdate.preload.ts @@ -97,6 +97,7 @@ export async function sendGroupCallUpdate( ), sendType, timestamp, + expirationStartTimestamp: null, }); } catch (error: unknown) { await handleMultipleSendErrors({ diff --git a/ts/jobs/helpers/sendGroupUpdate.preload.ts b/ts/jobs/helpers/sendGroupUpdate.preload.ts index de4d49ced1..9be62ab550 100644 --- a/ts/jobs/helpers/sendGroupUpdate.preload.ts +++ b/ts/jobs/helpers/sendGroupUpdate.preload.ts @@ -117,6 +117,7 @@ export async function sendGroupUpdate( }), sendType, timestamp, + expirationStartTimestamp: null, }) ); } catch (error: unknown) { diff --git a/ts/jobs/helpers/sendPinMessage.preload.ts b/ts/jobs/helpers/sendPinMessage.preload.ts index e2f2e48222..3ad7300cbd 100644 --- a/ts/jobs/helpers/sendPinMessage.preload.ts +++ b/ts/jobs/helpers/sendPinMessage.preload.ts @@ -9,9 +9,9 @@ export const sendPinMessage = createSendMessageJob({ getMessageId(data) { return data.targetMessageId; }, - getMessageOptions(data, jobTimestamp) { + getMessageOptions(data) { return { - timestamp: jobTimestamp, + timestamp: data.pinnedAt, pinMessage: { targetAuthorAci: data.targetAuthorAci, targetSentTimestamp: data.targetSentTimestamp, @@ -19,4 +19,7 @@ export const sendPinMessage = createSendMessageJob({ }, }; }, + getExpirationStartTimestamp(data) { + return data.pinnedAt; + }, }); diff --git a/ts/jobs/helpers/sendPollTerminate.preload.ts b/ts/jobs/helpers/sendPollTerminate.preload.ts index 54f13a9beb..9111c18431 100644 --- a/ts/jobs/helpers/sendPollTerminate.preload.ts +++ b/ts/jobs/helpers/sendPollTerminate.preload.ts @@ -133,6 +133,7 @@ export async function sendPollTerminate( }), sendType: 'pollTerminate', timestamp, + expirationStartTimestamp: null, }); await markTerminateSuccess(pollMessage, jobLog); diff --git a/ts/jobs/helpers/sendUnpinMessage.preload.ts b/ts/jobs/helpers/sendUnpinMessage.preload.ts index 5def2ff373..d44a9aae82 100644 --- a/ts/jobs/helpers/sendUnpinMessage.preload.ts +++ b/ts/jobs/helpers/sendUnpinMessage.preload.ts @@ -10,13 +10,16 @@ export const sendUnpinMessage = createSendMessageJob({ getMessageId(data) { return data.targetMessageId; }, - getMessageOptions(data, jobTimestamp) { + getMessageOptions(data) { return { - timestamp: jobTimestamp, + timestamp: data.unpinnedAt, unpinMessage: { targetAuthorAci: data.targetAuthorAci, targetSentTimestamp: data.targetSentTimestamp, }, }; }, + getExpirationStartTimestamp(data) { + return data.unpinnedAt; + }, }); diff --git a/ts/messageModifiers/PinnedMessages.preload.ts b/ts/messageModifiers/PinnedMessages.preload.ts index d85902d937..2fec799352 100644 --- a/ts/messageModifiers/PinnedMessages.preload.ts +++ b/ts/messageModifiers/PinnedMessages.preload.ts @@ -30,6 +30,8 @@ export type PinnedMessageAddProps = Readonly<{ pinnedByAci: AciString; sentAtTimestamp: number; receivedAtTimestamp: number; + expireTimer: DurationInSeconds | null; + expirationStartTimestamp: number | null; }>; export type PinnedMessageRemoveProps = Readonly<{ @@ -125,6 +127,8 @@ export async function onPinnedMessageAdd( senderAci: props.pinnedByAci, sentAtTimestamp: props.sentAtTimestamp, receivedAtTimestamp: props.receivedAtTimestamp, + expireTimer: props.expireTimer, + expirationStartTimestamp: props.expirationStartTimestamp, }); } diff --git a/ts/models/conversations.preload.ts b/ts/models/conversations.preload.ts index 3876a624fc..62fadb8d32 100644 --- a/ts/models/conversations.preload.ts +++ b/ts/models/conversations.preload.ts @@ -3567,6 +3567,8 @@ export class ConversationModel { senderAci: AciString; sentAtTimestamp: number; receivedAtTimestamp: number; + expireTimer: DurationInSeconds | null; + expirationStartTimestamp: number | null; }): Promise { const ourAci = itemStorage.user.getCheckedAci(); const senderIsMe = params.senderAci === ourAci; @@ -3581,8 +3583,8 @@ export class ConversationModel { readStatus: senderIsMe ? ReadStatus.Read : ReadStatus.Unread, seenStatus: senderIsMe ? SeenStatus.Seen : SeenStatus.Unseen, sourceServiceId: params.senderAci, - expireTimer: this.get('expireTimer'), - expirationStartTimestamp: senderIsMe ? params.sentAtTimestamp : null, + expireTimer: params.expireTimer ?? undefined, + expirationStartTimestamp: params.expirationStartTimestamp, pinMessage: params.pinMessage, }); diff --git a/ts/state/ducks/conversations.preload.ts b/ts/state/ducks/conversations.preload.ts index ac9c006f20..d17dbe3b32 100644 --- a/ts/state/ducks/conversations.preload.ts +++ b/ts/state/ducks/conversations.preload.ts @@ -5199,15 +5199,17 @@ function onPinnedMessageAdd( ); strictAssert(targetConversation != null, 'Missing target conversation'); + const pinnedAt = Date.now(); + await conversationJobQueue.add({ type: conversationQueueJobEnum.enum.PinMessage, ...target, pinDurationSeconds, + pinnedAt, }); const pinnedMessagesLimit = getPinnedMessagesLimit(); - const pinnedAt = Date.now(); const expiresAt = getPinnedMessageExpiresAt(pinnedAt, pinDurationSeconds); await DataWriter.appendPinnedMessage(pinnedMessagesLimit, { @@ -5226,6 +5228,8 @@ function onPinnedMessageAdd( senderAci: itemStorage.user.getCheckedAci(), sentAtTimestamp: pinnedAt, receivedAtTimestamp: pinnedAt, + expireTimer: targetConversation.get('expireTimer') ?? null, + expirationStartTimestamp: pinnedAt, }); dispatch(onPinnedMessagesChanged(target.conversationId)); @@ -5238,6 +5242,7 @@ function onPinnedMessageRemove(targetMessageId: string): StateThunk { await conversationJobQueue.add({ type: conversationQueueJobEnum.enum.UnpinMessage, ...target, + unpinnedAt: Date.now(), }); await DataWriter.deletePinnedMessageByMessageId(targetMessageId); drop(pinnedMessagesCleanupService.trigger('onPinnedMessageRemove')); diff --git a/ts/util/wrapWithSyncMessageSend.preload.ts b/ts/util/wrapWithSyncMessageSend.preload.ts index 8672829ebd..d19ac6cdb0 100644 --- a/ts/util/wrapWithSyncMessageSend.preload.ts +++ b/ts/util/wrapWithSyncMessageSend.preload.ts @@ -25,6 +25,7 @@ export async function wrapWithSyncMessageSend({ send, sendType, timestamp, + expirationStartTimestamp, }: { conversation: ConversationModel; logId: string; @@ -32,6 +33,7 @@ export async function wrapWithSyncMessageSend({ send: (sender: MessageSender) => Promise; sendType: SendTypesType; timestamp: number; + expirationStartTimestamp: number | null; }): Promise { const logId = `wrapWithSyncMessageSend(${parentLogId}, ${timestamp})`; @@ -84,7 +86,7 @@ export async function wrapWithSyncMessageSend({ destinationE164: conversation.get('e164'), destinationServiceId: conversation.getServiceId(), encodedDataMessage: dataMessage, - expirationStartTimestamp: null, + expirationStartTimestamp, options, timestamp, urgent: false, From d938215b077a7c7a8edd20b5757e81e9f2b9090a Mon Sep 17 00:00:00 2001 From: trevor-signal <131492920+trevor-signal@users.noreply.github.com> Date: Wed, 14 Jan 2026 12:47:00 -0500 Subject: [PATCH 17/49] Mark window inactive immediately when blurred --- ts/services/ActiveWindowService.std.ts | 9 +++++++++ .../ActiveWindowService_test.preload.ts | 17 ++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/ts/services/ActiveWindowService.std.ts b/ts/services/ActiveWindowService.std.ts index c145f0f7a8..5cf84aa373 100644 --- a/ts/services/ActiveWindowService.std.ts +++ b/ts/services/ActiveWindowService.std.ts @@ -35,6 +35,7 @@ class ActiveWindowService { #changeCallbacks: Array<(isActive: boolean) => void> = []; #lastActiveEventAt = -Infinity; #lastActiveNonFocusingEventAt = -Infinity; + #lastBlurredAt = -Infinity; #callActiveCallbacks: () => void; constructor() { @@ -70,6 +71,11 @@ class ActiveWindowService { return Date.now() < this.#lastActiveEventAt + ACTIVE_TIMEOUT; } + if (this.#lastBlurredAt >= this.#lastActiveNonFocusingEventAt) { + // We are always inactive after blurring + return false; + } + return ( Date.now() < this.#lastActiveNonFocusingEventAt + @@ -109,6 +115,9 @@ class ActiveWindowService { #setWindowFocus(isFocused: boolean): void { this.#updateState(() => { this.#isFocused = isFocused; + if (!isFocused) { + this.#lastBlurredAt = Date.now(); + } }); } diff --git a/ts/test-electron/services/ActiveWindowService_test.preload.ts b/ts/test-electron/services/ActiveWindowService_test.preload.ts index 98f8528984..3dc938bd35 100644 --- a/ts/test-electron/services/ActiveWindowService_test.preload.ts +++ b/ts/test-electron/services/ActiveWindowService_test.preload.ts @@ -65,7 +65,7 @@ describe('ActiveWindowService', () => { const service = getActiveWindowService(fakeDocument, fakeIpc); fakeIpc.emit('set-window-focus', fakeIpcEvent, false); - + this.clock.tick(1); fakeDocument.dispatchEvent(new Event(eventName)); assert.isTrue(service.isActive()); this.clock.tick(1001); @@ -105,6 +105,21 @@ describe('ActiveWindowService', () => { } ); + it('is inactive immediately after a blur event, despite any previous events', function (this: Mocha.Context) { + const fakeDocument = createFakeDocument(); + const fakeIpc = new EventEmitter(); + const service = getActiveWindowService(fakeDocument, fakeIpc); + + fakeIpc.emit('set-window-focus', fakeIpcEvent, true); + + fakeDocument.dispatchEvent(new Event('click')); + // Important to also test a non-focusing event + fakeDocument.dispatchEvent(new Event('wheel')); + fakeIpc.emit('set-window-focus', fakeIpcEvent, false); + + assert.isFalse(service.isActive()); + }); + it('calls callbacks when going from unfocused to focused', () => { const fakeIpc = new EventEmitter(); const service = getActiveWindowService(createFakeDocument(), fakeIpc); From da279446c4f47c8b5e6b4b5416eda0bac42ccba9 Mon Sep 17 00:00:00 2001 From: Jamie <113370520+jamiebuilds-signal@users.noreply.github.com> Date: Wed, 14 Jan 2026 11:12:32 -0800 Subject: [PATCH 18/49] Sync and update UI when pinned messages expire --- .../pinned-messages/PinMessageDialog.dom.tsx | 11 +++++ ts/jobs/conversationJobQueue.preload.ts | 1 + .../helpers/createSendMessageJob.preload.ts | 6 ++- ts/jobs/helpers/sendPinMessage.preload.ts | 3 ++ ts/jobs/helpers/sendUnpinMessage.preload.ts | 3 ++ .../pinnedMessagesCleanupService.preload.ts | 36 ++++++++++++++- ts/sql/Interface.std.ts | 2 +- ts/sql/server/pinnedMessages.std.ts | 6 +-- ts/state/ducks/conversations.preload.ts | 44 ++++-------------- .../sql/server/pinnedMessages_test.node.ts | 2 +- ts/util/getPinMessageTarget.preload.ts | 45 +++++++++++++++++++ 11 files changed, 117 insertions(+), 42 deletions(-) create mode 100644 ts/util/getPinMessageTarget.preload.ts diff --git a/ts/components/conversation/pinned-messages/PinMessageDialog.dom.tsx b/ts/components/conversation/pinned-messages/PinMessageDialog.dom.tsx index a25588793d..6608951dcf 100644 --- a/ts/components/conversation/pinned-messages/PinMessageDialog.dom.tsx +++ b/ts/components/conversation/pinned-messages/PinMessageDialog.dom.tsx @@ -8,12 +8,14 @@ import { AxoRadioGroup } from '../../../axo/AxoRadioGroup.dom.js'; import { DurationInSeconds } from '../../../util/durations/duration-in-seconds.std.js'; import { strictAssert } from '../../../util/assert.std.js'; import { AxoAlertDialog } from '../../../axo/AxoAlertDialog.dom.js'; +import { isInternalFeaturesEnabled } from '../../../util/isInternalFeaturesEnabled.dom.js'; enum DurationOption { TIME_24_HOURS = 'TIME_24_HOURS', TIME_7_DAYS = 'TIME_7_DAYS', TIME_30_DAYS = 'TIME_30_DAYS', FOREVER = 'FOREVER', + DEBUG_10_SECONDS = 'DEBUG_10_SECONDS', } const DURATION_OPTIONS: Record = { @@ -21,6 +23,7 @@ const DURATION_OPTIONS: Record = { [DurationOption.TIME_7_DAYS]: DurationInSeconds.fromDays(7), [DurationOption.TIME_30_DAYS]: DurationInSeconds.fromDays(30), [DurationOption.FOREVER]: null, + [DurationOption.DEBUG_10_SECONDS]: DurationInSeconds.fromSeconds(10), }; function isValidDurationOption(value: string): value is DurationOption { @@ -152,6 +155,14 @@ export const PinMessageDialog = memo(function PinMessageDialog( {i18n('icu:PinMessageDialog__Option--FOREVER')} + {isInternalFeaturesEnabled() && ( + + + + 10 seconds (Internal) + + + )} diff --git a/ts/jobs/conversationJobQueue.preload.ts b/ts/jobs/conversationJobQueue.preload.ts index dee724de04..1c027ff9ae 100644 --- a/ts/jobs/conversationJobQueue.preload.ts +++ b/ts/jobs/conversationJobQueue.preload.ts @@ -292,6 +292,7 @@ const unpinMessageJobDataSchema = z.object({ targetAuthorAci: aciSchema, targetSentTimestamp: z.number(), unpinnedAt: z.number(), + isSyncOnly: z.boolean(), }); export type UnpinMessageJobData = z.infer; diff --git a/ts/jobs/helpers/createSendMessageJob.preload.ts b/ts/jobs/helpers/createSendMessageJob.preload.ts index 2f8e190f57..1f69aa7748 100644 --- a/ts/jobs/helpers/createSendMessageJob.preload.ts +++ b/ts/jobs/helpers/createSendMessageJob.preload.ts @@ -25,6 +25,7 @@ import { itemStorage } from '../../textsecure/Storage.preload.js'; export type SendMessageJobOptions = Readonly<{ sendName: string; // ex: 'sendExampleMessage' sendType: SendTypesType; + isSyncOnly: (data: Data) => boolean; getMessageId: (data: Data) => string | null; getMessageOptions: ( data: Data @@ -43,6 +44,7 @@ export function createSendMessageJob( const { sendName, sendType, + isSyncOnly, getMessageId, getMessageOptions, getExpirationStartTimestamp, @@ -60,7 +62,9 @@ export function createSendMessageJob( getSendRecipientLists({ log, conversation, - conversationIds: Array.from(conversation.getMemberConversationIds()), + conversationIds: isSyncOnly(data) + ? [window.ConversationController.getOurConversationIdOrThrow()] + : Array.from(conversation.getMemberConversationIds()), }); if (untrustedServiceIds.length > 0) { diff --git a/ts/jobs/helpers/sendPinMessage.preload.ts b/ts/jobs/helpers/sendPinMessage.preload.ts index 3ad7300cbd..b8845c6712 100644 --- a/ts/jobs/helpers/sendPinMessage.preload.ts +++ b/ts/jobs/helpers/sendPinMessage.preload.ts @@ -6,6 +6,9 @@ import { createSendMessageJob } from './createSendMessageJob.preload.js'; export const sendPinMessage = createSendMessageJob({ sendName: 'sendPinMessage', sendType: 'pinMessage', + isSyncOnly() { + return false; + }, getMessageId(data) { return data.targetMessageId; }, diff --git a/ts/jobs/helpers/sendUnpinMessage.preload.ts b/ts/jobs/helpers/sendUnpinMessage.preload.ts index d44a9aae82..69bf2b582e 100644 --- a/ts/jobs/helpers/sendUnpinMessage.preload.ts +++ b/ts/jobs/helpers/sendUnpinMessage.preload.ts @@ -7,6 +7,9 @@ import { createSendMessageJob } from './createSendMessageJob.preload.js'; export const sendUnpinMessage = createSendMessageJob({ sendName: 'sendUnpinMessage', sendType: 'unpinMessage', + isSyncOnly(data) { + return data.isSyncOnly; + }, getMessageId(data) { return data.targetMessageId; }, diff --git a/ts/services/expiring/pinnedMessagesCleanupService.preload.ts b/ts/services/expiring/pinnedMessagesCleanupService.preload.ts index abf40fe363..dc6baae4c5 100644 --- a/ts/services/expiring/pinnedMessagesCleanupService.preload.ts +++ b/ts/services/expiring/pinnedMessagesCleanupService.preload.ts @@ -4,6 +4,12 @@ import { DataReader, DataWriter } from '../../sql/Client.preload.js'; import { createExpiringEntityCleanupService } from './createExpiringEntityCleanupService.std.js'; import { strictAssert } from '../../util/assert.std.js'; +import { + conversationJobQueue, + conversationQueueJobEnum, +} from '../../jobs/conversationJobQueue.preload.js'; +import { getPinnedMessageTarget } from '../../util/getPinMessageTarget.preload.js'; +import { drop } from '../../util/drop.std.js'; export const pinnedMessagesCleanupService = createExpiringEntityCleanupService({ logPrefix: 'PinnedMessages', @@ -23,11 +29,39 @@ export const pinnedMessagesCleanupService = createExpiringEntityCleanupService({ }; }, cleanupExpiredEntities: async () => { - const deletedPinnedMessagesIds = + const deletedPinnedMessages = await DataWriter.deleteAllExpiredPinnedMessagesBefore(Date.now()); + const unpinnedAt = Date.now(); + const deletedPinnedMessagesIds = []; + const changedConversationIds = new Set(); + + for (const pinnedMessage of deletedPinnedMessages) { + deletedPinnedMessagesIds.push(pinnedMessage.id); + changedConversationIds.add(pinnedMessage.conversationId); + // Add to conversation queue without waiting + drop(sendUnpinSync(pinnedMessage.messageId, unpinnedAt)); + } + + for (const conversationId of changedConversationIds) { + window.reduxActions.conversations.onPinnedMessagesChanged(conversationId); + } + return deletedPinnedMessagesIds; }, subscribeToTriggers: () => { return () => null; }, }); + +async function sendUnpinSync(targetMessageId: string, unpinnedAt: number) { + const target = await getPinnedMessageTarget(targetMessageId); + if (target == null) { + return; + } + await conversationJobQueue.add({ + type: conversationQueueJobEnum.enum.UnpinMessage, + ...target, + unpinnedAt, + isSyncOnly: true, + }); +} diff --git a/ts/sql/Interface.std.ts b/ts/sql/Interface.std.ts index 422c5a5985..ce22cc7f07 100644 --- a/ts/sql/Interface.std.ts +++ b/ts/sql/Interface.std.ts @@ -1399,7 +1399,7 @@ type WritableInterface = { deletePinnedMessageByMessageId: (messageId: string) => PinnedMessageId | null; deleteAllExpiredPinnedMessagesBefore: ( beforeTimestamp: number - ) => ReadonlyArray; + ) => ReadonlyArray; removeAll: () => void; removeAllConfiguration: () => void; diff --git a/ts/sql/server/pinnedMessages.std.ts b/ts/sql/server/pinnedMessages.std.ts index 5a23bc90df..354da8dbdd 100644 --- a/ts/sql/server/pinnedMessages.std.ts +++ b/ts/sql/server/pinnedMessages.std.ts @@ -232,11 +232,11 @@ export function getNextExpiringPinnedMessageAcrossConversations( export function deleteAllExpiredPinnedMessagesBefore( db: WritableDB, beforeTimestamp: number -): ReadonlyArray { +): ReadonlyArray { const [query, params] = sql` DELETE FROM pinnedMessages WHERE expiresAt <= ${beforeTimestamp} - RETURNING id + RETURNING * `; - return db.prepare(query, { pluck: true }).all(params); + return db.prepare(query).all(params); } diff --git a/ts/state/ducks/conversations.preload.ts b/ts/state/ducks/conversations.preload.ts index d17dbe3b32..8a1ca37692 100644 --- a/ts/state/ducks/conversations.preload.ts +++ b/ts/state/ducks/conversations.preload.ts @@ -253,6 +253,7 @@ import type { StateThunk } from '../types.std.js'; import { getPinnedMessagesLimit } from '../../util/pinnedMessages.dom.js'; import { getPinnedMessageExpiresAt } from '../../util/pinnedMessages.std.js'; import { pinnedMessagesCleanupService } from '../../services/expiring/pinnedMessagesCleanupService.preload.js'; +import { getPinnedMessageTarget } from '../../util/getPinMessageTarget.preload.js'; const { chunk, @@ -5126,41 +5127,6 @@ function startAvatarDownload( }; } -function getMessageAuthorAci( - message: ReadonlyMessageAttributesType -): AciString { - if (isIncoming(message)) { - strictAssert( - isAciString(message.sourceServiceId), - 'Message sourceServiceId must be an ACI' - ); - return message.sourceServiceId; - } - return itemStorage.user.getCheckedAci(); -} - -type PinnedMessageTarget = ReadonlyDeep<{ - conversationId: string; - targetMessageId: string; - targetAuthorAci: AciString; - targetSentTimestamp: number; -}>; - -async function getPinnedMessageTarget( - targetMessageId: string -): Promise { - const message = await DataReader.getMessageById(targetMessageId); - if (message == null) { - throw new Error('getPinnedMessageTarget: Target message not found'); - } - return { - conversationId: message.conversationId, - targetMessageId: message.id, - targetAuthorAci: getMessageAuthorAci(message), - targetSentTimestamp: message.sent_at, - }; -} - function onPinnedMessagesChanged( conversationId: string ): StateThunk { @@ -5194,6 +5160,10 @@ function onPinnedMessageAdd( ): StateThunk { return async dispatch => { const target = await getPinnedMessageTarget(targetMessageId); + if (target == null) { + throw new Error('onPinnedMessageAdd: Missing target message'); + } + const targetConversation = window.ConversationController.get( target.conversationId ); @@ -5239,10 +5209,14 @@ function onPinnedMessageAdd( function onPinnedMessageRemove(targetMessageId: string): StateThunk { return async dispatch => { const target = await getPinnedMessageTarget(targetMessageId); + if (target == null) { + throw new Error('onPinnedMessageRemove: Missing target message'); + } await conversationJobQueue.add({ type: conversationQueueJobEnum.enum.UnpinMessage, ...target, unpinnedAt: Date.now(), + isSyncOnly: false, }); await DataWriter.deletePinnedMessageByMessageId(targetMessageId); drop(pinnedMessagesCleanupService.trigger('onPinnedMessageRemove')); diff --git a/ts/test-node/sql/server/pinnedMessages_test.node.ts b/ts/test-node/sql/server/pinnedMessages_test.node.ts index 066b80aa6f..9d5804fd07 100644 --- a/ts/test-node/sql/server/pinnedMessages_test.node.ts +++ b/ts/test-node/sql/server/pinnedMessages_test.node.ts @@ -298,7 +298,7 @@ describe('sql/server/pinnedMessages', () => { const row3 = insertPin(getParams('c1', 'c1-m3', 3, 3)); // not expired yet const result = deleteAllExpiredPinnedMessagesBefore(db, 2); assertRows([row3]); - assert.deepEqual(result, [row1.id, row2.id]); + assert.deepEqual(result, [row1, row2]); }); }); }); diff --git a/ts/util/getPinMessageTarget.preload.ts b/ts/util/getPinMessageTarget.preload.ts new file mode 100644 index 0000000000..d8a3eb6e35 --- /dev/null +++ b/ts/util/getPinMessageTarget.preload.ts @@ -0,0 +1,45 @@ +// Copyright 2026 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only + +import { isIncoming } from '../messages/helpers.std.js'; +import type { ReadonlyMessageAttributesType } from '../model-types.js'; +import { DataReader } from '../sql/Client.preload.js'; +import { itemStorage } from '../textsecure/Storage.preload.js'; +import type { AciString } from '../types/ServiceId.std.js'; +import { strictAssert } from './assert.std.js'; +import { isAciString } from './isAciString.std.js'; + +export type PinnedMessageTarget = Readonly<{ + conversationId: string; + targetMessageId: string; + targetAuthorAci: AciString; + targetSentTimestamp: number; +}>; + +function getMessageAuthorAci( + message: ReadonlyMessageAttributesType +): AciString { + if (isIncoming(message)) { + strictAssert( + isAciString(message.sourceServiceId), + 'Message sourceServiceId must be an ACI' + ); + return message.sourceServiceId; + } + return itemStorage.user.getCheckedAci(); +} + +export async function getPinnedMessageTarget( + targetMessageId: string +): Promise { + const message = await DataReader.getMessageById(targetMessageId); + if (message == null) { + return null; + } + return { + conversationId: message.conversationId, + targetMessageId: message.id, + targetAuthorAci: getMessageAuthorAci(message), + targetSentTimestamp: message.sent_at, + }; +} From 15c7f7347bc87cc99490f363c91e9b89b778e62b Mon Sep 17 00:00:00 2001 From: Jamie <113370520+jamiebuilds-signal@users.noreply.github.com> Date: Wed, 14 Jan 2026 12:41:24 -0800 Subject: [PATCH 19/49] Update context menu strings for pin/unpin --- _locales/en/messages.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 9b9f9e6b0c..489505d9b3 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1447,11 +1447,11 @@ "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin message", + "messageformat": "Pin", "description": "Shown on the drop-down menu for an individual message, pins the current message" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin message", + "messageformat": "Unpin", "description": "Shown on the drop-down menu for an individual message, unpins the current message" }, "icu:Poll__end-poll": { @@ -1671,7 +1671,7 @@ "description": "Conversation > With pinned message(s) > Pinned messages bar > More actions menu button > Accessibility label" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin message", + "messageformat": "Unpin", "description": "Conversation > With pinned message(s) > Pinned messages bar > More actions menu > Unpin message" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { From f78213c6d315a86d622e9941d6a68077e61f001a Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Thu, 15 Jan 2026 08:32:26 -0800 Subject: [PATCH 20/49] Release notes for 7.86 --- _locales/en/messages.json | 4 ++++ ts/components/WhatsNewModal.dom.tsx | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 489505d9b3..5c335556ac 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -10160,5 +10160,9 @@ "icu:WhatsNew__7.84--0": { "messageformat": "Signal polls on Desktop now include the same subtle animation effects that were already appearing on your phone. Watching your favorite choice pull away is just a poll away.", "description": "(Deleted 2026/01/07) Release notes for 7.84 release" + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly.", + "description": "Release notes for 7.86 release" } } diff --git a/ts/components/WhatsNewModal.dom.tsx b/ts/components/WhatsNewModal.dom.tsx index 2d8dbe2b4d..534af10ce6 100644 --- a/ts/components/WhatsNewModal.dom.tsx +++ b/ts/components/WhatsNewModal.dom.tsx @@ -43,7 +43,7 @@ export function WhatsNewModal({ const releaseNotes: ReleaseNotesType = { date: new Date(window.getBuildCreation?.() || Date.now()), version: window.getVersion?.(), - features: [], + features: [], }; if (releaseNotes.features.length === 1 && !releaseNotes.header) { From 0f18638f5390c48e24be227d90cbb65fccb0ea09 Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Thu, 15 Jan 2026 08:33:49 -0800 Subject: [PATCH 21/49] Update strings --- _locales/af-ZA/messages.json | 36 +++++++++++++--------- _locales/ar/messages.json | 40 +++++++++++++----------- _locales/az-AZ/messages.json | 36 +++++++++++++--------- _locales/bg-BG/messages.json | 36 +++++++++++++--------- _locales/bn-BD/messages.json | 36 +++++++++++++--------- _locales/bs-BA/messages.json | 36 +++++++++++++--------- _locales/ca/messages.json | 36 +++++++++++++--------- _locales/cs/messages.json | 36 +++++++++++++--------- _locales/da/messages.json | 36 +++++++++++++--------- _locales/de/messages.json | 36 +++++++++++++--------- _locales/el/messages.json | 36 +++++++++++++--------- _locales/en/messages.json | 6 +--- _locales/es/messages.json | 36 +++++++++++++--------- _locales/et-EE/messages.json | 36 +++++++++++++--------- _locales/eu/messages.json | 36 +++++++++++++--------- _locales/fa-IR/messages.json | 36 +++++++++++++--------- _locales/fi/messages.json | 36 +++++++++++++--------- _locales/fr/messages.json | 34 ++++++++++++--------- _locales/ga-IE/messages.json | 36 +++++++++++++--------- _locales/gl-ES/messages.json | 36 +++++++++++++--------- _locales/gu-IN/messages.json | 36 +++++++++++++--------- _locales/he/messages.json | 36 +++++++++++++--------- _locales/hi-IN/messages.json | 36 +++++++++++++--------- _locales/hr-HR/messages.json | 36 +++++++++++++--------- _locales/hu/messages.json | 36 +++++++++++++--------- _locales/id/messages.json | 36 +++++++++++++--------- _locales/it/messages.json | 36 +++++++++++++--------- _locales/ja/messages.json | 36 +++++++++++++--------- _locales/ka-GE/messages.json | 36 +++++++++++++--------- _locales/kk-KZ/messages.json | 36 +++++++++++++--------- _locales/km-KH/messages.json | 36 +++++++++++++--------- _locales/kn-IN/messages.json | 36 +++++++++++++--------- _locales/ko/messages.json | 56 +++++++++++++++++++--------------- _locales/ky-KG/messages.json | 36 +++++++++++++--------- _locales/lt-LT/messages.json | 36 +++++++++++++--------- _locales/lv-LV/messages.json | 36 +++++++++++++--------- _locales/mk-MK/messages.json | 36 +++++++++++++--------- _locales/ml-IN/messages.json | 36 +++++++++++++--------- _locales/mr-IN/messages.json | 36 +++++++++++++--------- _locales/ms/messages.json | 36 +++++++++++++--------- _locales/my/messages.json | 36 +++++++++++++--------- _locales/nb/messages.json | 36 +++++++++++++--------- _locales/nl/messages.json | 34 ++++++++++++--------- _locales/pa-IN/messages.json | 36 +++++++++++++--------- _locales/pl/messages.json | 38 +++++++++++++---------- _locales/pt-BR/messages.json | 36 +++++++++++++--------- _locales/pt-PT/messages.json | 36 +++++++++++++--------- _locales/ro-RO/messages.json | 34 ++++++++++++--------- _locales/ru/messages.json | 36 +++++++++++++--------- _locales/sk-SK/messages.json | 36 +++++++++++++--------- _locales/sl-SI/messages.json | 36 +++++++++++++--------- _locales/sq-AL/messages.json | 36 +++++++++++++--------- _locales/sr/messages.json | 36 +++++++++++++--------- _locales/sv/messages.json | 36 +++++++++++++--------- _locales/sw/messages.json | 36 +++++++++++++--------- _locales/ta-IN/messages.json | 36 +++++++++++++--------- _locales/te-IN/messages.json | 36 +++++++++++++--------- _locales/th/messages.json | 36 +++++++++++++--------- _locales/tl-PH/messages.json | 34 ++++++++++++--------- _locales/tr/messages.json | 36 +++++++++++++--------- _locales/ug/messages.json | 36 +++++++++++++--------- _locales/uk-UA/messages.json | 36 +++++++++++++--------- _locales/ur/messages.json | 36 +++++++++++++--------- _locales/vi/messages.json | 36 +++++++++++++--------- _locales/yue/messages.json | 36 +++++++++++++--------- _locales/zh-CN/messages.json | 36 +++++++++++++--------- _locales/zh-HK/messages.json | 36 +++++++++++++--------- _locales/zh-Hant/messages.json | 36 +++++++++++++--------- 68 files changed, 1417 insertions(+), 1019 deletions(-) diff --git a/_locales/af-ZA/messages.json b/_locales/af-ZA/messages.json index c957fc3203..1358b50528 100644 --- a/_locales/af-ZA/messages.json +++ b/_locales/af-ZA/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Media" }, - "icu:allMedia": { - "messageformat": "Alle media" - }, "icu:today": { "messageformat": "Vandag" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Besig om skerm te deel" }, - "icu:callingDeveloperTools": { - "messageformat": "Skakel Ontwikkelaarhulpmiddels" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Hierdie venster word tydens ontwikkeling gebruik om diagnostiek te vertoon van oproepe wat aan die gang is." - }, "icu:speech": { "messageformat": "Spraak" }, @@ -1092,10 +1083,10 @@ "messageformat": "Inligting" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Merk boodskap met speld" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Verwyder merkspeld by boodskap" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Beëindig meningsopname" @@ -1260,7 +1251,7 @@ "messageformat": "Meer aksies" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Verwyder merkspeld by boodskap" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Gaan na boodskap" @@ -1293,7 +1284,7 @@ "messageformat": "Plakker" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Eenkeerkyk-media" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Foto" @@ -1314,7 +1305,7 @@ "messageformat": "Plakker" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Eenkeerkyk-media" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Boodskappe met speld gemerk" @@ -5157,7 +5148,7 @@ "messageformat": "Klank" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Kontak" }, "icu:LinkPreviewItem__alt": { "messageformat": "Maak die skakel in 'n blaaier oop" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Skakels" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Geen media" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Verbeterde animasie vir Signal-meningsopnames." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/ar/messages.json b/_locales/ar/messages.json index 8ea4d51c99..c9160f93bb 100644 --- a/_locales/ar/messages.json +++ b/_locales/ar/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "الوسائط" }, - "icu:allMedia": { - "messageformat": "جميع الوسائط" - }, "icu:today": { "messageformat": "اليوم" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "مشاركة الشاشة" }, - "icu:callingDeveloperTools": { - "messageformat": "أدوات المُطورين للاتصالات" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "تُستخدَم هذه النافذة خلال التطوير لِعرض التشخيصات من المكالمات الجارية." - }, "icu:speech": { "messageformat": "التحدُّث" }, @@ -1092,10 +1083,10 @@ "messageformat": "معلومات" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "تثبيت رسالة" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "إلغاء تثبيت الرسالة" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "إنهاء الاستطلاع" @@ -1260,7 +1251,7 @@ "messageformat": "إجراءات أخرى" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "إلغاء تثبيت الرسالة" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "انتقل إلى الرسالة" @@ -1293,7 +1284,7 @@ "messageformat": "مُلصَق" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "ملف وسائط للعرض لمرّة واحدة" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "صورة" @@ -1314,7 +1305,7 @@ "messageformat": "مُلصَق" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "ملف وسائط للعرض لمرّة واحدة" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "المُثبَّتة" @@ -1596,7 +1587,7 @@ "messageformat": "إضافة" }, "icu:Preferences__ChatFoldersPage__SuggestedFoldersSection__UnreadFolder__Title": { - "messageformat": "الرسائل غير المقروءة" + "messageformat": "غير المقروءة" }, "icu:Preferences__ChatFoldersPage__SuggestedFoldersSection__UnreadFolder__Description": { "messageformat": "الرسائل غير المقروءة من جميع الدردشات" @@ -5157,7 +5148,7 @@ "messageformat": "الملفات الصوتية" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "جهة الاتصال" }, "icu:LinkPreviewItem__alt": { "messageformat": "افتح الرابط في مُتصفِّح" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "الروابط" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "لا يوجد ملف وسائط" }, @@ -7273,7 +7276,7 @@ "messageformat": "التبرُّع قيد المعالجة…" }, "icu:PreferencesDonations__donate-button-with-amount": { - "messageformat": "تبرَّع لـ {formattedCurrencyAmount}" + "messageformat": "تبرَّع بـ {formattedCurrencyAmount}" }, "icu:PreferencesDonations__mobile-info": { "messageformat": "يمكن إدارة الشارات والتبرُّعات الشهرية على هاتفك المحمول." @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "تتضمن استطلاعات سيجنال على نسخة سطح المكتب الآن نفس تأثيرات الصور المتحركة التي كانت تظهر مُسبقًا على هاتفك. تابِع تقدُّم خيارك المُفضَّل لحظة بلحظة مع كل تصويت." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/az-AZ/messages.json b/_locales/az-AZ/messages.json index 7f417dbb88..db8ba9fbd1 100644 --- a/_locales/az-AZ/messages.json +++ b/_locales/az-AZ/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Media" }, - "icu:allMedia": { - "messageformat": "Bütün Medialar" - }, "icu:today": { "messageformat": "Bu gün" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Ekran paylaşımı" }, - "icu:callingDeveloperTools": { - "messageformat": "Zənglərlə əlaqəli tərtibatçı alətləri" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Bu pəncərə tərtibat zamanı davam edən zənglərin diaqnostikalarını göstərmək üçün istifadə olunur." - }, "icu:speech": { "messageformat": "Danışma" }, @@ -1092,10 +1083,10 @@ "messageformat": "Məlumat" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Mesajı sancaqla" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Mesajı sancaqlamadan çıxardın" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Səsverməni bitir" @@ -1260,7 +1251,7 @@ "messageformat": "Daha çox əməliyyat" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Mesajı sancaqlamadan çıxardın" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Mesaja keç" @@ -1293,7 +1284,7 @@ "messageformat": "Stiker" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Bir dəfə baxıla bilən media" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Foto" @@ -1314,7 +1305,7 @@ "messageformat": "Stiker" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Bir dəfə baxıla bilən media" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Sancaqlanmış mesajlar" @@ -5157,7 +5148,7 @@ "messageformat": "Səs" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Əlaqə" }, "icu:LinkPreviewItem__alt": { "messageformat": "Keçidi brauzerdə aç" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Keçidlər" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Media yoxdur" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Artıq Signal-ın Desktop tətbiqindəki səsvermələr telefonunuzda görünən eyni animasiya effektlərinə malikdir. Seçiminizin birinci olduğunu izləmək sadəcə bir səsvermə qədər yaxındır." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/bg-BG/messages.json b/_locales/bg-BG/messages.json index 8d16b97a83..2c0b96c6f5 100644 --- a/_locales/bg-BG/messages.json +++ b/_locales/bg-BG/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Медия" }, - "icu:allMedia": { - "messageformat": "Всички Медии" - }, "icu:today": { "messageformat": "Днес" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Сподели екрана" }, - "icu:callingDeveloperTools": { - "messageformat": "Инструменти за разговори за разработчици" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Този прозорец се използва по време на разработката за показване на диагностика от текущи разговори." - }, "icu:speech": { "messageformat": "Говор" }, @@ -1092,10 +1083,10 @@ "messageformat": "Информация" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Закачване на съобщение" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Откачане на съобщението" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Приключване на анкетата" @@ -1260,7 +1251,7 @@ "messageformat": "Повече опции" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Откачане на съобщението" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Към съобщението" @@ -1293,7 +1284,7 @@ "messageformat": "Стикер" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Мултимедия за еднократно гледане" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Изображение" @@ -1314,7 +1305,7 @@ "messageformat": "Стикер" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Мултимедия за еднократно гледане" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Закачени съобщения" @@ -5157,7 +5148,7 @@ "messageformat": "Аудио" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Контакт" }, "icu:LinkPreviewItem__alt": { "messageformat": "Отваряне на линка в браузъра" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Линкове" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Няма мултимедия" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Подобрени анимации за анкети в Signal." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/bn-BD/messages.json b/_locales/bn-BD/messages.json index 6c9bf13d2c..566aa822a8 100644 --- a/_locales/bn-BD/messages.json +++ b/_locales/bn-BD/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "মিডিয়া" }, - "icu:allMedia": { - "messageformat": "সমস্ত মিডিয়া" - }, "icu:today": { "messageformat": "আজ" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "স্ক্রিন শেয়ার করা" }, - "icu:callingDeveloperTools": { - "messageformat": "ডেভেলপার টুল কল করা হচ্ছে" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "চলমান কল থেকে ডায়াগনস্টিক প্রদর্শন করতে এই উইন্ডোটি ডেভেলপমেন্ট করার সময় ব্যবহার করা হয়।" - }, "icu:speech": { "messageformat": "বক্তৃতা" }, @@ -1092,10 +1083,10 @@ "messageformat": "তথ্য" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "মেসেজ পিন করুন" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "মেসেজ আনপিন করুন" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "ভোটগ্রহণ কার্যক্রমটি শেষ করুন" @@ -1260,7 +1251,7 @@ "messageformat": "আরও ক্রিয়া" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "মেসেজ আনপিন করুন" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "মেসেজ-এ যান" @@ -1293,7 +1284,7 @@ "messageformat": "স্টিকার" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "একবার দেখা যাবে এমন মিডিয়া" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "ছবি" @@ -1314,7 +1305,7 @@ "messageformat": "স্টিকার" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "একবার দেখা যাবে এমন মিডিয়া" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "মেসেজ পিন করুন" @@ -5157,7 +5148,7 @@ "messageformat": "শব্দ" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "পরিচিতি" }, "icu:LinkPreviewItem__alt": { "messageformat": "একটি ব্রাউজারে লিংকটি খুলুন" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "লিংকসমূহ" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "কোনো মিডিয়া নেই" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Signal জরিপে এখন আরো উন্নত অ্যানিমেশন।" + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/bs-BA/messages.json b/_locales/bs-BA/messages.json index b80e24ac1e..1dc53b60f1 100644 --- a/_locales/bs-BA/messages.json +++ b/_locales/bs-BA/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Slike" }, - "icu:allMedia": { - "messageformat": "Sve medijske datoteke" - }, "icu:today": { "messageformat": "Danas" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Dijeljenje ekrana" }, - "icu:callingDeveloperTools": { - "messageformat": "Alati za programere povezani s pozivima" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Ovaj prozor se koristi tokom razvoja za prikaz dijagnostike iz odlaznih poziva." - }, "icu:speech": { "messageformat": "Govor" }, @@ -1092,10 +1083,10 @@ "messageformat": "Informacije" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Zakači poruku" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Otkači poruku" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Završi anketu" @@ -1260,7 +1251,7 @@ "messageformat": "Više radnji" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Otkači poruku" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Idi na poruku" @@ -1293,7 +1284,7 @@ "messageformat": "Naljepnica" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Jednokratni medij" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Fotografija" @@ -1314,7 +1305,7 @@ "messageformat": "Naljepnica" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Jednokratni medij" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Zakačene poruke" @@ -5157,7 +5148,7 @@ "messageformat": "Zvuk" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Kontakt" }, "icu:LinkPreviewItem__alt": { "messageformat": "Otvorite link u pregledniku" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Linkovi" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Nema medijskih zapisa" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Unaprijedili smo animacije za ankete na Signalu." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/ca/messages.json b/_locales/ca/messages.json index c728996083..89e99c27e4 100644 --- a/_locales/ca/messages.json +++ b/_locales/ca/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Elements multimèdia" }, - "icu:allMedia": { - "messageformat": "Tot el contingut" - }, "icu:today": { "messageformat": "Avui" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Compartició de pantalla" }, - "icu:callingDeveloperTools": { - "messageformat": "Eines de desenvolupament de trucada" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Aquesta finestra s'utilitza durant el desenvolupament per mostrar els diagnòstics de les trucades en curs." - }, "icu:speech": { "messageformat": "Discurs" }, @@ -1092,10 +1083,10 @@ "messageformat": "Informació" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Fixar missatge" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Desfixar missatge" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Finalitzar enquesta" @@ -1260,7 +1251,7 @@ "messageformat": "Més accions" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Desfixar missatge" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Ves a Missatge" @@ -1293,7 +1284,7 @@ "messageformat": "Adhesiu" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Contingut d'una sola visualització" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Foto" @@ -1314,7 +1305,7 @@ "messageformat": "Adhesiu" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Contingut d'una sola visualització" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Missatges fixats" @@ -5157,7 +5148,7 @@ "messageformat": "Àudio" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Contacte" }, "icu:LinkPreviewItem__alt": { "messageformat": "Obre l'enllaç en un navegador" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Enllaços" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "No hi ha cap arxiu multimèdia" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Millores a les animacions de les enquestes de Signal." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/cs/messages.json b/_locales/cs/messages.json index 9f2bb66509..5cb1fec9a2 100644 --- a/_locales/cs/messages.json +++ b/_locales/cs/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Média" }, - "icu:allMedia": { - "messageformat": "Všechna média" - }, "icu:today": { "messageformat": "Dnes" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Sdílení obrazovky" }, - "icu:callingDeveloperTools": { - "messageformat": "Vývojářské nástroje pro volání" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Toto okno slouží během vývoje k zobrazení diagnostiky probíhajících volání." - }, "icu:speech": { "messageformat": "Řeč" }, @@ -1092,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Připnout zprávu" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Odepnout zprávu" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Ukončit anketu" @@ -1260,7 +1251,7 @@ "messageformat": "Další akce" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Odepnout zprávu" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Přejít na zprávu" @@ -1293,7 +1284,7 @@ "messageformat": "Nálepka" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Média, která lze zobrazit jen jednou" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Fotografie" @@ -1314,7 +1305,7 @@ "messageformat": "Nálepka" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Média, která lze zobrazit jen jednou" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Připnuté zprávy" @@ -5157,7 +5148,7 @@ "messageformat": "Audio" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Kontakt" }, "icu:LinkPreviewItem__alt": { "messageformat": "Otevřít odkaz v prohlížeči" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Odkazy" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Žádná média" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Vylepšená animace pro ankety Signal." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/da/messages.json b/_locales/da/messages.json index 5ee838176b..5dc41c6f95 100644 --- a/_locales/da/messages.json +++ b/_locales/da/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Mediefiler" }, - "icu:allMedia": { - "messageformat": "Alle mediefiler" - }, "icu:today": { "messageformat": "I dag" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Deling af skærm" }, - "icu:callingDeveloperTools": { - "messageformat": "Opkald til udviklerværktøjer" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Dette vindue bruges under udvikling for at vise diagnostik fra igangværende opkald." - }, "icu:speech": { "messageformat": "Tale" }, @@ -1092,10 +1083,10 @@ "messageformat": "Information" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Fastgør besked" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Frigør besked" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Afslut afstemning" @@ -1260,7 +1251,7 @@ "messageformat": "Flere handlinger" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Frigør besked" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Gå til besked" @@ -1293,7 +1284,7 @@ "messageformat": "Klistermærke" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Vis mediefil én gang" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Billede" @@ -1314,7 +1305,7 @@ "messageformat": "Klistermærke" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Vis mediefil én gang" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Fastgjorte beskeder" @@ -5157,7 +5148,7 @@ "messageformat": "Lyd" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Kontakt" }, "icu:LinkPreviewItem__alt": { "messageformat": "Åbn linket i en browser" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Links" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Ingen mediefiler" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Afstemninger i Signal på computer har nu de samme diskrete animationer som på din telefon. Det kræver kun en afstemning at se dit favoritvalg trække fra." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/de/messages.json b/_locales/de/messages.json index da18c3e355..0aeeef3453 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Medieninhalte" }, - "icu:allMedia": { - "messageformat": "Medienübersicht" - }, "icu:today": { "messageformat": "Heute" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Teilen des Bildschirms" }, - "icu:callingDeveloperTools": { - "messageformat": "Entwicklungswerkzeuge für Anrufe" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Dieses Fenster wird während der Entwicklung verwendet, um die Diagnosen laufender Aufrufe anzuzeigen." - }, "icu:speech": { "messageformat": "Sprachausgabe" }, @@ -1092,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Nachricht fixieren" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Nachricht lösen" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Umfrage beenden" @@ -1260,7 +1251,7 @@ "messageformat": "Weitere Aktionen" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Nachricht lösen" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Zur Nachricht" @@ -1293,7 +1284,7 @@ "messageformat": "Sticker" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Medien zur Einmalansicht" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Foto" @@ -1314,7 +1305,7 @@ "messageformat": "Sticker" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Medien zur Einmalansicht" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Fixierte Nachrichten" @@ -5157,7 +5148,7 @@ "messageformat": "Audio" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Kontakt" }, "icu:LinkPreviewItem__alt": { "messageformat": "Link in einem Browser öffnen" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Links" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Keine Medieninhalte" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Signal-Umfragen auf Desktops sind ab jetzt mit denselben dezenten Animationen ausgestattet, die bereits auf deinem Handy zu sehen waren. Mit der nächsten Umfrage könnte dein Favorit abziehen." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/el/messages.json b/_locales/el/messages.json index 08f4c7647b..852552b167 100644 --- a/_locales/el/messages.json +++ b/_locales/el/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Μέσα" }, - "icu:allMedia": { - "messageformat": "Όλα τα Πολυμέσα" - }, "icu:today": { "messageformat": "Σήμερα" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Διαμοιρασμός οθόνης" }, - "icu:callingDeveloperTools": { - "messageformat": "Κλήση εργαλείων προγραμματιστή" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Αυτό το παράθυρο χρησιμοποιείται κατά τη διάρκεια του προγραμματισμού για την εμφάνιση διαγνωστικών από τρέχουσες κλήσεις." - }, "icu:speech": { "messageformat": "Ομιλία" }, @@ -1092,10 +1083,10 @@ "messageformat": "Πληροφορίες" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Καρφίτσωμα μηνύματος" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Κατάργηση καρφιτσώματος μηνύματος" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Λήξη δημοσκόπησης" @@ -1260,7 +1251,7 @@ "messageformat": "Περισσότερες ενέργειες" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Κατάργηση καρφιτσώματος μηνύματος" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Μετάβαση στο Μήνυμα" @@ -1293,7 +1284,7 @@ "messageformat": "Αυτοκόλλητο" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Πολυμέσο μιας μόνο προβολής" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Φωτογραφία" @@ -1314,7 +1305,7 @@ "messageformat": "Αυτοκόλλητο" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Πολυμέσο μιας μόνο προβολής" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Καρφιτσωμένα μηνύματα" @@ -5157,7 +5148,7 @@ "messageformat": "Ήχος" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Επαφή" }, "icu:LinkPreviewItem__alt": { "messageformat": "Άνοιγμα του συνδέσμου σε ένα πρόγραμμα περιήγησης" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Σύνδεσμοι" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Κανένα πολυμέσο" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Οι δημοσκοπήσεις Signal στην επιφάνεια εργασίας περιλαμβάνουν πλέον τα ίδια ανεπαίσθητα εφέ κίνησης που εμφανίζονταν ήδη στο τηλέφωνό σου." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 5c335556ac..2840b419ad 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -293,7 +293,7 @@ }, "icu:viewMenuOpenCallingDevTools": { "messageformat": "Open Calling Developer Tools", - "description": "View menu command to open calling developer tools window" + "description": "(Deleted 2026/01/15) View menu command to open calling developer tools window" }, "icu:menuSetupAsNewDevice": { "messageformat": "Set Up as New Device", @@ -812,10 +812,6 @@ "messageformat": "Media", "description": "Header of the default pane in the media gallery, showing images and videos" }, - "icu:allMedia": { - "messageformat": "All Media", - "description": "(Deleted 2025/12/10) Header for the media gallery" - }, "icu:today": { "messageformat": "Today", "description": "The string \"today\"" diff --git a/_locales/es/messages.json b/_locales/es/messages.json index aa9365ae93..871897564f 100644 --- a/_locales/es/messages.json +++ b/_locales/es/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Multimedia" }, - "icu:allMedia": { - "messageformat": "Todos los archivos" - }, "icu:today": { "messageformat": "Hoy" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Compartir pantalla" }, - "icu:callingDeveloperTools": { - "messageformat": "Herramientas para desarrolladores de llamadas" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Esta ventana se utiliza durante el desarrollo para mostrar los diagnósticos de las llamadas en curso." - }, "icu:speech": { "messageformat": "Leer en voz alta" }, @@ -1092,10 +1083,10 @@ "messageformat": "Detalles" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Fijar mensaje" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Desfijar mensaje" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Finalizar encuesta" @@ -1260,7 +1251,7 @@ "messageformat": "Más acciones" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Desfijar mensaje" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Ir al mensaje" @@ -1293,7 +1284,7 @@ "messageformat": "Sticker" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Archivo de visualización única" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Foto" @@ -1314,7 +1305,7 @@ "messageformat": "Sticker" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Archivo de visualización única" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Mensajes fijados" @@ -5157,7 +5148,7 @@ "messageformat": "Audio" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Contacto" }, "icu:LinkPreviewItem__alt": { "messageformat": "Abre el enlace en un navegador" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Enlaces" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "No hay archivos multimedia" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Las encuestas en Signal Desktop ahora incluyen los mismos efectos de animación que ya veías en tu teléfono. Estás a una sola encuesta de distancia de ver cómo tu opción favorita toma la delantera." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/et-EE/messages.json b/_locales/et-EE/messages.json index d065996e56..102723466b 100644 --- a/_locales/et-EE/messages.json +++ b/_locales/et-EE/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Meedia" }, - "icu:allMedia": { - "messageformat": "Kõik meediafailid" - }, "icu:today": { "messageformat": "Täna" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Ekraani jagamine" }, - "icu:callingDeveloperTools": { - "messageformat": "Kõne arendusvahendid" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Seda akent kasutatakse arenduse ajal, et kuvada parasjagu käimasoleva kõne diagnostikat." - }, "icu:speech": { "messageformat": "Kõne" }, @@ -1092,10 +1083,10 @@ "messageformat": "Teave" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Tõsta sõnum esile" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Eemalda sõnumi esiletõst" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Lõpeta küsitlus" @@ -1260,7 +1251,7 @@ "messageformat": "Rohkem tegevusi" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Eemalda sõnumi esiletõst" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Mine sõnumi juurde" @@ -1293,7 +1284,7 @@ "messageformat": "Kleeps" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Ühekordselt vaadatav meedia" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Foto" @@ -1314,7 +1305,7 @@ "messageformat": "Kleeps" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Ühekordselt vaadatav meedia" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Esiletõstetud sõnumid" @@ -5157,7 +5148,7 @@ "messageformat": "Audio" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Kontakt" }, "icu:LinkPreviewItem__alt": { "messageformat": "Ava link brauseris" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Lingid" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Meedia puudub" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Signali küsitlustel on nüüd paremad animatsioonid." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/eu/messages.json b/_locales/eu/messages.json index 5407a81dda..712201aaf1 100644 --- a/_locales/eu/messages.json +++ b/_locales/eu/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Multimedia-edukia" }, - "icu:allMedia": { - "messageformat": "Multimedia-eduki guztia" - }, "icu:today": { "messageformat": "Gaur" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Pantaila partekatzen" }, - "icu:callingDeveloperTools": { - "messageformat": "Deietarako garatzaile-tresnak" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Leiho hau garapen-fasean erakusten da, abian diren deien diagnostikoak bistaratzeko." - }, "icu:speech": { "messageformat": "Hizketa" }, @@ -1092,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Ainguratu mezua" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Kendu aingura mezuari" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Amaitu galdeketa" @@ -1260,7 +1251,7 @@ "messageformat": "Ekintza gehiago" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Kendu aingura mezuari" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Joan mezura" @@ -1293,7 +1284,7 @@ "messageformat": "Eranskailua" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Behi ikusteko multimedia" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Argazkia" @@ -1314,7 +1305,7 @@ "messageformat": "Eranskailua" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Behi ikusteko multimedia" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Ainguratutako mezuak" @@ -5157,7 +5148,7 @@ "messageformat": "Audioa" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Kontaktua" }, "icu:LinkPreviewItem__alt": { "messageformat": "Ireki esteka arakatzaile batean" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Estekak" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Euskarririk ez" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Signal-eko galdeketetako animazioak hobetu egin dira." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/fa-IR/messages.json b/_locales/fa-IR/messages.json index d47e402d46..18482aa053 100644 --- a/_locales/fa-IR/messages.json +++ b/_locales/fa-IR/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "رسانه" }, - "icu:allMedia": { - "messageformat": "تمام رسانه‌ها" - }, "icu:today": { "messageformat": "امروز" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "اشتراک صفحه" }, - "icu:callingDeveloperTools": { - "messageformat": "ابزارهای توسعه‌دهنده تماس" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "این پنجره حین توسعه برای نمایش عیب‌یابی تماس‌های جاری استفاده می‌شود." - }, "icu:speech": { "messageformat": "صحبت" }, @@ -1092,10 +1083,10 @@ "messageformat": "اطلاعات" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "سنجاق کردن پیام" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "برداشتن سنجاق پیام" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "پایان نظرسنجی" @@ -1260,7 +1251,7 @@ "messageformat": "اقدامات بیشتر" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "برداشتن سنجاق پیام" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "رفتن به پیام" @@ -1293,7 +1284,7 @@ "messageformat": "استیکر" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "رسانهٔ یکبار مصرف" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "تصویر" @@ -1314,7 +1305,7 @@ "messageformat": "استیکر" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "رسانهٔ یکبار مصرف" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "پیام‌های سنجاق‌شده" @@ -5157,7 +5148,7 @@ "messageformat": "صوت" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "مخاطب" }, "icu:LinkPreviewItem__alt": { "messageformat": "باز کردن پیوند در مرورگر" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "پیوندها" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "رسانه‌ای موجود نیست" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "پویانمایی‌ها را برای نظرسنجی‌های سیگنال بهبود دادیم. ‌" + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/fi/messages.json b/_locales/fi/messages.json index b3e5150754..102f87b4ef 100644 --- a/_locales/fi/messages.json +++ b/_locales/fi/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Media" }, - "icu:allMedia": { - "messageformat": "Kaikki media" - }, "icu:today": { "messageformat": "Tänään" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Näytön jakaminen" }, - "icu:callingDeveloperTools": { - "messageformat": "Soittamisen kehittäjätyökalut" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Tätä ikkunaa käytetään ohjelmistokehityksen aikana käynnissä olevien puhelujen diagnostiikkatietojen näyttämiseen." - }, "icu:speech": { "messageformat": "Puhe" }, @@ -1092,10 +1083,10 @@ "messageformat": "Tietoja" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Kiinnitä viesti" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Poista viestin kiinnitys" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Lopeta kysely" @@ -1260,7 +1251,7 @@ "messageformat": "Lisätoimintoja" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Poista viestin kiinnitys" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Siirry viestiin" @@ -1293,7 +1284,7 @@ "messageformat": "Tarra" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Kerran katsottava media" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Kuva" @@ -1314,7 +1305,7 @@ "messageformat": "Tarra" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Kerran katsottava media" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Kiinnitetyt viestit" @@ -5157,7 +5148,7 @@ "messageformat": "Ääni" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Yhteystieto" }, "icu:LinkPreviewItem__alt": { "messageformat": "Avaa linkki selaimessa" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Linkit" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Ei mediatiedostoja" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Parannetut animaatiot kyselyissä Signal Desktopissa." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index 26301c3cc5..427c91c1a0 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Médias" }, - "icu:allMedia": { - "messageformat": "Tous les médias" - }, "icu:today": { "messageformat": "Aujourd'hui" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Écran partagé" }, - "icu:callingDeveloperTools": { - "messageformat": "Outils d’appel pour développeurs" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "En phase de développement, cette fenêtre sert à afficher les diagnostics des appels en cours." - }, "icu:speech": { "messageformat": "Énoncer à voix haute" }, @@ -1092,10 +1083,10 @@ "messageformat": "Infos" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Épingler le message" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Détacher le message" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Arrêter le sondage" @@ -1260,7 +1251,7 @@ "messageformat": "Autres actions" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Détacher le message" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Accéder au message" @@ -1293,7 +1284,7 @@ "messageformat": "Sticker" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Média à vue unique" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Photo" @@ -1314,7 +1305,7 @@ "messageformat": "Sticker" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Média à vue unique" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Messages épinglés" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Liens" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Aucun média" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Chez Signal, on vote pour l'homogénéité ! C'est pourquoi les sondages sur ordinateur incluent désormais les mêmes petits effets d'animation que sur mobile." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/ga-IE/messages.json b/_locales/ga-IE/messages.json index 37d2c62878..e2efa2a2a5 100644 --- a/_locales/ga-IE/messages.json +++ b/_locales/ga-IE/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Meáin" }, - "icu:allMedia": { - "messageformat": "Meáin" - }, "icu:today": { "messageformat": "Inniu" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Comhroinnt scáileáin" }, - "icu:callingDeveloperTools": { - "messageformat": "Uirlisí Forbróra um Ghlaoch" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Úsáidtear an fhuinneog seo le linn na forbartha chun diagnóisic ó ghlaonna leanúnacha a thaispeáint." - }, "icu:speech": { "messageformat": "Labhairt" }, @@ -1092,10 +1083,10 @@ "messageformat": "Eolas" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Greamaigh an teachtaireacht" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Díghreamaigh an teachtaireacht" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Cuir deireadh leis an suirbhé" @@ -1260,7 +1251,7 @@ "messageformat": "Tuilleadh gníomhartha" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Díghreamaigh an teachtaireacht" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Téigh chuig an teachtaireacht" @@ -1293,7 +1284,7 @@ "messageformat": "Greamán" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Meán amhairc aonuaire" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Grianghraf" @@ -1314,7 +1305,7 @@ "messageformat": "Greamán" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Meán amhairc aonuaire" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Teachtaireachtaí greamaithe" @@ -5157,7 +5148,7 @@ "messageformat": "Fuaim" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Teagmhálaí" }, "icu:LinkPreviewItem__alt": { "messageformat": "Oscail an nasc i mbrabhsálaí" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Naisc" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Níl aon mheán ann" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Beochan fheabhsaithe do shuirbhéanna Signal." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/gl-ES/messages.json b/_locales/gl-ES/messages.json index f2a462fd7b..f97925a288 100644 --- a/_locales/gl-ES/messages.json +++ b/_locales/gl-ES/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Multimedia" }, - "icu:allMedia": { - "messageformat": "Contido multimedia" - }, "icu:today": { "messageformat": "Hoxe" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Compartir pantalla" }, - "icu:callingDeveloperTools": { - "messageformat": "Rexistro das ferramentas de desenvolvemento" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Esta xanela emprégase durante o desenvolvemento para mostrar os diagnósticos das chamadas en curso." - }, "icu:speech": { "messageformat": "Voz" }, @@ -1092,10 +1083,10 @@ "messageformat": "Información" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Fixar mensaxe" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Soltar mensaxe" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Rematar enquisa" @@ -1260,7 +1251,7 @@ "messageformat": "Máis accións" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Soltar mensaxe" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Ir á mensaxe" @@ -1293,7 +1284,7 @@ "messageformat": "Sticker" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Multimedia dunha soa visualización" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Fotografía" @@ -1314,7 +1305,7 @@ "messageformat": "Sticker" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Multimedia dunha soa visualización" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Mensaxes fixadas" @@ -5157,7 +5148,7 @@ "messageformat": "Son" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Contacto" }, "icu:LinkPreviewItem__alt": { "messageformat": "Abre a ligazón nun navegador" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Ligazóns" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Sen ficheiros multimedia" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Animación mellorada para as enquisas de Signal." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/gu-IN/messages.json b/_locales/gu-IN/messages.json index 524ce9615b..1d622267e4 100644 --- a/_locales/gu-IN/messages.json +++ b/_locales/gu-IN/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "મીડિયા" }, - "icu:allMedia": { - "messageformat": "બધા મીડિયા" - }, "icu:today": { "messageformat": "આજે" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "શેરિંગ સ્ક્રીન" }, - "icu:callingDeveloperTools": { - "messageformat": "કૉલિંગ ડેવલપર્સના ટૂલ" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "આ વિન્ડોનો ઉપયોગ વિકાસ દરમિયાન ચાલુ કૉલમાંથી ડાયગ્નોસ્ટિક્સ પ્રદર્શિત કરવા માટે થાય છે." - }, "icu:speech": { "messageformat": "સ્પીચ" }, @@ -1092,10 +1083,10 @@ "messageformat": "માહિતી" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "મેસેજને પિન કરો" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "મેસેજને અનપિન કરો" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "મતદાન સમાપ્ત કરો" @@ -1260,7 +1251,7 @@ "messageformat": "વધુ પગલાં" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "મેસેજને અનપિન કરો" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "મેસેજ પર જાઓ" @@ -1293,7 +1284,7 @@ "messageformat": "સ્ટીકર" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "એકવાર મીડિયા જુઓ" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "ફોટો" @@ -1314,7 +1305,7 @@ "messageformat": "સ્ટીકર" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "એકવાર મીડિયા જુઓ" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "પિન કરેલા મેસેજ" @@ -5157,7 +5148,7 @@ "messageformat": "ઓડિયો" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "સંપર્ક" }, "icu:LinkPreviewItem__alt": { "messageformat": "બ્રાઉઝરમાં લિંક ખોલો" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "લિંક" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "કોઈ મીડિયા નથી" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Signal મતદાન માટે એનિમેશન બહેતર બનાવ્યું." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/he/messages.json b/_locales/he/messages.json index 06e2178045..e7a8ce2915 100644 --- a/_locales/he/messages.json +++ b/_locales/he/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "מדיה" }, - "icu:allMedia": { - "messageformat": "כל המדיה" - }, "icu:today": { "messageformat": "היום" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "שיתוף מסך" }, - "icu:callingDeveloperTools": { - "messageformat": "כלים למפתחים בנושא שיחות" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "החלון הזה משמש בזמן הפיתוח כדי להציג נתונים משיחות פעילות." - }, "icu:speech": { "messageformat": "דיבור" }, @@ -1092,10 +1083,10 @@ "messageformat": "מידע" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "הצמדת הודעה" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "ביטול הצמדת הודעה" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "סיום סקר" @@ -1260,7 +1251,7 @@ "messageformat": "פעולות נוספות" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "ביטול הצמדת הודעה" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "מעבר להודעה" @@ -1293,7 +1284,7 @@ "messageformat": "מדבקה" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "מדיה לצפייה חד–פעמית" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "תצלום" @@ -1314,7 +1305,7 @@ "messageformat": "מדבקה" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "מדיה לצפייה חד–פעמית" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "הודעות מוצמדות" @@ -5157,7 +5148,7 @@ "messageformat": "שמע" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "איש קשר" }, "icu:LinkPreviewItem__alt": { "messageformat": "פתיחת קישור בדפדפן" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "קישורים" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "אין מדיה" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "אנימציה משופרת עבור סקרי Signal." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/hi-IN/messages.json b/_locales/hi-IN/messages.json index 6cf344821a..c7d7507499 100644 --- a/_locales/hi-IN/messages.json +++ b/_locales/hi-IN/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "मीडिया" }, - "icu:allMedia": { - "messageformat": "सभी मीडिया" - }, "icu:today": { "messageformat": "आज" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "स्क्रीन शेयर करना" }, - "icu:callingDeveloperTools": { - "messageformat": "कॉलिंग डेवलपर टूल्स" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "इस विंडो का इस्तेमाल डेवलपमेंट के दौरान चल रही कॉल से डायग्नोस्टिक्स प्रदर्शित करने के लिए किया जाता है।" - }, "icu:speech": { "messageformat": "स्पीच" }, @@ -1092,10 +1083,10 @@ "messageformat": "जानकारी" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "मैसेज पिन करें" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "मैसेज अनपिन करें" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "पोल समाप्त करें" @@ -1260,7 +1251,7 @@ "messageformat": "और गतिविधियां" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "मैसेज अनपिन करें" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "मैसेज पर जाएं" @@ -1293,7 +1284,7 @@ "messageformat": "स्टिकर" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "सिर्फ़ एक बार देखे जा सकने वाला मीडिया" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "फ़ोटो" @@ -1314,7 +1305,7 @@ "messageformat": "स्टिकर" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "सिर्फ़ एक बार देखे जा सकने वाला मीडिया" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "पिन किए गए मैसेज" @@ -5157,7 +5148,7 @@ "messageformat": "ऑडियो" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "कॉन्टैक्ट" }, "icu:LinkPreviewItem__alt": { "messageformat": "लिंक को किसी ब्राउज़र में खोलें" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "लिंक" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "मीडिया मौजूद नहीं है" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "डेस्कटॉप पर Signal पोल में अब वही छोटे ऐनिमेशन इफ़ेक्ट शामिल किए गए हैं जो आपके फ़ोन पर पहले से दिख रहे थे। बस किसी पोल में हिस्सा लें और अपने पसंदीदा विकल्प को जीत की ओर बढ़ते देखें।" + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/hr-HR/messages.json b/_locales/hr-HR/messages.json index 6af04076b2..a163a81204 100644 --- a/_locales/hr-HR/messages.json +++ b/_locales/hr-HR/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Medijski zapis" }, - "icu:allMedia": { - "messageformat": "Svi medijski zapisi" - }, "icu:today": { "messageformat": "Danas" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Dijeli zaslon" }, - "icu:callingDeveloperTools": { - "messageformat": "Razvojni alati za pozive" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Ovaj se prozor koristi tijekom razvoja za prikaz dijagnostike poziva u tijeku." - }, "icu:speech": { "messageformat": "Govor" }, @@ -1092,10 +1083,10 @@ "messageformat": "Detalji" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Prikvači poruku" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Otkvači poruku" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Završi anketu" @@ -1260,7 +1251,7 @@ "messageformat": "Više radnji" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Otkvači poruku" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Idi na poruku" @@ -1293,7 +1284,7 @@ "messageformat": "Naljepnica" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Jednom vidljiv medijski zapis" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Fotografija" @@ -1314,7 +1305,7 @@ "messageformat": "Naljepnica" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Jednom vidljiv medijski zapis" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Prikvačene poruke" @@ -5157,7 +5148,7 @@ "messageformat": "Zvuk" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Kontakt" }, "icu:LinkPreviewItem__alt": { "messageformat": "Otvorite poveznicu u pregledniku" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Poveznice" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Nema medijskih zapisa" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Unaprijedili smo animacije za ankete na Signalu." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/hu/messages.json b/_locales/hu/messages.json index b34cec0a86..f4a6ea26f5 100644 --- a/_locales/hu/messages.json +++ b/_locales/hu/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Média" }, - "icu:allMedia": { - "messageformat": "Összes médiafájl" - }, "icu:today": { "messageformat": "Ma" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Képernyő megosztása" }, - "icu:callingDeveloperTools": { - "messageformat": "Hívással kapcsolatos fejlesztői eszközök" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Ez az ablak a fejlesztés során a folyamatban lévő hívások diagnosztikájának megjelenítésére szolgál." - }, "icu:speech": { "messageformat": "Beszéd" }, @@ -1092,10 +1083,10 @@ "messageformat": "Részletek" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Üzenet rögzítése" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Üzenet rögzítésének feloldása" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Szavazás befejezése" @@ -1260,7 +1251,7 @@ "messageformat": "További tevékenységek" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Üzenet rögzítésének feloldása" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Ugrás az Üzenetekhez" @@ -1293,7 +1284,7 @@ "messageformat": "Matrica" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Egyszer megjelenő médiafájl" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Fotó" @@ -1314,7 +1305,7 @@ "messageformat": "Matrica" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Egyszer megjelenő médiafájl" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Rögzített üzenetek" @@ -5157,7 +5148,7 @@ "messageformat": "Hang" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Névjegy" }, "icu:LinkPreviewItem__alt": { "messageformat": "Hivatkozás megnyitása egy böngészőben" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Hivatkozások" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Nincs médiafájl" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Az Asztalon megjelenő Signal-szavazatok mostantól ugyanazokat a finom animációs effektusokat tartalmazzák, mint amelyek már eddig is megjelentek a telefonodon. Csak egy szavazásnyira vagy attól, hogy kedvenc jelölted elhúzzon a többiektől." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/id/messages.json b/_locales/id/messages.json index 9715c9cfdc..21a0900cbf 100644 --- a/_locales/id/messages.json +++ b/_locales/id/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Media" }, - "icu:allMedia": { - "messageformat": "Semua Media" - }, "icu:today": { "messageformat": "Hari ini" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Berbagi layar" }, - "icu:callingDeveloperTools": { - "messageformat": "Alat Pengembang Panggilan" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Jendela ini digunakan selama proses pengembangan untuk menampilkan diagnostik dari panggilan yang berlangsung." - }, "icu:speech": { "messageformat": "Bicara" }, @@ -1092,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Sematkan pesan" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Lepas sematan pesan" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Akhiri polling" @@ -1260,7 +1251,7 @@ "messageformat": "Tindakan lainnya" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Lepas sematan pesan" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Buka pesan" @@ -1293,7 +1284,7 @@ "messageformat": "Stiker" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Media sekali lihat" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Foto" @@ -1314,7 +1305,7 @@ "messageformat": "Stiker" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Media sekali lihat" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Pesan disematkan" @@ -5157,7 +5148,7 @@ "messageformat": "Audio" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Kontak" }, "icu:LinkPreviewItem__alt": { "messageformat": "Buka tautan di browser" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Tautan" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Tidak Ada Media" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Efek animasi keren untuk Polling yang tadinya hanya tersedia di ponsel, kini hadir di Desktop." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/it/messages.json b/_locales/it/messages.json index 71060032ed..19f740e3ff 100644 --- a/_locales/it/messages.json +++ b/_locales/it/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Media" }, - "icu:allMedia": { - "messageformat": "Tutti i media" - }, "icu:today": { "messageformat": "Oggi" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Condivisione schermo" }, - "icu:callingDeveloperTools": { - "messageformat": "Apertura strumenti di sviluppo in corso" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Questa schermata viene usata durante la fase di sviluppo per mostrare i dati diagnostici legati alle chiamate in corso." - }, "icu:speech": { "messageformat": "Parlato" }, @@ -1092,10 +1083,10 @@ "messageformat": "Informazioni" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Metti in evidenza" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Rimuovi messaggio in evidenza" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Termina sondaggio" @@ -1260,7 +1251,7 @@ "messageformat": "Più azioni" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Rimuovi messaggio in evidenza" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Vai al messaggio" @@ -1293,7 +1284,7 @@ "messageformat": "Adesivo" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Media visualizzabile una volta" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Foto" @@ -1314,7 +1305,7 @@ "messageformat": "Adesivo" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Media visualizzabile una volta" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Messaggi in evidenza" @@ -5157,7 +5148,7 @@ "messageformat": "Audio" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Contatto" }, "icu:LinkPreviewItem__alt": { "messageformat": "Apri il link in un browser" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Link" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Nessun file multimediale" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "I sondaggi di Signal su Desktop ora includono gli stessi discreti effetti di animazione che erano già presenti sul tuo telefono. Lascia che la tua scelta preferita spicchi il volo." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/ja/messages.json b/_locales/ja/messages.json index 0e56c44255..18ef0571dd 100644 --- a/_locales/ja/messages.json +++ b/_locales/ja/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "メディア" }, - "icu:allMedia": { - "messageformat": "すべてのメディア" - }, "icu:today": { "messageformat": "今日" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "共有中の画面" }, - "icu:callingDeveloperTools": { - "messageformat": "開発者ツール呼び出し" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "このウィンドウは、開発中に、進行中の通話からの診断情報を表示するために使用されます。" - }, "icu:speech": { "messageformat": "スピーチ" }, @@ -1092,10 +1083,10 @@ "messageformat": "詳細" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "メッセージをピン留め" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "メッセージのピン留めを解除" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "投票を終了" @@ -1260,7 +1251,7 @@ "messageformat": "その他" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "メッセージのピン留めを解除" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "メッセージへ移動" @@ -1293,7 +1284,7 @@ "messageformat": "ステッカー" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "使い捨てメディア" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "写真" @@ -1314,7 +1305,7 @@ "messageformat": "ステッカー" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "使い捨てメディア" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "ピン留めされたメッセージ" @@ -5157,7 +5148,7 @@ "messageformat": "音声" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "連絡先" }, "icu:LinkPreviewItem__alt": { "messageformat": "ブラウザでリンクを開く" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "リンク" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "メディアがありません" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Signalの投票機能のアニメーションを改善しました。" + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/ka-GE/messages.json b/_locales/ka-GE/messages.json index 069a90bf23..3bb4d17e99 100644 --- a/_locales/ka-GE/messages.json +++ b/_locales/ka-GE/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "მედია-ფაილები" }, - "icu:allMedia": { - "messageformat": "ყველა მედია-ფაილი" - }, "icu:today": { "messageformat": "დღეს" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "ეკრანის გაზიარება" }, - "icu:callingDeveloperTools": { - "messageformat": "დეველიპერის ზარების ხელსაწყოები" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "ეს ფანჯარა გამოიყენება დეველოპმენტის დროს, რათა მიმდინარე ზარებიდან დიაგნოსტიკა აჩვენოს." - }, "icu:speech": { "messageformat": "მეტყველება" }, @@ -1092,10 +1083,10 @@ "messageformat": "ინფორმაცია" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "წერილის აპინვა" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "წერილზე პინის მოხსნა" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "გამოკითხვის დასრულება" @@ -1260,7 +1251,7 @@ "messageformat": "მეტი მოქმედება" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "წერილზე პინის მოხსნა" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "წერილზე გადასვლა" @@ -1293,7 +1284,7 @@ "messageformat": "სტიკერი" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "ერთხელ სანახავი მედია-ფაილი" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "ფოტო" @@ -1314,7 +1305,7 @@ "messageformat": "სტიკერი" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "ერთხელ სანახავი მედია-ფაილი" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "აპინული წერილები" @@ -5157,7 +5148,7 @@ "messageformat": "აუდიო" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "კონტაქტი" }, "icu:LinkPreviewItem__alt": { "messageformat": "გახსენი ბმული ბრაუზერში" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "ბმულები" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "მედია-ფაილები ვერ მოიძებნა" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Signal-ის გამოკითხვები დესკტოპზე ახლა უკვე შეიცავს იმავე დახვეწილ ანიმაციურ ეფექტებს, რომლებიც აქამდეც ჩანდა შენს მობილურში. შენი არჩევანის დაწინაურებას მხოლოდ ერთი გამოკითხვა გაშორებს." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/kk-KZ/messages.json b/_locales/kk-KZ/messages.json index 354d93cddc..de46cebc2c 100644 --- a/_locales/kk-KZ/messages.json +++ b/_locales/kk-KZ/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Мультимедиа" }, - "icu:allMedia": { - "messageformat": "Барлық мультимедиа" - }, "icu:today": { "messageformat": "Бүгін" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Экранды бөлісу" }, - "icu:callingDeveloperTools": { - "messageformat": "Қоңырау шалу функциясын әзірлеушінің құралдары" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Бұл терезе жүріп жатқан қоңыраулардың диагностикасын көрсету үшін әзірлеу барысында қолданылады." - }, "icu:speech": { "messageformat": "Сөйлеу" }, @@ -1092,10 +1083,10 @@ "messageformat": "Ақпарат" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Хабарды бекіту" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Хабарды босату" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Сауалнаманы аяқтау" @@ -1260,7 +1251,7 @@ "messageformat": "Басқа әрекеттер" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Хабарды босату" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Хабарға өту" @@ -1293,7 +1284,7 @@ "messageformat": "Жапсырма" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Бір-ақ рет көрінетін ақпарат файлы" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Фотосурет" @@ -1314,7 +1305,7 @@ "messageformat": "Жапсырма" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Бір-ақ рет көрінетін ақпарат файлы" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Бекітілген хабарлар" @@ -5157,7 +5148,7 @@ "messageformat": "Аудио" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Контакт" }, "icu:LinkPreviewItem__alt": { "messageformat": "Сілтемені браузерде ашу" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Сілтемелер" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Мультимедиа файлы жоқ" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Жұмыс үстеліндегі Signal сауалнамалары енді телефоныңызда шығып жүрген жеңіл анимациялық эффектілерді қамтиды. Таңдаулы нұсқаның айқын алға шыққанын көру үшін сауалнамаға қатысу жеткілікті." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/km-KH/messages.json b/_locales/km-KH/messages.json index 10ddc3040c..ddabe83604 100644 --- a/_locales/km-KH/messages.json +++ b/_locales/km-KH/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "ឯកសារមេឌា" }, - "icu:allMedia": { - "messageformat": "ឯកសារមេឌាទាំងអស់" - }, "icu:today": { "messageformat": "ថ្ងៃនេះ" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "ការចែករំលែកអេក្រង់" }, - "icu:callingDeveloperTools": { - "messageformat": "ឧបករណ៍អ្នកអភិវឌ្ឍន៍សម្រាប់ការហៅ" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "វីនដូនេះត្រូវបានប្រើក្នុងអំឡុងពេលអភិវឌ្ឍន៍ ដើម្បីបង្ហាញការវិភាគពីការហៅទូរសព្ទដែលកំពុងដំណើរការ។" - }, "icu:speech": { "messageformat": "សម្តី" }, @@ -1092,10 +1083,10 @@ "messageformat": "ព័ត៌មាន" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "ខ្ទាស់សារ" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "ឈប់ខ្ទាស់សារ" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "បញ្ចប់ការស្ទង់មតិ" @@ -1260,7 +1251,7 @@ "messageformat": "សកម្មភាពច្រើនទៀត" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "ឈប់ខ្ទាស់សារ" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "ចូលទៅកាន់សារ" @@ -1293,7 +1284,7 @@ "messageformat": "ស្ទីកគ័រ" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "មេឌៀមើលបានតែម្តង" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "រូបភាព" @@ -1314,7 +1305,7 @@ "messageformat": "ស្ទីកគ័រ" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "មេឌៀមើលបានតែម្តង" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "សារដែលបានខ្ទាស់" @@ -5157,7 +5148,7 @@ "messageformat": "សំឡេង" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "ទំនាក់ទំនង" }, "icu:LinkPreviewItem__alt": { "messageformat": "បើកតំណនៅក្នុងកម្មវិធីរុករក" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "តំណ" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "គ្មានមេឌៀ" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "ការស្ទង់មតិ Signal នៅលើ Desktop ឥឡូវនេះរួមបញ្ចូលបែបផែនចលនាស្រាលៗដូចគ្នាដែលបានបង្ហាញរួចហើយនៅលើទូរសព្ទរបស់អ្នក។ ការបោះឆ្នោតរបស់អ្នកនៅក្នុងការស្ទង់មតិអាចជួយឱ្យជម្រើសដែលអ្នកចូលចិត្ត ឈ្នះគេឬអត់បាន។" + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/kn-IN/messages.json b/_locales/kn-IN/messages.json index d3bba4f005..de9c838bf9 100644 --- a/_locales/kn-IN/messages.json +++ b/_locales/kn-IN/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "ಮಾಧ್ಯಮ" }, - "icu:allMedia": { - "messageformat": "ಎಲ್ಲಾ ಮೀಡಿಯಾ" - }, "icu:today": { "messageformat": "ಇಂದು" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "ಸ್ಕ್ರೀನ್ ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತಿದೆ" }, - "icu:callingDeveloperTools": { - "messageformat": "ಕರೆಗಳಿಗೆ ಸಂಬಂಧಿಸಿದ ಡೆವಲಪರ್ ಟೂಲ್‌ಗಳು" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಕರೆಗಳಿಂದ ಡಯಾಗ್ನೋಸ್ಟಿಕ್ಸ್ ಅನ್ನು ಪ್ರದರ್ಶಿಸಲು ಡೆವಲಪ್‌ಮೆಂಟ್ ಸಮಯದಲ್ಲಿ ಈ ವಿಂಡೋವನ್ನು ಬಳಸಲಾಗುತ್ತದೆ." - }, "icu:speech": { "messageformat": "ಮಾತು" }, @@ -1092,10 +1083,10 @@ "messageformat": "ಮಾಹಿತಿ" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "ಮೆಸೇಜ್ ಅನ್ನು ಪಿನ್ ಮಾಡಿ" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "ಮೆಸೇಜ್ ಅನ್ನು ಅನ್‌ಪಿನ್ ಮಾಡಿ" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "ಸಮೀಕ್ಷೆಯನ್ನು ಕೊನೆಗೊಳಿಸಿ" @@ -1260,7 +1251,7 @@ "messageformat": "ಇನ್ನಷ್ಟು ಕ್ರಮಗಳು" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "ಮೆಸೇಜ್ ಅನ್ನು ಅನ್‌ಪಿನ್ ಮಾಡಿ" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "ಮೆಸೇಜ್‌ಗೆ ಹೋಗಿ" @@ -1293,7 +1284,7 @@ "messageformat": "ಸ್ಟಿಕ್ಕರ್" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "ಏಕ ವೀಕ್ಷಣೆ ಮೀಡಿಯಾ" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "ಫೋಟೋ" @@ -1314,7 +1305,7 @@ "messageformat": "ಸ್ಟಿಕ್ಕರ್" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "ಏಕ ವೀಕ್ಷಣೆ ಮೀಡಿಯಾ" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "ಪಿನ್ ಮಾಡಲಾದ ಮೆಸೇಜ್‌ಗಳು" @@ -5157,7 +5148,7 @@ "messageformat": "ಆಡಿಯೊ" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "ಸಂಪರ್ಕ" }, "icu:LinkPreviewItem__alt": { "messageformat": "ಬ್ರೌಸರ್‌ನಲ್ಲಿ ಲಿಂಕ್ ತೆರೆಯಿರಿ" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "ಲಿಂಕ್‌ಗಳು" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "ಮೀಡಿಯಾ ಇಲ್ಲ" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "ಡೆಸ್ಕ್‌ಟಾಪ್‌ನಲ್ಲಿನ Signal ಸಮೀಕ್ಷೆಗಳು ಈಗ ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ ಈಗಾಗಲೇ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತಿದ್ದ ಅದೇ ಸೂಕ್ಷ್ಮ ಅನಿಮೇಷನ್ ಎಫೆಕ್ಟ್‌ಗಳನ್ನು ಒಳಗೊಂಡಿವೆ. ನಿಮ್ಮ ನೆಚ್ಚಿನ ಆಯ್ಕೆಯನ್ನು ಹಿಂಪಡೆಯುವುದನ್ನು ವೀಕ್ಷಿಸುವುದು ಕೇವಲ ಒಂದು ಸಮೀಕ್ಷೆಯ ದೂರದಲ್ಲಿದೆ." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/ko/messages.json b/_locales/ko/messages.json index f4444b9434..d87f8b3e4e 100644 --- a/_locales/ko/messages.json +++ b/_locales/ko/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "미디어" }, - "icu:allMedia": { - "messageformat": "모든 미디어" - }, "icu:today": { "messageformat": "오늘" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "화면 공유하기" }, - "icu:callingDeveloperTools": { - "messageformat": "통화 개발자 도구" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "이 창은 개발 중 진행 중인 통화의 진단을 표시하는 데 사용됩니다." - }, "icu:speech": { "messageformat": "말하기" }, @@ -1092,10 +1083,10 @@ "messageformat": "정보" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "메시지 고정" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "메시지 고정 해제" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "설문조사 종료" @@ -1260,7 +1251,7 @@ "messageformat": "더 많은 작업" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "메시지 고정 해제" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "메시지로 이동" @@ -1293,7 +1284,7 @@ "messageformat": "스티커" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "한 번만 볼 수 있는 미디어" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "사진" @@ -1314,7 +1305,7 @@ "messageformat": "스티커" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "한 번만 볼 수 있는 미디어" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "고정 메시지" @@ -2202,34 +2193,34 @@ "messageformat": "메시지를 보내려면 이 그룹을 차단 해제하세요." }, "icu:youChangedTheTimer": { - "messageformat": "사라지는 메시지 시간을 {time}(으)로 설정했습니다." + "messageformat": "자동 삭제 메시지 시간을 {time}(으)로 설정했습니다." }, "icu:timerSetOnSync": { - "messageformat": "사라지는 메시지 시간을 {time}(으)로 업데이트했습니다." + "messageformat": "자동 삭제 메시지 시간을 {time}(으)로 업데이트했습니다." }, "icu:timerSetByMember": { - "messageformat": "멤버가 사라지는 메시지 시간을 {time}(으)로 설정했습니다." + "messageformat": "멤버가 자동 삭제 메시지 시간을 {time}(으)로 설정했습니다." }, "icu:theyChangedTheTimer": { - "messageformat": "{name} 님이 사라지는 메시지 시간을 {time}(으)로 설정했습니다." + "messageformat": "{name} 님이 자동 삭제 메시지 시간을 {time}(으)로 설정했습니다." }, "icu:disappearingMessages__off": { "messageformat": "꺼짐" }, "icu:disappearingMessages": { - "messageformat": "사라지는 메시지" + "messageformat": "자동 삭제 메시지" }, "icu:disappearingMessagesDisabled": { - "messageformat": "사라지는 메시지 기능 꺼짐" + "messageformat": "자동 삭제 메시지 기능 꺼짐" }, "icu:disappearingMessagesDisabledByMember": { - "messageformat": "멤버가 사라지는 메시지를 비활성화했습니다." + "messageformat": "멤버가 자동 삭제 메시지를 비활성화했습니다." }, "icu:disabledDisappearingMessages": { - "messageformat": "{name} 님이 사라지는 메시지를 비활성화했습니다." + "messageformat": "{name} 님이 자동 삭제 메시지를 비활성화했습니다." }, "icu:youDisabledDisappearingMessages": { - "messageformat": "사라지는 메시지 기능을 비활성화했습니다." + "messageformat": "자동 삭제 메시지 기능을 비활성화했습니다." }, "icu:timerSetTo": { "messageformat": "시간이 {time}(으)로 설정됨" @@ -4566,7 +4557,7 @@ "messageformat": "그룹 링크" }, "icu:ConversationDetails--disappearing-messages-label": { - "messageformat": "사라지는 메시지" + "messageformat": "자동 삭제 메시지" }, "icu:ConversationDetails--disappearing-messages-info--group": { "messageformat": "활성화할 경우, 이 그룹에서 주고받는 메시지는 열람 후 자동으로 삭제됩니다." @@ -5157,7 +5148,7 @@ "messageformat": "오디오" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "연락처" }, "icu:LinkPreviewItem__alt": { "messageformat": "브라우저에서 링크를 엽니다." @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "링크" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "미디어 없음" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Signal 설문조사의 애니메이션을 개선했습니다." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/ky-KG/messages.json b/_locales/ky-KG/messages.json index aebf9c5ab2..65a0490870 100644 --- a/_locales/ky-KG/messages.json +++ b/_locales/ky-KG/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Медиа" }, - "icu:allMedia": { - "messageformat": "Бардык медиафайлдар" - }, "icu:today": { "messageformat": "Бүгүн" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Экран бөлүшүү" }, - "icu:callingDeveloperTools": { - "messageformat": "Чалууларга байланыштуу иштеп чыгуучулардын куралдары" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Учурда болуп жаткан чалуулардын көрүнүшүндөгү мүчүлүштүктөрдү аныктоо үчүн колдонулат." - }, "icu:speech": { "messageformat": "Сүйлөө" }, @@ -1092,10 +1083,10 @@ "messageformat": "Маалымат" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Билдирүүнү кадоо" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Билдирүүнү бошотуу" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Добуш берүүнү бүтүрүү" @@ -1260,7 +1251,7 @@ "messageformat": "Дагы" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Билдирүүнү бошотуу" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Билдирүүгө өтүү" @@ -1293,7 +1284,7 @@ "messageformat": "Стикер" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Бир жолу көрүлүүчү MMS" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Сүрөт" @@ -1314,7 +1305,7 @@ "messageformat": "Стикер" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Бир жолу көрүлүүчү MMS" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Кадалган билдирүүлөр" @@ -5157,7 +5148,7 @@ "messageformat": "Аудио" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Байланыш" }, "icu:LinkPreviewItem__alt": { "messageformat": "Серепчидеги шилтемени ачуу" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Шилтемелер" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Эч нерсе жок" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Компьютердеги Signal'дын сурамжылоолору эми телефондогудай сонун анимациялар менен коштолот. Бир добуш көп нерсени чечип коет." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/lt-LT/messages.json b/_locales/lt-LT/messages.json index 1959221f92..085f5d0b4c 100644 --- a/_locales/lt-LT/messages.json +++ b/_locales/lt-LT/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Medija" }, - "icu:allMedia": { - "messageformat": "Visa medija" - }, "icu:today": { "messageformat": "Šiandien" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Ekrano bendrinimas" }, - "icu:callingDeveloperTools": { - "messageformat": "Kūrėjo įrankiai skambučiams" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Šis langas naudojamas kuriant programinę įrangą, kad būtų rodoma vykstančių skambučių diagnostika." - }, "icu:speech": { "messageformat": "Šneka" }, @@ -1092,10 +1083,10 @@ "messageformat": "Informacija" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Prisegti žinutę" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Atsegti žinutę" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Baigti apklausą" @@ -1260,7 +1251,7 @@ "messageformat": "Daugiau veiksmų" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Atsegti žinutę" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Eiti į žinutę" @@ -1293,7 +1284,7 @@ "messageformat": "Lipdukas" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Vienkartinės peržiūros medija" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Nuotrauka" @@ -1314,7 +1305,7 @@ "messageformat": "Lipdukas" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Vienkartinės peržiūros medija" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Prisegtos žinutės" @@ -5157,7 +5148,7 @@ "messageformat": "Garso įrašas" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Adresatas" }, "icu:LinkPreviewItem__alt": { "messageformat": "Atverti nuorodą naršyklėje" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Nuorodos" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Nėra medijos" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Patobulinta „Signal“ apklausų animacija." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/lv-LV/messages.json b/_locales/lv-LV/messages.json index 9b3c5e027e..5c3c52c708 100644 --- a/_locales/lv-LV/messages.json +++ b/_locales/lv-LV/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Multivide/multimediji" }, - "icu:allMedia": { - "messageformat": "Visa multivide" - }, "icu:today": { "messageformat": "Šodien" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Ekrāna kopīgošana" }, - "icu:callingDeveloperTools": { - "messageformat": "Zvanīšanas rīki izstrādātājiem" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Šis logs tiek izmantots izstrādes laikā, lai parādītu notiekošo zvanu diagnostiku." - }, "icu:speech": { "messageformat": "Runa" }, @@ -1092,10 +1083,10 @@ "messageformat": "Informācija" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Piespraust ziņu" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Atspraust ziņu" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Pabeigt aptauju" @@ -1260,7 +1251,7 @@ "messageformat": "Citas darbības" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Atspraust ziņu" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Doties uz ziņu" @@ -1293,7 +1284,7 @@ "messageformat": "Uzlīme" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Vienreiz skatāms multivides fails" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Attēls" @@ -1314,7 +1305,7 @@ "messageformat": "Uzlīme" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Vienreiz skatāms multivides fails" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Piespraustās ziņas" @@ -5157,7 +5148,7 @@ "messageformat": "Audio" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Kontakts" }, "icu:LinkPreviewItem__alt": { "messageformat": "Atvērt saiti pārlūkā" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Saites" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Nav multivides" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Tagad arī Signal aptaujās uz datora redzēsiet tās pašas animācijas, kas pieejamas mobilajā lietotnē. Lai redzētu, kā tavs mīļākais atbilžu variants izvirzās vadībā, atliek izveidot kādu aptauju." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/mk-MK/messages.json b/_locales/mk-MK/messages.json index e3e2076671..46f5ca3d53 100644 --- a/_locales/mk-MK/messages.json +++ b/_locales/mk-MK/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Медиумски датотеки" }, - "icu:allMedia": { - "messageformat": "Сите медиумски датотеки" - }, "icu:today": { "messageformat": "Денес" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Споделување на екранот" }, - "icu:callingDeveloperTools": { - "messageformat": "Програмерски алатки за повици" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Овој прозор се користи во текот на развој за приказ на дијагностика од тековни повици." - }, "icu:speech": { "messageformat": "Говор" }, @@ -1092,10 +1083,10 @@ "messageformat": "Информации" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Закачете ја пораката на врвот" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Отстранете ја пораката од врвот" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Затворете ја анкетата" @@ -1260,7 +1251,7 @@ "messageformat": "Повеќе дејствија" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Отстранете ја пораката од врвот" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Одете до пораката" @@ -1293,7 +1284,7 @@ "messageformat": "Стикер" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Еднократно видлива медиумска датотека" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Слика" @@ -1314,7 +1305,7 @@ "messageformat": "Стикер" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Еднократно видлива медиумска датотека" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Закачени пораки" @@ -5157,7 +5148,7 @@ "messageformat": "Аудио" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Контакт" }, "icu:LinkPreviewItem__alt": { "messageformat": "Отворете го линкот во прелистувач" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Линкови" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Нема медиумска датотека" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Подобрена анимација на Signal анкетите." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/ml-IN/messages.json b/_locales/ml-IN/messages.json index e9ecbbebef..64008c2b98 100644 --- a/_locales/ml-IN/messages.json +++ b/_locales/ml-IN/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "മീഡിയ" }, - "icu:allMedia": { - "messageformat": "എല്ലാ മീഡിയകളും" - }, "icu:today": { "messageformat": "ഇന്ന്" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "സ്ക്രീൻ പങ്കിടൽ" }, - "icu:callingDeveloperTools": { - "messageformat": "കോളിംഗ് ഡെവലപ്പർ ടൂളുകൾ" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "നിലവിലുള്ള കോളുകളിൽ നിന്നുള്ള ഡയഗ്നോസ്റ്റിക്സ് പ്രദർശിപ്പിക്കുന്നതിന് ഈ വിൻഡോ ഡെവലപ്‌മെൻ്റ് വേളയിൽ ഉപയോഗിക്കുന്നു." - }, "icu:speech": { "messageformat": "സംസാരം" }, @@ -1092,10 +1083,10 @@ "messageformat": "വിവരം" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "സന്ദേശം പിൻ ചെയ്യുക" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "സന്ദേശം അൺപിൻ ചെയ്യുക" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "പോൾ അവസാനിപ്പിക്കുക" @@ -1260,7 +1251,7 @@ "messageformat": "കൂടുതൽ പ്രവർത്തനങ്ങൾ" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "സന്ദേശം അൺപിൻ ചെയ്യുക" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "സന്ദേശത്തിലേക്ക് പോകുക" @@ -1293,7 +1284,7 @@ "messageformat": "സ്റ്റിക്കർ" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "ഒരു തവണ-ദൃശ്യമാകുന്ന മീഡിയ" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "ഫോട്ടോ" @@ -1314,7 +1305,7 @@ "messageformat": "സ്റ്റിക്കർ" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "ഒരു തവണ-ദൃശ്യമാകുന്ന മീഡിയ" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "പിൻ ചെയ്ത സന്ദേശങ്ങൾ" @@ -5157,7 +5148,7 @@ "messageformat": "ഓഡിയോ" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "കോൺ‌ടാക്റ്റ്" }, "icu:LinkPreviewItem__alt": { "messageformat": "ബ്രൗസറിൽ, ലിങ്ക് തുറക്കുക" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "ലിങ്കുകൾ" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "ഒന്നുമില്ല" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "ഡെസ്‌ക്‌ടോപ്പിലെ Signal പോളുകളിൽ ഇപ്പോൾ നിങ്ങളുടെ ഫോണിൽ ദൃശ്യമാകുന്ന അതേ സൂക്ഷ്മമായ ആനിമേഷൻ ഇഫക്റ്റുകൾ ഉൾപ്പെടുന്നു. പോളിൽ പങ്കെടുക്കുന്നതിലൂടെ നിങ്ങൾക്ക് പ്രിയപ്പട്ടവയെ മുൻനിരയിലെത്തിക്കാൻ നിങ്ങൾക്കാകും." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/mr-IN/messages.json b/_locales/mr-IN/messages.json index 81341a3d20..dac55b0a27 100644 --- a/_locales/mr-IN/messages.json +++ b/_locales/mr-IN/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "मीडिया" }, - "icu:allMedia": { - "messageformat": "सर्व मिडिया" - }, "icu:today": { "messageformat": "आज" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "स्क्रीन सामायिक करत आहे" }, - "icu:callingDeveloperTools": { - "messageformat": "डेव्हलपर टूलला कॉल करत आहे" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "ह्या विंडोचा वापर विकासादरम्यान सुरू असलेल्या कॉलमधील निदान प्रदर्शित करण्यासाठी केला जातो." - }, "icu:speech": { "messageformat": "वाचा" }, @@ -1092,10 +1083,10 @@ "messageformat": "माहिती" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "संदेश पिन करा" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "संदेश अनपिन करा" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "पोल समाप्त करा" @@ -1260,7 +1251,7 @@ "messageformat": "अधिक क्रिया" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "संदेश अनपिन करा" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "संदेशामध्ये जा" @@ -1293,7 +1284,7 @@ "messageformat": "स्टिकर" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "एकदा-बघा मिडिया" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "फोटो" @@ -1314,7 +1305,7 @@ "messageformat": "स्टिकर" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "एकदा-बघा मिडिया" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "पिन केलेला संदेश" @@ -5157,7 +5148,7 @@ "messageformat": "ऑडिओ" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "संपर्क" }, "icu:LinkPreviewItem__alt": { "messageformat": "ब्राऊझरमध्ये लिंक उघडा" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "लिंक्स" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "कुठलीही मिडिया नाही" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "डेस्कटॉप वरील Signal पोल मध्ये सुद्धा आता तुमच्या फोनवर दिसणारे अ‍ॅनिमेशन ईफेक्ट दिसतील. तुमच्या आवडीचा पर्याय कसा निवडून येतो हे पाहण्यासाठी फक्त एका पोलचा अवकाश आहे." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/ms/messages.json b/_locales/ms/messages.json index 5d835c2ac2..840ae4efa1 100644 --- a/_locales/ms/messages.json +++ b/_locales/ms/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Media" }, - "icu:allMedia": { - "messageformat": "Semua Media" - }, "icu:today": { "messageformat": "Hari ini" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Skrin perkongsian" }, - "icu:callingDeveloperTools": { - "messageformat": "Alat Pembangun Panggilan" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Tetingkap ini digunakan semasa pembangunan untuk memaparkan diagnostik daripada panggilan berterusan." - }, "icu:speech": { "messageformat": "Pertuturan" }, @@ -1092,10 +1083,10 @@ "messageformat": "Maklumat" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin mesej" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Nyahpin mesej" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Tamatkan Undian" @@ -1260,7 +1251,7 @@ "messageformat": "Lebih tindakan" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Nyahpin mesej" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Pergi ke Mesej" @@ -1293,7 +1284,7 @@ "messageformat": "Pelekat" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Media lihat sekali" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Foto" @@ -1314,7 +1305,7 @@ "messageformat": "Pelekat" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Media lihat sekali" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Mesej yang dipinkan" @@ -5157,7 +5148,7 @@ "messageformat": "Audio`" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Kenalan" }, "icu:LinkPreviewItem__alt": { "messageformat": "Buka pautan dalam pelayar" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Pautan" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Tiada media" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Animasi untuk undian Signal dipertingkatkan." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/my/messages.json b/_locales/my/messages.json index c7f731dd8b..59c75ce329 100644 --- a/_locales/my/messages.json +++ b/_locales/my/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "ရုပ်၊သံ၊ပုံ များ" }, - "icu:allMedia": { - "messageformat": "ရုပ်/သံ/ပုံ အားလုံး" - }, "icu:today": { "messageformat": "ယနေ့" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "စခရင် မျှဝေခြင်း" }, - "icu:callingDeveloperTools": { - "messageformat": "ဖုန်းခေါ်ဆိုမှုဆိုင်ရာ Developer Tools" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "လက်ရှိ ခေါ်ဆိုမှုများနှင့်ပတ်သက်သည့် ပြဿနာများကို ပြသရန် ဤဝင်းဒိုးကို ဖန်တီးလုပ်ဆောင်နေစဉ်အတွင်း အသုံးပြုပါသည်။" - }, "icu:speech": { "messageformat": "စကားပြော" }, @@ -1092,10 +1083,10 @@ "messageformat": "အချက်အလက်" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "မက်ဆေ့ချ်ကို ပင်တွဲရန်" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "မက်ဆေ့ချ်ကို ပင်ဖြုတ်ရန်" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "စစ်တမ်း အဆုံးသတ်" @@ -1260,7 +1251,7 @@ "messageformat": "နောက်ထပ် လုပ်ဆောင်မှုများ" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "မက်ဆေ့ချ်ကို ပင်ဖြုတ်ရန်" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "မက်ဆေ့ချ်သို့ သွားပါ" @@ -1293,7 +1284,7 @@ "messageformat": "စတစ်ကာ" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "တစ်ခါကြည့် မီဒီယာ" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "ရုပ်ပုံ" @@ -1314,7 +1305,7 @@ "messageformat": "စတစ်ကာ" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "တစ်ခါကြည့် မီဒီယာ" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "ပင်တွဲထားသော မက်ဆေ့ချ်များ" @@ -5157,7 +5148,7 @@ "messageformat": "အော်ဒီယို" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "အဆက်အသွယ်" }, "icu:LinkPreviewItem__alt": { "messageformat": "လင့်ခ်ကို Browser တွင်ဖွင့်ပါ" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "လင့်ခ်များ" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "မီဒီယာမရှိပါ" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Signal စစ်တမ်းတွင် အန်နီမေးရှင်းကို ပိုမိုကောင်းမွန်အာင်ပြုလုပ်ထားပါသည်။" + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/nb/messages.json b/_locales/nb/messages.json index cfe3d8f216..bf20d10f58 100644 --- a/_locales/nb/messages.json +++ b/_locales/nb/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Media" }, - "icu:allMedia": { - "messageformat": "Alle mediefiler" - }, "icu:today": { "messageformat": "I dag" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Skjermdeling" }, - "icu:callingDeveloperTools": { - "messageformat": "Utviklerverktøy for anrop" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Dette vinduet viser utviklere diagnostikk fra pågående telefonsamtaler." - }, "icu:speech": { "messageformat": "Tale" }, @@ -1092,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Fest melding" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Løsne melding" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Avslutt avstemningen" @@ -1260,7 +1251,7 @@ "messageformat": "Flere funksjoner" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Løsne melding" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Gå til meldingen" @@ -1293,7 +1284,7 @@ "messageformat": "Klistremerke" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Flyktig mediefil" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Bilde" @@ -1314,7 +1305,7 @@ "messageformat": "Klistremerke" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Flyktig mediefil" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Festede meldinger" @@ -5157,7 +5148,7 @@ "messageformat": "Lyd" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Kontakt" }, "icu:LinkPreviewItem__alt": { "messageformat": "Åpne lenken i en nettleser" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Lenker" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Ingen mediefiler" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Animasjonene i Signal-avstemninger har blitt forbedret." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/nl/messages.json b/_locales/nl/messages.json index 583f636e06..a77870c654 100644 --- a/_locales/nl/messages.json +++ b/_locales/nl/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Media" }, - "icu:allMedia": { - "messageformat": "Alle media" - }, "icu:today": { "messageformat": "Vandaag" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Scherm delen" }, - "icu:callingDeveloperTools": { - "messageformat": "Ontwikkelopties voor oproepen" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Dit venster wordt gebruikt tijdens de ontwikkelfase om diagnostische gegevens van lopende oproepen weer te geven." - }, "icu:speech": { "messageformat": "Spraak" }, @@ -1092,10 +1083,10 @@ "messageformat": "Bericht­details" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Bericht vastzetten" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Bericht losmaken" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Peiling beëindigen" @@ -1260,7 +1251,7 @@ "messageformat": "Meer acties" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Bericht losmaken" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Naar bericht gaan" @@ -1293,7 +1284,7 @@ "messageformat": "Sticker" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Eenmaligeweergave-media" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Afbeelding" @@ -1314,7 +1305,7 @@ "messageformat": "Sticker" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Eenmaligeweergave-media" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Vastgezette berichten" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Links" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Geen media" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Peilingen in Signal Desktop hebben nu dezelfde subtiele animatie-effecten als op je telefoon." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/pa-IN/messages.json b/_locales/pa-IN/messages.json index 69dca9a4cc..1cb55fe7f1 100644 --- a/_locales/pa-IN/messages.json +++ b/_locales/pa-IN/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "ਮੀਡੀਆ" }, - "icu:allMedia": { - "messageformat": "ਸਾਰੇ ਮੀਡੀਆ" - }, "icu:today": { "messageformat": "ਅੱਜ" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "ਸਕਰੀਨ ਸਾਂਝੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ" }, - "icu:callingDeveloperTools": { - "messageformat": "ਕਾਲਿੰਗ ਡਿਵੈਲਪਰ ਟੂਲਸ" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "ਇਹ ਵਿੰਡੋ ਡਿਵੈਲਪਮੈਂਟ ਦੌਰਾਨ ਚੱਲ ਰਹੀਆਂ ਕਾਲਾਂ ਤੋਂ ਡਾਇਗਨੌਸਟਿਕਸ ਦਿਖਾਉਣ ਲਈ ਵਰਤੀ ਜਾਂਦੀ ਹੈ।" - }, "icu:speech": { "messageformat": "ਬੋਲੀ" }, @@ -1092,10 +1083,10 @@ "messageformat": "ਜਾਣਕਾਰੀ" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "ਸੁਨੇਹੇ ਨੂੰ ਪਿੰਨ ਕਰੋ" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "ਸੁਨੇਹੇ ਨੂੰ ਅਨਪਿੰਨ ਕਰੋ" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "ਪੋਲ ਸਮਾਪਤ ਕਰੋ" @@ -1260,7 +1251,7 @@ "messageformat": "ਹੋਰ ਕਾਰਵਾਈਆਂ" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "ਸੁਨੇਹੇ ਨੂੰ ਅਨਪਿੰਨ ਕਰੋ" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "ਸੁਨੇਹੇ 'ਤੇ ਜਾਓ" @@ -1293,7 +1284,7 @@ "messageformat": "ਸਟਿੱਕਰ" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "ਇੱਕ ਵਾਰ ਦੇਖਿਆ ਜਾ ਸਕਣ ਵਾਲਾ ਮੀਡੀਆ" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "ਫ਼ੋਟੋ" @@ -1314,7 +1305,7 @@ "messageformat": "ਸਟਿੱਕਰ" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "ਇੱਕ ਵਾਰ ਦੇਖਿਆ ਜਾ ਸਕਣ ਵਾਲਾ ਮੀਡੀਆ" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "ਪਿੰਨ ਕੀਤੇ ਸੁਨੇਹੇ" @@ -5157,7 +5148,7 @@ "messageformat": "ਆਡੀਓ" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "ਸੰਪਰਕ" }, "icu:LinkPreviewItem__alt": { "messageformat": "ਲਿੰਕ ਨੂੰ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲ੍ਹੋ" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "ਲਿੰਕ" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "ਕੋਈ ਮੀਡੀਆ ਨਹੀਂ ਹੈ" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Signal ਵਿੱਚ ਪੋਲ ਵਾਲੇ ਫੀਚਰ ਲਈ ਐਨੀਮੇਸ਼ਨ ਨੂੰ ਬਿਹਤਰ ਬਣਾਇਆ ਗਿਆ ਹੈ।" + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/pl/messages.json b/_locales/pl/messages.json index d9d74ce5b7..55afb8e1af 100644 --- a/_locales/pl/messages.json +++ b/_locales/pl/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Multimedia" }, - "icu:allMedia": { - "messageformat": "Wszystkie multimedia" - }, "icu:today": { "messageformat": "Dzisiaj" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Udostępnianie ekranu" }, - "icu:callingDeveloperTools": { - "messageformat": "Narzędzia programistyczne do połączeń" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Podczas programowania to okno służy do wyświetlania diagnostyki bieżących połączeń." - }, "icu:speech": { "messageformat": "Mowa" }, @@ -1092,10 +1083,10 @@ "messageformat": "Informacje" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Przypnij wiadomość" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Odepnij wiadomość" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Zamknij ankietę" @@ -1260,7 +1251,7 @@ "messageformat": "Więcej działań" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Odepnij wiadomość" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Przejdź do wiadomości" @@ -1293,7 +1284,7 @@ "messageformat": "Naklejka" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Multimedia jednorazowe" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Zdjęcie" @@ -1314,7 +1305,7 @@ "messageformat": "Naklejka" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Multimedia jednorazowe" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Przypięte wiadomości" @@ -4596,7 +4587,7 @@ "messageformat": "Kto może edytować informacje o grupie" }, "icu:ConversationDetails--group-info-info": { - "messageformat": "Wybierz, kto może edytować nazwę, zdjęcie i opis grupy, a także jaki ma być czas znikania wiadomości." + "messageformat": "Wybierz, kto może edytować nazwę, zdjęcie i opis tej grupy oraz ustalać czas, po którym wiadomości będą znikać." }, "icu:ConversationDetails--add-members-label": { "messageformat": "Kto może dodawać osoby" @@ -5157,7 +5148,7 @@ "messageformat": "Audio" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Kontakt" }, "icu:LinkPreviewItem__alt": { "messageformat": "Otwórz link w przeglądarce" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Linki" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Brak multimediów" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Od teraz ankiety w aplikacji Signal Desktop są opatrzone subtelnymi animacjami, które możesz już znać z wersji na telefony. Nie dość, że każdy Twój wybór w ankiecie będzie – jak zawsze – słuszny, to teraz jeszcze ucieszy oko." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/pt-BR/messages.json b/_locales/pt-BR/messages.json index 73652e2bac..02709bed24 100644 --- a/_locales/pt-BR/messages.json +++ b/_locales/pt-BR/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Mídia" }, - "icu:allMedia": { - "messageformat": "Todas as mídias" - }, "icu:today": { "messageformat": "Hoje" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Você está apresentando" }, - "icu:callingDeveloperTools": { - "messageformat": "Ferramentas de desenvolvimento de chamadas" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Durante o desenvolvimento, esta janela mostra diagnósticos das chamadas em progresso." - }, "icu:speech": { "messageformat": "Fala" }, @@ -1092,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Fixar mensagem" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Desafixar mensagem" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Encerrar enquete" @@ -1260,7 +1251,7 @@ "messageformat": "Mais ações" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Desafixar mensagem" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Ir para mensagens" @@ -1293,7 +1284,7 @@ "messageformat": "Figurinha" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Mídia efêmera" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Foto" @@ -1314,7 +1305,7 @@ "messageformat": "Figurinha" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Mídia efêmera" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Mensagens fixadas" @@ -5157,7 +5148,7 @@ "messageformat": "Áudio" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Contato" }, "icu:LinkPreviewItem__alt": { "messageformat": "Abra o link em um navegador" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Links" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Nenhuma mídia" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "As enquetes do Signal no Desktop agora têm os mesmos efeitos de animação que você já vê no celular. " + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/pt-PT/messages.json b/_locales/pt-PT/messages.json index b605ca71ed..cd712784bf 100644 --- a/_locales/pt-PT/messages.json +++ b/_locales/pt-PT/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Multimédia" }, - "icu:allMedia": { - "messageformat": "Todos os multimédia" - }, "icu:today": { "messageformat": "Hoje" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "A partilhar ecrã" }, - "icu:callingDeveloperTools": { - "messageformat": "Ferramentas de chamada do programador" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Esta janela é utilizada durante o desenvolvimento para apresentar diagnósticos de chamadas em curso." - }, "icu:speech": { "messageformat": "Fala" }, @@ -1092,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Afixar mensagem" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Desafixar mensagem" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Terminar sondagem" @@ -1260,7 +1251,7 @@ "messageformat": "Mais ações" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Desafixar mensagem" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Ir a mensagem" @@ -1293,7 +1284,7 @@ "messageformat": "Autocolante" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Multimédia de visualização única" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Fotografia" @@ -1314,7 +1305,7 @@ "messageformat": "Autocolante" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Multimédia de visualização única" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Mensagens afixadas" @@ -5157,7 +5148,7 @@ "messageformat": "Áudio" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Contacto" }, "icu:LinkPreviewItem__alt": { "messageformat": "Abre o link num novo navegador" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Links" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Sem multimédia" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Animações melhoradas nas sondagens do Signal." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/ro-RO/messages.json b/_locales/ro-RO/messages.json index fad5fe232a..b7b74ad1bc 100644 --- a/_locales/ro-RO/messages.json +++ b/_locales/ro-RO/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Media" }, - "icu:allMedia": { - "messageformat": "Toate fișierele media" - }, "icu:today": { "messageformat": "Azi" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Se partajează ecranul" }, - "icu:callingDeveloperTools": { - "messageformat": "Instrumente de apelare a dezvoltatorilor" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Această fereastră este utilizată în timpul dezvoltării pentru a afișa diagnosticele din apelurile în curs." - }, "icu:speech": { "messageformat": "Vorbire" }, @@ -1092,10 +1083,10 @@ "messageformat": "Informații" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Fixează mesajul" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Anulează fixarea mesajului" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Încheie sondajul" @@ -1260,7 +1251,7 @@ "messageformat": "Mai multe acțiuni" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Anulează fixarea mesajului" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Mergi la Mesaj" @@ -1293,7 +1284,7 @@ "messageformat": "Autocolant" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Media vizibilă o singură dată" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Poză" @@ -1314,7 +1305,7 @@ "messageformat": "Autocolant" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Media vizibilă o singură dată" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Mesaje fixate" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Link-uri" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Nu ai Fișiere Media" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Sondajele Signal de pe desktop includ acum aceleași efecte subtile de animație care apăreau deja pe telefon. A-ți vedea alegerea preferată detașându-se este la doar un sondaj distanță." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index c4e5cb36a2..4e917759cc 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Медиа" }, - "icu:allMedia": { - "messageformat": "Все медиа" - }, "icu:today": { "messageformat": "Сегодня" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Показ экрана" }, - "icu:callingDeveloperTools": { - "messageformat": "Инструменты разработчика для звонков" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Это окно используется во время разработки для отображения диагностики из текущих звонков." - }, "icu:speech": { "messageformat": "Речь" }, @@ -1092,10 +1083,10 @@ "messageformat": "Информация" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Закрепить сообщение" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Открепить сообщение" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Завершить опрос" @@ -1260,7 +1251,7 @@ "messageformat": "Больше действий" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Открепить сообщение" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Перейти к сообщению" @@ -1293,7 +1284,7 @@ "messageformat": "Стикер" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Одноразовое медиа" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Фото" @@ -1314,7 +1305,7 @@ "messageformat": "Стикер" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Одноразовое медиа" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Закреплённые сообщения" @@ -5157,7 +5148,7 @@ "messageformat": "Аудио" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Контакт" }, "icu:LinkPreviewItem__alt": { "messageformat": "Откройте ссылку в браузере" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Ссылки" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Нет медиафайлов" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Опросы Signal на ПК теперь включают те же тонкие анимационные эффекты, что и на вашем телефоне. Это не волшебство — это ваш ответ на вопрос превращается в опрос." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/sk-SK/messages.json b/_locales/sk-SK/messages.json index 1d9dd89a67..d0802f40ec 100644 --- a/_locales/sk-SK/messages.json +++ b/_locales/sk-SK/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Médiá" }, - "icu:allMedia": { - "messageformat": "Všetky médiá" - }, "icu:today": { "messageformat": "Dnes" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Zdieľaná obrazovka" }, - "icu:callingDeveloperTools": { - "messageformat": "Nástroje pre vývojárov na hovory" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Toto okno sa používa počas vývoja na zobrazenie diagnostiky z prebiehajúcich hovorov." - }, "icu:speech": { "messageformat": "Reč" }, @@ -1092,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pripnúť správu" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Odopnúť správu" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Ukončiť anketu" @@ -1260,7 +1251,7 @@ "messageformat": "Viac akcií" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Odopnúť správu" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Prejsť na správu" @@ -1293,7 +1284,7 @@ "messageformat": "Nálepka" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Médiá na jedno zobrazenie" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Fotka" @@ -1314,7 +1305,7 @@ "messageformat": "Nálepka" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Médiá na jedno zobrazenie" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Pripnuté správy" @@ -5157,7 +5148,7 @@ "messageformat": "Audio" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Kontakt" }, "icu:LinkPreviewItem__alt": { "messageformat": "Otvoriť odkaz v prehliadači" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Odkazy" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Žiadne médiá" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Vylepšili sme animáciu pre ankety Signal." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/sl-SI/messages.json b/_locales/sl-SI/messages.json index 7821f710d6..a776cafb2e 100644 --- a/_locales/sl-SI/messages.json +++ b/_locales/sl-SI/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Medijske datoteke" }, - "icu:allMedia": { - "messageformat": "Vse" - }, "icu:today": { "messageformat": "Danes" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Deljenje zaslona" }, - "icu:callingDeveloperTools": { - "messageformat": "Razvojna orodja za klice" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "To okno se med razvojem uporablja za prikaz diagnostike tekočih klicev." - }, "icu:speech": { "messageformat": "Nagovor" }, @@ -1092,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pripni sporočilo" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Odpni sporočilo" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Zaključi anketo" @@ -1260,7 +1251,7 @@ "messageformat": "Več dejanj" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Odpni sporočilo" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Pojdi na sporočilo" @@ -1293,7 +1284,7 @@ "messageformat": "Nalepka" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Medijska datoteka za enkraten ogled" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Slika" @@ -1314,7 +1305,7 @@ "messageformat": "Nalepka" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Medijska datoteka za enkraten ogled" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Pripeta sporočila" @@ -5157,7 +5148,7 @@ "messageformat": "Zvok" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Stik" }, "icu:LinkPreviewItem__alt": { "messageformat": "Odpri povezavo v brskalniku" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Povezave" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Ni multimedijskih sporočil" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Izboljšana animacija za Ankete Signal." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/sq-AL/messages.json b/_locales/sq-AL/messages.json index 795687257c..ae2e135859 100644 --- a/_locales/sq-AL/messages.json +++ b/_locales/sq-AL/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Media" }, - "icu:allMedia": { - "messageformat": "Krejt Mediat" - }, "icu:today": { "messageformat": "Sot" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Ndarje ekrani me të tjerë" }, - "icu:callingDeveloperTools": { - "messageformat": "Mjetet e zhvillimit të thirrjeve" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Dritarja përdoret gjatë zhvillimit për të shfaqur diagnostifikimin nga kryerja e telefonatave." - }, "icu:speech": { "messageformat": "E folur" }, @@ -1092,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Fikso mesazhin" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Hiq mesazhin e fiksuar" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Përfundo sondazhin" @@ -1260,7 +1251,7 @@ "messageformat": "Më tepër veprime" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Hiq mesazhin e fiksuar" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Shko te mesazhi" @@ -1293,7 +1284,7 @@ "messageformat": "Ngjitës" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Media për t\\’u parë vetëm një herë" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Foto" @@ -1314,7 +1305,7 @@ "messageformat": "Ngjitës" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Media për t\\’u parë vetëm një herë" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Mesazhe të fiksuara" @@ -5157,7 +5148,7 @@ "messageformat": "Audio" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Kontakt" }, "icu:LinkPreviewItem__alt": { "messageformat": "Hap lidhjen në një shfletues" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Lidhjet" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "S\\’ka media" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Sondazhet e Signal në Desktop tani përfshijnë të njëjtat efekte delikate animacioni që shfaqeshin në telefon. Shikimi i zgjedhjes së preferuar është thjesht një sondazh larg." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/sr/messages.json b/_locales/sr/messages.json index f04d001d98..f4536a719c 100644 --- a/_locales/sr/messages.json +++ b/_locales/sr/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Медији" }, - "icu:allMedia": { - "messageformat": "Сви медији" - }, "icu:today": { "messageformat": "Данас" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Дељење екрана" }, - "icu:callingDeveloperTools": { - "messageformat": "Напредне алатке за позиве" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Овај прозор се користи током развоја за приказ дијагностике за текуће позиве." - }, "icu:speech": { "messageformat": "Говор" }, @@ -1092,10 +1083,10 @@ "messageformat": "Информације" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Закачи поруку" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Откачи поруку" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Прекини анкету" @@ -1260,7 +1251,7 @@ "messageformat": "Више опција" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Откачи поруку" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Иди на поруку" @@ -1293,7 +1284,7 @@ "messageformat": "Налепница" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Једнократни медиј" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Слика" @@ -1314,7 +1305,7 @@ "messageformat": "Налепница" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Једнократни медиј" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Закачене поруке" @@ -5157,7 +5148,7 @@ "messageformat": "Аудио" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Контакт" }, "icu:LinkPreviewItem__alt": { "messageformat": "Отвори линк у претраживачу" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Линкови" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Нема медија" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Побољшана анимација за Signal анкете." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/sv/messages.json b/_locales/sv/messages.json index e1ffc050d3..9785cb9547 100644 --- a/_locales/sv/messages.json +++ b/_locales/sv/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Media" }, - "icu:allMedia": { - "messageformat": "Alla media" - }, "icu:today": { "messageformat": "Idag" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Skärmdelning" }, - "icu:callingDeveloperTools": { - "messageformat": "Utvecklingsverktyg för samtal" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Detta fönster används under utveckling för att visa diagnostik från pågående samtal." - }, "icu:speech": { "messageformat": "Tal" }, @@ -1092,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Fäst meddelande" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Lösgör meddelande" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Avsluta omröstning" @@ -1260,7 +1251,7 @@ "messageformat": "Fler åtgärder" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Lösgör meddelande" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Gå till Meddelande" @@ -1293,7 +1284,7 @@ "messageformat": "Klistermärke" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Visa-en-gång media" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Foto" @@ -1314,7 +1305,7 @@ "messageformat": "Klistermärke" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Visa-en-gång media" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Fästa meddelanden" @@ -5157,7 +5148,7 @@ "messageformat": "Ljud" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Kontakt" }, "icu:LinkPreviewItem__alt": { "messageformat": "Öppna länken i en webbläsare" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Länkar" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Inga media" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Förbättrade animeringar för Signal-omröstningar." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/sw/messages.json b/_locales/sw/messages.json index 6384a11240..daa70cc792 100644 --- a/_locales/sw/messages.json +++ b/_locales/sw/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Media" }, - "icu:allMedia": { - "messageformat": "Media Zote" - }, "icu:today": { "messageformat": "Leo" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Kushiriki skrini" }, - "icu:callingDeveloperTools": { - "messageformat": "Zana za Wasanidi Programu za Kupiga Simu" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Dirisha hili linatumika wakati wa usanidi ili kuonyesha matengenezo kutoka kwenye simu zinazoendelea." - }, "icu:speech": { "messageformat": "Hotuba" }, @@ -1092,10 +1083,10 @@ "messageformat": "Maelezo" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Bandika ujumbe" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Bandua ujumbe" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Maliza kupiga kura ya maoni" @@ -1260,7 +1251,7 @@ "messageformat": "Vitendo zaidi" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Bandua ujumbe" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Nenda kwenye ujumbe" @@ -1293,7 +1284,7 @@ "messageformat": "Kibandiko" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Media ya mtazamo-mmoja" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Picha" @@ -1314,7 +1305,7 @@ "messageformat": "Kibandiko" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Media ya mtazamo-mmoja" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Jumbe zilizobandikwa" @@ -5157,7 +5148,7 @@ "messageformat": "Sauti" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Mwasiliani" }, "icu:LinkPreviewItem__alt": { "messageformat": "Fungua kiungo kwenye kivinjari" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Viungo" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Hakuna media" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Kura za maoni za Signal kwenye Desktop sasa zinajumuisha madoido madogo ya uhuishaji ambayo tayari yalikuwa yanaonekana kwenye simu yako. Utahitaji kupiga kura tu ili utazame chaguo ulipendalo." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/ta-IN/messages.json b/_locales/ta-IN/messages.json index 37dbc93f12..83809365b6 100644 --- a/_locales/ta-IN/messages.json +++ b/_locales/ta-IN/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "ஊடகம்" }, - "icu:allMedia": { - "messageformat": "அனைத்து மீடியா" - }, "icu:today": { "messageformat": "இன்று" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "திரையைப் பகிர்தல்" }, - "icu:callingDeveloperTools": { - "messageformat": "காலிங் டெவலப்பர் கருவிகள்" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "இந்த விண்டோ டெவலப்மென்ட்டின் போது, செயலில் இருக்கும் அழைப்புகளிலிருந்து கண்டறிதல்களைக் காண்பிக்கப் பயன்படுகிறது." - }, "icu:speech": { "messageformat": "பேச்சு" }, @@ -1092,10 +1083,10 @@ "messageformat": "தகவல்" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "மெசேஜைப் பின் செய்க" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "மெசேஜின் பின்னை அகற்றுக" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "வாக்கெடுப்பை முடி" @@ -1260,7 +1251,7 @@ "messageformat": "மேலும் செயல்கள்" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "மெசேஜின் பின்னை அகற்றுக" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "மெசேஜுக்குச் செல்க" @@ -1293,7 +1284,7 @@ "messageformat": "ஒட்டிப்படம்" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "காண்க-ஒருமுறை ஊடகம் " }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "புகைப்படம்" @@ -1314,7 +1305,7 @@ "messageformat": "ஒட்டிப்படம்" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "காண்க-ஒருமுறை ஊடகம் " }, "icu:PinnedMessagesPanel__Title": { "messageformat": "பின் செய்யப்பட்ட மெசேஜ்" @@ -5157,7 +5148,7 @@ "messageformat": "ஒலி" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "தொடர்பு" }, "icu:LinkPreviewItem__alt": { "messageformat": "இணைப்பை உலாவியில் திறக்கவும்" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "இணைப்புகள்" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "ஊடகங்கள்இல்லை" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "சிக்னல் வாக்கெடுப்புகளுக்கான மேம்படுத்தப்பட்ட அனிமேஷன்." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/te-IN/messages.json b/_locales/te-IN/messages.json index 3175badf5e..de51285582 100644 --- a/_locales/te-IN/messages.json +++ b/_locales/te-IN/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "మీడియా" }, - "icu:allMedia": { - "messageformat": "అన్ని మీడియా" - }, "icu:today": { "messageformat": "నేడు" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "స్క్రీన్ భాగస్వామ్యం" }, - "icu:callingDeveloperTools": { - "messageformat": "కాలింగ్ డెవలపర్ టూల్స్" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "కొనసాగుతున్న కాల్స్ నుండి సమస్య వివరాలను ప్రదర్శించడానికి అభివృద్ధి సమయంలో ఈ విండో ఉపయోగించబడుతుంది." - }, "icu:speech": { "messageformat": "ప్రసంగం" }, @@ -1092,10 +1083,10 @@ "messageformat": "సమాచారం" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "సందేశాన్ని పిన్ చేయండి" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "సందేశాన్ని అన్‌పిన్ చేయండి" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "పోల్‌ను ముగించండి" @@ -1260,7 +1251,7 @@ "messageformat": "మరిన్ని చర్యలు" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "సందేశాన్ని అన్‌పిన్ చేయండి" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "సందేశానికి వెళ్ళండి" @@ -1293,7 +1284,7 @@ "messageformat": "స్టికర్" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "ఒకసారి-దృశ్యం మీడియా" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "చిత్రం" @@ -1314,7 +1305,7 @@ "messageformat": "స్టికర్" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "ఒకసారి-దృశ్యం మీడియా" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "పిన్ చేసిన సందేశాలు" @@ -5157,7 +5148,7 @@ "messageformat": "ఆడియో" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "పరిచయం" }, "icu:LinkPreviewItem__alt": { "messageformat": "లింక్‌ను బ్రౌజర్‌లో తెరవండి" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "లింక్‌లు" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "మీడియా లేదు" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Signal పోల్స్ కోసం మెరుగుపరచబడిన యానిమేషన్." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/th/messages.json b/_locales/th/messages.json index 96f9508fda..7bbcabb8a8 100644 --- a/_locales/th/messages.json +++ b/_locales/th/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "สื่อ" }, - "icu:allMedia": { - "messageformat": "สื่อข้อมูลทั้งหมด" - }, "icu:today": { "messageformat": "วันนี้" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "กำลังแบ่งปันหน้าจอ" }, - "icu:callingDeveloperTools": { - "messageformat": "เครื่องมือด้านการโทรสำหรับนักพัฒนา" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "ระบบจะใช้หน้าต่างนี้ในขั้นตอนการพัฒนาเพื่อแสดงผลการตรวจสอบจากการโทรที่กำลังใช้งานอยู่" - }, "icu:speech": { "messageformat": "การพูด" }, @@ -1092,10 +1083,10 @@ "messageformat": "ข้อมูล" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "ปักหมุดข้อความ" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "เลิกปักหมุดข้อความ" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "ปิดโพล" @@ -1260,7 +1251,7 @@ "messageformat": "การกระทำเพิ่มเติม" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "เลิกปักหมุดข้อความ" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "ไปที่ข้อความ" @@ -1293,7 +1284,7 @@ "messageformat": "สติกเกอร์" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "สื่อที่ดูได้ครั้งเดียว" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "รูปภาพ" @@ -1314,7 +1305,7 @@ "messageformat": "สติกเกอร์" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "สื่อที่ดูได้ครั้งเดียว" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "ข้อความที่ปักหมุด" @@ -5157,7 +5148,7 @@ "messageformat": "เสียง" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "ผู้ติดต่อ" }, "icu:LinkPreviewItem__alt": { "messageformat": "เปิดลิงก์ในเบราว์เซอร์" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "ลิงก์" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "ไม่มีสื่อ" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "เพิ่มลูกเล่นภาพเคลื่อนไหวในฟีเจอร์โพลของ Signal" + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/tl-PH/messages.json b/_locales/tl-PH/messages.json index e2a5b54cdc..94c28895fc 100644 --- a/_locales/tl-PH/messages.json +++ b/_locales/tl-PH/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Media" }, - "icu:allMedia": { - "messageformat": "Lahat ng media" - }, "icu:today": { "messageformat": "Ngayong araw" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Sharing screen" }, - "icu:callingDeveloperTools": { - "messageformat": "Calling Developer Tools" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Ginagamit ang window na ito sa development para i-display ang diagnostics mula sa ongoing calls." - }, "icu:speech": { "messageformat": "Speech" }, @@ -1092,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "I-pin ang message" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "I-unpin ang message" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Tapusin ang poll" @@ -1260,7 +1251,7 @@ "messageformat": "Iba pang actions" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "I-unpin ang message" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Pumunta sa message" @@ -1293,7 +1284,7 @@ "messageformat": "Sticker" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "View-once na media" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Larawan" @@ -1314,7 +1305,7 @@ "messageformat": "Sticker" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "View-once na media" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Pinned messages" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Links" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Walang media" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Mas pinagandang animation para sa Signal polls." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/tr/messages.json b/_locales/tr/messages.json index fff8e1f14c..ff71435a43 100644 --- a/_locales/tr/messages.json +++ b/_locales/tr/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "İçerik" }, - "icu:allMedia": { - "messageformat": "Tüm Medyalar" - }, "icu:today": { "messageformat": "Bugün" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Ekran paylaşımı" }, - "icu:callingDeveloperTools": { - "messageformat": "Arama Geliştirici Araçları" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Bu pencere, geliştirme sırasında devam eden aramalardan gelen tanılamaları görüntülemek için kullanılır." - }, "icu:speech": { "messageformat": "Konuşma" }, @@ -1092,10 +1083,10 @@ "messageformat": "Bilgi" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Mesajı sabitle" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Mesajın sabitlemesini kaldır" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Anketi sonlandır" @@ -1260,7 +1251,7 @@ "messageformat": "Diğer eylemler" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Mesajın sabitlemesini kaldır" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Mesaja git" @@ -1293,7 +1284,7 @@ "messageformat": "Çıkartma" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Bir kez görünür medya" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Fotoğraf" @@ -1314,7 +1305,7 @@ "messageformat": "Çıkartma" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Bir kez görünür medya" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Sabitlenmiş mesajlar" @@ -5157,7 +5148,7 @@ "messageformat": "Ses" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Kişi" }, "icu:LinkPreviewItem__alt": { "messageformat": "Bağlantıyı bir tarayıcıda aç" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Bağlantılar" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Medya Yok" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Signal anketleri için geliştirilmiş animasyon. Hem de önceden telefonunda beliren aynı çarpıcı animasyon efektleriyle!" + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/ug/messages.json b/_locales/ug/messages.json index 6ae1b58f25..8ebfa0ecac 100644 --- a/_locales/ug/messages.json +++ b/_locales/ug/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "ۋاسىتە" }, - "icu:allMedia": { - "messageformat": "بارلىق ۋاسىتە" - }, "icu:today": { "messageformat": "بۈگۈن" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "ئېكران ئورتاقلىشىش" }, - "icu:callingDeveloperTools": { - "messageformat": "چاقىرىق ئاچقۇچىلار قوراللىرى" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "بۇ كۆزنەك داۋاملىشىۋاتقان چاقىرىقتىكى دىئاگنوز نەتىجىسىنى كۆرسىتىشنى ئېچىش ئۈچۈن ئىشلىتىلىدۇ." - }, "icu:speech": { "messageformat": "سۆزلەش" }, @@ -1092,10 +1083,10 @@ "messageformat": "ئۇچۇر" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "ئۇچۇرنى مىقلاش" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "ئۇچۇرنىڭ مىقىنى ئېلىۋېتىش" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "راي سىناشنى توختىتىش" @@ -1260,7 +1251,7 @@ "messageformat": "تېخىمۇ كۆپ مەشغۇلات" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "ئۇچۇرنىڭ مىقىنى ئېلىۋېتىش" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "«ئۇچۇر»غا ئۆتۈڭ" @@ -1293,7 +1284,7 @@ "messageformat": "چىراي ئىپادە" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "بىرلا كۆرسەت ۋاسىتە" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "سۈرەت" @@ -1314,7 +1305,7 @@ "messageformat": "چىراي ئىپادە" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "بىرلا كۆرسەت ۋاسىتە" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "مىقلانغان ئۇچۇرلار" @@ -5157,7 +5148,7 @@ "messageformat": "ئۈن" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "ئالاقىداش" }, "icu:LinkPreviewItem__alt": { "messageformat": "ئۇلىنىشنى توربەتتىن ئېچىڭ" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "ئۇلانمىلار" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "مېدىيا يوق" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "ئۈستەل كومپيوتېرىدىكى Signal راي سىناقلىرى ھازىر تېلېفونىڭىزدا ئىلگىرى كۆرۈنگەندىكىگە ئوخشاش نازۇك كارتون ئۈنۈملىرىنى ئۆز ئىچىگە ئالىدۇ. Signal راي سىناقلىرى كارتون ئۈنۈملىرىنىڭ سۈپىتى تېخىمۇ يۇقىرى كۆتۈرۈلدى." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/uk-UA/messages.json b/_locales/uk-UA/messages.json index 13af3a5f5d..f73a6edbbd 100644 --- a/_locales/uk-UA/messages.json +++ b/_locales/uk-UA/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Медіафайли" }, - "icu:allMedia": { - "messageformat": "Усі медіафайли" - }, "icu:today": { "messageformat": "сьогодні" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Демонстрація екрана" }, - "icu:callingDeveloperTools": { - "messageformat": "Інструменти розробника для викликів" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Це вікно використовується під час розробки для показу діагностики поточних викликів." - }, "icu:speech": { "messageformat": "Голос" }, @@ -1092,10 +1083,10 @@ "messageformat": "Інформація" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Закріпити повідомлення" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Відкріпити повідомлення" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Завершити опитування" @@ -1260,7 +1251,7 @@ "messageformat": "Інші дії" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Відкріпити повідомлення" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "До повідомлення" @@ -1293,7 +1284,7 @@ "messageformat": "Стікер" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Одноразовий медіафайл" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Фото" @@ -1314,7 +1305,7 @@ "messageformat": "Стікер" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Одноразовий медіафайл" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Закріплені повідомлення" @@ -5157,7 +5148,7 @@ "messageformat": "Аудіо" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Контакт" }, "icu:LinkPreviewItem__alt": { "messageformat": "Відкрити посилання в браузері" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Посилання" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Медіафайлів немає" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Опитування в Signal Desktop тепер мають таку ж плавну анімацію, як і на телефоні. Нарешті можна спостерігати, як ваш варіант потихеньку виривається вперед (або відстає…)." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/ur/messages.json b/_locales/ur/messages.json index 51327f27d6..e325955cae 100644 --- a/_locales/ur/messages.json +++ b/_locales/ur/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "میڈیا" }, - "icu:allMedia": { - "messageformat": "تمام میڈیا" - }, "icu:today": { "messageformat": "آج" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "اسکرین کا اشتراک کرنا" }, - "icu:callingDeveloperTools": { - "messageformat": "کالنگ ڈیولپر ٹولز" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "یہ ونڈو ڈیولپمنٹ کے دوران جاری کالز سے تشخیصی ڈیٹا کو ظاہر کرنے کے لیے استعمال ہوتی ہے۔" - }, "icu:speech": { "messageformat": "تقریر" }, @@ -1092,10 +1083,10 @@ "messageformat": "معلومات" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "میسج پِن کریں" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "میسج اَن پِن کریں" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "پول ختم کریں" @@ -1260,7 +1251,7 @@ "messageformat": "مزید افعال" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "میسج اَن پِن کریں" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "میسج میں جائیں" @@ -1293,7 +1284,7 @@ "messageformat": "اسٹیکر" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "صرف ایک بار دیکھنے کے قابل میڈیا" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "تصویر" @@ -1314,7 +1305,7 @@ "messageformat": "اسٹیکر" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "صرف ایک بار دیکھنے کے قابل میڈیا" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "پِن کردہ میسجز" @@ -5157,7 +5148,7 @@ "messageformat": "آڈیو" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "رابطہ" }, "icu:LinkPreviewItem__alt": { "messageformat": "لنک کو براؤزر میں کھولیں" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "لنکس" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "کوئی میڈیا نہیں ہے" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Signal کی رائے شماریوں کے لیے بہتر کردہ اینیمیشن۔" + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/vi/messages.json b/_locales/vi/messages.json index 2910d4f0ce..d4e5f689b2 100644 --- a/_locales/vi/messages.json +++ b/_locales/vi/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "Đa phương tiện" }, - "icu:allMedia": { - "messageformat": "Tất cả Tập tin đa phương tiện" - }, "icu:today": { "messageformat": "Hôm nay" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "Chia sẻ màn hình" }, - "icu:callingDeveloperTools": { - "messageformat": "Công cụ Nhà phát triển của Cuộc gọi" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "Cửa sổ này được sử dụng trong quá trình phát triển để hiển thị thông tin chẩn đoán từ những cuộc gọi đang diễn ra." - }, "icu:speech": { "messageformat": "Nói" }, @@ -1092,10 +1083,10 @@ "messageformat": "Thông tin" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Ghim tin nhắn" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Bỏ ghim tin nhắn" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "Kết thúc" @@ -1260,7 +1251,7 @@ "messageformat": "Các thao tác khác" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Bỏ ghim tin nhắn" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Đến Tin nhắn" @@ -1293,7 +1284,7 @@ "messageformat": "Nhãn dán" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Đa phương tiện xem một lần" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "Ảnh" @@ -1314,7 +1305,7 @@ "messageformat": "Nhãn dán" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "Đa phương tiện xem một lần" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "Tin nhắn đã ghim" @@ -5157,7 +5148,7 @@ "messageformat": "Âm thanh" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "Liên hệ" }, "icu:LinkPreviewItem__alt": { "messageformat": "Mở đường dẫn trong trình duyệt" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "Đường dẫn" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Không có đa phương tiện" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "Cải thiện hình ảnh động của tính năng Hỏi ý kiến." + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/yue/messages.json b/_locales/yue/messages.json index 6f67fb696b..b90dad0823 100644 --- a/_locales/yue/messages.json +++ b/_locales/yue/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "媒體" }, - "icu:allMedia": { - "messageformat": "所有媒體" - }, "icu:today": { "messageformat": "今日" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "分享畫面" }, - "icu:callingDeveloperTools": { - "messageformat": "通話開發者工具" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "呢個視窗會喺開發過程中用嚟顯示進行中通話嘅診斷資訊。" - }, "icu:speech": { "messageformat": "語音" }, @@ -1092,10 +1083,10 @@ "messageformat": "詳細" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "將訊息置頂" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "取消訊息置頂" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "結束投票" @@ -1260,7 +1251,7 @@ "messageformat": "其他操作" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "取消訊息置頂" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "跳去「訊息」" @@ -1293,7 +1284,7 @@ "messageformat": "貼圖" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "流聲掠影多媒體檔案" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "相片" @@ -1314,7 +1305,7 @@ "messageformat": "貼圖" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "流聲掠影多媒體檔案" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "置頂咗嘅訊息" @@ -5157,7 +5148,7 @@ "messageformat": "音訊檔案" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "聯絡人" }, "icu:LinkPreviewItem__alt": { "messageformat": "喺瀏覽器度打開連結" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "連結" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "冇任何媒體" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "而家桌面版 Signal 嘅投票功能,同手機版一樣會有細緻嘅動畫效果。只要投票就可以睇到你嘅心水選項點樣大獲全勝。" + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/zh-CN/messages.json b/_locales/zh-CN/messages.json index 46e14f0010..1fa4d842b7 100644 --- a/_locales/zh-CN/messages.json +++ b/_locales/zh-CN/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "媒体" }, - "icu:allMedia": { - "messageformat": "全部媒体" - }, "icu:today": { "messageformat": "今天" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "屏幕共享" }, - "icu:callingDeveloperTools": { - "messageformat": "调用开发者工具" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "此窗口用于在开发过程中显示正在进行的调用诊断信息。" - }, "icu:speech": { "messageformat": "语音" }, @@ -1092,10 +1083,10 @@ "messageformat": "信息" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "置顶消息" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "取消置顶消息" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "结束投票" @@ -1260,7 +1251,7 @@ "messageformat": "更多操作" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "取消置顶消息" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "前往消息" @@ -1293,7 +1284,7 @@ "messageformat": "表情" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "一次性媒体" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "图片" @@ -1314,7 +1305,7 @@ "messageformat": "表情" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "一次性媒体" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "置顶的消息" @@ -5157,7 +5148,7 @@ "messageformat": "音频" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "联系人" }, "icu:LinkPreviewItem__alt": { "messageformat": "在浏览器中打开链接" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "链接" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "无媒体" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "优化了 Signal 投票功能的动画效果。" + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/zh-HK/messages.json b/_locales/zh-HK/messages.json index c4fbfec014..8f99399969 100644 --- a/_locales/zh-HK/messages.json +++ b/_locales/zh-HK/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "媒體" }, - "icu:allMedia": { - "messageformat": "所有的多媒體檔案" - }, "icu:today": { "messageformat": "今天" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "分享畫面" }, - "icu:callingDeveloperTools": { - "messageformat": "通話中開發者工具" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "此視窗在開發過程中用於顯示正在進行之通話的診斷資訊。" - }, "icu:speech": { "messageformat": "語音" }, @@ -1092,10 +1083,10 @@ "messageformat": "資訊" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "釘選訊息" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "取消釘選訊息" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "結束投票" @@ -1260,7 +1251,7 @@ "messageformat": "更多操作" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "取消釘選訊息" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "前往「訊息」" @@ -1293,7 +1284,7 @@ "messageformat": "貼圖" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "閱後即焚媒體" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "照片" @@ -1314,7 +1305,7 @@ "messageformat": "貼圖" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "閱後即焚媒體" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "已釘選的訊息" @@ -5157,7 +5148,7 @@ "messageformat": "聲音" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "聯絡人" }, "icu:LinkPreviewItem__alt": { "messageformat": "在瀏覽器中開啟連結" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "連結" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "沒有多媒體" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "桌面版 Signal 的投票現已包括與手機版相同的細緻動畫效果。看著你最喜愛的選項拉開距離,只需一次投票。" + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } diff --git a/_locales/zh-Hant/messages.json b/_locales/zh-Hant/messages.json index 97cbaf687c..ee2dbd1f63 100644 --- a/_locales/zh-Hant/messages.json +++ b/_locales/zh-Hant/messages.json @@ -599,9 +599,6 @@ "icu:media": { "messageformat": "媒體" }, - "icu:allMedia": { - "messageformat": "所有的多媒體檔案" - }, "icu:today": { "messageformat": "今天" }, @@ -737,12 +734,6 @@ "icu:screenShareWindow": { "messageformat": "分享畫面" }, - "icu:callingDeveloperTools": { - "messageformat": "通話中開發者工具" - }, - "icu:callingDeveloperToolsDescription": { - "messageformat": "此視窗在開發過程中用於顯示正在進行之通話的診斷資訊。" - }, "icu:speech": { "messageformat": "語音" }, @@ -1092,10 +1083,10 @@ "messageformat": "資訊" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "釘選訊息" + "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "取消釘選訊息" + "messageformat": "Unpin" }, "icu:Poll__end-poll": { "messageformat": "結束投票" @@ -1260,7 +1251,7 @@ "messageformat": "更多操作" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "取消釘選訊息" + "messageformat": "Unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "前往「訊息」" @@ -1293,7 +1284,7 @@ "messageformat": "貼圖" }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "一次性多媒體檔案" }, "icu:PinnedMessagesBar__MessagePreview__Text--Photo": { "messageformat": "照片" @@ -1314,7 +1305,7 @@ "messageformat": "貼圖" }, "icu:PinnedMessagesBar__MessagePreview__Text--ViewOnceMedia": { - "messageformat": "View-once media" + "messageformat": "一次性多媒體檔案" }, "icu:PinnedMessagesPanel__Title": { "messageformat": "已釘選的訊息" @@ -5157,7 +5148,7 @@ "messageformat": "聲音" }, "icu:ContactListItem__subtitle": { - "messageformat": "Contact" + "messageformat": "聯絡人" }, "icu:LinkPreviewItem__alt": { "messageformat": "在瀏覽器中開啟連結" @@ -5174,6 +5165,18 @@ "icu:MediaGallery__tab__links": { "messageformat": "連結" }, + "icu:MediaGallery__sort": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort--header": { + "messageformat": "Sort by" + }, + "icu:MediaGallery__sort__date": { + "messageformat": "Date" + }, + "icu:MediaGallery__sort__size": { + "messageformat": "Size" + }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "無媒體" }, @@ -7632,5 +7635,8 @@ }, "icu:WhatsNew__7.84--0": { "messageformat": "桌面版 Signal 的投票現已包括與手機版相同的細緻動畫效果。看著你最喜愛的選項拉開距離,只需一次投票。" + }, + "icu:WhatsNew__7.86--0": { + "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." } } From 2fd4fe0e6a4633fea53e836e01a0cc746584e2f4 Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Thu, 15 Jan 2026 08:33:53 -0800 Subject: [PATCH 22/49] Update DNS fallback --- build/dns-fallback.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/build/dns-fallback.json b/build/dns-fallback.json index da61cab07c..cbaa441ee2 100644 --- a/build/dns-fallback.json +++ b/build/dns-fallback.json @@ -4,51 +4,51 @@ "endpoints": [ { "family": "ipv4", - "address": "13.227.74.123" + "address": "3.165.160.26" }, { "family": "ipv4", - "address": "13.227.74.19" + "address": "3.165.160.46" }, { "family": "ipv4", - "address": "13.227.74.59" + "address": "3.165.160.74" }, { "family": "ipv4", - "address": "13.227.74.77" + "address": "3.165.160.75" }, { "family": "ipv6", - "address": "2600:9000:2202:4e00:1d:4f32:50c0:93a1" + "address": "2600:9000:2732:6e00:1d:4f32:50c0:93a1" }, { "family": "ipv6", - "address": "2600:9000:2202:5800:1d:4f32:50c0:93a1" + "address": "2600:9000:2732:9c00:1d:4f32:50c0:93a1" }, { "family": "ipv6", - "address": "2600:9000:2202:600:1d:4f32:50c0:93a1" + "address": "2600:9000:2732:b000:1d:4f32:50c0:93a1" }, { "family": "ipv6", - "address": "2600:9000:2202:7800:1d:4f32:50c0:93a1" + "address": "2600:9000:2732:b200:1d:4f32:50c0:93a1" }, { "family": "ipv6", - "address": "2600:9000:2202:9000:1d:4f32:50c0:93a1" + "address": "2600:9000:2732:ba00:1d:4f32:50c0:93a1" }, { "family": "ipv6", - "address": "2600:9000:2202:b000:1d:4f32:50c0:93a1" + "address": "2600:9000:2732:e400:1d:4f32:50c0:93a1" }, { "family": "ipv6", - "address": "2600:9000:2202:d400:1d:4f32:50c0:93a1" + "address": "2600:9000:2732:e600:1d:4f32:50c0:93a1" }, { "family": "ipv6", - "address": "2600:9000:2202:ec00:1d:4f32:50c0:93a1" + "address": "2600:9000:2732:f400:1d:4f32:50c0:93a1" } ] }, @@ -146,11 +146,11 @@ "endpoints": [ { "family": "ipv4", - "address": "142.251.32.51" + "address": "74.125.142.121" }, { "family": "ipv6", - "address": "2607:f8b0:4005:80c::2013" + "address": "2607:f8b0:400e:c08::79" } ] }, From f189ca9211e1210343e1625350f22cf59641091f Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Tue, 20 Jan 2026 14:52:25 -0600 Subject: [PATCH 23/49] Implement megaphone conditional standard_donate with local device createdAt Co-authored-by: ayumi-signal <143036029+ayumi-signal@users.noreply.github.com> --- ts/Crypto.node.ts | 55 ++++++++++++ ts/background.preload.ts | 4 +- ts/components/RemoteMegaphone.dom.tsx | 6 +- ts/services/megaphone.preload.ts | 47 +++++++++- ts/test-electron/Crypto_test.preload.ts | 26 ++++++ .../textsecure/AccountManager_test.preload.ts | 29 ++++++- .../release-notes/megaphone_test.node.ts | 82 ++++++++++++++++++ .../release-notes/release-notes-v2.json | 13 +++ .../en.json | 8 ++ .../static/release-notes/donate-heart.png | Bin 0 -> 6818 bytes .../services/megaphone_test.preload.ts | 79 ++++++++++++++++- ts/textsecure/AccountManager.preload.ts | 54 ++++++++++++ ts/textsecure/WebAPI.preload.ts | 2 +- ts/textsecure/storage/User.dom.ts | 8 ++ ts/types/Storage.d.ts | 1 + ts/util/onDeviceNameChangeSync.preload.ts | 57 +++++++++--- 16 files changed, 452 insertions(+), 19 deletions(-) create mode 100644 ts/test-mock/release-notes/megaphone_test.node.ts create mode 100644 ts/test-mock/updates-data/static/release-notes/1A6FCAB5-2F4C-44D3-88B4-27140FACBF75/en.json create mode 100644 ts/test-mock/updates-data/static/release-notes/donate-heart.png diff --git a/ts/Crypto.node.ts b/ts/Crypto.node.ts index 052aed9f2e..67ee241ce6 100644 --- a/ts/Crypto.node.ts +++ b/ts/Crypto.node.ts @@ -158,6 +158,61 @@ export function decryptDeviceName( return Bytes.toString(plaintext); } +// For testing +export function encryptDeviceCreatedAt( + createdAt: number, + deviceId: number, + registrationId: number, + identityPublic: PublicKey +): Uint8Array { + const createdAtBuffer = new ArrayBuffer(8); + const dataView = new DataView(createdAtBuffer); + dataView.setBigUint64(0, BigInt(createdAt), false); + const createdAtBytes = new Uint8Array(createdAtBuffer); + + const associatedData = getAssociatedDataForDeviceCreatedAt( + deviceId, + registrationId + ); + + return identityPublic.seal(createdAtBytes, 'deviceCreatedAt', associatedData); +} + +// createdAtCiphertext is an Int64, encrypted using the identity key +// PrivateKey with 5 bytes of associated data (deviceId || registrationId). +export function decryptDeviceCreatedAt( + createdAtCiphertext: Uint8Array, + deviceId: number, + registrationId: number, + identityPrivate: PrivateKey +): number { + const associatedData = getAssociatedDataForDeviceCreatedAt( + deviceId, + registrationId + ); + const createdAtData = identityPrivate.open( + createdAtCiphertext, + 'deviceCreatedAt', + associatedData + ); + return Number(Bytes.readBigUint64BE(createdAtData)); +} + +function getAssociatedDataForDeviceCreatedAt( + deviceId: number, + registrationId: number +): Uint8Array { + if (deviceId > 255) { + throw new Error('deviceId above 255, must be 1 byte'); + } + + const associatedDataBuffer = new ArrayBuffer(5); + const dataView = new DataView(associatedDataBuffer); + dataView.setUint8(0, deviceId); + dataView.setUint32(1, registrationId, false); + return new Uint8Array(associatedDataBuffer); +} + export function deriveMasterKey(accountEntropyPool: string): Uint8Array { return AccountEntropyPool.deriveSvrKey(accountEntropyPool); } diff --git a/ts/background.preload.ts b/ts/background.preload.ts index cbe3289b53..276a6153a5 100644 --- a/ts/background.preload.ts +++ b/ts/background.preload.ts @@ -264,7 +264,7 @@ import { ReleaseNoteAndMegaphoneFetcher } from './services/releaseNoteAndMegapho import { initMegaphoneCheckService } from './services/megaphone.preload.js'; import { BuildExpirationService } from './services/buildExpiration.preload.js'; import { - maybeQueueDeviceNameFetch, + maybeQueueDeviceInfoFetch, onDeviceNameChangeSync, } from './util/onDeviceNameChangeSync.preload.js'; import { postSaveUpdates } from './util/cleanup.preload.js'; @@ -1807,7 +1807,7 @@ export async function startApp(): Promise { // after connect on every startup drop(registerCapabilities()); drop(ensureAEP()); - drop(maybeQueueDeviceNameFetch()); + drop(maybeQueueDeviceInfoFetch()); Stickers.downloadQueuedPacks(); } diff --git a/ts/components/RemoteMegaphone.dom.tsx b/ts/components/RemoteMegaphone.dom.tsx index adb7f2ab5f..bd4e227660 100644 --- a/ts/components/RemoteMegaphone.dom.tsx +++ b/ts/components/RemoteMegaphone.dom.tsx @@ -51,7 +51,11 @@ export function RemoteMegaphone({ if (isFullSize) { return ( -
+
{image}
diff --git a/ts/services/megaphone.preload.ts b/ts/services/megaphone.preload.ts index 3bcff3b99d..93fc6db72d 100644 --- a/ts/services/megaphone.preload.ts +++ b/ts/services/megaphone.preload.ts @@ -10,7 +10,7 @@ import { type RemoteMegaphoneType, type VisibleRemoteMegaphoneType, } from '../types/Megaphone.std.js'; -import { HOUR } from '../util/durations/index.std.js'; +import { DAY, HOUR } from '../util/durations/index.std.js'; import { DataReader, DataWriter } from '../sql/Client.preload.js'; import { drop } from '../util/drop.std.js'; import { @@ -21,10 +21,13 @@ import { import { isEnabled } from '../RemoteConfig.dom.js'; import { safeSetTimeout } from '../util/timeout.std.js'; import { clearTimeoutIfNecessary } from '../util/clearTimeoutIfNecessary.std.js'; +import { itemStorage } from '../textsecure/Storage.preload.js'; +import { isMoreRecentThan } from '../util/timestamp.std.js'; const log = createLogger('megaphoneService'); const CHECK_INTERVAL = 12 * HOUR; +const CONDITIONAL_STANDARD_DONATE_DEVICE_AGE = 7 * DAY; let nextCheckTimeout: NodeJS.Timeout | null; @@ -91,6 +94,44 @@ export function isRemoteMegaphoneEnabled(): boolean { return false; } +export function isConditionalActive(conditionalId: string | null): boolean { + if (conditionalId == null) { + return true; + } + + if (conditionalId === 'standard_donate') { + const deviceCreatedAt = itemStorage.user.getDeviceCreatedAt(); + if ( + !deviceCreatedAt || + isMoreRecentThan(deviceCreatedAt, CONDITIONAL_STANDARD_DONATE_DEVICE_AGE) + ) { + return false; + } + + const me = window.ConversationController.getOurConversation(); + if (!me) { + log.error( + "isConditionalActive: Can't check badges because our conversation not available" + ); + return false; + } + + const hasBadges = me.attributes.badges && me.attributes.badges.length > 0; + return !hasBadges; + } + + if (conditionalId === 'internal_user') { + return isEnabled('desktop.internalUser'); + } + + if (conditionalId === 'test') { + return isMockEnvironment(); + } + + log.error(`isConditionalActive: Invalid value ${conditionalId}`); + return false; +} + // Private async function processMegaphone(megaphone: RemoteMegaphoneType): Promise { @@ -150,6 +191,10 @@ export function isMegaphoneShowable( return false; } + if (!isConditionalActive(megaphone.conditionalId)) { + return false; + } + if (snoozedAt) { let snoozeDuration; try { diff --git a/ts/test-electron/Crypto_test.preload.ts b/ts/test-electron/Crypto_test.preload.ts index a960516734..bcb59b1fdd 100644 --- a/ts/test-electron/Crypto_test.preload.ts +++ b/ts/test-electron/Crypto_test.preload.ts @@ -38,6 +38,8 @@ import { decryptAttachmentV1, padAndEncryptAttachment, CipherType, + encryptDeviceCreatedAt, + decryptDeviceCreatedAt, } from '../Crypto.node.js'; import { _generateAttachmentIv, @@ -389,6 +391,30 @@ describe('Crypto', () => { }); }); + describe('encrypted device createdAt', () => { + it('roundtrips', () => { + const deviceId = 2; + const registrationId = 123; + const identityKey = Curve.generateKeyPair(); + const createdAt = new Date().getTime(); + + const encrypted = encryptDeviceCreatedAt( + createdAt, + deviceId, + registrationId, + identityKey.publicKey + ); + const decrypted = decryptDeviceCreatedAt( + encrypted, + deviceId, + registrationId, + identityKey.privateKey + ); + + assert.strictEqual(decrypted, createdAt); + }); + }); + describe('verifyHmacSha256', () => { it('rejects if their MAC is too short', () => { const key = getRandomBytes(32); diff --git a/ts/test-electron/textsecure/AccountManager_test.preload.ts b/ts/test-electron/textsecure/AccountManager_test.preload.ts index 19fe5f9782..8c000f5884 100644 --- a/ts/test-electron/textsecure/AccountManager_test.preload.ts +++ b/ts/test-electron/textsecure/AccountManager_test.preload.ts @@ -5,7 +5,7 @@ import { assert } from 'chai'; import lodash from 'lodash'; import * as sinon from 'sinon'; -import { getRandomBytes } from '../../Crypto.node.js'; +import { generateRegistrationId, getRandomBytes } from '../../Crypto.node.js'; import { generateKeyPair } from '../../Curve.node.js'; import AccountManager from '../../textsecure/AccountManager.preload.js'; import type { @@ -32,6 +32,7 @@ describe('AccountManager', () => { const ourAci = generateAci(); const ourPni = generatePni(); + const ourRegistrationId = generateRegistrationId(); const identityKey = generateKeyPair(); const pubKey = getRandomBytes(33); const privKey = getRandomBytes(32); @@ -42,6 +43,9 @@ describe('AccountManager', () => { sandbox .stub(signalProtocolStore, 'getIdentityKeyPair') .returns(identityKey); + sandbox + .stub(signalProtocolStore, 'getLocalRegistrationId') + .resolves(ourRegistrationId); const { user } = itemStorage; sandbox.stub(user, 'getAci').returns(ourAci); sandbox.stub(user, 'getPni').returns(ourPni); @@ -77,6 +81,29 @@ describe('AccountManager', () => { }); }); + describe('encrypted device createdAt', () => { + it('roundtrips', async () => { + const deviceId = 2; + const createdAt = new Date().getTime(); + + const encrypted = await accountManager._encryptDeviceCreatedAt( + createdAt, + deviceId + ); + if (!encrypted) { + throw new Error('failed to encrypt!'); + } + + assert.strictEqual(typeof encrypted, 'string'); + const decrypted = await accountManager.decryptDeviceCreatedAt( + encrypted, + deviceId + ); + + assert.strictEqual(decrypted, createdAt); + }); + }); + describe('#_cleanSignedPreKeys', () => { let originalLoadSignedPreKeys: any; let originalRemoveSignedPreKey: any; diff --git a/ts/test-mock/release-notes/megaphone_test.node.ts b/ts/test-mock/release-notes/megaphone_test.node.ts new file mode 100644 index 0000000000..71c3443ff2 --- /dev/null +++ b/ts/test-mock/release-notes/megaphone_test.node.ts @@ -0,0 +1,82 @@ +// Copyright 2026 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only + +import createDebug from 'debug'; + +import { expect } from 'playwright/test'; +import { StorageState } from '@signalapp/mock-server'; +import { BackupLevel } from '@signalapp/libsignal-client/zkgroup.js'; +import Long from 'long'; + +import type { App } from '../playwright.node.js'; +import { Bootstrap } from '../bootstrap.node.js'; +import { MINUTE } from '../../util/durations/index.std.js'; + +export const debug = createDebug('mock:test:megaphone'); + +describe('megaphone', function (this: Mocha.Suite) { + let bootstrap: Bootstrap; + let app: App; + let nextApp: App; + + this.timeout(MINUTE); + + beforeEach(async () => { + bootstrap = new Bootstrap(); + await bootstrap.init(); + + let state = StorageState.getEmpty(); + + const { phone } = bootstrap; + + state = state.updateAccount({ + profileKey: phone.profileKey.serialize(), + givenName: phone.profileName, + readReceipts: true, + hasCompletedUsernameOnboarding: true, + backupTier: Long.fromNumber(BackupLevel.Free), + }); + + await phone.setStorageState(state); + + app = await bootstrap.link(); + }); + + afterEach(async function (this: Mocha.Context) { + if (!bootstrap) { + return; + } + + if (nextApp) { + await bootstrap.maybeSaveLogs(this.currentTest, nextApp); + } + await nextApp?.close(); + await bootstrap.teardown(); + }); + + it('shows megaphone', async () => { + const firstWindow = await app.getWindow(); + + await app.waitForReleaseNoteAndMegaphoneFetcher(); + await firstWindow.evaluate( + 'window.SignalCI.resetReleaseNoteAndMegaphoneFetcher()' + ); + + await app.close(); + + nextApp = await bootstrap.startApp(); + + const secondWindow = await nextApp.getWindow(); + + debug('waiting for megaphone'); + const megaphoneEl = secondWindow.getByTestId('RemoteMegaphone'); + await megaphoneEl.waitFor(); + + await expect(megaphoneEl.locator('text=/Donate Today/')).toBeVisible(); + await expect(megaphoneEl.locator('img')).toBeVisible(); + await expect( + megaphoneEl.getByText('Donate', { exact: true }) + ).toBeVisible(); + await expect(megaphoneEl.locator('text=/Not now/')).toBeVisible(); + }); +}); diff --git a/ts/test-mock/updates-data/dynamic/release-notes/release-notes-v2.json b/ts/test-mock/updates-data/dynamic/release-notes/release-notes-v2.json index 2f3d5d96fc..6607ec396e 100644 --- a/ts/test-mock/updates-data/dynamic/release-notes/release-notes-v2.json +++ b/ts/test-mock/updates-data/dynamic/release-notes/release-notes-v2.json @@ -70,6 +70,19 @@ "conditionalId": "standard_donate", "dontShowAfterEpochSeconds": 1734616800, "secondaryCtaData": { "snoozeDurationDays": [5, 7, 9, 100] } + }, + { + "primaryCtaId": "donate", + "secondaryCtaId": "snooze", + "countries": "1:1000000", + "desktopMinVersion": "6.7.0", + "priority": 100, + "dontShowBeforeEpochSeconds": 1732024800, + "uuid": "1A6FCAB5-2F4C-44D3-88B4-27140FACBF75", + "showForNumberOfDays": 30, + "conditionalId": "test", + "dontShowAfterEpochSeconds": 2147485547, + "secondaryCtaData": { "snoozeDurationDays": [5, 7, 9, 100] } } ] } diff --git a/ts/test-mock/updates-data/static/release-notes/1A6FCAB5-2F4C-44D3-88B4-27140FACBF75/en.json b/ts/test-mock/updates-data/static/release-notes/1A6FCAB5-2F4C-44D3-88B4-27140FACBF75/en.json new file mode 100644 index 0000000000..4f9c31e526 --- /dev/null +++ b/ts/test-mock/updates-data/static/release-notes/1A6FCAB5-2F4C-44D3-88B4-27140FACBF75/en.json @@ -0,0 +1,8 @@ +{ + "image": "/static/release-notes/donate-heart.png", + "uuid": "1A6FCAB5-2F4C-44D3-88B4-27140FACBF75", + "title": "Donate Today", + "body": "As a nonprofit, Signal needs your support.", + "primaryCtaText": "Donate", + "secondaryCtaText": "Not now" +} diff --git a/ts/test-mock/updates-data/static/release-notes/donate-heart.png b/ts/test-mock/updates-data/static/release-notes/donate-heart.png new file mode 100644 index 0000000000000000000000000000000000000000..1befcd52d6801986b47d885cef1e52742652416d GIT binary patch literal 6818 zcmV;T8eQdyP)UmKfIdShdr-Dj-m0$kqIT}v`xpPkQ3b~ zqm_TYyZk?lY_-6KpznJiA^c&$3@t3n-HcJSqu~co+1qB#hEGZEID@J6o7hR z%{tACkmj}#g)`OR(OHqBytqA1E6zJKSOFrT%{@Zsk5LoxXhkT)b01F9*`_AdjZ=Vk zH^O5GZ-mg_Lv^-tRdaTa5LM;{G?LUXD@ykN!U6@k{LJ^khstC1G04exebXt6S4><~_ zj*3tV1#qEGwbV%wtXF{dHo|W?!5;~2Q8ike-RnI?7Gtdf$Z}>#OJsScwg$Afi5|Mf z(k`=g3V?8D?vNnO#$an$WR(KEw;3*kflP8;xML>P^$@I3fL>X1$u+U;z$R~C zyaN3HdU$+{WUTM3zFk=14UAQQUTITRcpR1@yunlc7Cp9apP9pUMk+wBq4hGk3Qt{V zZ;jJUCWb^l8OGXXc#jbN*T@Nfoq$1mZFN1IC&MsG0npT&1FUX_b1vC!JkkI{7HC9_ z!~@_1`+>ClF4=W}PT0Lq+B_#J&r3z>KgvOyJ7sRxiBuv_MIIP~~5 zKQrMyM-@?-0`$V3*T~_Br_yk!k`O2o^E(_#ARMYJF)rN$xKgJhCmm5DJyLdwv{Vn^ zgx@g)(~up=5S2)29-z1PrmOQihNV5WO-ITan<&i#V77;x@H>X5wY^8mQYn<80GRl5 zgKdt&5VBO(6lvih5N5u8DoFrf~obWr! zLdw_&AB2U;SYZl)1?=RKUPt+~f^jM=A1EXQa&f<71l(T4p?^awfNOR+Mnoa`z|bL3 zZ$JJPIULn8Eq4nXlA%06okE|@pZ`03{D=Rc%YS-Deg(nB4GK0k$)B7cfA1vuQxo$0 zD?axb+H>fj{Cef*kI<;O{MOs_(SM$&kN>;-{_!tZ-`sg@&!KDO_j~^Op!^J1etwRo z=Kq=Mfao_pG|U$5xfP&pq0c*aFVIK7&pxd!72<~LY2uEX>B=w62_d_d$|hLfpi94f zg+6-qJY9O}cT!2SaMc(8fo7jMqkUa}YLYCYGqz2K^NvdFp`6$l`ar-hz4Qw0KlR|i zW3c9V6ad19-&4PPXyqr;JCp&e`s)2Bg{6NZv(QI@2hefh*88NlfHF^f`AcL8)4frN z+bIXRa)7n<5MvJ3oWlj-goVey_2r*x1)UR$EFc^zOZWl8mtln;K-v4jH9_cvuWOGy zPH!E(Q-+0B5YllRm_j+on*@KCEa38=-rf=XsL+4(`@zLVMa1&3oH`I%6vfnu;bV8* zXWjhyZ+873%3zZs^iB)POlAeZAr)kJ=mUZ4d~ZqIysv7lz3zs>y7pUdgahhd5{UhE zVFQ%#fB*KMax@`}784gTb$eDCl}BG7*GA^aFuJRizs$oR`%iB{(zRc~q+aYY#t8 zo4@EP9I7w}Usz-l<*wo`%Pu6`*JR-y}onw~8DH0j9q`UrGHQ@iXU%U`g>0Kylyy_S4$u;e8%_evzsG?-d3_ zd8{~4`aSrgMXjeCF_}8VsTIIv>yH>UDN(CZ@B!Wr-d7wdlu#iL2Na;nhFe-iFjWa~ zM%kw(yc4OOo90O-TmK~CM*=wW@yV~LN+7(z z;WS<#l>(S*{Sh|ASm{Bqm#6@yTK}Y*5{LJF z5S?XBQ{K#4_De(BBs)$C(kSjI-#dtwc1M|?q$JS`#43O-%7pM z9i3IIpJ(1auF+H`u&A(-T!~OABd54kcr1=AMT980PwPuRGs-)J9^G_c(p%9z#ty>? z;h!gi=qxVF;kK-Gbv%C*!Vl0$iW?%6t${$eo(I60RkY#uMQFz{sej zq`0tS(DR449paAkff{>1pAt0gBfdrF_pG_1Zpqh8Og)XL9{wUq?>r?FGT=^C` zknXdN1R>M9Efoh8U~J1A;m5_}CK9I?^l>Rd9}|U0p;lP+gCyVN_l>eGH+Ka?q$``^ z{*5Y$*Rkaf7Ip>{KxD|fK-6ITT53Bw<)ai0M(P#qMKIn+Ul)zlm}#l z0nK@ZpBbMYB)hsaQ?>D?WR@QJuynzg(R2^1#VVnIk@F` zrn=cWl4V&cw~EgckOUjs1?C3gxC`ydq2+@H7-yJt7;c!R;Q@?Q0M6BNv8D}Eh_=Js z6K%7@ztn)d)^kF^`E05T7_LEjJ1U2t4%w~nAZWSFU0^p1O> zTO*8pf=nNpGg<)v=W^GVf0pU_j^UY_|BCkK*ppSqRsU%Iy)a$@5ZCL%Ag&t3J>M}L zNPcza0HFKJhNNFG-y0jR0C8cEZl~h76H6TV;qt4GUgZlC1|Oik0~DY`hSR_IJPwwQ zJBJrPcV3`axC2RGoOIPUZVP+E=y>m~hi{rX5ElhUq+;RA#2q(x!<>ZV3a1uwd)Yg( z!L7rHf+QH{vZ)gFp>sbb3us%T07)mo>z;q%mV4bwu>v@B?kB0Qy;{9zL--?T`=Li| zvVg1?6wi0L!0=>^<>8qv5q^wA3k3-2B3TZ%?Vig8hC}9B3n!?~Kmm+Tf;k}gIA06- zfvz#;Dni3Cb>b^pYmU=+-a2}xRYy{3355snEvN$NK!OXwmxs-Xn6v*hc?G-xw}XL$ z2iFXhHXXR;>bO@Zg01H>2;=`p?1<7P%fLlPl_#3u;wI=U61>37liwsqHn?L?`_E#N zhkxI_Kx+>_PPQS6KONtyq2Jb8Jz^b_sDZafz=AeX{(H$#~mB0mirNQ-HYS77C!-J_X4f7t=aEVR~U+oA|~Z z=*=a|rZbK{z`lJRl3?o+VXnjpFR=FT6Z+o~O5;Ky9wffpcnJ>l=6=Ug!_tB5cZcCT zvhI{Qc!B+=9@IX@CB(pmLV6I!9DHF>`xvezH}T0O%f{1_`K|&4^g3Ax5;e}Ea|y8v zh4kbJedHkAmn~g}+LL*|`@Ma6fMWm22edzzq0l4x(i}n|u9DP5Q1yumeYg`LXP-Gk zwxVRd>jB1Sg)9YDh`V{0Uiuv$3Vr8M*C3-_49`?>;zOSkRwlj*&+mpn@@PC96tF!; zACRTM+F!W!K5g{}xx#h7`hiy1kt?8y(`2su)eqTyKHs@(L2LbSEiD;$W|^7l9t$Zw z0J34v!bDgR*X@Hx7o)b6kO74lM*Bef1I*|uA!*kS!)3!(^>@>+m^AC zwHsz}V01dJ&X39uR~}VLVDf4*wW^B~V3a$#a1UT+%G5J`hom#UtuOIw6+nhTHS_`? zsm_n2Sa%vdkV^2pnM#l({P;|9d-ud`H*Y(l?s>Mi_I&{MfQ&jf#c;E^$`Hz;-Rg+G zBML8Kni44C=d5>Jxf7_t!MYN7yfJ4L;J~D}QnzF{3TorrSO7|c+__i4Bqc}^et=yv zIN_J$AE#=)CZa86nIZOwq`LJ4`oWr3U3oNaY(N1exbD|K9BE>#65gb^9m=W;Z}9sz zuj@@iK=fGL<6hi@bsUZ8NA7JYm;SxoTR`(brUf$5->;H9W6h}ks0vWtv1rR^&rErT zSu@=hc?C!QvFfh4eo zVC|77q<7##o~o1}N%-;iv7R^WYPdQRUHHP0cuZ=YOQLCz(~`H|CoN~3fU7=1nFDlq z?IhvHdqlJAoqyp6{h9!*f0FR`o|nwqAB3&(t`}$&x~)Nyy25HhE+|Zqpjv~3m9y%) z_bRJZKdRwaLkiMZe~{{+Z23YB^8(zyI7y+7oI4VNT4YlRuO-W_8H68TeRLB&L0an% zQlAvR70_v_;dlf`aB-6roHX%166zwFOL&dAI(^&*R`T)xdxw3ju6(>5U;2!aS^=O@ zVMvSA5R#f*YWW~HHUXsY4zb1<&AK=xN)rAwO|rU?#rpT2pPnXGgb+ro-hV1KUjaeHpYl{wYxJK<+}h;oq21Aw)S@Ry=A zdYl?Y8czU0PC9_2yEx_h(ko!M<)r5$?BNdl08JMDG$Ri&znhOHk4VTZRqkHUR)Eq> zk}6d7CautNdlktJ@$=1Wcu|hTH%hJ$2p}OANk{5>Yn@P=YV}WzW)Xe>!Ovo`kstK` zO?Zw53%?w9&MW*Nw+B#&Q0Qe53LT?{qT>EI;fKe_Dxh(j_$p6;4sp#Fv&1q?=o5L3 z;poi?VI_HEr$w=lo?l(oZC1f@r}Yk~^sF!aR32Z%DGqXoh9C4dROq7^S^T@AIkUF#Z+khLO&9~7bhV5~bV*CvMqd4aCsrOK$$ z$K=5rcP(hQDwN?+jkhb$L3^VsYlTpl0-!2{n2Z`UG0K6Ym)my}s7-m*7KQ5E0*<=v z(mVuG#tt)k{N$mK93V;^4%;h=q|R^}nqKLNQdHa@rEmoRO;|{u7L+Ry$7el!57V4D zprWq3wPhs~J*NYEz0*`Mr6>Ss>ZpW{tPAGlem&2gY1}j?hltb9?w|5*rxGYE2k2+) zvK*LelVfL)E=}DYrB8I3o$&9_zPMf9@MUQp0Q8z#s=oL1hX6X1Yxb zm*qKhbjoOSB~e)j6vc%@jy@`j`TMEV11Jy<1-_gcYLlbsj7<2!NIZbT^$8kJC8f?d zMyde7DM4cyx$uLLgg{Yn0mekxOQ>RPPo;G12D3dI;+~IM_`%3MKomDcT7Sx#>dcE# z3IJBu!+BvLzDuq`R5wuOe5mR&XA;IK0C0Ih?Jy$V*D>-OK*vsA;1=53kGO}X#QQpo z^Z-$MArbO|7CCI9vn@Ki*I>sGgE7(rL_y3b7uz@Zq)O}XXhqz!Bc=;KFx~@1ao)gq z^nhwS6pIEON_|DzHug6us>jQ7&zfW0bUUV9J3> zZ-p$xS_M$7UJSqCd$d4K5voR>7iUsaD-YHy0B~VZrAWcw4CpD_!W|v8PymHfgmS@t z{5XW#)S7-CYNY@QrwE18K?!qPQMHN<CK{$Q&7#;VK zCp7htKVj`5_#4}Fwh7i=M`INr3UY<9F*@eME7W^O>yEhN=bIGbB;gc5gX}U3MeuyO zQ6z$MWHBB(wIRKT@MiNeop(aN8>avX^cLsLAxshqany8$@PvgA13Cvw-{jCHElvS) zfJ9md*_@AxlJFALRf?(;Y8lQ@K(7bbUule1KHQ?V6ZmX61t?#VUEFG_R$YAKnO~WAM9onXg5OR^Dv;&{oPSA_vFB4I#aa { assert.strictEqual(isMegaphoneShowable(megaphone), false); }); }); + + describe('conditionals', () => { + let sandbox: sinon.SinonSandbox; + let deviceCreatedAt: number; + let oldConversationController: ConversationController; + let ourConversation: ConversationModel; + + const ourAci = generateAci(); + const createMeWithBadges = ( + badges: Array<{ + id: string; + }> + ): ConversationModel => { + const attrs = { + id: 'our-conversation-id', + serviceId: ourAci, + badges, + type: 'private', + sharedGroupNames: [], + version: 0, + expireTimerVersion: 1, + }; + return { + ...attrs, + attributes: attrs, + } as unknown as ConversationModel; + }; + + beforeEach(() => { + sandbox = sinon.createSandbox(); + sandbox.stub(itemStorage, 'get').callsFake(key => { + if (key === 'deviceCreatedAt') { + return deviceCreatedAt; + } + return undefined; + }); + + deviceCreatedAt = Date.now(); + ourConversation = createMeWithBadges([]); + + oldConversationController = window.ConversationController; + window.ConversationController = { + getOurConversation: () => ourConversation, + conversationUpdated: () => undefined, + } as unknown as ConversationController; + }); + + afterEach(() => { + window.ConversationController = oldConversationController; + sandbox.restore(); + }); + + describe('standard_donate', async () => { + const megaphone = getMegaphone({ + conditionalId: 'standard_donate', + }); + + it('true when desktop has been registered for a week and has no badges', () => { + deviceCreatedAt = Date.now() - 7 * DAY; + assert.strictEqual(isMegaphoneShowable(megaphone), true); + }); + + it('false with fresh linked desktop', () => { + assert.strictEqual(isMegaphoneShowable(megaphone), false); + }); + + it('false with badges', () => { + ourConversation = createMeWithBadges([{ id: 'cool' }]); + assert.strictEqual(isMegaphoneShowable(megaphone), false); + }); + }); + }); }); diff --git a/ts/textsecure/AccountManager.preload.ts b/ts/textsecure/AccountManager.preload.ts index 5a76531cc6..a14bfa0cf5 100644 --- a/ts/textsecure/AccountManager.preload.ts +++ b/ts/textsecure/AccountManager.preload.ts @@ -43,6 +43,8 @@ import { encryptDeviceName, generateRegistrationId, getRandomBytes, + decryptDeviceCreatedAt, + encryptDeviceCreatedAt, } from '../Crypto.node.js'; import { generateKeyPair, @@ -311,6 +313,58 @@ export default class AccountManager extends EventTarget { return name; } + // For testing + async _encryptDeviceCreatedAt( + createdAt: number, + deviceId: number + ): Promise { + const ourAci = itemStorage.user.getCheckedAci(); + const identityKey = signalProtocolStore.getIdentityKeyPair(ourAci); + const registrationId = + await signalProtocolStore.getLocalRegistrationId(ourAci); + strictAssert(identityKey, 'Missing identity key pair'); + strictAssert(registrationId, 'Missing registrationId for our Aci'); + + const createdAtCiphertextBytes = encryptDeviceCreatedAt( + createdAt, + deviceId, + registrationId, + identityKey.publicKey + ); + + return Bytes.toBase64(createdAtCiphertextBytes); + } + + async decryptDeviceCreatedAt( + createdAtCiphertextBase64: string, + deviceId: number + ): Promise { + const ourAci = itemStorage.user.getCheckedAci(); + const identityKey = signalProtocolStore.getIdentityKeyPair(ourAci); + if (!identityKey) { + throw new Error('decryptDeviceCreatedAt: No identity key pair!'); + } + + const registrationId = + await signalProtocolStore.getLocalRegistrationId(ourAci); + if (!registrationId) { + throw new Error('decryptDeviceCreatedAt: No registrationId for our Aci!'); + } + + const createdAtCiphertextBytes = Bytes.fromBase64( + createdAtCiphertextBase64 + ); + + const createdAt = decryptDeviceCreatedAt( + createdAtCiphertextBytes, + deviceId, + registrationId, + identityKey.privateKey + ); + + return createdAt; + } + async maybeUpdateDeviceName(): Promise { const isNameEncrypted = itemStorage.user.getDeviceNameEncrypted(); if (isNameEncrypted) { diff --git a/ts/textsecure/WebAPI.preload.ts b/ts/textsecure/WebAPI.preload.ts index 41fdb682d5..70a47151d0 100644 --- a/ts/textsecure/WebAPI.preload.ts +++ b/ts/textsecure/WebAPI.preload.ts @@ -967,7 +967,7 @@ const getDevicesResultZod = z.object({ id: z.number(), name: z.string().nullish(), // primary devices may not have a name lastSeen: z.number().nullish(), - created: z.number().nullish(), + createdAtCiphertext: z.string(), }) ), }); diff --git a/ts/textsecure/storage/User.dom.ts b/ts/textsecure/storage/User.dom.ts index 6f58bb29fc..731823c789 100644 --- a/ts/textsecure/storage/User.dom.ts +++ b/ts/textsecure/storage/User.dom.ts @@ -152,6 +152,14 @@ export class User { return parseInt(value, 10); } + public getDeviceCreatedAt(): number | undefined { + return this.storage.get('deviceCreatedAt'); + } + + public async setDeviceCreatedAt(createdAt: number): Promise { + return this.storage.put('deviceCreatedAt', createdAt); + } + public getDeviceName(): string | undefined { return this.storage.get('device_name'); } diff --git a/ts/types/Storage.d.ts b/ts/types/Storage.d.ts index 61fb2b0973..b7e88eb828 100644 --- a/ts/types/Storage.d.ts +++ b/ts/types/Storage.d.ts @@ -83,6 +83,7 @@ export type StorageAccessType = { customColors: CustomColorsItemType; device_name: string; + deviceCreatedAt: number; existingOnboardingStoryMessageIds: ReadonlyArray | undefined; hasSetMyStoriesPrivacy: boolean; hasCompletedUsernameOnboarding: boolean; diff --git a/ts/util/onDeviceNameChangeSync.preload.ts b/ts/util/onDeviceNameChangeSync.preload.ts index 3c831443b1..300ce60edd 100644 --- a/ts/util/onDeviceNameChangeSync.preload.ts +++ b/ts/util/onDeviceNameChangeSync.preload.ts @@ -27,41 +27,45 @@ export async function onDeviceNameChangeSync( const { confirm } = event; const maybeQueueAndThenConfirm = async () => { - await maybeQueueDeviceNameFetch(); + await maybeQueueDeviceInfoFetch(); confirm(); }; drop(maybeQueueAndThenConfirm()); } -export async function maybeQueueDeviceNameFetch(): Promise { +export async function maybeQueueDeviceInfoFetch(): Promise { if (deviceNameFetchQueue.size >= 1) { - log.info('maybeQueueDeviceNameFetch: skipping; fetch already queued'); + log.info('maybeQueueDeviceInfoFetch: skipping; fetch already queued'); } try { - await deviceNameFetchQueue.add(fetchAndUpdateDeviceName); + await deviceNameFetchQueue.add(fetchAndUpdateDeviceInfo); } catch (e) { log.error( - 'maybeQueueDeviceNameFetch: error when fetching device name', + 'maybeQueueDeviceInfoFetch: error when fetching device name', toLogFormat(e) ); } } -async function fetchAndUpdateDeviceName() { +async function fetchAndUpdateDeviceInfo() { const { devices } = await getDevices(); const localDeviceId = parseIntOrThrow( itemStorage.user.getDeviceId(), - 'fetchAndUpdateDeviceName: localDeviceId' + 'fetchAndUpdateDeviceInfo: localDeviceId' ); const ourDevice = devices.find(device => device.id === localDeviceId); strictAssert(ourDevice, 'ourDevice must be returned from devices endpoint'); - const newNameEncrypted = ourDevice.name; + await maybeUpdateDeviceCreatedAt( + ourDevice.createdAtCiphertext, + localDeviceId + ); + const newNameEncrypted = ourDevice.name; if (!newNameEncrypted) { - log.error('fetchAndUpdateDeviceName: device had empty name'); + log.error('fetchAndUpdateDeviceInfo: device had empty name'); return; } @@ -71,20 +75,49 @@ async function fetchAndUpdateDeviceName() { } catch (e) { const deviceNameWasEncrypted = itemStorage.user.getDeviceNameEncrypted(); log.error( - `fetchAndUpdateDeviceName: failed to decrypt device name. Was encrypted local state: ${deviceNameWasEncrypted}` + `fetchAndUpdateDeviceInfo: failed to decrypt device name. Was encrypted local state: ${deviceNameWasEncrypted}` ); return; } const existingName = itemStorage.user.getDeviceName(); if (newName === existingName) { - log.info('fetchAndUpdateDeviceName: new name matches existing name'); + log.info('fetchAndUpdateDeviceInfo: new name matches existing name'); return; } await itemStorage.user.setDeviceName(newName); window.Whisper.events.emit('deviceNameChanged'); log.info( - 'fetchAndUpdateDeviceName: successfully updated new device name locally' + 'fetchAndUpdateDeviceInfo: successfully updated new device name locally' ); } + +async function maybeUpdateDeviceCreatedAt( + createdAtCiphertext: string, + deviceId: number +): Promise { + const existingCreatedAt = itemStorage.user.getDeviceCreatedAt(); + if (existingCreatedAt) { + return; + } + + const createdAtEncrypted = createdAtCiphertext; + let createdAt: number | undefined; + try { + createdAt = await accountManager.decryptDeviceCreatedAt( + createdAtEncrypted, + deviceId + ); + } catch (e) { + log.error( + 'maybeUpdateDeviceCreatedAt: failed to decrypt device createdAt', + toLogFormat(e) + ); + } + + if (createdAt) { + await itemStorage.user.setDeviceCreatedAt(createdAt); + log.info('maybeUpdateDeviceCreatedAt: saved createdAt'); + } +} From 869787f1f543c250f4f916b6f4734d2faa1620b3 Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Tue, 20 Jan 2026 14:52:36 -0600 Subject: [PATCH 24/49] Update to RingRTC v2.62.0 Co-authored-by: Jim Gustafson --- ACKNOWLEDGMENTS.md | 310 ++++++++------------------------------------- package.json | 2 +- pnpm-lock.yaml | 32 ++++- 3 files changed, 80 insertions(+), 264 deletions(-) diff --git a/ACKNOWLEDGMENTS.md b/ACKNOWLEDGMENTS.md index 20c4b8bcc4..148625fc90 100644 --- a/ACKNOWLEDGMENTS.md +++ b/ACKNOWLEDGMENTS.md @@ -14128,7 +14128,7 @@ authorization of the copyright holder. RingRTC makes use of the following open source projects. -## poksho 0.7.0, signal-crypto 0.1.0, zkcredential 0.1.0, zkgroup 0.9.0, partial-default 0.1.0 +## poksho 0.7.0, signal-crypto 0.1.0, zkcredential 0.1.0, zkgroup 0.9.0 ``` GNU AFFERO GENERAL PUBLIC LICENSE @@ -14795,7 +14795,7 @@ For more information on this, and how to apply and follow the GNU AGPL, see ``` -## libsignal-account-keys 0.1.0, libsignal-core 0.1.0, mrp 2.61.0, protobuf 2.61.0, ringrtc 2.61.0, regex-aot 0.1.0, partial-default-derive 0.1.0 +## libsignal-account-keys 0.1.0, libsignal-core 0.1.0, mrp 2.62.0, protobuf 2.62.0, ringrtc 2.62.0, regex-aot 0.1.0, partial-default-derive 0.1.0, partial-default 0.1.0 ``` GNU AFFERO GENERAL PUBLIC LICENSE @@ -15450,188 +15450,6 @@ You should also get your employer (if you work as a programmer) or school, if an ``` -## ryu 1.0.20 - -``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -``` - ## prost-build 0.14.1, prost-derive 0.14.1, prost-types 0.14.1, prost 0.14.1 ``` @@ -16182,37 +16000,6 @@ DEALINGS IN THE SOFTWARE. ``` -## core-foundation-sys 0.8.7 - -``` -Copyright (c) 2012-2013 Mozilla Foundation - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - -``` - ## hex 0.4.3 ``` @@ -16239,7 +16026,7 @@ SOFTWARE. ``` -## cc 1.2.49, cfg-if 1.0.4, cmake 0.1.54, find-msvc-tools 0.1.5, pkg-config 0.3.32 +## cc 1.2.51, cfg-if 1.0.4, cmake 0.1.57, find-msvc-tools 0.1.6, pkg-config 0.3.32 ``` Copyright (c) 2014 Alex Crichton @@ -16301,7 +16088,7 @@ DEALINGS IN THE SOFTWARE. ``` -## base64ct 1.8.1 +## base64ct 1.8.2 ``` Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com) @@ -16396,33 +16183,7 @@ DEALINGS IN THE SOFTWARE. ``` -## unicase 2.8.1 - -``` -Copyright (c) 2014-2017 Sean McArthur - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -``` - -## libc 0.2.178 +## libc 0.2.179 ``` Copyright (c) 2014-2020 The Rust Project Developers @@ -16451,6 +16212,32 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +## unicase 2.9.0 + +``` +Copyright (c) 2014-2026 Sean McArthur + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + ``` ## either 1.15.0, itertools 0.14.0, petgraph 0.7.1, serde_with 3.16.1, serde_with_macros 3.16.1 @@ -16509,7 +16296,7 @@ THE SOFTWARE. ``` -## tempfile 3.23.0 +## tempfile 3.24.0 ``` Copyright (c) 2015 Steven Allen @@ -16834,7 +16621,7 @@ DEALINGS IN THE SOFTWARE. ``` -## indexmap 2.12.1 +## indexmap 2.13.0 ``` Copyright (c) 2016--2017 @@ -17633,7 +17420,7 @@ THE SOFTWARE. ``` -## toml_datetime 0.7.3, toml_edit 0.23.9, toml_parser 1.0.4 +## toml_datetime 0.7.5+spec-1.1.0, toml_edit 0.23.10+spec-1.0.0, toml_parser 1.0.6+spec-1.1.0 ``` Copyright (c) Individual contributors @@ -17690,7 +17477,7 @@ DEALINGS IN THE SOFTWARE. ``` -## zerocopy-derive 0.8.31, zerocopy 0.8.31 +## zerocopy-derive 0.8.33, zerocopy 0.8.33 ``` Copyright 2023 The Fuchsia Authors @@ -17830,7 +17617,7 @@ SOFTWARE. ``` -## zeroize_derive 1.4.2 +## zeroize_derive 1.4.3 ``` MIT License @@ -17911,18 +17698,27 @@ SOFTWARE. ``` -## cesu8 1.1.0, neon 1.1.1, protobuf-parse 3.7.2, tonic-prost-build 0.14.2, windows-core 0.57.0, windows-core 0.58.0, windows-implement 0.57.0, windows-implement 0.58.0, windows-interface 0.57.0, windows-interface 0.58.0, windows-link 0.2.1, windows-result 0.1.2, windows-result 0.2.0, windows-strings 0.1.0, windows 0.57.0, windows 0.58.0 +## cesu8 1.1.0, neon 1.1.1, objc2-core-foundation 0.3.2, objc2-io-kit 0.3.2, protobuf-parse 3.7.2, tonic-prost-build 0.14.2, windows-collections 0.2.0, windows-collections 0.3.2, windows-core 0.61.2, windows-core 0.62.2, windows-future 0.2.1, windows-future 0.3.2, windows-implement 0.60.2, windows-interface 0.59.3, windows-link 0.1.3, windows-link 0.2.1, windows-numerics 0.2.0, windows-numerics 0.3.1, windows-result 0.3.4, windows-result 0.4.1, windows-strings 0.4.2, windows-strings 0.5.1, windows-threading 0.1.0, windows-threading 0.2.1, windows 0.61.3, windows 0.62.2 ``` MIT License Copyright (c) -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. ``` @@ -17951,7 +17747,7 @@ SOFTWARE. ``` -## curve25519-dalek-derive 0.1.1, anyhow 1.0.100, displaydoc 0.2.5, fastrand 2.3.0, home 0.5.12, itoa 1.0.15, linkme-impl 0.3.35, linkme 0.3.35, linux-raw-sys 0.11.0, linux-raw-sys 0.4.15, num_enum 0.7.5, num_enum_derive 0.7.5, once_cell 1.21.3, prettyplease 0.2.37, proc-macro-crate 3.4.0, proc-macro2 1.0.103, quote 1.0.42, rustix 0.38.44, rustix 1.1.2, rustversion 1.0.22, semver 1.0.27, send_wrapper 0.6.0, serde 1.0.228, serde_core 1.0.228, serde_derive 1.0.228, serde_json 1.0.145, syn 1.0.109, syn 2.0.111, thiserror-impl 1.0.69, thiserror-impl 2.0.17, thiserror 1.0.69, thiserror 2.0.17, unicode-ident 1.0.22 +## curve25519-dalek-derive 0.1.1, anyhow 1.0.100, displaydoc 0.2.5, fastrand 2.3.0, home 0.5.12, itoa 1.0.17, linkme-impl 0.3.35, linkme 0.3.35, linux-raw-sys 0.11.0, linux-raw-sys 0.4.15, num_enum 0.7.5, num_enum_derive 0.7.5, once_cell 1.21.3, prettyplease 0.2.37, proc-macro-crate 3.4.0, proc-macro2 1.0.105, quote 1.0.43, rustix 0.38.44, rustix 1.1.3, rustversion 1.0.22, semver 1.0.27, send_wrapper 0.6.0, serde 1.0.228, serde_core 1.0.228, serde_derive 1.0.228, serde_json 1.0.149, syn 2.0.114, thiserror-impl 1.0.69, thiserror-impl 2.0.17, thiserror 1.0.69, thiserror 2.0.17, unicode-ident 1.0.22, zmij 1.0.12 ``` Permission is hereby granted, free of charge, to any @@ -18004,7 +17800,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## ntapi 0.4.1 +## ntapi 0.4.2 ``` Permission is hereby granted, free of charge, to any person obtaining a copy @@ -18164,7 +17960,7 @@ SOFTWARE. ``` -## sysinfo 0.31.4 +## sysinfo 0.37.2 ``` The MIT License (MIT) @@ -18247,7 +18043,7 @@ THE SOFTWARE. ``` -## derive_more-impl 2.1.0, derive_more 2.1.0 +## derive_more-impl 2.1.1, derive_more 2.1.1 ``` The MIT License (MIT) diff --git a/package.json b/package.json index 969baeb8a4..fb77707f5a 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,7 @@ "@signalapp/minimask": "1.0.1", "@signalapp/mute-state-change": "workspace:1.0.0", "@signalapp/quill-cjs": "2.1.2", - "@signalapp/ringrtc": "2.61.0", + "@signalapp/ringrtc": "2.62.0", "@signalapp/sqlcipher": "2.4.4", "@signalapp/windows-ucv": "1.0.1", "@tanstack/react-virtual": "3.11.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 157458f724..994c79bc88 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -141,8 +141,8 @@ importers: specifier: 2.1.2 version: 2.1.2 '@signalapp/ringrtc': - specifier: 2.61.0 - version: 2.61.0 + specifier: 2.62.0 + version: 2.62.0 '@signalapp/sqlcipher': specifier: 2.4.4 version: 2.4.4 @@ -3511,8 +3511,8 @@ packages: resolution: {integrity: sha512-y2sgqdivlrG41J4Zvt/82xtH/PZjDlgItqlD2g/Cv3ZbjlR6cGhTNXbfNygCJB8nXj+C7I28pjt1Zm3k0pv2mg==} engines: {npm: '>=8.2.3'} - '@signalapp/ringrtc@2.61.0': - resolution: {integrity: sha512-JHmEhsjRXZ6TKd9cHYt+O1fjFIy0GfgcfBWpqV/jvZT++eM2ZX2r6PqJmyViABral6LEzS8Jm2D0J8bYZVAeIg==} + '@signalapp/ringrtc@2.62.0': + resolution: {integrity: sha512-peFkgzQV4fkr7EftSUr4voBZAQ8FNzj+0Qsri1AmrY/zY/mjr4mIlb0Lrn2BGPPHg1NwvkCUWPT8bS5SscRmKQ==} hasBin: true '@signalapp/sqlcipher@2.4.4': @@ -8250,6 +8250,10 @@ packages: resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} engines: {node: '>= 18'} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -10123,6 +10127,10 @@ packages: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} + tar@7.5.2: + resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} + engines: {node: '>=18'} + telejson@7.2.0: resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==} @@ -14319,10 +14327,10 @@ snapshots: lodash: 4.17.21 quill-delta: 5.1.0 - '@signalapp/ringrtc@2.61.0': + '@signalapp/ringrtc@2.62.0': dependencies: https-proxy-agent: 7.0.6 - tar: 6.2.1 + tar: 7.5.2 transitivePeerDependencies: - supports-color @@ -20159,6 +20167,10 @@ snapshots: minipass: 7.1.2 rimraf: 5.0.10 + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + mkdirp@0.5.6: dependencies: minimist: 1.2.8 @@ -22358,6 +22370,14 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 + tar@7.5.2: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + telejson@7.2.0: dependencies: memoizerific: 1.11.3 From 8a29861005183f16e876a025cef0eaa640f64ef7 Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Tue, 20 Jan 2026 14:52:46 -0600 Subject: [PATCH 25/49] Update to libsignal v0.86.12 Co-authored-by: Scott Nonnenberg --- ACKNOWLEDGMENTS.md | 319 ++++++++++++--------------------------------- package.json | 2 +- pnpm-lock.yaml | 10 +- 3 files changed, 88 insertions(+), 243 deletions(-) diff --git a/ACKNOWLEDGMENTS.md b/ACKNOWLEDGMENTS.md index 148625fc90..68feca365e 100644 --- a/ACKNOWLEDGMENTS.md +++ b/ACKNOWLEDGMENTS.md @@ -6092,7 +6092,7 @@ Signal Desktop makes use of the following open source projects. libsignal makes use of the following open source projects. -## spqr 1.3.0, partial-default-derive 0.1.0, partial-default 0.1.0 +## spqr 1.4.0, partial-default-derive 0.1.0, partial-default 0.1.0 ``` GNU AFFERO GENERAL PUBLIC LICENSE @@ -8280,7 +8280,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## libcrux-hacl-rs 0.0.4, libcrux-hmac 0.0.4, libcrux-intrinsics 0.0.4, libcrux-macros 0.0.3, libcrux-ml-kem 0.0.4, libcrux-platform 0.0.2, libcrux-secrets 0.0.4, libcrux-sha2 0.0.4, libcrux-sha3 0.0.4, libcrux-traits 0.0.4 +## libcrux-hacl-rs 0.0.4, libcrux-hmac 0.0.4, libcrux-intrinsics 0.0.4, libcrux-macros 0.0.3, libcrux-ml-kem 0.0.5, libcrux-platform 0.0.2, libcrux-platform 0.0.3, libcrux-secrets 0.0.4, libcrux-sha2 0.0.4, libcrux-sha3 0.0.4, libcrux-sha3 0.0.5, libcrux-traits 0.0.4 ``` Apache License @@ -8475,188 +8475,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. limitations under the License. ``` -## ryu 1.0.20 - -``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -``` - ## debugid 0.8.0, prost-build 0.14.1, prost-derive 0.14.1, prost-types 0.14.1, prost 0.14.1 ``` @@ -9091,7 +8909,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## asn1 0.21.3, asn1_derive 0.21.3 +## asn1 0.23.0, asn1_derive 0.23.0 ``` Copyright (c) Alex Gaynor and individual contributors. @@ -9212,7 +9030,7 @@ CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ``` -## libloading 0.8.8 +## libloading 0.8.9 ``` Copyright © 2015, Simonas Kazlauskas @@ -9230,7 +9048,7 @@ THIS SOFTWARE. ``` -## rustls-webpki 0.103.6 +## rustls-webpki 0.103.8 ``` Except as otherwise noted, this project is licensed under the following @@ -9255,7 +9073,7 @@ third-party/chromium/LICENSE. ``` -## windows-core 0.62.0, windows-implement 0.60.0, windows-interface 0.59.1, windows-link 0.2.0, windows-result 0.4.0, windows-strings 0.5.0, windows-sys 0.52.0, windows-sys 0.59.0, windows-sys 0.61.0, windows-targets 0.52.6, windows-targets 0.53.3, windows_aarch64_msvc 0.52.6, windows_aarch64_msvc 0.53.0, windows_x86_64_gnu 0.52.6, windows_x86_64_gnu 0.53.0, windows_x86_64_msvc 0.52.6, windows_x86_64_msvc 0.53.0 +## windows-core 0.62.2, windows-implement 0.60.2, windows-interface 0.59.3, windows-link 0.2.1, windows-result 0.4.1, windows-strings 0.5.1, windows-sys 0.52.0, windows-sys 0.59.0, windows-sys 0.60.2, windows-sys 0.61.2, windows-targets 0.52.6, windows-targets 0.53.5, windows_aarch64_msvc 0.52.6, windows_aarch64_msvc 0.53.1, windows_x86_64_gnu 0.52.6, windows_x86_64_gnu 0.53.1, windows_x86_64_msvc 0.52.6, windows_x86_64_msvc 0.53.1 ``` MIT License @@ -9465,7 +9283,7 @@ DEALINGS IN THE SOFTWARE. ``` -## backtrace 0.3.75, cc 1.2.37, cfg-if 1.0.3, cmake 0.1.48, find-msvc-tools 0.1.1, openssl-probe 0.1.6, rustc-demangle 0.1.26, socket2 0.6.0 +## backtrace 0.3.76, cc 1.2.52, cfg-if 1.0.4, cmake 0.1.48, find-msvc-tools 0.1.7, openssl-probe 0.2.0, rustc-demangle 0.1.26, socket2 0.6.1 ``` Copyright (c) 2014 Alex Crichton @@ -9528,7 +9346,7 @@ DEALINGS IN THE SOFTWARE. ``` -## mio 1.0.4 +## mio 1.1.1 ``` Copyright (c) 2014 Carl Lerche and other MIO contributors @@ -9584,7 +9402,7 @@ DEALINGS IN THE SOFTWARE. ``` -## base64ct 1.8.0 +## base64ct 1.8.2 ``` Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com) @@ -9616,7 +9434,7 @@ DEALINGS IN THE SOFTWARE. ``` -## bitflags 2.9.4, glob 0.3.3, log 0.4.28, num-derive 0.4.2, num-integer 0.1.46, num-traits 0.2.19, range-map 0.2.0, regex-automata 0.4.10, regex-syntax 0.8.6, regex 1.11.2 +## bitflags 2.10.0, glob 0.3.3, log 0.4.29, num-derive 0.4.2, num-integer 0.1.46, num-traits 0.2.19, range-map 0.2.0, regex-automata 0.4.13, regex-syntax 0.8.8, regex 1.12.2 ``` Copyright (c) 2014 The Rust Project Developers @@ -9647,7 +9465,7 @@ DEALINGS IN THE SOFTWARE. ``` -## uuid 1.18.1 +## uuid 1.19.0 ``` Copyright (c) 2014 The Rust Project Developers @@ -9705,7 +9523,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## libc 0.2.175 +## libc 0.2.180 ``` Copyright (c) 2014-2020 The Rust Project Developers @@ -9736,7 +9554,7 @@ DEALINGS IN THE SOFTWARE. ``` -## flate2 1.1.2 +## flate2 1.1.5 ``` Copyright (c) 2014-2025 Alex Crichton @@ -9767,7 +9585,7 @@ DEALINGS IN THE SOFTWARE. ``` -## hyper 1.7.0 +## hyper 1.8.1 ``` Copyright (c) 2014-2025 Sean McArthur @@ -9792,7 +9610,7 @@ THE SOFTWARE. ``` -## either 1.15.0, itertools 0.13.0, itertools 0.14.0, petgraph 0.7.1, serde_with 3.14.0, serde_with_macros 3.14.0 +## either 1.15.0, itertools 0.13.0, itertools 0.14.0, petgraph 0.7.1, serde_with 3.16.1, serde_with_macros 3.16.1 ``` Copyright (c) 2015 @@ -9848,7 +9666,7 @@ THE SOFTWARE. ``` -## tempfile 3.22.0 +## tempfile 3.24.0 ``` Copyright (c) 2015 Steven Allen @@ -9879,7 +9697,7 @@ DEALINGS IN THE SOFTWARE. ``` -## object 0.36.7 +## object 0.37.3 ``` Copyright (c) 2015 The Gimli Developers @@ -9910,7 +9728,7 @@ DEALINGS IN THE SOFTWARE. ``` -## gimli 0.31.1, heck 0.5.0, unicode-segmentation 1.12.0, unicode-xid 0.2.6 +## gimli 0.32.3, heck 0.5.0, unicode-segmentation 1.12.0, unicode-xid 0.2.6 ``` Copyright (c) 2015 The Rust Project Developers @@ -10238,7 +10056,7 @@ DEALINGS IN THE SOFTWARE. ``` -## hashbrown 0.15.5 +## hashbrown 0.16.1 ``` Copyright (c) 2016 Amanieu d'Antras @@ -10269,7 +10087,7 @@ DEALINGS IN THE SOFTWARE. ``` -## intmap 3.1.2 +## intmap 3.1.3 ``` Copyright (c) 2016 Jesper Axelsson @@ -10281,7 +10099,7 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## rustls-native-certs 0.8.1, rustls 0.23.31 +## rustls-native-certs 0.8.3, rustls 0.23.36 ``` Copyright (c) 2016 Joseph Birr-Pixton @@ -10462,7 +10280,7 @@ DEALINGS IN THE SOFTWARE. ``` -## indexmap 2.11.3 +## indexmap 2.13.0 ``` Copyright (c) 2016--2017 @@ -10524,7 +10342,7 @@ DEALINGS IN THE SOFTWARE. ``` -## addr2line 0.24.2 +## addr2line 0.25.1 ``` Copyright (c) 2016-2018 The gimli Developers @@ -10617,7 +10435,7 @@ DEALINGS IN THE SOFTWARE. ``` -## tungstenite 0.27.0 +## tungstenite 0.28.0 ``` Copyright (c) 2017 Alexey Galakhov @@ -10736,7 +10554,7 @@ DEALINGS IN THE SOFTWARE. ``` -## tokio-tungstenite 0.27.0 +## tokio-tungstenite 0.28.0 ``` Copyright (c) 2017 Daniel Abramov @@ -10813,7 +10631,7 @@ SOFTWARE. ``` -## h2 0.4.12 +## h2 0.4.13 ``` Copyright (c) 2017 h2 authors @@ -10844,7 +10662,7 @@ DEALINGS IN THE SOFTWARE. ``` -## http 1.3.1 +## http 1.4.0 ``` Copyright (c) 2017 http-rs authors @@ -10906,7 +10724,7 @@ DEALINGS IN THE SOFTWARE. ``` -## bytes 1.10.1 +## bytes 1.11.0 ``` Copyright (c) 2018 Carl Lerche @@ -11240,7 +11058,7 @@ DEALINGS IN THE SOFTWARE. ``` -## getrandom 0.3.3 +## getrandom 0.3.4 ``` Copyright (c) 2018-2025 The rust-random Project Developers @@ -11515,7 +11333,7 @@ DEALINGS IN THE SOFTWARE. ``` -## tracing-attributes 0.1.30, tracing-core 0.1.34, tracing 0.1.41 +## tracing-attributes 0.1.31, tracing-core 0.1.36, tracing 0.1.44 ``` Copyright (c) 2019 Tokio Contributors @@ -11826,7 +11644,7 @@ DEALINGS IN THE SOFTWARE. ``` -## memmap2 0.9.8 +## memmap2 0.9.9 ``` Copyright (c) 2020 Yevhenii Reizner @@ -11920,7 +11738,7 @@ DEALINGS IN THE SOFTWARE. ``` -## crypto-common 0.1.6 +## crypto-common 0.1.7 ``` Copyright (c) 2021 RustCrypto Developers @@ -12064,7 +11882,7 @@ SOFTWARE. ``` -## rustls-pki-types 1.12.0 +## rustls-pki-types 1.13.2 ``` Copyright (c) 2023 Dirkjan Ochtman @@ -12145,7 +11963,7 @@ SOFTWARE. ``` -## hyper-util 0.1.17 +## hyper-util 0.1.19 ``` Copyright (c) 2023-2025 Sean McArthur @@ -12170,7 +11988,7 @@ THE SOFTWARE. ``` -## deranged 0.5.3 +## deranged 0.5.5 ``` Copyright (c) 2024 Jacob Pratt et al. @@ -12220,7 +12038,7 @@ THE SOFTWARE. ``` -## toml_datetime 0.7.1, toml_edit 0.23.5, toml_parser 1.0.2 +## toml_datetime 0.7.5+spec-1.1.0, toml_edit 0.23.10+spec-1.0.0, toml_parser 1.0.6+spec-1.1.0 ``` Copyright (c) Individual contributors @@ -12245,7 +12063,7 @@ SOFTWARE. ``` -## time-core 0.1.6, time 0.3.43 +## time-core 0.1.6, time 0.3.44 ``` Copyright (c) Jacob Pratt et al. @@ -12333,7 +12151,7 @@ DEALINGS IN THE SOFTWARE. ``` -## rangemap 1.6.0 +## rangemap 1.7.1 ``` Copyright 2019 Jeffrey Parsons @@ -12346,7 +12164,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ``` -## zerocopy-derive 0.8.27, zerocopy 0.8.27 +## zerocopy-derive 0.8.33, zerocopy 0.8.33 ``` Copyright 2023 The Fuchsia Authors @@ -12544,7 +12362,7 @@ SOFTWARE. ``` -## darling 0.20.11, darling_core 0.20.11, darling_macro 0.20.11 +## darling 0.20.11, darling 0.21.3, darling_core 0.20.11, darling_core 0.21.3, darling_macro 0.20.11, darling_macro 0.21.3 ``` MIT License @@ -12625,7 +12443,7 @@ SOFTWARE. ``` -## zeroize 1.8.1 +## zeroize 1.8.2 ``` MIT License @@ -12706,7 +12524,7 @@ SOFTWARE. ``` -## tokio-macros 2.5.0 +## tokio-macros 2.6.0 ``` MIT License @@ -12761,7 +12579,7 @@ SOFTWARE. ``` -## zeroize_derive 1.4.2 +## zeroize_derive 1.4.3 ``` MIT License @@ -12788,7 +12606,7 @@ SOFTWARE. ``` -## convert_case 0.4.0 +## convert_case 0.10.0, convert_case 0.4.0 ``` MIT License @@ -12815,7 +12633,7 @@ SOFTWARE. ``` -## const-str 0.6.4 +## const-str 1.0.0 ``` MIT License @@ -12977,7 +12795,7 @@ SOFTWARE. ``` -## tokio-stream 0.1.17, tokio-util 0.7.16, tokio 1.47.1 +## tokio-stream 0.1.18, tokio-util 0.7.18, tokio 1.49.0 ``` MIT License @@ -13004,6 +12822,33 @@ SOFTWARE. ``` +## simd-adler32 0.3.8 + +``` +MIT License + +Copyright (c) [2021] [Marvin Countryman] + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## miniz_oxide 0.8.9 ``` @@ -13088,7 +12933,7 @@ IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## curve25519-dalek-derive 0.1.1, adler2 2.0.1, anyhow 1.0.99, async-trait 0.1.89, atomic-waker 1.1.2, auto_enums 0.8.7, derive_utils 0.15.0, displaydoc 0.2.5, dyn-clone 1.0.20, fastrand 2.3.0, home 0.5.11, itoa 1.0.15, linkme-impl 0.3.33, linkme 0.3.33, linux-raw-sys 0.11.0, linux-raw-sys 0.4.15, minimal-lexical 0.2.1, num_enum 0.7.4, num_enum_derive 0.7.4, once_cell 1.21.3, paste 1.0.15, pin-project-internal 1.1.10, pin-project-lite 0.2.16, pin-project 1.1.10, prettyplease 0.2.37, proc-macro-crate 3.4.0, proc-macro2 1.0.101, quote 1.0.40, rustix 0.38.44, rustix 1.1.2, rustversion 1.0.22, semver 1.0.27, send_wrapper 0.6.0, serde 1.0.225, serde_core 1.0.225, serde_derive 1.0.225, serde_json 1.0.145, syn-mid 0.6.0, syn 2.0.106, thiserror-impl 1.0.69, thiserror-impl 2.0.16, thiserror 1.0.69, thiserror 2.0.16, unicode-ident 1.0.19, utf-8 0.7.6 +## curve25519-dalek-derive 0.1.1, adler2 2.0.1, anyhow 1.0.100, async-trait 0.1.89, atomic-waker 1.1.2, auto_enums 0.8.7, derive_utils 0.15.0, displaydoc 0.2.5, dyn-clone 1.0.20, fastrand 2.3.0, home 0.5.11, itoa 1.0.17, linkme-impl 0.3.35, linkme 0.3.35, linux-raw-sys 0.11.0, linux-raw-sys 0.4.15, minimal-lexical 0.2.1, num_enum 0.7.5, num_enum_derive 0.7.5, once_cell 1.21.3, paste 1.0.15, pin-project-internal 1.1.10, pin-project-lite 0.2.16, pin-project 1.1.10, prettyplease 0.2.37, proc-macro-crate 3.4.0, proc-macro2 1.0.105, quote 1.0.43, rustix 0.38.44, rustix 1.1.3, rustversion 1.0.22, semver 1.0.27, send_wrapper 0.6.0, serde 1.0.228, serde_core 1.0.228, serde_derive 1.0.228, serde_json 1.0.149, syn-mid 0.6.0, syn 2.0.114, thiserror-impl 1.0.69, thiserror-impl 2.0.17, thiserror 1.0.69, thiserror 2.0.17, unicode-ident 1.0.22, utf-8 0.7.6, zmij 1.0.12 ``` Permission is hereby granted, free of charge, to any @@ -13117,7 +12962,7 @@ DEALINGS IN THE SOFTWARE. ``` -## winnow 0.7.13 +## winnow 0.7.14 ``` Permission is hereby granted, free of charge, to any person obtaining @@ -13141,7 +12986,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## typenum 1.18.0 +## typenum 1.19.0 ``` The MIT License (MIT) @@ -13221,7 +13066,7 @@ THE SOFTWARE. ``` -## aho-corasick 1.1.3, memchr 2.7.5 +## aho-corasick 1.1.4, memchr 2.7.6 ``` The MIT License (MIT) @@ -13304,7 +13149,7 @@ THE SOFTWARE. ``` -## security-framework-sys 2.15.0, security-framework 3.4.0 +## security-framework-sys 2.15.0, security-framework 3.5.1 ``` The MIT License (MIT) @@ -13358,7 +13203,7 @@ SOFTWARE. ``` -## derive_more-impl 2.0.1, derive_more 0.99.20, derive_more 2.0.1 +## derive_more-impl 2.1.1, derive_more 0.99.20, derive_more 2.1.1 ``` The MIT License (MIT) @@ -13412,7 +13257,7 @@ SOFTWARE. ``` -## async-compression 0.4.30, compression-codecs 0.4.30, compression-core 0.4.29 +## async-compression 0.4.36, compression-codecs 0.4.35, compression-core 0.4.31 ``` The MIT License (MIT) @@ -13638,7 +13483,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## hpke-rs-crypto 0.3.0, hpke-rs 0.4.0 +## hpke-rs-crypto 0.4.0, hpke-rs 0.5.0 ``` Mozilla Public License Version 2.0 @@ -14075,7 +13920,7 @@ Exhibit B - "Incompatible With Secondary Licenses" Notice */ ``` -## unicode-ident 1.0.19 +## unicode-ident 1.0.22 ``` UNICODE LICENSE V3 diff --git a/package.json b/package.json index fb77707f5a..69090a8cbe 100644 --- a/package.json +++ b/package.json @@ -133,7 +133,7 @@ "@react-aria/utils": "3.25.3", "@react-spring/web": "10.0.3", "@react-types/shared": "3.27.0", - "@signalapp/libsignal-client": "0.86.9", + "@signalapp/libsignal-client": "0.86.12", "@signalapp/minimask": "1.0.1", "@signalapp/mute-state-change": "workspace:1.0.0", "@signalapp/quill-cjs": "2.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 994c79bc88..fb5b91a743 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -129,8 +129,8 @@ importers: specifier: 3.27.0 version: 3.27.0(react@18.3.1) '@signalapp/libsignal-client': - specifier: 0.86.9 - version: 0.86.9 + specifier: 0.86.12 + version: 0.86.12 '@signalapp/minimask': specifier: 1.0.1 version: 1.0.1 @@ -3495,8 +3495,8 @@ packages: '@signalapp/libsignal-client@0.76.7': resolution: {integrity: sha512-iGWTlFkko7IKlm96Iy91Wz5sIN089nj02ifOk6BWtLzeVi0kFaNj+jK26Sl1JRXy/VfXevcYtiOivOg43BPqpg==} - '@signalapp/libsignal-client@0.86.9': - resolution: {integrity: sha512-1s7kBgFdXuHTqSJECep+AM/SvhZ66w9V4yMfHELpkNAmXBZlZ4CZLduWRvyUpfpVj2guLFadBExqcDej8JJKJA==} + '@signalapp/libsignal-client@0.86.12': + resolution: {integrity: sha512-GJYT0uSfDv6hsu4uqFlUK/pS43/mCJ86rRODS8RNDdQ1XioGyFE0JT4etHF27f5n+xNkpd4XKYhiquZfxazOgA==} '@signalapp/minimask@1.0.1': resolution: {integrity: sha512-QAwo0joA60urTNbW9RIz6vLKQjy+jdVtH7cvY0wD9PVooD46MAjE40MLssp4xUJrph91n2XvtJ3pbEUDrmT2AA==} @@ -14287,7 +14287,7 @@ snapshots: type-fest: 4.26.1 uuid: 11.0.2 - '@signalapp/libsignal-client@0.86.9': + '@signalapp/libsignal-client@0.86.12': dependencies: node-gyp-build: 4.8.4 type-fest: 4.26.1 From f786f40e3cbee570ac6dab41d9699fb5e5a823c6 Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Tue, 20 Jan 2026 14:52:57 -0600 Subject: [PATCH 26/49] Update local backup export UI Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com> --- _locales/en/messages.json | 36 +++ ...-delete-sync.svg => desktop-and-phone.svg} | 0 ts/CI.preload.ts | 2 +- ts/components/GlobalModalContainer.dom.tsx | 10 + .../LocalBackupExportWorkflow.dom.stories.tsx | 146 +++++++++ .../LocalBackupExportWorkflow.dom.tsx | 269 +++++++++++++++++ ts/components/LocalDeleteWarningModal.dom.tsx | 2 +- .../PlaintextExportWorkflow.dom.stories.tsx | 14 +- ts/components/PlaintextExportWorkflow.dom.tsx | 14 +- ts/components/Preferences.dom.stories.tsx | 32 +- ts/components/Preferences.dom.tsx | 10 +- ts/components/PreferencesBackups.dom.tsx | 7 + ts/components/PreferencesInternal.dom.tsx | 55 ---- ts/components/PreferencesLocalBackups.dom.tsx | 36 +++ ts/services/backups/index.preload.ts | 181 +++++------ ts/state/ducks/backups.preload.ts | 283 ++++++++++++++++-- ts/state/selectors/backups.std.ts | 39 ++- .../smart/GlobalModalContainer.preload.tsx | 17 +- .../LocalBackupExportWorkflow.preload.tsx | 59 ++++ .../smart/PlaintextExportWorkflow.preload.tsx | 4 +- ts/state/smart/Preferences.preload.tsx | 8 +- .../{Backups.std.ts => LocalExport.std.ts} | 139 ++++++--- ts/types/Storage.d.ts | 2 + 23 files changed, 1085 insertions(+), 280 deletions(-) rename images/{local-delete-sync.svg => desktop-and-phone.svg} (100%) create mode 100644 ts/components/LocalBackupExportWorkflow.dom.stories.tsx create mode 100644 ts/components/LocalBackupExportWorkflow.dom.tsx create mode 100644 ts/state/smart/LocalBackupExportWorkflow.preload.tsx rename ts/types/{Backups.std.ts => LocalExport.std.ts} (59%) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 2840b419ad..3c0601f268 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -7480,6 +7480,30 @@ "messageformat": "Your chat history can’t be exported because Signal doesn’t have permission to write files to disk. Try changing your disk's permissions or updating your system settings and then export again.", "description": "Detail text in dialog shown when we attempted to save a file during export but got a permissions error" }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup", + "description": "Title of a progress dialog that shows while exporting a local backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete", + "description": "Title of the dialog shown once the export is complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:", + "description": "Shown above a list of three bullet-point instructions that show users how to restore their chat history from this backup on their phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage", + "description": "First step in instructions for users on how to restore their local chat history backup onto their phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone", + "description": "Second step in instructions for users on how to restore their chat history backup onto their phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”", + "description": "Third step in instructions for users on how to restore their chat history backup onto their phone" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Moon icon", "description": "Screenreader description for the moon icon used to signify notification profiles" @@ -7956,6 +7980,18 @@ "messageformat": "See key again", "description": "Link text to return to the previous backup key page, shown when confirming the backup key for local message backups." }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup", + "description": "Label for the last backup date in local on-device backups settings." + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never", + "description": "Text shown when no local backup has been created yet." + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now", + "description": "Button to trigger a local backup immediately." + }, "icu:Preferences__local-backups-folder": { "messageformat": "Backup folder", "description": "Label for current folder in which local on-device backups are stored." diff --git a/images/local-delete-sync.svg b/images/desktop-and-phone.svg similarity index 100% rename from images/local-delete-sync.svg rename to images/desktop-and-phone.svg diff --git a/ts/CI.preload.ts b/ts/CI.preload.ts index 0950c1fc6e..25009f7893 100644 --- a/ts/CI.preload.ts +++ b/ts/CI.preload.ts @@ -204,7 +204,7 @@ export function getCI({ } async function exportLocalBackup(backupsBaseDir: string): Promise { - const { snapshotDir } = await backupsService.exportLocalEncryptedBackup({ + const { snapshotDir } = await backupsService.exportLocalBackup({ backupsBaseDir, onProgress: () => null, abortSignal: new AbortController().signal, diff --git a/ts/components/GlobalModalContainer.dom.tsx b/ts/components/GlobalModalContainer.dom.tsx index 4e9083be2b..d910fde21a 100644 --- a/ts/components/GlobalModalContainer.dom.tsx +++ b/ts/components/GlobalModalContainer.dom.tsx @@ -165,6 +165,9 @@ export type PropsType = { // PlaintextExportWorkflow shouldShowPlaintextExportWorkflow: boolean; renderPlaintextExportWorkflow: () => React.JSX.Element; + // LocalBackupExportWorkflow + shouldShowLocalBackupExportWorkflow: boolean; + renderLocalBackupExportWorkflow: () => React.JSX.Element; }; export function GlobalModalContainer({ @@ -270,6 +273,9 @@ export function GlobalModalContainer({ // PlaintextExportWorkflow shouldShowPlaintextExportWorkflow, renderPlaintextExportWorkflow, + // LocalBackupExportWorkflow + shouldShowLocalBackupExportWorkflow, + renderLocalBackupExportWorkflow, }: PropsType): React.JSX.Element | null { // We want the following dialogs to show in this order: // 0. Stateful multi-modal workflows @@ -282,6 +288,10 @@ export function GlobalModalContainer({ return renderPlaintextExportWorkflow(); } + if (shouldShowLocalBackupExportWorkflow) { + return renderLocalBackupExportWorkflow(); + } + // Errors if (errorModalProps) { return renderErrorModal(errorModalProps); diff --git a/ts/components/LocalBackupExportWorkflow.dom.stories.tsx b/ts/components/LocalBackupExportWorkflow.dom.stories.tsx new file mode 100644 index 0000000000..7a2b5e95e8 --- /dev/null +++ b/ts/components/LocalBackupExportWorkflow.dom.stories.tsx @@ -0,0 +1,146 @@ +// Copyright 2025 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only + +import React from 'react'; +import { action } from '@storybook/addon-actions'; +import { LocalBackupExportWorkflow } from './LocalBackupExportWorkflow.dom.js'; +import { + LocalExportErrors, + LocalBackupExportSteps, +} from '../types/LocalExport.std.js'; + +import type { PropsType } from './LocalBackupExportWorkflow.dom.js'; +import type { ComponentMeta } from '../storybook/types.std.js'; + +const { i18n } = window.SignalContext; + +export default { + title: 'Components/LocalBackupExportWorkflow', + component: LocalBackupExportWorkflow, + args: { + cancelWorkflow: action('cancelWorkflow'), + clearWorkflow: action('clearWorkflow'), + i18n, + openFileInFolder: action('openFileInFolder'), + osName: undefined, + workflow: { + step: LocalBackupExportSteps.ExportingMessages, + localBackupFolder: 'backups', + abortController: new AbortController(), + }, + }, +} satisfies ComponentMeta; + +export function ExportingMessages(args: PropsType): React.JSX.Element { + return ( + + ); +} + +export function ExportingAttachments(args: PropsType): React.JSX.Element { + return ( + + ); +} + +export function CompleteMac(args: PropsType): React.JSX.Element { + return ( + + ); +} + +export function CompleteLinux(args: PropsType): React.JSX.Element { + return ( + + ); +} + +export function ErrorGeneric(args: PropsType): React.JSX.Element { + return ( + + ); +} + +export function ErrorNotEnoughStorage(args: PropsType): React.JSX.Element { + return ( + + ); +} + +export function ErrorRanOutOfStorage(args: PropsType): React.JSX.Element { + return ( + + ); +} + +export function ErrorStoragePermissions(args: PropsType): React.JSX.Element { + return ( + + ); +} diff --git a/ts/components/LocalBackupExportWorkflow.dom.tsx b/ts/components/LocalBackupExportWorkflow.dom.tsx new file mode 100644 index 0000000000..08a521829b --- /dev/null +++ b/ts/components/LocalBackupExportWorkflow.dom.tsx @@ -0,0 +1,269 @@ +// Copyright 2025 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only + +import React, { type ReactNode } from 'react'; + +import { + LocalExportErrors, + LocalBackupExportSteps, +} from '../types/LocalExport.std.js'; +import { AxoDialog } from '../axo/AxoDialog.dom.js'; +import { AxoAlertDialog } from '../axo/AxoAlertDialog.dom.js'; + +import type { LocalBackupExportWorkflowType } from '../types/LocalExport.std.js'; +import type { LocalizerType } from '../types/I18N.std.js'; +import { formatFileSize } from '../util/formatFileSize.std.js'; +import { ProgressBar } from './ProgressBar.dom.js'; +import { missingCaseError } from '../util/missingCaseError.std.js'; +import { tw } from '../axo/tw.dom.js'; +import { AxoSymbol } from '../axo/AxoSymbol.dom.js'; +import type { AxoSymbolIconName } from '../axo/_internal/AxoSymbolDefs.generated.std.js'; + +export type PropsType = { + cancelWorkflow: () => void; + clearWorkflow: () => void; + i18n: LocalizerType; + openFileInFolder: (path: string) => void; + osName: 'linux' | 'macos' | 'windows' | undefined; + workflow: LocalBackupExportWorkflowType; +}; + +export function LocalBackupExportWorkflow({ + cancelWorkflow, + clearWorkflow, + i18n, + openFileInFolder, + osName, + workflow, +}: PropsType): React.JSX.Element { + const { step } = workflow; + + if ( + step === LocalBackupExportSteps.ExportingMessages || + step === LocalBackupExportSteps.ExportingAttachments + ) { + const progress = + step === LocalBackupExportSteps.ExportingAttachments + ? workflow.progress + : undefined; + + let progressElements; + if (progress) { + const fractionComplete = + progress.totalBytes > 0 + ? progress.currentBytes / progress.totalBytes + : 0; + + progressElements = ( + <> +
+ +
+
+ {i18n('icu:PlaintextExport--ProgressDialog--Progress', { + currentBytes: formatFileSize(progress.currentBytes), + totalBytes: formatFileSize(progress.totalBytes), + percentage: fractionComplete, + })} +
+ + ); + } else { + progressElements = ( +
+ +
+ ); + } + + return ( + + + + +
+ {i18n('icu:LocalBackupExport--ProgressDialog--Header')} +
+
+
+ +
+ {progressElements} +
+ {i18n('icu:PlaintextExport--ProgressDialog--TimeWarning')} +
+
+
+ +
+ + {i18n('icu:cancel')} + +
+
+
+
+ ); + } + + if (step === LocalBackupExportSteps.Complete) { + let showInFolderText = i18n( + 'icu:PlaintextExport--CompleteDialog--ShowFiles--Windows' + ); + if (osName === 'macos') { + showInFolderText = i18n( + 'icu:PlaintextExport--CompleteDialog--ShowFiles--Mac' + ); + } else if (osName === 'linux') { + showInFolderText = i18n( + 'icu:PlaintextExport--CompleteDialog--ShowFiles--Linux' + ); + } + + return ( + + + +
+ + +
+ {i18n('icu:LocalBackupExport--CompleteDialog--Header')} +
+
+
+ +
+ {i18n( + 'icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader' + )} +
    + + + +
+
+
+
+ + { + openFileInFolder(workflow.localBackupFolder); + clearWorkflow(); + }} + > + {showInFolderText} + + + {i18n('icu:ok')} + + +
+
+ ); + } + + if (step === LocalBackupExportSteps.Error) { + const { type } = workflow.errorDetails; + let title; + let detail; + + if (type === LocalExportErrors.General) { + title = i18n('icu:PlaintextExport--Error--General--Title'); + detail = i18n('icu:PlaintextExport--Error--General--Description'); + } else if (type === LocalExportErrors.NotEnoughStorage) { + title = i18n('icu:PlaintextExport--Error--NotEnoughStorage--Title'); + detail = i18n('icu:PlaintextExport--Error--NotEnoughStorage--Detail', { + bytes: formatFileSize(workflow.errorDetails.bytesNeeded), + }); + } else if (type === LocalExportErrors.RanOutOfStorage) { + title = i18n('icu:PlaintextExport--Error--RanOutOfStorage--Title'); + detail = i18n('icu:PlaintextExport--Error--RanOutOfStorage--Detail', { + bytes: formatFileSize(workflow.errorDetails.bytesNeeded), + }); + } else if (type === LocalExportErrors.StoragePermissions) { + title = i18n('icu:PlaintextExport--Error--DiskPermssions--Title'); + detail = i18n('icu:PlaintextExport--Error--DiskPermssions--Detail'); + } else { + throw missingCaseError(type); + } + + return ( + + + + {title} + {detail} + + + + {i18n('icu:ok')} + + + + + ); + } + + throw missingCaseError(step); +} + +function ListItemWithIcon({ + iconName, + content, +}: { + iconName: AxoSymbolIconName; + content: ReactNode; +}): ReactNode { + return ( +
  • +
    + +
    +
    {content}
    +
  • + ); +} diff --git a/ts/components/LocalDeleteWarningModal.dom.tsx b/ts/components/LocalDeleteWarningModal.dom.tsx index 2f4d57c916..66f7ec18bb 100644 --- a/ts/components/LocalDeleteWarningModal.dom.tsx +++ b/ts/components/LocalDeleteWarningModal.dom.tsx @@ -27,7 +27,7 @@ export function LocalDeleteWarningModal({
    @@ -79,7 +78,6 @@ export function ExportingAttachments(args: PropsType): React.JSX.Element { workflow={{ step: PlaintextExportSteps.ExportingAttachments, abortController: new AbortController(), - exportInBackground: false, exportPath: '/somewhere', progress: { totalBytes: 1000000, @@ -123,7 +121,7 @@ export function ErrorGeneric(args: PropsType): React.JSX.Element { workflow={{ step: PlaintextExportSteps.Error, errorDetails: { - type: PlaintextExportErrors.General, + type: LocalExportErrors.General, }, }} /> @@ -137,7 +135,7 @@ export function ErrorNotEnoughStorage(args: PropsType): React.JSX.Element { workflow={{ step: PlaintextExportSteps.Error, errorDetails: { - type: PlaintextExportErrors.NotEnoughStorage, + type: LocalExportErrors.NotEnoughStorage, bytesNeeded: 12000000, }, }} @@ -152,7 +150,7 @@ export function ErrorRanOutOfStorage(args: PropsType): React.JSX.Element { workflow={{ step: PlaintextExportSteps.Error, errorDetails: { - type: PlaintextExportErrors.RanOutOfStorage, + type: LocalExportErrors.RanOutOfStorage, bytesNeeded: 12000000, }, }} @@ -167,7 +165,7 @@ export function ErrorStoragePermissions(args: PropsType): React.JSX.Element { workflow={{ step: PlaintextExportSteps.Error, errorDetails: { - type: PlaintextExportErrors.StoragePermissions, + type: LocalExportErrors.StoragePermissions, }, }} /> diff --git a/ts/components/PlaintextExportWorkflow.dom.tsx b/ts/components/PlaintextExportWorkflow.dom.tsx index 5a9eb31e8c..b6422594e3 100644 --- a/ts/components/PlaintextExportWorkflow.dom.tsx +++ b/ts/components/PlaintextExportWorkflow.dom.tsx @@ -4,13 +4,13 @@ import React from 'react'; import { - PlaintextExportErrors, + LocalExportErrors, PlaintextExportSteps, -} from '../types/Backups.std.js'; +} from '../types/LocalExport.std.js'; import { AxoDialog } from '../axo/AxoDialog.dom.js'; import { AxoAlertDialog } from '../axo/AxoAlertDialog.dom.js'; -import type { PlaintextExportWorkflowType } from '../types/Backups.std.js'; +import type { PlaintextExportWorkflowType } from '../types/LocalExport.std.js'; import type { LocalizerType } from '../types/I18N.std.js'; import { AxoCheckbox } from '../axo/AxoCheckbox.dom.js'; import { formatFileSize } from '../util/formatFileSize.std.js'; @@ -265,20 +265,20 @@ export function PlaintextExportWorkflow({ let title; let detail; - if (type === PlaintextExportErrors.General) { + if (type === LocalExportErrors.General) { title = i18n('icu:PlaintextExport--Error--General--Title'); detail = i18n('icu:PlaintextExport--Error--General--Description'); - } else if (type === PlaintextExportErrors.NotEnoughStorage) { + } else if (type === LocalExportErrors.NotEnoughStorage) { title = i18n('icu:PlaintextExport--Error--NotEnoughStorage--Title'); detail = i18n('icu:PlaintextExport--Error--NotEnoughStorage--Detail', { bytes: formatFileSize(workflow.errorDetails.bytesNeeded), }); - } else if (type === PlaintextExportErrors.RanOutOfStorage) { + } else if (type === LocalExportErrors.RanOutOfStorage) { title = i18n('icu:PlaintextExport--Error--RanOutOfStorage--Title'); detail = i18n('icu:PlaintextExport--Error--RanOutOfStorage--Detail', { bytes: formatFileSize(workflow.errorDetails.bytesNeeded), }); - } else if (type === PlaintextExportErrors.StoragePermissions) { + } else if (type === LocalExportErrors.StoragePermissions) { title = i18n('icu:PlaintextExport--Error--DiskPermssions--Title'); detail = i18n('icu:PlaintextExport--Error--DiskPermssions--Detail'); } else { diff --git a/ts/components/Preferences.dom.stories.tsx b/ts/components/Preferences.dom.stories.tsx index 56745d60b4..06270bdd9d 100644 --- a/ts/components/Preferences.dom.stories.tsx +++ b/ts/components/Preferences.dom.stories.tsx @@ -58,10 +58,7 @@ import type { SmartPreferencesEditChatFolderPageProps } from '../state/smart/Pre import { CurrentChatFolders } from '../types/CurrentChatFolders.std.js'; import type { ExternalProps as SmartNotificationProfilesProps } from '../state/smart/PreferencesNotificationProfiles.preload.js'; import type { NotificationProfileIdString } from '../types/NotificationProfile.std.js'; -import type { - ExportResultType, - LocalBackupExportResultType, -} from '../services/backups/types.std.js'; +import type { ExportResultType } from '../services/backups/types.std.js'; import { BackupLevel } from '../services/backups/types.std.js'; const { shuffle } = lodash; @@ -135,11 +132,6 @@ const validateBackupResult: ExportResultType = { }, }; -const exportLocalBackupResult: LocalBackupExportResultType = { - ...validateBackupResult, - snapshotDir: '/home/signaluser/SignalBackups/signal-backup-1745618069169', -}; - const donationAmountsConfig = { cad: { minimum: 4, @@ -468,6 +460,7 @@ export default { isContentProtectionNeeded: true, isMinimizeToAndStartInSystemTraySupported: true, isPlaintextExportEnabled: true, + lastLocalBackup: undefined, lastSyncTime: Date.now(), localeOverride: null, localBackupFolder: undefined, @@ -538,11 +531,6 @@ export default { addCustomColor: action('addCustomColor'), doDeleteAllData: action('doDeleteAllData'), editCustomColor: action('editCustomColor'), - exportLocalBackup: async () => { - return { - result: exportLocalBackupResult, - }; - }, getMessageCountBySchemaVersion: async () => [ { schemaVersion: 10, count: 1024 }, { schemaVersion: 8, count: 256 }, @@ -616,6 +604,7 @@ export default { ), setSettingsLocation: action('setSettingsLocation'), showToast: action('showToast'), + startLocalBackupExport: action('startLocalBackupExport'), startPlaintextExport: action('startPlaintextExport'), validateBackup: async () => { return { @@ -1210,6 +1199,21 @@ LocalBackups.args = { backupFeatureEnabled: true, backupLocalBackupsEnabled: true, backupKeyViewed: true, + lastLocalBackup: { + timestamp: Date.now() - DAY, + backupsFolder: 'backups', + snapshotDir: 'backups/snapshot', + }, + localBackupFolder: '/home/signaluser/Signal Backups/', +}; + +export const LocalBackupsNeverBackedUp = Template.bind({}); +LocalBackupsNeverBackedUp.args = { + settingsLocation: { page: SettingsPage.LocalBackups }, + backupFeatureEnabled: true, + backupLocalBackupsEnabled: true, + backupKeyViewed: true, + lastLocalBackup: undefined, localBackupFolder: '/home/signaluser/Signal Backups/', }; diff --git a/ts/components/Preferences.dom.tsx b/ts/components/Preferences.dom.tsx index e05ca5ee61..e430979ade 100644 --- a/ts/components/Preferences.dom.tsx +++ b/ts/components/Preferences.dom.tsx @@ -98,6 +98,7 @@ import type { SmartPreferencesEditChatFolderPageProps } from '../state/smart/Pre import type { SmartPreferencesChatFoldersPageProps } from '../state/smart/PreferencesChatFoldersPage.preload.js'; import { AxoButton } from '../axo/AxoButton.dom.js'; import type { ExternalProps as SmartNotificationProfilesProps } from '../state/smart/PreferencesNotificationProfiles.preload.js'; +import type { LocalBackupExportMetadata } from '../types/LocalExport.std.js'; const { isNumber, noop, partition } = lodash; @@ -113,6 +114,7 @@ export type PropsDataType = { backupKeyViewed: boolean; backupLocalBackupsEnabled: boolean; backupTier: BackupLevel | null; + lastLocalBackup: LocalBackupExportMetadata | undefined; localBackupFolder: string | undefined; chatFoldersFeatureEnabled: boolean; currentChatFoldersCount: number; @@ -240,7 +242,6 @@ type PropsFunctionType = { addCustomColor: (color: CustomColorType) => unknown; doDeleteAllData: () => unknown; editCustomColor: (colorId: string, color: CustomColorType) => unknown; - exportLocalBackup: () => Promise; getMessageCountBySchemaVersion: () => Promise; getMessageSampleForSchemaVersion: ( version: number @@ -270,6 +271,7 @@ type PropsFunctionType = { ) => unknown; setSettingsLocation: (settingsLocation: SettingsLocation) => unknown; showToast: (toast: AnyToast) => unknown; + startLocalBackupExport: () => void; startPlaintextExport: () => unknown; validateBackup: () => Promise; @@ -405,7 +407,6 @@ export function Preferences({ doDeleteAllData, editCustomColor, emojiSkinToneDefault, - exportLocalBackup, getConversationsWithCustomColor, getMessageCountBySchemaVersion, getMessageSampleForSchemaVersion, @@ -449,6 +450,7 @@ export function Preferences({ isSystemTraySupported, isMinimizeToAndStartInSystemTraySupported, isInternalUser, + lastLocalBackup, lastSyncTime, localBackupFolder, makeSyncRequest, @@ -525,6 +527,7 @@ export function Preferences({ setSettingsLocation, shouldShowUpdateDialog, showToast, + startLocalBackupExport, startPlaintextExport, localeOverride, theme, @@ -2243,6 +2246,7 @@ export function Preferences({ i18n={i18n} isLocalBackupsEnabled={backupLocalBackupsEnabled} isRemoteBackupsEnabled={backupFeatureEnabled} + lastLocalBackup={lastLocalBackup} locale={resolvedLocale} localBackupFolder={localBackupFolder} onBackupKeyViewedChange={onBackupKeyViewedChange} @@ -2253,6 +2257,7 @@ export function Preferences({ refreshBackupSubscriptionStatus={refreshBackupSubscriptionStatus} setSettingsLocation={setSettingsLocation} showToast={showToast} + startLocalBackupExport={startLocalBackupExport} /> ); content = ( @@ -2281,7 +2286,6 @@ export function Preferences({ contents={ void; settingsLocation: SettingsLocation; @@ -101,6 +105,7 @@ export function PreferencesBackups({ refreshBackupSubscriptionStatus: () => void; setSettingsLocation: (settingsLocation: SettingsLocation) => void; showToast: ShowToastAction; + startLocalBackupExport: () => void; }): React.JSX.Element | null { const [authError, setAuthError] = useState>(); @@ -156,6 +161,7 @@ export function PreferencesBackups({ accountEntropyPool={accountEntropyPool} backupKeyViewed={backupKeyViewed} i18n={i18n} + lastLocalBackup={lastLocalBackup} localBackupFolder={localBackupFolder} onBackupKeyViewedChange={onBackupKeyViewedChange} settingsLocation={settingsLocation} @@ -163,6 +169,7 @@ export function PreferencesBackups({ promptOSAuth={promptOSAuth} setSettingsLocation={setSettingsLocation} showToast={showToast} + startLocalBackupExport={startLocalBackupExport} /> ); } diff --git a/ts/components/PreferencesInternal.dom.tsx b/ts/components/PreferencesInternal.dom.tsx index 9e22e31847..30f99f4863 100644 --- a/ts/components/PreferencesInternal.dom.tsx +++ b/ts/components/PreferencesInternal.dom.tsx @@ -26,7 +26,6 @@ const log = createLogger('PreferencesInternal'); export function PreferencesInternal({ i18n, - exportLocalBackup: doExportLocalBackup, validateBackup: doValidateBackup, getMessageCountBySchemaVersion, getMessageSampleForSchemaVersion, @@ -40,7 +39,6 @@ export function PreferencesInternal({ setCallQualitySurveyCooldownDisabled, }: { i18n: LocalizerType; - exportLocalBackup: () => Promise; validateBackup: () => Promise; getMessageCountBySchemaVersion: () => Promise; getMessageSampleForSchemaVersion: ( @@ -64,11 +62,6 @@ export function PreferencesInternal({ callQualitySurveyCooldownDisabled: boolean; setCallQualitySurveyCooldownDisabled: (value: boolean) => void; }): React.JSX.Element { - const [isExportPending, setIsExportPending] = useState(false); - const [exportResult, setExportResult] = useState< - BackupValidationResultType | undefined - >(); - const [messageCountBySchemaVersion, setMessageCountBySchemaVersion] = useState(); const [messageSampleForVersions, setMessageSampleForVersions] = useState<{ @@ -151,18 +144,6 @@ export function PreferencesInternal({ [] ); - const exportLocalBackup = useCallback(async () => { - setIsExportPending(true); - setExportResult(undefined); - try { - setExportResult(await doExportLocalBackup()); - } catch (error) { - setExportResult({ error: toLogFormat(error) }); - } finally { - setIsExportPending(false); - } - }, [doExportLocalBackup]); - // Donation receipt states const [isGeneratingReceipt, setIsGeneratingReceipt] = useState(false); @@ -269,40 +250,6 @@ export function PreferencesInternal({ {renderValidationResult(validationResult)} - - -
    - {i18n( - 'icu:Preferences__internal__export-local-backup--description' - )} -
    -
    - - {i18n('icu:Preferences__internal__export-local-backup')} - -
    -
    - - {renderValidationResult(exportResult)} -
    - Fetch data @@ -364,7 +310,6 @@ export function PreferencesInternal({ [schemaVersion]: sampleMessages, }); }} - disabled={isExportPending} > Sample diff --git a/ts/components/PreferencesLocalBackups.dom.tsx b/ts/components/PreferencesLocalBackups.dom.tsx index 0786afc735..f0306c9ff3 100644 --- a/ts/components/PreferencesLocalBackups.dom.tsx +++ b/ts/components/PreferencesLocalBackups.dom.tsx @@ -36,6 +36,8 @@ import type { import { ConfirmationDialog } from './ConfirmationDialog.dom.js'; import { AxoButton } from '../axo/AxoButton.dom.js'; import { SECOND } from '../util/durations/constants.std.js'; +import { formatTimestamp } from '../util/formatTimestamp.dom.js'; +import type { LocalBackupExportMetadata } from '../types/LocalExport.std.js'; const { noop } = lodash; @@ -43,6 +45,7 @@ export function PreferencesLocalBackups({ accountEntropyPool, backupKeyViewed, i18n, + lastLocalBackup, localBackupFolder, onBackupKeyViewedChange, settingsLocation, @@ -50,10 +53,12 @@ export function PreferencesLocalBackups({ promptOSAuth, setSettingsLocation, showToast, + startLocalBackupExport, }: { accountEntropyPool: string | undefined; backupKeyViewed: boolean; i18n: LocalizerType; + lastLocalBackup: LocalBackupExportMetadata | undefined; localBackupFolder: string | undefined; onBackupKeyViewedChange: (keyViewed: boolean) => void; settingsLocation: SettingsLocation; @@ -63,6 +68,7 @@ export function PreferencesLocalBackups({ ) => Promise; setSettingsLocation: (settingsLocation: SettingsLocation) => void; showToast: ShowToastAction; + startLocalBackupExport: () => void; }): React.JSX.Element { const [authError, setAuthError] = React.useState>(); @@ -107,6 +113,13 @@ export function PreferencesLocalBackups({ ); + const lastBackupText = lastLocalBackup + ? formatTimestamp(lastLocalBackup.timestamp, { + dateStyle: 'medium', + timeStyle: 'short', + }) + : i18n('icu:Preferences__local-backups-last-backup-never'); + return ( <>
    @@ -115,6 +128,29 @@ export function PreferencesLocalBackups({
    + +
    + +
    +
    + + {i18n('icu:Preferences__local-backups-backup-now')} + +
    +
    @@ -230,6 +231,7 @@ export function DebugLogWindow({ setDidResumeDonation={shouldNeverBeCalled} toast={toast} containerWidthBreakpoint={null} + expandNarrowLeftPane={shouldNeverBeCalled} isInFullScreenCall={false} />
    diff --git a/ts/components/LeftPane.dom.stories.tsx b/ts/components/LeftPane.dom.stories.tsx index ec25fd3cf3..40ca8507a2 100644 --- a/ts/components/LeftPane.dom.stories.tsx +++ b/ts/components/LeftPane.dom.stories.tsx @@ -318,6 +318,7 @@ const useProps = (overrideProps: OverridePropsType = {}): PropsType => { toast={undefined} megaphone={undefined} containerWidthBreakpoint={containerWidthBreakpoint} + expandNarrowLeftPane={action('expandNarrowLeftPane')} isInFullScreenCall={false} /> ), diff --git a/ts/components/LeftPane.dom.tsx b/ts/components/LeftPane.dom.tsx index 9ba4f6f51f..11d02618cd 100644 --- a/ts/components/LeftPane.dom.tsx +++ b/ts/components/LeftPane.dom.tsx @@ -36,6 +36,7 @@ import * as KeyboardLayout from '../services/keyboardLayout.dom.js'; import type { LookupConversationWithoutServiceIdActionsType } from '../util/lookupConversationWithoutServiceId.preload.js'; import type { ShowConversationType } from '../state/ducks/conversations.preload.js'; import type { PropsType as UnsupportedOSDialogPropsType } from '../state/smart/UnsupportedOSDialog.preload.js'; +import type { SmartPropsType as SmartToastManagerPropsType } from '../state/smart/ToastManager.preload.js'; import { ConversationList } from './ConversationList.dom.js'; import { ContactCheckboxDisabledReason } from './conversationList/ContactCheckbox.dom.js'; @@ -209,9 +210,9 @@ export type PropsType = { ) => React.JSX.Element; renderLeftPaneChatFolders: () => React.JSX.Element; renderNotificationProfilesMenu: () => React.JSX.Element; - renderToastManager: (_: { - containerWidthBreakpoint: WidthBreakpoint; - }) => React.JSX.Element; + renderToastManager: ( + _: Readonly + ) => React.JSX.Element; } & LookupConversationWithoutServiceIdActionsType; export function LeftPane({ diff --git a/ts/components/NavSidebar.dom.tsx b/ts/components/NavSidebar.dom.tsx index 114da51b59..42e3b9829e 100644 --- a/ts/components/NavSidebar.dom.tsx +++ b/ts/components/NavSidebar.dom.tsx @@ -2,7 +2,7 @@ // SPDX-License-Identifier: AGPL-3.0-only import type { ButtonHTMLAttributes, ReactNode } from 'react'; -import React, { createContext, useEffect, useState } from 'react'; +import React, { createContext, useCallback, useEffect, useState } from 'react'; import classNames from 'classnames'; import { useMove } from 'react-aria'; import { NavTabsToggle } from './NavTabs.dom.js'; @@ -15,6 +15,7 @@ import { } from '../util/leftPaneWidth.std.js'; import { WidthBreakpoint, getNavSidebarWidthBreakpoint } from './_util.std.js'; import type { UnreadStats } from '../util/countUnreadStats.std.js'; +import type { SmartPropsType as SmartToastManagerPropsType } from '../state/smart/ToastManager.preload.js'; export const NavSidebarWidthBreakpointContext = createContext(null); @@ -60,9 +61,7 @@ export type NavSidebarProps = Readonly<{ savePreferredLeftPaneWidth: (width: number) => void; title: string; otherTabsUnreadStats: UnreadStats; - renderToastManager: (_: { - containerWidthBreakpoint: WidthBreakpoint; - }) => React.JSX.Element; + renderToastManager: (_: SmartToastManagerPropsType) => React.JSX.Element; }>; enum DragState { @@ -103,6 +102,13 @@ export function NavSidebar({ const widthBreakpoint = getNavSidebarWidthBreakpoint(width); + const expandNarrowLeftPane = useCallback(() => { + if (preferredWidth < MIN_FULL_WIDTH) { + setPreferredWidth(MIN_FULL_WIDTH); + savePreferredLeftPaneWidth(MIN_FULL_WIDTH); + } + }, [preferredWidth, savePreferredLeftPaneWidth]); + // `useMove` gives us keyboard and mouse dragging support. const { moveProps } = useMove({ onMoveStart() { @@ -229,7 +235,10 @@ export function NavSidebar({ {...moveProps} /> - {renderToastManager({ containerWidthBreakpoint: widthBreakpoint })} + {renderToastManager({ + containerWidthBreakpoint: widthBreakpoint, + expandNarrowLeftPane, + })}
    ); diff --git a/ts/components/RemoteMegaphone.dom.stories.tsx b/ts/components/RemoteMegaphone.dom.stories.tsx index 4abb3ead64..ef089572b9 100644 --- a/ts/components/RemoteMegaphone.dom.stories.tsx +++ b/ts/components/RemoteMegaphone.dom.stories.tsx @@ -28,6 +28,7 @@ export default { body: 'Signal is powered by people like you. Show your support today!', imagePath: '/fixtures/donate-heart.png', isFullSize: true, + onClickNarrowMegaphone: action('onClickNarrowMegaphone'), onInteractWithMegaphone: action('onInteractWithMegaphone'), }, } satisfies ComponentMeta; diff --git a/ts/components/RemoteMegaphone.dom.tsx b/ts/components/RemoteMegaphone.dom.tsx index bd4e227660..a85a8bba3a 100644 --- a/ts/components/RemoteMegaphone.dom.tsx +++ b/ts/components/RemoteMegaphone.dom.tsx @@ -12,6 +12,7 @@ import { offsetDistanceModifier } from '../util/popperUtil.std.js'; export type PropsType = Omit & { isFullSize: boolean; i18n: LocalizerType; + onClickNarrowMegaphone: () => void; }; export function RemoteMegaphone({ @@ -25,6 +26,7 @@ export function RemoteMegaphone({ secondaryCtaText, remoteMegaphoneId, isFullSize, + onClickNarrowMegaphone, onInteractWithMegaphone, }: PropsType): React.JSX.Element { const isRTL = i18n.getLocaleDirection() === 'rtl'; @@ -37,7 +39,12 @@ export function RemoteMegaphone({ 'bg-elevated-background-primary dark:bg-elevated-background-tertiary' ); const image: React.JSX.Element = ( -
    +

    {title}

    @@ -112,11 +118,17 @@ export function RemoteMegaphone({ -
    {image}
    +
    ); } diff --git a/ts/components/ToastManager.dom.tsx b/ts/components/ToastManager.dom.tsx index eabaa229ae..ecda977837 100644 --- a/ts/components/ToastManager.dom.tsx +++ b/ts/components/ToastManager.dom.tsx @@ -27,6 +27,7 @@ import { RemoteMegaphone } from './RemoteMegaphone.dom.js'; export type PropsType = { changeLocation: (newLocation: Location) => unknown; + expandNarrowLeftPane: () => void; hideToast: () => unknown; i18n: LocalizerType; openFileInFolder: (target: string) => unknown; @@ -948,6 +949,7 @@ export function renderMegaphone({ i18n, megaphone, containerWidthBreakpoint, + expandNarrowLeftPane, }: PropsType): React.JSX.Element | null { if (!megaphone) { return null; @@ -963,6 +965,7 @@ export function renderMegaphone({ {...megaphone} i18n={i18n} isFullSize={containerWidthBreakpoint !== WidthBreakpoint.Narrow} + onClickNarrowMegaphone={expandNarrowLeftPane} /> ); } diff --git a/ts/state/smart/CallsTab.preload.tsx b/ts/state/smart/CallsTab.preload.tsx index f1fc81a080..f91612f623 100644 --- a/ts/state/smart/CallsTab.preload.tsx +++ b/ts/state/smart/CallsTab.preload.tsx @@ -9,7 +9,6 @@ import { getPreferredLeftPaneWidth, } from '../selectors/items.dom.js'; import { getIntl, getRegionCode } from '../selectors/user.std.js'; -import type { WidthBreakpoint } from '../../components/_util.std.js'; import { CallsTab } from '../../components/CallsTab.preload.js'; import { getAllConversations, @@ -24,7 +23,7 @@ import type { } from '../../types/CallDisposition.std.js'; import type { ConversationType } from '../ducks/conversations.preload.js'; import { SmartConversationDetails } from './ConversationDetails.preload.js'; -import { SmartToastManager } from './ToastManager.preload.js'; +import { renderToastManagerWithoutMegaphone } from './ToastManager.preload.js'; import { useCallingActions } from '../ducks/calling.preload.js'; import { getActiveCallState, @@ -131,12 +130,6 @@ function renderConversationDetails( ); } -function renderToastManager(props: { - containerWidthBreakpoint: WidthBreakpoint; -}): React.JSX.Element { - return ; -} - export const SmartCallsTab = memo(function SmartCallsTab() { const i18n = useSelector(getIntl); const navTabsCollapsed = useSelector(getNavTabsCollapsed); @@ -253,7 +246,7 @@ export const SmartCallsTab = memo(function SmartCallsTab() { preferredLeftPaneWidth={preferredLeftPaneWidth} renderCallLinkDetails={renderCallLinkDetails} renderConversationDetails={renderConversationDetails} - renderToastManager={renderToastManager} + renderToastManager={renderToastManagerWithoutMegaphone} regionCode={regionCode} savePreferredLeftPaneWidth={savePreferredLeftPaneWidth} startCallLinkLobbyByRoomId={startCallLinkLobbyByRoomId} diff --git a/ts/state/smart/InstallScreen.preload.tsx b/ts/state/smart/InstallScreen.preload.tsx index 3b58eb8d01..60dc270d49 100644 --- a/ts/state/smart/InstallScreen.preload.tsx +++ b/ts/state/smart/InstallScreen.preload.tsx @@ -20,6 +20,7 @@ import OS from '../../util/os/osMain.node.js'; import { isStagingServer } from '../../util/isStagingServer.dom.js'; import { createLogger } from '../../logging/log.std.js'; import { SmartToastManager } from './ToastManager.preload.js'; +import { shouldNeverBeCalled } from '../../util/shouldNeverBeCalled.std.js'; const log = createLogger('InstallScreen'); @@ -103,6 +104,7 @@ export const SmartInstallScreen = memo(function SmartInstallScreen() { diff --git a/ts/state/smart/LeftPane.preload.tsx b/ts/state/smart/LeftPane.preload.tsx index 31218cbbdd..95be03c96c 100644 --- a/ts/state/smart/LeftPane.preload.tsx +++ b/ts/state/smart/LeftPane.preload.tsx @@ -103,7 +103,11 @@ import { SmartCrashReportDialog } from './CrashReportDialog.preload.js'; import { SmartMessageSearchResult } from './MessageSearchResult.preload.js'; import { SmartNetworkStatus } from './NetworkStatus.preload.js'; import { SmartRelinkDialog } from './RelinkDialog.dom.js'; -import { SmartToastManager } from './ToastManager.preload.js'; +import { + renderToastManagerWithoutMegaphone, + SmartToastManager, +} from './ToastManager.preload.js'; +import type { SmartPropsType as SmartToastManagerPropsType } from './ToastManager.preload.js'; import type { PropsType as SmartUnsupportedOSDialogPropsType } from './UnsupportedOSDialog.preload.js'; import { SmartUnsupportedOSDialog } from './UnsupportedOSDialog.preload.js'; import { SmartUpdateDialog } from './UpdateDialog.preload.js'; @@ -172,18 +176,12 @@ function renderUnsupportedOSDialog( ): React.JSX.Element { return ; } -function renderToastManagerWithMegaphone(props: { - containerWidthBreakpoint: WidthBreakpoint; -}): React.JSX.Element { +function renderToastManagerWithMegaphone( + props: Readonly +): React.JSX.Element { return ; } -function renderToastManagerWithoutMegaphone(props: { - containerWidthBreakpoint: WidthBreakpoint; -}): React.JSX.Element { - return ; -} - function renderNotificationProfilesMenu(): React.JSX.Element { return ; } diff --git a/ts/state/smart/Preferences.preload.tsx b/ts/state/smart/Preferences.preload.tsx index 6d30ee02da..bebe658e8f 100644 --- a/ts/state/smart/Preferences.preload.tsx +++ b/ts/state/smart/Preferences.preload.tsx @@ -74,7 +74,7 @@ import { getPreferredBadgeSelector } from '../selectors/badges.preload.js'; import { SmartProfileEditor } from './ProfileEditor.preload.js'; import { useNavActions } from '../ducks/nav.std.js'; import { NavTab } from '../../types/Nav.std.js'; -import { SmartToastManager } from './ToastManager.preload.js'; +import { renderToastManagerWithoutMegaphone } from './ToastManager.preload.js'; import { useToastActions } from '../ducks/toast.preload.js'; import { DataReader, DataWriter } from '../../sql/Client.preload.js'; import { deleteAllMyStories } from '../../util/deleteAllMyStories.preload.js'; @@ -157,12 +157,6 @@ function renderProfileEditor(options: { return ; } -function renderToastManager(props: { - containerWidthBreakpoint: WidthBreakpoint; -}): React.JSX.Element { - return ; -} - function renderDonationsPane({ contentsRef, settingsLocation, @@ -937,7 +931,7 @@ export function SmartPreferences(): React.JSX.Element | null { renderNotificationProfilesCreateFlow } renderProfileEditor={renderProfileEditor} - renderToastManager={renderToastManager} + renderToastManager={renderToastManagerWithoutMegaphone} renderUpdateDialog={renderUpdateDialog} renderPreferencesChatFoldersPage={renderPreferencesChatFoldersPage} renderPreferencesEditChatFolderPage={ diff --git a/ts/state/smart/StoriesTab.preload.tsx b/ts/state/smart/StoriesTab.preload.tsx index be265672ab..3909b8c8eb 100644 --- a/ts/state/smart/StoriesTab.preload.tsx +++ b/ts/state/smart/StoriesTab.preload.tsx @@ -4,8 +4,7 @@ import React, { memo, useCallback, useEffect } from 'react'; import { useSelector } from 'react-redux'; import { SmartStoryCreator } from './StoryCreator.preload.js'; -import { SmartToastManager } from './ToastManager.preload.js'; -import type { WidthBreakpoint } from '../../components/_util.std.js'; +import { renderToastManagerWithoutMegaphone } from './ToastManager.preload.js'; import { StoriesTab } from '../../components/StoriesTab.dom.js'; import { getMaximumOutgoingAttachmentSizeInKb } from '../../types/AttachmentSize.std.js'; import type { ConfigKeyType } from '../../RemoteConfig.dom.js'; @@ -40,12 +39,6 @@ function renderStoryCreator(): React.JSX.Element { return ; } -function renderToastManager(props: { - containerWidthBreakpoint: WidthBreakpoint; -}): React.JSX.Element { - return ; -} - export const SmartStoriesTab = memo(function SmartStoriesTab() { const storiesActions = useStoriesActions(); const { @@ -133,7 +126,7 @@ export const SmartStoriesTab = memo(function SmartStoriesTab() { preferredLeftPaneWidth={preferredLeftPaneWidth} preferredWidthFromStorage={preferredWidthFromStorage} renderStoryCreator={renderStoryCreator} - renderToastManager={renderToastManager} + renderToastManager={renderToastManagerWithoutMegaphone} retryMessageSend={retryMessageSend} savePreferredLeftPaneWidth={savePreferredLeftPaneWidth} showConversation={showConversation} diff --git a/ts/state/smart/ToastManager.preload.tsx b/ts/state/smart/ToastManager.preload.tsx index bd09fc5635..adace9f3f2 100644 --- a/ts/state/smart/ToastManager.preload.tsx +++ b/ts/state/smart/ToastManager.preload.tsx @@ -35,19 +35,34 @@ import { useDonationsActions } from '../ducks/donations.preload.js'; import { itemStorage } from '../../textsecure/Storage.preload.js'; import { getVisibleMegaphonesForDisplay } from '../selectors/megaphones.preload.js'; import { useMegaphonesActions } from '../ducks/megaphones.preload.js'; +import { shouldNeverBeCalled } from '../../util/shouldNeverBeCalled.std.js'; export type SmartPropsType = Readonly<{ disableMegaphone?: boolean; containerWidthBreakpoint: WidthBreakpoint; + expandNarrowLeftPane: () => void; }>; function handleShowDebugLog() { window.IPC.showDebugLog(); } +export function renderToastManagerWithoutMegaphone(props: { + containerWidthBreakpoint: WidthBreakpoint; +}): React.JSX.Element { + return ( + + ); +} + export const SmartToastManager = memo(function SmartToastManager({ disableMegaphone = false, containerWidthBreakpoint, + expandNarrowLeftPane, }: SmartPropsType) { const i18n = useSelector(getIntl); const hasCompletedUsernameOnboarding = useSelector( @@ -119,6 +134,7 @@ export const SmartToastManager = memo(function SmartToastManager({ setDidResumeDonation={setDidResume} centerToast={centerToast} containerWidthBreakpoint={containerWidthBreakpoint} + expandNarrowLeftPane={expandNarrowLeftPane} isCompositionAreaVisible={isCompositionAreaVisible} isInFullScreenCall={isInFullScreenCall} /> From 235ebb8c1d49112b8b8a0d9baf269783d8f45c80 Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Tue, 20 Jan 2026 14:53:26 -0600 Subject: [PATCH 28/49] Conditionally show sidebar view in group calls Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com> --- ts/components/CallScreen.dom.tsx | 31 ++++++++- ts/components/CallingHeader.dom.stories.tsx | 2 + ts/components/CallingHeader.dom.tsx | 18 +++-- .../GroupCallRemoteParticipants.dom.tsx | 67 +++++++++++++++++-- 4 files changed, 104 insertions(+), 14 deletions(-) diff --git a/ts/components/CallScreen.dom.tsx b/ts/components/CallScreen.dom.tsx index 3245f68f85..4113fe73b1 100644 --- a/ts/components/CallScreen.dom.tsx +++ b/ts/components/CallScreen.dom.tsx @@ -327,6 +327,20 @@ export function CallScreen({ setShowRaisedHandsList(prevValue => !prevValue); }, []); + const [sidebarViewDiffersFromGridView, setSidebarViewDiffersFromGridView] = + useState(false); + + // If the user is in Sidebar view but it's no longer different from Grid view, + // automatically switch to Grid view. + useEffect(() => { + if ( + !sidebarViewDiffersFromGridView && + activeCall.viewMode === CallViewMode.Sidebar + ) { + changeCallView(CallViewMode.Paginated); + } + }, [sidebarViewDiffersFromGridView, activeCall.viewMode, changeCallView]); + const [controlsHover, setControlsHover] = useState(false); const onControlsMouseEnter = useCallback(() => { setControlsHover(true); @@ -445,7 +459,7 @@ export function CallScreen({ }, [showReactionPicker]); useScreenSharingStoppedToast({ activeCall, i18n }); - useViewModeChangedToast({ activeCall, i18n }); + useViewModeChangedToast({ activeCall, i18n, sidebarViewDiffersFromGridView }); const currentPresenter = remoteParticipants.find( participant => participant.presenting @@ -993,6 +1007,9 @@ export function CallScreen({ imageDataCache={imageDataCache} i18n={i18n} joinedAt={activeCall.joinedAt} + onSidebarViewDiffersFromGridViewChange={ + setSidebarViewDiffersFromGridView + } remoteParticipants={activeCall.remoteParticipants} setGroupCallVideoRequest={setGroupCallVideoRequest} remoteAudioLevels={activeCall.remoteAudioLevels} @@ -1073,6 +1090,7 @@ export function CallScreen({ i18n={i18n} isGroupCall={isGroupCall} participantCount={participantCount} + showSidebarViewOption={sidebarViewDiffersFromGridView} togglePip={togglePip} toggleSettings={toggleSettings} /> @@ -1320,9 +1338,11 @@ function renderDuration(ms: number): string { function useViewModeChangedToast({ activeCall, i18n, + sidebarViewDiffersFromGridView, }: { activeCall: ActiveCallType; i18n: LocalizerType; + sidebarViewDiffersFromGridView: boolean; }): void { const { viewMode } = activeCall; const previousViewMode = usePrevious(viewMode, viewMode); @@ -1342,6 +1362,14 @@ function useViewModeChangedToast({ return; } + if ( + !sidebarViewDiffersFromGridView && + previousViewMode === CallViewMode.Sidebar && + viewMode === CallViewMode.Paginated + ) { + return; + } + hideToast(VIEW_MODE_CHANGED_TOAST_KEY); showToast({ key: VIEW_MODE_CHANGED_TOAST_KEY, @@ -1364,6 +1392,7 @@ function useViewModeChangedToast({ hideToast, i18n, activeCall, + sidebarViewDiffersFromGridView, viewMode, previousViewMode, presenterAci, diff --git a/ts/components/CallingHeader.dom.stories.tsx b/ts/components/CallingHeader.dom.stories.tsx index 763a05346f..2dbe6d49f4 100644 --- a/ts/components/CallingHeader.dom.stories.tsx +++ b/ts/components/CallingHeader.dom.stories.tsx @@ -16,11 +16,13 @@ export default { argTypes: { isGroupCall: { control: { type: 'boolean' } }, participantCount: { control: { type: 'number' } }, + showSidebarViewOption: { control: { type: 'boolean' } }, }, args: { i18n, isGroupCall: false, participantCount: 0, + showSidebarViewOption: false, togglePip: action('toggle-pip'), callViewMode: CallViewMode.Paginated, changeCallView: action('change-call-view'), diff --git a/ts/components/CallingHeader.dom.tsx b/ts/components/CallingHeader.dom.tsx index 89d7b9efff..1b13992f90 100644 --- a/ts/components/CallingHeader.dom.tsx +++ b/ts/components/CallingHeader.dom.tsx @@ -15,6 +15,7 @@ export type PropsType = { isGroupCall?: boolean; onCancel?: () => void; participantCount: number; + showSidebarViewOption?: boolean; togglePip?: () => void; toggleSettings: () => void; changeCallView?: (mode: CallViewMode) => void; @@ -27,6 +28,7 @@ export function CallingHeader({ isGroupCall = false, onCancel, participantCount, + showSidebarViewOption = false, togglePip, toggleSettings, }: PropsType): React.JSX.Element { @@ -47,12 +49,16 @@ export function CallingHeader({ onClick: () => changeCallView(CallViewMode.Paginated), value: CallViewMode.Paginated, }, - { - icon: 'CallSettingsButton__Icon--SidebarView', - label: i18n('icu:calling__view_mode--overflow'), - onClick: () => changeCallView(CallViewMode.Sidebar), - value: CallViewMode.Sidebar, - }, + ...(showSidebarViewOption + ? [ + { + icon: 'CallSettingsButton__Icon--SidebarView', + label: i18n('icu:calling__view_mode--overflow'), + onClick: () => changeCallView(CallViewMode.Sidebar), + value: CallViewMode.Sidebar, + }, + ] + : []), { icon: 'CallSettingsButton__Icon--SpeakerView', label: i18n('icu:calling__view_mode--speaker'), diff --git a/ts/components/GroupCallRemoteParticipants.dom.tsx b/ts/components/GroupCallRemoteParticipants.dom.tsx index 1a1fa83c8c..7edacf5f50 100644 --- a/ts/components/GroupCallRemoteParticipants.dom.tsx +++ b/ts/components/GroupCallRemoteParticipants.dom.tsx @@ -68,6 +68,7 @@ type PropsType = { imageDataCache: React.RefObject; isCallReconnecting: boolean; joinedAt: number | null; + onSidebarViewDiffersFromGridViewChange: (differs: boolean) => void; remoteParticipants: ReadonlyArray; setGroupCallVideoRequest: ( _: Array, @@ -121,6 +122,7 @@ export function GroupCallRemoteParticipants({ i18n, isCallReconnecting, joinedAt, + onSidebarViewDiffersFromGridViewChange, remoteParticipants, setGroupCallVideoRequest, remoteAudioLevels, @@ -140,10 +142,7 @@ export function GroupCallRemoteParticipants({ const { invisibleDemuxIds, onParticipantVisibilityChanged } = useInvisibleParticipants(remoteParticipants); - const minRenderedHeight = - callViewMode === CallViewMode.Paginated - ? SMALL_TILES_MIN_HEIGHT - : LARGE_TILES_MIN_HEIGHT; + const minRenderedHeight = getMinRenderedHeight(callViewMode); const isInSpeakerView = callViewMode === CallViewMode.Speaker || @@ -157,9 +156,7 @@ export function GroupCallRemoteParticipants({ // 1. Figure out the maximum number of possible rows that could fit on the page. // Could be 0 if (a) there are no participants (b) the container's height is small. - const maxRowsPerPage = Math.floor( - maxGridHeight / (minRenderedHeight + PARTICIPANT_MARGIN) - ); + const maxRowsPerPage = getMaxRowsPerPage(maxGridHeight, minRenderedHeight); // 2. Sort the participants in priority order: by `presenting` first, since presenters // should be on the main grid, then by `speakerTime` so that the most recent speakers @@ -228,6 +225,49 @@ export function GroupCallRemoteParticipants({ setPageIndex(gridParticipantsByPage.length - 1); } + // Calculate whether Sidebar view would look different from Grid (Paginated) view. + // They differ when Grid view would have multiple pages. + const minRenderedHeightForGridView = getMinRenderedHeight( + CallViewMode.Paginated + ); + const maxRowsPerPageForGridView = getMaxRowsPerPage( + maxGridHeight, + minRenderedHeightForGridView + ); + const sidebarViewDiffersFromGridView = useMemo(() => { + if (!prioritySortedParticipants.length || !maxRowsPerPageForGridView) { + return false; + } + + // When in Grid view, we've already calculated with the right params + if (isInPaginationView) { + return gridParticipantsByPage.length > 1; + } + + // For other views, calculate how many would fit on the first page of Grid view + const gridViewPages = getGridParticipantsByPage({ + participants: prioritySortedParticipants, + maxRowWidth, + maxPages: 1, + maxRowsPerPage: maxRowsPerPageForGridView, + minRenderedHeight: minRenderedHeightForGridView, + maxParticipantsPerPage: MAX_PARTICIPANTS_PER_PAGE, + }); + + return gridViewPages[0].numParticipants < prioritySortedParticipants.length; + }, [ + isInPaginationView, + gridParticipantsByPage.length, + maxRowWidth, + maxRowsPerPageForGridView, + minRenderedHeightForGridView, + prioritySortedParticipants, + ]); + + useEffect(() => { + onSidebarViewDiffersFromGridViewChange(sidebarViewDiffersFromGridView); + }, [onSidebarViewDiffersFromGridViewChange, sidebarViewDiffersFromGridView]); + const totalParticipantsInGrid = gridParticipantsByPage.reduce( (pageCount, { numParticipants }) => pageCount + numParticipants, 0 @@ -635,6 +675,19 @@ function participantWidthAtHeight( return participant.videoAspectRatio * height; } +function getMinRenderedHeight(callViewMode: CallViewMode): number { + return callViewMode === CallViewMode.Paginated + ? SMALL_TILES_MIN_HEIGHT + : LARGE_TILES_MIN_HEIGHT; +} + +function getMaxRowsPerPage( + maxGridHeight: number, + minRenderedHeight: number +): number { + return Math.floor(maxGridHeight / (minRenderedHeight + PARTICIPANT_MARGIN)); +} + function stableParticipantComparator( a: Readonly<{ demuxId: number }>, b: Readonly<{ demuxId: number }> From 3b72e34900bacdb81498fa747470afdc3d9c8176 Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Tue, 20 Jan 2026 17:49:51 -0600 Subject: [PATCH 29/49] Show profile name in about contact more often Co-authored-by: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com> --- ts/components/conversation/AboutContactModal.dom.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ts/components/conversation/AboutContactModal.dom.tsx b/ts/components/conversation/AboutContactModal.dom.tsx index d5587eef46..4db2025ab8 100644 --- a/ts/components/conversation/AboutContactModal.dom.tsx +++ b/ts/components/conversation/AboutContactModal.dom.tsx @@ -174,7 +174,7 @@ export function AboutContactModal({ {canHaveNicknameAndNote(conversation) && - (conversation.nicknameGivenName || conversation.nicknameFamilyName) && + conversation.titleNoNickname !== conversation.title && conversation.titleNoNickname ? ( Date: Tue, 20 Jan 2026 18:02:23 -0600 Subject: [PATCH 30/49] Cleanup after canceled local backup export Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com> --- ts/services/backups/export.preload.ts | 23 +++- ts/services/backups/index.preload.ts | 115 +++++++++++------- ts/services/backups/types.std.ts | 5 +- ts/services/backups/util/localBackup.node.ts | 30 ++++- ts/sql/main.main.ts | 5 +- .../backup/filePointer_test.preload.ts | 9 ++ ts/test-electron/backup/helpers.preload.ts | 1 + .../backup/integration_test.preload.ts | 1 + 8 files changed, 139 insertions(+), 50 deletions(-) diff --git a/ts/services/backups/export.preload.ts b/ts/services/backups/export.preload.ts index 55dcb23ae7..4d224ac311 100644 --- a/ts/services/backups/export.preload.ts +++ b/ts/services/backups/export.preload.ts @@ -293,12 +293,27 @@ export class BackupExportStream extends Readable { super(); } + async #cleanupAfterError() { + log.warn('Cleaning up after error...'); + await resumeWriteAccess(); + } + + override _destroy( + error: Error | null, + callback: (error?: Error | null) => void + ): void { + if (error) { + drop(this.#cleanupAfterError()); + } + callback(error); + } + public run(): void { drop( (async () => { - log.info('BackupExportStream: starting...'); + log.info('starting...'); drop(AttachmentBackupManager.stop()); - log.info('BackupExportStream: message migration starting...'); + log.info('message migration starting...'); await migrateAllMessages(); await pauseWriteAccess(); @@ -317,7 +332,7 @@ export class BackupExportStream extends Readable { this.#attachmentBackupJobs.map(job => { if (job.type === 'local') { log.error( - "BackupExportStream: Can't enqueue local backup jobs during remote backup, skipping" + "Can't enqueue local backup jobs during remote backup, skipping" ); return Promise.resolve(); } @@ -338,7 +353,7 @@ export class BackupExportStream extends Readable { } log.info('finished successfully'); } catch (error) { - await resumeWriteAccess(); + await this.#cleanupAfterError(); log.error('errored', toLogFormat(error)); this.emit('error', error); } finally { diff --git a/ts/services/backups/index.preload.ts b/ts/services/backups/index.preload.ts index e25151e868..b8da1d496a 100644 --- a/ts/services/backups/index.preload.ts +++ b/ts/services/backups/index.preload.ts @@ -22,10 +22,7 @@ import * as Bytes from '../../Bytes.std.js'; import { strictAssert } from '../../util/assert.std.js'; import { drop } from '../../util/drop.std.js'; import { TEMP_PATH } from '../../util/basePaths.preload.js'; -import { - getAbsoluteDownloadsPath, - saveAttachmentToDisk, -} from '../../util/migrations.preload.js'; +import { getAbsoluteDownloadsPath } from '../../util/migrations.preload.js'; import { waitForAllBatchers } from '../../util/batcher.std.js'; import { flushAllWaitBatchers } from '../../util/waitBatcher.std.js'; import { DelimitedStream } from '../../util/DelimitedStream.node.js'; @@ -51,7 +48,7 @@ import { } from '../../types/backups.node.js'; import { HTTPError } from '../../types/HTTPError.std.js'; import { constantTimeEqual } from '../../Crypto.node.js'; -import { measureSize } from '../../AttachmentCrypto.node.js'; +import { measureSize, safeUnlink } from '../../AttachmentCrypto.node.js'; import { signalProtocolStore } from '../../SignalProtocolStore.preload.js'; import { isTestOrMockEnvironment } from '../../environment.std.js'; import { runStorageServiceSyncJob } from '../storage.preload.js'; @@ -94,6 +91,8 @@ import { writeLocalBackupFilesList, readLocalBackupFilesList, validateLocalBackupStructure, + getAllPathsInLocalBackupFilesDirectory, + getLocalBackupFilesDirectory, } from './util/localBackup.node.js'; import { AttachmentPermanentlyMissingError, @@ -327,6 +326,7 @@ export class BackupsService { const { totalBytes } = await this.exportToDisk(filePath, { type: 'remote', level: backupLevel, + abortSignal: new AbortController().signal, }); await this.api.upload(filePath, totalBytes); @@ -358,37 +358,78 @@ export class BackupsService { options.backupsBaseDir, `signal-backup-${getTimestampForFolder()}` ); - await mkdir(snapshotDir, { recursive: true }); - const freeSpaceBytes = await getFreeDiskSpace(snapshotDir); + const freeSpaceBytes = await getFreeDiskSpace(options.backupsBaseDir); const bytesNeeded = MIMINUM_DISK_SPACE_FOR_LOCAL_EXPORT - freeSpaceBytes; if (bytesNeeded > 0) { fnLog.info( `Not enough storage; only ${freeSpaceBytes} available, ${MIMINUM_DISK_SPACE_FOR_LOCAL_EXPORT} is minimum needed` ); - throw new NotEnoughStorageError(bytesNeeded); } - const exportResult = await this.exportToDisk(join(snapshotDir, 'main'), { - type: 'local-encrypted', - snapshotDir, + const filesDir = getLocalBackupFilesDirectory({ + backupsBaseDir: options.backupsBaseDir, }); - const metadataArgs = { - snapshotDir, - backupId: getBackupId(), - metadataKey: getLocalBackupMetadataKey(), - }; - await writeLocalBackupMetadata(metadataArgs); - await verifyLocalBackupMetadata(metadataArgs); - await this.#runLocalAttachmentBackupJobs({ - attachmentBackupJobs: exportResult.attachmentBackupJobs, - baseDir: options.backupsBaseDir, - onProgress: options.onProgress, - abortSignal: options.abortSignal, - }); + await mkdir(filesDir, { recursive: true }); + + const attachmentPathsWrittenBeforeThisBackup = + await getAllPathsInLocalBackupFilesDirectory({ + backupsBaseDir: options.backupsBaseDir, + }); - return { ...exportResult, snapshotDir }; + try { + await mkdir(snapshotDir, { recursive: true }); + + const exportResult = await this.exportToDisk(join(snapshotDir, 'main'), { + type: 'local-encrypted', + snapshotDir, + abortSignal: options.abortSignal, + }); + + const metadataArgs = { + snapshotDir, + backupId: getBackupId(), + metadataKey: getLocalBackupMetadataKey(), + }; + await writeLocalBackupMetadata(metadataArgs); + await verifyLocalBackupMetadata(metadataArgs); + await this.#runLocalAttachmentBackupJobs({ + attachmentBackupJobs: exportResult.attachmentBackupJobs, + baseDir: options.backupsBaseDir, + onProgress: options.onProgress, + abortSignal: options.abortSignal, + }); + + return { ...exportResult, snapshotDir }; + } catch (e) { + if (options.abortSignal.aborted) { + log.warn('exportLocalBackup aborted', Errors.toLogFormat(e)); + } else { + log.error('exportLocalBackup encountered error', Errors.toLogFormat(e)); + } + + log.info('Deleting snapshot directory'); + await rm(snapshotDir, { recursive: true, force: true }); + log.info('Deleted Snapshot directory'); + + const attachmentPathsAfterBackup = + await getAllPathsInLocalBackupFilesDirectory({ + backupsBaseDir: options.backupsBaseDir, + }); + + const pathsAdded = new Set(attachmentPathsAfterBackup).difference( + new Set(attachmentPathsWrittenBeforeThisBackup) + ); + + if (pathsAdded.size > 0) { + log.info(`Deleting ${pathsAdded.size} newly written files`); + await Promise.all([...pathsAdded].map(safeUnlink)); + log.info(`Deleted ${pathsAdded.size} files`); + } + + throw e; + } } async #runLocalAttachmentBackupJobs({ @@ -600,6 +641,7 @@ export class BackupsService { join(exportDir, 'main.jsonl'), { type: 'plaintext-export', + abortSignal, } ); @@ -667,6 +709,7 @@ export class BackupsService { const recordStream = new BackupExportStream({ type: 'remote', level: BackupLevel.Free, + abortSignal: new AbortController().signal, }); recordStream.run(); @@ -688,19 +731,6 @@ export class BackupsService { } } - // Test harness - public async exportWithDialog(): Promise { - const { data } = await this.exportBackupData({ - type: 'remote', - level: BackupLevel.Free, - }); - - await saveAttachmentToDisk({ - name: 'backup.bin', - data, - }); - } - public async importFromDisk( backupFile: string, options: BackupImportOptions @@ -1146,7 +1176,8 @@ export class BackupsService { totalBytes = size; }, }), - sink + sink, + { signal: options.abortSignal } ); break; case 'cross-client-integration-test': @@ -1161,7 +1192,8 @@ export class BackupsService { totalBytes = size; }, }), - sink + sink, + { signal: options.abortSignal } ); break; case 'plaintext-export': @@ -1172,7 +1204,8 @@ export class BackupsService { totalBytes = size; }, }), - sink + sink, + { signal: options.abortSignal } ); break; default: diff --git a/ts/services/backups/types.std.ts b/ts/services/backups/types.std.ts index c735e67b08..a3460bfe5e 100644 --- a/ts/services/backups/types.std.ts +++ b/ts/services/backups/types.std.ts @@ -34,7 +34,7 @@ export type OnProgressCallback = ( totalBytes: number ) => void; -export type BackupExportOptions = +export type BackupExportOptions = { abortSignal: AbortSignal } & ( | { type: 'remote' | 'cross-client-integration-test'; level: BackupLevel; @@ -45,7 +45,8 @@ export type BackupExportOptions = | { type: 'local-encrypted'; snapshotDir: string; - }; + } +); export type BackupImportOptions = ( | { type: 'remote' | 'cross-client-integration-test' } diff --git a/ts/services/backups/util/localBackup.node.ts b/ts/services/backups/util/localBackup.node.ts index 7faeb75425..0573b250bc 100644 --- a/ts/services/backups/util/localBackup.node.ts +++ b/ts/services/backups/util/localBackup.node.ts @@ -3,7 +3,7 @@ import { randomBytes } from 'node:crypto'; import { dirname, join } from 'node:path'; -import { readFile, stat, writeFile } from 'node:fs/promises'; +import { readdir, readFile, stat, writeFile } from 'node:fs/promises'; import { createReadStream, createWriteStream } from 'node:fs'; import { Transform } from 'node:stream'; import { pipeline } from 'node:stream/promises'; @@ -25,6 +25,29 @@ const log = createLogger('localBackup'); const { Reader } = protobuf; +export function getLocalBackupFilesDirectory({ + backupsBaseDir, +}: { + backupsBaseDir: string; +}): string { + return join(backupsBaseDir, 'files'); +} + +export async function getAllPathsInLocalBackupFilesDirectory({ + backupsBaseDir, +}: { + backupsBaseDir: string; +}): Promise> { + const filesDir = getLocalBackupFilesDirectory({ backupsBaseDir }); + const allEntries = await readdir(filesDir, { + withFileTypes: true, + recursive: true, + }); + return allEntries + .filter(entry => entry.isFile()) + .map(entry => join(entry.parentPath, entry.name)); +} + export function getLocalBackupDirectoryForMediaName({ backupsBaseDir, mediaName, @@ -36,7 +59,10 @@ export function getLocalBackupDirectoryForMediaName({ throw new Error('Invalid mediaName input'); } - return join(backupsBaseDir, 'files', mediaName.substring(0, 2)); + return join( + getLocalBackupFilesDirectory({ backupsBaseDir }), + mediaName.substring(0, 2) + ); } export function getLocalBackupPathForMediaName({ diff --git a/ts/sql/main.main.ts b/ts/sql/main.main.ts index a955d27e51..25f4cc735e 100644 --- a/ts/sql/main.main.ts +++ b/ts/sql/main.main.ts @@ -204,7 +204,10 @@ export class MainSQL { public resumeWriteAccess(): void { const pauseWaiters = this.#pauseWaiters; - strictAssert(pauseWaiters != null, 'Not paused'); + if (pauseWaiters == null) { + return; + } + this.#pauseWaiters = undefined; for (const waiter of pauseWaiters) { diff --git a/ts/test-electron/backup/filePointer_test.preload.ts b/ts/test-electron/backup/filePointer_test.preload.ts index 983bf29f54..4f33f74f28 100644 --- a/ts/test-electron/backup/filePointer_test.preload.ts +++ b/ts/test-electron/backup/filePointer_test.preload.ts @@ -241,6 +241,7 @@ describe('getFilePointerForAttachment', () => { backupOptions: { type: 'remote', level: BackupLevel.Paid, + abortSignal: new AbortController().signal, }, getBackupCdnInfo: notInBackupCdn, messageReceivedAt: 100, @@ -271,6 +272,7 @@ describe('getFilePointerForAttachment', () => { backupOptions: { type: 'remote', level: BackupLevel.Paid, + abortSignal: new AbortController().signal, }, getBackupCdnInfo: notInBackupCdn, messageReceivedAt: 100, @@ -298,6 +300,7 @@ describe('getFilePointerForAttachment', () => { backupOptions: { type: 'remote', level: BackupLevel.Free, + abortSignal: new AbortController().signal, }, getBackupCdnInfo: notInBackupCdn, messageReceivedAt: 100, @@ -326,6 +329,7 @@ describe('getFilePointerForAttachment', () => { backupOptions: { type: 'remote', level: BackupLevel.Free, + abortSignal: new AbortController().signal, }, getBackupCdnInfo: notInBackupCdn, messageReceivedAt: 100, @@ -354,6 +358,7 @@ describe('getFilePointerForAttachment', () => { backupOptions: { type: 'remote', level: BackupLevel.Free, + abortSignal: new AbortController().signal, }, getBackupCdnInfo: notInBackupCdn, messageReceivedAt: 100, @@ -378,6 +383,7 @@ describe('getFilePointerForAttachment', () => { backupOptions: { type: 'remote', level: BackupLevel.Paid, + abortSignal: new AbortController().signal, }, getBackupCdnInfo: notInBackupCdn, messageReceivedAt: 100, @@ -422,6 +428,7 @@ describe('getFilePointerForAttachment', () => { backupOptions: { type: 'remote', level: BackupLevel.Paid, + abortSignal: new AbortController().signal, }, getBackupCdnInfo: notInBackupCdn, messageReceivedAt: 100, @@ -459,6 +466,7 @@ describe('getFilePointerForAttachment', () => { backupOptions: { type: 'local-encrypted', snapshotDir: '/root/backups/signal-backup-12-12-12', + abortSignal: new AbortController().signal, }, getBackupCdnInfo: notInBackupCdn, messageReceivedAt: 100, @@ -498,6 +506,7 @@ describe('getFilePointerForAttachment', () => { backupOptions: { type: 'local-encrypted', snapshotDir: '/root/backups/signal-backup-12-12-12', + abortSignal: new AbortController().signal, }, getBackupCdnInfo: notInBackupCdn, messageReceivedAt: 100, diff --git a/ts/test-electron/backup/helpers.preload.ts b/ts/test-electron/backup/helpers.preload.ts index 5522ea45d8..94890c95fd 100644 --- a/ts/test-electron/backup/helpers.preload.ts +++ b/ts/test-electron/backup/helpers.preload.ts @@ -245,6 +245,7 @@ export async function asymmetricRoundtripHarness( await backupsService.exportToDisk(targetOutputFile, { type: 'remote', level: options.backupLevel, + abortSignal: new AbortController().signal, }); await updateConvoIdToTitle(); diff --git a/ts/test-electron/backup/integration_test.preload.ts b/ts/test-electron/backup/integration_test.preload.ts index 4c211c8898..03f7b24363 100644 --- a/ts/test-electron/backup/integration_test.preload.ts +++ b/ts/test-electron/backup/integration_test.preload.ts @@ -59,6 +59,7 @@ describe('backup/integration', () => { const { data: exported } = await backupsService.exportBackupData({ type: 'cross-client-integration-test', level: BackupLevel.Paid, + abortSignal: new AbortController().signal, }); const actualStream = new MemoryStream(Buffer.from(exported)); From 1c8ea87c96c0f87a80881b2be0646d82abd5c846 Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Wed, 21 Jan 2026 12:09:43 -0600 Subject: [PATCH 31/49] Animate pinned messages bar Co-authored-by: Jamie <113370520+jamiebuilds-signal@users.noreply.github.com> --- .../ConversationHeader.dom.stories.tsx | 7 +- .../conversation/ConversationHeader.dom.tsx | 9 +- .../pinned-messages/PinnedMessagesBar.dom.tsx | 450 +++++++++++------- ts/state/selectors/conversations.dom.ts | 7 + ts/state/smart/ConversationHeader.preload.tsx | 5 - ts/state/smart/PinnedMessagesBar.preload.tsx | 6 +- 6 files changed, 304 insertions(+), 180 deletions(-) diff --git a/ts/components/conversation/ConversationHeader.dom.stories.tsx b/ts/components/conversation/ConversationHeader.dom.stories.tsx index 58e503be8d..9df50c15cb 100644 --- a/ts/components/conversation/ConversationHeader.dom.stories.tsx +++ b/ts/components/conversation/ConversationHeader.dom.stories.tsx @@ -103,7 +103,6 @@ const commonProps: PropsType = { shouldShowMiniPlayer: false, renderMiniPlayer, - shouldShowPinnedMessagesBar: false, renderPinnedMessagesBar, }; @@ -600,10 +599,7 @@ export function WithJustMiniPlayer(): React.JSX.Element { } export function WithJustPinnedMessagesBar(): React.JSX.Element { - const props: PropsType = { - ...commonProps, - shouldShowPinnedMessagesBar: true, - }; + const props: PropsType = commonProps; const theme = useContext(StorybookThemeContext); return ; @@ -613,7 +609,6 @@ export function WithMinPlayerAndPinnedMessagesBar(): React.JSX.Element { const props: PropsType = { ...commonProps, shouldShowMiniPlayer: true, - shouldShowPinnedMessagesBar: true, }; const theme = useContext(StorybookThemeContext); diff --git a/ts/components/conversation/ConversationHeader.dom.tsx b/ts/components/conversation/ConversationHeader.dom.tsx index e95573d5b5..16f37b6972 100644 --- a/ts/components/conversation/ConversationHeader.dom.tsx +++ b/ts/components/conversation/ConversationHeader.dom.tsx @@ -149,7 +149,6 @@ export type PropsDataType = { shouldShowMiniPlayer: boolean; renderMiniPlayer: RenderMiniPlayer; - shouldShowPinnedMessagesBar: boolean; renderPinnedMessagesBar: RenderPinnedMessagesBar; }; @@ -243,7 +242,6 @@ export const ConversationHeader = memo(function ConversationHeader({ shouldShowMiniPlayer, renderMiniPlayer, - shouldShowPinnedMessagesBar, renderPinnedMessagesBar, }: PropsType): React.JSX.Element | null { // Comes from a third-party dependency @@ -465,7 +463,6 @@ export const ConversationHeader = memo(function ConversationHeader({ renderCollidingAvatars={renderCollidingAvatars} shouldShowMiniPlayer={shouldShowMiniPlayer} renderMiniPlayer={renderMiniPlayer} - shouldShowPinnedMessagesBar={shouldShowPinnedMessagesBar} renderPinnedMessagesBar={renderPinnedMessagesBar} />
    @@ -1140,8 +1137,6 @@ function ConversationSubheader(props: { shouldShowMiniPlayer: boolean; renderMiniPlayer: RenderMiniPlayer; - - shouldShowPinnedMessagesBar: boolean; renderPinnedMessagesBar: RenderPinnedMessagesBar; }) { const { i18n } = props; @@ -1194,9 +1189,7 @@ function ConversationSubheader(props: { )} {props.shouldShowMiniPlayer && props.renderMiniPlayer({ shouldFlow: true })} - {!props.shouldShowMiniPlayer && - props.shouldShowPinnedMessagesBar && - props.renderPinnedMessagesBar()} + {!props.shouldShowMiniPlayer && props.renderPinnedMessagesBar()} ); } diff --git a/ts/components/conversation/pinned-messages/PinnedMessagesBar.dom.tsx b/ts/components/conversation/pinned-messages/PinnedMessagesBar.dom.tsx index a8114566c0..d0de241f47 100644 --- a/ts/components/conversation/pinned-messages/PinnedMessagesBar.dom.tsx +++ b/ts/components/conversation/pinned-messages/PinnedMessagesBar.dom.tsx @@ -1,11 +1,11 @@ // Copyright 2025 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import type { ForwardedRef, ReactNode } from 'react'; -import React, { forwardRef, memo, useCallback, useMemo } from 'react'; +import React, { forwardRef, memo, useCallback, useMemo, useState } from 'react'; import { Tabs } from 'radix-ui'; +import { AnimatePresence, motion } from 'framer-motion'; import type { LocalizerType } from '../../../types/I18N.std.js'; import { tw } from '../../../axo/tw.dom.js'; -import { strictAssert } from '../../../util/assert.std.js'; import { AxoIconButton } from '../../../axo/AxoIconButton.dom.js'; import { AxoDropdownMenu } from '../../../axo/AxoDropdownMenu.dom.js'; import { AriaClickable } from '../../../axo/AriaClickable.dom.js'; @@ -20,6 +20,24 @@ import { AxoSymbol } from '../../../axo/AxoSymbol.dom.js'; import { missingCaseError } from '../../../util/missingCaseError.std.js'; import { stripNewlinesForLeftPane } from '../../../util/stripNewlinesForLeftPane.std.js'; +enum Direction { + None = 0, + Backwards = -1, + Forwards = 1, +} + +// This `usePrevious()` hook is safe in React concurrent mode and doesn't break +// when rendered multiple times with the same values in `` +function usePrevious(value: T): T | null { + const [current, setCurrent] = useState(value); + const [previous, setPrevious] = useState(null); + if (current !== value) { + setCurrent(value); + setPrevious(current); + } + return previous; +} + export type PinMessageText = Readonly<{ body: string; bodyRanges: HydratedBodyRangesType; @@ -69,7 +87,7 @@ export type Pin = Readonly<{ export type PinnedMessagesBarProps = Readonly<{ i18n: LocalizerType; pins: ReadonlyArray; - current: PinnedMessageId; + current: PinnedMessageId | null; onCurrentChange: (current: PinnedMessageId) => void; onPinGoTo: (messageId: string) => void; onPinRemove: (messageId: string) => void; @@ -80,9 +98,43 @@ export type PinnedMessagesBarProps = Readonly<{ export const PinnedMessagesBar = memo(function PinnedMessagesBar( props: PinnedMessagesBarProps ) { - const { i18n, onCurrentChange } = props; + const { i18n, pins, current, onCurrentChange } = props; + + const currentEntry = useMemo(() => { + if (current == null) { + return null; + } + + for (let index = 0; index < pins.length; index += 1) { + const value = pins[index]; + if (value.id === current) { + return { index, value }; + } + } + + throw new Error( + `Current pin ${current} is missing from pins (${pins.length})` + ); + }, [pins, current]); + + const currentIndex = currentEntry?.index; + const previousIndex = usePrevious(currentIndex); + + const direction = useMemo(() => { + if (previousIndex == null || currentIndex == null) { + return Direction.None; + } + + if (previousIndex < currentIndex) { + return Direction.Forwards; + } + + if (previousIndex > currentIndex) { + return Direction.Backwards; + } - strictAssert(props.pins.length > 0, 'Must have at least one pin'); + return Direction.None; + }, [currentIndex, previousIndex]); const handleValueChange = useCallback( (value: string) => { @@ -91,117 +143,184 @@ export const PinnedMessagesBar = memo(function PinnedMessagesBar( [onCurrentChange] ); - if (props.pins.length === 1) { - const pin = props.pins.at(0); - strictAssert(pin != null, 'Missing pin'); - return ( - - - - ); - } - return ( - - - - {props.pins.map(pin => { - return ( - - - - ); - })} - - + + {currentEntry != null && ( + + + + + {props.pins.map(pin => { + return ( + + + + ); + })} + + + + + + )} + ); }); -function Container(props: { +function Bar(props: { i18n: LocalizerType; pinsCount: number; children: ReactNode; }) { const { i18n } = props; + return ( + + {props.pinsCount > 0 && ( + + + {props.children} + + + )} + + ); +} +function Row(props: { children: ReactNode }) { return ( -
    - - {props.children} - -
    + {props.children} + + ); +} + +function HiddenTrigger(props: { + i18n: LocalizerType; + currentPin: Pin; + onPinGoTo: (messageId: string) => void; +}) { + const { i18n, currentPin, onPinGoTo } = props; + + const handlePinGoToCurrent = useCallback(() => { + onPinGoTo(currentPin.message.id); + }, [onPinGoTo, currentPin]); + + return ( + + ); +} + +function ContentWrapper(props: { children: ReactNode }) { + return ( +
    + {props.children} +
    ); } function TabsList(props: { i18n: LocalizerType; pins: ReadonlyArray; - current: PinnedMessageId; + current: PinnedMessageId | null; onCurrentChange: (current: PinnedMessageId) => void; }) { const { i18n } = props; - strictAssert(props.pins.length >= 2, 'Too few pins for tabs'); - strictAssert(props.pins.length <= 3, 'Too many pins for tabs'); + if (props.pins.length < 2) { + return null; + } return ( - - {props.pins.map((pin, pinIndex) => { - return ( - - ); - })} + + + {props.pins.map((pin, pinIndex) => { + return ( + + ); + })} + ); @@ -241,36 +360,14 @@ function TabTrigger(props: { type ContentProps = Readonly<{ i18n: LocalizerType; pin: Pin; - onPinGoTo: (messageId: string) => void; - onPinRemove: (messageId: string) => void; - onPinsShowAll: () => void; - canPinMessages: boolean; + direction: Direction; + pinsCount: number; }>; const Content = forwardRef(function Content( - { - i18n, - pin, - onPinGoTo, - onPinRemove, - onPinsShowAll, - canPinMessages, - ...forwardedProps - }: ContentProps, + { i18n, pin, direction, pinsCount, ...forwardedProps }: ContentProps, ref: ForwardedRef ): React.JSX.Element { - const handlePinGoTo = useCallback(() => { - onPinGoTo(pin.message.id); - }, [onPinGoTo, pin.message.id]); - - const handlePinRemove = useCallback(() => { - onPinRemove(pin.message.id); - }, [onPinRemove, pin.message.id]); - - const handlePinsShowAll = useCallback(() => { - onPinsShowAll(); - }, [onPinsShowAll]); - const thumbnailUrl = useMemo(() => { return getThumbnailUrl(pin.message); }, [pin.message]); @@ -279,7 +376,27 @@ const Content = forwardRef(function Content(
    {thumbnailUrl != null && }
    @@ -289,53 +406,68 @@ const Content = forwardRef(function Content(

    -
    - - - - - - - {canPinMessages && ( - - {i18n('icu:PinnedMessagesBar__ActionsMenu__UnpinMessage')} - - )} - - {i18n('icu:PinnedMessagesBar__ActionsMenu__GoToMessage')} - - - {i18n('icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages')} - - - -
    ); }); +function PinActionsMenu(props: { + i18n: LocalizerType; + pin: Pin; + onPinGoTo: (messageId: string) => void; + onPinRemove: (messageId: string) => void; + onPinsShowAll: () => void; + canPinMessages: boolean; +}) { + const { i18n, pin, onPinGoTo, onPinRemove, onPinsShowAll, canPinMessages } = + props; + + const handlePinGoTo = useCallback(() => { + onPinGoTo(pin.message.id); + }, [onPinGoTo, pin.message.id]); + + const handlePinRemove = useCallback(() => { + onPinRemove(pin.message.id); + }, [onPinRemove, pin.message.id]); + + const handlePinsShowAll = useCallback(() => { + onPinsShowAll(); + }, [onPinsShowAll]); + + return ( + + + + + + + {canPinMessages && ( + + {i18n('icu:PinnedMessagesBar__ActionsMenu__UnpinMessage')} + + )} + + {i18n('icu:PinnedMessagesBar__ActionsMenu__GoToMessage')} + + + {i18n('icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages')} + + + + + ); +} + function getThumbnailUrl(message: PinMessage): string | null { // Never render a thumbnail if its view-once media if (message.viewOnceMedia) { diff --git a/ts/state/selectors/conversations.dom.ts b/ts/state/selectors/conversations.dom.ts index 3815afd901..922c5300e3 100644 --- a/ts/state/selectors/conversations.dom.ts +++ b/ts/state/selectors/conversations.dom.ts @@ -319,6 +319,13 @@ export const getConversationMessages = createSelector( } ); +export const getConversationIsReady: StateSelector = createSelector( + getConversationMessages, + conversationMessages => { + return conversationMessages != null; + } +); + export const getPinnedMessages: StateSelector> = createSelector(getConversationMessages, conversationMessages => { return conversationMessages?.pinnedMessages ?? []; diff --git a/ts/state/smart/ConversationHeader.preload.tsx b/ts/state/smart/ConversationHeader.preload.tsx index 69aee8ede8..c806c65438 100644 --- a/ts/state/smart/ConversationHeader.preload.tsx +++ b/ts/state/smart/ConversationHeader.preload.tsx @@ -39,7 +39,6 @@ import { getConversationSelector, getHasPanelOpen, isMissingRequiredProfileSharing as getIsMissingRequiredProfileSharing, - getPinnedMessages, getSelectedMessageIds, } from '../selectors/conversations.dom.js'; import { getHasStoriesSelector } from '../selectors/stories2.dom.js'; @@ -138,9 +137,6 @@ export const SmartConversationHeader = memo(function SmartConversationHeader({ const activeAudioPlayer = useSelector(selectAudioPlayerActive); const shouldShowMiniPlayer = activeAudioPlayer != null; - const pinnedMessages = useSelector(getPinnedMessages); - const shouldShowPinnedMessagesBar = pinnedMessages.length > 0; - const { destroyMessages, leaveGroup, @@ -350,7 +346,6 @@ export const SmartConversationHeader = memo(function SmartConversationHeader({ renderCollidingAvatars={renderCollidingAvatars} shouldShowMiniPlayer={shouldShowMiniPlayer} renderMiniPlayer={renderMiniPlayer} - shouldShowPinnedMessagesBar={shouldShowPinnedMessagesBar} renderPinnedMessagesBar={renderPinnedMessagesBar} acknowledgeGroupMemberNameCollisions={ acknowledgeGroupMemberNameCollisions diff --git a/ts/state/smart/PinnedMessagesBar.preload.tsx b/ts/state/smart/PinnedMessagesBar.preload.tsx index 2ed521416a..990ff22a91 100644 --- a/ts/state/smart/PinnedMessagesBar.preload.tsx +++ b/ts/state/smart/PinnedMessagesBar.preload.tsx @@ -17,6 +17,7 @@ import { getSelectedConversationId, getPinnedMessages, getMessages, + getConversationIsReady, } from '../selectors/conversations.dom.js'; import { strictAssert } from '../../util/assert.std.js'; import { useConversationsActions } from '../ducks/conversations.preload.js'; @@ -372,6 +373,7 @@ export const SmartPinnedMessagesBar = memo(function SmartPinnedMessagesBar() { const conversation = conversationSelector(conversationId); strictAssert(conversation != null, 'Missing conversation'); + const conversationIsReady = useSelector(getConversationIsReady); const pins = useSelector(selectPins); const canPinMessages = getCanPinMessages(conversation); @@ -459,8 +461,8 @@ export const SmartPinnedMessagesBar = memo(function SmartPinnedMessagesBar() { setCurrent(nextCurrent); }); - if (current == null) { - return; + if (!conversationIsReady) { + return null; } return ( From 4dcbbfef60708eb165fd5f9493ff5825c9071611 Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Wed, 21 Jan 2026 12:09:50 -0600 Subject: [PATCH 32/49] Fix pin targeting based on edited timestamp Co-authored-by: Jamie <113370520+jamiebuilds-signal@users.noreply.github.com> --- ts/sql/Interface.std.ts | 3 ++- ts/sql/Server.node.ts | 25 +++++++++++++++++++------ ts/state/ducks/composer.preload.ts | 3 ++- ts/util/getPinMessageTarget.preload.ts | 9 ++++++++- 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/ts/sql/Interface.std.ts b/ts/sql/Interface.std.ts index ce22cc7f07..02db9cf751 100644 --- a/ts/sql/Interface.std.ts +++ b/ts/sql/Interface.std.ts @@ -869,7 +869,8 @@ type ReadableInterface = { getMessageByAuthorAciAndSentAt: ( authorAci: AciString, - sentAtTimestamp: number + sentAtTimestamp: number, + options: { includeEdits: boolean } ) => MessageType | null; getMessageBySender: (options: { source?: string; diff --git a/ts/sql/Server.node.ts b/ts/sql/Server.node.ts index 83545f841b..0046f80032 100644 --- a/ts/sql/Server.node.ts +++ b/ts/sql/Server.node.ts @@ -49,7 +49,7 @@ import { isNormalNumber } from '../util/isNormalNumber.std.js'; import { isNotNil } from '../util/isNotNil.std.js'; import { parseIntOrThrow } from '../util/parseIntOrThrow.std.js'; import { updateSchema } from './migrations/index.node.js'; -import type { JSONRows, QueryFragment, QueryTemplate } from './util.std.js'; +import type { JSONRows, QueryTemplate, QueryFragment } from './util.std.js'; import { batchMultiVarQuery, bulkAdd, @@ -3322,17 +3322,30 @@ function getAllMessageIds(db: ReadableDB): Array { function getMessageByAuthorAciAndSentAt( db: ReadableDB, authorAci: AciString, - sentAtTimestamp: number + sentAtTimestamp: number, + options: { includeEdits: boolean } ): MessageType | null { return db.transaction(() => { - const [query, params] = sql` + const editedMessagesQuery = sqlFragment` + SELECT ${MESSAGE_COLUMNS_SELECT} + FROM edited_messages + INNER JOIN messages ON + messages.id = edited_messages.messageId + WHERE messages.sourceServiceId = ${authorAci} + AND edited_messages.sentAt = ${sentAtTimestamp} + `; + + const messagesQuery = sqlFragment` SELECT ${MESSAGE_COLUMNS_SELECT} FROM messages - WHERE sourceServiceId = ${authorAci} - AND sent_at = ${sentAtTimestamp} - LIMIT 2; + WHERE messages.sourceServiceId = ${authorAci} + AND messages.sent_at = ${sentAtTimestamp} `; + const [query, params] = options.includeEdits + ? sql`${editedMessagesQuery} UNION ${messagesQuery} LIMIT 2;` + : sql`${messagesQuery} LIMIT 2;`; + const rows = db.prepare(query).all(params); if (rows.length > 1) { diff --git a/ts/state/ducks/composer.preload.ts b/ts/state/ducks/composer.preload.ts index 20292c1e87..e75bb59acd 100644 --- a/ts/state/ducks/composer.preload.ts +++ b/ts/state/ducks/composer.preload.ts @@ -392,7 +392,8 @@ function scrollToPinnedMessage( return async (dispatch, getState) => { const pinnedMessage = await DataReader.getMessageByAuthorAciAndSentAt( pinMessage.targetAuthorAci, - pinMessage.targetSentTimestamp + pinMessage.targetSentTimestamp, + { includeEdits: true } ); if (!pinnedMessage) { diff --git a/ts/util/getPinMessageTarget.preload.ts b/ts/util/getPinMessageTarget.preload.ts index d8a3eb6e35..8e8151ef7b 100644 --- a/ts/util/getPinMessageTarget.preload.ts +++ b/ts/util/getPinMessageTarget.preload.ts @@ -1,14 +1,18 @@ // Copyright 2026 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only +import { createLogger } from '../logging/log.std.js'; import { isIncoming } from '../messages/helpers.std.js'; import type { ReadonlyMessageAttributesType } from '../model-types.js'; import { DataReader } from '../sql/Client.preload.js'; import { itemStorage } from '../textsecure/Storage.preload.js'; import type { AciString } from '../types/ServiceId.std.js'; import { strictAssert } from './assert.std.js'; +import { getMessageSentTimestamp } from './getMessageSentTimestamp.std.js'; import { isAciString } from './isAciString.std.js'; +const log = createLogger('getPinMessageTarget'); + export type PinnedMessageTarget = Readonly<{ conversationId: string; targetMessageId: string; @@ -40,6 +44,9 @@ export async function getPinnedMessageTarget( conversationId: message.conversationId, targetMessageId: message.id, targetAuthorAci: getMessageAuthorAci(message), - targetSentTimestamp: message.sent_at, + targetSentTimestamp: getMessageSentTimestamp(message, { + includeEdits: true, + log, + }), }; } From b08748208fba486885273780ccf777da1ff8794e Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Wed, 21 Jan 2026 12:29:24 -0600 Subject: [PATCH 33/49] Bind remote config to libsignal-net Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com> --- ts/LibsignalNetRemoteConfig.preload.ts | 63 +++++++++++++++++++ ts/RemoteConfig.dom.ts | 58 ++++++++++++++--- ts/background.preload.ts | 5 ++ ....preload.ts => messageStateCleanup.dom.ts} | 3 - .../isConversationTooBigToRing_test.dom.ts | 3 +- ts/textsecure/WebAPI.preload.ts | 25 +------- ts/types/Util.std.ts | 29 +++++++++ ts/windows/main/preload_test.preload.ts | 8 ++- ts/windows/main/start.preload.ts | 3 - 9 files changed, 157 insertions(+), 40 deletions(-) create mode 100644 ts/LibsignalNetRemoteConfig.preload.ts rename ts/services/{messageStateCleanup.preload.ts => messageStateCleanup.dom.ts} (83%) diff --git a/ts/LibsignalNetRemoteConfig.preload.ts b/ts/LibsignalNetRemoteConfig.preload.ts new file mode 100644 index 0000000000..2b4f21c6fd --- /dev/null +++ b/ts/LibsignalNetRemoteConfig.preload.ts @@ -0,0 +1,63 @@ +// Copyright 2025 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only +import { + type Net, + BuildVariant, + REMOTE_CONFIG_KEYS as KeysExpectedByLibsignalNet, +} from '@signalapp/libsignal-client/dist/net.js'; + +import { isProduction } from './util/version.std.js'; +import * as RemoteConfig from './RemoteConfig.dom.js'; +import type { AddPrefix, ArrayValues } from './types/Util.std.js'; +import { createLogger } from './logging/log.std.js'; + +const log = createLogger('LibsignalNetRemoteConfig'); + +function convertToDesktopRemoteConfigKey< + K extends ArrayValues, +>(key: K): AddPrefix { + return `desktop.libsignalNet.${key}`; +} + +export function bindRemoteConfigToLibsignalNet( + libsignalNet: Net, + appVersion: string +): void { + // Calls setLibsignalRemoteConfig and is reset when any libsignal remote + // config key changes. Doing that asynchronously allows the callbacks for + // multiple keys that are triggered by the same config fetch from the server + // to be coalesced into a single timeout. + let reloadRemoteConfig: NodeJS.Immediate | undefined; + const libsignalBuildVariant = isProduction(appVersion) + ? BuildVariant.Production + : BuildVariant.Beta; + + const setLibsignalRemoteConfig = () => { + const remoteConfigs = KeysExpectedByLibsignalNet.reduce((output, key) => { + const value = RemoteConfig.getValue(convertToDesktopRemoteConfigKey(key)); + if (value !== undefined) { + output.set(key, value); + } + return output; + }, new Map<(typeof KeysExpectedByLibsignalNet)[number], string>()); + + log.info( + 'Setting libsignal-net remote config', + Object.fromEntries(remoteConfigs) + ); + libsignalNet.setRemoteConfig(remoteConfigs, libsignalBuildVariant); + reloadRemoteConfig = undefined; + }; + + setLibsignalRemoteConfig(); + + KeysExpectedByLibsignalNet.map(convertToDesktopRemoteConfigKey).forEach( + key => { + RemoteConfig.onChange(key, () => { + if (reloadRemoteConfig === undefined) { + reloadRemoteConfig = setImmediate(setLibsignalRemoteConfig); + } + }); + } + ); +} diff --git a/ts/RemoteConfig.dom.ts b/ts/RemoteConfig.dom.ts index a16544d52e..90d561350d 100644 --- a/ts/RemoteConfig.dom.ts +++ b/ts/RemoteConfig.dom.ts @@ -3,6 +3,7 @@ import lodash from 'lodash'; import semver from 'semver'; +import type { REMOTE_CONFIG_KEYS as KeysExpectedByLibsignalNet } from '@signalapp/libsignal-client/dist/net.js'; import type { getConfig } from './textsecure/WebAPI.preload.js'; import { createLogger } from './logging/log.std.js'; @@ -16,6 +17,12 @@ import { getCountryCode } from './types/PhoneNumber.std.js'; import { parseRemoteClientExpiration } from './util/parseRemoteClientExpiration.dom.js'; import type { StorageInterface } from './types/Storage.d.ts'; import { ToastType } from './types/Toast.dom.js'; +import { assertDev, strictAssert } from './util/assert.std.js'; +import type { + ArrayValues, + AssertSameMembers, + StripPrefix, +} from './types/Util.std.js'; const { get, throttle } = lodash; @@ -35,7 +42,7 @@ const SemverKeys = [ 'desktop.retireAccessKeyGroupSend.prod', ] as const; -export type SemverKeyType = (typeof SemverKeys)[number]; +export type SemverKeyType = ArrayValues; const ScalarKeys = [ 'desktop.callQualitySurveyPPM', @@ -52,11 +59,6 @@ const ScalarKeys = [ 'desktop.retryRespondMaxAge', 'desktop.senderKey.retry', 'desktop.senderKeyMaxAge', - 'desktop.libsignalNet.enforceMinimumTls', - 'desktop.libsignalNet.shadowUnauthChatWithNoise', - 'desktop.libsignalNet.shadowAuthChatWithNoise', - 'desktop.libsignalNet.chatPermessageDeflate', - 'desktop.libsignalNet.chatPermessageDeflate.prod', 'desktop.pollReceive.alpha', 'desktop.pollReceive.beta1', 'desktop.pollReceive.prod1', @@ -76,9 +78,39 @@ const ScalarKeys = [ 'global.textAttachmentLimitBytes', ] as const; -const KnownConfigKeys = [...SemverKeys, ...ScalarKeys] as const; +// These keys should always match those in Net.REMOTE_CONFIG_KEYS, prefixed by +// `desktop.libsignalNet` +const KnownDesktopLibsignalNetKeys = [ + 'desktop.libsignalNet.chatPermessageDeflate.beta', + 'desktop.libsignalNet.chatPermessageDeflate.prod', + 'desktop.libsignalNet.chatPermessageDeflate', + 'desktop.libsignalNet.chatRequestConnectionCheckTimeoutMillis.beta', + 'desktop.libsignalNet.chatRequestConnectionCheckTimeoutMillis', + 'desktop.libsignalNet.disableNagleAlgorithm.beta', + 'desktop.libsignalNet.disableNagleAlgorithm', + 'desktop.libsignalNet.useH2ForUnauthChat.beta', + 'desktop.libsignalNet.useH2ForUnauthChat', +] as const; -export type ConfigKeyType = (typeof KnownConfigKeys)[number]; +type KnownLibsignalKeysType = StripPrefix< + ArrayValues, + 'desktop.libsignalNet.' +>; +type ExpectedLibsignalKeysType = ArrayValues; + +const _assertLibsignalKeysMatch: AssertSameMembers< + KnownLibsignalKeysType, + ExpectedLibsignalKeysType +> = true; +strictAssert(_assertLibsignalKeysMatch, 'Libsignal keys match'); + +const KnownConfigKeys = [ + ...SemverKeys, + ...ScalarKeys, + ...KnownDesktopLibsignalNetKeys, +] as const; + +export type ConfigKeyType = ArrayValues; type ConfigValueType = { name: ConfigKeyType; @@ -92,7 +124,7 @@ type ConfigListenersMapType = { [key: string]: Array; }; -let config: ConfigMapType = {}; +let config: ConfigMapType | undefined; const listeners: ConfigListenersMapType = {}; export type OptionsType = Readonly<{ @@ -272,6 +304,10 @@ export function isEnabled( // when called from UI component, provide redux config (items.remoteConfig) reduxConfig?: ConfigMapType ): boolean { + assertDev( + reduxConfig != null || config != null, + 'getValue called before remote config is ready' + ); return get(reduxConfig ?? config, [name, 'enabled'], false); } @@ -279,6 +315,10 @@ export function getValue( name: ConfigKeyType, // when called from UI component, provide redux config (items.remoteConfig) reduxConfig?: ConfigMapType ): string | undefined { + assertDev( + reduxConfig != null || config != null, + 'getValue called before remote config is ready' + ); return get(reduxConfig ?? config, [name, 'value']); } diff --git a/ts/background.preload.ts b/ts/background.preload.ts index 276a6153a5..d1d7b4271e 100644 --- a/ts/background.preload.ts +++ b/ts/background.preload.ts @@ -285,6 +285,8 @@ import { import { JobCancelReason } from './jobs/types.std.js'; import { itemStorage } from './textsecure/Storage.preload.js'; import { isPinnedMessagesReceiveEnabled } from './util/isPinnedMessagesEnabled.dom.js'; +import { initMessageCleanup } from './services/messageStateCleanup.dom.js'; +import { MessageCache } from './services/MessageCache.preload.js'; const { isNumber, throttle } = lodash; @@ -551,6 +553,9 @@ export async function startApp(): Promise { storage: itemStorage, }); + MessageCache.install(); + initMessageCleanup(); + window.Whisper.events.on('firstEnvelope', checkFirstEnvelope); const buildExpirationService = new BuildExpirationService(); diff --git a/ts/services/messageStateCleanup.preload.ts b/ts/services/messageStateCleanup.dom.ts similarity index 83% rename from ts/services/messageStateCleanup.preload.ts rename to ts/services/messageStateCleanup.dom.ts index 10ef76e236..7c19022bfb 100644 --- a/ts/services/messageStateCleanup.preload.ts +++ b/ts/services/messageStateCleanup.dom.ts @@ -3,7 +3,6 @@ import * as durations from '../util/durations/index.std.js'; import { isEnabled } from '../RemoteConfig.dom.js'; -import { MessageCache } from './MessageCache.preload.js'; const TEN_MINUTES = 10 * durations.MINUTE; @@ -12,6 +11,4 @@ export function initMessageCleanup(): void { () => window.MessageCache.deleteExpiredMessages(TEN_MINUTES), isEnabled('desktop.messageCleanup') ? TEN_MINUTES : durations.HOUR ); - - MessageCache.install(); } diff --git a/ts/test-node/conversations/isConversationTooBigToRing_test.dom.ts b/ts/test-node/conversations/isConversationTooBigToRing_test.dom.ts index 75db50dac4..840dc0c46e 100644 --- a/ts/test-node/conversations/isConversationTooBigToRing_test.dom.ts +++ b/ts/test-node/conversations/isConversationTooBigToRing_test.dom.ts @@ -16,7 +16,8 @@ describe('isConversationTooBigToRing', () => { const fakeMemberships = (count: number) => times(count, () => ({ aci: generateAci(), isAdmin: false })); - it('returns false if there are no memberships (i.e., for a direct conversation)', () => { + it('returns false if there are no memberships (i.e., for a direct conversation)', async () => { + await updateRemoteConfig([]); assert.isFalse(isConversationTooBigToRing({})); assert.isFalse(isConversationTooBigToRing({ memberships: [] })); }); diff --git a/ts/textsecure/WebAPI.preload.ts b/ts/textsecure/WebAPI.preload.ts index 70a47151d0..8539f032cf 100644 --- a/ts/textsecure/WebAPI.preload.ts +++ b/ts/textsecure/WebAPI.preload.ts @@ -77,7 +77,6 @@ import { import type { CDSAuthType, CDSResponseType } from './cds/Types.d.ts'; import { CDSI } from './cds/CDSI.node.js'; import { SignalService as Proto } from '../protobuf/index.std.js'; -import { isEnabled as isRemoteConfigEnabled } from '../RemoteConfig.dom.js'; import type { WebAPICredentials, @@ -120,6 +119,7 @@ import { RemoteMegaphoneCtaDataSchema, type RemoteMegaphoneId, } from '../types/Megaphone.std.js'; +import { bindRemoteConfigToLibsignalNet } from '../LibsignalNetRemoteConfig.preload.js'; const { escapeRegExp, isNumber, throttle } = lodash; @@ -1701,27 +1701,6 @@ const PARSE_RANGE_HEADER = /\/(\d+)$/; const PARSE_GROUP_LOG_RANGE_HEADER = /^versions\s+(\d{1,10})-(\d{1,10})\/(\d{1,10})/; -const libsignalRemoteConfig = new Map(); -if (isRemoteConfigEnabled('desktop.libsignalNet.enforceMinimumTls')) { - log.info('libsignal net will require TLS 1.3'); - libsignalRemoteConfig.set('enforceMinimumTls', 'true'); -} -if (isRemoteConfigEnabled('desktop.libsignalNet.shadowUnauthChatWithNoise')) { - log.info('libsignal net will shadow unauth chat connections'); - libsignalRemoteConfig.set('shadowUnauthChatWithNoise', 'true'); -} -if (isRemoteConfigEnabled('desktop.libsignalNet.shadowAuthChatWithNoise')) { - log.info('libsignal net will shadow auth chat connections'); - libsignalRemoteConfig.set('shadowAuthChatWithNoise', 'true'); -} -const perMessageDeflateConfigKey = isProduction(version) - ? 'desktop.libsignalNet.chatPermessageDeflate.prod' - : 'desktop.libsignalNet.chatPermessageDeflate'; -if (isRemoteConfigEnabled(perMessageDeflateConfigKey)) { - libsignalRemoteConfig.set('chatPermessageDeflate', 'true'); -} -libsignalNet.setRemoteConfig(libsignalRemoteConfig); - const socketManager = new SocketManager(libsignalNet, { url: chatServiceUrl, certificateAuthority, @@ -1776,6 +1755,8 @@ export async function connect({ hasStoriesDisabled, hasBuildExpired, }: WebAPIConnectOptionsType): Promise { + bindRemoteConfigToLibsignalNet(getLibsignalNet(), window.getVersion()); + username = initialUsername; password = initialPassword; diff --git a/ts/types/Util.std.ts b/ts/types/Util.std.ts index 1b8f9657f2..1cd9f9211e 100644 --- a/ts/types/Util.std.ts +++ b/ts/types/Util.std.ts @@ -131,3 +131,32 @@ export type ExactKeys> = ? T : 'Error: Array has fields not present in object type' : 'Error: Object type has keys not present in array'; + +export type StripPrefix< + T extends string, + Prefix extends string, +> = T extends `${Prefix}${infer Rest}` ? Rest : T; + +export type AddPrefix< + T extends string, + Prefix extends string, +> = `${Prefix}${T}`; + +type Missing = Exclude; +type Extra = Exclude; + +export type AssertSameMembers = [ + Missing, +] extends [never] + ? [Extra] extends [never] + ? true + : { + error: 'Extra keys'; + extra: Extra; + } + : { + error: 'Missing keys'; + missing: Missing; + }; + +export type ArrayValues> = T[number]; diff --git a/ts/windows/main/preload_test.preload.ts b/ts/windows/main/preload_test.preload.ts index 776fb88bbd..a14650dfcb 100644 --- a/ts/windows/main/preload_test.preload.ts +++ b/ts/windows/main/preload_test.preload.ts @@ -14,12 +14,13 @@ import chaiAsPromised from 'chai-as-promised'; // eslint-disable-next-line import/no-extraneous-dependencies import { reporters, type MochaOptions } from 'mocha'; -import { initMessageCleanup } from '../../services/messageStateCleanup.preload.js'; import { initializeMessageCounter } from '../../util/incrementMessageCounter.preload.js'; import { initializeRedux } from '../../state/initializeRedux.preload.js'; import * as Stickers from '../../types/Stickers.preload.js'; import { ThemeType } from '../../types/Util.std.js'; import { itemStorage } from '../../textsecure/Storage.preload.js'; +import { MessageCache } from '../../services/MessageCache.preload.js'; +import { updateRemoteConfig } from '../../test-helpers/RemoteConfigStub.dom.js'; chai.use(chaiAsPromised); @@ -95,7 +96,10 @@ window.testUtilities = { }, async initialize() { - initMessageCleanup(); + // Since background.preload.ts is not loaded in tests, we need to do some minimal + // setup + MessageCache.install(); + await updateRemoteConfig([]); await initializeMessageCounter(); await Stickers.load(); diff --git a/ts/windows/main/start.preload.ts b/ts/windows/main/start.preload.ts index 777966abe4..b64eca120d 100644 --- a/ts/windows/main/start.preload.ts +++ b/ts/windows/main/start.preload.ts @@ -26,7 +26,6 @@ import type { import { cdsLookup, getSocketStatus } from '../../textsecure/WebAPI.preload.js'; import type { FeatureFlagType } from '../../window.d.ts'; import type { StorageAccessType } from '../../types/Storage.d.ts'; -import { initMessageCleanup } from '../../services/messageStateCleanup.preload.js'; import { calling } from '../../services/calling.preload.js'; import { Environment, getEnvironment } from '../../environment.std.js'; import { isProduction } from '../../util/version.std.js'; @@ -57,8 +56,6 @@ if (window.SignalContext.config.proxyUrl) { log.info('Using provided proxy url'); } -initMessageCleanup(); - if ( !isProduction(window.SignalContext.getVersion()) || window.SignalContext.config.devTools From c5c0d798fef72126a0a9d90b2881c6ba14d3cb78 Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Wed, 21 Jan 2026 13:14:08 -0600 Subject: [PATCH 34/49] Add warning when pinning disappearing message Co-authored-by: Jamie <113370520+jamiebuilds-signal@users.noreply.github.com> --- _locales/en/messages.json | 12 + ts/components/GlobalModalContainer.dom.tsx | 11 + .../conversation/Quote.dom.stories.tsx | 3 +- .../conversation/Timeline.dom.stories.tsx | 3 +- .../conversation/TimelineItem.dom.stories.tsx | 2 +- .../TimelineMessage.dom.stories.tsx | 3 +- .../conversation/TimelineMessage.dom.tsx | 62 ++- .../PinMessageDialog.dom.stories.tsx | 7 +- .../pinned-messages/PinMessageDialog.dom.tsx | 357 ++++++++++++------ ts/state/ducks/globalModals.preload.ts | 45 +++ ts/state/selectors/conversations.dom.ts | 10 + ts/state/selectors/globalModals.std.ts | 8 + ts/state/selectors/items.dom.ts | 7 + ts/state/selectors/message.preload.ts | 12 - .../smart/GlobalModalContainer.preload.tsx | 8 + ts/state/smart/PinMessageDialog.preload.tsx | 64 ++++ ts/state/smart/TimelineItem.preload.tsx | 4 +- ts/types/Storage.d.ts | 1 + 18 files changed, 444 insertions(+), 175 deletions(-) create mode 100644 ts/state/smart/PinMessageDialog.preload.tsx diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 9b2b40c730..9b9bf61857 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1650,6 +1650,18 @@ "messageformat": "Continue", "description": "Message > Context Menu > Pin Message (when at max pinned messages) > Dialog > Continue Button" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages", + "description": "Message > Context Menu > Pin Message (when pinning disappearing message) > Dialog > Title" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat.", + "description": "Message > Context Menu > Pin Message (when pinning disappearing message) > Dialog > Description" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay", + "description": "Message > Context Menu > Pin Message (when pinning disappearing message) > Dialog > Okay Button" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Pinned message} other {Pinned messages}}", "description": "Conversation > With pinned message(s) > Pinned messages bar > Accessibility label" diff --git a/ts/components/GlobalModalContainer.dom.tsx b/ts/components/GlobalModalContainer.dom.tsx index d910fde21a..0fead9d751 100644 --- a/ts/components/GlobalModalContainer.dom.tsx +++ b/ts/components/GlobalModalContainer.dom.tsx @@ -35,6 +35,7 @@ import type { SmartDraftGifMessageSendModalProps } from '../state/smart/DraftGif import { CriticalIdlePrimaryDeviceModal } from './CriticalIdlePrimaryDeviceModal.dom.js'; import { LowDiskSpaceBackupImportModal } from './LowDiskSpaceBackupImportModal.dom.js'; import { isUsernameValid } from '../util/Username.dom.js'; +import type { PinMessageDialogData } from '../state/smart/PinMessageDialog.preload.js'; // NOTE: All types should be required for this component so that the smart // component gives you type errors when adding/removing props. @@ -111,6 +112,9 @@ export type PropsType = { // MessageRequestActionsConfirmation messageRequestActionsConfirmationProps: MessageRequestActionsConfirmationPropsType | null; renderMessageRequestActionsConfirmation: () => React.JSX.Element; + // PinMessageDialog + pinMessageDialogData: PinMessageDialogData | null; + renderPinMessageDialog: () => React.JSX.Element; // NotePreviewModal notePreviewModalProps: { conversationId: string } | null; renderNotePreviewModal: () => React.JSX.Element; @@ -224,6 +228,9 @@ export function GlobalModalContainer({ // NotePreviewModal notePreviewModalProps, renderNotePreviewModal, + // PinMessageDialog + pinMessageDialogData, + renderPinMessageDialog, // SafetyNumberModal safetyNumberModalContactId, renderSafetyNumber, @@ -370,6 +377,10 @@ export function GlobalModalContainer({ return renderNotePreviewModal(); } + if (pinMessageDialogData) { + return renderPinMessageDialog(); + } + if (isProfileNameWarningModalVisible) { return renderProfileNameWarningModal(); } diff --git a/ts/components/conversation/Quote.dom.stories.tsx b/ts/components/conversation/Quote.dom.stories.tsx index 23c3ba653a..f44d1e2518 100644 --- a/ts/components/conversation/Quote.dom.stories.tsx +++ b/ts/components/conversation/Quote.dom.stories.tsx @@ -98,7 +98,6 @@ const defaultMessageProps: TimelineMessagesProps = { 'default--doubleCheckMissingQuoteReference' ), getPreferredBadge: () => undefined, - hasMaxPinnedMessages: false, i18n, platform: 'darwin', id: 'messageId', @@ -140,7 +139,7 @@ const defaultMessageProps: TimelineMessagesProps = { shouldCollapseBelow: false, shouldHideMetadata: false, showSpoiler: action('showSpoiler'), - onPinnedMessageAdd: action('onPinnedMessageAdd'), + showPinMessageDialog: action('showPinMessageDialog'), onPinnedMessageRemove: action('onPinnedMessageRemove'), pushPanelForConversation: action('default--pushPanelForConversation'), showContactModal: action('default--showContactModal'), diff --git a/ts/components/conversation/Timeline.dom.stories.tsx b/ts/components/conversation/Timeline.dom.stories.tsx index 5ecf7f81c8..ad113b3b21 100644 --- a/ts/components/conversation/Timeline.dom.stories.tsx +++ b/ts/components/conversation/Timeline.dom.stories.tsx @@ -58,7 +58,6 @@ function mockMessageTimelineItem( direction: 'incoming', status: 'sent', text: 'Hello there from the new world!', - hasMaxPinnedMessages: false, isBlocked: false, isMessageRequestAccepted: true, isPinned: false, @@ -307,7 +306,7 @@ const actions = () => ({ doubleCheckMissingQuoteReference: action('doubleCheckMissingQuoteReference'), openGiftBadge: action('openGiftBadge'), - onPinnedMessageAdd: action('onPinnedMessageAdd'), + showPinMessageDialog: action('showPinMessageDialog'), onPinnedMessageRemove: action('onPinnedMessageRemove'), scrollToPinnedMessage: action('scrollToPinnedMessage'), scrollToPollMessage: action('scrollToPollMessage'), diff --git a/ts/components/conversation/TimelineItem.dom.stories.tsx b/ts/components/conversation/TimelineItem.dom.stories.tsx index a1bd8551fa..ed0520e2b4 100644 --- a/ts/components/conversation/TimelineItem.dom.stories.tsx +++ b/ts/components/conversation/TimelineItem.dom.stories.tsx @@ -70,7 +70,7 @@ const getDefaultProps = () => ({ openGiftBadge: action('openGiftBadge'), saveAttachment: action('saveAttachment'), saveAttachments: action('saveAttachments'), - onPinnedMessageAdd: action('onPinnedMessageAdd'), + showPinMessageDialog: action('showPinMessageDialog'), onPinnedMessageRemove: action('onPinnedMessageRemove'), onOpenEditNicknameAndNoteModal: action('onOpenEditNicknameAndNoteModal'), onOutgoingAudioCallInConversation: action( diff --git a/ts/components/conversation/TimelineMessage.dom.stories.tsx b/ts/components/conversation/TimelineMessage.dom.stories.tsx index 417b7c0190..fafb468df7 100644 --- a/ts/components/conversation/TimelineMessage.dom.stories.tsx +++ b/ts/components/conversation/TimelineMessage.dom.stories.tsx @@ -265,7 +265,6 @@ const createProps = (overrideProps: Partial = {}): Props => ({ expirationTimestamp: overrideProps.expirationTimestamp ?? 0, getPreferredBadge: overrideProps.getPreferredBadge || (() => undefined), giftBadge: overrideProps.giftBadge, - hasMaxPinnedMessages: false, i18n, platform: 'darwin', id: overrideProps.id ?? 'random-message-id', @@ -300,7 +299,7 @@ const createProps = (overrideProps: Partial = {}): Props => ({ messageExpanded: action('messageExpanded'), showConversation: action('showConversation'), openGiftBadge: action('openGiftBadge'), - onPinnedMessageAdd: action('onPinnedMessageAdd'), + showPinMessageDialog: action('showPinMessageDialog'), onPinnedMessageRemove: action('onPinnedMessageRemove'), previews: overrideProps.previews || [], quote: overrideProps.quote || undefined, diff --git a/ts/components/conversation/TimelineMessage.dom.tsx b/ts/components/conversation/TimelineMessage.dom.tsx index 7fbb9be613..4c3a459d59 100644 --- a/ts/components/conversation/TimelineMessage.dom.tsx +++ b/ts/components/conversation/TimelineMessage.dom.tsx @@ -36,8 +36,6 @@ import { useGroupedAndOrderedReactions } from '../../util/groupAndOrderReactions import { isNotNil } from '../../util/isNotNil.std.js'; import type { AxoMenuBuilder } from '../../axo/AxoMenuBuilder.dom.js'; import { AxoContextMenu } from '../../axo/AxoContextMenu.dom.js'; -import { PinMessageDialog } from './pinned-messages/PinMessageDialog.dom.js'; -import type { DurationInSeconds } from '../../util/durations/duration-in-seconds.std.js'; import { useDocumentKeyDown } from '../../hooks/useDocumentKeyDown.dom.js'; const { useAxoContextMenuOutsideKeyboardTrigger } = AxoContextMenu; @@ -55,16 +53,11 @@ export type PropsData = { canReact: boolean; canReply: boolean; canPinMessage: boolean; - hasMaxPinnedMessages: boolean; selectedReaction?: string; isTargeted?: boolean; } & Omit; export type PropsActions = { - onPinnedMessageAdd: ( - messageId: string, - duration: DurationInSeconds | null - ) => void; onPinnedMessageRemove: (messageId: string) => void; pushPanelForConversation: PushPanelForConversationActionType; toggleDeleteMessagesModal: (props: DeleteMessagesPropsType) => void; @@ -89,6 +82,10 @@ export type PropsActions = { shift: boolean, selected: boolean ) => void; + showPinMessageDialog: ( + messageId: string, + isPinningDisappearingMessage: boolean + ) => void; } & Omit; export type Props = PropsData & @@ -119,7 +116,6 @@ export function TimelineMessage(props: Props): React.JSX.Element { containerWidthBreakpoint, conversationId, direction, - hasMaxPinnedMessages, i18n, id, interactivity, @@ -128,7 +124,7 @@ export function TimelineMessage(props: Props): React.JSX.Element { kickOffAttachmentDownload, copyMessageText, endPoll, - onPinnedMessageAdd, + expirationLength, onPinnedMessageRemove, pushPanelForConversation, reactToMessage, @@ -138,6 +134,7 @@ export function TimelineMessage(props: Props): React.JSX.Element { saveAttachment, saveAttachments, showAttachmentDownloadStillInProgressToast, + showPinMessageDialog, selectedReaction, setQuoteByMessageId, setMessageToEdit, @@ -151,7 +148,6 @@ export function TimelineMessage(props: Props): React.JSX.Element { const [reactionPickerRoot, setReactionPickerRoot] = useState< HTMLDivElement | undefined >(undefined); - const [pinMessageDialogOpen, setPinMessageDialogOpen] = useState(false); const isWindowWidthNotNarrow = containerWidthBreakpoint !== WidthBreakpoint.Narrow; @@ -286,17 +282,11 @@ export function TimelineMessage(props: Props): React.JSX.Element { } }, [canReact, toggleReactionPicker]); - const handleOpenPinMessageDialog = useCallback(() => { - setPinMessageDialogOpen(true); - }, []); + const isDisappearingMessage = expirationLength != null; - const handlePinnedMessageAdd = useCallback( - (messageId: string, duration: DurationInSeconds | null) => { - onPinnedMessageAdd(messageId, duration); - setPinMessageDialogOpen(false); - }, - [onPinnedMessageAdd] - ); + const handleOpenPinMessageDialog = useCallback(() => { + showPinMessageDialog(id, isDisappearingMessage); + }, [showPinMessageDialog, id, isDisappearingMessage]); const handleUnpinMessage = useCallback(() => { onPinnedMessageRemove(id); @@ -478,27 +468,17 @@ export function TimelineMessage(props: Props): React.JSX.Element { const handleWrapperKeyDown = useAxoContextMenuOutsideKeyboardTrigger(); return ( - <> - { - toggleSelectMessage(conversationId, id, shift, selected); - }} - onReplyToMessage={handleReplyToMessage} - onWrapperKeyDown={handleWrapperKeyDown} - /> - - + { + toggleSelectMessage(conversationId, id, shift, selected); + }} + onReplyToMessage={handleReplyToMessage} + onWrapperKeyDown={handleWrapperKeyDown} + /> ); } diff --git a/ts/components/conversation/pinned-messages/PinMessageDialog.dom.stories.tsx b/ts/components/conversation/pinned-messages/PinMessageDialog.dom.stories.tsx index 3330938d8a..6e86d86b38 100644 --- a/ts/components/conversation/pinned-messages/PinMessageDialog.dom.stories.tsx +++ b/ts/components/conversation/pinned-messages/PinMessageDialog.dom.stories.tsx @@ -20,7 +20,12 @@ export function Default(): React.JSX.Element { onOpenChange={setOpen} messageId="42" onPinnedMessageAdd={action('onPinnedMessageAdd')} - hasMaxPinnedMessages={false} + hasMaxPinnedMessages + isPinningDisappearingMessage + seenPinMessageDisappearingMessagesWarningCount={0} + onSeenPinMessageDisappearingMessagesWarning={action( + 'onSeenPinMessageDisappearingMessagesWarning' + )} /> ); } diff --git a/ts/components/conversation/pinned-messages/PinMessageDialog.dom.tsx b/ts/components/conversation/pinned-messages/PinMessageDialog.dom.tsx index 6608951dcf..2f5619c379 100644 --- a/ts/components/conversation/pinned-messages/PinMessageDialog.dom.tsx +++ b/ts/components/conversation/pinned-messages/PinMessageDialog.dom.tsx @@ -1,7 +1,7 @@ // Copyright 2025 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import type { MouseEvent } from 'react'; -import React, { memo, useCallback, useState } from 'react'; +import React, { memo, useCallback, useMemo, useState } from 'react'; import { AxoDialog } from '../../../axo/AxoDialog.dom.js'; import type { LocalizerType } from '../../../types/I18N.std.js'; import { AxoRadioGroup } from '../../../axo/AxoRadioGroup.dom.js'; @@ -26,6 +26,13 @@ const DURATION_OPTIONS: Record = { [DurationOption.DEBUG_10_SECONDS]: DurationInSeconds.fromSeconds(10), }; +enum Step { + CLOSED, + CONFIRM_REPLACE_OLDEST_PIN, + SELECT_PIN_DURATION, + DISAPPEARING_MESSAGES_WARNING, +} + function isValidDurationOption(value: string): value is DurationOption { return Object.hasOwn(DURATION_OPTIONS, value); } @@ -36,6 +43,9 @@ export type PinMessageDialogProps = Readonly<{ onOpenChange: (open: boolean) => void; messageId: string; hasMaxPinnedMessages: boolean; + isPinningDisappearingMessage: boolean; + seenPinMessageDisappearingMessagesWarningCount: number; + onSeenPinMessageDisappearingMessagesWarning: () => void; onPinnedMessageAdd: ( messageId: string, duration: DurationInSeconds | null @@ -45,8 +55,31 @@ export type PinMessageDialogProps = Readonly<{ export const PinMessageDialog = memo(function PinMessageDialog( props: PinMessageDialogProps ) { - const { i18n, messageId, onPinnedMessageAdd, onOpenChange } = props; - const [duration, setDuration] = useState(DurationOption.TIME_7_DAYS); + const { + i18n, + onOpenChange, + messageId, + hasMaxPinnedMessages, + isPinningDisappearingMessage, + onPinnedMessageAdd, + seenPinMessageDisappearingMessagesWarningCount, + onSeenPinMessageDisappearingMessagesWarning, + } = props; + + const needsConfirmReplaceOldestPin = useMemo(() => { + return hasMaxPinnedMessages; + }, [hasMaxPinnedMessages]); + const needsConfirmDisappearingMessages = useMemo(() => { + return ( + isPinningDisappearingMessage && + seenPinMessageDisappearingMessagesWarningCount <= 3 + ); + }, [ + isPinningDisappearingMessage, + seenPinMessageDisappearingMessagesWarningCount, + ]); + + const [duration, setDuration] = useState(null); const [confirmedReplaceOldestPin, setConfirmedReplaceOldestPin] = useState(false); @@ -54,132 +87,232 @@ export const PinMessageDialog = memo(function PinMessageDialog( (open: boolean) => { onOpenChange(open); // reset state + setDuration(null); setConfirmedReplaceOldestPin(false); - setDuration(DurationOption.TIME_7_DAYS); }, [onOpenChange] ); - const handleConfirmReplaceOldestPin = useCallback((event: MouseEvent) => { - event.preventDefault(); + const submit = useCallback(() => { + strictAssert( + duration != null, + 'Duration should not be null when submitting' + ); + const durationValue = DURATION_OPTIONS[duration]; + onPinnedMessageAdd(messageId, durationValue); + handleOpenChange(false); + }, [onPinnedMessageAdd, messageId, duration, handleOpenChange]); + + const handleConfirmReplaceOldestPin = useCallback(() => { setConfirmedReplaceOldestPin(true); }, []); - const handleValueChange = useCallback((value: string) => { + const handleSelectDuration = useCallback( + (selected: DurationOption) => { + setDuration(selected); + if (!needsConfirmDisappearingMessages) { + submit(); + } + }, + [needsConfirmDisappearingMessages, submit] + ); + + const handleConfirmDisappearingMessages = useCallback(() => { + onSeenPinMessageDisappearingMessagesWarning(); + submit(); + }, [onSeenPinMessageDisappearingMessagesWarning, submit]); + + let step: Step; + if (!props.open) { + step = Step.CLOSED; + } else if (needsConfirmReplaceOldestPin && !confirmedReplaceOldestPin) { + step = Step.CONFIRM_REPLACE_OLDEST_PIN; + } else if (duration == null) { + step = Step.SELECT_PIN_DURATION; + } else if (needsConfirmDisappearingMessages) { + step = Step.DISAPPEARING_MESSAGES_WARNING; + } else { + step = Step.CLOSED; + } + + return ( + <> + + + + + ); +}); + +function PinMessageConfirmReplacePinDialog(props: { + i18n: LocalizerType; + open: boolean; + onOpenChange: (open: boolean) => void; + onConfirmReplaceOldestPin: () => void; +}) { + const { i18n, onConfirmReplaceOldestPin } = props; + const handleConfirmReplaceOldestPin = useCallback( + (event: MouseEvent) => { + event.preventDefault(); + onConfirmReplaceOldestPin(); + }, + [onConfirmReplaceOldestPin] + ); + return ( + + + + + {i18n('icu:PinMessageDialog--HasMaxPinnedMessages__Title')} + + + {i18n('icu:PinMessageDialog--HasMaxPinnedMessages__Description')} + + + + + {i18n('icu:PinMessageDialog--HasMaxPinnedMessages__Cancel')} + + + {i18n('icu:PinMessageDialog--HasMaxPinnedMessages__Continue')} + + + + + ); +} + +function PinMessageSelectDurationDialog(props: { + i18n: LocalizerType; + open: boolean; + onOpenChange: (open: boolean) => void; + onSelectDuration: (duration: DurationOption) => void; +}) { + const { i18n, onOpenChange, onSelectDuration } = props; + const [duration, setDuration] = useState(DurationOption.TIME_7_DAYS); + + const handleDurationChange = useCallback((value: string) => { strictAssert(isValidDurationOption(value), `Invalid option: ${value}`); setDuration(value); }, []); const handleCancel = useCallback(() => { - handleOpenChange(false); - }, [handleOpenChange]); + onOpenChange(false); + }, [onOpenChange]); - const handlePinnedMessageAdd = useCallback(() => { - const durationValue = DURATION_OPTIONS[duration]; - onPinnedMessageAdd(messageId, durationValue); - }, [duration, onPinnedMessageAdd, messageId]); - - const showConfirmReplaceOldestPin = - props.hasMaxPinnedMessages && !confirmedReplaceOldestPin; + const handleConfirm = useCallback(() => { + onSelectDuration(duration); + }, [duration, onSelectDuration]); return ( - <> - + - - - - {i18n('icu:PinMessageDialog--HasMaxPinnedMessages__Title')} - - - {i18n('icu:PinMessageDialog--HasMaxPinnedMessages__Description')} - - - - - {i18n('icu:PinMessageDialog--HasMaxPinnedMessages__Cancel')} - - - {i18n('icu:PinMessageDialog--HasMaxPinnedMessages__Continue')} - - - - - - - - - - {i18n('icu:PinMessageDialog__Title')} - - - - - - - - - {i18n('icu:PinMessageDialog__Option--TIME_24_HOURS')} - - - - - - {i18n('icu:PinMessageDialog__Option--TIME_7_DAYS')} - - - - - - {i18n('icu:PinMessageDialog__Option--TIME_30_DAYS')} - - - + + + {i18n('icu:PinMessageDialog__Title')} + + + + + + + + + {i18n('icu:PinMessageDialog__Option--TIME_24_HOURS')} + + + + + + {i18n('icu:PinMessageDialog__Option--TIME_7_DAYS')} + + + + + + {i18n('icu:PinMessageDialog__Option--TIME_30_DAYS')} + + + + + + {i18n('icu:PinMessageDialog__Option--FOREVER')} + + + {isInternalFeaturesEnabled() && ( + - - {i18n('icu:PinMessageDialog__Option--FOREVER')} - + 10 seconds (Internal) - {isInternalFeaturesEnabled() && ( - - - - 10 seconds (Internal) - - - )} - - - - - - {i18n('icu:PinMessageDialog__Cancel')} - - - {i18n('icu:PinMessageDialog__Pin')} - - - - - - + )} + + + + + + {i18n('icu:PinMessageDialog__Cancel')} + + + {i18n('icu:PinMessageDialog__Pin')} + + + + + ); -}); +} + +function PinMessageDisappearingMessagesWarningDialog(props: { + i18n: LocalizerType; + open: boolean; + onOpenChange: (open: boolean) => void; + onConfirm: () => void; +}) { + const { i18n } = props; + return ( + + + + + {i18n('icu:PinMessageDisappearingMessagesWarningDialog__Title')} + + + {i18n( + 'icu:PinMessageDisappearingMessagesWarningDialog__Description' + )} + + + + + {i18n('icu:PinMessageDisappearingMessagesWarningDialog__Okay')} + + + + + ); +} diff --git a/ts/state/ducks/globalModals.preload.ts b/ts/state/ducks/globalModals.preload.ts index 200cabdc70..d49924b182 100644 --- a/ts/state/ducks/globalModals.preload.ts +++ b/ts/state/ducks/globalModals.preload.ts @@ -48,6 +48,7 @@ import type { MessageForwardDraft } from '../../types/ForwardDraft.std.js'; import { hydrateRanges } from '../../util/BodyRange.node.js'; import { getConversationSelector, + getHasMaxPinnedMessages, type GetConversationByIdType, } from '../selectors/conversations.dom.js'; import { missingCaseError } from '../../util/missingCaseError.std.js'; @@ -62,6 +63,8 @@ import type { DataPropsType as TapToViewNotAvailablePropsType } from '../../comp import type { DataPropsType as BackfillFailureModalPropsType } from '../../components/BackfillFailureModal.dom.js'; import type { SmartDraftGifMessageSendModalProps } from '../smart/DraftGifMessageSendModal.preload.js'; import { onCriticalIdlePrimaryDeviceModalDismissed } from '../../util/handleServerAlerts.preload.js'; +import type { PinMessageDialogData } from '../smart/PinMessageDialog.preload.js'; +import type { StateThunk } from '../types.std.js'; const log = createLogger('globalModals'); @@ -146,6 +149,7 @@ export type GlobalModalsStateType = ReadonlyDeep<{ } | null; messageRequestActionsConfirmationProps: MessageRequestActionsConfirmationPropsType | null; notePreviewModalProps: NotePreviewModalPropsType | null; + pinMessageDialogData: PinMessageDialogData | null; usernameOnboardingState: UsernameOnboardingState; mediaPermissionsModalProps?: { mediaType: 'camera' | 'microphone'; @@ -233,6 +237,7 @@ const SHOW_LOW_DISK_SPACE_BACKUP_IMPORT_MODAL = 'globalModals/SHOW_LOW_DISK_SPACE_BACKUP_IMPORT_MODAL'; const HIDE_LOW_DISK_SPACE_BACKUP_IMPORT_MODAL = 'globalModals/HIDE_LOW_DISK_SPACE_BACKUP_IMPORT_MODAL'; +const TOGGLE_PIN_MESSAGE_DIALOG = 'globalModals/TOGGLE_PIN_MESSAGE_DIALOG'; export type ContactModalStateType = ReadonlyDeep<{ contactId: string; @@ -500,6 +505,11 @@ type CloseEditHistoryModalActionType = ReadonlyDeep<{ type: typeof CLOSE_EDIT_HISTORY_MODAL; }>; +type TogglePinMessageDialogActionType = ReadonlyDeep<{ + type: typeof TOGGLE_PIN_MESSAGE_DIALOG; + payload: PinMessageDialogData | null; +}>; + export type GlobalModalsActionType = ReadonlyDeep< | CloseEditHistoryModalActionType | CloseDebugLogErrorModalActionType @@ -555,6 +565,7 @@ export type GlobalModalsActionType = ReadonlyDeep< | ToggleSafetyNumberModalActionType | ToggleSignalConnectionsModalActionType | ToggleUsernameOnboardingActionType + | TogglePinMessageDialogActionType >; // Action Creators @@ -612,6 +623,8 @@ export const actions = { toggleSafetyNumberModal, toggleSignalConnectionsModal, toggleUsernameOnboarding, + showPinMessageDialog, + hidePinMessageDialog, }; export const useGlobalModalActions = (): BoundActionCreatorsMapObject< @@ -1335,6 +1348,30 @@ function copyOverMessageAttributesIntoForwardMessages( }); } +function showPinMessageDialog( + messageId: string, + isPinningDisappearingMessage: boolean +): StateThunk { + return async (dispatch, getState) => { + const hasMaxPinnedMessages = getHasMaxPinnedMessages(getState()); + dispatch({ + type: TOGGLE_PIN_MESSAGE_DIALOG, + payload: { + messageId, + hasMaxPinnedMessages, + isPinningDisappearingMessage, + }, + }); + }; +} + +function hidePinMessageDialog(): TogglePinMessageDialogActionType { + return { + type: TOGGLE_PIN_MESSAGE_DIALOG, + payload: null, + }; +} + // Reducer export function getEmptyState(): GlobalModalsStateType { @@ -1360,6 +1397,7 @@ export function getEmptyState(): GlobalModalsStateType { messageRequestActionsConfirmationProps: null, tapToViewNotAvailableModalProps: undefined, notePreviewModalProps: null, + pinMessageDialogData: null, }; } @@ -1805,5 +1843,12 @@ export function reducer( }; } + if (action.type === TOGGLE_PIN_MESSAGE_DIALOG) { + return { + ...state, + pinMessageDialogData: action.payload, + }; + } + return state; } diff --git a/ts/state/selectors/conversations.dom.ts b/ts/state/selectors/conversations.dom.ts index 922c5300e3..e7c1bb9655 100644 --- a/ts/state/selectors/conversations.dom.ts +++ b/ts/state/selectors/conversations.dom.ts @@ -90,6 +90,7 @@ import type { AllChatFoldersMutedStats } from '../../util/countMutedStats.std.js import { countAllChatFoldersMutedStats } from '../../util/countMutedStats.std.js'; import { getActiveProfile } from './notificationProfiles.dom.js'; import type { PinnedMessage } from '../../types/PinnedMessage.std.js'; +import { getPinnedMessagesLimit } from '../../util/pinnedMessages.dom.js'; const { isNumber, pick } = lodash; @@ -338,6 +339,15 @@ export const getPinnedMessagesMessageIds: StateSelector> = }); }); +export const getHasMaxPinnedMessages: StateSelector = createSelector( + getPinnedMessages, + pinnedMessages => { + const pinnedMessagesLimit = getPinnedMessagesLimit(); + const pinnedMessagesCount = pinnedMessages.length; + return pinnedMessagesCount >= pinnedMessagesLimit; + } +); + const collator = new Intl.Collator(); // Note: we will probably want to put i18n and regionCode back when we are formatting diff --git a/ts/state/selectors/globalModals.std.ts b/ts/state/selectors/globalModals.std.ts index f757c487fd..820d4d5a28 100644 --- a/ts/state/selectors/globalModals.std.ts +++ b/ts/state/selectors/globalModals.std.ts @@ -6,6 +6,8 @@ import { createSelector } from 'reselect'; import type { StateType } from '../reducer.preload.js'; import type { GlobalModalsStateType } from '../ducks/globalModals.preload.js'; import { UsernameOnboardingState } from '../../types/globalModals.std.js'; +import type { StateSelector } from '../types.std.js'; +import type { PinMessageDialogData } from '../smart/PinMessageDialog.preload.js'; export const getGlobalModalsState = (state: StateType): GlobalModalsStateType => state.globalModals; @@ -92,3 +94,9 @@ export const getNotePreviewModalProps = createSelector( getGlobalModalsState, ({ notePreviewModalProps }) => notePreviewModalProps ); + +export const getPinMessageDialogData: StateSelector = + createSelector( + getGlobalModalsState, + ({ pinMessageDialogData }) => pinMessageDialogData + ); diff --git a/ts/state/selectors/items.dom.ts b/ts/state/selectors/items.dom.ts index 45109d4e66..82c1e37246 100644 --- a/ts/state/selectors/items.dom.ts +++ b/ts/state/selectors/items.dom.ts @@ -23,6 +23,7 @@ import { isValidEmojiSkinTone, } from '../../components/fun/data/emojis.std.js'; import { BackupLevel } from '../../services/backups/types.std.js'; +import type { StateSelector } from '../types.std.js'; const DEFAULT_PREFERRED_LEFT_PANE_WIDTH = 320; @@ -307,3 +308,9 @@ export const getServerAlerts = createSelector( getItems, (state: ItemsStateType) => state.serverAlerts ?? {} ); + +export const getSeenPinMessageDisappearingMessagesWarningCount: StateSelector = + createSelector( + getItems, + state => state.seenPinMessageDisappearingMessagesWarningCount ?? 0 + ); diff --git a/ts/state/selectors/message.preload.ts b/ts/state/selectors/message.preload.ts index 128f71d4dc..1abf3870bc 100644 --- a/ts/state/selectors/message.preload.ts +++ b/ts/state/selectors/message.preload.ts @@ -170,7 +170,6 @@ import type { MessageRequestResponseNotificationData } from '../../components/co import type { PinnedMessageNotificationData } from '../../components/conversation/pinned-messages/PinnedMessageNotification.dom.js'; import { canEditGroupInfo } from '../../util/canEditGroupInfo.preload.js'; import { isPinnedMessagesSendEnabled } from '../../util/isPinnedMessagesEnabled.dom.js'; -import { getPinnedMessagesLimit } from '../../util/pinnedMessages.dom.js'; const { groupBy, isEmpty, isNumber, isObject, map } = lodash; @@ -967,9 +966,6 @@ export const getPropsForMessage = ( expirationStartTimestamp, }), giftBadge: message.giftBadge, - hasMaxPinnedMessages: getHasMaxPinnedMessages( - options.pinnedMessagesMessageIds ?? [] - ), poll: getPollForMessage(message, { conversationSelector: options.conversationSelector, ourConversationId, @@ -2427,14 +2423,6 @@ export function canPinMessage( return true; } -function getHasMaxPinnedMessages( - pinnedMessagesMessageIds: ReadonlyArray -) { - const pinnedMessagesLimit = getPinnedMessagesLimit(); - const pinnedMessagesCount = pinnedMessagesMessageIds.length; - return pinnedMessagesCount >= pinnedMessagesLimit; -} - export function getLastChallengeError( message: Pick ): ShallowChallengeError | undefined { diff --git a/ts/state/smart/GlobalModalContainer.preload.tsx b/ts/state/smart/GlobalModalContainer.preload.tsx index d525c5be71..a8180ad7ee 100644 --- a/ts/state/smart/GlobalModalContainer.preload.tsx +++ b/ts/state/smart/GlobalModalContainer.preload.tsx @@ -39,6 +39,7 @@ import { shouldShowPlaintextWorkflow, shouldShowLocalBackupWorkflow, } from '../selectors/backups.std.js'; +import { SmartPinMessageDialog } from './PinMessageDialog.preload.js'; function renderCallLinkAddNameModal(): React.JSX.Element { return ; @@ -100,6 +101,10 @@ function renderNotePreviewModal(): React.JSX.Element { return ; } +function renderPinMessageDialog(): React.JSX.Element { + return ; +} + function renderPlaintextExportWorkflow(): React.JSX.Element { return ; } @@ -160,6 +165,7 @@ export const SmartGlobalModalContainer = memo( mediaPermissionsModalProps, messageRequestActionsConfirmationProps, notePreviewModalProps, + pinMessageDialogData, isProfileNameWarningModalVisible, profileNameWarningModalConversationType, isShortcutGuideModalVisible, @@ -278,6 +284,7 @@ export const SmartGlobalModalContainer = memo( closeMediaPermissionsModal={closeMediaPermissionsModal} openSystemMediaPermissions={window.IPC.openSystemMediaPermissions} notePreviewModalProps={notePreviewModalProps} + pinMessageDialogData={pinMessageDialogData} hasSafetyNumberChangeModal={hasSafetyNumberChangeModal} hideBackfillFailureModal={hideBackfillFailureModal} hideUserNotFoundModal={hideUserNotFoundModal} @@ -310,6 +317,7 @@ export const SmartGlobalModalContainer = memo( renderMessageRequestActionsConfirmation } renderNotePreviewModal={renderNotePreviewModal} + renderPinMessageDialog={renderPinMessageDialog} renderPlaintextExportWorkflow={renderPlaintextExportWorkflow} renderLocalBackupExportWorkflow={renderLocalBackupExportWorkflow} renderProfileNameWarningModal={renderProfileNameWarningModal} diff --git a/ts/state/smart/PinMessageDialog.preload.tsx b/ts/state/smart/PinMessageDialog.preload.tsx new file mode 100644 index 0000000000..0e7c0508d0 --- /dev/null +++ b/ts/state/smart/PinMessageDialog.preload.tsx @@ -0,0 +1,64 @@ +// Copyright 2026 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only +import React, { memo, useCallback } from 'react'; +import { useSelector } from 'react-redux'; +import { getIntl } from '../selectors/user.std.js'; +import { useConversationsActions } from '../ducks/conversations.preload.js'; +import { PinMessageDialog } from '../../components/conversation/pinned-messages/PinMessageDialog.dom.js'; +import { useItemsActions } from '../ducks/items.preload.js'; +import { getSeenPinMessageDisappearingMessagesWarningCount } from '../selectors/items.dom.js'; +import { getPinMessageDialogData } from '../selectors/globalModals.std.js'; +import { useGlobalModalActions } from '../ducks/globalModals.preload.js'; + +export type PinMessageDialogData = Readonly<{ + messageId: string; + hasMaxPinnedMessages: boolean; + isPinningDisappearingMessage: boolean; +}>; + +export const SmartPinMessageDialog = memo(function SmartPinMessageDialog() { + const i18n = useSelector(getIntl); + const pinMessageDialogData = useSelector(getPinMessageDialogData); + const { hidePinMessageDialog } = useGlobalModalActions(); + const { onPinnedMessageAdd } = useConversationsActions(); + + const seenPinMessageDisappearingMessagesWarningCount = useSelector( + getSeenPinMessageDisappearingMessagesWarningCount + ); + const { putItem } = useItemsActions(); + + const handleClose = useCallback(() => { + hidePinMessageDialog(); + }, [hidePinMessageDialog]); + + const handleSeenPinMessageDisappearingMessagesWarning = useCallback(() => { + putItem( + 'seenPinMessageDisappearingMessagesWarningCount', + seenPinMessageDisappearingMessagesWarningCount + 1 + ); + }, [putItem, seenPinMessageDisappearingMessagesWarningCount]); + + if (pinMessageDialogData == null) { + return null; + } + + return ( + + ); +}); diff --git a/ts/state/smart/TimelineItem.preload.tsx b/ts/state/smart/TimelineItem.preload.tsx index ded3878b03..aec19438ab 100644 --- a/ts/state/smart/TimelineItem.preload.tsx +++ b/ts/state/smart/TimelineItem.preload.tsx @@ -131,7 +131,6 @@ export const SmartTimelineItem = memo(function SmartTimelineItem( kickOffAttachmentDownload, markAttachmentAsCorrupted, messageExpanded, - onPinnedMessageAdd, onPinnedMessageRemove, openGiftBadge, pushPanelForConversation, @@ -164,6 +163,7 @@ export const SmartTimelineItem = memo(function SmartTimelineItem( const { showContactModal, showEditHistoryModal, + showPinMessageDialog, showTapToViewNotAvailableModal, toggleMessageRequestActionsConfirmation, toggleDeleteMessagesModal, @@ -239,7 +239,7 @@ export const SmartTimelineItem = memo(function SmartTimelineItem( } onOutgoingAudioCallInConversation={onOutgoingAudioCallInConversation} onOutgoingVideoCallInConversation={onOutgoingVideoCallInConversation} - onPinnedMessageAdd={onPinnedMessageAdd} + showPinMessageDialog={showPinMessageDialog} onPinnedMessageRemove={onPinnedMessageRemove} scrollToPinnedMessage={scrollToPinnedMessage} retryDeleteForEveryone={retryDeleteForEveryone} diff --git a/ts/types/Storage.d.ts b/ts/types/Storage.d.ts index e0ba414662..c2c8328f4e 100644 --- a/ts/types/Storage.d.ts +++ b/ts/types/Storage.d.ts @@ -117,6 +117,7 @@ export type StorageAccessType = { sessionResets: SessionResetsType; showStickerPickerHint: boolean; showStickersIntroduction: boolean; + seenPinMessageDisappearingMessagesWarningCount: number; signedKeyId: number; signedKeyIdPNI: number; signedKeyUpdateTime: number; From 1a09c683c667476c685244b84c63cf2461e0bd00 Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Wed, 21 Jan 2026 13:24:40 -0600 Subject: [PATCH 35/49] Fixes for unpin sync message Co-authored-by: Jamie <113370520+jamiebuilds-signal@users.noreply.github.com> --- .../helpers/createSendMessageJob.preload.ts | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/ts/jobs/helpers/createSendMessageJob.preload.ts b/ts/jobs/helpers/createSendMessageJob.preload.ts index 1f69aa7748..50865b6d09 100644 --- a/ts/jobs/helpers/createSendMessageJob.preload.ts +++ b/ts/jobs/helpers/createSendMessageJob.preload.ts @@ -20,7 +20,6 @@ import { handleMultipleSendErrors, maybeExpandErrors, } from './handleMultipleSendErrors.std.js'; -import { itemStorage } from '../../textsecure/Storage.preload.js'; export type SendMessageJobOptions = Readonly<{ sendName: string; // ex: 'sendExampleMessage' @@ -58,14 +57,17 @@ export function createSendMessageJob( return; } - const { recipientServiceIdsWithoutMe, untrustedServiceIds } = - getSendRecipientLists({ - log, - conversation, - conversationIds: isSyncOnly(data) - ? [window.ConversationController.getOurConversationIdOrThrow()] - : Array.from(conversation.getMemberConversationIds()), - }); + const { + allRecipientServiceIds, + recipientServiceIdsWithoutMe, + untrustedServiceIds, + } = getSendRecipientLists({ + log, + conversation, + conversationIds: isSyncOnly(data) + ? [window.ConversationController.getOurConversationIdOrThrow()] + : Array.from(conversation.getMemberConversationIds()), + }); if (untrustedServiceIds.length > 0) { window.reduxActions.conversations.conversationStoppedByMissingVerification( @@ -90,25 +92,29 @@ export function createSendMessageJob( try { if (recipientServiceIdsWithoutMe.length === 0) { - const sendOptions = await getSendOptions(conversation.attributes, { + const ourConversation = + window.ConversationController.getOurConversationOrThrow(); + const sendOptions = await getSendOptions(ourConversation.attributes, { syncMessage: true, }); // Only sending a sync to ourselves await conversation.queueJob( `conversationQueue/${sendName}/sync`, async () => { - const ourAci = itemStorage.user.getCheckedAci(); const encodedDataMessage = await job.messaging.getDataOrEditMessage( { ...messageOptions, - recipients: [ourAci], + groupV2: conversation.getGroupV2Info({ + members: recipientServiceIdsWithoutMe, + }), + recipients: allRecipientServiceIds, } ); return handleMessageSend( job.messaging.sendSyncMessage({ encodedDataMessage, - timestamp: job.timestamp, + timestamp: messageOptions.timestamp, destinationE164: conversation.get('e164'), destinationServiceId: conversation.getServiceId(), expirationStartTimestamp, @@ -152,7 +158,7 @@ export function createSendMessageJob( }); }, sendType, - timestamp: job.timestamp, + timestamp: messageOptions.timestamp, expirationStartTimestamp, }); } @@ -189,7 +195,7 @@ export function createSendMessageJob( }); }, sendType, - timestamp: job.timestamp, + timestamp: messageOptions.timestamp, expirationStartTimestamp, }); } From a5ff95fb760f0a56afdc7f8f0aa2a1672af68cc4 Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Wed, 21 Jan 2026 13:24:57 -0600 Subject: [PATCH 36/49] Add diagnostic information window to Call Quality Survey Co-authored-by: yash-signal --- _locales/en/messages.json | 12 ++ app/main.main.ts | 107 ++++++++++++++++++ call_diagnostic.html | 25 ++++ scripts/esbuild.js | 8 ++ ts/components/CallDiagnosticWindow.dom.tsx | 70 ++++++++++++ .../CallQualitySurvey.dom.stories.tsx | 2 + ts/components/CallQualitySurveyDialog.dom.tsx | 55 +++++++-- ts/state/ducks/calling.preload.ts | 7 +- ts/state/ducks/globalModals.preload.ts | 13 ++- .../smart/CallQualitySurveyDialog.preload.tsx | 5 + ts/window.d.ts | 10 ++ ts/windows/calldiagnostic/app.dom.tsx | 46 ++++++++ ts/windows/calldiagnostic/preload.preload.ts | 38 +++++++ ts/windows/main/phase1-ipc.preload.ts | 13 +++ 14 files changed, 395 insertions(+), 16 deletions(-) create mode 100644 call_diagnostic.html create mode 100644 ts/components/CallDiagnosticWindow.dom.tsx create mode 100644 ts/windows/calldiagnostic/app.dom.tsx create mode 100644 ts/windows/calldiagnostic/preload.preload.ts diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 9b9bf61857..38ccec38dc 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -10134,6 +10134,10 @@ "messageformat": "This helps us learn more about calls and what is working or not working. You can view your debug log before submitting.", "description": "Call Quality Survey Dialog > Help us improve > Page Description" }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality.", + "description": "Call Quality Survey Dialog > Help us improve > Page Description with link to view diagnostic info" + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Share debug log", "description": "Call Quality Survey Dialog > Help us improve > Share debug log > Label" @@ -10146,6 +10150,14 @@ "messageformat": "Debug logs contain low level app information and do not reveal any of your message contents.", "description": "Call Quality Survey Dialog > Help us improve > Share debug log > Help Text" }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls.", + "description": "Call Quality Survey Dialog > Help us improve > Privacy note about what information is shared" + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information", + "description": "Title of the call diagnostic information window" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Submit", "description": "Call Quality Survey Dialog > Help us improve > Submit Button" diff --git a/app/main.main.ts b/app/main.main.ts index d3ccf9f504..10ae8d8295 100644 --- a/app/main.main.ts +++ b/app/main.main.ts @@ -1401,16 +1401,28 @@ async function openArtCreator() { } let debugLogWindow: BrowserWindow | undefined; +let debugLogCurrentMode: 'submit' | 'close' | undefined; type DebugLogWindowOptions = { mode?: 'submit' | 'close'; }; async function showDebugLogWindow(options: DebugLogWindowOptions = {}) { + const newMode = options.mode ?? 'submit'; + if (debugLogWindow) { + if (debugLogCurrentMode !== newMode) { + debugLogCurrentMode = newMode; + const url = pathToFileURL(join(__dirname, '../debug_log.html')); + url.searchParams.set('mode', newMode); + await safeLoadURL(debugLogWindow, url.href); + } + doShowDebugLogWindow(); return; } + debugLogCurrentMode = newMode; + function doShowDebugLogWindow() { if (debugLogWindow) { // Electron has [a macOS bug][0] that causes parent windows to become unresponsive @@ -1452,6 +1464,7 @@ async function showDebugLogWindow(options: DebugLogWindowOptions = {}) { debugLogWindow.on('closed', () => { debugLogWindow = undefined; + debugLogCurrentMode = undefined; }); debugLogWindow.once('ready-to-show', () => { @@ -1471,6 +1484,71 @@ async function showDebugLogWindow(options: DebugLogWindowOptions = {}) { await safeLoadURL(debugLogWindow, url.href); } +let callDiagnosticWindow: BrowserWindow | undefined; +let storedCallDiagnosticData: string | undefined; + +async function showCallDiagnosticWindow() { + if (callDiagnosticWindow) { + doShowCallDiagnosticWindow(); + return; + } + + function doShowCallDiagnosticWindow() { + if (callDiagnosticWindow) { + // Electron has [a macOS bug][0] that causes parent windows to become unresponsive + // if it's fullscreen and opens a fullscreen child window. Until that's fixed, we + // only set the parent on MacOS is if the mainWindow is not fullscreen + // [0]: https://github.com/electron/electron/issues/32374 + if (OS.isMacOS() && mainWindow?.isFullScreen()) { + callDiagnosticWindow.setParentWindow(null); + } else { + callDiagnosticWindow.setParentWindow(mainWindow ?? null); + } + callDiagnosticWindow.show(); + } + } + + const windowOptions: Electron.BrowserWindowConstructorOptions = { + width: 700, + height: 500, + resizable: false, + title: getResolvedMessagesLocale().i18n('icu:CallDiagnosticWindow__title'), + titleBarStyle: nonMainTitleBarStyle, + autoHideMenuBar: true, + backgroundColor: await getBackgroundColor(), + show: false, + webPreferences: { + ...defaultWebPrefs, + nodeIntegration: false, + nodeIntegrationInWorker: false, + sandbox: true, + contextIsolation: true, + preload: join(__dirname, '../bundles/calldiagnostic/preload.preload.js'), + }, + parent: mainWindow, + }; + + callDiagnosticWindow = new BrowserWindow(windowOptions); + + await handleCommonWindowEvents(callDiagnosticWindow); + + callDiagnosticWindow.on('closed', () => { + callDiagnosticWindow = undefined; + }); + + callDiagnosticWindow.once('ready-to-show', () => { + if (callDiagnosticWindow) { + doShowCallDiagnosticWindow(); + + // Electron sometimes puts the window in a strange spot until it's shown. + callDiagnosticWindow.center(); + } + }); + + const url = pathToFileURL(join(__dirname, '../call_diagnostic.html')); + await safeLoadURL(callDiagnosticWindow, url.href); +} + let permissionsPopupWindow: BrowserWindow | undefined; function showPermissionsPopupWindow(forCalling: boolean, forCamera: boolean) { // eslint-disable-next-line no-async-promise-executor @@ -2686,6 +2764,35 @@ ipc.on( } ); +// Call Diagnostic Window-related IPC calls + +ipc.on('show-call-diagnostic', () => { + void showCallDiagnosticWindow(); +}); + +ipc.handle('get-call-diagnostic-data', () => { + return storedCallDiagnosticData ?? ''; +}); + +ipc.on('close-call-diagnostic', () => { + storedCallDiagnosticData = undefined; + callDiagnosticWindow?.close(); +}); + +ipc.on('close-debug-log', () => { + if (debugLogCurrentMode === 'close') { + debugLogWindow?.close(); + } +}); + +ipc.on('update-call-diagnostic-data', (_event, diagnosticData: string) => { + storedCallDiagnosticData = diagnosticData; + + if (callDiagnosticWindow && !callDiagnosticWindow.isDestroyed()) { + callDiagnosticWindow.webContents.send('call-diagnostic-data-updated'); + } +}); + // Permissions Popup-related IPC calls ipc.handle( diff --git a/call_diagnostic.html b/call_diagnostic.html new file mode 100644 index 0000000000..fa9b2da47b --- /dev/null +++ b/call_diagnostic.html @@ -0,0 +1,25 @@ + + + + + + + + + + +
    + + + diff --git a/scripts/esbuild.js b/scripts/esbuild.js index 4ed3b2ae9e..8b02581be4 100644 --- a/scripts/esbuild.js +++ b/scripts/esbuild.js @@ -178,6 +178,7 @@ async function sandboxedEnv() { mainFields: ['browser', 'main'], entryPoints: [ path.join(ROOT_DIR, 'ts', 'windows', 'about', 'app.dom.tsx'), + path.join(ROOT_DIR, 'ts', 'windows', 'calldiagnostic', 'app.dom.tsx'), path.join(ROOT_DIR, 'ts', 'windows', 'debuglog', 'app.dom.tsx'), path.join(ROOT_DIR, 'ts', 'windows', 'loading', 'start.dom.ts'), path.join(ROOT_DIR, 'ts', 'windows', 'permissions', 'app.dom.tsx'), @@ -189,6 +190,13 @@ async function sandboxedEnv() { mainFields: ['browser', 'main'], entryPoints: [ path.join(ROOT_DIR, 'ts', 'windows', 'about', 'preload.preload.ts'), + path.join( + ROOT_DIR, + 'ts', + 'windows', + 'calldiagnostic', + 'preload.preload.ts' + ), path.join(ROOT_DIR, 'ts', 'windows', 'debuglog', 'preload.preload.ts'), path.join(ROOT_DIR, 'ts', 'windows', 'loading', 'preload.preload.ts'), path.join( diff --git a/ts/components/CallDiagnosticWindow.dom.tsx b/ts/components/CallDiagnosticWindow.dom.tsx new file mode 100644 index 0000000000..33d75c069f --- /dev/null +++ b/ts/components/CallDiagnosticWindow.dom.tsx @@ -0,0 +1,70 @@ +// Copyright 2026 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only + +import React, { useMemo } from 'react'; + +import type { LocalizerType } from '../types/Util.std.js'; +import { tw } from '../axo/tw.dom.js'; +import { AxoButton } from '../axo/AxoButton.dom.js'; +import { useEscapeHandling } from '../hooks/useEscapeHandling.dom.js'; + +export type PropsType = { + closeWindow: () => unknown; + i18n: LocalizerType; + diagnosticData: string; +}; + +export function CallDiagnosticWindow({ + closeWindow, + i18n, + diagnosticData, +}: PropsType): React.JSX.Element { + useEscapeHandling(closeWindow); + + const formattedData = useMemo(() => { + try { + const parsed = JSON.parse(diagnosticData); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { rawStats, rawStatsText, ...rest } = parsed; + const pretty = { + ...rest, + rawStats: JSON.parse(rawStatsText), + }; + return JSON.stringify(pretty, null, 2); + } catch { + return diagnosticData; + } + }, [diagnosticData]); + + return ( +
    +
    +

    + {i18n('icu:CallDiagnosticWindow__title')} +

    +
    +
    +
    +          {formattedData}
    +        
    +
    +
    + + {i18n('icu:close')} + +
    +
    + ); +} diff --git a/ts/components/CallQualitySurvey.dom.stories.tsx b/ts/components/CallQualitySurvey.dom.stories.tsx index 53ee5880c8..82a352a5e5 100644 --- a/ts/components/CallQualitySurvey.dom.stories.tsx +++ b/ts/components/CallQualitySurvey.dom.stories.tsx @@ -19,6 +19,8 @@ export function Default(): React.JSX.Element { open={open} onOpenChange={setOpen} onSubmit={action('onSubmit')} + onViewDebugLog={action('onViewDebugLog')} + onViewDiagnosticInfo={action('onViewDiagnosticInfo')} /> ); } diff --git a/ts/components/CallQualitySurveyDialog.dom.tsx b/ts/components/CallQualitySurveyDialog.dom.tsx index 7a9c4dc743..bc90713ef3 100644 --- a/ts/components/CallQualitySurveyDialog.dom.tsx +++ b/ts/components/CallQualitySurveyDialog.dom.tsx @@ -11,9 +11,28 @@ import { missingCaseError } from '../util/missingCaseError.std.js'; import { AxoCheckbox } from '../axo/AxoCheckbox.dom.js'; import { strictAssert } from '../util/assert.std.js'; import { Tooltip, TooltipPlacement } from './Tooltip.dom.js'; +import { I18n } from './I18n.dom.js'; import Issue = CallQualitySurvey.Issue; +function DiagnosticInfoLink({ + parts, + onClick, +}: { + parts: Array; + onClick: () => void; +}): React.JSX.Element { + return ( + + ); +} + enum Page { HOW_WAS_YOUR_CALL, WHAT_ISSUES_DID_YOU_HAVE, @@ -25,14 +44,16 @@ export type CallQualitySurveyDialogProps = Readonly<{ open: boolean; onOpenChange: (open: boolean) => void; onSubmit: (form: CallQualitySurvey.Form) => void; - onViewDebugLog?: () => void; + onViewDebugLog: () => void; + onViewDiagnosticInfo: () => void; isSubmitting?: boolean; }>; export function CallQualitySurveyDialog( props: CallQualitySurveyDialogProps ): React.JSX.Element { - const { i18n, onSubmit, onViewDebugLog, isSubmitting } = props; + const { i18n, onSubmit, onViewDebugLog, onViewDiagnosticInfo, isSubmitting } = + props; const [page, setPage] = useState(Page.HOW_WAS_YOUR_CALL); const [userSatisfied, setUserSatisfied] = useState(null); @@ -79,6 +100,20 @@ export function CallQualitySurveyDialog( shareDebugLog, ]); + const renderDiagnosticInfoLink = useCallback( + (parts: Array) => ( + + ), + [onViewDiagnosticInfo] + ); + + const diagnosticInfoLinkComponents = useMemo( + () => ({ + diagnosticInfoLink: renderDiagnosticInfoLink, + }), + [renderDiagnosticInfoLink] + ); + return ( @@ -291,9 +326,11 @@ export function CallQualitySurveyDialog(

    - {i18n( - 'icu:CallQualitySurvey__ConfirmSubmission__PageDescription' - )} +

    @@ -314,9 +351,7 @@ export function CallQualitySurveyDialog( { - onViewDebugLog?.(); - }} + onClick={onViewDebugLog} > {i18n( 'icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__ViewButton' @@ -324,9 +359,7 @@ export function CallQualitySurveyDialog(

    - {i18n( - 'icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText' - )} + {i18n('icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote')}

    diff --git a/ts/state/ducks/calling.preload.ts b/ts/state/ducks/calling.preload.ts index 93cc5cabef..7eb44cc586 100644 --- a/ts/state/ducks/calling.preload.ts +++ b/ts/state/ducks/calling.preload.ts @@ -103,10 +103,10 @@ import type { ToggleConfirmLeaveCallModalActionType, } from './globalModals.preload.js'; import { - HIDE_CALL_QUALITY_SURVEY, SHOW_CALL_QUALITY_SURVEY, SHOW_ERROR_MODAL, toggleConfirmLeaveCallModal, + hideCallQualitySurvey, } from './globalModals.preload.js'; import { CallQualitySurvey } from '../../types/CallQualitySurvey.std.js'; import { isCallFailure } from '../../util/callQualitySurvey.dom.js'; @@ -2935,6 +2935,9 @@ function showCallQualitySurvey( return dispatch => { dispatch({ type: RESET_CQS_SUBMISSION_STATE }); dispatch({ type: SHOW_CALL_QUALITY_SURVEY, payload }); + + const diagnosticData = JSON.stringify(payload.callSummary); + window.IPC.updateCallDiagnosticData(diagnosticData); }; } @@ -3031,7 +3034,7 @@ function submitCallQualitySurvey( }, }); } finally { - dispatch({ type: HIDE_CALL_QUALITY_SURVEY }); + dispatch(hideCallQualitySurvey()); } }; } diff --git a/ts/state/ducks/globalModals.preload.ts b/ts/state/ducks/globalModals.preload.ts index d49924b182..3b3cc0f95d 100644 --- a/ts/state/ducks/globalModals.preload.ts +++ b/ts/state/ducks/globalModals.preload.ts @@ -670,9 +670,16 @@ function showCallQualitySurvey( }; } -function hideCallQualitySurvey(): HideCallQualitySurveyActionType { - return { - type: HIDE_CALL_QUALITY_SURVEY, +export function hideCallQualitySurvey(): ThunkAction< + void, + RootStateType, + unknown, + HideCallQualitySurveyActionType +> { + return dispatch => { + window.IPC.closeDebugLog(); + window.IPC.closeCallDiagnostic(); + dispatch({ type: HIDE_CALL_QUALITY_SURVEY }); }; } diff --git a/ts/state/smart/CallQualitySurveyDialog.preload.tsx b/ts/state/smart/CallQualitySurveyDialog.preload.tsx index fe6e7418b0..fc3dcbf490 100644 --- a/ts/state/smart/CallQualitySurveyDialog.preload.tsx +++ b/ts/state/smart/CallQualitySurveyDialog.preload.tsx @@ -52,6 +52,10 @@ export const SmartCallQualitySurveyDialog = memo( [submitCallQualitySurvey, callSummary, callType] ); + const handleViewDiagnosticInfo = useCallback(() => { + window.IPC.showCallDiagnostic(); + }, []); + return ( window.IPC.showDebugLog({ mode: 'close' })} + onViewDiagnosticInfo={handleViewDiagnosticInfo} isSubmitting={isSubmitting} /> ); diff --git a/ts/window.d.ts b/ts/window.d.ts index bbd2ea4de7..1c1d00b0fc 100644 --- a/ts/window.d.ts +++ b/ts/window.d.ts @@ -55,6 +55,10 @@ export type IPCType = { setMediaCameraPermissions: (value: boolean) => Promise; setMenuBarVisibility: (value: boolean) => void; showDebugLog: (options?: { mode?: 'submit' | 'close' }) => void; + showCallDiagnostic: () => void; + closeCallDiagnostic: () => void; + closeDebugLog: () => void; + updateCallDiagnosticData: (data: string) => void; showPermissionsPopup: ( forCalling: boolean, forCamera: boolean @@ -91,6 +95,11 @@ type DebugLogWindowPropsType = { mode: 'submit' | 'close'; }; +type CallDiagnosticWindowPropsType = { + subscribe: (listener: () => void) => () => void; + getSnapshot: () => string | null; +}; + type PermissionsWindowPropsType = { forCamera: boolean; forCalling: boolean; @@ -113,6 +122,7 @@ type SettingsWindowPropsType = { export type SignalCoreType = { AboutWindowProps?: AboutWindowPropsType; + CallDiagnosticWindowProps?: CallDiagnosticWindowPropsType; DebugLogWindowProps?: DebugLogWindowPropsType; PermissionsWindowProps?: PermissionsWindowPropsType; ScreenShareWindowProps?: ScreenShareWindowPropsType; diff --git a/ts/windows/calldiagnostic/app.dom.tsx b/ts/windows/calldiagnostic/app.dom.tsx new file mode 100644 index 0000000000..d564b13dd2 --- /dev/null +++ b/ts/windows/calldiagnostic/app.dom.tsx @@ -0,0 +1,46 @@ +// Copyright 2026 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only + +import React, { StrictMode, useSyncExternalStore } from 'react'; +import { createRoot } from 'react-dom/client'; +import '../sandboxedInit.dom.js'; +import { CallDiagnosticWindow } from '../../components/CallDiagnosticWindow.dom.js'; +import { FunDefaultEnglishEmojiLocalizationProvider } from '../../components/fun/FunEmojiLocalizationProvider.dom.js'; +import { strictAssert } from '../../util/assert.std.js'; +import { AxoProvider } from '../../axo/AxoProvider.dom.js'; + +const { CallDiagnosticWindowProps } = window.Signal; +strictAssert(CallDiagnosticWindowProps, 'window values not provided'); +const { subscribe, getSnapshot } = CallDiagnosticWindowProps; +const { i18n } = window.SignalContext; + +function App(): React.JSX.Element | null { + const diagnosticData = useSyncExternalStore(subscribe, getSnapshot); + + if (diagnosticData == null) { + return null; + } + + return ( + window.SignalContext.executeMenuRole('close')} + i18n={i18n} + diagnosticData={diagnosticData} + /> + ); +} + +const app = document.getElementById('app'); +strictAssert(app != null, 'No #app'); + +createRoot(app).render( + + + + + + + +); diff --git a/ts/windows/calldiagnostic/preload.preload.ts b/ts/windows/calldiagnostic/preload.preload.ts new file mode 100644 index 0000000000..d7c9bd8783 --- /dev/null +++ b/ts/windows/calldiagnostic/preload.preload.ts @@ -0,0 +1,38 @@ +// Copyright 2026 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only + +import { contextBridge, ipcRenderer } from 'electron'; +import { MinimalSignalContext } from '../minimalContext.preload.js'; + +// External store for useSyncExternalStore +let currentData: string | null = null; +const listeners = new Set<() => void>(); + +async function fetchData(): Promise { + currentData = await ipcRenderer.invoke('get-call-diagnostic-data'); + listeners.forEach(listener => listener()); +} + +ipcRenderer.on('call-diagnostic-data-updated', () => { + void fetchData(); +}); + +function subscribe(listener: () => void): () => void { + listeners.add(listener); + return () => listeners.delete(listener); +} + +function getSnapshot(): string | null { + return currentData; +} + +void fetchData(); + +const Signal = { + CallDiagnosticWindowProps: { + subscribe, + getSnapshot, + }, +}; +contextBridge.exposeInMainWorld('Signal', Signal); +contextBridge.exposeInMainWorld('SignalContext', MinimalSignalContext); diff --git a/ts/windows/main/phase1-ipc.preload.ts b/ts/windows/main/phase1-ipc.preload.ts index 2eed5c118f..ab09211a97 100644 --- a/ts/windows/main/phase1-ipc.preload.ts +++ b/ts/windows/main/phase1-ipc.preload.ts @@ -133,6 +133,19 @@ const IPC: IPCType = { log.info('showDebugLog', options); ipc.send('show-debug-log', options); }, + showCallDiagnostic: () => { + log.info('showCallDiagnostic'); + ipc.send('show-call-diagnostic'); + }, + closeCallDiagnostic: () => { + ipc.send('close-call-diagnostic'); + }, + closeDebugLog: () => { + ipc.send('close-debug-log'); + }, + updateCallDiagnosticData: (data: string) => { + ipc.send('update-call-diagnostic-data', data); + }, showPermissionsPopup: (forCalling, forCamera) => ipc.invoke('show-permissions-popup', forCalling, forCamera), setMediaPermissions: (value: boolean) => From e47893575a2f54e1ab5e262ef5ee6671181d3c38 Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Wed, 21 Jan 2026 13:25:06 -0600 Subject: [PATCH 37/49] Add call_diagnostic.html to packaged app build files Co-authored-by: yash-signal --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 69090a8cbe..74956fd554 100644 --- a/package.json +++ b/package.json @@ -595,6 +595,7 @@ "permissions_popup.html", "debug_log.html", "loading.html", + "call_diagnostic.html", { "from": "build/compact-locales", "to": "_locales", From 06855bd8374ea1ba2717d13f6ccc12447c98e4ff Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Wed, 21 Jan 2026 13:33:50 -0600 Subject: [PATCH 38/49] Fix lightbox image zoom on click Co-authored-by: ayumi-signal <143036029+ayumi-signal@users.noreply.github.com> --- ts/components/Lightbox.dom.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ts/components/Lightbox.dom.tsx b/ts/components/Lightbox.dom.tsx index 05026db6fa..5c175ef8d5 100644 --- a/ts/components/Lightbox.dom.tsx +++ b/ts/components/Lightbox.dom.tsx @@ -67,6 +67,10 @@ const INITIAL_IMAGE_TRANSFORM = { scale: 1, translateX: 0, translateY: 0, +}; + +const IMAGE_SPRING_PROPS = { + from: INITIAL_IMAGE_TRANSFORM, config: { clamp: true, friction: 20, @@ -368,7 +372,7 @@ export function Lightbox({ }, [isViewOnce, isAttachmentGIF, onTimeUpdate, playVideo, videoElement]); const [{ scale, translateX, translateY }, springApi] = useSpring( - () => INITIAL_IMAGE_TRANSFORM + () => IMAGE_SPRING_PROPS ); const thumbnailsMarginInlineStart = From dd5cf6b62bdcde9b3df0718fb21ad0e0c47a934b Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Wed, 21 Jan 2026 14:20:27 -0600 Subject: [PATCH 39/49] Fix pin message dialog submit with no warning step Co-authored-by: Jamie <113370520+jamiebuilds-signal@users.noreply.github.com> --- .../pinned-messages/PinMessageDialog.dom.tsx | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/ts/components/conversation/pinned-messages/PinMessageDialog.dom.tsx b/ts/components/conversation/pinned-messages/PinMessageDialog.dom.tsx index 2f5619c379..b6483f70fa 100644 --- a/ts/components/conversation/pinned-messages/PinMessageDialog.dom.tsx +++ b/ts/components/conversation/pinned-messages/PinMessageDialog.dom.tsx @@ -93,34 +93,34 @@ export const PinMessageDialog = memo(function PinMessageDialog( [onOpenChange] ); - const submit = useCallback(() => { - strictAssert( - duration != null, - 'Duration should not be null when submitting' - ); - const durationValue = DURATION_OPTIONS[duration]; - onPinnedMessageAdd(messageId, durationValue); - handleOpenChange(false); - }, [onPinnedMessageAdd, messageId, duration, handleOpenChange]); + const submit = useCallback( + (selectedDuration: DurationOption) => { + const durationValue = DURATION_OPTIONS[selectedDuration]; + onPinnedMessageAdd(messageId, durationValue); + handleOpenChange(false); + }, + [onPinnedMessageAdd, messageId, handleOpenChange] + ); const handleConfirmReplaceOldestPin = useCallback(() => { setConfirmedReplaceOldestPin(true); }, []); const handleSelectDuration = useCallback( - (selected: DurationOption) => { - setDuration(selected); + (selectedDuration: DurationOption) => { + setDuration(selectedDuration); if (!needsConfirmDisappearingMessages) { - submit(); + submit(selectedDuration); } }, [needsConfirmDisappearingMessages, submit] ); const handleConfirmDisappearingMessages = useCallback(() => { + strictAssert(duration != null, 'Duration should not be null'); onSeenPinMessageDisappearingMessagesWarning(); - submit(); - }, [onSeenPinMessageDisappearingMessagesWarning, submit]); + submit(duration); + }, [onSeenPinMessageDisappearingMessagesWarning, duration, submit]); let step: Step; if (!props.open) { From 38c684646b048438a5c80f4f25dd11e0560669b6 Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Wed, 21 Jan 2026 16:21:45 -0600 Subject: [PATCH 40/49] Update CQS logic: remove duration thresholds and add test mode Co-authored-by: yash-signal --- ts/components/Preferences.dom.stories.tsx | 6 ++---- ts/components/Preferences.dom.tsx | 16 ++++++---------- ts/components/PreferencesInternal.dom.tsx | 14 +++++++------- ts/services/calling.preload.ts | 5 ++--- ts/state/smart/Preferences.preload.tsx | 13 +++++-------- ts/types/Storage.d.ts | 3 ++- ts/util/callQualitySurvey.dom.ts | 19 +++++++------------ 7 files changed, 31 insertions(+), 45 deletions(-) diff --git a/ts/components/Preferences.dom.stories.tsx b/ts/components/Preferences.dom.stories.tsx index 06270bdd9d..e71f5b2491 100644 --- a/ts/components/Preferences.dom.stories.tsx +++ b/ts/components/Preferences.dom.stories.tsx @@ -627,10 +627,8 @@ export default { __dangerouslyRunAbitraryReadOnlySqlQuery: async () => { return Promise.resolve([]); }, - callQualitySurveyCooldownDisabled: false, - setCallQualitySurveyCooldownDisabled: action( - 'setCallQualitySurveyCooldownDisabled' - ), + cqsTestMode: false, + setCqsTestMode: action('setCqsTestMode'), } satisfies PropsType, } satisfies Meta; diff --git a/ts/components/Preferences.dom.tsx b/ts/components/Preferences.dom.tsx index e430979ade..f89dcfce91 100644 --- a/ts/components/Preferences.dom.tsx +++ b/ts/components/Preferences.dom.tsx @@ -331,8 +331,8 @@ type PropsFunctionType = { __dangerouslyRunAbitraryReadOnlySqlQuery: ( readonlySqlQuery: string ) => Promise>>; - callQualitySurveyCooldownDisabled: boolean; - setCallQualitySurveyCooldownDisabled: (value: boolean) => void; + cqsTestMode: boolean; + setCqsTestMode: (value: boolean) => void; // Localization i18n: LocalizerType; @@ -543,8 +543,8 @@ export function Preferences({ generateDonationReceiptBlob, internalDeleteAllMegaphones, __dangerouslyRunAbitraryReadOnlySqlQuery, - callQualitySurveyCooldownDisabled, - setCallQualitySurveyCooldownDisabled, + cqsTestMode, + setCqsTestMode, }: PropsType): React.JSX.Element { const storiesId = useId(); const themeSelectId = useId(); @@ -2297,12 +2297,8 @@ export function Preferences({ __dangerouslyRunAbitraryReadOnlySqlQuery={ __dangerouslyRunAbitraryReadOnlySqlQuery } - callQualitySurveyCooldownDisabled={ - callQualitySurveyCooldownDisabled - } - setCallQualitySurveyCooldownDisabled={ - setCallQualitySurveyCooldownDisabled - } + cqsTestMode={cqsTestMode} + setCqsTestMode={setCqsTestMode} /> } contentsRef={settingsPaneRef} diff --git a/ts/components/PreferencesInternal.dom.tsx b/ts/components/PreferencesInternal.dom.tsx index 30f99f4863..062ddf8a02 100644 --- a/ts/components/PreferencesInternal.dom.tsx +++ b/ts/components/PreferencesInternal.dom.tsx @@ -35,8 +35,8 @@ export function PreferencesInternal({ generateDonationReceiptBlob, internalDeleteAllMegaphones, __dangerouslyRunAbitraryReadOnlySqlQuery, - callQualitySurveyCooldownDisabled, - setCallQualitySurveyCooldownDisabled, + cqsTestMode, + setCqsTestMode, }: { i18n: LocalizerType; validateBackup: () => Promise; @@ -59,8 +59,8 @@ export function PreferencesInternal({ __dangerouslyRunAbitraryReadOnlySqlQuery: ( readonlySqlQuery: string ) => Promise>>; - callQualitySurveyCooldownDisabled: boolean; - setCallQualitySurveyCooldownDisabled: (value: boolean) => void; + cqsTestMode: boolean; + setCqsTestMode: (value: boolean) => void; }): React.JSX.Element { const [messageCountBySchemaVersion, setMessageCountBySchemaVersion] = useState(); @@ -441,12 +441,12 @@ export function PreferencesInternal({
    - Disable 24h cooldown + CQS testing: disable cooldown and always show for calls under 30s
    diff --git a/ts/services/calling.preload.ts b/ts/services/calling.preload.ts index 3e24625a62..904bc7edf4 100644 --- a/ts/services/calling.preload.ts +++ b/ts/services/calling.preload.ts @@ -337,8 +337,7 @@ function maybeShowCallQualitySurvey( const lastSurveyTime = itemStorage.get('lastCallQualitySurveyTime') ?? null; const lastFailureSurveyTime = itemStorage.get('lastCallQualityFailureSurveyTime') ?? null; - const bypassCooldown = - itemStorage.get('callQualitySurveyCooldownDisabled') ?? false; + const cqsTestMode = itemStorage.get('cqsTestMode') ?? false; const ourE164 = itemStorage.user.getNumber(); if ( @@ -347,7 +346,7 @@ function maybeShowCallQualitySurvey( lastSurveyTime, lastFailureSurveyTime, e164: ourE164, - bypassCooldown, + cqsTestMode, }) ) { return; diff --git a/ts/state/smart/Preferences.preload.tsx b/ts/state/smart/Preferences.preload.tsx index bebe658e8f..c5d89646eb 100644 --- a/ts/state/smart/Preferences.preload.tsx +++ b/ts/state/smart/Preferences.preload.tsx @@ -758,11 +758,10 @@ export function SmartPreferences(): React.JSX.Element | null { [] ); - const callQualitySurveyCooldownDisabled = - items.callQualitySurveyCooldownDisabled ?? false; + const cqsTestMode = items.cqsTestMode ?? false; - const setCallQualitySurveyCooldownDisabled = useCallback((value: boolean) => { - drop(itemStorage.put('callQualitySurveyCooldownDisabled', value)); + const setCqsTestMode = useCallback((value: boolean) => { + drop(itemStorage.put('cqsTestMode', value)); }, []); if (currentLocation.tab !== NavTab.Settings) { @@ -970,10 +969,8 @@ export function SmartPreferences(): React.JSX.Element | null { __dangerouslyRunAbitraryReadOnlySqlQuery={ __dangerouslyRunAbitraryReadOnlySqlQuery } - callQualitySurveyCooldownDisabled={callQualitySurveyCooldownDisabled} - setCallQualitySurveyCooldownDisabled={ - setCallQualitySurveyCooldownDisabled - } + cqsTestMode={cqsTestMode} + setCqsTestMode={setCqsTestMode} />
    diff --git a/ts/types/Storage.d.ts b/ts/types/Storage.d.ts index c2c8328f4e..ec32d30a31 100644 --- a/ts/types/Storage.d.ts +++ b/ts/types/Storage.d.ts @@ -69,7 +69,7 @@ export type StorageAccessType = { 'call-system-notification': boolean; lastCallQualitySurveyTime: number; lastCallQualityFailureSurveyTime: number; - callQualitySurveyCooldownDisabled: boolean; + cqsTestMode: boolean; 'hide-menu-bar': boolean; 'incoming-call-notification': boolean; 'notification-draw-attention': boolean; @@ -294,6 +294,7 @@ export type StorageAccessType = { versionedExpirationTimer: never; primarySendsSms: never; backupMediaDownloadIdle: never; + callQualitySurveyCooldownDisabled: never; }; export type StorageInterface = { diff --git a/ts/util/callQualitySurvey.dom.ts b/ts/util/callQualitySurvey.dom.ts index 41ef97380f..a214b0cba3 100644 --- a/ts/util/callQualitySurvey.dom.ts +++ b/ts/util/callQualitySurvey.dom.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: AGPL-3.0-only import type { CallSummary } from '@signalapp/ringrtc'; -import { DAY, MINUTE } from './durations/index.std.js'; +import { DAY, SECOND } from './durations/index.std.js'; import { isFeaturedEnabledNoRedux } from './isFeatureEnabled.dom.js'; import { isMockEnvironment } from '../environment.std.js'; import { @@ -23,8 +23,7 @@ const FAILURE_END_REASONS: ReadonlySet = new Set([ ]); const SURVEY_COOLDOWN = DAY; -const SHORT_CALL_THRESHOLD = MINUTE; -const LONG_CALL_THRESHOLD = 25 * MINUTE; +const TEST_SHORT_CALL_THRESHOLD = 30 * SECOND; const DEFAULT_PPM = 10000; // 1% default export function isCallFailure(callEndReasonText: string): boolean { @@ -43,13 +42,13 @@ export function shouldShowCallQualitySurvey({ lastSurveyTime, lastFailureSurveyTime, e164, - bypassCooldown, + cqsTestMode, }: { callSummary: CallSummary; lastSurveyTime: number | null; lastFailureSurveyTime: number | null; e164: string | undefined; - bypassCooldown?: boolean; + cqsTestMode?: boolean; }): boolean { if ( isMockEnvironment() || @@ -63,7 +62,7 @@ export function shouldShowCallQualitySurvey({ const isFailure = isCallFailure(callSummary.callEndReasonText); const canShowFailureSurvey = - bypassCooldown || + cqsTestMode || lastFailureSurveyTime == null || now - lastFailureSurveyTime > SURVEY_COOLDOWN; if (isFailure && canShowFailureSurvey) { @@ -71,7 +70,7 @@ export function shouldShowCallQualitySurvey({ } const canShowGeneralSurvey = - bypassCooldown || + cqsTestMode || lastSurveyTime == null || now - lastSurveyTime > SURVEY_COOLDOWN; if (!canShowGeneralSurvey) { @@ -80,11 +79,7 @@ export function shouldShowCallQualitySurvey({ const callDuration = callSummary.endTime - callSummary.startTime; - if (callDuration < SHORT_CALL_THRESHOLD) { - return true; - } - - if (callDuration > LONG_CALL_THRESHOLD) { + if (cqsTestMode && callDuration < TEST_SHORT_CALL_THRESHOLD) { return true; } From ae7393d724394e4758d76c9ab6ffd2ea1f0074f3 Mon Sep 17 00:00:00 2001 From: ayumi-signal Date: Wed, 21 Jan 2026 14:29:40 -0800 Subject: [PATCH 41/49] Release notes for 7.87 --- _locales/en/messages.json | 8 ++++---- ts/components/WhatsNewModal.dom.tsx | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 38ccec38dc..fbbbf52522 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -10217,12 +10217,12 @@ "description": "Release notes for releases that only include bug fixes", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Signal polls on Desktop now include the same subtle animation effects that were already appearing on your phone. Watching your favorite choice pull away is just a poll away.", - "description": "(Deleted 2026/01/07) Release notes for 7.84 release" - }, "icu:WhatsNew__7.86--0": { "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly.", "description": "Release notes for 7.86 release" + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well.", + "description": "Release notes for 7.87 release" } } diff --git a/ts/components/WhatsNewModal.dom.tsx b/ts/components/WhatsNewModal.dom.tsx index 534af10ce6..2dfdb276f3 100644 --- a/ts/components/WhatsNewModal.dom.tsx +++ b/ts/components/WhatsNewModal.dom.tsx @@ -43,7 +43,7 @@ export function WhatsNewModal({ const releaseNotes: ReleaseNotesType = { date: new Date(window.getBuildCreation?.() || Date.now()), version: window.getVersion?.(), - features: [], + features: [], }; if (releaseNotes.features.length === 1 && !releaseNotes.header) { From 83627b5ba9edaf1f7d758d6a9b4f04dc587980a2 Mon Sep 17 00:00:00 2001 From: ayumi-signal Date: Wed, 21 Jan 2026 14:32:19 -0800 Subject: [PATCH 42/49] Update strings --- _locales/af-ZA/messages.json | 76 +++++++++++++++++++++++------- _locales/ar/messages.json | 76 +++++++++++++++++++++++------- _locales/az-AZ/messages.json | 76 +++++++++++++++++++++++------- _locales/bg-BG/messages.json | 76 +++++++++++++++++++++++------- _locales/bn-BD/messages.json | 76 +++++++++++++++++++++++------- _locales/bs-BA/messages.json | 76 +++++++++++++++++++++++------- _locales/ca/messages.json | 76 +++++++++++++++++++++++------- _locales/cs/messages.json | 76 +++++++++++++++++++++++------- _locales/da/messages.json | 76 +++++++++++++++++++++++------- _locales/de/messages.json | 76 +++++++++++++++++++++++------- _locales/el/messages.json | 76 +++++++++++++++++++++++------- _locales/en/messages.json | 20 +++----- _locales/es/messages.json | 86 +++++++++++++++++++++++++--------- _locales/et-EE/messages.json | 76 +++++++++++++++++++++++------- _locales/eu/messages.json | 76 +++++++++++++++++++++++------- _locales/fa-IR/messages.json | 76 +++++++++++++++++++++++------- _locales/fi/messages.json | 76 +++++++++++++++++++++++------- _locales/fr/messages.json | 74 ++++++++++++++++++++++------- _locales/ga-IE/messages.json | 76 +++++++++++++++++++++++------- _locales/gl-ES/messages.json | 76 +++++++++++++++++++++++------- _locales/gu-IN/messages.json | 76 +++++++++++++++++++++++------- _locales/he/messages.json | 76 +++++++++++++++++++++++------- _locales/hi-IN/messages.json | 76 +++++++++++++++++++++++------- _locales/hr-HR/messages.json | 76 +++++++++++++++++++++++------- _locales/hu/messages.json | 76 +++++++++++++++++++++++------- _locales/id/messages.json | 76 +++++++++++++++++++++++------- _locales/it/messages.json | 80 +++++++++++++++++++++++-------- _locales/ja/messages.json | 76 +++++++++++++++++++++++------- _locales/ka-GE/messages.json | 76 +++++++++++++++++++++++------- _locales/kk-KZ/messages.json | 76 +++++++++++++++++++++++------- _locales/km-KH/messages.json | 76 +++++++++++++++++++++++------- _locales/kn-IN/messages.json | 76 +++++++++++++++++++++++------- _locales/ko/messages.json | 76 +++++++++++++++++++++++------- _locales/ky-KG/messages.json | 76 +++++++++++++++++++++++------- _locales/lt-LT/messages.json | 76 +++++++++++++++++++++++------- _locales/lv-LV/messages.json | 76 +++++++++++++++++++++++------- _locales/mk-MK/messages.json | 76 +++++++++++++++++++++++------- _locales/ml-IN/messages.json | 76 +++++++++++++++++++++++------- _locales/mr-IN/messages.json | 76 +++++++++++++++++++++++------- _locales/ms/messages.json | 74 ++++++++++++++++++++++------- _locales/my/messages.json | 76 +++++++++++++++++++++++------- _locales/nb/messages.json | 76 +++++++++++++++++++++++------- _locales/nl/messages.json | 78 +++++++++++++++++++++++------- _locales/pa-IN/messages.json | 76 +++++++++++++++++++++++------- _locales/pl/messages.json | 76 +++++++++++++++++++++++------- _locales/pt-BR/messages.json | 76 +++++++++++++++++++++++------- _locales/pt-PT/messages.json | 76 +++++++++++++++++++++++------- _locales/ro-RO/messages.json | 76 +++++++++++++++++++++++------- _locales/ru/messages.json | 76 +++++++++++++++++++++++------- _locales/sk-SK/messages.json | 76 +++++++++++++++++++++++------- _locales/sl-SI/messages.json | 76 +++++++++++++++++++++++------- _locales/sq-AL/messages.json | 76 +++++++++++++++++++++++------- _locales/sr/messages.json | 76 +++++++++++++++++++++++------- _locales/sv/messages.json | 76 +++++++++++++++++++++++------- _locales/sw/messages.json | 74 ++++++++++++++++++++++------- _locales/ta-IN/messages.json | 76 +++++++++++++++++++++++------- _locales/te-IN/messages.json | 76 +++++++++++++++++++++++------- _locales/th/messages.json | 76 +++++++++++++++++++++++------- _locales/tl-PH/messages.json | 76 +++++++++++++++++++++++------- _locales/tr/messages.json | 76 +++++++++++++++++++++++------- _locales/ug/messages.json | 76 +++++++++++++++++++++++------- _locales/uk-UA/messages.json | 76 +++++++++++++++++++++++------- _locales/ur/messages.json | 76 +++++++++++++++++++++++------- _locales/vi/messages.json | 76 +++++++++++++++++++++++------- _locales/yue/messages.json | 76 +++++++++++++++++++++++------- _locales/zh-CN/messages.json | 76 +++++++++++++++++++++++------- _locales/zh-HK/messages.json | 76 +++++++++++++++++++++++------- _locales/zh-Hant/messages.json | 76 +++++++++++++++++++++++------- 68 files changed, 3964 insertions(+), 1158 deletions(-) diff --git a/_locales/af-ZA/messages.json b/_locales/af-ZA/messages.json index 1358b50528..e3af55cd27 100644 --- a/_locales/af-ZA/messages.json +++ b/_locales/af-ZA/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Inligting" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Merk met speld" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Verwyder speld" }, "icu:Poll__end-poll": { "messageformat": "Beëindig meningsopname" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Gaan voort" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Boodskap met speld gemerk} other {Boodskappe met speld gemerk}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Meer aksies" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Verwyder speld" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Gaan na boodskap" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Sien alle boodskappe" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Adres" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Stemboodskap" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Lêer" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Kontak" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Betaling" }, @@ -5166,16 +5169,16 @@ "messageformat": "Skakels" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Sorteer volgens" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Sorteer volgens" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Datum" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Grootte" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Geen media" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Jou kletsgeskiedenis kan nie uitgevoer word nie, want Signal het nie toestemming om lêers na jou skyf te skryf nie. Probeer om jou skyftoestemmings te verander of 'n opdatering van jou stelselinstellings te doen en voer dan weer uit." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Maan-ikoon" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Wys sleutel weer" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Rugsteungids" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Dit help ons om meer te uit te vind oor oproepe en wat werk of nie werk nie. Jy kan jou ontfout-log besigtig voordat jy dit indien." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Deel ontfout-log" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Ontfout-logs bevat laevlak-toepassingsinligting en maak niks van jou boodskapinhoud bekend nie." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Dien in" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Dankie vir jou terugvoer!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Hierdie weergawe bevat ’n aantal klein aanpassings en regstellings om Signal glad te laat werk.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Klein veranderings, foutregstellings en prestasieverbeterings. Dankie dat jy Signal gebruik!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Verbeterde animasie vir Signal-meningsopnames." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Ons het 'n geringe vertoonfout met die opgesteektehand-aanduider in groepoproepe reggestel." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/ar/messages.json b/_locales/ar/messages.json index c9160f93bb..3e40b46adc 100644 --- a/_locales/ar/messages.json +++ b/_locales/ar/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "معلومات" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "تثبيت" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "إزالة التثبيت" }, "icu:Poll__end-poll": { "messageformat": "إنهاء الاستطلاع" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "متابعة" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, zero {رسائل مُثبَّتة} one {رسالة مُثبَّتة} two {رسالتان مُثبَّتتان} few {رسائل مُثبَّتة} many {رسائل مُثبَّتة} other {رسائل مُثبَّتة}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "إجراءات أخرى" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "إزالة التثبيت" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "انتقل إلى الرسالة" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "مشاهدة جميع الرسائل" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "عنوان البريد" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "رسالة صوتية" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "ملف" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "جهة الاتصال" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "عمليات الدفع" }, @@ -5166,16 +5169,16 @@ "messageformat": "الروابط" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "الترتيب بحسب" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "الترتيب بحسب" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "التاريخ" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "الحجم" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "لا يوجد ملف وسائط" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "يتعذَّر تصدير سجل الدردشة الخاص بك لأن سيجنال ليس لديه الإذن لكتابة الملفات على القرص. حاوِل تغيير أذونات قرصك أو حدِّث إعدادات نظامك ثم حاوِل التصدير من جديد." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "أيقونة القمر" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "اطَّلِع على المفتاح مُجدَّدًا" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "مجلد النسخ الاحتياطية" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "يساعدنا هذا على معرفة المزيد بخصوص الاتصالات وما يعمل وما لا يعمل. يمكنك عرض سِجل الأخطاء الخاص بك قبل الإرسال." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "مشاركة سجل الأخطاء" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "تحتوي سجلات الأخطاء على معلومات التطبيق منخفضة المستوى ولا تكشف عن أي من محتويات رسالتك." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "إرسال" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "شكرًا على ملاحظاتك!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "يحتوي هذا الإصدار على عدد من التعديلات الصغيرة وإصلاحات الأخطاء للحفاظ على عمل سيجنال بسلاسة.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "تعديلات صغيرة، وإصلاح أعطال، وتحسينات للأداء. شكرًا على استخدامك سيجنال!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "تتضمن استطلاعات سيجنال على نسخة سطح المكتب الآن نفس تأثيرات الصور المتحركة التي كانت تظهر مُسبقًا على هاتفك. تابِع تقدُّم خيارك المُفضَّل لحظة بلحظة مع كل تصويت." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "أصلحنا خللًا بسيطًا في عرض أيقونة رفع اليد أثناء المكالمات الجماعية." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/az-AZ/messages.json b/_locales/az-AZ/messages.json index db8ba9fbd1..ed4f1b4d8e 100644 --- a/_locales/az-AZ/messages.json +++ b/_locales/az-AZ/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Məlumat" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Sancaqla" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Sancağı götür" }, "icu:Poll__end-poll": { "messageformat": "Səsverməni bitir" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Davam et" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Sancaqlanmış mesaj} other {Sancaqlanmış mesajlar}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Daha çox əməliyyat" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Sancağı götür" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Mesaja keç" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Bütün mesajlara bax" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Ünvan" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Səsyazmalı mesaj" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Fayl" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Əlaqə" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Ödəniş" }, @@ -5166,16 +5169,16 @@ "messageformat": "Keçidlər" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Sırala" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Sırala" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Tarixə görə" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Ölçüsünə görə" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Media yoxdur" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Signal faylları diskə köçürmək icazəsinə malik olmadığı üçün çat tarixçənizi ixrac etmək mümkün deyil. Disk icazələrini dəyişib və ya sistem parametrlərini yeniləyib, yenidən ixrac edin." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ay piktoqramı" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Şifrəyə yenidən bax" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Nüsxə qovluğu" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Bu, bizə zənglər və işə yarayıb-yaramayan düzəlişlərimiz haqqında ətraflı məlumat əldə etməyə kömək edir. Göndərməzdən əvvəl sazlama jurnalına nəzər sala bilərsiniz." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Sazlama jurnalını paylaşın" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Sazlama jurnalları aşağı səviyyəli tətbiq məlumatlarını əhatə edir və mesaj məzmunlarınızın heç birini aşkarlamır." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Təqdim et" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Rəyiniz üçün təşəkkür edirik!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Bu versiya, Signal-ın problemsiz işləməsini təmin etmək üçün kiçik düzəltmələr və xəta düzəltmələri ehtiva edir.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Kiçik spesifik tənzimləmələr, xəta düzəlişləri və məhsuldarlığın artırılması. Signal istifadə etdiyiniz üçün təşəkkürlər!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Artıq Signal-ın Desktop tətbiqindəki səsvermələr telefonunuzda görünən eyni animasiya effektlərinə malikdir. Seçiminizin birinci olduğunu izləmək sadəcə bir səsvermə qədər yaxındır." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Biz sonradan yaranan yöndəmsiz sükutu aradan qaldıra bilməsək də, bir xətanı düzəltdik: bəzən kimsə əlini çox tez qaldırıb endirdikdə, qaldırılmış əl göstəricisi (sayı sıfır olduğu halda) ekranda qalırdı." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/bg-BG/messages.json b/_locales/bg-BG/messages.json index 2c0b96c6f5..b8eac82b74 100644 --- a/_locales/bg-BG/messages.json +++ b/_locales/bg-BG/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Информация" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Закачване" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Откачване" }, "icu:Poll__end-poll": { "messageformat": "Приключване на анкетата" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Продължаване" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Закачено съобщение} other {Закачени съобщения}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Повече опции" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Откачване" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Към съобщението" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Преглед на всички съобщения" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Адрес" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Гласово съобщение" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Файл" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Контакт" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Плащане" }, @@ -5166,16 +5169,16 @@ "messageformat": "Линкове" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Сортиране по" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Сортиране по" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Дата" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Размер" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Няма мултимедия" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Вашата история на чата не може да бъде експортирана, защото Signal няма разрешение да записва файлове на диска. Опитайте да промените разрешенията на диска или да актуализирате системните си настройки и след това експортирайте отново." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Икона на луна" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Вижте ключа отново" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Архивна папка" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Това ни помага да научим повече за обажданията и за това какво работи и какво не работи. Можете да видите своя доклад за дебъг, преди да го изпратите." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Споделяне на доклад за дебъг" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Докладите за дебъг съдържат информация за приложенията от ниско ниво и не разкриват никакво съдържание от съобщенията ви." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Изпрати" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Благодарим за обратната връзка!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Тази версия съдържа редица дребни модификации и корекции на бъгове, за да поддържа гладката работа на Signal.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Дребни корекции, поправки на бъгове и подобрения на работата. Благодарим ви, че използвате Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Подобрени анимации за анкети в Signal." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Поправихме малък бъг с индикатора за вдигната ръка при групови разговори." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/bn-BD/messages.json b/_locales/bn-BD/messages.json index 566aa822a8..e7b2680b64 100644 --- a/_locales/bn-BD/messages.json +++ b/_locales/bn-BD/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "তথ্য" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "পিন করুন" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "আনপিন করুন" }, "icu:Poll__end-poll": { "messageformat": "ভোটগ্রহণ কার্যক্রমটি শেষ করুন" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "চালিয়ে যান" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {পিনকৃত মেসেজ} other {মেসেজ পিন করুন}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "আরও ক্রিয়া" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "আনপিন করুন" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "মেসেজ-এ যান" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "সব মেসেজ দেখুন" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "ঠিকানা" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "ভয়েস বার্তা" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "ফাইল" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "পরিচিতি" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "পেমেন্ট" }, @@ -5166,16 +5169,16 @@ "messageformat": "লিংকসমূহ" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "এভাবে সাজান" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "এভাবে সাজান" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "তারিখ" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "আকার" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "কোনো মিডিয়া নেই" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "আপনার চ্যাট-এর ইতিহাস এক্সপোর্ট করা যাচ্ছে না, কারণ Signal-এর ডিস্কে ফাইল রাইট করার অনুমতি নেই। আপনার ডিস্কের অনুমতি পরিবর্তন করার চেষ্টা করুন অথবা আপনার সিস্টেম সেটিংস আপডেট করুন এবং তারপর আবার এক্সপোর্ট করুন।" }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "চাঁদের আইকন" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "'কি'-টি আবার দেখুন" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "ব্যাকআপ ফোল্ডার" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "এটি আমাদের কলের ব্যাপারে, কী কী কাজ করছে বা কী কী করছে না সে সম্পর্কে আরো জানতে সাহায্য করে। জমা দেওয়ার আগে আপনি আপনার ডিবাগ লগ দেখতে পারেন।" }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "ডিবাগ লগ শেয়ার করুন" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "ডিবাগ লগগুলোতে অ্যাপ সংক্রান্ত অল্প কিছু তথ্য থাকে এবং আপনার কোনো মেসেজের কন্টেন্ট প্রকাশ করে না।" }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "সাবমিট" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "আপনার ফিডব্যাকের জন্য ধন্যবাদ!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "সিগন্যালকে মসৃণভাবে চলমান রাখতে এই সংস্করণে অনেকগুলি ছোটখাট পরিবর্তন রয়েছে এবং বাগ সংশোধন করা হয়েছে।", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "ছোট ছোট কিছু পরিবর্তন, বাগ সংশোধন এবং পারফর্মেন্স সমৃদ্ধ করা হয়েছে। Signal ব্যবহার করার জন্য ধন্যবাদ!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Signal জরিপে এখন আরো উন্নত অ্যানিমেশন।" - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "গ্রুপ কলে হাত উঁচু করার ইন্ডিকেটরের একটি ছোট ডিসপ্লে বাগ আমরা সংশোধন করেছি।" + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/bs-BA/messages.json b/_locales/bs-BA/messages.json index 1dc53b60f1..8785a268b2 100644 --- a/_locales/bs-BA/messages.json +++ b/_locales/bs-BA/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Informacije" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Prikvači" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Otkvači" }, "icu:Poll__end-poll": { "messageformat": "Završi anketu" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Nastavi" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Zakačena poruka} few {Zakačene poruke} many {Zakačenih poruka} other {Zakačene poruke}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Više radnji" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Otkvači" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Idi na poruku" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Pogledajte sve poruke" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Adresa" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Glasovna poruka" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Datoteka" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Kontakt" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Plaćanje" }, @@ -5166,16 +5169,16 @@ "messageformat": "Linkovi" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Sortiraj po" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Sortiraj po" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Datumu" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Veličini" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Nema medijskih zapisa" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Vaša historija chata ne može biti izvezena jer Signal nema dozvolu za pisanje datoteka na disk. Pokušajte promijeniti dozvole diska ili ažurirati postavke sistema, a zatim ponovo izvezite." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ikona mjeseca" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Vidi ključ ponovo" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Direktorij za rezervne kopije" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Ovo nam pomaže da saznamo više o pozivima i šta funkcioniše, a šta ne. Možete pregledati svoj zapisnik o otklanjanju grešaka prije slanja." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Podijeli zapisnik o otklanjanju grešaka" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Zapisnici o otklanjanju grešaka sadrže informacije o aplikaciji niskog nivoa i ne otkrivaju sadržaj vaših poruka." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Šalji" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Hvala na povratnim informacijama!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Ova verzija sadrži brojna mala poboljšanja i ispravke grešaka kako bi Signal nesmetano funkcionirao.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Mala podešavanja, otklanjanje grešaka i poboljšanja performansi. Hvala vam što koristite Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Unaprijedili smo animacije za ankete na Signalu." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Ispravili smo manju programsku grešku u prikazu indikatora podignute ruke u grupnim pozivima." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/ca/messages.json b/_locales/ca/messages.json index 89e99c27e4..9f7a15353b 100644 --- a/_locales/ca/messages.json +++ b/_locales/ca/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Informació" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Fixa" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "No ho fixis" }, "icu:Poll__end-poll": { "messageformat": "Finalitzar enquesta" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Continua" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Missatge fixat} other {Missatges fixats}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Més accions" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "No ho fixis" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Ves a Missatge" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Veure tots els missatges" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Adreça" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Missatge de veu" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Fitxer" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Contacte" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Pagament" }, @@ -5166,16 +5169,16 @@ "messageformat": "Enllaços" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Ordena per" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Ordena per" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Data" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Mida" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "No hi ha cap arxiu multimèdia" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "No es pot exportar el teu historial del xat perquè Signal no té permís per crear fitxers al disc. Prova de canviar els permisos del disc o d'actualitzar els teus ajustos del sistema i, a continuació, torna a exportar." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Icona de lluna" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Tornar a veure la clau" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Carpeta de còpia de seguretat" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Això ens ajuda a tenir més informació sobre què funciona (o no) durant les trucades. Pots veure el registre de depuració abans d'enviar-lo." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Compartir registre de depuració" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Els registres de depuració contenen informació de baix nivell sobre l'aplicació i no revelen cap dels continguts dels teus missatges." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Envia" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Gràcies pels teus comentaris!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Aquesta versió conté una sèrie de petites modificacions i correccions d'errors per tal que el Signal funcioni sense problemes.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Petits ajustos, correccions d'errors i tasques de millora de rendiment. Gràcies per utilitzar Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Millores a les animacions de les enquestes de Signal." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Hem corregit un petit error relacionat amb l'indicador de mà aixecada a les trucades grupals." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/cs/messages.json b/_locales/cs/messages.json index 5cb1fec9a2..38a1904bc9 100644 --- a/_locales/cs/messages.json +++ b/_locales/cs/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Připnout" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Odepnout" }, "icu:Poll__end-poll": { "messageformat": "Ukončit anketu" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Pokračovat" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {připnutá zpráva} few {připnuté zprávy} many {připnutých zpráv} other {připnutých zpráv}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Další akce" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Odepnout" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Přejít na zprávu" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Zobrazit všechny zprávy" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Adresa" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Hlasová zpráva" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Soubor" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Kontakt" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Platba" }, @@ -5166,16 +5169,16 @@ "messageformat": "Odkazy" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Seřadit podle" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Seřadit podle" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Data" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Velikosti" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Žádná média" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Historii chatů nelze exportovat, protože Signal nemá oprávnění k zápisu souborů na disk. Zkuste změnit oprávnění disku nebo aktualizovat nastavení systému a poté export zopakujte." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ikona měsíce" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Znovu zobrazit klíč" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Složka pro zálohy" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Pomáhá nám to zjistit více o hovorech a o tom, co funguje a co ne. Před odesláním si můžete protokol ladění zobrazit." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Odeslat protokol ladění" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Protokoly ladění obsahují informace o aplikaci na nízké úrovni a nesdělují žádný obsah vašich zpráv." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Odeslat" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Děkujeme vám za zpětnou vazbu!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Tato verze obsahuje řadu drobných vylepšení a oprav chyb, aby Signal fungoval bez problémů.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Drobná vylepšení, opravy chyb a zvýšení výkonu. Děkujeme, že používáte Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Vylepšená animace pro ankety Signal." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Opravili jsme drobnou chybu v zobrazení ikony zvednuté ruky ve skupinových hovorech." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/da/messages.json b/_locales/da/messages.json index 5dc41c6f95..8684415619 100644 --- a/_locales/da/messages.json +++ b/_locales/da/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Information" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Fastgør" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Frigør" }, "icu:Poll__end-poll": { "messageformat": "Afslut afstemning" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Fortsæt" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Fastgjort besked} other {Fastgjorte beskeder}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Flere handlinger" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Frigør" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Gå til besked" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Vis alle beskeder" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Adresse" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Talebesked" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Fil" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Kontakt" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Betaling" }, @@ -5166,16 +5169,16 @@ "messageformat": "Links" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Sortér efter" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Sortér efter" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Dato" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Størrelse" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Ingen mediefiler" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Din chathistorik kan ikke eksporteres, fordi Signal ikke har tilladelse til at gemme filer på disken. Skift dine diskrettigheder eller systemindstillinger, og prøv at eksportere igen." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Måneikon" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Se nøglen igen" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Mappe til sikkerhedskopi" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Dette hjælper os med at forstå opkald bedre og se, hvad der virker, og hvad der ikke gør. Du kan se din fejlsøgningslog, før du sender den." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Del fejlsøgningslog" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Fejlsøgningslogger indeholder oplysninger om appen på lavt niveau og afslører ikke noget indhold fra dine beskeder." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Indsend" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Tak for din feedback!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Denne version indeholder en række småjusteringer og fejlrettelser som sikrer, at Signal kører problemfrit.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Små tweaks, rettelser og forbedringer af appens præstation. Tak fordi du bruger Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Afstemninger i Signal på computer har nu de samme diskrete animationer som på din telefon. Det kræver kun en afstemning at se dit favoritvalg trække fra." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Vi kan ikke fjerne den akavede stilhed bagefter, men vi har rettet en fejl, der nogle gange gjorde, at indikatoren for oprakt hånd blev der (med en tæller på nul), hvis nogen hurtigt hævede og sænkede hånden." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/de/messages.json b/_locales/de/messages.json index 0aeeef3453..6add4eaf05 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Fixieren" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Lösen" }, "icu:Poll__end-poll": { "messageformat": "Umfrage beenden" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Fortfahren" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Fixierte Nachricht} other {Fixierte Nachrichten}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Weitere Aktionen" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Lösen" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Zur Nachricht" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Alle Nachrichten anzeigen" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Adresse" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Sprachnachricht" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Datei" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Kontakt" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Zahlung" }, @@ -5166,16 +5169,16 @@ "messageformat": "Links" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Sortieren nach" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Sortieren nach" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Datum" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Größe" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Keine Medieninhalte" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Dein Chat-Verlauf kann nicht exportiert werden, weil Signal keine Berechtigung hat, Dateien auf die Festplatte zu schreiben. Ändere die Berechtigungen deiner Festplatte oder aktualisiere deine Systemeinstellungen und versuche dann, die Daten erneut zu exportieren." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Mondsymbol" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Schlüssel erneut anzeigen" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Ordner für Backup" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "So erfahren wir mehr über Anrufe und darüber, was gut läuft und was nicht. Du kannst dein Diagnoseprotokoll ansehen, bevor du es abschickst." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Diagnoseprotokoll teilen" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Diagnoseprotokolle enthalten nur wenige App-Infos und verraten nichts über den Inhalt deiner Nachrichten." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Übermitteln" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Danke für dein Feedback!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Diese Version enthält eine Reihe kleinerer Optimierungen und Fehlerbehebungen, damit Signal weiterhin reibungslos funktioniert.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Kleine Optimierungen, Fehlerbehebungen und Leistungsverbesserungen. Danke, dass du Signal nutzt!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Signal-Umfragen auf Desktops sind ab jetzt mit denselben dezenten Animationen ausgestattet, die bereits auf deinem Handy zu sehen waren. Mit der nächsten Umfrage könnte dein Favorit abziehen." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Wir haben einen Fehler behoben, der manchmal dazu führte, dass die „Gehobene Hand“-Ansicht sichtbar blieb (mit Zählstand Null), wenn jemand seine Hand sehr schnell hob und wieder senkte – leider war es uns nicht möglich, die peinliche Stille aufzulösen, die dabei entstehen kann." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/el/messages.json b/_locales/el/messages.json index 852552b167..6d8482f43f 100644 --- a/_locales/el/messages.json +++ b/_locales/el/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Πληροφορίες" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Καρφίτσωμα" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Ξεκαρφίτσωμα" }, "icu:Poll__end-poll": { "messageformat": "Λήξη δημοσκόπησης" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Συνέχεια" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Καρφιτσωμένo μήνυμα} other {Καρφιτσωμένα μηνύματα}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Περισσότερες ενέργειες" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Ξεκαρφίτσωμα" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Μετάβαση στο Μήνυμα" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Προβολή όλων των μηνυμάτων" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Διεύθυνση" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Μήνυμα φωνής" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Αρχείο" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Επαφή" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Πληρωμή" }, @@ -5166,16 +5169,16 @@ "messageformat": "Σύνδεσμοι" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Ταξινόμηση κατά" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Ταξινόμηση κατά" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Ημερομηνία" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Μέγεθος" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Κανένα πολυμέσο" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Δεν είναι δυνατή η εξαγωγή του ιστορικού συνομιλιών σου επειδή το Signal δεν έχει άδεια εγγραφής αρχείων στον δίσκο. Δοκίμασε να αλλάξεις τα δικαιώματα του δίσκου σου ή να ενημερώσεις τις ρυθμίσεις του συστήματός σου και, στη συνέχεια, επανάλαβε την εξαγωγή." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Εικονίδιο φεγγαριού" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Επαναπροβολή κλειδιού" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Φάκελος αντίγραφου ασφαλείας" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Αυτό μας βοηθά να μάθουμε περισσότερα για τις κλήσεις και τι λειτουργεί ή δεν λειτουργεί. Μπορείς να δεις το αρχείο καταγραφής αποσφαλμάτωσης πριν από την υποβολή." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Κοινή χρήση αρχείου καταγραφής αποσφαλμάτωσης" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Τα αρχεία καταγραφής αποσφαλμάτωσης περιέχουν πληροφορίες εφαρμογής χαμηλού επιπέδου και δεν αποκαλύπτουν κανένα από τα περιεχόμενα των μηνυμάτων σου." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Υποβολή" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Ευχαριστούμε για τα σχόλιά σου!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Αυτή η έκδοση περιλαμβάνει διάφορες μικρές βελτιώσεις και αποσφαλματώσεις για να συνεχίσει το Signal να λειτουργεί ομαλά.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Μικρές τροποποιήσεις, επιδιορθώσεις σφαλμάτων και βελτιώσεις απόδοσης. Ευχαριστούμε που χρησιμοποιείς το Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Οι δημοσκοπήσεις Signal στην επιφάνεια εργασίας περιλαμβάνουν πλέον τα ίδια ανεπαίσθητα εφέ κίνησης που εμφανίζονταν ήδη στο τηλέφωνό σου." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Διορθώσαμε ένα μικρό σφάλμα στην οθόνη με την ένδειξη σηκωμένου χεριού στις ομαδικές κλήσεις." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/en/messages.json b/_locales/en/messages.json index fbbbf52522..f167ef0884 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1690,10 +1690,6 @@ "messageformat": "See all messages", "description": "Conversation > With pinned message(s) > Pinned messages bar > More actions menu > See all messages" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Address", - "description": "(Deleted 2025/12/18) Conversation > With pinned message(s) > Pinned messages bar > Message Preview > Symbol Accessibility Label (Address)" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Voice message", "description": "Conversation > With pinned message(s) > Pinned messages bar > Message Preview > Symbol Accessibility Label (Voice message)" @@ -1706,10 +1702,6 @@ "messageformat": "File", "description": "Conversation > With pinned message(s) > Pinned messages bar > Message Preview > Symbol Accessibility Label (File)" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Contact", - "description": "(Deleted 2025/12/18) Conversation > With pinned message(s) > Pinned messages bar > Message Preview > Symbol Accessibility Label (Contact)" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Payment", "description": "Conversation > With pinned message(s) > Pinned messages bar > Message Preview > Symbol Accessibility Label (Payment)" @@ -7318,15 +7310,15 @@ }, "icu:Preferences__internal__local-backups": { "messageformat": "Local backups", - "description": "Text header for internal local backup tools" + "description": "(Deleted 2026/01/21) Text header for internal local backup tools" }, "icu:Preferences__internal__export-local-backup": { "messageformat": "Export…", - "description": "Button to run internal local backup export tool" + "description": "(Deleted 2026/01/21) Button to run internal local backup export tool" }, "icu:Preferences__internal__export-local-backup--description": { "messageformat": "Export local encrypted backup to a folder and validate it", - "description": "Description of the internal local backup export tool" + "description": "(Deleted 2026/01/21) Description of the internal local backup export tool" }, "icu:Preferences__internal__validate-backup--description": { "messageformat": "Export encrypted backup to memory and run validation suite on it", @@ -10132,7 +10124,7 @@ }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "This helps us learn more about calls and what is working or not working. You can view your debug log before submitting.", - "description": "Call Quality Survey Dialog > Help us improve > Page Description" + "description": "(Deleted 2026/01/21) Call Quality Survey Dialog > Help us improve > Page Description" }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality.", @@ -10148,7 +10140,7 @@ }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Debug logs contain low level app information and do not reveal any of your message contents.", - "description": "Call Quality Survey Dialog > Help us improve > Share debug log > Help Text" + "description": "(Deleted 2026/01/21) Call Quality Survey Dialog > Help us improve > Share debug log > Help Text" }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls.", @@ -10219,7 +10211,7 @@ }, "icu:WhatsNew__7.86--0": { "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly.", - "description": "Release notes for 7.86 release" + "description": "(Deleted 2026/01/21) Release notes for 7.86 release" }, "icu:WhatsNew__7.87--0": { "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well.", diff --git a/_locales/es/messages.json b/_locales/es/messages.json index 871897564f..00ae054c82 100644 --- a/_locales/es/messages.json +++ b/_locales/es/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Detalles" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Fijar" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Desfijar" }, "icu:Poll__end-poll": { "messageformat": "Finalizar encuesta" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Continuar" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Mensaje fijado} other {Mensajes fijados}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Más acciones" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Desfijar" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Ir al mensaje" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Ver todos los mensajes" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Dirección" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Mensaje de voz" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Documento" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Contacto" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Pago" }, @@ -4479,7 +4482,7 @@ "messageformat": "Fotos y vídeos" }, "icu:CompositionArea__AttachMenu__File": { - "messageformat": "Archivo" + "messageformat": "Documento" }, "icu:CompositionArea__AttachMenu__Poll": { "messageformat": "Encuesta" @@ -5166,16 +5169,16 @@ "messageformat": "Enlaces" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Ordenar por" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Ordenar por" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Fecha" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Tamaño" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "No hay archivos multimedia" @@ -5589,7 +5592,7 @@ "messageformat": "Exportación completa" }, "icu:PlaintextExport--CompleteDialog--Description": { - "messageformat": "ATENCIÓN: Elige con cuidado dónde guardar tu archivo de exportación del chat y no lo compartas con nadie. Dependiendo de los permisos que tengas activados, otras aplicaciones pueden acceder a él. " + "messageformat": "ATENCIÓN: Elige con cuidado dónde guardar tu archivo de exportación del chat y no lo compartas con nadie. Dependiendo de los permisos que tengas activados, otras aplicaciones podrán acceder a él. " }, "icu:PlaintextExport--CompleteDialog--ShowFiles--Mac": { "messageformat": "Mostrar en Finder" @@ -5607,7 +5610,7 @@ "messageformat": "Se ha producido un error y no se ha podido exportar tu historial de chat." }, "icu:PlaintextExport--Error--NotEnoughStorage--Title": { - "messageformat": "No hay suficiente espacio de almacenamiento" + "messageformat": "No hay suficiente espacio disponible" }, "icu:PlaintextExport--Error--NotEnoughStorage--Detail": { "messageformat": "No se puede exportar tu historial de chat porque tu dispositivo no tiene suficiente espacio libre de almacenamiento. Libera {bytes} de espacio y vuelve a intentarlo." @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "No se puede exportar tu historial de chat porque Signal no tiene permiso para generar archivos en tu almacenamiento. Actualiza tus ajustes del sistema para cambiar los permisos de tu almacenamiento y vuelve a intentarlo." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Icono de luna" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Volver a ver la clave" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Carpeta de copia de seguridad" }, @@ -5994,7 +6024,7 @@ "messageformat": "Clave de copia de seguridad copiada" }, "icu:Preferences__local-backups--enable--os-prompt--mac": { - "messageformat": "Habilitar copias de seguridad" + "messageformat": "habilitar copias de seguridad" }, "icu:Preferences__local-backups--enable--os-prompt--windows": { "messageformat": "Verifica tu identidad para habilitar las copias de seguridad." @@ -7540,7 +7570,7 @@ "messageformat": "Otras personas oían eco" }, "icu:CallQualitySurvey__Issue--AUDIO_DROP": { - "messageformat": "El audio se cortaba" + "messageformat": "El audio se detuvo" }, "icu:CallQualitySurvey__Issue--VIDEO": { "messageformat": "Problema de vídeo" @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Tu opinión nos ayuda a saber qué funciona y qué falla durante las llamadas. Puedes ver tu registro de depuración antes de enviarlo." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Compartir registro de depuración" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Los registros de depuración contienen información técnica de la aplicación y no revelan el contenido de ninguno de tus mensajes." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Enviar" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "¡Gracias por tus comentarios!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Esta versión incluye una series de ajustes y correcciones de errores para que Signal funcione sin problemas.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Hemos hecho algunos ajustes, correcciones de errores y mejoras en el rendimiento. ¡Gracias por usar Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Las encuestas en Signal Desktop ahora incluyen los mismos efectos de animación que ya veías en tu teléfono. Estás a una sola encuesta de distancia de ver cómo tu opción favorita toma la delantera." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "No podemos arreglar los silencios incómodos en las llamadas grupales, pero sí hemos corregido un error que hacía que el indicador de \"mano levantada\" quedara visible (con un conteo de cero) si alguien levantaba y bajaba la mano muy rápido." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/et-EE/messages.json b/_locales/et-EE/messages.json index 102723466b..20c7151f49 100644 --- a/_locales/et-EE/messages.json +++ b/_locales/et-EE/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Teave" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Tõsta esile" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Eemalda esiletõst" }, "icu:Poll__end-poll": { "messageformat": "Lõpeta küsitlus" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Jätka" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Esiletõstetud sõnum} other {Esiletõstetud sõnumid}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Rohkem tegevusi" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Eemalda esiletõst" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Mine sõnumi juurde" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Vaata kõiki sõnumeid" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Aadress" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Häälsõnum" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Fail" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Kontakt" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Makse" }, @@ -5166,16 +5169,16 @@ "messageformat": "Lingid" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Sorteerimisalus:" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Sorteerimisalus:" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "kuupäev" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "suurus" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Meedia puudub" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Sinu vestlusajalugu ei saa eksportida, kuna Signalil pole luba kettale faile kirjutada. Proovi muuta oma ketta õigusi või värskendada süsteemi sätteid ja seejärel ekspordi uuesti." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Kuu ikoon" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Vaata võtit veelkord" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Varunduste kaust" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "See aitab meil kõnede kohta rohkem teada saada ja mõista, mis toimib ja mis mitte. Enne esitamist saad oma silumislogi vaadata." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Jaga silumislogi" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Silumislogid sisaldavad üldistatud teavet rakenduse kohta ega avalda sinu sõnumite sisu." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Postita" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Täname tagasiside eest!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "See versioon sisaldab paljusid väikseid parendusi, mis Signali sujuvalt käimas.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Väikesed muudatused, vigade parandused ja jõudluse täiustused. Aitäh, et kasutad Signalit!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Signali küsitlustel on nüüd paremad animatsioonid." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Parandasime grupivestluses käe tõstmise kuvamisvea." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/eu/messages.json b/_locales/eu/messages.json index 712201aaf1..1bfbd990c7 100644 --- a/_locales/eu/messages.json +++ b/_locales/eu/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Ainguratu" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Kendu aingura" }, "icu:Poll__end-poll": { "messageformat": "Amaitu galdeketa" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Jarraitu" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Ainguratutako mezua} other {Ainguratutako mezuak}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Ekintza gehiago" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Kendu aingura" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Joan mezura" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Ikusi mezu guztiak" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Helbidea" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Ahots-mezua" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Artxiboa" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Kontaktua" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Ordainketa" }, @@ -5166,16 +5169,16 @@ "messageformat": "Estekak" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Ordenatzeko irizpidea" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Ordenatzeko irizpidea" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Data" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Tamaina" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Euskarririk ez" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Ezin da esportatu txat-historia, Signal-ek ez daukalako fitxategiak diskoan idazteko baimenik. Saiatu diskoaren baimenak edo eguneratu sistema-ezarpenak, eta saiatu berriro." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ilargi-ikonoa" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Ikusi gakoa berriro" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Babeskopiak gordetzeko karpeta" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Horrela, deiei buruzko informazio gehiago lortu, eta zerk funtzionatzen duen eta zerk funtzionatzen ez duen jakingo dugu. Bidali aurretik, arazketa-erregistroa ikusi ahalko duzu." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Partekatu arazketa-erregistroa" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Arazketa-erregistroek aplikazioari buruzko maila baxuko informazioa dute, eta ez dute mezuetako edukirik." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Bidali" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Eskerrik asko iritziarengatik!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Bertsio honek hainbat doikuntza txiki eta akats konpontzen ditu Signal-ek ondo funtzionatzen jarraitzeko.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Doikuntza txikiak, akats-konponketak eta errendimendu-hobekuntzak. Eskerrik asko Signal erabiltzeagatik!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Signal-eko galdeketetako animazioak hobetu egin dira." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Taldeko deietan eskua jasotzean agertzen zen bistaratze-akats txiki bat konpondu dugu." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/fa-IR/messages.json b/_locales/fa-IR/messages.json index 18482aa053..59e7f6d607 100644 --- a/_locales/fa-IR/messages.json +++ b/_locales/fa-IR/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "اطلاعات" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "سنجاق کردن" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "برداشتن سنجاق" }, "icu:Poll__end-poll": { "messageformat": "پایان نظرسنجی" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "ادامه" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {پیام سنجاق‌شده} other {پیام‌های سنجاق‌شده}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "اقدامات بیشتر" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "برداشتن سنجاق" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "رفتن به پیام" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "مشاهده همه پیام‌ها" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "آدرس" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "پیام صوتی" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "فایل" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "مخاطب" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "پرداخت" }, @@ -5166,16 +5169,16 @@ "messageformat": "پیوندها" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "مرتب‌سازی بر اساس" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "مرتب‌سازی بر اساس" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "تاریخ" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "حجم" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "رسانه‌ای موجود نیست" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "امکان صدور تاریخچه گفتگوی شما وجود ندارد زیرا سیگنال اجازه نوشتن فایل‌ها روی دیسک را ندارد. مجوزهای دیسک خود را تغییر دهید یا تنظیمات سیستم خود را به‌روزرسانی کنید و سپس دوباره صادر کنید." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "آیکون ماه" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "مشاهده دوباره کلید" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "پوشهٔ پشتیبان" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "این به ما کمک می‌کند درباره تماس‌ها و نقاط قوت و ضعف آن‌ها بیشتر بدانیم. می‌توانید قبل از ارسال، گزارش اشکال‌زدایی خود را ببینید." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "هم‌رسانی گزارش اشکال‌زدایی" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "گزارش‌های عیب‌یابی حاوی اطلاعات سطح پایین برنامه هستند و هیچ‌یک از محتواهای پیام شما را افشا نمی‌کنند." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "ارسال" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "از بازخورد شما متشکریم!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "این نسخه شامل شماری از بهینه سازی های کوچک و رفع عیب برای تداوم اجرای راحت سیگنال می باشد", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "تغییرات کوچک، رفع اشکالات و بهبود عملکرد. بابت استفاده از سیگنال سپاسگزاریم!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "پویانمایی‌ها را برای نظرسنجی‌های سیگنال بهبود دادیم. ‌" - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "اشکال جزئی در نمایش را برطرف کردیم که در نشانگر دست‌بالا‌بردن در تماس‌های گروهی وجود داشت." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/fi/messages.json b/_locales/fi/messages.json index 102f87b4ef..d997b275d1 100644 --- a/_locales/fi/messages.json +++ b/_locales/fi/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Tietoja" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Kiinnitä" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Irrota" }, "icu:Poll__end-poll": { "messageformat": "Lopeta kysely" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Jatka" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Kiinnitetty viesti} other {Kiinnitetyt viestit}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Lisätoimintoja" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Irrota" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Siirry viestiin" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Näytä kaikki viestit" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Osoite" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Ääniviesti" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Tiedosto" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Yhteystieto" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Maksu" }, @@ -5166,16 +5169,16 @@ "messageformat": "Linkit" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Järjestä:" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Järjestä:" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Päiväys" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Koko" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Ei mediatiedostoja" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Keskusteluhistoriaa ei voida viedä, koska Signalilla ei ole oikeutta kirjoittaa tiedostoja levylle. Kokeile muuttaa levyn käyttöoikeuksia tai päivitä järjestelmäasetukset ja vie sitten uudelleen." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Kuun kuvake" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Näytä avain uudelleen" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Varmuuskopiokansio" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Tämä auttaa meitä oppimaan lisää puheluista ja siitä, mikä toimii tai ei toimi. Voit tarkastella virheenkorjauslokia ennen lähettämistä." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Jaa vianetsintäloki" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Vianetsintäloki sisältää matalan tason sovellustietoja eivätkä paljasta viestiesi sisältöä." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Lähetä" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Kiitos palautteestasi!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Tämä versio sisältää useita pieniä parannuksia ja virhekorjauksia, jotka pitävät Signalin toiminnan sujuvana.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Pieniä säätöjä, virheenkorjauksia ja suorituskykyparannuksia. Kiitos, että käytät Signalia!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Parannetut animaatiot kyselyissä Signal Desktopissa." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Korjasimme pienen virheen käden noston ilmaisimessa ryhmäkeskusteluissa." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index 427c91c1a0..ffd746869e 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Infos" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Épingler" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Détacher" }, "icu:Poll__end-poll": { "messageformat": "Arrêter le sondage" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Continuer" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Message épinglé} other {Messages épinglés}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Autres actions" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Détacher" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Accéder au message" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Afficher tous les messages" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Adresse" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Message vocal" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Fichier" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Contact" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Paiement" }, @@ -5166,16 +5169,16 @@ "messageformat": "Liens" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Trier par" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Trier par" }, "icu:MediaGallery__sort__date": { "messageformat": "Date" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Taille" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Aucun média" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Impossible d'exporter l'historique de vos conversations, car vous n'avez pas autorisé Signal à enregistrer des fichiers sur votre ordinateur. Modifiez les autorisations de votre ordinateur ou les paramètres système, puis réessayez." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Icône lune" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Réafficher la clé" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Dossier de sauvegarde" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Vos retours nous permettent de comprendre ce qui fonctionne et ce que nous devons améliorer. Vous pouvez consulter votre journal de débogage avant de nous l'envoyer." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Partager le journal de débogage" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Les journaux de débogage ne contiennent que des informations techniques relatives à l'application et ne révèlent en aucun cas le contenu de vos messages." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Envoyer" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Merci pour vos commentaires !" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Dans cette version, nous avons apporté quelques ajustements et corrigé de petits bugs. Pour que votre messagerie préférée continue de fonctionner comme sur des roulettes.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Au menu de cette version : quelques ajustements de plus, quelques petits bugs en moins et des gains de performance. Merci d'utiliser Signal !", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Chez Signal, on vote pour l'homogénéité ! C'est pourquoi les sondages sur ordinateur incluent désormais les mêmes petits effets d'animation que sur mobile." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Lorsqu'un participant levait puis baissait la main très rapidement pendant un appel de groupe, le compteur de mains levées restait parfois visible (et affichait zéro). Un bug que nos équipes ont corrigé haut la main !" + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/ga-IE/messages.json b/_locales/ga-IE/messages.json index e2efa2a2a5..66f40b74af 100644 --- a/_locales/ga-IE/messages.json +++ b/_locales/ga-IE/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Eolas" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Greamaigh" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Díghreamaigh" }, "icu:Poll__end-poll": { "messageformat": "Cuir deireadh leis an suirbhé" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Ar aghaidh" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Teachtaireacht ghreamaithe} two {Teachtaireachtaí greamaithe} few {Teachtaireachtaí greamaithe} many {Teachtaireachtaí greamaithe} other {Teachtaireachtaí greamaithe}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Tuilleadh gníomhartha" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Díghreamaigh" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Téigh chuig an teachtaireacht" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Féach ar gach teachtaireacht" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Seoladh" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Glórphost" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Comhad" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Teagmhálaí" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Íocaíocht" }, @@ -5166,16 +5169,16 @@ "messageformat": "Naisc" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Sórtáil de réir" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Sórtáil de réir" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Dáta" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Méide" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Níl aon mheán ann" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Ní féidir do stair comhráite a easpórtáil toisc nach bhfuil cead ag Signal comhaid a scríobh chuig an diosca. Triail ceadanna do dhiosca a athrú nó socruithe do chórais a nuashonrú agus ansin déan an easpórtáil arís." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Deilbhín na gealaí" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Féach ar an eochair arís" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Fillteán cúltaca" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Cabhraíonn sé seo linn tuilleadh a fhoghlaim faoina bhfuil ag obair agus nach bhfuil. Is féidir leat féachaint ar do loga dífhabhtaithe sula gcuireann tú isteach é." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Comhroinn an loga dífhabhtaithe" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Bíonn faisnéis íseal-leibhéil aipe i logaí dífhabhtaithe agus ní nochtar ábhar aon cheann de do theachtaireachtaí iontu." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Seol isteach é" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Go raibh maith agat as d'aiseolas!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Tá roinnt mionathruithe agus paistí ar fhabhtanna sa leagan seo chun Signal a choinneáil ag rith go réidh.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Mionathruithe, paistí fabhtanna agus feabhsuithe ar fheidhmíocht. Go raibh maith agat as Signal a úsáid!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Beochan fheabhsaithe do shuirbhéanna Signal." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Réitíomar fabht beag taispeána le táscaire na láimhe ardaithe i ngrúpghlaonna." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/gl-ES/messages.json b/_locales/gl-ES/messages.json index f97925a288..d649d11914 100644 --- a/_locales/gl-ES/messages.json +++ b/_locales/gl-ES/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Información" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Fixar" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Soltar" }, "icu:Poll__end-poll": { "messageformat": "Rematar enquisa" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Continuar" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Mensaxe fixada} other {Mensaxes fixadas}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Máis accións" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Soltar" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Ir á mensaxe" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Ver todas as mensaxes" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Enderezo" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Mensaxe de voz" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Ficheiro" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Contacto" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Pagamento" }, @@ -5166,16 +5169,16 @@ "messageformat": "Ligazóns" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Ordenar por" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Ordenar por" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Data" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Tamaño" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Sen ficheiros multimedia" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Non se pode exportar o historal do chat porque Signal non ten permiso para crear ficheiros no disco. Proba a cambiar os permisos do disco ou a actualizar a configuración do sistema e tenta exportalo de novo." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Icona de lúa" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Ver clave de novo" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Cartafol da copia" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Isto axúdanos a aprender máis sobre as chamadas e sobre o que funciona ou non funciona. Podes ver o teu rexistro de depuración antes de envialo." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Compartir rexistro de depuración" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Os rexistros de depuración conteñen datos internos da aplicación, pero non mostran o contido das mensaxes." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Enviar" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Grazas pola túa observación!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Esta versión contén pequenos arranxos e reparacións que fan que Signal funcione sen problemas.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Comprende pequenas modificacións e melloras no rendemento. Moitas grazas por empregar Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Animación mellorada para as enquisas de Signal." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Corriximos un pequeno erro na forma en que se mostraba o indicador de man alzada nas chamadas de grupo." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/gu-IN/messages.json b/_locales/gu-IN/messages.json index 1d622267e4..bbceacbeaf 100644 --- a/_locales/gu-IN/messages.json +++ b/_locales/gu-IN/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "માહિતી" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "પિન કરો" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "અનપિન કરો" }, "icu:Poll__end-poll": { "messageformat": "મતદાન સમાપ્ત કરો" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "ચાલુ રાખો" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {પિન કરેલો મેસેજ} other {પિન કરેલા મેસેજ}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "વધુ પગલાં" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "અનપિન કરો" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "મેસેજ પર જાઓ" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "બધા મેસેજ જુઓ" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "સરનામું" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "વોઇસ મેસેજ" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "ફાઈલ" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "સંપર્ક" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "પેમેન્ટ" }, @@ -5166,16 +5169,16 @@ "messageformat": "લિંક" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "આ અનુસાર ગોઠવો" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "આ અનુસાર ગોઠવો" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "તારીખ" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "કદ" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "કોઈ મીડિયા નથી" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "તમારી ચેટ હિસ્ટ્રી નિકાસ કરી શકાતી નથી કારણ કે Signal પાસે ડિસ્ક પર ફાઇલો લખવાની પરવાનગી નથી. તમારી ડિસ્કની પરવાનગીઓ બદલવાનો અથવા તમારી સિસ્ટમ સેટિંગ્સ અપડેટ કરવાનો પ્રયાસ કરો અને પછી ફરીથી નિકાસ કરો." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "ચંદ્રનો આઇકન" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "કી ફરીથી જુઓ" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "બેકઅપ ફોલ્ડર" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "આનાથી અમને કૉલ અને શું કામ કરી રહ્યું છે અને શું નથી કરી રહ્યું તે વિશે વધુ જાણવામાં મદદ મળે છે. સબમિટ કરતા પહેલાં તમે તમારો ડીબગ લૉગ જોઈ શકો છો." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "ડીબગ લૉગ શેર કરો" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "ડીબગ લૉગમાં ઓછા સ્તરની ઍપ માહિતી હોય છે અને તે તમારા મેસેજનું કોઈ પણ કન્ટેન્ટ જાહેર કરતું નથી." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "સબમિટ કરો" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "તમારા પ્રતિભાવ બદલ આભાર!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "આ વર્ઝનમાં Signalને સરસ રીતે ચાલતું રાખવા માટે નાના ફેરફારો અને ભૂલ સુધાર શામેલ છે.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "નાના ફેરફારો, ભૂલ સુધારા અને પ્રદર્શનમાં વધારો. Signalનો ઉપયોગ કરવા બદલ આભાર!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Signal મતદાન માટે એનિમેશન બહેતર બનાવ્યું." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "અમે ગ્રૂપ કૉલમાં હાથ ઊંચા કરવાના સૂચક સાથે એક નાના ડિસ્પ્લે બગને સુધાર્યો છે." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/he/messages.json b/_locales/he/messages.json index e7a8ce2915..ecaccda948 100644 --- a/_locales/he/messages.json +++ b/_locales/he/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "מידע" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "הצמדה" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "ביטול הצמדה" }, "icu:Poll__end-poll": { "messageformat": "סיום סקר" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "המשך" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {הודעה מוצמדת} two {הודעות מוצמדות} many {הודעות מוצמדות} other {הודעות מוצמדות}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "פעולות נוספות" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "ביטול הצמדה" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "מעבר להודעה" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "הצגת כל ההודעות" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "כתובת" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "הודעה קולית" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "קובץ" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "איש קשר" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "תשלום" }, @@ -5166,16 +5169,16 @@ "messageformat": "קישורים" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "מיון לפי" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "מיון לפי" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "תאריך" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "גודל" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "אין מדיה" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "לא ניתן לייצא את היסטוריית הצ'אט כי ל–Signal אין הרשאה לכתוב קבצים לדיסק. כדאי לשנות את הרשאות הדיסק או לעדכן את הגדרות המערכת שלך ולנסות לייצא שוב." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "סמל ירח" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "צפייה חוזרת במפתח" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "תיקיית גיבוי" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "זה עוזר לנו להבין טוב יותר שיחות ומה עובד או לא עובד. אפשר לראות את יומן ניפוי הבאגים שלך לפני ההגשה." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "שיתוף יומן ניפוי באגים" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "יומני ניפוי באגים מכילים מידע בסיסי מהאפליקציה ולא חושפים את תוכן ההודעות שלך." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "שלח" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "תודה על המשוב!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "גרסה זו מכילה מספר של שפצורים קטנים ותיקוני תקלים כדי לשמור על Signal שירוץ באופן חלק.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "התאמות קטנות, תיקוני באגים ושיפורי ביצועים. תודה על השימוש ב-Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "אנימציה משופרת עבור סקרי Signal." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "תיקנו באג קטן בתצוגה של מחוון היד המורמת בשיחות קבוצתיות." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/hi-IN/messages.json b/_locales/hi-IN/messages.json index c7d7507499..19432b0ae8 100644 --- a/_locales/hi-IN/messages.json +++ b/_locales/hi-IN/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "जानकारी" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "पिन करें" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "अनपिन करें" }, "icu:Poll__end-poll": { "messageformat": "पोल समाप्त करें" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "जारी रखें" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {पिन किया गया मैसेज} other {पिन किए गए मैसेज}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "और गतिविधियां" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "अनपिन करें" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "मैसेज पर जाएं" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "सभी मैसेज देखें" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "पता" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "ऑडियो मेसेज" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "फ़ाइल" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "कॉन्टैक्ट" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "भुगतान" }, @@ -5166,16 +5169,16 @@ "messageformat": "लिंक" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "इस तरह सॉर्ट करें" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "इस तरह सॉर्ट करें" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "तारीख" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "साइज़" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "मीडिया मौजूद नहीं है" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "आपकी पुरानी चैट एक्सपोर्ट नहीं की जा सकी, क्योंकि Signal के पास फ़ाइलों को डिस्क पर सेव करने की अनुमति नहीं है। अपने डिस्क की अनुमतियां बदलकर या सिस्टम सेटिंग अपडेट करके फिर से एक्सपोर्ट करने की कोशिश करें।" }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "चंद्रमा वाला आइकन" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "फिर से की देखें" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "बैकअप फ़ोल्डर" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "इससे हमें कॉल के बारे में ज़्यादा जानकारी पाने और यह समझने में मदद मिलती है कि क्या काम कर रहा है और क्या नहीं। सबमिट करने से पहले आपके पास अपना डीबग लॉग देखने का विकल्प होता है।" }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "डीबग लॉग शेयर करें" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "डीबग लॉग में ऐप की थोड़ी-बहुत तकनीकी जानकारी शामिल होती है, लेकिन इनसे आपके मैसेज के कॉन्टेंट का पता नहीं चलता।" }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "सबमिट करें" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "आपके फ़ीडबैक के लिए शुक्रिया!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "इस वर्ज़न में बग ठीक करने के साथ-साथ कई छोटे-छोटे बदलाव किए गए हैं, जिससे Signal की परफ़ॉर्मेंस और बेहतर हो सके।", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "कई छोटे सुधार किए गए हैं, बग हटाए गए हैं, और परफ़ॉर्मेंस बेहतर की गई है। Signal के साथ बने रहने के लिए धन्यवाद!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "डेस्कटॉप पर Signal पोल में अब वही छोटे ऐनिमेशन इफ़ेक्ट शामिल किए गए हैं जो आपके फ़ोन पर पहले से दिख रहे थे। बस किसी पोल में हिस्सा लें और अपने पसंदीदा विकल्प को जीत की ओर बढ़ते देखें।" - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "मीटिंग में हाथ उठते ही अचानक पैदा होने वाली खामोशी को तो हम ठीक नहीं कर सकते, लेकिन हमने एक गड़बड़ी ज़रूर ठीक कर दी है। इसमें कोई अगर बहुत जल्दी हाथ उठाकर नीचे कर देता था, तब भी हाथ उठाने का संकेत स्क्रीन पर मौजूद रहता था और उसकी गिनती शून्य दिखाई देती थी।" + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/hr-HR/messages.json b/_locales/hr-HR/messages.json index a163a81204..999cb46259 100644 --- a/_locales/hr-HR/messages.json +++ b/_locales/hr-HR/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Detalji" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Prikvači" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Otkvači" }, "icu:Poll__end-poll": { "messageformat": "Završi anketu" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Nastavi" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Prikvačena poruka} few {Prikvačene poruke} many {Prikvačenih poruka} other {Prikvačene poruke}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Više radnji" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Otkvači" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Idi na poruku" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Prikaži sve poruke" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Adresa" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Glasovna poruka" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Datoteka" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Kontakt" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Plaćanje" }, @@ -5166,16 +5169,16 @@ "messageformat": "Poveznice" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Poredaj po" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Poredaj po" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Datumu" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Veličini" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Nema medijskih zapisa" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Vaša povijest razgovora ne može se izvesti jer Signal nema dopuštenje za zapisivanje datoteka na disk. Pokušajte promijeniti dozvole diska ili ažurirati postavke sustava, a zatim ponovno pokušajte s izvozom." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ikona mjeseca" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Ponovno prikaži ključ" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Mapa sigurnosne kopije" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Vaše povratne informacije pomažu nam poboljšati pozive na Signalu. Možete pregledati zapisnik otklanjanja pogreške prije slanja." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Podijeli zapisnik otklanjanja pogreške" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Zapisnici otklanjanja pogrešaka sadrže informacije o aplikaciji niske razine i ne otkrivaju sadržaj vaših poruka." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Pošalji" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Hvala na povratnim informacijama!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Ova verzija Signala sadrži niz malih podešavanja i ispravaka programskih pogrešaka za nesmetano korištenje aplikacije.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Manja podešavanja, ispravci grešaka i poboljšanje rada aplikacije. Hvala vam što koristite Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Unaprijedili smo animacije za ankete na Signalu." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Ispravili smo manju programsku pogrešku u prikazu indikatora podignute ruke u grupnim pozivima." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/hu/messages.json b/_locales/hu/messages.json index f4a6ea26f5..ac6ba8e2d8 100644 --- a/_locales/hu/messages.json +++ b/_locales/hu/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Részletek" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Rögzítés" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Feloldás" }, "icu:Poll__end-poll": { "messageformat": "Szavazás befejezése" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Folytatás" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Rögzített üzenetek} other {Rögzített üzenetek}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "További tevékenységek" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Feloldás" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Ugrás az Üzenetekhez" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Összes üzenet megtekintése" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Cím" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Hangüzenet" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Fájl" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Névjegy" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Fizetés" }, @@ -5166,16 +5169,16 @@ "messageformat": "Hivatkozások" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Rendezés" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Rendezés" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Dátum" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Méret" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Nincs médiafájl" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "A csevegési előzményeid nem exportálhatók, mert a Signal nem rendelkezik engedéllyel fájlok lemezre írásához. Próbáld meg módosítani a lemezed engedélyeit vagy frissíteni a rendszerbeállításaidat, majd exportáld újra." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Hold ikon" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Kulcs újbóli megtekintése" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Biztonsági mentés mappája" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Ez segít többet megtudni a hívásokról, és arról, hogy mi működik és mi nem. Beküldés előtt megtekintheted a hibanaplót." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Hibanapló megosztása" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "A hibanaplók alacsony szintű alkalmazásinformációkat tartalmaznak, és nem fedik fel az üzenetek tartalmát." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Küldés" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Köszönjük a visszajelzésedet!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Ebbe a verzióba néhány kisebb újítás és hibajavítás került annak érdekében, hogy a Signal továbbra is gond nélkül fusson.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Apró finomítások, hibajavítások és teljesítménynövelések. Köszönjük, hogy a Signalt használod!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Az Asztalon megjelenő Signal-szavazatok mostantól ugyanazokat a finom animációs effektusokat tartalmazzák, mint amelyek már eddig is megjelentek a telefonodon. Csak egy szavazásnyira vagy attól, hogy kedvenc jelölted elhúzzon a többiektől." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Kijavítottunk egy kisebb megjelenítési hibát a felemelt kéz jelzőjével kapcsolatban a csoportos hívásokban." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/id/messages.json b/_locales/id/messages.json index 21a0900cbf..0ea43cb298 100644 --- a/_locales/id/messages.json +++ b/_locales/id/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Sematkan" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Lepas sematan" }, "icu:Poll__end-poll": { "messageformat": "Akhiri polling" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Lanjutkan" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {Pesan disematkan}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Tindakan lainnya" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Lepas sematan" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Buka pesan" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Lihat semua pesan" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Alamat" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Pesan suara" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "File" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Kontak" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Pembayaran" }, @@ -5166,16 +5169,16 @@ "messageformat": "Tautan" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Urut berdasarkan" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Urut berdasarkan" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Tanggal" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Ukuran" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Tidak Ada Media" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Riwayat chat Anda tidak dapat diekspor karena Signal tidak memiliki izin untuk menulis file ke disk. Coba ubah izin disk Anda atau perbarui pengaturan sistem dan kemudian ekspor lagi." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ikon bulan" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Lihat kunci lagi" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Folder cadangan" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Ini akan membantu kami mempelajari lebih lanjut kualitas panggilan serta mengetahui apa yang berfungsi dengan baik dan apa yang bermasalah. Anda dapat melihat catatan debug sebelum mengirim." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Bagikan catatan debug" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Catatan debug berisi informasi aplikasi tingkat rendah dan tidak mengungkapkan isi pesan Anda." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Kirim" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Terima kasih atas masukannya!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Versi ini mengandung sejumlah perubahan kecil dan perbaikan bug agar Signal tetap berjalan lancar.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Tambahan penyesuaian kecil, perbaikan bug, dan peningkatan performa. Terima kasih telah menggunakan Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Efek animasi keren untuk Polling yang tadinya hanya tersedia di ponsel, kini hadir di Desktop." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Hening sejenak saat ngobrol memang tak bisa kami tanggulangi, tapi kami telah memperbaiki bug ringan yang kadang terjadi pada indikator angkat tangan selama panggilan grup." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/it/messages.json b/_locales/it/messages.json index 19f740e3ff..fefcb589cd 100644 --- a/_locales/it/messages.json +++ b/_locales/it/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Informazioni" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Metti in evidenza" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Rimuovi elemento in evidenza" }, "icu:Poll__end-poll": { "messageformat": "Termina sondaggio" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Continua" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Messaggio in evidenza} other {Messaggi in evidenza}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Più azioni" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Rimuovi elemento in evidenza" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Vai al messaggio" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Vedi tutti i messaggi" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Indirizzo" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Messaggio vocale" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "File" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Contatto" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Pagamento" }, @@ -5166,16 +5169,16 @@ "messageformat": "Link" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Ordina per" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Ordina per" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Data" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Dimensioni" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Nessun file multimediale" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "La tua cronologia chat non può essere esportata perché Signal non ha le autorizzazioni necessarie per sovrascrivere i file sullo spazio di archiviazione. Prova a cambiare le autorizzazioni per lo spazio di archiviazione oppure ad aggiornare le impostazioni di sistema, poi riprova l'esportazione." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Icona della luna" }, @@ -5661,10 +5682,10 @@ "messageformat": "Impostazioni" }, "icu:NotificationProfilesToast--enabled": { - "messageformat": "\"{name}\" attivata" + "messageformat": "\"{name}\" attivato" }, "icu:NotificationProfilesToast--disabled": { - "messageformat": "\"{name}\" disattivata" + "messageformat": "\"{name}\" disattivato" }, "icu:NotificationProfilesToast--enabled--label": { "messageformat": "Profilo per le notifiche ora attivato" @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Mostra di nuovo la chiave" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Cartella dei backup" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Ciò ci aiuta a monitorare la qualità e il corretto funzionamento delle chiamate. Puoi vedere il tuo log di debug prima di inviarlo." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Condividi log di debug" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "I log di debug contengono informazioni di basso profilo sull'app e non rivelano in alcun modo il contenuto dei tuoi messaggi." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Invia" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Grazie per il tuo feedback!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Questa versione contiene una serie di piccole modifiche e correzioni di bug per far funzionare Signal senza problemi.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Altre piccole modifiche e correzioni di bug per far funzionare l'app senza problemi. Grazie per usare Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "I sondaggi di Signal su Desktop ora includono gli stessi discreti effetti di animazione che erano già presenti sul tuo telefono. Lascia che la tua scelta preferita spicchi il volo." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Beh, colpa nostra, ma esisteva un bug dove l'indicatore delle mani alzate rimaneva visibile (con un conteggio pari a 0) se una persona alzava e poi abbassava la mano velocemente." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/ja/messages.json b/_locales/ja/messages.json index 18ef0571dd..a9e7deeda2 100644 --- a/_locales/ja/messages.json +++ b/_locales/ja/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "詳細" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "ピン留め" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "ピン留めを解除する" }, "icu:Poll__end-poll": { "messageformat": "投票を終了" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "続ける" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {ピン留めされたメッセージ}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "その他" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "ピン留めを解除する" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "メッセージへ移動" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "すべてのメッセージを見る" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "住所" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "音声メッセージ" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "ファイル" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "連絡先" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "支払い" }, @@ -5166,16 +5169,16 @@ "messageformat": "リンク" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "並び替え条件" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "並び替え条件" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "日付" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "サイズ" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "メディアがありません" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Signalには、ディスクにファイルを書き込む権限がないため、チャット履歴をエクスポートできません。ディスクの権限を変更するか、システム設定を更新してからもう一度エクスポートしてください。" }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "月のアイコン" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "キーをもう一度見る" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "バックアップフォルダ" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "デバッグログを共有していただくことで、通話状況、何が機能しているか、もしくは何が機能していないか、などを把握できます。送信前にデバッグログを表示することができます。" }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "デバッグログを共有する" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "デバッグログには最低限のアプリ情報のみが含まれ、メッセージ内容は一切明らかにされません。" }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "送信する" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "フィードバックをありがとうございます!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Signalをスムーズに動作させるための微調整とバグ修正を行いました。", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "細かな微調整、バグ修正、パフォーマンスの向上。 Signalをご利用いただきありがとうございます。", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Signalの投票機能のアニメーションを改善しました。" - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "グループ通話中の、挙手回数表示に関する軽微なバグを修正しました。" + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/ka-GE/messages.json b/_locales/ka-GE/messages.json index 3bb4d17e99..c5ee2810b8 100644 --- a/_locales/ka-GE/messages.json +++ b/_locales/ka-GE/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "ინფორმაცია" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "აპინვა" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "პინის მოხსნა" }, "icu:Poll__end-poll": { "messageformat": "გამოკითხვის დასრულება" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "გაგრძელება" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {აპინული წერილები} other {აპინული წერილები}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "მეტი მოქმედება" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "პინის მოხსნა" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "წერილზე გადასვლა" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "ყველა წერილის ნახვა" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "მისამართი" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "ხმოვანი შეტყობინება" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "ფაილი" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "კონტაქტი" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "ტრანზაქცია" }, @@ -5166,16 +5169,16 @@ "messageformat": "ბმულები" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "დახარისხება" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "დახარისხება" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "თარიღი" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "ზომა" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "მედია-ფაილები ვერ მოიძებნა" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "შენი ჩატის ისტორიის გადატანა შეუძლებელია, რადგან Signal-ს დისკზე ფაილების ჩაწერის ნებართვა არ აქვს. შენი დისკის ნებართვების შეცვლა ან სისტემის პარამეტრების განახლება სცადე და თავიდან გადაიტანე." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "მთვარის ხატულა" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "გასაღების თავიდან ნახვა" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "სარეზერვო კოპიების შენახვის ადგილი" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "ეს გვეხმარება, მეტი გავიგოთ ზარებზე და იმაზე, რა მუშაობს ან არ მუშაობს. შეგიძლია შენი გაუმართაობის რეესტრი ატვირთვამდე ნახო." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "გაუმართაობის რეესტრის გაზიარება" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "გაუმართაობის რეესტრი აპის ქვედა დონის ინფორმაციას შეიცავს და შენი არც ერთი წერილის შინაარს არ ავლენს." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "დადასტურება" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "მადლობა უკუკავშირისთვის!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "ეს ვერსია შეიცავს უამრავ მცირე შესწორებას და ბაგების გამოსწორებებს Signal-ის შეუფერხებლად მუშაობის შესანარჩუნებლად.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "მცირე შესწორებები, ბაგების გამოსწორება და წარმადობის გაუმჯობესება. მადლობას გიხდით სიგნალის გამოყენებისთვის!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Signal-ის გამოკითხვები დესკტოპზე ახლა უკვე შეიცავს იმავე დახვეწილ ანიმაციურ ეფექტებს, რომლებიც აქამდეც ჩანდა შენს მობილურში. შენი არჩევანის დაწინაურებას მხოლოდ ერთი გამოკითხვა გაშორებს." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "უხერხულ დუმილს ვერაფერს ვუშველით, თუმცა გამოვასწორეთ ბაგი, რომლის გამოც „აწეული ხელის“ ინდიკატორი ხილული რჩებოდა ხელის სწრაფი აწევა-ჩამოწევის შემდე." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/kk-KZ/messages.json b/_locales/kk-KZ/messages.json index de46cebc2c..226a75ddf9 100644 --- a/_locales/kk-KZ/messages.json +++ b/_locales/kk-KZ/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Ақпарат" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Бекіту" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Босату" }, "icu:Poll__end-poll": { "messageformat": "Сауалнаманы аяқтау" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Жалғастыру" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Бекітілген хабар} other {Бекітілген хабарлар}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Басқа әрекеттер" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Босату" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Хабарға өту" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Барлық хабарды көру" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Мекенжай" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Дауыстық хат" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Файл" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Контакт" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Төлем" }, @@ -5166,16 +5169,16 @@ "messageformat": "Сілтемелер" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Сұрыптау реті" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Сұрыптау реті" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Күні" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Өлшемі" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Мультимедиа файлы жоқ" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Чат тарихын экспорттау мүмкін емес, себебі Signal-да файлдарды дискіге жазу рұқсаты жоқ. Диск рұқсаттарын өзгертіп немесе жүйе параметрлерін жаңартып, әрекетті қайталап көріңіз." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ай белгішесі" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Кілтті қайта көру" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Резервтік қалта" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Бұл қоңыраулар сапасы туралы толық ақпарат алуға, сондай-ақ ненің дұрыс, ал ненің бұрыс екенін түсінуге көмектеседі. Жібермес бұрын ақауларды түзету журналыңызды көруіңізге болады." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Ақауларды түзету журналын бөлісу" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Ақауларды түзету журналында төмен деңгейлі қолданба туралы ақпарат болады. Хабардағы контентті ешкімге көрсетпеңіз." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Жіберу" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Пікіріңіз үшін рақмет!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Бұл нұсқада Signal-дың еш кінәратсыз жұмыс істеуіне қажетті бірнеше шағын түзетпе жасалды және ақаулар түзетілді.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Кішігірім түзетпелер жасалды, ақаулар жөнделді және жұмысы жақсартылды. Signal-ды қолданғаныңыз үшін рақмет!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Жұмыс үстеліндегі Signal сауалнамалары енді телефоныңызда шығып жүрген жеңіл анимациялық эффектілерді қамтиды. Таңдаулы нұсқаның айқын алға шыққанын көру үшін сауалнамаға қатысу жеткілікті." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Кейіннен туындайтын қолайсыз тыныштықты түзете алмаймыз, алайда біреу қолын өте тез көтеріп-түсірген кезде, қол көтеру белгісі (саны нөл болса да) көрсетіліп тұра беретін ақауды түзеттік." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/km-KH/messages.json b/_locales/km-KH/messages.json index ddabe83604..e290c5d78d 100644 --- a/_locales/km-KH/messages.json +++ b/_locales/km-KH/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "ព័ត៌មាន" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "ខ្ទាស់" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "ឈប់ខ្ទាស់" }, "icu:Poll__end-poll": { "messageformat": "បញ្ចប់ការស្ទង់មតិ" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "បន្ត" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {សារដែលបានខ្ទាស់}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "សកម្មភាពច្រើនទៀត" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "ឈប់ខ្ទាស់" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "ចូលទៅកាន់សារ" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "មើលសារទាំងអស់" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "អាសយដ្ឋាន" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "សារសំឡេង" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "ឯកសារ" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "ទំនាក់ទំនង" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "ការបង់ប្រាក់" }, @@ -5166,16 +5169,16 @@ "messageformat": "តំណ" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "តម្រៀបតាម" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "តម្រៀបតាម" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "កាលបរិច្ឆេទ" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "ទំហំ" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "គ្មានមេឌៀ" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "ប្រវត្តិជជែករបស់អ្នកមិនអាចនាំចេញបានទេព្រោះ Signal មិនមានការអនុញ្ញាតឱ្យសរសេរឯកសារទៅឌីសទេ។ សាកល្បងផ្លាស់ប្តូរការអនុញ្ញាតនៃឌីសរបស់អ្នក ឬធ្វើបច្ចុប្បន្នភាពការកំណត់ប្រព័ន្ធរបស់អ្នក រួចនាំចេញម្តងទៀត។" }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "រូបព្រះចន្ទ" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "មើលសោម្តងទៀត" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "ថតឯកសារបម្រុងទុក" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "វាជួយយើងឱ្យស្វែងយល់បន្ថែមអំពីការហៅទូរសព្ទ និងអ្វីដែលដំណើរការ ឬមិនដំណើរការ។ អ្នកអាចមើលកំណត់ត្រាបញ្ហារបស់អ្នកមុនពេលដាក់បញ្ជូន។" }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "ចែករំលែកកំណត់ត្រាបញ្ហា" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "កំណត់ត្រាបញ្ហាមានព័ត៌មានកម្មវិធីកម្រិតទាប ហើយមិនបង្ហាញខ្លឹមសារនៃសារណាមួយរបស់អ្នកទេ។" }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "ដាក់បញ្ជូន" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "សូមអរគុណចំពោះមតិកែលម្អរបស់អ្នក!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "កំណែ​នេះ​មាន​ការ​កែ​សម្រួល និង​ការកែបញ្ហាតូចៗ​មួយ​ចំនួន ដើម្បី​ឲ្យ​ Signal បន្ត​ដំណើរការ​ដោយ​រលូន។", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "ការកែប្រែបន្តិចបន្តួច ការដោះស្រាយបញ្ហា និងការបង្កើនប្រតិបត្តិការ។ សូមអរគុណចំពោះការប្រើប្រាស់ Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "ការស្ទង់មតិ Signal នៅលើ Desktop ឥឡូវនេះរួមបញ្ចូលបែបផែនចលនាស្រាលៗដូចគ្នាដែលបានបង្ហាញរួចហើយនៅលើទូរសព្ទរបស់អ្នក។ ការបោះឆ្នោតរបស់អ្នកនៅក្នុងការស្ទង់មតិអាចជួយឱ្យជម្រើសដែលអ្នកចូលចិត្ត ឈ្នះគេឬអត់បាន។" - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "យើងបានដោះស្រាយបញ្ហាតូចមួយទាក់ទងនឹងការបង្ហាញ ដែលពេលខ្លះរូបលើកដៃឡើងនៅតែអាចមើលឃើញ ដោយគេគ្រាន់តែលើកដៃមួយភ្លែត រួចហើយដាក់ដៃចុះភ្លាមវិញ (ទោះបីជាគ្មាននរណាលើកដៃក៏ដោយ)។" + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/kn-IN/messages.json b/_locales/kn-IN/messages.json index de9c838bf9..f4a563b8e6 100644 --- a/_locales/kn-IN/messages.json +++ b/_locales/kn-IN/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "ಮಾಹಿತಿ" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "PIN" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "ಅನ್‌ಪಿನ್" }, "icu:Poll__end-poll": { "messageformat": "ಸಮೀಕ್ಷೆಯನ್ನು ಕೊನೆಗೊಳಿಸಿ" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "ಮುಂದುವರಿಸಿ" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {ಪಿನ್ ಮಾಡಲಾದ ಮೆಸೇಜ್} other {ಪಿನ್ ಮಾಡಲಾದ ಮೆಸೇಜ್‌ಗಳು}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "ಇನ್ನಷ್ಟು ಕ್ರಮಗಳು" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "ಅನ್‌ಪಿನ್" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "ಮೆಸೇಜ್‌ಗೆ ಹೋಗಿ" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "ಎಲ್ಲಾ ಮೆಸೇಜ್‌ಗಳನ್ನು ನೋಡಿ" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "ವಿಳಾಸ" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "ಧ್ವನಿ ಸಂದೇಶ" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "ಫೈಲ್" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "ಸಂಪರ್ಕ" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "ಪಾವತಿ" }, @@ -5166,16 +5169,16 @@ "messageformat": "ಲಿಂಕ್‌ಗಳು" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "ಈ ಪ್ರಕಾರ ವಿಂಗಡಿಸಿ" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "ಈ ಪ್ರಕಾರ ವಿಂಗಡಿಸಿ" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "ದಿನಾಂಕ" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "ಗಾತ್ರ" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "ಮೀಡಿಯಾ ಇಲ್ಲ" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Signal ಡಿಸ್ಕ್‌ಗೆ ಫೈಲ್‌ಗಳನ್ನು ಬರೆಯಲು ಅನುಮತಿ ಹೊಂದಿಲ್ಲದ ಕಾರಣ ನಿಮ್ಮ ಚಾಟ್ ಇತಿಹಾಸವನ್ನು ಎಕ್ಸ್‌ಪೋರ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ಡಿಸ್ಕ್‌ನ ಅನುಮತಿಗಳನ್ನು ಬದಲಾಯಿಸಲು ಅಥವಾ ನಿಮ್ಮ ಸಿಸ್ಟಂ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ ಮತ್ತು ನಂತರ ಮತ್ತೆ ಎಕ್ಸ್‌ಪೋರ್ಟ್ ಮಾಡಿ." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "ಮೂನ್ ಐಕಾನ್" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "ಕೀಯನ್ನು ಮತ್ತೊಮ್ಮೆ ನೋಡಿ" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "ಬ್ಯಾಕಪ್‌ ಫೋಲ್ಡರ್‌" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "ಇದು ಕರೆಗಳ ಬಗ್ಗೆ ಮತ್ತು ಯಾವುದು ಕೆಲಸ ಮಾಡುತ್ತಿದೆ ಅಥವಾ ಯಾವುದು ಕೆಲಸ ಮಾಡುತ್ತಿಲ್ಲ ಎಂಬುದರ ಕುರಿತು ಇನ್ನಷ್ಟು ತಿಳಿದುಕೊಳ್ಳಲು ನಮಗೆ ಸಹಾಯ ಮಾಡುತ್ತದೆ. ಸಲ್ಲಿಸುವ ಮೊದಲು ನಿಮ್ಮ ಡೀಬಗ್ ಲಾಗ್ ಅನ್ನು ನೀವು ವೀಕ್ಷಿಸಬಹುದು." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "ಡೀಬಗ್ ಲಾಗ್ ಹಂಚಿಕೊಳ್ಳಿ" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "ಡೀಬಗ್ ಲಾಗ್‌ಗಳು ಕಡಿಮೆ ಪ್ರಮಾಣದ ಆ್ಯಪ್ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಿರುತ್ತವೆ ಮತ್ತು ನಿಮ್ಮ ಯಾವುದೇ ಮೆಸೇಜ್ ಕಂಟೆಂಟ್‌ಗಳನ್ನು ಬಹಿರಂಗಪಡಿಸುವುದಿಲ್ಲ." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "ಸಲ್ಲಿಸಿ" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "ನಿಮ್ಮ ಫೀಡ್‌ಬ್ಯಾಕ್‌ಗೆ ಧನ್ಯವಾದಗಳು!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": " Signal ಅನ್ನು ಸರಾಗವಾಗಿ ಚಾಲ್ತಿಯಲ್ಲಿಡಲು ಈ ಆವೃತ್ತಿಯು ಸಾಕಷ್ಟು ಸಣ್ಣ ಟ್ವೀಕ್‌ಗಳನ್ನು ಹೊಂದಿದೆ ಮತ್ತು ಬಗ್ ಫಿಕ್ಸ್‌ಗಳನ್ನು ಹೊಂದಿದೆ.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "ಸಣ್ಣ ಟ್ವೀಕ್‌ಗಳು, ಬಗ್ ಫಿಕ್ಸ್‌ಗಳು ಮತ್ತು ಕಾರ್ಯಕ್ಷಮತೆ ವರ್ಧನೆಗಳು. Signal ಬಳಸುತ್ತಿರುವುದಕ್ಕಾಗಿ ಧನ್ಯವಾದಗಳು!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "ಡೆಸ್ಕ್‌ಟಾಪ್‌ನಲ್ಲಿನ Signal ಸಮೀಕ್ಷೆಗಳು ಈಗ ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ ಈಗಾಗಲೇ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತಿದ್ದ ಅದೇ ಸೂಕ್ಷ್ಮ ಅನಿಮೇಷನ್ ಎಫೆಕ್ಟ್‌ಗಳನ್ನು ಒಳಗೊಂಡಿವೆ. ನಿಮ್ಮ ನೆಚ್ಚಿನ ಆಯ್ಕೆಯನ್ನು ಹಿಂಪಡೆಯುವುದನ್ನು ವೀಕ್ಷಿಸುವುದು ಕೇವಲ ಒಂದು ಸಮೀಕ್ಷೆಯ ದೂರದಲ್ಲಿದೆ." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "ನಂತರದ ವಿಚಿತ್ರವಾದ ಮೌನವನ್ನು ನಾವು ಸರಿಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ, ಆದರೆ ಯಾರಾದರೂ ನಿಜವಾಗಿಯೂ ಬೇಗನೆ ಕೈ ಎತ್ತಿ ಕೆಳಕ್ಕೆ ಇಳಿಸಿದರೆ ಕೆಲವೊಮ್ಮೆ ಎತ್ತಿದ ಕೈ ಸೂಚಕವು ಗೋಚರಿಸುವುದಕ್ಕೆ (ಶೂನ್ಯ ಎಣಿಕೆಯೊಂದಿಗೆ) ಕಾರಣವಾಗುವ ಬಗ್ ಅನ್ನು ನಾವು ಸರಿಪಡಿಸಿದ್ದೇವೆ." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/ko/messages.json b/_locales/ko/messages.json index d87f8b3e4e..7152fd2c6a 100644 --- a/_locales/ko/messages.json +++ b/_locales/ko/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "정보" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "고정" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "고정 해제" }, "icu:Poll__end-poll": { "messageformat": "설문조사 종료" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "계속" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {고정 메시지}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "더 많은 작업" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "고정 해제" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "메시지로 이동" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "모든 메시지 보기" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "주소" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "음성 메시지" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "파일" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "연락처" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "결제" }, @@ -5166,16 +5169,16 @@ "messageformat": "링크" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "정렬 방법" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "정렬 방법" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "날짜" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "크기" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "미디어 없음" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Signal은 디스크에 파일을 쓸 권한이 없어 대화 기록을 내보낼 수 없습니다. 디스크 사용 권한을 변경하거나 시스템 설정을 업데이트한 다음 내보내기를 다시 시도해 보세요." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "달 아이콘" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "키 다시 보기" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "백업 폴더" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "이를 통해 통화 품질을 점검하고 개선점을 찾는 데 활용됩니다. 피드백은 디버그 로그를 확인한 후 제출할 수 있습니다." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "디버그 로그 공유" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "디버그 로그에는 낮은 수준의 앱 정보가 포함되어 있으며, 메시지 내용은 공개되지 않습니다." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "제출" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "피드백을 보내주셔서 감사합니다!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "이 버전에는 Signal의 원활한 실행을 위한 일부 기능 업데이트와 버그 수정이 다수 포함되어 있습니다.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "사소한 변경 사항과 버그 수정 및 성능 개선. Signal을 이용해 주셔서 감사합니다!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Signal 설문조사의 애니메이션을 개선했습니다." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "그룹 통화에서 손 든 사람 표시가 제대로 나타나지 않던 사소한 버그를 수정했습니다." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/ky-KG/messages.json b/_locales/ky-KG/messages.json index 65a0490870..27dfe773a7 100644 --- a/_locales/ky-KG/messages.json +++ b/_locales/ky-KG/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Маалымат" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Кадоо" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Бошотуу" }, "icu:Poll__end-poll": { "messageformat": "Добуш берүүнү бүтүрүү" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Улантуу" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {Кадалган билдирүүлөр}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Дагы" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Бошотуу" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Билдирүүгө өтүү" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Бардык билдирүүлөрдү көрүү" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Дарек" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Аудио билдирүү" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Файл" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Байланыш" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Төлөм" }, @@ -5166,16 +5169,16 @@ "messageformat": "Шилтемелер" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Кантип иргелет:" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Кантип иргелет:" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Күн боюнча" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Өлчөм боюнча" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Эч нерсе жок" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Signal'га файлдарды дискке жазганга уруксат берилбегендиктен, маек таржымалын экспорттой албайсыз. Уруксат берип же системанын параметрлерин өзгөртүп, кайра экспорттоп көрүңүз." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Айдын сүрөтчөсү" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Ачкычты кайра көрүү" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Камдык көчүрмөлөрдүн папкасы" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Чалуулар тууралуу кененирээк маалымат алып, эмнелер иштеп же иштебей жатканын биле алабыз. Жөнөтөрдөн мурун аныкталган мүчүлүштүктөрдү карап көрсөңүз болот." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Мүчүлүштүктөр журналын бөлүшүү" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Мүчүлүштүктөр журналында төмөнкү деңгээлдеги колдонмолор тууралуу маалымат камтылып, билдирүүлөрүңүздөгү нерселерди ачыктабаңыз." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Тапшыруу" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Пикириңиз үчүн чоң рахмат!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Бул версия бир нече майда өзгөртүүлөрдү жана мүчүлүштүктөрдү оңдоолорду камтыйт.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Майда-барат өзгөрүүлөрдү киргизип, мүчүлүштүктөрдү оңдоп, колдонмонун иштешин жакшыртып жатабыз. Signal'ды колдонгонуңуз үчүн чоң рахмат!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Компьютердеги Signal'дын сурамжылоолору эми телефондогудай сонун анимациялар менен коштолот. Бир добуш көп нерсени чечип коет." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Оңтойсуз тынчтыкты буза албайбыз, бирок кээде көз ачып жумгуча көтөрүлүп түшүрүлгөн кол көрүнбөй калган мүчүлүштүктү оңдоп койдук (нөл деп эсептелген)." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/lt-LT/messages.json b/_locales/lt-LT/messages.json index 085f5d0b4c..90053b7621 100644 --- a/_locales/lt-LT/messages.json +++ b/_locales/lt-LT/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Informacija" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Prisegti" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Atsegti" }, "icu:Poll__end-poll": { "messageformat": "Baigti apklausą" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Tęsti" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Prisegta žinutė} few {Prisegtos žinutės} many {Prisegtos žinutės} other {Prisegtų žinučių}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Daugiau veiksmų" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Atsegti" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Eiti į žinutę" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Žiūrėti visas žinutes" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Adresas" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Balso žinutė" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Failas" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Adresatas" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Mokėjimas" }, @@ -5166,16 +5169,16 @@ "messageformat": "Nuorodos" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Rikiuoti pagal" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Rikiuoti pagal" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Data" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Dydis" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Nėra medijos" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Jūsų pokalbių istorijos negalima eksportuoti, nes „Signal“ neturi leidimo įrašyti failus į diską. Pabandykite pakeisti disko leidimus arba atnaujinti sistemos nustatymus ir tada eksportuoti dar kartą." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Mėnulio piktograma" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Rodyti raktą dar kartą" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Atsarginių kopijų aplankas" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Tai padeda mums daugiau sužinoti apie skambučius ir tai, kas veikia ir neveikia. Prieš pateikdami derinimo žurnalą galite jį peržiūrėti." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Bendrinti derinimo žurnalą" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Derinimo žurnaluose pateikiama žemojo lygmens informacija apie programėlę ir neatskleidžiamas joks jūsų žinučių turinys." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Pateikti" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Ačiū už atsiliepimą!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Šioje versijoje yra daug smulkių patobulinimų ir klaidų ištaisymų, kurie padės Signal sklandžiai veikti.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Smulkūs patobulinimai, klaidų pataisymai ir veikimo pagerinimas. Ačiū, kad naudoji „Signal“!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Patobulinta „Signal“ apklausų animacija." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Ištaisėme nedidelę rodymo klaidą, susijusią su pakeltos rankos indikatoriumi grupės skambučiuose." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/lv-LV/messages.json b/_locales/lv-LV/messages.json index 5c3c52c708..e80f8c01dc 100644 --- a/_locales/lv-LV/messages.json +++ b/_locales/lv-LV/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Informācija" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Piespraust" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Atspraust" }, "icu:Poll__end-poll": { "messageformat": "Pabeigt aptauju" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Turpināt" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, zero {Piespraustās ziņas} one {Piespraustās ziņas} other {Piespraustās ziņas}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Citas darbības" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Atspraust" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Doties uz ziņu" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Skatīt visas ziņas" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Adrese" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Balss ziņa" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Fails" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Kontakts" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Maksājums" }, @@ -5166,16 +5169,16 @@ "messageformat": "Saites" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Kārtot pēc" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Kārtot pēc" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Datums" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Izmērs" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Nav multivides" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Sarunu vēsturi nevar eksportēt, jo Signal nav atļaujas ierakstīt failus diskā. Mēģiniet mainīt diska atļaujas vai atjaunināt sistēmas iestatījumus un pēc tam eksportējiet vēlreiz." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Mēness ikona" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Skatīt atslēgu vēlreiz" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Rezerves kopiju mape" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Tas palīdz mums uzlabot zvanus un saprast, kas darbojas vai nedarbojas. Pirms iesniegšanas varat apskatīt atkļūdošanas žurnālu." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Kopīgot atkļūdošanas žurnālu" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Atkļūdošanas žurnāli satur tikai tehnisku informāciju par lietotni un neatklāj jūsu ziņu saturu." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Iesniegt" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Paldies par atsauksmēm!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Šī versija ietver vairākus nelielus uzlabojumus un kļūdu labojumus, lai Signal darbotos bez problēmām.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Nelielas izmaiņas, kļūdu labojumi un darbības uzlabojumi. Paldies, ka lietojat Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Tagad arī Signal aptaujās uz datora redzēsiet tās pašas animācijas, kas pieejamas mobilajā lietotnē. Lai redzētu, kā tavs mīļākais atbilžu variants izvirzās vadībā, atliek izveidot kādu aptauju." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Mēs nevaram novērst neveiklu klusumu, toties mēs novērsām kļūdu, kuras dēļ paceltas rokas indikators reizēm vēl aizvien palika redzams, kad kāds strauji pacēla un nolaida roku." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/mk-MK/messages.json b/_locales/mk-MK/messages.json index 46f5ca3d53..64c4bbadef 100644 --- a/_locales/mk-MK/messages.json +++ b/_locales/mk-MK/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Информации" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Закачи" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Откачи" }, "icu:Poll__end-poll": { "messageformat": "Затворете ја анкетата" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Продолжи" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Закачена порака} other {Закачени пораки}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Повеќе дејствија" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Откачи" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Одете до пораката" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Видете ги сите пораки" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Адреса" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Гласовна порака" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Датотека" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Контакт" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Плаќања" }, @@ -5166,16 +5169,16 @@ "messageformat": "Линкови" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Сортирај по" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Сортирај по" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Датум" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Големина" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Нема медиумска датотека" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Вашата историја на разговори не може да се извезе бидејќи Signal нема дозвола да зачува датотеки на вашиот диск. Обидете се да ги промените дозволите на дискот или да ги ажурирате системските поставки, а потоа повторно извезете." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Икона месечина" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Повторно видете го клучот" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Папка за резервна копија" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Ова ни помага да дознаеме повеќе за повиците и што функционира, а што не. Можете да го видите вашиот запис за отстранување грешки пред да го испратите." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Споделете запис за дебагирање" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Записите за дебагирање содржат информации за апликацијата од ниско ниво и не откриваат никаква содржина на вашите пораки." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Испрати" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Ви благодариме за коментарите!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Оваа верзија има некои мали подобрувања и решени багови за Signal да функционира беспрекорно.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Mали подобрувања, решени багови и подобрувања на перформансот. Ви благодариме што користите Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Подобрена анимација на Signal анкетите." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Поправивме мала дисплеј грешка со индикаторот за крената рака во групните повици." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/ml-IN/messages.json b/_locales/ml-IN/messages.json index 64008c2b98..a8a4e2ccbb 100644 --- a/_locales/ml-IN/messages.json +++ b/_locales/ml-IN/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "വിവരം" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "പിൻ ചെയ്യുക" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "അൺപിൻ ചെയ്യുക" }, "icu:Poll__end-poll": { "messageformat": "പോൾ അവസാനിപ്പിക്കുക" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "തുടരുക" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {പിൻ ചെയ്ത സന്ദേശം} other {പിൻ ചെയ്ത സന്ദേശങ്ങൾ}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "കൂടുതൽ പ്രവർത്തനങ്ങൾ" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "അൺപിൻ ചെയ്യുക" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "സന്ദേശത്തിലേക്ക് പോകുക" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "എല്ലാ സന്ദേശങ്ങളും കാണുക" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "മേൽവിലാസം" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "ശബ്ദ സന്ദേശം" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "ഫയൽ" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "കോൺ‌ടാക്റ്റ്" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "പേയ്മെന്റ്" }, @@ -5166,16 +5169,16 @@ "messageformat": "ലിങ്കുകൾ" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "ഇങ്ങനെ അടുക്കുക" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "ഇങ്ങനെ അടുക്കുക" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "തീയതി" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "വലുപ്പം" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "ഒന്നുമില്ല" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Signal-ന് ഡിസ്കിലേക്ക് ഫയലുകൾ എഴുതാൻ അനുമതിയില്ലാത്തതിനാൽ നിങ്ങളുടെ ചാറ്റ് ചരിത്രം എക്സ്പോർട്ട് ചെയ്യാൻ കഴിയില്ല. നിങ്ങളുടെ ഡിസ്കിന്റെ അനുമതികൾ മാറ്റാനോ സിസ്റ്റം ക്രമീകരണങ്ങൾ അപ്ഡേറ്റ് ചെയ്യാനോ ശ്രമിക്കുക, തുടർന്ന് വീണ്ടും എക്സ്പോർട്ട് ചെയ്യുക." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "മൂൺ ഐക്കൺ" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "കീ വീണ്ടും കാണുക" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "ബാക്കപ്പ് ഫോൾഡർ" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "കോളുകളെക്കുറിച്ചും എന്താണ് പ്രവർത്തിക്കുന്നത് അല്ലെങ്കിൽ പ്രവർത്തിക്കാത്തത് എന്നതിനെക്കുറിച്ചും കൂടുതലറിയാൻ ഇത് ഞങ്ങളെ സഹായിക്കുന്നു. സമർപ്പിക്കുന്നതിന് മുമ്പ് നിങ്ങളുടെ ഡീബഗ് ലോഗ് കാണാൻ കഴിയും." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "ഡീബഗ് ലോഗ് പങ്കിടുക" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "ഡീബഗ് ലോഗുകളിൽ താഴ്ന്ന നിലയിലുള്ള ആപ്പ് വിവരങ്ങൾ അടങ്ങിയിരിക്കുന്നു, നിങ്ങളുടെ സന്ദേശ ഉള്ളടക്കങ്ങളൊന്നും അവ വെളിപ്പെടുത്തുന്നില്ല." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "സമർപ്പിക്കുക" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "നിങ്ങളുടെ പ്രതികരണത്തിന് നന്ദി!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Signal സുഗമമായി പ്രവർത്തിപ്പിക്കുന്നതിന് ആവശ്യമായ ഏതാനും ചെറിയ മാറ്റങ്ങളും ബഗ് ഫിക്‌സുകളും ഈ പതിപ്പിൽ അടങ്ങിയിട്ടുണ്ട്.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "ചെറിയ മാറ്റങ്ങളും ബഗ് പരിഹരിക്കലുകളും പ്രകടന മെച്ചപ്പെടുത്തലുകളും. Signal ഉപയോഗിക്കുന്നതിന് നന്ദി!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "ഡെസ്‌ക്‌ടോപ്പിലെ Signal പോളുകളിൽ ഇപ്പോൾ നിങ്ങളുടെ ഫോണിൽ ദൃശ്യമാകുന്ന അതേ സൂക്ഷ്മമായ ആനിമേഷൻ ഇഫക്റ്റുകൾ ഉൾപ്പെടുന്നു. പോളിൽ പങ്കെടുക്കുന്നതിലൂടെ നിങ്ങൾക്ക് പ്രിയപ്പട്ടവയെ മുൻനിരയിലെത്തിക്കാൻ നിങ്ങൾക്കാകും." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "തുടർന്നുണ്ടാകുന്ന അസ്വാഭാവികമായ നിശബ്ദത പരിഹരിക്കാൻ ഞങ്ങൾക്ക് കഴിയില്ല, എന്നാൽ ആരെങ്കിലും വളരെ വേഗത്തിൽ കൈ ഉയർത്തുകയും താഴ്ത്തുകയും ചെയ്താൽ ഉയർത്തിയ കൈ സൂചകം ദൃശ്യമാകുന്ന ഒരു ബഗ് (പൂജ്യം എണ്ണത്തിൽ) ഞങ്ങൾ പരിഹരിച്ചിട്ടുണ്ട്." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/mr-IN/messages.json b/_locales/mr-IN/messages.json index dac55b0a27..d35e8c263e 100644 --- a/_locales/mr-IN/messages.json +++ b/_locales/mr-IN/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "माहिती" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "पिन" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "अनपिन करा" }, "icu:Poll__end-poll": { "messageformat": "पोल समाप्त करा" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "सुरू ठेवा" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {पिन केलेला संदेश} other {पिन केलेले संदेश}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "अधिक क्रिया" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "अनपिन करा" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "संदेशामध्ये जा" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "सगळे संदेश पाहा" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "पत्ता" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "व्हॉईस संदेश" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "फाईल" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "संपर्क" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "पेमेंट" }, @@ -5166,16 +5169,16 @@ "messageformat": "लिंक्स" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "यानुसार क्रमवारी लावा" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "यानुसार क्रमवारी लावा" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "दिनांक" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "माप" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "कुठलीही मिडिया नाही" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "तुमचा चॅट इतिहास एक्सपोर्ट करता येत नाही कारण Signal कडे फाईल्स डिस्कवर राइट करण्याची अनुमती नाही. तुमच्या डिस्कच्या परवानग्या बदलून पाहा किंवा तुमच्या सिस्टीमच्या सेटिंग्ज अद्ययावत करा आणि मग पुन्हा एक्सपोर्ट करा." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "चंद्राचा आयकन" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "की पुन्हा पहा" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "बॅकअप फोल्डर" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "यामुळे आम्हाला कॉल्सविषयी अधिक जाणून घेण्यास मदत होते आणि काय काम करत आहे व काय करत नाही हे समजून घेता येते. तुम्ही सबमिट करण्यापूर्वी तुमचा डीबग लॉग पाहू शकता." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "डीबग लॉग शेअर करा" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "डीबग लॉग्समध्ये ॲपची अल्प प्रमाणात माहिती असते आणि त्यांमधून तुमच्या संदेशांमधील कोणताही मजकूर उघड होत नाही." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "प्रविष्ट करा" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "तुमच्या प्रतिसादाबद्दल धन्यवाद!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Signal निर्विघ्नपणे चालत ठेवण्यासाठी या आवृत्तीत अनेक लहान समन्वय आणि त्रुटी दुरुस्त्या समाविष्ट आहेत", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "लहान ट्विक्स, दोष निवारण, आणि कामगिरी सुधारणा. Signal वापरल्याबद्दल आभारी आहोत!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "डेस्कटॉप वरील Signal पोल मध्ये सुद्धा आता तुमच्या फोनवर दिसणारे अ‍ॅनिमेशन ईफेक्ट दिसतील. तुमच्या आवडीचा पर्याय कसा निवडून येतो हे पाहण्यासाठी फक्त एका पोलचा अवकाश आहे." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "आम्ही गट कॉल्समधील एक छोटा डिस्प्ले बग दुरुस्त केला ज्यामुळे हात उचलल्याचा इंडिकेटर काम झाल्यावरही दिसत राहायचा (शून्य मोजणीसह)." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/ms/messages.json b/_locales/ms/messages.json index 840ae4efa1..998977abc7 100644 --- a/_locales/ms/messages.json +++ b/_locales/ms/messages.json @@ -1086,7 +1086,7 @@ "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Nyahpin" }, "icu:Poll__end-poll": { "messageformat": "Tamatkan Undian" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Teruskan" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {Mesej yang dipinkan}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Lebih tindakan" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Nyahpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Pergi ke Mesej" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Lihat semua Mesej" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Alamat" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Mesej suara" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Fail" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Kenalan" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Pembayaran" }, @@ -5166,16 +5169,16 @@ "messageformat": "Pautan" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Susun mengikut" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Susun mengikut" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Tarikh" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Saiz" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Tiada media" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Sejarah sembang anda tidak boleh dieksport kerana Signal tidak mempunyai kebenaran untuk menulis fail ke cakera. Cuba tukar keizinan cakera anda atau kemas kini tetapan sistem anda dan kemudian eksport semula." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ikon bulan" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Lihat kunci lagi" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Folder backup" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Ini membantu kami mengetahui lebih lanjut tentang panggilan dan perkara yang berfungsi atau tidak berfungsi. Anda boleh melihat log nyahpepijat anda sebelum menghantar." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Kongsi log nyahpepijat" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Log nyahpepijat mengandungi maklumat aplikasi tahap rendah dan tidak mendedahkan sebarang kandungan mesej anda." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Hantar" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Terima kasih atas maklum balas anda!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Versi ini mengandungi sedikit tweak kecil dan pembetulan pepijat untuk memastikan Signal berjalan dengan lancar.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Sedikit pengubahsuaian, pembaikan pepijat dan peningkatan prestasi. Terima kasih kerana menggunakan Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Animasi untuk undian Signal dipertingkatkan." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Kami telah membetulkan pepijat paparan kecil pada penunjuk angkat tangan dalam panggilan kumpulan." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/my/messages.json b/_locales/my/messages.json index 59c75ce329..e5b4f58c67 100644 --- a/_locales/my/messages.json +++ b/_locales/my/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "အချက်အလက်" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "ပင်တွဲရန်" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "ပင်ဖြုတ်ရန်" }, "icu:Poll__end-poll": { "messageformat": "စစ်တမ်း အဆုံးသတ်" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "ဆက်လုပ်ရန်" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {ပင်တွဲထားသော မက်ဆေ့ချ်များ}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "နောက်ထပ် လုပ်ဆောင်မှုများ" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "ပင်ဖြုတ်ရန်" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "မက်ဆေ့ချ်သို့ သွားပါ" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "မက်ဆေ့ချ်အားလုံးကို ကြည့်ရှုရန်" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "လိပ်စာ" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "အသံ မက်ဆေ့ချ်" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "ဖိုင်" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "အဆက်အသွယ်" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "ငွေပေးချေမှု" }, @@ -5166,16 +5169,16 @@ "messageformat": "လင့်ခ်များ" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "၎င်းအလိုက်စီစဥ်ပါ" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "၎င်းအလိုက်စီစဥ်ပါ" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "ရက်စွဲ" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "အရွယ်အစား" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "မီဒီယာမရှိပါ" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Signal တွင် ဖိုင်များရေးရန် ခွင့်ပြုချက်မရှိသောကြောင့် သင့်ချက်(တ်)မှတ်တမ်းကို ထုတ်ယူ၍မရပါ။ သင့်ဒစ်ခ်၏ ခွင့်ပြုချက်များကို ပြောင်းလဲကြည့်ပါ သို့မဟုတ် သင့်စနစ်ဆက်တင်ကို အပ်ဒိတ်လုပ်ပြီး ထပ်မံထုတ်ယူကြည့်ပါ။" }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "လပုံစံ အိုင်ကွန်" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "ကီး ကိုပြန်ကြည့်ရန်" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "ဘက်ခ်အပ် ဖိုင်တွဲ" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "၎င်းက ဖုန်းခေါ်ဆိုမှုများအပြင် မည်သည့်အရာများက ကောင်းစွာ အလုပ်လုပ်သည်၊ မလုပ်သည်ကို ပိုမိုလေ့လာရန် ကူညီပေးပါသည်။ တင်သွင်းခြင်းမပြုမီ သင်၏ ပြစ်ချက်မှတ်တမ်းကို ကြည့်ရှုနိုင်ပါသည်။" }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "ပြစ်ချက်မှတ်တမ်း မျှဝေရန်" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "ပြစ်ချက်ရှာဖွေပြုပြင်မှု မှတ်တမ်းများတွင် အဆင့်နိမ့် အက်ပ်အချက်အလက်များ ပါဝင်ပြီး သင်၏မက်ဆေ့ချ်တွင် ပါရှိသော မည်သည့်အကြောင်းအရာကိုမျှ ထုတ်ဖော်ခြင်းမပြုပါ။" }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "တင်မည်" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "သင့်အကြံပြုချက်အတွက် ကျေးဇူးတင်ပါသည်။" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "ဤဗားရှင်းတွင် Signal အား အထစ်အငေါ့မရှိ လုပ်ဆောင်နိုင်စေရန် ချို့ယွင်းချက် ပြင်ဆင်မှုများနှင့် အနေအထား ပြုပြင်မှု အသေးလေးများ ပါဝင်ပါသည်။", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "အနေအထား ပြုပြင်မှုလေးများ၊ ချို့ယွင်းချက် ပြင်ဆင်မှုများနှင့် စွမ်းဆောင်ရည် မြှင့်တင်မှုများ။ Signal ကို သုံးသည့်အတွက် ကျေးဇူးတင်ပါသည်။", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Signal စစ်တမ်းတွင် အန်နီမေးရှင်းကို ပိုမိုကောင်းမွန်အာင်ပြုလုပ်ထားပါသည်။" - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "အဖွဲ့လိုက်ခေါ်ဆိုမှုများတွင် ချွတ်ယွင်းချက်အသေးအဖွဲဖြစ်သော လက်ထောင်ထားသည့်ညွှန်ပြချက် ရုပ်ပုံကို ပြင်ဆင်ထားပါသည်။" + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/nb/messages.json b/_locales/nb/messages.json index bf20d10f58..e14d1a8296 100644 --- a/_locales/nb/messages.json +++ b/_locales/nb/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Fest" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Løsne" }, "icu:Poll__end-poll": { "messageformat": "Avslutt avstemningen" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Fortsett" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Festet melding} other {Festede meldinger}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Flere funksjoner" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Løsne" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Gå til meldingen" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Se alle meldinger" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Adresse" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Talemelding" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Fil" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Kontakt" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Betaling" }, @@ -5166,16 +5169,16 @@ "messageformat": "Lenker" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Sorter etter" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Sorter etter" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Dato" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Størrelse" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Ingen mediefiler" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Samtaleloggen din kunne ikke eksporteres fordi Signal ikke har tillatelse til å lagre filer på disken din. Du må endre tillatelsene for disken eller systeminnstillingene før du kan prøve på nytt." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Måneikon" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Se koden igjen" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Mappe for sikkerhetskopi" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Dette gir oss mer innsikt i hva som virker og ikke virker i samtaler. Du kan se gjennom feilsøkingsloggen før du sender den inn." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Del feilsøkingslogg" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Feilsøkingslogger består av enkle opplysninger fra appen og viser ikke innholdet i meldingene dine." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Send" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Takk for tilbakemeldingen!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Denne versjonen inneholder noen justeringer og feilrettinger som sikrer at Signal fungerer optimalt.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Noen små justeringer, feilrettinger og ytelsesforbedringer. Takk for at du bruker Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Animasjonene i Signal-avstemninger har blitt forbedret." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Vi rettet opp i en liten feil med indikatoren som viser at noen har rukket opp hånden i en gruppesamtale." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/nl/messages.json b/_locales/nl/messages.json index a77870c654..d6c574d36e 100644 --- a/_locales/nl/messages.json +++ b/_locales/nl/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Bericht­details" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Vastzetten" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Losmaken" }, "icu:Poll__end-poll": { "messageformat": "Peiling beëindigen" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Doorgaan" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Vastgezet bericht} other {Vastgezette berichten}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Meer acties" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Losmaken" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Naar bericht gaan" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Alle berichten bekijken" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Adres" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Spraakbericht" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Bestand" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Contact" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Betaling" }, @@ -3522,7 +3525,7 @@ "messageformat": "Je hebt {otherName} gedempt." }, "icu:CallControls__YouMutedYourselfToast": { - "messageformat": "Je hebt jezelf op een ander apparaat gedempt." + "messageformat": "Je hebt jezelf vanaf een ander apparaat gedempt." }, "icu:CallControls__LowerHandSuggestionToast": { "messageformat": "Hand omlaag doen?" @@ -5166,16 +5169,16 @@ "messageformat": "Links" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Sorteren op" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Sorteren op" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Datum" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Bestandsgrootte" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Geen media" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Je chatgeschiedenis kan niet worden geëxporteerd omdat Signal geen toestemming heeft om bestanden naar de schijf te schrijven. Probeer de rechten van je schijf te wijzigen of je systeeminstellingen bij te werken en exporteer dan opnieuw." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Maanpictogram" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Sleutel opnieuw weergeven" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Back-uplocatie" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Dit helpt ons om oproepen in Signal te verbeteren. Je kunt je foutopsporingslog bekijken voordat je het indient." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Foutopsporingslog delen" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Foutopsporingslogs bevatten app-informatie op laag niveau en geven geen informatie over de inhoud van je berichten." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Uploaden" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Bedankt voor je feedback!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Deze versie bevat een aantal kleine foutoplossingen waardoor Signal voor nog meer mensen goed werkt.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Kleine aanpassingen, bugfixes en prestatieverbeteringen. Bedankt dat je Signal gebruikt!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Peilingen in Signal Desktop hebben nu dezelfde subtiele animatie-effecten als op je telefoon." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "We kunnen de ongemakkelijke stilte die daarop volgt niet verhelpen, maar we hebben wel een bug opgelost die er soms voor zorgde dat de opgestoken handindicator zichtbaar bleef (met een telling van nul) als iemand zijn hand heel snel opstak en weer liet zakken." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/pa-IN/messages.json b/_locales/pa-IN/messages.json index 1cb55fe7f1..b6c8e2eff6 100644 --- a/_locales/pa-IN/messages.json +++ b/_locales/pa-IN/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "ਜਾਣਕਾਰੀ" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "ਪਿੰਨ ਕਰੋ" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "ਅਨਪਿੰਨ ਕਰੋ" }, "icu:Poll__end-poll": { "messageformat": "ਪੋਲ ਸਮਾਪਤ ਕਰੋ" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "ਜਾਰੀ ਰੱਖੋ" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {ਪਿੰਨ ਕੀਤਾ ਸੁਨੇਹਾ} other {ਪਿੰਨ ਕੀਤੇ ਸੁਨੇਹੇ}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "ਹੋਰ ਕਾਰਵਾਈਆਂ" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "ਅਨਪਿੰਨ ਕਰੋ" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "ਸੁਨੇਹੇ 'ਤੇ ਜਾਓ" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "ਸਾਰੇ ਸੁਨੇਹੇ ਦੇਖੋ" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "ਪਤਾ" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "ਵੌਇਸ ਸੁਨੇਹਾ" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "ਫ਼ਾਈਲ" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "ਸੰਪਰਕ" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "ਭੁਗਤਾਨ" }, @@ -5166,16 +5169,16 @@ "messageformat": "ਲਿੰਕ" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "ਇੰਝ ਕ੍ਰਮ ਵਿੱਚ ਲਗਾਓ" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "ਇੰਝ ਕ੍ਰਮ ਵਿੱਚ ਲਗਾਓ" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "ਮਿਤੀ" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "ਆਕਾਰ" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "ਕੋਈ ਮੀਡੀਆ ਨਹੀਂ ਹੈ" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "ਤੁਹਾਡੀ ਪੁਰਾਣੀ ਚੈਟ ਨੂੰ ਐਕਸਪੋਰਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਕਿਉਂਕਿ Signal ਕੋਲ ਡਿਸਕ 'ਤੇ ਫਾਈਲਾਂ ਲਿਖਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ। ਆਪਣੀ ਡਿਸਕ ਦੀਆਂ ਇਜਾਜ਼ਤਾਂ ਬਦਲਣ ਜਾਂ ਆਪਣੀਆਂ ਸਿਸਟਮ ਸੈਟਿੰਗਾਂ ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ ਅਤੇ ਫਿਰ ਦੁਬਾਰਾ ਐਕਸਪੋਰਟ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "ਚੰਦਰਮਾ ਦਾ ਆਈਕਾਨ" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "ਕੁੰਜੀ ਨੂੰ ਦੁਬਾਰਾ ਦੇਖੋ" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "ਬੈਕਅੱਪ ਫੋਲਡਰ" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "ਇਹ ਸਾਨੂੰ ਕਾਲਾਂ ਬਾਰੇ ਜਾਣਨ ਅਤੇ ਕੀ ਕੰਮ ਕਰ ਰਿਹਾ ਹੈ ਅਤੇ ਕੀ ਨਹੀਂ, ਇਸ ਬਾਰੇ ਹੋਰ ਜਾਣਨ ਵਿੱਚ ਮਦਦ ਮਿਲਦੀ ਹੈ। ਤੁਸੀਂ ਦਰਜ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਆਪਣਾ ਡੀਬੱਗ ਲੌਗ ਦੇਖ ਸਕਦੇ ਹੋ।" }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "ਡੀਬੱਗ ਲੌਗ ਸਾਂਝਾ ਕਰੋ" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "ਡੀਬੱਗ ਲੌਗ ਵਿੱਚ ਘੱਟ ਪੱਧਰ ਦੀ ਐਪ ਜਾਣਕਾਰੀ ਮੌਜੂਦ ਹੁੰਦੀ ਹੈ ਅਤੇ ਤੁਹਾਡੇ ਸੁਨੇਹੇ ਦੀ ਕਿਸੇ ਵੀ ਸਮੱਗਰੀ ਦਾ ਖੁਲਾਸਾ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।" }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "ਦਰਜ ਕਰੋ" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "ਫੀਡਬੈਕ ਦੇਣ ਲਈ ਤੁਹਾਡਾ ਧੰਨਵਾਦ!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Signal ਨੂੰ ਸੁਚਾਰੂ ਢੰਗ ਨਾਲ ਚੱਲਦਾ ਰੱਖਣ ਲਈ ਇਸ ਵਰਜ਼ਨ ਵਿੱਚ ਨਿੱਕੇ-ਮੋਟੇ ਸੁਧਾਰ ਅਤੇ ਬੱਗ ਠੀਕ ਕੀਤੇ ਗਏ ਹਨ।", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "ਛੋਟੇ-ਮੋਟੇ ਸੁਧਾਰ, ਖ਼ਰਾਬੀਆਂ ਨੂੰ ਦਰੁਸਤ ਅਤੇ ਪ੍ਰਦਰਸ਼ਨ ਨੂੰ ਬਿਹਤਰ ਬਣਾਇਆ ਗਿਆ ਹੈ। Signal ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਤੁਹਾਡਾ ਧੰਨਵਾਦ!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Signal ਵਿੱਚ ਪੋਲ ਵਾਲੇ ਫੀਚਰ ਲਈ ਐਨੀਮੇਸ਼ਨ ਨੂੰ ਬਿਹਤਰ ਬਣਾਇਆ ਗਿਆ ਹੈ।" - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "ਅਸੀਂ ਗਰੁੱਪ ਕਾਲਾਂ ਵਿੱਚ ਹੱਥ ਉੱਪਰ ਕਰਨ ਵਾਲੇ ਸੂਚਕ ਨਾਲ ਜੁੜੀ ਛੋਟੀ ਜਿਹੀ ਡਿਸਪਲੇ ਦੀ ਖ਼ਰਾਬੀ ਨੂੰ ਦਰੁਸਤ ਕੀਤਾ ਹੈ।" + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/pl/messages.json b/_locales/pl/messages.json index 55afb8e1af..5a325e942e 100644 --- a/_locales/pl/messages.json +++ b/_locales/pl/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Informacje" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Przypnij" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Odepnij" }, "icu:Poll__end-poll": { "messageformat": "Zamknij ankietę" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Kontynuuj" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Przypięta wiadomość} few {Przypięte wiadomości} many {Przypięte wiadomości} other {Przypięte wiadomości}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Więcej działań" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Odepnij" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Przejdź do wiadomości" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Wyświetl wszystkie wiadomości" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Adres" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Wiadomość głosowa" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Plik" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Kontakt" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Płatność" }, @@ -5166,16 +5169,16 @@ "messageformat": "Linki" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Sortuj" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Sortuj" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Data" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Rozmiar" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Brak multimediów" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Nie można wyeksportować historii czatu, ponieważ Signal nie ma uprawnień do zapisywania plików na dysku. Zmień uprawnienia dostępu do dysku lub ustawienia systemowe, a następnie spróbuj ponownie." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ikona księżyca" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Wyświetl kod ponownie" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Folder kopii zapasowej" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Dzięki Twojemu dziennikowi debugowania będziemy mieć lepszy wgląd w to, jak działają połączenia i co możemy w nich poprawić. Zanim wyślesz nam dziennik debugowania, możesz go wyświetlić." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Udostępnij dziennik debugowania" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Dzienniki debugowania to zapis szczegółowych informacji o działaniu aplikacji. Nie zawierają one treści żadnych wiadomości." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Prześlij" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Dziękujemy za opinię!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Ta wersja obejmuje wiele drobnych ulepszeń i poprawek błędów. Wszystko po to, aby aplikacja Signal działała płynnie.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Drobne ulepszenia, poprawki błędów i większa funkcjonalność. Cieszymy się, że korzystasz z aplikacji Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Od teraz ankiety w aplikacji Signal Desktop są opatrzone subtelnymi animacjami, które możesz już znać z wersji na telefony. Nie dość, że każdy Twój wybór w ankiecie będzie – jak zawsze – słuszny, to teraz jeszcze ucieszy oko." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Zdarzało Ci się widzieć wskaźnik podniesionej ręki, choć nikt akurat się nie zgłaszał? Ten błąd pojawiał się czasem, gdy ktoś bardzo szybko podniósł i opuścił rękę. Na szczęście to już przeszłość. Teraz, gdy widzisz las rąk, znów możesz liczyć na ożywioną dyskusję." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/pt-BR/messages.json b/_locales/pt-BR/messages.json index 02709bed24..2e08a6d2f3 100644 --- a/_locales/pt-BR/messages.json +++ b/_locales/pt-BR/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Fixar" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Desafixar" }, "icu:Poll__end-poll": { "messageformat": "Encerrar enquete" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Continuar" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Mensagem fixada} other {Mensagens fixadas}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Mais ações" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Desafixar" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Ir para mensagens" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Ver todas as mensagens" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Endereço" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Mensagem de voz" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Arquivo" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Contato" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Pagamento" }, @@ -5166,16 +5169,16 @@ "messageformat": "Links" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Ordenar por" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Ordenar por" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Data" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Tamanho" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Nenhuma mídia" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Seu histórico de conversas não pode ser exportado porque o Signal não tem permissão para gravar arquivos no disco. Tente ajustar as permissões do disco ou atualizar as configurações do sistema e, depois, exporte novamente. " }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ícone da lua" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Ver chave novamente" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Pasta do backup" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Isso nos ajuda a saber mais sobre as chamadas e a compreender o que está funcionando ou não. Você pode ver seu registro de depuração antes de enviar." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Compartilhar registro de depuração" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Os registros de depuração contêm informações técnicas do aplicativo e não revelam o conteúdo das suas mensagens." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Enviar" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Agradecemos seu feedback!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Essa versão contém pequenos retoques e consertos no Signal para ele continuar funcionando confortavelmente.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Pequenas alterações adicionais, correções de bugs e melhorias de desempenho. Agradecemos por usar o Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "As enquetes do Signal no Desktop agora têm os mesmos efeitos de animação que você já vê no celular. " - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Corrigimos um erro que às vezes fazia o indicador de mão levantada continuar visível (com contagem zero) quando alguém levantava e abaixava a mão muito rápido. " + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/pt-PT/messages.json b/_locales/pt-PT/messages.json index cd712784bf..762700bfd3 100644 --- a/_locales/pt-PT/messages.json +++ b/_locales/pt-PT/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Afixar" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Desafixar" }, "icu:Poll__end-poll": { "messageformat": "Terminar sondagem" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Continuar" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Mensagem afixada} other {Mensagens afixadas}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Mais ações" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Desafixar" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Ir a mensagem" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Ver todas as mensagens" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Endereço" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Mensagem de voz" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Ficheiro" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Contacto" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Pagamento" }, @@ -5166,16 +5169,16 @@ "messageformat": "Links" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Ordenar por" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Ordenar por" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Data" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Tamanho" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Sem multimédia" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "O seu histórico de chats não pode ser exportado porque o Signal não tem permissão para gravar ficheiros no disco. Experimente alterar as permissões do seu disco ou atualizar as definições do seu sistema e depois volte a exportar." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ícone de lua" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Ver chave outra vez" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Pasta da cópia de segurança" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Isto ajuda-nos a saber mais sobre as chamadas e o que está a funcionar ou não. Pode ver o seu registo de depuração antes de submeter." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Partilhar relatório de depuração" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Os relatórios de depuração contêm informações de baixo nível sobre a app e não revelam qualquer conteúdo da mensagem." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Submeter" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Obrigado pelo seu feedback!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Esta versão contém um número de pequenas funcionalidades e correções de erros de forma a manter o Signal a correr suavemente.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Pequenos ajustes adicionais, correções de bugs e melhorias de desempenho. Obrigado por usar o Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Animações melhoradas nas sondagens do Signal." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Corrigimos um erro visual menor com o indicador de mão levantada em chamadas de grupo." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/ro-RO/messages.json b/_locales/ro-RO/messages.json index b7b74ad1bc..4c5c0e0d06 100644 --- a/_locales/ro-RO/messages.json +++ b/_locales/ro-RO/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Informații" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Fixare" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Anulare fixare" }, "icu:Poll__end-poll": { "messageformat": "Încheie sondajul" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Continuă" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Mesaj fixate} few {Mesaje fixate} other {de Mesaje fixate}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Mai multe acțiuni" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Anulare fixare" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Mergi la Mesaj" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Vezi toate mesajele" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Adresă" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Mesaj vocal" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Fișier" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Contact" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Plată" }, @@ -5166,16 +5169,16 @@ "messageformat": "Link-uri" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Sortează după" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Sortează după" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Data" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Dimensiune" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Nu ai Fișiere Media" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Istoricul conversațiilor nu poate fi exportat deoarece Signal nu are permisiunea de a scrie fișiere pe disc. Încearcă să modifici permisiunile discului sau să actualizezi setările de sistem, apoi exportă din nou." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Pictograma lună" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Vezi din nou codul" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Director backup" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Acest lucru ne ajută să aflăm mai multe despre apeluri și ce funcționează și ce nu funcționează. Poți vizualiza jurnalul de depanare înainte de trimitere." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Trimite jurnalul de depanare" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Jurnalele de depanare conțin informații de nivel scăzut despre aplicație și nu dezvăluie conținutul mesajelor tale." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Trimite" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Mulțumesc pentru feedback!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Această versiune conține o serie de mici modificări și remedieri ale unor erori pentru ca Signal să funcționeze fără probleme.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Mici ajustări, soluționări de bug-uri și îmbunătățiri ale performanței. Mersi că folosești Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Sondajele Signal de pe desktop includ acum aceleași efecte subtile de animație care apăreau deja pe telefon. A-ți vedea alegerea preferată detașându-se este la doar un sondaj distanță." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Nu putem remedia tăcerea stânjenitoare care urmează, dar am corectat un bug care uneori făcea ca indicatorul mâinii ridicate să rămână vizibil (cu un număr de zero) dacă cineva ridica și cobora mâna foarte repede." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index 4e917759cc..cf947e3964 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Информация" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Прикрепить" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Открепить" }, "icu:Poll__end-poll": { "messageformat": "Завершить опрос" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Продолжить" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Закреплённое сообщение} few {Закреплённых сообщения} many {Закреплённых сообщений} other {Закреплённых сообщения}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Больше действий" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Открепить" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Перейти к сообщению" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Просмотреть все сообщения" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Адрес" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Голосовое сообщение" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Файл" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Контакт" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Платёж" }, @@ -5166,16 +5169,16 @@ "messageformat": "Ссылки" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Сортировать по" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Сортировать по" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Дате" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Размеру" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Нет медиафайлов" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Историю чата нельзя экспортировать, потому что у Signal нет разрешения на запись файлов на диск. Попробуйте изменить права доступа к диску или обновить системные настройки, а затем экспортировать ещё раз." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Значок луны" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Просмотреть ключ ещё раз" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Папка резервных копий" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Это помогает нам получить более подробную информацию о звонках и понять, что работает, а что нет. Вы можете просмотреть свой журнал отладки перед отправкой." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Поделиться журналом отладки" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Журналы отладки содержат низкоуровневую информацию о приложении и не раскрывают содержание вашего сообщения." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Отправить" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Спасибо за ваш отзыв!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Эта версия содержит несколько небольших изменений и исправлений ошибок.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Небольшие изменения, исправления ошибок и улучшения производительности. Спасибо за то, что пользуетесь Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Опросы Signal на ПК теперь включают те же тонкие анимационные эффекты, что и на вашем телефоне. Это не волшебство — это ваш ответ на вопрос превращается в опрос." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Мы не можем исправить неловкую тишину, но зато исправили ошибку, из-за которой индикатор поднятой руки временами оставался видимым (с нулевым счётчиком), если кто-то очень быстро поднимал и опускал руку." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/sk-SK/messages.json b/_locales/sk-SK/messages.json index d0802f40ec..0bd8cd7840 100644 --- a/_locales/sk-SK/messages.json +++ b/_locales/sk-SK/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Pripnúť" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Odopnúť" }, "icu:Poll__end-poll": { "messageformat": "Ukončiť anketu" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Pokračovať" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Pripnutá správa} few {Pripnuté správy} many {Pripnutej správy} other {Pripnutých správ}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Viac akcií" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Odopnúť" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Prejsť na správu" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Zobraziť všetky správy" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Adresa" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Hlasová správa" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Súbor" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Kontakt" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Platba" }, @@ -5166,16 +5169,16 @@ "messageformat": "Odkazy" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Zoradiť podľa" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Zoradiť podľa" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Dátumu" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Veľkosti" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Žiadne médiá" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Históriu četov sa nepodarilo exportovať, pretože Signal nemá povolenie na zapisovanie súborov na disk. Skúste zmeniť povolenia disku alebo aktualizovať systémové nastavenia a potom exportujte znova." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ikona mesiaca" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Pozrieť si kľúč znova" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Priečinok pre zálohy" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Pomáha nám to dozvedieť sa viac o hovoroch a o tom, čo funguje alebo naopak nefunguje. Pred odoslaním si môžete zobraziť protokol ladenia." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Zdieľať protokol ladenia" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Protokoly ladenia obsahujú informácie o aplikácii na nízkej úrovni a neodhaľujú obsah správ." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Odoslať" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Ďakujeme za vašu spätnú väzbu!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Táto verzia obsahuje množstvo drobných vylepšení a opráv chýb, ktoré zaisťujú bezproblémový chod systému Signal.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Malé úpravy, opravy chýb a vylepšenia výkonu. Ďakujeme, že používate Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Vylepšili sme animáciu pre ankety Signal." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Opravili sme menšiu chybu zobrazenia indikátora zdvihnutej ruky v skupinových hovoroch." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/sl-SI/messages.json b/_locales/sl-SI/messages.json index a776cafb2e..b838ae7bf4 100644 --- a/_locales/sl-SI/messages.json +++ b/_locales/sl-SI/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Pripni" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Odpni" }, "icu:Poll__end-poll": { "messageformat": "Zaključi anketo" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Nadaljuj" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Pripeto sporočilo} two {Pripeti sporočili} few {Pripeta sporočila} other {Pripeta sporočila}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Več dejanj" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Odpni" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Pojdi na sporočilo" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Prikaži vsa sporočila" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Naslov" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Glasovno sporočilo" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Datoteka" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Stik" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Plačilo" }, @@ -5166,16 +5169,16 @@ "messageformat": "Povezave" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Razvrsti po" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Razvrsti po" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Datumu" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Velikosti" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Ni multimedijskih sporočil" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Zgodovine klepeta ni mogoče izvoziti, ker Signal nima dovoljenja za zapisovanje datotek na disk. Poskusite spremeniti dovoljenja diska ali posodobiti sistemske nastavitve in nato znova izvozite." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ikona lune" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Ponovni ogled ključa" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Mesto za varnostne kopije" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "To nam pomaga izvedeti več o klicih in o tem, kaj deluje oziroma ne deluje. Pred oddajo si lahko ogledate dnevnik sistemskih zabeležb." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Delite sistemske zabeležbe" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Sistemske zabeležbe vsebujejo informacije o aplikaciji na nizki ravni in ne razkrivajo vsebine vaših sporočil." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Objavi" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Hvala za vaše povratne informacije!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Ta različica vsebuje majhne spremembe in popravke, ki omogočajo, da Signal teče brez težav.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Majhne prilagoditve, popravki napak in izboljšave zmogljivosti. Hvala, da uporabljate Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Izboljšana animacija za Ankete Signal." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Odpravili smo manjšo napako v zvezi s prikazom dvignjene roke v skupinskih klicih." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/sq-AL/messages.json b/_locales/sq-AL/messages.json index ae2e135859..e13e7b094d 100644 --- a/_locales/sq-AL/messages.json +++ b/_locales/sq-AL/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Fiksoji" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Çfiksoji" }, "icu:Poll__end-poll": { "messageformat": "Përfundo sondazhin" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Vazhdo" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Mesazh i fiksuar} other {Mesazhe të fiksuara}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Më tepër veprime" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Çfiksoji" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Shko te mesazhi" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Shiko të gjitha mesazhet" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Adresë" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Mesazh zanor" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Kartelë" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Kontakt" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Pagesë" }, @@ -5166,16 +5169,16 @@ "messageformat": "Lidhjet" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Rendit sipas" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Rendit sipas" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Datës" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Madhësisë" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "S\\’ka media" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Historiku i bisedës nuk mund të eksportohet sepse Signal nuk ka leje për të shkruar skedarë në disk. Provo të ndryshosh lejet e diskut ose të përditësosh parametrat e sistemit dhe pastaj eksporto përsëri." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ikona e hënës" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Shiko sërish kodin" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Dosje kopjeruajtjesh" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Kjo na ndihmon të mësojmë më shumë rreth thirrjeve dhe çfarë funksionon apo nuk funksionon. Mund ta shikosh regjistrin e diagnostikimeve përpara se të bësh dërgimin." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Ndaj regjistrin e diagnostikimit" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Regjistrat e diagnostikimit përmbajnë informacione të nivelit të ulët të aplikacionit dhe nuk zbulojnë asnjë nga përmbajtjet e mesazheve." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Parashtrojeni" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Faleminderit për përshtypjet!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Ky version përmban një numër përimtimesh të vockla dhe ndreqje të metash për ta mbajtur të rrjedhshme punën e Signal-it.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Rregullme të vogla, riparime të gabimeve dhe përmirësime të mbarëvajtjes. Faleminderit që përdorni Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Sondazhet e Signal në Desktop tani përfshijnë të njëjtat efekte delikate animacioni që shfaqeshin në telefon. Shikimi i zgjedhjes së preferuar është thjesht një sondazh larg." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Nuk mund ta rregullojmë heshtjen e sikletshme që vijon, por rregulluam një gabim që ndonjëherë bënte që treguesi i dorës së ngritur të mbetej i dukshëm (me numërimin zero) nëse dikush e ngrinte dhe e ulte dorën shumë shpejt." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/sr/messages.json b/_locales/sr/messages.json index f4536a719c..eef8df518c 100644 --- a/_locales/sr/messages.json +++ b/_locales/sr/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Информације" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Закачи" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Откачи" }, "icu:Poll__end-poll": { "messageformat": "Прекини анкету" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Настави" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Закачена порука} other {Закачене поруке}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Више опција" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Откачи" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Иди на поруку" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Види све поруке" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Адреса" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Гласовна порука" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Фајл" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Контакт" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Плаћање" }, @@ -5166,16 +5169,16 @@ "messageformat": "Линкови" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Поређај по" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Поређај по" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Датуму" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Величини" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Нема медија" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Извоз ваше историје ћаскања није могућ јер Signal нема дозволу да записује фајлове на диск. Покушајте да промените дозволе на диску или да ажурирате систем и извезите поново." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Икона месеца" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Види кључ поново" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Фолдер резервне копије" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Ово нам помаже да сазнамо више о позивима и шта функционише или не функционише. Пре слања можете погледати извештај о грешкама." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Пошаљи извештај о грешкама" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Извештаји о грешкама садрже информације о апликацији ниског нивоа и у њима се не открива садржај ваших порука." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Пошаљи" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Хвала вам на повратним информацијама!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Ова верзија садржи низ мањих подешавања и исправки грешака како би Signal радио несметано.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Обавили смо мања фина прилагођавања, исправке грешака и побољшања перформанси. Хвала што користите Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Побољшана анимација за Signal анкете." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Поправили смо малу грешку у приказивању подигнуте руке у групним позивима." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/sv/messages.json b/_locales/sv/messages.json index 9785cb9547..120f8a89cb 100644 --- a/_locales/sv/messages.json +++ b/_locales/sv/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Nåla" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Lösgör" }, "icu:Poll__end-poll": { "messageformat": "Avsluta omröstning" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Fortsätt" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Fäst meddelande} other {Fästa meddelanden}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Fler åtgärder" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Lösgör" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Gå till Meddelande" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Se alla meddelanden" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Adress" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Röstmeddelande" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Fil" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Kontakt" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Betalning" }, @@ -5166,16 +5169,16 @@ "messageformat": "Länkar" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Sortera efter" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Sortera efter" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Datum" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Storlek" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Inga media" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Din chatthistorik kan inte exporteras eftersom Signal inte har behörighet att skriva filer till disk. Försök att ändra diskens behörigheter eller uppdatera dina systeminställningar och exportera sedan igen." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Månikon" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Visa nyckel igen" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Mapp för säkerhetskopior" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Detta hjälper oss att lära oss mer om samtal och vad som fungerar eller inte fungerar. Du kan visa din felsökningslogg innan du skickar in." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Dela felsökningslogg" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Felsökningsloggar innehåller appinformation på låg nivå och avslöjar inget av innehållet i dina meddelanden." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Skicka" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Tack för din feedback!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Den här versionen innehåller ett antal små justeringar och felrättningar för att Signal ska fungera smidigt.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Små justeringer, buggfixar och prestandaförbättringar. Tack för att du använder Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Förbättrade animeringar för Signal-omröstningar." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Vi har åtgärdat ett mindre visningsproblem med indikatorn för handuppräckning i gruppsamtal." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/sw/messages.json b/_locales/sw/messages.json index daa70cc792..ad66f71fbc 100644 --- a/_locales/sw/messages.json +++ b/_locales/sw/messages.json @@ -1086,7 +1086,7 @@ "messageformat": "Pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Bandua" }, "icu:Poll__end-poll": { "messageformat": "Maliza kupiga kura ya maoni" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Endelea" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Ujumbe uliobandikwa} other {Jumbe zilizobandikwa}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Vitendo zaidi" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Bandua" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Nenda kwenye ujumbe" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Angalia jumbe zote" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Anwani" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Ujumbe wa sauti" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Faili" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Mwasiliani" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Malipo" }, @@ -5166,16 +5169,16 @@ "messageformat": "Viungo" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Panga kwa" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Panga kwa" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Tarehe" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Ukubwa" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Hakuna media" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Historia yako ya gumzo imeshindwa kuhamishwa kwa sababu Signal haina ruhusa ya kuhifadhi faili kwenye diski. Jaribu kubadilisha ruhusa za diski yako au kusasisha mipangilio yako ya mfumo kisha uhamishe tena." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Aikoni ya mwezi" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Angalia ufunguo tena" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Folda ya nakala hifadhi" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Hii inatusaidia kupata maelezo zaidi kuhusu simu na kitu gani kimefanikiwa au hakijafanikiwa. Unaweza tazama faili la rekebisho kabla ya kuwasilisha." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Shiriki faili la rekebisho" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Mafaili ya marekebisho yana taarifa za kiwango cha chini za programu na usidhihirishe maudhui ya ujumbe wako." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Tuma" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Asante kwa maoni yako!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Toleo hili lina mabadiliko kidogo na maboresho ya program kuiwezesha Signal kufanya kazi vizuri.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Mabadiliko madogo, marekebisho ya bugs na uboreshaji wa utendaji. Asante kwa kutumia Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Kura za maoni za Signal kwenye Desktop sasa zinajumuisha madoido madogo ya uhuishaji ambayo tayari yalikuwa yanaonekana kwenye simu yako. Utahitaji kupiga kura tu ili utazame chaguo ulipendalo." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Hatuwezi kurekebisha ukimya wa aibu unaofuata, lakini tumerekebisha hitilafu iliyokuwa ikisababisha kipengele cha mkono ulioinuliwa kuendelea kuonekana (ikiwa na hesabu ya sufuri) endapo mtu angeinua na kushusha mkono wake haraka sana." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/ta-IN/messages.json b/_locales/ta-IN/messages.json index 83809365b6..44a46071e3 100644 --- a/_locales/ta-IN/messages.json +++ b/_locales/ta-IN/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "தகவல்" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "பின்செய்" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "பின்னை அகற்று" }, "icu:Poll__end-poll": { "messageformat": "வாக்கெடுப்பை முடி" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "தொடர்க" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {பின் செய்யப்பட்ட மெசேஜ்} other {பின் செய்யப்பட்ட மெசேஜ்கள்}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "மேலும் செயல்கள்" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "பின்னை அகற்று" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "மெசேஜுக்குச் செல்க" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "அனைத்து மெசேஜ்களையும் காண்க" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "முகவரி" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "குரல் செய்தி" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "கோப்பு" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "தொடர்பு" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "பேமெண்ட்" }, @@ -5166,16 +5169,16 @@ "messageformat": "இணைப்புகள்" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "வரிசைப்படுத்துக" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "வரிசைப்படுத்துக" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "தேதி" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "அளவு" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "ஊடகங்கள்இல்லை" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "சிக்னலுக்கு டிஸ்க்கில் கோப்புகளை எழுத அனுமதி இல்லாததால், உங்கள் சாட் வரலாற்றை ஏற்றுமதி செய்ய முடியாது. உங்கள் டிஸ்க்கின் அனுமதிகளை மாற்றி அல்லது உங்கள் சிஸ்டம் அமைப்புகளைப் புதுப்பித்து, பிறகு மீண்டும் ஏற்றுமதி செய்ய முயற்சிக்கவும்." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "மூன் ஐகான்" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "குறியீட்டைப் மீண்டும் காண்க" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "மறுபிரதி கோப்புறை" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "இது அழைப்புகள் பற்றியும், எவை பயனளிக்கிறது அல்லது பயனளிக்கவில்லை என்பதைப் பற்றி மேலும் அறிய உதவுகிறது. சமர்ப்பிக்கும் முன் உங்கள் பிழைத்திருத்தப் பதிவை நீங்கள் பார்க்கலாம்." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "பிழைத்திருத்தப் பதிவைப் பகிருங்கள்" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "பிழைத்திருத்தப் பதிவுகள் செயலியின் அடிப்படைத் தொழில்நுட்பத் தகவல்களைக் கொண்டுள்ளன, மேலும் அவை உங்கள் மெசேஜ் உள்ளடக்கங்கள் எதையும் வெளிப்படுத்தாது." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "சமர்ப்பி" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "நீங்கள் வழங்கிய கருத்துக்கு நன்றி!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "இந்த பதிப்பில் சிக்னலை சீராக இயங்க வைக்க பல சிறிய மாற்றங்கள் மற்றும் பிழை திருத்தங்கள் உள்ளன.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "சிறு மாற்றங்கள், பிழை திருத்தங்கள் மற்றும் செயல்திறன் மேம்பாடுகள். சிக்னலைப் பயன்படுத்தியதற்கு நன்றி!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "சிக்னல் வாக்கெடுப்புகளுக்கான மேம்படுத்தப்பட்ட அனிமேஷன்." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "தொகுப்பு அழைப்புகளில், கையை உயர்த்தும் குறியீட்டில் இருந்த ஒரு சிறிய காட்சிப் பிழையைச் சரிசெய்துள்ளோம்." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/te-IN/messages.json b/_locales/te-IN/messages.json index de51285582..0ea92aa3af 100644 --- a/_locales/te-IN/messages.json +++ b/_locales/te-IN/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "సమాచారం" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "పిన్" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "అన్‌పిన్" }, "icu:Poll__end-poll": { "messageformat": "పోల్‌ను ముగించండి" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "కొనసాగించండి" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {పిన్ చేసిన సందేశం} other {పిన్ చేసిన సందేశాలు}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "మరిన్ని చర్యలు" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "అన్‌పిన్" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "సందేశానికి వెళ్ళండి" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "అన్ని సందేశాలను చూడండి" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "చిరునామా" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "వాయిస్ సందేశం" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "పత్రం" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "పరిచయం" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "చెల్లింపు" }, @@ -5166,16 +5169,16 @@ "messageformat": "లింక్‌లు" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "ఆమరిక" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "ఆమరిక" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "తేదీ" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "పరిమాణం" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "మీడియా లేదు" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "డిస్క్‌కు ఫైల్‌లను రాయడానికి Signal కు అనుమతి లేనందున మీ చాట్ చరిత్రను ఎగుమతి చేయడం సాధ్యం కాదు. మీ డిస్క్ యొక్క అనుమతులను మార్చడానికి లేదా మీ సిస్టమ్ సెట్టింగ్‌లను అప్‌డేట్ చేయడానికి ప్రయత్నించండి మరియు ఆపై మళ్ళీ ఎగుమతి చేయండి." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "చంద్రుడు ఐకాన్" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "కీని మళ్ళీ చూడండి" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "బ్యాకప్ ఫోల్డర్" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "ఇది కాల్స్ గురించి మరియు ఏది పని చేస్తుంది లేదా పని చేయదు అనే దాని గురించి మరింత తెలుసుకోవడానికి మాకు సహాయపడుతుంది. సమర్పించడానికి ముందు మీరు మీ డీబగ్ లాగ్‌ను వీక్షించవచ్చు." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "డీబగ్ లాగ్‌ను పంచుకోండి" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "డీబగ్ లాగ్‌లు తక్కువ స్థాయి యాప్ సమాచారాన్ని కలిగి ఉంటాయి మరియు మీ సందేశ కంటెంట్‌లు వేటినీ బహిర్గతం చేయవు." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "సమర్పించండి" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "మీ ఫీడ్‌బ్యాక్‌కు ధన్యవాదాలు!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Signal ని సజావుగా నడిపించడానికి ఈ వెర్షన్‌లో చిన్నపాటి ట్వీక్‌లు మరియు బగ్ ఫిక్స్‌లు ఉన్నాయి.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "చిన్న ట్వీక్‌లు, బగ్ ఫిక్స్‌లు, మరియు పనితీరు మెరుగుదలలు. Signal ఉపయోగించినందుకు మీకు ధన్యవాదాలు!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Signal పోల్స్ కోసం మెరుగుపరచబడిన యానిమేషన్." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "మేము గ్రూప్ కాల్‌లలో పైకెత్తిన చేయి సూచికకు సంబంధించిన ఒక చిన్న డిస్‌ప్లే బగ్‌ను పరిష్కరించాము." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/th/messages.json b/_locales/th/messages.json index 7bbcabb8a8..74b96b726b 100644 --- a/_locales/th/messages.json +++ b/_locales/th/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "ข้อมูล" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "ปักหมุด" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "เลิกปักหมุด" }, "icu:Poll__end-poll": { "messageformat": "ปิดโพล" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "ดำเนินการต่อ" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {ข้อความที่ปักหมุด}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "การกระทำเพิ่มเติม" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "เลิกปักหมุด" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "ไปที่ข้อความ" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "ดูข้อความทั้งหมด" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "ที่อยู่" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "ข้อความเสียง" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "ไฟล์" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "ผู้ติดต่อ" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "การชำระเงิน" }, @@ -5166,16 +5169,16 @@ "messageformat": "ลิงก์" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "เรียงลำดับตาม" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "เรียงลำดับตาม" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "วันที่" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "ขนาด" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "ไม่มีสื่อ" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "ไม่สามารถส่งออกประวัติการแชทของคุณได้เนื่องจาก Signal ไม่ได้รับสิทธิ์ในการบันทึกไฟล์ลงพื้นที่จัดเก็บ โปรดลองเปลี่ยนการอนุญาตสิทธิ์ของพื้นที่จัดเก็บในเครื่องหรืออัปเดตการตั้งค่าระบบของคุณแล้วลองส่งออกอีกครั้ง" }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "ไอคอนรูปพระจันทร์" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "ดูกุญแจอีกครั้ง" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "โฟลเดอร์ข้อมูลสำรอง" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "ช่วยให้เรารับทราบเกี่ยวกับประสิทธิภาพในการใช้งานและเข้าใจปัญหาของการโทรยิ่งขึ้น โดยคุณสามารถดูบันทึกดีบักก่อนส่งข้อมูลได้" }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "แชร์บันทึกดีบัก" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "ภายในบันทึกดีบักจะมีข้อมูลแอประดับพื้นฐานและจะไม่เปิดเผยเนื้อหาใดๆ ในข้อความของคุณ" }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "ส่ง" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "ขอบคุณสำหรับความคิดเห็น" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "รุ่นนี้มาพร้อมการปรับเปลี่ยนเล็กๆ น้อยๆ และการแก้ไขบั๊กต่างๆ เพื่อให้ Signal ทำงานได้อย่างราบรื่นไร้ปัญหา", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "มีการปรับเปลี่ยนเล็กน้อย พร้อมแก้ไขบั๊ก และการพัฒนาประสิทธิภาพให้ดียิ่งขึ้น ขอขอบคุณที่เลือกใช้ Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "เพิ่มลูกเล่นภาพเคลื่อนไหวในฟีเจอร์โพลของ Signal" - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "แก้ไขบั๊กเกี่ยวกับตัวแจ้งสถานะเมื่อมีคนยกมือในสายโทรกลุ่ม" + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/tl-PH/messages.json b/_locales/tl-PH/messages.json index 94c28895fc..1c1f89266e 100644 --- a/_locales/tl-PH/messages.json +++ b/_locales/tl-PH/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Info" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "I-pin" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "I-unpin" }, "icu:Poll__end-poll": { "messageformat": "Tapusin ang poll" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Magpatuloy" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Pinned message} other {Pinned messages}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Iba pang actions" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "I-unpin" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Pumunta sa message" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Tignan ang lahat ng messages" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Address" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Voice message" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "File" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Contact" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Payment" }, @@ -5166,16 +5169,16 @@ "messageformat": "Links" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Pagsunod-sunurin ayon sa" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Pagsunod-sunurin ayon sa" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Petsa" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Laki" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Walang media" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Hindi ma-export ang chat history mo dahil ang Signal ay walang permiso para magsulat ng files sa disk. Subukang baguhin ang permissions ng iyong disk o i-update ang system settings mo at subukan ulit mag-export." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Icon ng buwan" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Tingnan ulit ang key" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Backup folder" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Makatutulong ito sa amin para mas mapabuti pa ang quality ng calls. Maaari mong tignan ang debug log mo bago mag-submit." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "I-share ang debug log" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Ang debug logs ay naglalaman ng mababang level ng impormasyon ng app at hindi nagpapakita ng anumang nilalaman ng messages mo." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Isumite" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Maraming salamat sa feedback mo!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Ang version na ito'y may small tweaks at bug fixes to keep Signal running smoothly.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Dagdag na maliliit na pag-aayos, pag-alis ng bugs, at pagpapaganda ng takbo ng app. Maraming salamat sa paggamit ng Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Mas pinagandang animation para sa Signal polls." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "May inayos kaming minor display bug sa raised hand indicator sa group calls." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/tr/messages.json b/_locales/tr/messages.json index ff71435a43..2165379e00 100644 --- a/_locales/tr/messages.json +++ b/_locales/tr/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Bilgi" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Sabitle" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Sabitlemeyi kaldır" }, "icu:Poll__end-poll": { "messageformat": "Anketi sonlandır" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Devam" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Sabitlenmiş mesaj} other {Sabitlenmiş mesajlar}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Diğer eylemler" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Sabitlemeyi kaldır" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Mesaja git" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Tüm mesajları gör" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Adres" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Sesli ileti" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Dosya" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Kişi" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Ödeme" }, @@ -5166,16 +5169,16 @@ "messageformat": "Bağlantılar" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Sırala" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Sırala" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Tarih" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Boyut" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Medya Yok" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Signal'ın diske dosya yazma izni olmadığı için sohbet geçmişin dışa aktarılamıyor. Diskinin izinlerini değiştirmeyi veya sistem ayarlarını güncellemeyi dene ve ardından tekrar dışa aktar." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ay simgesi" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Anahtarı tekrar gör" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Yedekleme dizini" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Bu, aramalar ve neyin işe yarayıp neyin yaramadığı hakkında daha fazla bilgi edinmemize yardımcı olur. Göndermeden önce hata ayıklama günlüğünü görüntüleyebilirsin." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Hata ayıklama günlüğünü paylaş" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Hata ayıklama günlükleri, düşük düzeyde uygulama bilgisi içerir ve hiçbir mesaj içeriğini açıklamaz." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Gönder" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Geri bildirimin için teşekkürler!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Bu sürüm Signal'in sorunsuz çalışması için gereken bir takım küçük düzeltme ve hata gidermelerini içerir.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Küçük ince ayarlar, hata düzeltmeleri ve performans geliştirmeleri yaptık. Signal'i kullandığın için teşekkürler!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Signal anketleri için geliştirilmiş animasyon. Hem de önceden telefonunda beliren aynı çarpıcı animasyon efektleriyle!" - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Grup görüşmelerinde kaldırılan el göstergesiyle ilgili ufak bir ekran hatasını giderdik." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/ug/messages.json b/_locales/ug/messages.json index 8ebfa0ecac..269ee7ce99 100644 --- a/_locales/ug/messages.json +++ b/_locales/ug/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "ئۇچۇر" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "مىخلاش" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "ئاجرىتىش" }, "icu:Poll__end-poll": { "messageformat": "راي سىناشنى توختىتىش" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "داۋاملاشتۇرۇش" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {مىقلانغان ئۇچۇرلار}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "تېخىمۇ كۆپ مەشغۇلات" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "ئاجرىتىش" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "«ئۇچۇر»غا ئۆتۈڭ" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "بارلىق ئۇچۇرلارنى كۆرۈش" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "ئادرېس" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "ئۈن ئۇچۇر" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "ھۆججەت" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "ئالاقىداش" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "چىقىم" }, @@ -5166,16 +5169,16 @@ "messageformat": "ئۇلانمىلار" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "بويىچە رەتلەش" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "بويىچە رەتلەش" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "ۋاقت" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "ھەجىمى" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "مېدىيا يوق" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "سۆھبەت تارىخىڭىزنى ئېكسپورت قىلغىلى بولمايدۇ، چۈنكى Signalنىڭ ساقلاش دىسكىسىغا ھۆججەت كىرگۈزۈش ھوقۇقى يوق. دىسكىڭىزنىڭ ئىجازەتنامىسىنى ئۆزگەرتىڭ ياكى سىستېما تەڭشىكىڭىزنى يېڭىلاپ ئاندىن قايتا ئېكسپورت قىلىڭ." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "ئاي شەكىللدك سىنبەلگە" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "ئاچقۇچنى قايتا كۆرۈڭ" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "زاپاسلاش قىسقۇچى" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "بۇ ياردەملىشىپ بىزنى تېلېفونلىشىش ۋە نېمىنىڭ ئىشلەۋاتقان ياكى ئىشلىمەيدىغانلىقى توغرىسىدا تېخىمۇ كۆپ چۈشەنچىگە ئىگە قىلىدۇ. يوللاشتىن بۇرۇن كاشىلا ھەل قىلىش خاتىرىڭىزنى كۆرەلەيسىز." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "كاشىلا ھەل قىلىش خاتىرىسىنى ئورتاقلىشىش" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "كاشىلا ھەل قىلىش خاتىرىلىرى تۆۋەن دەرىجىدىكى ئەپ ئۇچۇرلىرىنى ئۆز ئىچىگە ئالغان بولۇپ، پاراڭ مەزمۇنلىرىڭىزنىڭ ھېچقايسىسىنى ئاشكارىلىمايدۇ." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "تاپشۇر" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "ئىنكاسىڭىزغا رەھمەت!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Signal نىڭ راۋان ئىجرا بولۇشى ئۈچۈن بۇ نەشرىدە بىر قانچە كىچىك ئۆزگەرتىشلەر ئېلىپ بېرىلدى ۋە كاشىلىلار ئوڭشالدى.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "كىچىك ئۆزگەرتىشلەر كىرگۈزۈلدى، كاشىلا ھەل قىلىندى ۋە ئىقتىدار ئەلالاشتۇرۇلدى. Signal نى ئىشلەتكەنلىكىڭىزگە رەھمەت!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "ئۈستەل كومپيوتېرىدىكى Signal راي سىناقلىرى ھازىر تېلېفونىڭىزدا ئىلگىرى كۆرۈنگەندىكىگە ئوخشاش نازۇك كارتون ئۈنۈملىرىنى ئۆز ئىچىگە ئالىدۇ. Signal راي سىناقلىرى كارتون ئۈنۈملىرىنىڭ سۈپىتى تېخىمۇ يۇقىرى كۆتۈرۈلدى." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "گۇرۇپپا چاقىرىشلىرىدا قول كۆتۈرۈش كۆرسەتكۈچىگە مۇناسىۋەتلىك كىچىك كۆرۈنۈش خاتالىقىنى تۈزەتتۇق." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/uk-UA/messages.json b/_locales/uk-UA/messages.json index f73a6edbbd..2ee417fdbc 100644 --- a/_locales/uk-UA/messages.json +++ b/_locales/uk-UA/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Інформація" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Закріпити" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Відкріпити" }, "icu:Poll__end-poll": { "messageformat": "Завершити опитування" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Продовжити" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Закріплене повідомлення} few {Закріплені повідомлення} many {Закріплені повідомлення} other {Закріплені повідомлення}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Інші дії" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Відкріпити" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "До повідомлення" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Показати всі повідомлення" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Адреса" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Голосове повідомлення" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Файл" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Контакт" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Платіж" }, @@ -5166,16 +5169,16 @@ "messageformat": "Посилання" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Сортування" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Сортування" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Дата" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Розмір" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Медіафайлів немає" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Неможливо експортувати історію чатів, оскільки Signal не має дозволу зберігати файли на диску. Змініть дозволи для диска або оновіть налаштування системи й спробуйте знову." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Значок місяця" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Подивитися ключ ще раз" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Папка для резервних копій" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Так ви допоможете нам більше дізнатися про те, як проходять виклики, і можливі проблеми. Ви можете переглянути журнал налагодження, перш ніж надіслати його." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Надіслати журнал налагодження" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Журнали налагодження містять інформацію нижнього рівня про застосунок і не розкривають вмісту ваших повідомлень." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Надіслати" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Дякуємо за відгук!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Ця версія містить ряд невеликих покращень і виправлень помилок для забезпечення безперебійної роботи Signal.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Дрібні поліпшення, виправлення помилок і покращення роботи застосунку. Дякуємо, що ви з Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Опитування в Signal Desktop тепер мають таку ж плавну анімацію, як і на телефоні. Нарешті можна спостерігати, як ваш варіант потихеньку виривається вперед (або відстає…)." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Ми не можемо виправити незручну тишу, що виникає в такій ситуації, але ми виправили помилку, через яку індикатор піднятої руки іноді залишався видимим (з числом нуль), коли хтось дуже швидко підіймав і опускав руку." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/ur/messages.json b/_locales/ur/messages.json index e325955cae..9c01e1c875 100644 --- a/_locales/ur/messages.json +++ b/_locales/ur/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "معلومات" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "پِن کریں" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "ان پِن کریں" }, "icu:Poll__end-poll": { "messageformat": "پول ختم کریں" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "جاری رکھیں" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {پِن کردہ میسج} other {پِن کردہ میسجز}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "مزید افعال" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "ان پِن کریں" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "میسج میں جائیں" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "تمام میسجز دیکھیں" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "ایڈریس" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "آڈیو پیغام" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "فائل" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "رابطہ" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "پیمنٹ" }, @@ -5166,16 +5169,16 @@ "messageformat": "لنکس" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "ترتیب دیں بلحاظ" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "ترتیب دیں بلحاظ" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "تاریخ" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "سائز" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "کوئی میڈیا نہیں ہے" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "آپ کی چیٹ ہسٹری ایکسپورٹ نہیں ہو سکتی کیونکہ Signal کو ڈسک پر فائلز محفوظ کرنے کی اجازت نہیں ہے۔ اپنی ڈسک کی اجازتوں کو تبدیل کرنے یا اپنے سسٹم کی سیٹنگز کو اپ ڈیٹ کرنے کی کوشش کریں اور پھر دوبارہ ایکسپورٹ کریں۔" }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "چاند کا آئیکن" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "کیی کو دوبارہ دیکھیں" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "بیک اپ فولڈر" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "اس سے ہمیں کالز اور اس بارے میں مزید جاننے میں مدد ملتی ہے کہ کیا چیز کام کر رہی یا نہیں کر رہی ہے۔ آپ جمع کروانے سے پہلے اپنا ڈی بگ لاگ دیکھ سکتے ہیں۔" }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "ڈی بگ لاگ شیئر کریں" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "ڈی بگ لاگز کم درجے کی ایپ معلومات پر مشتمل ہوتے ہیں اور آپ کے کسی بھی میسج کے مندرجات کو ظاہر نہیں کرتے۔" }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "جمح کریں" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "آپ کی رائے کا شکریہ!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "یہ ورژن Signal کو بے خلل طور پر چلتا رکھنے کے لیے کچھ معمولی تبدیلیوں اور بگ درستگیوں پر مشتمل ہے۔", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "معمولی تبدیلیاں کی گئیں، بگ ٹھیک کیے گئے، اور کارکردگی اور بھی بہتر بنائی گئی ہے۔ Signal استعمال کرنے کے لیے شکریہ!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Signal کی رائے شماریوں کے لیے بہتر کردہ اینیمیشن۔" - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "ہم اس عجیب خاموشی کو ٹھیک نہیں کر سکتے جو اس کے بعد آتی ہے، لیکن ہم نے ایک نقص ٹھیک کیا ہے جس کی وجہ سے کبھی کبھار اگر کوئی ہاتھ تیزی سے اٹھا یا نیچے کرتا تو ہاتھ کا اشارہ نظر آتا (صفر کی گنتی کے ساتھ)۔" + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/vi/messages.json b/_locales/vi/messages.json index d4e5f689b2..89511da185 100644 --- a/_locales/vi/messages.json +++ b/_locales/vi/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "Thông tin" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "Ghim" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Bỏ ghim" }, "icu:Poll__end-poll": { "messageformat": "Kết thúc" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "Tiếp tục" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {Tin nhắn đã ghim}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "Các thao tác khác" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "Bỏ ghim" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "Đến Tin nhắn" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "Xem tất cả tin nhắn" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "Địa chỉ" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "Tin nhắn thoại" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "Tệp" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "Liên hệ" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "Thanh toán" }, @@ -5166,16 +5169,16 @@ "messageformat": "Đường dẫn" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "Sắp xếp theo" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "Sắp xếp theo" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "Ngày" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "Dung lượng" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "Không có đa phương tiện" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "Lịch sử trò chuyện của bạn không thể được xuất vì Signal không có quyền ghi tập tin vào ổ lưu trữ. Hãy thử thay đổi quyền của ổ lưu trữ hoặc cập nhật cài đặt hệ thống của bạn và sau đó xuất lại." }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "Biểu tượng mặt trăng" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "Xem lại mã khóa" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "Thư mục sao lưu" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "Điều này giúp chúng tôi tìm hiểu thêm về chất lượng cuộc gọi và biết khi có vấn đề. Bạn có thể xem nhật ký gỡ lỗi trước khi gửi." }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Chia sẻ nhật ký gỡ lỗi" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "Nhật ký gỡ lỗi chứa thông tin ứng dụng cấp thấp và không tiết lộ bất kỳ nội dung tin nhắn nào của bạn." }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Gửi" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "Cảm ơn góp ý của bạn!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "Phiên bản này có một số tinh chỉnh và sửa lỗi để giữ cho Signal hoạt động mượt mà.", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "Các tinh chỉnh, sửa lỗi, và cải thiện hiệu năng. Cảm ơn bạn đã sử dụng Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "Cải thiện hình ảnh động của tính năng Hỏi ý kiến." - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "Chúng tôi đã sửa một lỗi nhỏ liên quan đến chỉ báo giơ tay trong cuộc gọi nhóm." + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/yue/messages.json b/_locales/yue/messages.json index b90dad0823..1c6175551a 100644 --- a/_locales/yue/messages.json +++ b/_locales/yue/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "詳細" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "置頂" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "取消置頂" }, "icu:Poll__end-poll": { "messageformat": "結束投票" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "繼續" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {置頂嘅訊息}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "其他操作" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "取消置頂" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "跳去「訊息」" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "睇晒全部訊息" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "地址" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "語音訊息" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "檔案" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "聯絡人" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "付款" }, @@ -5166,16 +5169,16 @@ "messageformat": "連結" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "排序方法" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "排序方法" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "日期" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "檔案大細" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "冇任何媒體" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "匯出唔到聊天紀錄,因為 Signal 冇權限將檔案寫入磁碟。試下更改磁碟權限或者更新系統設定,然後再匯出。" }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "月亮圖示" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "再睇多次金鑰" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "備份資料夾" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "幫我哋了解多啲通話嘅情況,同埋做啲咩係有效、咩係冇效。你可以响提交之前睇吓除錯記錄。" }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "分享除錯記錄" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "除錯記錄只包括 APP 嘅基本資訊,唔會顯示任何訊息內容。" }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "提交" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "多謝你嘅回應!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "呢個版本包含咗少少調整同埋錯誤修復,等 Signal 可以順暢運作。", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "我哋做咗啲調整、修復咗一啲錯誤,同埋加強咗程式功能。多謝你使用 Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "而家桌面版 Signal 嘅投票功能,同手機版一樣會有細緻嘅動畫效果。只要投票就可以睇到你嘅心水選項點樣大獲全勝。" - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "俾人見到舉錯手係有啲尷尬嘅,好彩我們整返好個錯誤 – 之前,喺谷通話嗰陣,如果有人舉手之後即刻放低手,有時個舉手指示唔會消失(而且舉手計數顯示係零)。" + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/zh-CN/messages.json b/_locales/zh-CN/messages.json index 1fa4d842b7..3e5b972f97 100644 --- a/_locales/zh-CN/messages.json +++ b/_locales/zh-CN/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "信息" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "置顶" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "取消置顶" }, "icu:Poll__end-poll": { "messageformat": "结束投票" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "继续" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {置顶的消息}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "更多操作" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "取消置顶" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "前往消息" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "查看所有消息" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "地址" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "语音消息" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "文件" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "联系人" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "付款" }, @@ -5166,16 +5169,16 @@ "messageformat": "链接" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "排序方式" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "排序方式" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "日期" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "大小" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "无媒体" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "无法导出您的聊天记录,因为 Signal 没有向磁盘写入文件的权限。请尝试更改磁盘权限或更新系统设置,然后再导出。" }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "月亮图标" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "再次查看密钥" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "备份文件夹" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "这有助于我们进一步了解通话情况,以及哪些功能正常,哪些存在问题。您可以先查看您的调试日志再提交。" }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "分享调试日志" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "调试日志包含低级应用程序信息,不会显示任何消息内容。" }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "提交" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "感谢您的反馈!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "此版本包含多个小调整和漏洞修复,以维持 Signal 的顺畅运行。", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "我们进行了功能微调、漏洞修复和性能强化。感谢使用 Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "优化了 Signal 投票功能的动画效果。" - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "我们修复了群组通话中举手指示器的一个微小显示漏洞。" + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/zh-HK/messages.json b/_locales/zh-HK/messages.json index 8f99399969..b43ced5aef 100644 --- a/_locales/zh-HK/messages.json +++ b/_locales/zh-HK/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "資訊" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "釘選" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "取消釘選" }, "icu:Poll__end-poll": { "messageformat": "結束投票" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "繼續" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {已釘選的訊息}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "更多操作" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "取消釘選" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "前往「訊息」" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "查看所有訊息" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "地址" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "語音訊息" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "檔案" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "聯絡人" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "付款" }, @@ -5166,16 +5169,16 @@ "messageformat": "連結" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "排序方式" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "排序方式" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "日期" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "檔案大小" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "沒有多媒體" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "無法匯出聊天紀錄,因為 Signal 沒有權限將檔案寫入磁碟。請嘗試變更磁碟權限或更新系統設定,然後再匯出。" }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "月亮圖示" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "再看一次金鑰" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "備份資料夾" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "這有助於我們深入了解通話的情況,以及哪些做法真正有效。你可在提交前檢視除錯日誌。" }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "分享除錯日誌" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "除錯日誌包含低階應用程式資訊,不會顯示任何訊息內容。" }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "送出" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "感謝你的意見!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "此版本包含許多小調整和錯誤修復,以維持 Signal 穩定運作。", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "細微的調整、問題修復和效能改善。感謝各位使用 Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "桌面版 Signal 的投票現已包括與手機版相同的細緻動畫效果。看著你最喜愛的選項拉開距離,只需一次投票。" - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "我們修正了一個群組通話中舉手指示器的錯誤:如果有人非常快速地舉起和放下手,有時舉手指示器會持續顯示(且計數為零)。" + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } diff --git a/_locales/zh-Hant/messages.json b/_locales/zh-Hant/messages.json index ee2dbd1f63..cc2b3eba28 100644 --- a/_locales/zh-Hant/messages.json +++ b/_locales/zh-Hant/messages.json @@ -1083,10 +1083,10 @@ "messageformat": "資訊" }, "icu:MessageContextMenu__PinMessage": { - "messageformat": "Pin" + "messageformat": "釘選" }, "icu:MessageContextMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "取消釘選" }, "icu:Poll__end-poll": { "messageformat": "結束投票" @@ -1238,6 +1238,15 @@ "icu:PinMessageDialog--HasMaxPinnedMessages__Continue": { "messageformat": "繼續" }, + "icu:PinMessageDisappearingMessagesWarningDialog__Title": { + "messageformat": "Pinning disappearing messages" + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Description": { + "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + }, + "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { + "messageformat": "Okay" + }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {已釘選的訊息}}" }, @@ -1251,7 +1260,7 @@ "messageformat": "更多操作" }, "icu:PinnedMessagesBar__ActionsMenu__UnpinMessage": { - "messageformat": "Unpin" + "messageformat": "取消釘選" }, "icu:PinnedMessagesBar__ActionsMenu__GoToMessage": { "messageformat": "前往「訊息」" @@ -1259,9 +1268,6 @@ "icu:PinnedMessagesBar__ActionsMenu__SeeAllMessages": { "messageformat": "查看所有訊息" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Address": { - "messageformat": "地址" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--VoiceMessage": { "messageformat": "語音訊息" }, @@ -1271,9 +1277,6 @@ "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--File": { "messageformat": "檔案" }, - "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Contact": { - "messageformat": "聯絡人" - }, "icu:PinnedMessagesBar__MessagePreview__SymbolLabel--Payment": { "messageformat": "付款" }, @@ -5166,16 +5169,16 @@ "messageformat": "連結" }, "icu:MediaGallery__sort": { - "messageformat": "Sort by" + "messageformat": "排列方式" }, "icu:MediaGallery__sort--header": { - "messageformat": "Sort by" + "messageformat": "排列方式" }, "icu:MediaGallery__sort__date": { - "messageformat": "Date" + "messageformat": "日期" }, "icu:MediaGallery__sort__size": { - "messageformat": "Size" + "messageformat": "檔案大小" }, "icu:MediaGallery__EmptyState__title--media": { "messageformat": "無媒體" @@ -5624,6 +5627,24 @@ "icu:PlaintextExport--Error--DiskPermssions--Detail": { "messageformat": "無法匯出聊天紀錄,因為 Signal 沒有權限將檔案寫入磁碟。請嘗試變更磁碟權限或更新系統設定,然後再匯出。" }, + "icu:LocalBackupExport--ProgressDialog--Header": { + "messageformat": "Exporting backup" + }, + "icu:LocalBackupExport--CompleteDialog--Header": { + "messageformat": "Backup export complete" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { + "messageformat": "To restore this backup:" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { + "messageformat": "Transfer your backup folder to your phone's storage" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { + "messageformat": "Install a new copy of Signal on your phone" + }, + "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { + "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + }, "icu:NotificationProfile--moon-icon": { "messageformat": "月亮圖示" }, @@ -5981,6 +6002,15 @@ "icu:Preferences--local-backups-see-backup-key-again": { "messageformat": "再看一次金鑰" }, + "icu:Preferences__local-backups-last-backup": { + "messageformat": "Last backup" + }, + "icu:Preferences__local-backups-last-backup-never": { + "messageformat": "Never" + }, + "icu:Preferences__local-backups-backup-now": { + "messageformat": "Back up now" + }, "icu:Preferences__local-backups-folder": { "messageformat": "備份資料夾" }, @@ -7581,6 +7611,9 @@ "icu:CallQualitySurvey__ConfirmSubmission__PageDescription": { "messageformat": "這有助於我們深入了解通話的情況,以及哪些做法真正有效。你可在提交前檢視除錯日誌。" }, + "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { + "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "分享除錯日誌" }, @@ -7590,6 +7623,12 @@ "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__HelpText": { "messageformat": "除錯日誌包含低階應用程式資訊,不會顯示任何訊息內容。" }, + "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { + "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + }, + "icu:CallDiagnosticWindow__title": { + "messageformat": "Diagnostic information" + }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "送出" }, @@ -7605,6 +7644,9 @@ "icu:CallQualitySurvey__SubmissionSuccess": { "messageformat": "感謝你的意見!" }, + "icu:Megaphone__ExpandNarrowSidebar": { + "messageformat": "Expand sidebar to interact with megaphone" + }, "icu:WhatsNew__bugfixes": { "messageformat": "此版本包含許多小調整和錯誤修復,以維持 Signal 穩定運作。", "ignoreUnused": true @@ -7633,10 +7675,10 @@ "messageformat": "細微的調整、問題修復和效能改善。感謝各位使用 Signal!", "ignoreUnused": true }, - "icu:WhatsNew__7.84--0": { - "messageformat": "桌面版 Signal 的投票現已包括與手機版相同的細緻動畫效果。看著你最喜愛的選項拉開距離,只需一次投票。" - }, "icu:WhatsNew__7.86--0": { - "messageformat": "We can't fix the awkward silence that follows, but we fixed a bug that sometimes caused the raised hand indicator to remain visible (with a count of zero) if someone raised and lowered their hand really quickly." + "messageformat": "我們修正了一個群組通話中舉手指示器的錯誤:如果有人非常快速地舉起和放下手,有時舉手指示器會持續顯示(且計數為零)。" + }, + "icu:WhatsNew__7.87--0": { + "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." } } From 0918be273ec623ce0ef12af6a5a5e1df8bddeaf7 Mon Sep 17 00:00:00 2001 From: ayumi-signal Date: Wed, 21 Jan 2026 14:34:20 -0800 Subject: [PATCH 43/49] 7.87.0-beta.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 74956fd554..180655b9cc 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "description": "Private messaging from your desktop", "desktopName": "signal.desktop", "repository": "https://github.com/signalapp/Signal-Desktop.git", - "version": "7.87.0-alpha.1", + "version": "7.87.0-beta.1", "license": "AGPL-3.0-only", "author": { "name": "Signal Messenger, LLC", From 8ecdb8ef23ba7b0ec6e7983946cd0a23545a2c57 Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Thu, 22 Jan 2026 14:16:35 -0600 Subject: [PATCH 44/49] Fix go to pinned message ambiguous sql column Co-authored-by: Jamie <113370520+jamiebuilds-signal@users.noreply.github.com> --- ts/sql/Interface.std.ts | 10 ++--- ts/sql/Server.node.ts | 86 +++++++++++++++++++++-------------------- ts/sql/util.std.ts | 8 ++++ 3 files changed, 58 insertions(+), 46 deletions(-) diff --git a/ts/sql/Interface.std.ts b/ts/sql/Interface.std.ts index 02db9cf751..31187a6f4f 100644 --- a/ts/sql/Interface.std.ts +++ b/ts/sql/Interface.std.ts @@ -77,7 +77,7 @@ import type { RemoteMegaphoneId, RemoteMegaphoneType, } from '../types/Megaphone.std.js'; -import { QueryFragment, sqlJoin } from './util.std.js'; +import { sqlFragment, sqlId, sqlJoin } from './util.std.js'; export type ReadableDB = Database & { __readable_db: never }; export type WritableDB = ReadableDB & { __writable_db: never }; @@ -194,12 +194,12 @@ export const MESSAGE_COLUMNS = [ ...MESSAGE_NON_PRIMARY_KEY_COLUMNS, ] as const; -export const MESSAGE_COLUMNS_FRAGMENTS = MESSAGE_COLUMNS.map( - column => new QueryFragment(column, []) +export const MESSAGE_COLUMNS_FRAGMENT = sqlJoin( + MESSAGE_COLUMNS.map(column => { + return sqlFragment`messages.${sqlId(column)}`; + }) ); -export const MESSAGE_COLUMNS_SELECT = sqlJoin(MESSAGE_COLUMNS_FRAGMENTS); - export type MessageTypeUnhydrated = { json: string; diff --git a/ts/sql/Server.node.ts b/ts/sql/Server.node.ts index 0046f80032..00fe5b34f5 100644 --- a/ts/sql/Server.node.ts +++ b/ts/sql/Server.node.ts @@ -69,6 +69,7 @@ import { sqlFragment, sqlJoin, convertOptionalBooleanToInteger, + sqlId, } from './util.std.js'; import { hydrateMessage, @@ -200,8 +201,7 @@ import type { import { AttachmentDownloadSource, MESSAGE_COLUMNS, - MESSAGE_COLUMNS_FRAGMENTS, - MESSAGE_COLUMNS_SELECT, + MESSAGE_COLUMNS_FRAGMENT, MESSAGE_ATTACHMENT_COLUMNS, MESSAGE_NON_PRIMARY_KEY_COLUMNS, } from './Interface.std.js'; @@ -2199,10 +2199,6 @@ function searchMessages( .run({ conversationId, limit }); } - const prefixedColumns = sqlJoin( - MESSAGE_COLUMNS_FRAGMENTS.map(name => sqlFragment`messages.${name}`) - ); - // The `MATCH` is necessary in order to for `snippet()` helper function to // give us the right results. We can't call `snippet()` in the query above // because it would bloat the temporary table with text data and we want @@ -2210,7 +2206,7 @@ function searchMessages( const ftsFragment = sqlFragment` SELECT messages.rowid, - ${prefixedColumns}, + ${MESSAGE_COLUMNS_FRAGMENT}, snippet(messages_fts, -1, ${SNIPPET_LEFT_PLACEHOLDER}, ${SNIPPET_RIGHT_PLACEHOLDER}, ${SNIPPET_TRUNCATION_PLACEHOLDER}, 10) AS ftsSnippet FROM tmp_filtered_results INNER JOIN messages_fts @@ -2231,10 +2227,13 @@ function searchMessages( const [sqlQuery, params] = sql`${ftsFragment};`; queryResult = writable.prepare(sqlQuery).all(params); } else { - const coalescedColumns = MESSAGE_COLUMNS_FRAGMENTS.map( - name => sqlFragment` - COALESCE(messages.${name}, ftsResults.${name}) AS ${name} - ` + const coalescedColumns = sqlJoin( + MESSAGE_COLUMNS.map(name => { + const id = sqlId(name); + return sqlFragment` + COALESCE(messages.${id}, ftsResults.${id}) AS ${id} + `; + }) ); // If contactServiceIdsMatchingQuery is not empty, we due an OUTER JOIN @@ -2249,7 +2248,7 @@ function searchMessages( const [sqlQuery, params] = sql` SELECT messages.rowid as rowid, - ${sqlJoin(coalescedColumns)}, + ${coalescedColumns}, ftsResults.ftsSnippet, mentionAci, start as mentionStart, @@ -2369,8 +2368,7 @@ export function getMostRecentAddressableMessages( ): Array { return db.transaction(() => { const [query, parameters] = sql` - SELECT - ${sqlJoin(MESSAGE_COLUMNS_FRAGMENTS)} + SELECT ${MESSAGE_COLUMNS_FRAGMENT} FROM messages INDEXED BY messages_by_date_addressable WHERE @@ -2393,8 +2391,7 @@ export function getMostRecentAddressableNondisappearingMessages( ): Array { return db.transaction(() => { const [query, parameters] = sql` - SELECT - ${sqlJoin(MESSAGE_COLUMNS_FRAGMENTS)} + SELECT ${MESSAGE_COLUMNS_FRAGMENT} FROM messages INDEXED BY messages_by_date_addressable_nondisappearing WHERE @@ -3326,8 +3323,14 @@ function getMessageByAuthorAciAndSentAt( options: { includeEdits: boolean } ): MessageType | null { return db.transaction(() => { + // Return sentAt/readStatus from the messages table, when we edit a message + // we add the original message to messages.editHistory and update original + // message's sentAt/readStatus columns. + // + // Make sure to preserve order of SELECT columns in the UNION + // In SQL UNION's require that the SELECT columns are in the same order const editedMessagesQuery = sqlFragment` - SELECT ${MESSAGE_COLUMNS_SELECT} + SELECT ${MESSAGE_COLUMNS_FRAGMENT} FROM edited_messages INNER JOIN messages ON messages.id = edited_messages.messageId @@ -3336,7 +3339,7 @@ function getMessageByAuthorAciAndSentAt( `; const messagesQuery = sqlFragment` - SELECT ${MESSAGE_COLUMNS_SELECT} + SELECT ${MESSAGE_COLUMNS_FRAGMENT} FROM messages WHERE messages.sourceServiceId = ${authorAci} AND messages.sent_at = ${sentAtTimestamp} @@ -3832,8 +3835,7 @@ function getRecentStoryReplies( }; const createQuery = (timeFilter: QueryFragment): QueryFragment => sqlFragment` - SELECT - ${MESSAGE_COLUMNS_SELECT} + SELECT ${MESSAGE_COLUMNS_FRAGMENT} FROM messages WHERE (${messageId ?? null} IS NULL OR id IS NOT ${messageId ?? null}) AND @@ -3897,8 +3899,7 @@ function getAdjacentMessagesByConversation( requireFileAttachments; const createQuery = (timeFilter: QueryFragment): QueryFragment => sqlFragment` - SELECT - ${sqlJoin(MESSAGE_COLUMNS_FRAGMENTS)} + SELECT ${MESSAGE_COLUMNS_FRAGMENT} FROM messages WHERE conversationId = ${conversationId} AND ${ @@ -3965,7 +3966,7 @@ function getAllStories( ): GetAllStoriesResultType { return db.transaction(() => { const [storiesQuery, storiesParams] = sql` - SELECT ${sqlJoin(MESSAGE_COLUMNS_FRAGMENTS)} + SELECT ${MESSAGE_COLUMNS_FRAGMENT} FROM messages WHERE isStory = 1 AND @@ -4642,7 +4643,7 @@ function getCallHistoryMessageByCallId( ): MessageType | undefined { return db.transaction(() => { const [query, params] = sql` - SELECT ${sqlJoin(MESSAGE_COLUMNS_FRAGMENTS)} + SELECT ${MESSAGE_COLUMNS_FRAGMENT} FROM messages WHERE conversationId = ${options.conversationId} AND type = 'call-history' @@ -5614,8 +5615,7 @@ function getSortedNonAttachmentMedia( } const createQuery = (timeFilter: QueryFragment): QueryFragment => sqlFragment` - SELECT - ${sqlJoin(MESSAGE_COLUMNS_FRAGMENTS)} + SELECT ${MESSAGE_COLUMNS_FRAGMENT} FROM messages INDEXED BY ${index} WHERE @@ -5856,22 +5856,20 @@ function getMessagesBySentAt( sentAt: number ): Array { return db.transaction(() => { - // Make sure to preserve order of columns - const editedColumns = MESSAGE_COLUMNS_FRAGMENTS.map(name => { - if (name.fragment === 'received_at' || name.fragment === 'sent_at') { - return name; - } - return sqlFragment`messages.${name}`; - }); - + // Return sentAt/readStatus from the messages table, when we edit a message + // we add the original message to messages.editHistory and update original + // message's sentAt/readStatus columns. + // + // Make sure to preserve order of SELECT columns in the UNION + // In SQL UNION's require that the SELECT columns are in the same order const [query, params] = sql` - SELECT ${sqlJoin(editedColumns)} + SELECT ${MESSAGE_COLUMNS_FRAGMENT} FROM edited_messages INNER JOIN messages ON messages.id = edited_messages.messageId WHERE edited_messages.sentAt = ${sentAt} UNION - SELECT ${sqlJoin(MESSAGE_COLUMNS_FRAGMENTS)} + SELECT ${MESSAGE_COLUMNS_FRAGMENT} FROM messages WHERE sent_at = ${sentAt} ORDER BY messages.received_at DESC, messages.sent_at DESC; @@ -9245,13 +9243,19 @@ function getUnreadEditedMessagesAndMarkRead( } ): GetUnreadByConversationAndMarkReadResultType { return db.transaction(() => { - const editedColumns = MESSAGE_COLUMNS_FRAGMENTS.filter( - name => name.fragment !== 'sent_at' && name.fragment !== 'readStatus' - ).map(name => sqlFragment`messages.${name}`); + const editedColumns = sqlJoin( + MESSAGE_COLUMNS.filter(name => { + // We want to use edited_messages.sentAt/readStatus here so that we can + // update these rows below. + return name !== 'sent_at' && name !== 'readStatus'; + }).map(name => { + return sqlFragment`messages.${sqlId(name)}`; + }) + ); const [selectQuery, selectParams] = sql` SELECT - ${sqlJoin(editedColumns)}, + ${editedColumns}, edited_messages.sentAt as sent_at, edited_messages.readStatus FROM edited_messages @@ -9260,7 +9264,7 @@ function getUnreadEditedMessagesAndMarkRead( WHERE edited_messages.readStatus = ${ReadStatus.Unread} AND edited_messages.conversationId = ${conversationId} AND - received_at <= ${readMessageReceivedAt} + messages.received_at <= ${readMessageReceivedAt} ORDER BY messages.received_at DESC, messages.sent_at DESC; `; diff --git a/ts/sql/util.std.ts b/ts/sql/util.std.ts index 2194389aca..3cc53f9bfe 100644 --- a/ts/sql/util.std.ts +++ b/ts/sql/util.std.ts @@ -6,6 +6,7 @@ import lodash from 'lodash'; import type { ReadableDB, WritableDB } from './Interface.std.js'; import type { LoggerType } from '../types/Logging.std.js'; +import { strictAssert } from '../util/assert.std.js'; const { isNumber, last } = lodash; @@ -105,6 +106,13 @@ export function sqlConstant(value: QueryTemplateParam): QueryFragment { return new QueryFragment(fragment, []); } +const PLAIN_SQL_IDENTIFIER = /^[a-zA-Z_][a-zA-Z0-9_]*$/; + +export function sqlId(name: string): QueryFragment { + strictAssert(PLAIN_SQL_IDENTIFIER.test(name), `Invalid identifier ${name}`); + return new QueryFragment(`\`${name}\``, []); +} + /** * Like `Array.prototype.join`, but for SQL fragments. */ From ec1cf03fccce4ecb1e22af06215bdc919c419297 Mon Sep 17 00:00:00 2001 From: Jamie Kyle Date: Fri, 23 Jan 2026 11:04:29 -0800 Subject: [PATCH 45/49] Update strings --- _locales/af-ZA/messages.json | 34 +++++++++++++++++----------------- _locales/ar/messages.json | 16 ++++++++-------- _locales/az-AZ/messages.json | 16 ++++++++-------- _locales/bg-BG/messages.json | 16 ++++++++-------- _locales/bn-BD/messages.json | 16 ++++++++-------- _locales/bs-BA/messages.json | 16 ++++++++-------- _locales/ca/messages.json | 16 ++++++++-------- _locales/cs/messages.json | 16 ++++++++-------- _locales/da/messages.json | 14 +++++++------- _locales/de/messages.json | 16 ++++++++-------- _locales/el/messages.json | 16 ++++++++-------- _locales/es/messages.json | 16 ++++++++-------- _locales/et-EE/messages.json | 16 ++++++++-------- _locales/eu/messages.json | 16 ++++++++-------- _locales/fa-IR/messages.json | 16 ++++++++-------- _locales/fi/messages.json | 16 ++++++++-------- _locales/fr/messages.json | 16 ++++++++-------- _locales/ga-IE/messages.json | 16 ++++++++-------- _locales/gl-ES/messages.json | 16 ++++++++-------- _locales/gu-IN/messages.json | 16 ++++++++-------- _locales/he/messages.json | 16 ++++++++-------- _locales/hi-IN/messages.json | 16 ++++++++-------- _locales/hr-HR/messages.json | 16 ++++++++-------- _locales/hu/messages.json | 34 +++++++++++++++++----------------- _locales/id/messages.json | 16 ++++++++-------- _locales/it/messages.json | 16 ++++++++-------- _locales/ja/messages.json | 16 ++++++++-------- _locales/ka-GE/messages.json | 16 ++++++++-------- _locales/kk-KZ/messages.json | 16 ++++++++-------- _locales/km-KH/messages.json | 16 ++++++++-------- _locales/kn-IN/messages.json | 16 ++++++++-------- _locales/ko/messages.json | 26 +++++++++++++------------- _locales/ky-KG/messages.json | 16 ++++++++-------- _locales/lt-LT/messages.json | 16 ++++++++-------- _locales/lv-LV/messages.json | 16 ++++++++-------- _locales/mk-MK/messages.json | 16 ++++++++-------- _locales/ml-IN/messages.json | 16 ++++++++-------- _locales/mr-IN/messages.json | 16 ++++++++-------- _locales/ms/messages.json | 14 +++++++------- _locales/my/messages.json | 16 ++++++++-------- _locales/nb/messages.json | 16 ++++++++-------- _locales/nl/messages.json | 18 +++++++++--------- _locales/pa-IN/messages.json | 16 ++++++++-------- _locales/pl/messages.json | 16 ++++++++-------- _locales/pt-BR/messages.json | 16 ++++++++-------- _locales/pt-PT/messages.json | 16 ++++++++-------- _locales/ro-RO/messages.json | 14 +++++++------- _locales/ru/messages.json | 16 ++++++++-------- _locales/sk-SK/messages.json | 16 ++++++++-------- _locales/sl-SI/messages.json | 16 ++++++++-------- _locales/sq-AL/messages.json | 16 ++++++++-------- _locales/sr/messages.json | 16 ++++++++-------- _locales/sv/messages.json | 34 +++++++++++++++++----------------- _locales/sw/messages.json | 16 ++++++++-------- _locales/ta-IN/messages.json | 16 ++++++++-------- _locales/te-IN/messages.json | 16 ++++++++-------- _locales/th/messages.json | 16 ++++++++-------- _locales/tl-PH/messages.json | 14 +++++++------- _locales/tr/messages.json | 16 ++++++++-------- _locales/ug/messages.json | 34 +++++++++++++++++----------------- _locales/uk-UA/messages.json | 16 ++++++++-------- _locales/ur/messages.json | 16 ++++++++-------- _locales/vi/messages.json | 16 ++++++++-------- _locales/yue/messages.json | 16 ++++++++-------- _locales/zh-CN/messages.json | 16 ++++++++-------- _locales/zh-HK/messages.json | 16 ++++++++-------- _locales/zh-Hant/messages.json | 16 ++++++++-------- 67 files changed, 574 insertions(+), 574 deletions(-) diff --git a/_locales/af-ZA/messages.json b/_locales/af-ZA/messages.json index e3af55cd27..40b613ac6a 100644 --- a/_locales/af-ZA/messages.json +++ b/_locales/af-ZA/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Gaan voort" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Merk verdwynende boodskappe met spelde" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Merkspelde sal by verdwynende boodskappe verwyder word wanneer hul tydhouer verstryk en die boodskap uit die klets verwyder word." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Goed" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Boodskap met speld gemerk} other {Boodskappe met speld gemerk}}" @@ -5628,22 +5628,22 @@ "messageformat": "Jou kletsgeskiedenis kan nie uitgevoer word nie, want Signal het nie toestemming om lêers na jou skyf te skryf nie. Probeer om jou skyftoestemmings te verander of 'n opdatering van jou stelselinstellings te doen en voer dan weer uit." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Besig om rugsteun uit te voer" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Uitvoer van rugsteun voltooi" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Om hierdie rugsteun te herstel:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Dra jou rugsteunvouer na jou foon se stoorruimte oor" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Installeer 'n nuwe kopie van Signal op jou foon" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Tik op \"Herstel of Oordra\" en kies \"Wanneer Toestel Rugsteun\"" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Maan-ikoon" @@ -6003,13 +6003,13 @@ "messageformat": "Wys sleutel weer" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Laaste rugsteun" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Nooit" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Rugsteun nou" }, "icu:Preferences__local-backups-folder": { "messageformat": "Rugsteungids" @@ -7612,7 +7612,7 @@ "messageformat": "Dit help ons om meer te uit te vind oor oproepe en wat werk of nie werk nie. Jy kan jou ontfout-log besigtig voordat jy dit indien." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Indiening sal jou terugvoer deel, saam met diagnostiese inligting oor jou oproep. Opsioneel kan jy 'n ontfout-log deel om ons te help om oproepkwaliteit te verbeter." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Deel ontfout-log" @@ -7624,10 +7624,10 @@ "messageformat": "Ontfout-logs bevat laevlak-toepassingsinligting en maak niks van jou boodskapinhoud bekend nie." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Inligting wat met ons gedeel word, bevat laevlak-toepassingsinligting en sluit nie die inhoud van jou oproepe in nie." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Diagnostiese inligting" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Dien in" @@ -7645,7 +7645,7 @@ "messageformat": "Dankie vir jou terugvoer!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Vou die kantbalk uit vir interaksie deur die megafoon" }, "icu:WhatsNew__bugfixes": { "messageformat": "Hierdie weergawe bevat ’n aantal klein aanpassings en regstellings om Signal glad te laat werk.", @@ -7679,6 +7679,6 @@ "messageformat": "Ons het 'n geringe vertoonfout met die opgesteektehand-aanduider in groepoproepe reggestel." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Vasgespelde boodskappe kan jou help om belangrike inligting maklik toeganklik te hou. Jou mees algemene vrae, aandetebesprekings en vakansiereisplanne is reeds voorop in jou gedagtes. Nou kan dit ook in kletse voorop geplaas word." } } diff --git a/_locales/ar/messages.json b/_locales/ar/messages.json index 3e40b46adc..dfa2ca1640 100644 --- a/_locales/ar/messages.json +++ b/_locales/ar/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "متابعة" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "تثبيت الرسائل المؤقَّتة" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "سيُلغى تثبيت الرسائل المؤقَّتة عند انتهاء مؤقتها وإزالتها من الدردشة." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "حسنًا" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, zero {رسائل مُثبَّتة} one {رسالة مُثبَّتة} two {رسالتان مُثبَّتتان} few {رسائل مُثبَّتة} many {رسائل مُثبَّتة} other {رسائل مُثبَّتة}}" @@ -6003,13 +6003,13 @@ "messageformat": "اطَّلِع على المفتاح مُجدَّدًا" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "آخِر نسخة احتياطية" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "أبدًا" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "إنشاء نسخة احتياطية الآن" }, "icu:Preferences__local-backups-folder": { "messageformat": "مجلد النسخ الاحتياطية" @@ -7624,10 +7624,10 @@ "messageformat": "تحتوي سجلات الأخطاء على معلومات التطبيق منخفضة المستوى ولا تكشف عن أي من محتويات رسالتك." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "المعلومات التي تتم مشاركتها معنا تقتصر على بيانات تقنية منخفضة المستوى خاصة بالتطبيق، ولا تشمل محتوى مكالماتك." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "معلومات التشخيص" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "إرسال" diff --git a/_locales/az-AZ/messages.json b/_locales/az-AZ/messages.json index ed4f1b4d8e..23ca070133 100644 --- a/_locales/az-AZ/messages.json +++ b/_locales/az-AZ/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Davam et" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Avtomatik yox olan mesajların sancaqlanması" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Vaxtları bitdikdə avtomatik yox olan mesajlar sancaqdan çıxarılacaq və mesaj çatdan silinəcək." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Oldu" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Sancaqlanmış mesaj} other {Sancaqlanmış mesajlar}}" @@ -6003,13 +6003,13 @@ "messageformat": "Şifrəyə yenidən bax" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Son ehtiyat nüsxə" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Heç vaxt" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "İndi Arxivləşdir" }, "icu:Preferences__local-backups-folder": { "messageformat": "Nüsxə qovluğu" @@ -7624,10 +7624,10 @@ "messageformat": "Sazlama jurnalları aşağı səviyyəli tətbiq məlumatlarını əhatə edir və mesaj məzmunlarınızın heç birini aşkarlamır." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Bizimlə paylaşılan məlumat tətbiq haqqında çox az tərkibə malikdir və zənglərinizin məzmununu əks etdirmir." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Diaqnostik məlumat" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Təqdim et" diff --git a/_locales/bg-BG/messages.json b/_locales/bg-BG/messages.json index b8eac82b74..6948351610 100644 --- a/_locales/bg-BG/messages.json +++ b/_locales/bg-BG/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Продължаване" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Закачване на изчезващи съобщения" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Изчезващите съобщения ще бъдат откачени, когато техният таймер изтече и съобщението бъде премахнато от чата." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Добре" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Закачено съобщение} other {Закачени съобщения}}" @@ -6003,13 +6003,13 @@ "messageformat": "Вижте ключа отново" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Последно резервно копиране" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Никога" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Направете резервно копие сега" }, "icu:Preferences__local-backups-folder": { "messageformat": "Архивна папка" @@ -7624,10 +7624,10 @@ "messageformat": "Докладите за дебъг съдържат информация за приложенията от ниско ниво и не разкриват никакво съдържание от съобщенията ви." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Споделената с нас информация съдържа информация за приложенията от ниско ниво и не включва съдържанието на вашите обаждания." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Диагностична информация" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Изпрати" diff --git a/_locales/bn-BD/messages.json b/_locales/bn-BD/messages.json index e7b2680b64..91a35161f7 100644 --- a/_locales/bn-BD/messages.json +++ b/_locales/bn-BD/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "চালিয়ে যান" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "অদৃশ্য হতে যাওয়া মেসেজ পিন করা হচ্ছে" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "টাইমারের মেয়াদ শেষ হয়ে গেলে এবং চ্যাট থেকে মেসেজ সরিয়ে ফেলা হলে, অদৃশ্য হতে যাওয়া মেসেজ আনপিন করা হবে।" }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "ঠিক আছে" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {পিনকৃত মেসেজ} other {মেসেজ পিন করুন}}" @@ -6003,13 +6003,13 @@ "messageformat": "'কি'-টি আবার দেখুন" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "সর্বশেষ ব্যাকআপ" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "কখনোই না" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "এখনি ব্যাকআপ করুন" }, "icu:Preferences__local-backups-folder": { "messageformat": "ব্যাকআপ ফোল্ডার" @@ -7624,10 +7624,10 @@ "messageformat": "ডিবাগ লগগুলোতে অ্যাপ সংক্রান্ত অল্প কিছু তথ্য থাকে এবং আপনার কোনো মেসেজের কন্টেন্ট প্রকাশ করে না।" }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "আমাদের সাথে শেয়ার করা তথ্যে অ্যাপ সংক্রান্ত খুব সাধারণ কিছু তথ্য রয়েছে এবং এতে আপনার কলের কোনো কন্টেন্ট অন্তর্ভুক্ত থাকে না।" }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "ডায়াগনস্টিক তথ্য" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "সাবমিট" diff --git a/_locales/bs-BA/messages.json b/_locales/bs-BA/messages.json index 8785a268b2..3eaf185356 100644 --- a/_locales/bs-BA/messages.json +++ b/_locales/bs-BA/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Nastavi" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Kačenje nestajućih poruka" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Nestajuće poruke bit će otkačene kada im istekne tajmer, a poruka će biti uklonjena iz chata." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Uredu" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Zakačena poruka} few {Zakačene poruke} many {Zakačenih poruka} other {Zakačene poruke}}" @@ -6003,13 +6003,13 @@ "messageformat": "Vidi ključ ponovo" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Posljednja rezervna kopija" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Nikad" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Kreiraj kopiju sada" }, "icu:Preferences__local-backups-folder": { "messageformat": "Direktorij za rezervne kopije" @@ -7624,10 +7624,10 @@ "messageformat": "Zapisnici o otklanjanju grešaka sadrže informacije o aplikaciji niskog nivoa i ne otkrivaju sadržaj vaših poruka." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Informacije koje se dijele s nama sadrže informacije o aplikacijama niskog nivoa i ne uključuju sadržaj vaših poziva." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Dijagnostičke informacije" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Šalji" diff --git a/_locales/ca/messages.json b/_locales/ca/messages.json index 9f7a15353b..a2fd061098 100644 --- a/_locales/ca/messages.json +++ b/_locales/ca/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Continua" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Fixar missatges a desaparèixer" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Els missatges a desaparèixer es desenganxaran quan s'acabi el temps i el missatge s'elimini del xat." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "D'acord" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Missatge fixat} other {Missatges fixats}}" @@ -6003,13 +6003,13 @@ "messageformat": "Tornar a veure la clau" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Darrera còpia de seguretat" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Mai" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Fes-ne una còpia de seguretat ara" }, "icu:Preferences__local-backups-folder": { "messageformat": "Carpeta de còpia de seguretat" @@ -7624,10 +7624,10 @@ "messageformat": "Els registres de depuració contenen informació de baix nivell sobre l'aplicació i no revelen cap dels continguts dels teus missatges." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "La informació que comparteixis amb nosaltres conté informació de baix nivell sobre l'aplicació i no inclou el contingut de les teves trucades." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Informació de diagnòstic" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Envia" diff --git a/_locales/cs/messages.json b/_locales/cs/messages.json index 38a1904bc9..0a7c86f6ef 100644 --- a/_locales/cs/messages.json +++ b/_locales/cs/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Pokračovat" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Připnout mizející zprávy" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Mizející zprávy budou po vypršení časového limitu odepnuty a zpráva bude z chatu odstraněna." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "V pořádku" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {připnutá zpráva} few {připnuté zprávy} many {připnutých zpráv} other {připnutých zpráv}}" @@ -6003,13 +6003,13 @@ "messageformat": "Znovu zobrazit klíč" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Poslední zálohování" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Nikdy" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Zálohovat nyní" }, "icu:Preferences__local-backups-folder": { "messageformat": "Složka pro zálohy" @@ -7624,10 +7624,10 @@ "messageformat": "Protokoly ladění obsahují informace o aplikaci na nízké úrovni a nesdělují žádný obsah vašich zpráv." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Informace, které s námi sdílíte, obsahují jen základní údaje o aplikaci a nezahrnují obsah vašich hovorů." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Diagnostické informace" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Odeslat" diff --git a/_locales/da/messages.json b/_locales/da/messages.json index 8684415619..405b92a837 100644 --- a/_locales/da/messages.json +++ b/_locales/da/messages.json @@ -1239,10 +1239,10 @@ "messageformat": "Fortsæt" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Fastgørelse af forsvindende beskeder" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Forsvindende beskeder vil blive frigjort, når tiden udløber, og beskeden fjernes fra chatten." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { "messageformat": "Okay" @@ -6003,13 +6003,13 @@ "messageformat": "Se nøglen igen" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Seneste sikkerhedskopi" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Aldrig" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Sikkerhedskopiér nu" }, "icu:Preferences__local-backups-folder": { "messageformat": "Mappe til sikkerhedskopi" @@ -7624,10 +7624,10 @@ "messageformat": "Fejlsøgningslogger indeholder oplysninger om appen på lavt niveau og afslører ikke noget indhold fra dine beskeder." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Oplysninger, der deles med os, omfatter appoplysninger på lavt niveau og inkluderer ikke indholdet af dine opkald." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Diagnostiske oplysninger" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Indsend" diff --git a/_locales/de/messages.json b/_locales/de/messages.json index 6add4eaf05..cecd3b857a 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Fortfahren" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Fixieren von verschwindenden Nachrichten" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Verschwindende Nachrichten werden nach der Ablaufzeit gelöst und aus dem Chat entfernt." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "OK" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Fixierte Nachricht} other {Fixierte Nachrichten}}" @@ -6003,13 +6003,13 @@ "messageformat": "Schlüssel erneut anzeigen" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Letztes Backup" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Nie" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Jetzt sichern" }, "icu:Preferences__local-backups-folder": { "messageformat": "Ordner für Backup" @@ -7624,10 +7624,10 @@ "messageformat": "Diagnoseprotokolle enthalten nur wenige App-Infos und verraten nichts über den Inhalt deiner Nachrichten." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Die Infos, die wir erhalten, umfassen nur technische App-Infos und beinhalten keine Gesprächsinhalte." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Diagnose-Information" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Übermitteln" diff --git a/_locales/el/messages.json b/_locales/el/messages.json index 6d8482f43f..2bc0cb0915 100644 --- a/_locales/el/messages.json +++ b/_locales/el/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Συνέχεια" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Καρφίτσωμα μηνυμάτων που εξαφανίζονται" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Τα μηνύματα που εξαφανίζονται θα ξεκαρφιτσώνονται όταν λήξει ο χρόνος τους και το μήνυμα αφαιρεθεί από τη συνομιλία." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Εντάξει" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Καρφιτσωμένo μήνυμα} other {Καρφιτσωμένα μηνύματα}}" @@ -6003,13 +6003,13 @@ "messageformat": "Επαναπροβολή κλειδιού" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Τελευταίο αντίγραφο ασφαλείας" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Ποτέ" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Δημιουργία αντίγραφου τώρα" }, "icu:Preferences__local-backups-folder": { "messageformat": "Φάκελος αντίγραφου ασφαλείας" @@ -7624,10 +7624,10 @@ "messageformat": "Τα αρχεία καταγραφής αποσφαλμάτωσης περιέχουν πληροφορίες εφαρμογής χαμηλού επιπέδου και δεν αποκαλύπτουν κανένα από τα περιεχόμενα των μηνυμάτων σου." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Οι πληροφορίες που κοινοποιούνται σε εμάς περιέχουν πληροφορίες χαμηλού επιπέδου της εφαρμογής και δεν περιλαμβάνουν το περιεχόμενο των κλήσεών σου." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Πληροφορίες διαγνωστικών" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Υποβολή" diff --git a/_locales/es/messages.json b/_locales/es/messages.json index 00ae054c82..68b2c7bb37 100644 --- a/_locales/es/messages.json +++ b/_locales/es/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Continuar" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Fijar mensajes temporales" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Los mensajes temporales permanecerán fijados hasta que la duración establecida finalice y el mensaje desaparezca del chat." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Aceptar" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Mensaje fijado} other {Mensajes fijados}}" @@ -6003,13 +6003,13 @@ "messageformat": "Volver a ver la clave" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Última copia de seguridad" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Nunca" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Iniciar copia" }, "icu:Preferences__local-backups-folder": { "messageformat": "Carpeta de copia de seguridad" @@ -7624,10 +7624,10 @@ "messageformat": "Los registros de depuración contienen información técnica de la aplicación y no revelan el contenido de ninguno de tus mensajes." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "La información que compartes con nosotros contiene únicamente datos técnicos de la aplicación y nunca incluye el contenido de tus llamadas." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Información de diagnóstico" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Enviar" diff --git a/_locales/et-EE/messages.json b/_locales/et-EE/messages.json index 20c7151f49..228912bdac 100644 --- a/_locales/et-EE/messages.json +++ b/_locales/et-EE/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Jätka" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Kaduvate sõnumite esiletõstmine" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Kaduvate sõnumite esiletõstud eemaldatakse, kui nende taimer aegub ja sõnum vestlusest eemaldatakse." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Sobib" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Esiletõstetud sõnum} other {Esiletõstetud sõnumid}}" @@ -6003,13 +6003,13 @@ "messageformat": "Vaata võtit veelkord" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Viimane varukoopia" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Mitte kunagi" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Varunda kohe" }, "icu:Preferences__local-backups-folder": { "messageformat": "Varunduste kaust" @@ -7624,10 +7624,10 @@ "messageformat": "Silumislogid sisaldavad üldistatud teavet rakenduse kohta ega avalda sinu sõnumite sisu." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Meiega jagatud teave sisaldab rakendusega seotud madala taseme teavet ega hõlma sinu kõnede sisu." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Diagnostiline teave" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Postita" diff --git a/_locales/eu/messages.json b/_locales/eu/messages.json index 1bfbd990c7..6a1f80bad2 100644 --- a/_locales/eu/messages.json +++ b/_locales/eu/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Jarraitu" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Desagertzen den mezuak ainguratzea" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Tenporizadorea zerora iristean, aigura kendu egingo zaie desagertzen den mezuei, eta mezua txatetik kenduko da." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Ados" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Ainguratutako mezua} other {Ainguratutako mezuak}}" @@ -6003,13 +6003,13 @@ "messageformat": "Ikusi gakoa berriro" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Azken babeskopia" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Inoiz ez" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Egin babeskopia" }, "icu:Preferences__local-backups-folder": { "messageformat": "Babeskopiak gordetzeko karpeta" @@ -7624,10 +7624,10 @@ "messageformat": "Arazketa-erregistroek aplikazioari buruzko maila baxuko informazioa dute, eta ez dute mezuetako edukirik." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Gurekin partekatutako informazioaren artean, aplikazioaren maila baxuko informazioa dago, eta ez deien edukia." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Informazio diagnostikoa" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Bidali" diff --git a/_locales/fa-IR/messages.json b/_locales/fa-IR/messages.json index 59e7f6d607..0df99706da 100644 --- a/_locales/fa-IR/messages.json +++ b/_locales/fa-IR/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "ادامه" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "سنجاق کردن پیام‌های ناپدیدشونده" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "سنجاق پیام‌های ناپدیدشونده پس از پایان زمان‌سنج آنها برداشته خواهد شد و از گفتگو حذف می‌شوند." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "خوب" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {پیام سنجاق‌شده} other {پیام‌های سنجاق‌شده}}" @@ -6003,13 +6003,13 @@ "messageformat": "مشاهده دوباره کلید" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "آخرین پشتیبان‌گیری" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "هرگز" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "اکنون پشتیبان‌گیری شود" }, "icu:Preferences__local-backups-folder": { "messageformat": "پوشهٔ پشتیبان" @@ -7624,10 +7624,10 @@ "messageformat": "گزارش‌های عیب‌یابی حاوی اطلاعات سطح پایین برنامه هستند و هیچ‌یک از محتواهای پیام شما را افشا نمی‌کنند." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "اطلاعاتی که با ما به اشتراک گذاشته می‌شود شامل داده‌های سطح پایین برنامه است و محتوای تماس‌های شما را دربر نمی‌گیرد." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "اطلاعات عیب‌یابی" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "ارسال" diff --git a/_locales/fi/messages.json b/_locales/fi/messages.json index d997b275d1..475bcf7c78 100644 --- a/_locales/fi/messages.json +++ b/_locales/fi/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Jatka" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Katoavien viestien kiinnittäminen" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Katoavien viestien kiinnitys poistetaan, kun ajastin umpeutuu ja viesti poistetaan keskustelusta." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Selvä" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Kiinnitetty viesti} other {Kiinnitetyt viestit}}" @@ -6003,13 +6003,13 @@ "messageformat": "Näytä avain uudelleen" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Viimeisin varmuuskopio" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "ei koskaan" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Varmuuskopioi nyt" }, "icu:Preferences__local-backups-folder": { "messageformat": "Varmuuskopiokansio" @@ -7624,10 +7624,10 @@ "messageformat": "Vianetsintäloki sisältää matalan tason sovellustietoja eivätkä paljasta viestiesi sisältöä." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Meille jaetut tiedot sisältävät matalan tason sovellustietoja, eivätkä ne sisällä puheluidesi sisältöä." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Diagnostiikkatiedot" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Lähetä" diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index ffd746869e..8337ed8d7d 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Continuer" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Épingler des messages éphémères" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Les messages éphémères sont détachés dès que le compte à rebours est terminé et qu'ils sont supprimés de la conversation." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "OK" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Message épinglé} other {Messages épinglés}}" @@ -6003,13 +6003,13 @@ "messageformat": "Réafficher la clé" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Dernière sauvegarde" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Jamais" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Sauvegarder maintenant" }, "icu:Preferences__local-backups-folder": { "messageformat": "Dossier de sauvegarde" @@ -7624,10 +7624,10 @@ "messageformat": "Les journaux de débogage ne contiennent que des informations techniques relatives à l'application et ne révèlent en aucun cas le contenu de vos messages." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Les journaux de débogage ne contiennent que des informations techniques relatives à l'application et ne révèlent en aucun cas le contenu de vos appels." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Informations de diagnostic" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Envoyer" diff --git a/_locales/ga-IE/messages.json b/_locales/ga-IE/messages.json index 66f40b74af..b7625134a2 100644 --- a/_locales/ga-IE/messages.json +++ b/_locales/ga-IE/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Ar aghaidh" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Greamú teachtaireachtaí sealadacha" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Déanfar teachtaireachtaí sealadacha a dhíghreamú nuair a bheidh a n-amadóir istigh agus nuair a bhainfear an teachtaireacht den chomhrá." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Tá go maith" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Teachtaireacht ghreamaithe} two {Teachtaireachtaí greamaithe} few {Teachtaireachtaí greamaithe} many {Teachtaireachtaí greamaithe} other {Teachtaireachtaí greamaithe}}" @@ -6003,13 +6003,13 @@ "messageformat": "Féach ar an eochair arís" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Cúltaca deiridh" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Choíche" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Déan cúltaca anois" }, "icu:Preferences__local-backups-folder": { "messageformat": "Fillteán cúltaca" @@ -7624,10 +7624,10 @@ "messageformat": "Bíonn faisnéis íseal-leibhéil aipe i logaí dífhabhtaithe agus ní nochtar ábhar aon cheann de do theachtaireachtaí iontu." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Tá faisnéis íseal-leibhéil faoin aip san fhaisnéis a chomhroinntear linn agus ní áirítear léi ábhar do ghlaonna." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Faisnéis dhiagnóiseach" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Seol isteach é" diff --git a/_locales/gl-ES/messages.json b/_locales/gl-ES/messages.json index d649d11914..f1c57c657f 100644 --- a/_locales/gl-ES/messages.json +++ b/_locales/gl-ES/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Continuar" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Fixar mensaxes temporais" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "As mensaxes temporais soltaranse cando remate o seu temporizador e a mensaxe borrarase da conversa." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "De acordo" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Mensaxe fixada} other {Mensaxes fixadas}}" @@ -6003,13 +6003,13 @@ "messageformat": "Ver clave de novo" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Última copia de seguranza" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Nunca" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Facer copia agora" }, "icu:Preferences__local-backups-folder": { "messageformat": "Cartafol da copia" @@ -7624,10 +7624,10 @@ "messageformat": "Os rexistros de depuración conteñen datos internos da aplicación, pero non mostran o contido das mensaxes." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Os datos que recibimos son información básica da aplicación e non recollen o contido das chamadas." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Información de diagnóstico" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Enviar" diff --git a/_locales/gu-IN/messages.json b/_locales/gu-IN/messages.json index bbceacbeaf..54f6fff4c4 100644 --- a/_locales/gu-IN/messages.json +++ b/_locales/gu-IN/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "ચાલુ રાખો" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "ગાયબ થતાં મેસેજને પિન કરવા" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "ગાયબ થતાં મેસેજનું ટાઇમર સમાપ્ત થઈ ગયા પછી તે અનપિન થઈ જશે અને મેસેજ ચેટમાંથી દૂર થઈ જશે." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "બરાબર" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {પિન કરેલો મેસેજ} other {પિન કરેલા મેસેજ}}" @@ -6003,13 +6003,13 @@ "messageformat": "કી ફરીથી જુઓ" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "છેલ્લું બેકઅપ" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "ક્યારેય નહિ" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "હમણાં બેકઅપ લો" }, "icu:Preferences__local-backups-folder": { "messageformat": "બેકઅપ ફોલ્ડર" @@ -7624,10 +7624,10 @@ "messageformat": "ડીબગ લૉગમાં ઓછા સ્તરની ઍપ માહિતી હોય છે અને તે તમારા મેસેજનું કોઈ પણ કન્ટેન્ટ જાહેર કરતું નથી." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "અમારી સાથે શેર કરવામાં આવેલી માહિતીમાં નીચલા સ્તરની ઍપ માહિતી શામેલ છે અને તેમાં તમારા કૉલનું કન્ટેન્ટ શામેલ નથી." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "ડાયગ્નોસ્ટિક માહિતી" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "સબમિટ કરો" diff --git a/_locales/he/messages.json b/_locales/he/messages.json index ecaccda948..45f2e0f956 100644 --- a/_locales/he/messages.json +++ b/_locales/he/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "המשך" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "הצמדת הודעות נעלמות" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "ההצמדה של הודעות נעלמות תבוטל כשהטיימר שלהן יסתיים וההודעה תימחק מהצ'אט." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "בסדר" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {הודעה מוצמדת} two {הודעות מוצמדות} many {הודעות מוצמדות} other {הודעות מוצמדות}}" @@ -6003,13 +6003,13 @@ "messageformat": "צפייה חוזרת במפתח" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "גיבוי אחרון" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "אף פעם" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "לגבות כעת" }, "icu:Preferences__local-backups-folder": { "messageformat": "תיקיית גיבוי" @@ -7624,10 +7624,10 @@ "messageformat": "יומני ניפוי באגים מכילים מידע בסיסי מהאפליקציה ולא חושפים את תוכן ההודעות שלך." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "המידע שמשותף איתנו מכיל מידע טכני בסיסי על האפליקציה ואינו כולל את תוכן השיחות שלך." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "מידע אבחוני" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "שלח" diff --git a/_locales/hi-IN/messages.json b/_locales/hi-IN/messages.json index 19432b0ae8..2f1e2a9f93 100644 --- a/_locales/hi-IN/messages.json +++ b/_locales/hi-IN/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "जारी रखें" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "गायब होने वाले मैसेज पिन करना" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "टाइमर पूरा होने पर गायब होने वाले मैसेज अनपिन हो जाएंगे और मैसेज चैट से हट जाएगा।" }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "ठीक है" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {पिन किया गया मैसेज} other {पिन किए गए मैसेज}}" @@ -6003,13 +6003,13 @@ "messageformat": "फिर से की देखें" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "पिछला बैकअप" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "कभी नहीं" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "अभी बैकअप लें।" }, "icu:Preferences__local-backups-folder": { "messageformat": "बैकअप फ़ोल्डर" @@ -7624,10 +7624,10 @@ "messageformat": "डीबग लॉग में ऐप की थोड़ी-बहुत तकनीकी जानकारी शामिल होती है, लेकिन इनसे आपके मैसेज के कॉन्टेंट का पता नहीं चलता।" }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "हमारे साथ ऐप से जुड़ी सिर्फ़ सामान्य जानकारी शेयर की जाती है। इसमें कॉल पर होने वाली आपकी बातचीत या निजी डेटा शामिल नहीं होता है।" }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "समस्या से जुड़ी जानकारी" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "सबमिट करें" diff --git a/_locales/hr-HR/messages.json b/_locales/hr-HR/messages.json index 999cb46259..f27760c70f 100644 --- a/_locales/hr-HR/messages.json +++ b/_locales/hr-HR/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Nastavi" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Prikvačivanje poruka koje nestaju" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Poruke koje nestaju bit će otkvačene kada im istekne vrijeme i nestanu iz razgovora." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "U redu" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Prikvačena poruka} few {Prikvačene poruke} many {Prikvačenih poruka} other {Prikvačene poruke}}" @@ -6003,13 +6003,13 @@ "messageformat": "Ponovno prikaži ključ" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Posljednje sigurnosno kopiranje" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Nikada" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Sigurnosno kopiraj sada" }, "icu:Preferences__local-backups-folder": { "messageformat": "Mapa sigurnosne kopije" @@ -7624,10 +7624,10 @@ "messageformat": "Zapisnici otklanjanja pogrešaka sadrže informacije o aplikaciji niske razine i ne otkrivaju sadržaj vaših poruka." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Informacije koje se dijele s nama sadrže informacije niske razine o aplikacijama i ne uključuju sadržaj vaših poziva." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Dijagnostičke informacije" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Pošalji" diff --git a/_locales/hu/messages.json b/_locales/hu/messages.json index ac6ba8e2d8..d22930491a 100644 --- a/_locales/hu/messages.json +++ b/_locales/hu/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Folytatás" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Eltűnő üzenetek rögzítése" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Az eltűnő üzenetek rögzítése akkor lesz feloldva, amikor az időzítőjük lejár, és az üzenet eltávolításra kerül a csevegésből." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "OK" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Rögzített üzenetek} other {Rögzített üzenetek}}" @@ -5628,22 +5628,22 @@ "messageformat": "A csevegési előzményeid nem exportálhatók, mert a Signal nem rendelkezik engedéllyel fájlok lemezre írásához. Próbáld meg módosítani a lemezed engedélyeit vagy frissíteni a rendszerbeállításaidat, majd exportáld újra." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Biztonsági mentés exportálása" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "A biztonsági mentés exportálása befejeződött" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "A biztonsági mentés visszaállításához:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Helyezd át a biztonsági mentések mappáját a telefon tárhelyére" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Telepíts egy új példányt a Signal alkalmazásból a telefonodra" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Koppints a „Visszaállítás vagy átvitel” lehetőségre, és válaszd a „Biztonsági mentés az eszközön” lehetőséget." }, "icu:NotificationProfile--moon-icon": { "messageformat": "Hold ikon" @@ -6003,13 +6003,13 @@ "messageformat": "Kulcs újbóli megtekintése" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Utolsó biztonsági mentés" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Soha" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Biztonsági mentés készítése" }, "icu:Preferences__local-backups-folder": { "messageformat": "Biztonsági mentés mappája" @@ -7612,7 +7612,7 @@ "messageformat": "Ez segít többet megtudni a hívásokról, és arról, hogy mi működik és mi nem. Beküldés előtt megtekintheted a hibanaplót." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "A beküldéssel megosztod a visszajelzésedet a hívással kapcsolatos diagnosztikai információkkal együtt. Opcionálisan megoszthatsz egy hibanaplót, amely segít nekünk a hívásminőség javításában." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Hibanapló megosztása" @@ -7624,10 +7624,10 @@ "messageformat": "A hibanaplók alacsony szintű alkalmazásinformációkat tartalmaznak, és nem fedik fel az üzenetek tartalmát." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "A velünk megosztott információk alacsony szintű alkalmazásinformációkat tartalmaznak, és nem szerepel bennük a hívásaid tartalma." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Diagnosztikai információk" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Küldés" @@ -7645,7 +7645,7 @@ "messageformat": "Köszönjük a visszajelzésedet!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Az oldalsáv kibontása a megafonnal való interakcióhoz" }, "icu:WhatsNew__bugfixes": { "messageformat": "Ebbe a verzióba néhány kisebb újítás és hibajavítás került annak érdekében, hogy a Signal továbbra is gond nélkül fusson.", @@ -7679,6 +7679,6 @@ "messageformat": "Kijavítottunk egy kisebb megjelenítési hibát a felemelt kéz jelzőjével kapcsolatban a csoportos hívásokban." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "A rögzített üzenetek segítségével a fontos információk könnyen elérhetők maradhatnak a csevegés témái között. A leggyakrabban feltett kérdések, a vacsorafoglalások és a nyaralási útiterv már a fejedben vannak. Most már ezek lehetnek a csevegések témái is." } } diff --git a/_locales/id/messages.json b/_locales/id/messages.json index 0ea43cb298..28925d30df 100644 --- a/_locales/id/messages.json +++ b/_locales/id/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Lanjutkan" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Menyematkan pesan terhapus otomatis" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Pesan terhapus otomatis akan dilepas sematannya saat sudah melewati waktu timer dan pesan dihapus dari chat." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Oke" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {Pesan disematkan}}" @@ -6003,13 +6003,13 @@ "messageformat": "Lihat kunci lagi" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Pencadangan terakhir" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Tidak pernah" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Cadangkan sekarang" }, "icu:Preferences__local-backups-folder": { "messageformat": "Folder cadangan" @@ -7624,10 +7624,10 @@ "messageformat": "Catatan debug berisi informasi aplikasi tingkat rendah dan tidak mengungkapkan isi pesan Anda." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Informasi yang dibagikan kepada kami berisi informasi aplikasi tingkat rendah dan tidak mencakup isi panggilan Anda." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Informasi diagnostik" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Kirim" diff --git a/_locales/it/messages.json b/_locales/it/messages.json index fefcb589cd..8ccaaed4a4 100644 --- a/_locales/it/messages.json +++ b/_locales/it/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Continua" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Mettere in evidenza i messaggi temporanei" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "I messaggi temporanei non saranno più in evidenza quando il timer scadrà e verranno quindi rimossi dalla chat." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Ok" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Messaggio in evidenza} other {Messaggi in evidenza}}" @@ -6003,13 +6003,13 @@ "messageformat": "Mostra di nuovo la chiave" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Ultimo backup" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Mai" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Fai ora il backup" }, "icu:Preferences__local-backups-folder": { "messageformat": "Cartella dei backup" @@ -7624,10 +7624,10 @@ "messageformat": "I log di debug contengono informazioni di basso profilo sull'app e non rivelano in alcun modo il contenuto dei tuoi messaggi." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Le informazioni condivise con noi contengono dati di basso livello sull'app e non includono il contenuto delle tue chiamate." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Informazioni diagnostiche" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Invia" diff --git a/_locales/ja/messages.json b/_locales/ja/messages.json index a9e7deeda2..97b52c9cd5 100644 --- a/_locales/ja/messages.json +++ b/_locales/ja/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "続ける" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "消えるメッセージをピン留めする" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "消えるメッセージは、期間が過ぎてチャットから消えた時にピン留めも解除されます。" }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "OK" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {ピン留めされたメッセージ}}" @@ -6003,13 +6003,13 @@ "messageformat": "キーをもう一度見る" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "最終バックアップ" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "なし" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "いますぐバックアップする" }, "icu:Preferences__local-backups-folder": { "messageformat": "バックアップフォルダ" @@ -7624,10 +7624,10 @@ "messageformat": "デバッグログには最低限のアプリ情報のみが含まれ、メッセージ内容は一切明らかにされません。" }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "私たちと共有されるのは最低限のアプリ情報であり、通話内容は含まれません。" }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "診断情報" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "送信する" diff --git a/_locales/ka-GE/messages.json b/_locales/ka-GE/messages.json index c5ee2810b8..568ab38e18 100644 --- a/_locales/ka-GE/messages.json +++ b/_locales/ka-GE/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "გაგრძელება" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "გაქრობადი წერილების აპინვა" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "გაქრობადი წერილების პინი მაშინ მოიხსნება, როცა ტაიმერის დრო ამოიწურება და წერილი ჩატიდან წაიშლება" }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "კარგი" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {აპინული წერილები} other {აპინული წერილები}}" @@ -6003,13 +6003,13 @@ "messageformat": "გასაღების თავიდან ნახვა" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "ბოლოს შექმნილი სარეზერვო კოპია" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "არასდროს" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "სარეზერვო კოპიის ახლავე შექმნა" }, "icu:Preferences__local-backups-folder": { "messageformat": "სარეზერვო კოპიების შენახვის ადგილი" @@ -7624,10 +7624,10 @@ "messageformat": "გაუმართაობის რეესტრი აპის ქვედა დონის ინფორმაციას შეიცავს და შენი არც ერთი წერილის შინაარს არ ავლენს." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "ჩვენთან გაზიარებული ინფორმაცია აპის ტექნიკურ ინფორმაციას მოიცავს და არა შენი ზარების შინაარსს." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "დიაგნოსტიკური ინფორმაცია" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "დადასტურება" diff --git a/_locales/kk-KZ/messages.json b/_locales/kk-KZ/messages.json index 226a75ddf9..5efd882b27 100644 --- a/_locales/kk-KZ/messages.json +++ b/_locales/kk-KZ/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Жалғастыру" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Жойылатын хабарларды бекіту" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Жойылатын хабарлар таймер уақыты аяқталғанда босатылып, чаттан жойылады." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Жарайды" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Бекітілген хабар} other {Бекітілген хабарлар}}" @@ -6003,13 +6003,13 @@ "messageformat": "Кілтті қайта көру" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Соңғы резервтік көшірме" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Ешқашан" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Қазір сақтық көшірме жасау" }, "icu:Preferences__local-backups-folder": { "messageformat": "Резервтік қалта" @@ -7624,10 +7624,10 @@ "messageformat": "Ақауларды түзету журналында төмен деңгейлі қолданба туралы ақпарат болады. Хабардағы контентті ешкімге көрсетпеңіз." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Бізбен бөліскен ақпарат төмен деңгейлі қолданба туралы ақпаратты қамтиды және онда қоңырауларыңыздың контенті болмайды." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Диагностика туралы ақпарат" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Жіберу" diff --git a/_locales/km-KH/messages.json b/_locales/km-KH/messages.json index e290c5d78d..230499c152 100644 --- a/_locales/km-KH/messages.json +++ b/_locales/km-KH/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "បន្ត" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "ខ្ទាស់សារដែលបាត់ដោយស្វ័យប្រវត្តិ" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "សារដែលបាត់ដោយស្វ័យប្រវត្តិនឹងឈប់ខ្ទាស់ នៅពេលមុខងារកំណត់ម៉ោងរបស់វាផុតកំណត់ ហើយសារត្រូវបានដកចេញពីការជជែក។" }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "យល់ព្រម" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {សារដែលបានខ្ទាស់}}" @@ -6003,13 +6003,13 @@ "messageformat": "មើលសោម្តងទៀត" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "ការបម្រុងទុកចុងក្រោយ" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "មិនធ្លាប់" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "បម្រុងទុកឥឡូវនេះ" }, "icu:Preferences__local-backups-folder": { "messageformat": "ថតឯកសារបម្រុងទុក" @@ -7624,10 +7624,10 @@ "messageformat": "កំណត់ត្រាបញ្ហាមានព័ត៌មានកម្មវិធីកម្រិតទាប ហើយមិនបង្ហាញខ្លឹមសារនៃសារណាមួយរបស់អ្នកទេ។" }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "ព័ត៌មានដែលបានចែករំលែកជាមួយយើងមានព័ត៌មានកម្មវិធីកម្រិតទាប ហើយមិនរាប់បញ្ចូលខ្លឹមសារនៃការហៅទូរសព្ទរបស់អ្នកទេ។" }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "ព័ត៌មានវិនិច្ឆ័យ" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "ដាក់បញ្ជូន" diff --git a/_locales/kn-IN/messages.json b/_locales/kn-IN/messages.json index f4a563b8e6..b3ba691803 100644 --- a/_locales/kn-IN/messages.json +++ b/_locales/kn-IN/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "ಮುಂದುವರಿಸಿ" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "ಮಾಯವಾಗುವ ಸಂದೇಶಗಳನ್ನು ಪಿನ್ ಮಾಡುವುದು" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "ಮಾಯವಾಗುವ ಸಂದೇಶಗಳ ಟೈಮರ್ ಅವಧಿ ಮುಗಿದಾಗ ಮತ್ತು ಮೆಸೇಜ್ ಅನ್ನು ಚಾಟ್‌ನಿಂದ ತೆಗೆದುಹಾಕಿದಾಗ ಅವುಗಳನ್ನು ಅನ್‌ಪಿನ್ ಮಾಡಲಾಗುತ್ತದೆ." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "ಸರಿ" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {ಪಿನ್ ಮಾಡಲಾದ ಮೆಸೇಜ್} other {ಪಿನ್ ಮಾಡಲಾದ ಮೆಸೇಜ್‌ಗಳು}}" @@ -6003,13 +6003,13 @@ "messageformat": "ಕೀಯನ್ನು ಮತ್ತೊಮ್ಮೆ ನೋಡಿ" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "ಕೊನೆಯ ಬ್ಯಾಕಪ್" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "ಎಂದಿಗೂ ಇಲ್ಲ" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "ಈಗ ಬ್ಯಾಕಪ್‌‌ ಮಾಡಿ" }, "icu:Preferences__local-backups-folder": { "messageformat": "ಬ್ಯಾಕಪ್‌ ಫೋಲ್ಡರ್‌" @@ -7624,10 +7624,10 @@ "messageformat": "ಡೀಬಗ್ ಲಾಗ್‌ಗಳು ಕಡಿಮೆ ಪ್ರಮಾಣದ ಆ್ಯಪ್ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಿರುತ್ತವೆ ಮತ್ತು ನಿಮ್ಮ ಯಾವುದೇ ಮೆಸೇಜ್ ಕಂಟೆಂಟ್‌ಗಳನ್ನು ಬಹಿರಂಗಪಡಿಸುವುದಿಲ್ಲ." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "ನಮ್ಮೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಲಾದ ಮಾಹಿತಿಯು ಕೆಳಹಂತದ ಆ್ಯಪ್ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಿದೆ ಮತ್ತು ನಿಮ್ಮ ಕರೆಗಳ ವಿಷಯಗಳನ್ನು ಒಳಗೊಂಡಿಲ್ಲ." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "ಡಯಾಗ್ನಾಸ್ಟಿಕ್ ಮಾಹಿತಿ" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "ಸಲ್ಲಿಸಿ" diff --git a/_locales/ko/messages.json b/_locales/ko/messages.json index 7152fd2c6a..43468d4058 100644 --- a/_locales/ko/messages.json +++ b/_locales/ko/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "계속" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "자동 삭제 메시지 고정" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "자동 삭제 메시지는 타이머가 만료되고 채팅에서 메시지가 제거되면 고정이 해제됩니다." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "확인" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {고정 메시지}}" @@ -1353,7 +1353,7 @@ "messageformat": "자세히 알아보기" }, "icu:DeliveryIssue--title": { - "messageformat": "전달 문제" + "messageformat": "전송 문제" }, "icu:DeliveryIssue--summary": { "messageformat": "{sender} 님이 보낸 메시지, 스티커, 반응, 수신 확인 또는 미디어가 전달되지 못했습니다. 나에게 직접 보내거나 그룹 대화에서 보내려 했던 것으로 보여요." @@ -3210,13 +3210,13 @@ "messageformat": "확인" }, "icu:MessageRequests--message-direct": { - "messageformat": "{name} 님이 내게 메시지를 보내고 이름과 사진을 공유할 수 있도록 하시겠습니까? 수락할 때까지 메시지를 봤는지 알 수 없습니다." + "messageformat": "{name} 님이 나에게 메시지를 보내고, 내 이름과 사진을 공유하도록 허용할까요? 내가 수락하기 전까지는 상대방이 내가 메시지를 확인했는지 알 수 없어요." }, "icu:MessageRequests--message-direct-hidden": { - "messageformat": "{name} 님이 내게 메시지를 보내도록 허용하고, 내 이름과 사진을 공유할까요? 이 사용자는 귀하가 이전에 제거한 사용자입니다." + "messageformat": "{name} 님이 나에게 메시지를 보내고, 내 이름과 사진을 공유하도록 허용할까요? 이 사용자는 내가 이전에 삭제했던 사용자입니다." }, "icu:MessageRequests--message-direct-blocked": { - "messageformat": "{name} 님이 내게 메시지를 보내고 내 이름과 사진을 공유할 수 있도록 허용할까요? 차단을 해제할 때까지 모든 메시지를 받지 않습니다." + "messageformat": "{name} 님이 나에게 메시지를 보내고, 내 이름과 사진을 공유할 수 있도록 허용할까요? 차단을 해제하기 전까지는 메시지가 전달되지 않습니다." }, "icu:MessageRequests--message-group": { "messageformat": "이 그룹에 참가하고 내 이름과 사진을 멤버와 공유하시겠습니까? 수락하기 전까지 상대방은 내가 메시지를 봤는지 알 수 없습니다." @@ -5352,7 +5352,7 @@ "messageformat": "성(선택 사항)" }, "icu:ConfirmDiscardDialog--discard": { - "messageformat": "변경사항을 파기하시겠습니까?" + "messageformat": "변경 사항을 저장하지 말고 삭제할까요?" }, "icu:ConfirmationDialog__Title--in-call-close-requested": { "messageformat": "Signal을 닫고 이 통화를 종료할까요?" @@ -6003,13 +6003,13 @@ "messageformat": "키 다시 보기" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "마지막 백업" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "없음" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "지금 백업" }, "icu:Preferences__local-backups-folder": { "messageformat": "백업 폴더" @@ -7624,10 +7624,10 @@ "messageformat": "디버그 로그에는 낮은 수준의 앱 정보가 포함되어 있으며, 메시지 내용은 공개되지 않습니다." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Signal에 공유되는 정보는 앱의 기본적인 사용 정보에 한하며, 통화 내용은 수집되지 않습니다." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "진단 정보" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "제출" diff --git a/_locales/ky-KG/messages.json b/_locales/ky-KG/messages.json index 27dfe773a7..93f8500db4 100644 --- a/_locales/ky-KG/messages.json +++ b/_locales/ky-KG/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Улантуу" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Жоголуп кетүүчү билдирүүлөрдү кадоо" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Жоголуп кетүүчү билдирүүлөр таймер бүткөндөн кийин бошотулуп, маектен өчүрүлөт." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Макул" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {Кадалган билдирүүлөр}}" @@ -6003,13 +6003,13 @@ "messageformat": "Ачкычты кайра көрүү" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Акыркы жолу качан сакталган" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Кайталанбайт" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Көчүрмөлөрдү азыр сактоо" }, "icu:Preferences__local-backups-folder": { "messageformat": "Камдык көчүрмөлөрдүн папкасы" @@ -7624,10 +7624,10 @@ "messageformat": "Мүчүлүштүктөр журналында төмөнкү деңгээлдеги колдонмолор тууралуу маалымат камтылып, билдирүүлөрүңүздөгү нерселерди ачыктабаңыз." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Биз менен бөлүшкөн маалыматта төмөнкү деңгээлдеги колдонмонун дайын-дареги камтылып, чалууларыңыздын мазмуну көрүнбөйт." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Мүчүлүштүктөрдү аныктоо" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Тапшыруу" diff --git a/_locales/lt-LT/messages.json b/_locales/lt-LT/messages.json index 90053b7621..13ee916543 100644 --- a/_locales/lt-LT/messages.json +++ b/_locales/lt-LT/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Tęsti" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Prisegamos dingstančios žinutės" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Dingstančios žinutės bus atsegtos, kai baigsis joms skirtas laikas – tada žinutė bus pašalinta iš pokalbio." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Gerai" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Prisegta žinutė} few {Prisegtos žinutės} many {Prisegtos žinutės} other {Prisegtų žinučių}}" @@ -6003,13 +6003,13 @@ "messageformat": "Rodyti raktą dar kartą" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Paskutinė atsarginė kopija" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Niekada" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Daryti atsarginę kopiją dabar" }, "icu:Preferences__local-backups-folder": { "messageformat": "Atsarginių kopijų aplankas" @@ -7624,10 +7624,10 @@ "messageformat": "Derinimo žurnaluose pateikiama žemojo lygmens informacija apie programėlę ir neatskleidžiamas joks jūsų žinučių turinys." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Su mumis bendrinama informacija apima žemojo lygmens informaciją apie programėlę ir į ją neįeina jūsų skambučių turinys." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Diagnostinė informacija" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Pateikti" diff --git a/_locales/lv-LV/messages.json b/_locales/lv-LV/messages.json index e80f8c01dc..de7f708ecc 100644 --- a/_locales/lv-LV/messages.json +++ b/_locales/lv-LV/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Turpināt" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Gaistošo ziņu atspraušana" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Gaistošās ziņas tiks atspraustas, kad beigsies to taimeris un ziņa tiks noņemta no sarunas." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Labi" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, zero {Piespraustās ziņas} one {Piespraustās ziņas} other {Piespraustās ziņas}}" @@ -6003,13 +6003,13 @@ "messageformat": "Skatīt atslēgu vēlreiz" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Pēdējās rezerves kopijas izveide" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Nekad" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Dublēt tūlīt" }, "icu:Preferences__local-backups-folder": { "messageformat": "Rezerves kopiju mape" @@ -7624,10 +7624,10 @@ "messageformat": "Atkļūdošanas žurnāli satur tikai tehnisku informāciju par lietotni un neatklāj jūsu ziņu saturu." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Ar mums kopīgotā informācija ietver tikai tehnisku informāciju par lietotni un neietver jūsu zvanu saturu." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Diagnostikas informācija" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Iesniegt" diff --git a/_locales/mk-MK/messages.json b/_locales/mk-MK/messages.json index 64c4bbadef..ced4061008 100644 --- a/_locales/mk-MK/messages.json +++ b/_locales/mk-MK/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Продолжи" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Закачување на исчезнувачки пораки" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Исчезнувачките пораки ќе бидат откачени кога нивниот тајмер ќе истече и пораката ќе се отстрани од разговорот." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Во ред" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Закачена порака} other {Закачени пораки}}" @@ -6003,13 +6003,13 @@ "messageformat": "Повторно видете го клучот" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Последна резервна копија" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Никогаш" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Направи резервна копија сега" }, "icu:Preferences__local-backups-folder": { "messageformat": "Папка за резервна копија" @@ -7624,10 +7624,10 @@ "messageformat": "Записите за дебагирање содржат информации за апликацијата од ниско ниво и не откриваат никаква содржина на вашите пораки." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Информациите споделени со нас содржат информации за апликацијата од ниско ниво и не ја вклучуваат содржината на вашите повици." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Дијагностички информации" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Испрати" diff --git a/_locales/ml-IN/messages.json b/_locales/ml-IN/messages.json index a8a4e2ccbb..1b59bb027e 100644 --- a/_locales/ml-IN/messages.json +++ b/_locales/ml-IN/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "തുടരുക" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "അപ്രത്യക്ഷമാകുന്ന സന്ദേശങ്ങൾ പിൻ ചെയ്യുന്നു" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "അപ്രത്യക്ഷമാകുന്ന സന്ദേശങ്ങളുടെ ടൈമർ കാലഹരണപ്പെടുകയും ചാറ്റിൽ നിന്ന് സന്ദേശം നീക്കം ചെയ്യുകയും ചെയ്യുമ്പോൾ അവ അൺപിൻ ചെയ്യപ്പെടും." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "ശരി" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {പിൻ ചെയ്ത സന്ദേശം} other {പിൻ ചെയ്ത സന്ദേശങ്ങൾ}}" @@ -6003,13 +6003,13 @@ "messageformat": "കീ വീണ്ടും കാണുക" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "അവസാന ബാക്കപ്പ്" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "ഒരിക്കലും വേണ്ട" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "ഇപ്പോൾ ബാക്കപ്പ് ചെയ്യുക" }, "icu:Preferences__local-backups-folder": { "messageformat": "ബാക്കപ്പ് ഫോൾഡർ" @@ -7624,10 +7624,10 @@ "messageformat": "ഡീബഗ് ലോഗുകളിൽ താഴ്ന്ന നിലയിലുള്ള ആപ്പ് വിവരങ്ങൾ അടങ്ങിയിരിക്കുന്നു, നിങ്ങളുടെ സന്ദേശ ഉള്ളടക്കങ്ങളൊന്നും അവ വെളിപ്പെടുത്തുന്നില്ല." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "ഞങ്ങളുമായി പങ്കിട്ട വിവരങ്ങളിൽ താഴ്ന്ന നിലയിലുള്ള ആപ്പ് വിവരങ്ങൾ അടങ്ങിയിരിക്കുന്നു, നിങ്ങളുടെ കോളുകളുടെ ഉള്ളടക്കങ്ങൾ അതിൽ ഉൾപ്പെടുന്നില്ല." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "പ്രശ്നനിർണ്ണയ വിവരങ്ങൾ" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "സമർപ്പിക്കുക" diff --git a/_locales/mr-IN/messages.json b/_locales/mr-IN/messages.json index d35e8c263e..86cf749711 100644 --- a/_locales/mr-IN/messages.json +++ b/_locales/mr-IN/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "सुरू ठेवा" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "लुप्त होणारे संदेश पिन करत आहे" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "लुप्त होणारे संदेश त्यांचा टायमर संपल्यावर अनपिन केले जातील आणि तो संदेश चॅटमधून हटवला जाईल." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "ठीक आहे" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {पिन केलेला संदेश} other {पिन केलेले संदेश}}" @@ -6003,13 +6003,13 @@ "messageformat": "की पुन्हा पहा" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "शेवटचा बॅकअप" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "कधीही नाही" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "आता बॅकअप करा" }, "icu:Preferences__local-backups-folder": { "messageformat": "बॅकअप फोल्डर" @@ -7624,10 +7624,10 @@ "messageformat": "डीबग लॉग्समध्ये ॲपची अल्प प्रमाणात माहिती असते आणि त्यांमधून तुमच्या संदेशांमधील कोणताही मजकूर उघड होत नाही." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "आम्हाला मिळणारी माहिती अगदी कमी पातळीवरची ॲपची माहिती असते आणि तिच्यामध्ये तुमच्या कॉल्समधील संवादाचा समावेश नसतो." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "निदानात्मक माहिती" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "प्रविष्ट करा" diff --git a/_locales/ms/messages.json b/_locales/ms/messages.json index 998977abc7..d8fdabbae8 100644 --- a/_locales/ms/messages.json +++ b/_locales/ms/messages.json @@ -1239,10 +1239,10 @@ "messageformat": "Teruskan" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Mengepin mesej menghilang" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Mesej menghilang akan dinyahpin apabila pemasa tamat tempoh dan mesej dialih keluar daripada sembang." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { "messageformat": "Okay" @@ -6003,13 +6003,13 @@ "messageformat": "Lihat kunci lagi" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Sandaran terakhir" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Tidak pernah" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Sandaran Sekarang" }, "icu:Preferences__local-backups-folder": { "messageformat": "Folder backup" @@ -7624,10 +7624,10 @@ "messageformat": "Log nyahpepijat mengandungi maklumat aplikasi tahap rendah dan tidak mendedahkan sebarang kandungan mesej anda." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Maklumat yang dikongsi dengan kami mengandungi maklumat aplikasi peringkat rendah dan tidak termasuk kandungan panggilan anda." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Maklumat diagnostik" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Hantar" diff --git a/_locales/my/messages.json b/_locales/my/messages.json index e5b4f58c67..8c427d8c58 100644 --- a/_locales/my/messages.json +++ b/_locales/my/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "ဆက်လုပ်ရန်" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "ပျောက်သွားမည့် မက်ဆေ့ချ်များကို ပင်တွဲခြင်း" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "ပျောက်သွားမည့် မက်ဆေ့ချ်များကို ၎င်းတို့၏တိုင်မာ သက်တမ်းကုန်ဆုံးချိန်တွင် ပင်ဖြုတ်လိုက်မည်ဖြစ်ပြီး မက်ဆေ့ချ်ကို ချက်(တ်)မှ ဖယ်ရှားလိုက်ပါမည်။" }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "အိုကေ" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {ပင်တွဲထားသော မက်ဆေ့ချ်များ}}" @@ -6003,13 +6003,13 @@ "messageformat": "ကီး ကိုပြန်ကြည့်ရန်" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "နောက်ဆုံး ဘက်ခ်အပ်" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "ဘယ်တော့မှ" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "ဘက်ခ်အပ် အခုလုပ်မည်" }, "icu:Preferences__local-backups-folder": { "messageformat": "ဘက်ခ်အပ် ဖိုင်တွဲ" @@ -7624,10 +7624,10 @@ "messageformat": "ပြစ်ချက်ရှာဖွေပြုပြင်မှု မှတ်တမ်းများတွင် အဆင့်နိမ့် အက်ပ်အချက်အလက်များ ပါဝင်ပြီး သင်၏မက်ဆေ့ချ်တွင် ပါရှိသော မည်သည့်အကြောင်းအရာကိုမျှ ထုတ်ဖော်ခြင်းမပြုပါ။" }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "ကျွန်ုပ်တို့နှင့်မျှဝေထားသော အရာများတွင် သာမန်အက်ပ်အချက်အလက်များသာပါဝင်ပြီး သင့်ဖုန်းခေါ်ဆိုမှုများ၏ အကြောင်းအရာများ မပါဝင်ပါ။" }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "ချွတ်ယွင်းချက်ဆိုင်ရာ အချက်အလက်" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "တင်မည်" diff --git a/_locales/nb/messages.json b/_locales/nb/messages.json index e14d1a8296..3dd94f9313 100644 --- a/_locales/nb/messages.json +++ b/_locales/nb/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Fortsett" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Festing av tidsbegrensede meldinger" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Tidsbegrensede meldinger løsnes automatisk når de utløper, og forsvinner fra samtalen." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Greit" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Festet melding} other {Festede meldinger}}" @@ -6003,13 +6003,13 @@ "messageformat": "Se koden igjen" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Siste sikkerhetskopi" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Aldri" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Sikkerhetskopier nå" }, "icu:Preferences__local-backups-folder": { "messageformat": "Mappe for sikkerhetskopi" @@ -7624,10 +7624,10 @@ "messageformat": "Feilsøkingslogger består av enkle opplysninger fra appen og viser ikke innholdet i meldingene dine." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Opplysningene som deles med oss, består av enkle opplysninger fra appen og viser ikke innholdet i samtalene dine." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Diagnostisk informasjon" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Send" diff --git a/_locales/nl/messages.json b/_locales/nl/messages.json index d6c574d36e..b298e55b82 100644 --- a/_locales/nl/messages.json +++ b/_locales/nl/messages.json @@ -642,7 +642,7 @@ "messageformat": "Failed to send message with endorsements" }, "icu:Toast--SQLError": { - "messageformat": "Databasefout: deel je logs." + "messageformat": "Databasefout: deel alsjeblieft je logs." }, "icu:Toast--InvalidStorageServiceHeaders": { "messageformat": "Ongeldige reactie van de opslagservice ontvangen. Deel alsjeblieft je logs." @@ -1239,13 +1239,13 @@ "messageformat": "Doorgaan" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Verdwijnende berichten vastzetten" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Verdwijnende berichten worden losgemaakt zodra hun timer afloopt en het bericht uit de chat wordt verwijderd." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Oké" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Vastgezet bericht} other {Vastgezette berichten}}" @@ -6003,13 +6003,13 @@ "messageformat": "Sleutel opnieuw weergeven" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Laatste back-up" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Nooit" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Nu back-up maken" }, "icu:Preferences__local-backups-folder": { "messageformat": "Back-uplocatie" @@ -7624,10 +7624,10 @@ "messageformat": "Foutopsporingslogs bevatten app-informatie op laag niveau en geven geen informatie over de inhoud van je berichten." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "De gegevens die je met ons deelt, bevatten app-informatie op laag niveau en geven geen informatie over de inhoud van je oproepen." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Diagnostische informatie" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Uploaden" diff --git a/_locales/pa-IN/messages.json b/_locales/pa-IN/messages.json index b6c8e2eff6..ff793a80d4 100644 --- a/_locales/pa-IN/messages.json +++ b/_locales/pa-IN/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "ਜਾਰੀ ਰੱਖੋ" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "ਗਾਇਬ ਹੋਣ ਵਾਲੇ ਸੁਨੇਹੇ ਪਿੰਨ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "ਗਾਇਬ ਹੋਣ ਵਾਲੇ ਸੁਨੇਹਿਆਂ ਦਾ ਟਾਈਮਰ ਸਮਾਪਤ ਹੋਣ 'ਤੇ ਉਹਨਾਂ ਨੂੰ ਅਨਪਿੰਨ ਕਰ ਦਿੱਤਾ ਜਾਵੇਗਾ ਅਤੇ ਸੁਨੇਹੇ ਨੂੰ ਚੈਟ ਵਿੱਚੋਂ ਹਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।" }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "ਠੀਕ ਹੈ" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {ਪਿੰਨ ਕੀਤਾ ਸੁਨੇਹਾ} other {ਪਿੰਨ ਕੀਤੇ ਸੁਨੇਹੇ}}" @@ -6003,13 +6003,13 @@ "messageformat": "ਕੁੰਜੀ ਨੂੰ ਦੁਬਾਰਾ ਦੇਖੋ" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "ਆਖਰੀ ਬੈਕਅੱਪ" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "ਕਦੇ ਨਹੀਂ" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "ਹੁਣ ਬੈਕਅੱਪ ਲਓ" }, "icu:Preferences__local-backups-folder": { "messageformat": "ਬੈਕਅੱਪ ਫੋਲਡਰ" @@ -7624,10 +7624,10 @@ "messageformat": "ਡੀਬੱਗ ਲੌਗ ਵਿੱਚ ਘੱਟ ਪੱਧਰ ਦੀ ਐਪ ਜਾਣਕਾਰੀ ਮੌਜੂਦ ਹੁੰਦੀ ਹੈ ਅਤੇ ਤੁਹਾਡੇ ਸੁਨੇਹੇ ਦੀ ਕਿਸੇ ਵੀ ਸਮੱਗਰੀ ਦਾ ਖੁਲਾਸਾ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।" }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "ਸਾਡੇ ਨਾਲ ਸਾਂਝੀ ਕੀਤੀ ਗਈ ਜਾਣਕਾਰੀ ਵਿੱਚ ਹੇਠਲੇ ਪੱਧਰ ਦੀ ਐਪ ਜਾਣਕਾਰੀ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ ਅਤੇ ਇਸ ਵਿੱਚ ਤੁਹਾਡੀਆਂ ਕਾਲਾਂ ਬਾਰੇ ਜਾਣਕਾਰੀ ਸ਼ਾਮਲ ਨਹੀਂ ਹੁੰਦੀ ਹੈ।" }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "ਡਾਇਗਨੌਸਟਿਕਸ ਜਾਣਕਾਰੀ" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "ਦਰਜ ਕਰੋ" diff --git a/_locales/pl/messages.json b/_locales/pl/messages.json index 5a325e942e..667c82122a 100644 --- a/_locales/pl/messages.json +++ b/_locales/pl/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Kontynuuj" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Przypinanie znikających wiadomości" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Gdy upłynie czas wyświetlania znikającej wiadomości, zostanie ona odpięta i usunięta z czatu." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "OK" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Przypięta wiadomość} few {Przypięte wiadomości} many {Przypięte wiadomości} other {Przypięte wiadomości}}" @@ -6003,13 +6003,13 @@ "messageformat": "Wyświetl kod ponownie" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Ostatnia kopia zapasowa" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Nigdy" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Utwórz kopię teraz" }, "icu:Preferences__local-backups-folder": { "messageformat": "Folder kopii zapasowej" @@ -7624,10 +7624,10 @@ "messageformat": "Dzienniki debugowania to zapis szczegółowych informacji o działaniu aplikacji. Nie zawierają one treści żadnych wiadomości." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Dane, które możesz nam udostępnić, to zapis szczegółowych informacji o działaniu aplikacji. Nie zawierają one treści Twoich rozmów." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Informacje diagnostyczne" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Prześlij" diff --git a/_locales/pt-BR/messages.json b/_locales/pt-BR/messages.json index 2e08a6d2f3..0f3dc299ba 100644 --- a/_locales/pt-BR/messages.json +++ b/_locales/pt-BR/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Continuar" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Fixação de mensagens temporárias" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Mensagens temporárias serão desafixadas quando o tempo expirar e a mensagem for removida da conversa. " }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Ok" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Mensagem fixada} other {Mensagens fixadas}}" @@ -6003,13 +6003,13 @@ "messageformat": "Ver chave novamente" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Último backup" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Nunca" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Fazer backup agora" }, "icu:Preferences__local-backups-folder": { "messageformat": "Pasta do backup" @@ -7624,10 +7624,10 @@ "messageformat": "Os registros de depuração contêm informações técnicas do aplicativo e não revelam o conteúdo das suas mensagens." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "As informações compartilhadas conosco contêm informações básicas do aplicativo e não incluem o conteúdo de suas chamadas." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Informações de diagnóstico" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Enviar" diff --git a/_locales/pt-PT/messages.json b/_locales/pt-PT/messages.json index 762700bfd3..3d622b9f65 100644 --- a/_locales/pt-PT/messages.json +++ b/_locales/pt-PT/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Continuar" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Afixar mensagens temporárias" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "As mensagens temporárias serão desafixadas quando o seu temporizador expirar e a mensagem for removida do chat." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Ok" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Mensagem afixada} other {Mensagens afixadas}}" @@ -6003,13 +6003,13 @@ "messageformat": "Ver chave outra vez" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Última cópia de segurança" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Nunca" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Efetuar cópia de segurança agora" }, "icu:Preferences__local-backups-folder": { "messageformat": "Pasta da cópia de segurança" @@ -7624,10 +7624,10 @@ "messageformat": "Os relatórios de depuração contêm informações de baixo nível sobre a app e não revelam qualquer conteúdo da mensagem." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "As informações partilhadas connosco contêm informações de baixo nível sobre a app e não incluem o conteúdo das suas chamadas." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Informações de diagnóstico" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Submeter" diff --git a/_locales/ro-RO/messages.json b/_locales/ro-RO/messages.json index 4c5c0e0d06..87b2b7d628 100644 --- a/_locales/ro-RO/messages.json +++ b/_locales/ro-RO/messages.json @@ -1239,10 +1239,10 @@ "messageformat": "Continuă" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Fixarea mesajelor temporare" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Mesajele temporare vor fi anulate după expirarea cronometrului, iar mesajele vor fi eliminate din conversații." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { "messageformat": "Okay" @@ -6003,13 +6003,13 @@ "messageformat": "Vezi din nou codul" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Ultimul backup" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Niciodată" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Faceți un backup acum" }, "icu:Preferences__local-backups-folder": { "messageformat": "Director backup" @@ -7624,10 +7624,10 @@ "messageformat": "Jurnalele de depanare conțin informații de nivel scăzut despre aplicație și nu dezvăluie conținutul mesajelor tale." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Informațiile partajate cu noi conțin informații de nivel inferior despre aplicație și nu includ conținutul apelurilor tale." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Informații de diagnostic" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Trimite" diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index cf947e3964..082c1e8c44 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Продолжить" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Закрепление исчезающих сообщений" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Исчезающие сообщения будут откреплены, когда истечёт таймер и сообщение будет удалено из чата." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Хорошо" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Закреплённое сообщение} few {Закреплённых сообщения} many {Закреплённых сообщений} other {Закреплённых сообщения}}" @@ -6003,13 +6003,13 @@ "messageformat": "Просмотреть ключ ещё раз" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Последняя резервная копия" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Никогда" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Создать резервную копию" }, "icu:Preferences__local-backups-folder": { "messageformat": "Папка резервных копий" @@ -7624,10 +7624,10 @@ "messageformat": "Журналы отладки содержат низкоуровневую информацию о приложении и не раскрывают содержание вашего сообщения." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Предоставленная нам информация содержит низкоуровневые данные приложения и не включает содержание ваших звонков." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Диагностическая информация" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Отправить" diff --git a/_locales/sk-SK/messages.json b/_locales/sk-SK/messages.json index 0bd8cd7840..25bd3f98d1 100644 --- a/_locales/sk-SK/messages.json +++ b/_locales/sk-SK/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Pokračovať" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Pripnutie miznúcich správ" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Miznúce správy sa po uplynutí nastaveného času odopnú a správa sa odstráni z četu." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "OK" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Pripnutá správa} few {Pripnuté správy} many {Pripnutej správy} other {Pripnutých správ}}" @@ -6003,13 +6003,13 @@ "messageformat": "Pozrieť si kľúč znova" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Posledná záloha" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Nikdy" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Zálohovať teraz" }, "icu:Preferences__local-backups-folder": { "messageformat": "Priečinok pre zálohy" @@ -7624,10 +7624,10 @@ "messageformat": "Protokoly ladenia obsahujú informácie o aplikácii na nízkej úrovni a neodhaľujú obsah správ." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Informácie, ktoré s nami zdieľate, obsahujú informácie o aplikácii na nízkej úrovni a nezahŕňajú obsah vašich hovorov." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Diagnostické údaje" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Odoslať" diff --git a/_locales/sl-SI/messages.json b/_locales/sl-SI/messages.json index b838ae7bf4..5f123d061a 100644 --- a/_locales/sl-SI/messages.json +++ b/_locales/sl-SI/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Nadaljuj" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Pripenjanje izginjajočih sporočil" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Izginjajoča sporočila bodo odpeta, ko se bo iztekel njihov časovnik, sporočilo pa bo odstranjeno iz klepeta." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Okej" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Pripeto sporočilo} two {Pripeti sporočili} few {Pripeta sporočila} other {Pripeta sporočila}}" @@ -6003,13 +6003,13 @@ "messageformat": "Ponovni ogled ključa" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Zadnja varnostna kopija" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Nikoli" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Izdelaj varnostno kopijo" }, "icu:Preferences__local-backups-folder": { "messageformat": "Mesto za varnostne kopije" @@ -7624,10 +7624,10 @@ "messageformat": "Sistemske zabeležbe vsebujejo informacije o aplikaciji na nizki ravni in ne razkrivajo vsebine vaših sporočil." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Informacije, ki jih delite z nami, vsebujejo informacije o aplikacijah nizke ravni in ne vključujejo vsebine vaših klicev." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Diagnostične informacije" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Objavi" diff --git a/_locales/sq-AL/messages.json b/_locales/sq-AL/messages.json index e13e7b094d..61c5327694 100644 --- a/_locales/sq-AL/messages.json +++ b/_locales/sq-AL/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Vazhdo" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Duke fiksuar mesazhet që zhduken" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "\"Mesazhet që zhduken\" të fiksuara do të hiqen kur të skadojë koha e tyre dhe mesazhi fshihet nga biseda." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "OK" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Mesazh i fiksuar} other {Mesazhe të fiksuara}}" @@ -6003,13 +6003,13 @@ "messageformat": "Shiko sërish kodin" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Kopjeruajtja e fundit" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Kurrë" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Kopjeruaje Tani" }, "icu:Preferences__local-backups-folder": { "messageformat": "Dosje kopjeruajtjesh" @@ -7624,10 +7624,10 @@ "messageformat": "Regjistrat e diagnostikimit përmbajnë informacione të nivelit të ulët të aplikacionit dhe nuk zbulojnë asnjë nga përmbajtjet e mesazheve." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Informacioni i ndarë me ne përmban të dhëna të një niveli të ulët për aplikacionin dhe nuk përfshin përmbajtjen e thirrjeve." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Informacion diagnostikues" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Parashtrojeni" diff --git a/_locales/sr/messages.json b/_locales/sr/messages.json index eef8df518c..151870cdba 100644 --- a/_locales/sr/messages.json +++ b/_locales/sr/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Настави" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Качење нестајућих порука" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Нестајуће поруке ће бити откачене када истекну и нестану из ћаскања." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "У реду" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Закачена порука} other {Закачене поруке}}" @@ -6003,13 +6003,13 @@ "messageformat": "Види кључ поново" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Последња резервна копија" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Никад" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Направи резервну копију" }, "icu:Preferences__local-backups-folder": { "messageformat": "Фолдер резервне копије" @@ -7624,10 +7624,10 @@ "messageformat": "Извештаји о грешкама садрже информације о апликацији ниског нивоа и у њима се не открива садржај ваших порука." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Информације које се деле с нама су основне информације о апликацији и не укључују садржај ваших позива." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Дијагностичке информације" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Пошаљи" diff --git a/_locales/sv/messages.json b/_locales/sv/messages.json index 120f8a89cb..27774b0b88 100644 --- a/_locales/sv/messages.json +++ b/_locales/sv/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Fortsätt" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Fäster försvinnande meddelanden" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Försvinnande meddelanden tas bort när timern löper ut och meddelandet tas bort från chatten." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Okej" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Fäst meddelande} other {Fästa meddelanden}}" @@ -5628,22 +5628,22 @@ "messageformat": "Din chatthistorik kan inte exporteras eftersom Signal inte har behörighet att skriva filer till disk. Försök att ändra diskens behörigheter eller uppdatera dina systeminställningar och exportera sedan igen." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Exporterar säkerhetskopia" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Export av säkerhetskopia har slutförts" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "För att återställa den här säkerhetskopian:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Överför din säkerhetskopiamapp till telefonens lagringsutrymme" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Installera en ny kopia av Signal på din telefon" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Tryck på \"Återställ eller överför\" och välj \"Säkerhetskopiering på enheten\"" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Månikon" @@ -6003,13 +6003,13 @@ "messageformat": "Visa nyckel igen" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Senaste säkerhetskopia" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Aldrig" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Säkerhetskopiera nu" }, "icu:Preferences__local-backups-folder": { "messageformat": "Mapp för säkerhetskopior" @@ -7612,7 +7612,7 @@ "messageformat": "Detta hjälper oss att lära oss mer om samtal och vad som fungerar eller inte fungerar. Du kan visa din felsökningslogg innan du skickar in." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "När du skickar in delas din feedback tillsammans med diagnostisk information om ditt samtal. Du kan välja att dela en felsökningslogg för att hjälpa oss att förbättra samtalskvaliteten." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Dela felsökningslogg" @@ -7624,10 +7624,10 @@ "messageformat": "Felsökningsloggar innehåller appinformation på låg nivå och avslöjar inget av innehållet i dina meddelanden." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Information som delas med oss innehåller appinformation på låg nivå och inkluderar inte innehållet i dina samtal." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Diagnostisk information" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Skicka" @@ -7645,7 +7645,7 @@ "messageformat": "Tack för din feedback!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Expandera sidofältet för att interagera med megafonen" }, "icu:WhatsNew__bugfixes": { "messageformat": "Den här versionen innehåller ett antal små justeringar och felrättningar för att Signal ska fungera smidigt.", @@ -7679,6 +7679,6 @@ "messageformat": "Vi har åtgärdat ett mindre visningsproblem med indikatorn för handuppräckning i gruppsamtal." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Nålade meddelanden kan hjälpa dig att hålla viktig information lättillgänglig högst upp i en chatt." } } diff --git a/_locales/sw/messages.json b/_locales/sw/messages.json index ad66f71fbc..e84a88ee54 100644 --- a/_locales/sw/messages.json +++ b/_locales/sw/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Endelea" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Kubandika jumbe za kutoweka" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Jumbe za kutoweka zitabanduliwa kipima muda chake kitakapoisha muda na ujumbe kuondolewa kwenye gumzo." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Sawa" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Ujumbe uliobandikwa} other {Jumbe zilizobandikwa}}" @@ -6003,13 +6003,13 @@ "messageformat": "Angalia ufunguo tena" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Nakala ya mwisho" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Kamwe" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Hifadhi nakala rudufu Sasa" }, "icu:Preferences__local-backups-folder": { "messageformat": "Folda ya nakala hifadhi" @@ -7624,10 +7624,10 @@ "messageformat": "Mafaili ya marekebisho yana taarifa za kiwango cha chini za programu na usidhihirishe maudhui ya ujumbe wako." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Taarifa unazotutumia zina kiwango cha chini cha taarifa za programu na hazijumuishi maudhui ya simu zako." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Taarifa ya uchunguzi" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Tuma" diff --git a/_locales/ta-IN/messages.json b/_locales/ta-IN/messages.json index 44a46071e3..6c248ac100 100644 --- a/_locales/ta-IN/messages.json +++ b/_locales/ta-IN/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "தொடர்க" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "மறைந்து போகும் மெசேஜ்களை பின் செய்கிறது" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "மறைந்து போகும் மெசேஜ்கள் காலக்கெடு முடிந்து சாட்டிலிருந்து அவை நீக்கப்படும்போது, அவை பின் அகற்றப்படும்." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "சரி" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {பின் செய்யப்பட்ட மெசேஜ்} other {பின் செய்யப்பட்ட மெசேஜ்கள்}}" @@ -6003,13 +6003,13 @@ "messageformat": "குறியீட்டைப் மீண்டும் காண்க" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "கடைசி காப்புப்பிரதி" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "ஒருபோதுமில்லை" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "இப்பொழது பாதுகாப்பிற்காக சேமித்து வை காப்புப்பதிவு பயனர் தரவு" }, "icu:Preferences__local-backups-folder": { "messageformat": "மறுபிரதி கோப்புறை" @@ -7624,10 +7624,10 @@ "messageformat": "பிழைத்திருத்தப் பதிவுகள் செயலியின் அடிப்படைத் தொழில்நுட்பத் தகவல்களைக் கொண்டுள்ளன, மேலும் அவை உங்கள் மெசேஜ் உள்ளடக்கங்கள் எதையும் வெளிப்படுத்தாது." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "எங்களுடன் பகிரப்படும் தகவல்களில் செயலியின் அடிப்படைத் தொழில்நுட்ப விவரங்கள் மட்டுமே இருக்கும்; உங்கள் அழைப்புகளின் உள்ளடக்கம் இதில் இருக்காது." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "கண்டறியும் தகவல்" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "சமர்ப்பி" diff --git a/_locales/te-IN/messages.json b/_locales/te-IN/messages.json index 0ea92aa3af..770f7c04ff 100644 --- a/_locales/te-IN/messages.json +++ b/_locales/te-IN/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "కొనసాగించండి" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "అదృశ్యమయ్యే సందేశాలను పిన్ చేస్తున్నారు" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "అదృశ్యమయ్యే సందేశాలు వాటి టైమర్ ముగిశాక అన్‌పిన్ చేయబడతాయి మరియు సందేశం చాట్ నుండి తొలగించబడుతుంది." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "సరే" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {పిన్ చేసిన సందేశం} other {పిన్ చేసిన సందేశాలు}}" @@ -6003,13 +6003,13 @@ "messageformat": "కీని మళ్ళీ చూడండి" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "చివరి బ్యాకప్" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "ఎప్పుడూ" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "భద్రపరచు" }, "icu:Preferences__local-backups-folder": { "messageformat": "బ్యాకప్ ఫోల్డర్" @@ -7624,10 +7624,10 @@ "messageformat": "డీబగ్ లాగ్‌లు తక్కువ స్థాయి యాప్ సమాచారాన్ని కలిగి ఉంటాయి మరియు మీ సందేశ కంటెంట్‌లు వేటినీ బహిర్గతం చేయవు." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "మాతో పంచుకోబడిన సమాచారం తక్కువ స్థాయి యాప్ సమాచారం కలిగి ఉంటుంది, ఇందులో మీ కాల్‌లకు సంబంధించిన విషయాలు ఉండవు." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "డయాగ్నస్టిక్ సమాచారం" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "సమర్పించండి" diff --git a/_locales/th/messages.json b/_locales/th/messages.json index 74b96b726b..4f5d0f9247 100644 --- a/_locales/th/messages.json +++ b/_locales/th/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "ดำเนินการต่อ" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "การปักหมุดข้อความที่จะหายไป" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "เมื่อครบเวลาที่กำหนด ข้อความที่จะหายไปจะถูกปลดหมุดและจะถูกลบออกจากแชท" }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "ตกลง" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {ข้อความที่ปักหมุด}}" @@ -6003,13 +6003,13 @@ "messageformat": "ดูกุญแจอีกครั้ง" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "การสำรองข้อมูลครั้งล่าสุด" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "ไม่เลย" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "สำรองข้อมูลเดี๋ยวนี้" }, "icu:Preferences__local-backups-folder": { "messageformat": "โฟลเดอร์ข้อมูลสำรอง" @@ -7624,10 +7624,10 @@ "messageformat": "ภายในบันทึกดีบักจะมีข้อมูลแอประดับพื้นฐานและจะไม่เปิดเผยเนื้อหาใดๆ ในข้อความของคุณ" }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "ข้อมูลที่คุณจะแชร์ให้เราเป็นข้อมูลแอประดับพื้นฐานซึ่งไม่รวมถึงเนื้อหาใดๆ ในการโทรของคุณ" }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "ข้อมูลผลการวิเคราะห์ปัญหา" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "ส่ง" diff --git a/_locales/tl-PH/messages.json b/_locales/tl-PH/messages.json index 1c1f89266e..26179a6eae 100644 --- a/_locales/tl-PH/messages.json +++ b/_locales/tl-PH/messages.json @@ -1239,10 +1239,10 @@ "messageformat": "Magpatuloy" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Pag-pin ng disappearing message" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Matatanggal ang pin ng disappearing messages kapag nag-expire ang timer nito at natanggal ang message mula sa chat." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { "messageformat": "Okay" @@ -6003,13 +6003,13 @@ "messageformat": "Tingnan ulit ang key" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Huling backup" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Hindi kailanman" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Mag-back up na ngayon" }, "icu:Preferences__local-backups-folder": { "messageformat": "Backup folder" @@ -7624,10 +7624,10 @@ "messageformat": "Ang debug logs ay naglalaman ng mababang level ng impormasyon ng app at hindi nagpapakita ng anumang nilalaman ng messages mo." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Ang impormasyong ibinahagi sa amin ay naglalaman ng mababang antas ng impormasyon ng app at hindi kasama ang mga nilalaman ng iyong mga tawag." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Diagnostic na impormasyon" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Isumite" diff --git a/_locales/tr/messages.json b/_locales/tr/messages.json index 2165379e00..756c206143 100644 --- a/_locales/tr/messages.json +++ b/_locales/tr/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Devam" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Kaybolan mesajları sabitleme" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Kaybolan mesajların sabitlemesi, zamanlayıcıları dolduğunda ve mesaj sohbetten kaldırıldığında sona erer." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Tamam" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Sabitlenmiş mesaj} other {Sabitlenmiş mesajlar}}" @@ -6003,13 +6003,13 @@ "messageformat": "Anahtarı tekrar gör" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Son yedekleme" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Asla" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Şimdi yedekle" }, "icu:Preferences__local-backups-folder": { "messageformat": "Yedekleme dizini" @@ -7624,10 +7624,10 @@ "messageformat": "Hata ayıklama günlükleri, düşük düzeyde uygulama bilgisi içerir ve hiçbir mesaj içeriğini açıklamaz." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Bizimle paylaşılan bilgiler düşük seviyeli uygulama bilgilerini içerir ve aramalarının içeriğini içermez." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Tanılama bilgileri" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Gönder" diff --git a/_locales/ug/messages.json b/_locales/ug/messages.json index 269ee7ce99..c278c3352d 100644 --- a/_locales/ug/messages.json +++ b/_locales/ug/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "داۋاملاشتۇرۇش" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "غايىب بولۇش ئالدىدىكى ئۇچۇرلارنى مىقلاش" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "غايىب بولۇش ئالدىدىكى ئۇچۇرلار ۋاقىت خاتىرلىگۈچتىكى ۋاقتى توشقاندا مىقىدىن ئېلىۋېتىلىدۇ ھەمدە سۆھبەتتىن ئۆچۈرۈۋېتىلىدۇ." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "جەزملە" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {مىقلانغان ئۇچۇرلار}}" @@ -5628,22 +5628,22 @@ "messageformat": "سۆھبەت تارىخىڭىزنى ئېكسپورت قىلغىلى بولمايدۇ، چۈنكى Signalنىڭ ساقلاش دىسكىسىغا ھۆججەت كىرگۈزۈش ھوقۇقى يوق. دىسكىڭىزنىڭ ئىجازەتنامىسىنى ئۆزگەرتىڭ ياكى سىستېما تەڭشىكىڭىزنى يېڭىلاپ ئاندىن قايتا ئېكسپورت قىلىڭ." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "زاپاسنى ئىكسپورتلاش" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "زاپاسنى ئىكىسپورتلاش تاماملاندى" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "بۇ زاپاسنى ئەسلىگە كەلتۈرۈش ئۈچۈن:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "زاپاسلاش ھۆججەت قىسقۇچىڭىزنى تېلېفونىڭىزنىڭ ساقلاش ئامبىرىغا يۆتكەڭ" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "تېلېفونىڭىزغا Signalنىڭ يېڭى نۇسخىسىنى قاچىلاڭ" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "«ئەسلىگە كەلتۈرۈش ياكى يۆتكەش»نى چېكىڭ ۋە «ئۈسكۈنىدە زاپاسلاش»نى تاللاڭ" }, "icu:NotificationProfile--moon-icon": { "messageformat": "ئاي شەكىللدك سىنبەلگە" @@ -6003,13 +6003,13 @@ "messageformat": "ئاچقۇچنى قايتا كۆرۈڭ" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "ئالدىنقى قېتىملىق زاپاسلاش" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "ھەرگىز" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "ھازىر زاپاسلا" }, "icu:Preferences__local-backups-folder": { "messageformat": "زاپاسلاش قىسقۇچى" @@ -7612,7 +7612,7 @@ "messageformat": "بۇ ياردەملىشىپ بىزنى تېلېفونلىشىش ۋە نېمىنىڭ ئىشلەۋاتقان ياكى ئىشلىمەيدىغانلىقى توغرىسىدا تېخىمۇ كۆپ چۈشەنچىگە ئىگە قىلىدۇ. يوللاشتىن بۇرۇن كاشىلا ھەل قىلىش خاتىرىڭىزنى كۆرەلەيسىز." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "يوللاش ئارقىلىق تېلېفونىڭىز ھەققىدىكى دىئاگنوزتىكلىق ئۇچۇرلار سىزنىڭ پىكىر-تەكلىپلىرىڭىز بىلەن بىرلىكتە ئورتاقلىشىلىدۇ. بىزگە ياردەملىشىپ تېلېفونلىشىش سۈپىتىنى ياخشىلاش ئۈچۈن، سىز ئىختىيارىي ھالدا كاشىلا ھەل قىلىش خاتىرىسىنى ئورتاقلىشالايسىز." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "كاشىلا ھەل قىلىش خاتىرىسىنى ئورتاقلىشىش" @@ -7624,10 +7624,10 @@ "messageformat": "كاشىلا ھەل قىلىش خاتىرىلىرى تۆۋەن دەرىجىدىكى ئەپ ئۇچۇرلىرىنى ئۆز ئىچىگە ئالغان بولۇپ، پاراڭ مەزمۇنلىرىڭىزنىڭ ھېچقايسىسىنى ئاشكارىلىمايدۇ." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "بىز بىلەن ئورتاقلاشقان ئۇچۇرلار تۆۋەن دەرىجىلىك ئەپ ئۇچۇرلىرىنى ئۆز ئىچىگە ئالىدۇ ئەمما سىز تېلېفونلاشقاندىكى مەزمۇنلارنى ئۆز ئىچىگە ئالمايدۇ." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "دىئاگنوستىكلىق ئۇچۇر" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "تاپشۇر" @@ -7645,7 +7645,7 @@ "messageformat": "ئىنكاسىڭىزغا رەھمەت!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "مېگافون بىلەن ئالاقە قىلىش ئۈچۈن يان تاختىنى كېڭەيتىڭ" }, "icu:WhatsNew__bugfixes": { "messageformat": "Signal نىڭ راۋان ئىجرا بولۇشى ئۈچۈن بۇ نەشرىدە بىر قانچە كىچىك ئۆزگەرتىشلەر ئېلىپ بېرىلدى ۋە كاشىلىلار ئوڭشالدى.", @@ -7679,6 +7679,6 @@ "messageformat": "گۇرۇپپا چاقىرىشلىرىدا قول كۆتۈرۈش كۆرسەتكۈچىگە مۇناسىۋەتلىك كىچىك كۆرۈنۈش خاتالىقىنى تۈزەتتۇق." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "مىخلانغان ئۇچۇرلار، سىزگە ياردەملىشىپ ئۇچۇر بېتىنىڭ بېشىدا مۇھىم ئۇچۇرلارنى ئاسانلا قوللىنىشقا ياردەم بېرىدۇ. ئەڭ كۆپ سورايدىغان سوئاللىرىڭىز، كەچلىك تاماق زاكاسلار ۋە ساياھەت پىلانلىرىڭىز. ئەمدى ئۇلار ئۇچۇر بېتىڭىزنىڭ ئەڭ بېشىدىن ئورۇن ئالالايدۇ." } } diff --git a/_locales/uk-UA/messages.json b/_locales/uk-UA/messages.json index 2ee417fdbc..0e2f3fb417 100644 --- a/_locales/uk-UA/messages.json +++ b/_locales/uk-UA/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Продовжити" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Закріплення тимчасових повідомлень" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Тимчасові повідомлення буде відкріплено, коли вони зникнуть із чату." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "Зрозуміло" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Закріплене повідомлення} few {Закріплені повідомлення} many {Закріплені повідомлення} other {Закріплені повідомлення}}" @@ -6003,13 +6003,13 @@ "messageformat": "Подивитися ключ ще раз" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Найновіша резервна копія" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Відсутня" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Створити копію зараз" }, "icu:Preferences__local-backups-folder": { "messageformat": "Папка для резервних копій" @@ -7624,10 +7624,10 @@ "messageformat": "Журнали налагодження містять інформацію нижнього рівня про застосунок і не розкривають вмісту ваших повідомлень." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Дані, які ви нам передаєте, містять інформацію нижнього рівня про застосунок; ми не отримуємо доступу до вмісту ваших викликів." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Діагностична інформація" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Надіслати" diff --git a/_locales/ur/messages.json b/_locales/ur/messages.json index 9c01e1c875..52671f845d 100644 --- a/_locales/ur/messages.json +++ b/_locales/ur/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "جاری رکھیں" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "غائب ہونے والے میسجز کو پِن کرنا" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "جب غائب ہونے والے میسجز کا ٹائمر ختم ہو جائے گا اور میسج چیٹ سے ہٹا دیا جائے گا تو وہ اَن پِن ہو جائیں گے۔" }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "ٹھیک ہے" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {پِن کردہ میسج} other {پِن کردہ میسجز}}" @@ -6003,13 +6003,13 @@ "messageformat": "کیی کو دوبارہ دیکھیں" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "آخری بیک اپ" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "کبھی نہیں" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "اب بیک اپ کریں" }, "icu:Preferences__local-backups-folder": { "messageformat": "بیک اپ فولڈر" @@ -7624,10 +7624,10 @@ "messageformat": "ڈی بگ لاگز کم درجے کی ایپ معلومات پر مشتمل ہوتے ہیں اور آپ کے کسی بھی میسج کے مندرجات کو ظاہر نہیں کرتے۔" }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "ہمارے ساتھ شیئر کی گئی معلومات میں ایپ کی بنیادی سطح کی تفصیلات شامل ہیں اور اس میں آپ کی کالز کا مواد شامل نہیں ہے۔" }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "تشخیصی معلومات" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "جمح کریں" diff --git a/_locales/vi/messages.json b/_locales/vi/messages.json index 89511da185..99f9a0ce6b 100644 --- a/_locales/vi/messages.json +++ b/_locales/vi/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "Tiếp tục" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "Ghim tin nhắn tự xóa" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "Tin nhắn tự xóa sẽ được bỏ ghim khi đồng hồ hết giờ và tin nhắn bị xóa khỏi cuộc trò chuyện." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "OK" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {Tin nhắn đã ghim}}" @@ -6003,13 +6003,13 @@ "messageformat": "Xem lại mã khóa" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "Bản sao lưu gần nhất" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "Không bao giờ" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "Sao lưu Ngay" }, "icu:Preferences__local-backups-folder": { "messageformat": "Thư mục sao lưu" @@ -7624,10 +7624,10 @@ "messageformat": "Nhật ký gỡ lỗi chứa thông tin ứng dụng cấp thấp và không tiết lộ bất kỳ nội dung tin nhắn nào của bạn." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "Thông tin được chia sẻ với chúng tôi chứa thông tin ứng dụng ở mức thấp và không bao gồm nội dung cuộc gọi của bạn." }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "Thông tin chẩn đoán" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "Gửi" diff --git a/_locales/yue/messages.json b/_locales/yue/messages.json index 1c6175551a..98f58e882a 100644 --- a/_locales/yue/messages.json +++ b/_locales/yue/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "繼續" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "將過眼雲煙訊息置頂" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "當過眼雲煙訊息喺倒數完同埋喺聊天度剔走嗰陣,系統會將訊息取消置頂。" }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "確定" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {置頂嘅訊息}}" @@ -6003,13 +6003,13 @@ "messageformat": "再睇多次金鑰" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "上一次備份" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "從未" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "即刻備份" }, "icu:Preferences__local-backups-folder": { "messageformat": "備份資料夾" @@ -7624,10 +7624,10 @@ "messageformat": "除錯記錄只包括 APP 嘅基本資訊,唔會顯示任何訊息內容。" }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "分享俾我哋嘅資料只會包括基礎 APP 資訊,同埋唔會包括你嘅通話內容。" }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "診斷資訊" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "提交" diff --git a/_locales/zh-CN/messages.json b/_locales/zh-CN/messages.json index 3e5b972f97..585d8ebc75 100644 --- a/_locales/zh-CN/messages.json +++ b/_locales/zh-CN/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "继续" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "置顶限时消息" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "限时消息将在定时器结束时自动取消置顶并从聊天中删除。" }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "好的" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {置顶的消息}}" @@ -6003,13 +6003,13 @@ "messageformat": "再次查看密钥" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "上次备份" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "永不" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "现在备份" }, "icu:Preferences__local-backups-folder": { "messageformat": "备份文件夹" @@ -7624,10 +7624,10 @@ "messageformat": "调试日志包含低级应用程序信息,不会显示任何消息内容。" }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "与我们共享的信息包含应用程序的低等级信息,不包含您的通话内容。" }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "诊断信息" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "提交" diff --git a/_locales/zh-HK/messages.json b/_locales/zh-HK/messages.json index b43ced5aef..78e72f756d 100644 --- a/_locales/zh-HK/messages.json +++ b/_locales/zh-HK/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "繼續" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "釘選自動銷毀訊息" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "當自動銷毀訊息時限已到和從聊天中被移除時,系統會將其解除釘選。" }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "好的" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {已釘選的訊息}}" @@ -6003,13 +6003,13 @@ "messageformat": "再看一次金鑰" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "上次備份" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "永不" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "立即備份" }, "icu:Preferences__local-backups-folder": { "messageformat": "備份資料夾" @@ -7624,10 +7624,10 @@ "messageformat": "除錯日誌包含低階應用程式資訊,不會顯示任何訊息內容。" }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "與我們分享的資訊包含基礎應用程式資訊,並不包含你的通話內容。" }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "診斷資訊" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "送出" diff --git a/_locales/zh-Hant/messages.json b/_locales/zh-Hant/messages.json index cc2b3eba28..36795b0ffe 100644 --- a/_locales/zh-Hant/messages.json +++ b/_locales/zh-Hant/messages.json @@ -1239,13 +1239,13 @@ "messageformat": "繼續" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Pinning disappearing messages" + "messageformat": "釘選自動銷毀訊息" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Disappearing messages will be unpinned when their timer expires and the message is removed from the chat." + "messageformat": "當自動銷毀訊息時限已到和從聊天中被移除時,系統會將其解除釘選。" }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Okay" + "messageformat": "好的" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, other {已釘選的訊息}}" @@ -6003,13 +6003,13 @@ "messageformat": "再看一次金鑰" }, "icu:Preferences__local-backups-last-backup": { - "messageformat": "Last backup" + "messageformat": "上次備份" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "Never" + "messageformat": "永不" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "Back up now" + "messageformat": "馬上備份" }, "icu:Preferences__local-backups-folder": { "messageformat": "備份資料夾" @@ -7624,10 +7624,10 @@ "messageformat": "除錯日誌包含低階應用程式資訊,不會顯示任何訊息內容。" }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Information shared with us contains low level app information and does not include the contents of your calls." + "messageformat": "與我們分享的資訊包含基礎應用程式資訊,並不包含你的通話內容。" }, "icu:CallDiagnosticWindow__title": { - "messageformat": "Diagnostic information" + "messageformat": "診斷資訊" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "送出" From dd933d74fa588bf1190afce3e5a7ace70601d60d Mon Sep 17 00:00:00 2001 From: Jamie Kyle Date: Fri, 23 Jan 2026 11:04:29 -0800 Subject: [PATCH 46/49] 7.87.0-beta.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 180655b9cc..6dd0e73404 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "description": "Private messaging from your desktop", "desktopName": "signal.desktop", "repository": "https://github.com/signalapp/Signal-Desktop.git", - "version": "7.87.0-beta.1", + "version": "7.87.0-beta.2", "license": "AGPL-3.0-only", "author": { "name": "Signal Messenger, LLC", From b4170bcbea2ba2828d9de3a26ab8ce1ade2a9756 Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Wed, 28 Jan 2026 13:41:37 -0800 Subject: [PATCH 47/49] Update strings --- _locales/ar/messages.json | 18 ++-- _locales/az-AZ/messages.json | 18 ++-- _locales/bg-BG/messages.json | 18 ++-- _locales/bn-BD/messages.json | 18 ++-- _locales/bs-BA/messages.json | 20 ++--- _locales/ca/messages.json | 18 ++-- _locales/cs/messages.json | 20 ++--- _locales/da/messages.json | 18 ++-- _locales/de/messages.json | 18 ++-- _locales/el/messages.json | 18 ++-- _locales/es/messages.json | 18 ++-- _locales/et-EE/messages.json | 18 ++-- _locales/eu/messages.json | 18 ++-- _locales/fa-IR/messages.json | 18 ++-- _locales/fi/messages.json | 18 ++-- _locales/fr/messages.json | 18 ++-- _locales/ga-IE/messages.json | 22 ++--- _locales/gl-ES/messages.json | 18 ++-- _locales/gu-IN/messages.json | 22 ++--- _locales/he/messages.json | 18 ++-- _locales/hi-IN/messages.json | 20 ++--- _locales/hr-HR/messages.json | 18 ++-- _locales/id/messages.json | 18 ++-- _locales/it/messages.json | 160 ++++++++++++++++----------------- _locales/ja/messages.json | 22 ++--- _locales/ka-GE/messages.json | 18 ++-- _locales/kk-KZ/messages.json | 18 ++-- _locales/km-KH/messages.json | 20 ++--- _locales/kn-IN/messages.json | 18 ++-- _locales/ko/messages.json | 80 ++++++++--------- _locales/ky-KG/messages.json | 18 ++-- _locales/lt-LT/messages.json | 18 ++-- _locales/lv-LV/messages.json | 18 ++-- _locales/mk-MK/messages.json | 18 ++-- _locales/ml-IN/messages.json | 18 ++-- _locales/mr-IN/messages.json | 18 ++-- _locales/ms/messages.json | 18 ++-- _locales/my/messages.json | 18 ++-- _locales/nb/messages.json | 18 ++-- _locales/nl/messages.json | 18 ++-- _locales/pa-IN/messages.json | 18 ++-- _locales/pl/messages.json | 18 ++-- _locales/pt-BR/messages.json | 18 ++-- _locales/pt-PT/messages.json | 18 ++-- _locales/ro-RO/messages.json | 18 ++-- _locales/ru/messages.json | 18 ++-- _locales/sk-SK/messages.json | 18 ++-- _locales/sl-SI/messages.json | 18 ++-- _locales/sq-AL/messages.json | 18 ++-- _locales/sr/messages.json | 18 ++-- _locales/sw/messages.json | 18 ++-- _locales/ta-IN/messages.json | 18 ++-- _locales/te-IN/messages.json | 18 ++-- _locales/th/messages.json | 18 ++-- _locales/tl-PH/messages.json | 18 ++-- _locales/tr/messages.json | 20 ++--- _locales/uk-UA/messages.json | 18 ++-- _locales/ur/messages.json | 18 ++-- _locales/vi/messages.json | 18 ++-- _locales/yue/messages.json | 20 ++--- _locales/zh-CN/messages.json | 20 ++--- _locales/zh-HK/messages.json | 18 ++-- _locales/zh-Hant/messages.json | 18 ++-- 63 files changed, 682 insertions(+), 682 deletions(-) diff --git a/_locales/ar/messages.json b/_locales/ar/messages.json index dfa2ca1640..be2770f83f 100644 --- a/_locales/ar/messages.json +++ b/_locales/ar/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "يتعذَّر تصدير سجل الدردشة الخاص بك لأن سيجنال ليس لديه الإذن لكتابة الملفات على القرص. حاوِل تغيير أذونات قرصك أو حدِّث إعدادات نظامك ثم حاوِل التصدير من جديد." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "جارٍ تصدير النسخة الاحتياطية" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "اِكتمل تصدير النسخة الاحتياطية" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "لاستعادة هذه النسخة الاحتياطية:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "انقل مجلد النسخة الاحتياطية إلى مساحة تخزين هاتفك" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "ثبِّت نسخة جديدة من سيجنال على هاتفك" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "انقر على \"الاستعادة أو النقل\" واختر \"النسخة الاحتياطية على الجهاز\"" }, "icu:NotificationProfile--moon-icon": { "messageformat": "أيقونة القمر" @@ -7612,7 +7612,7 @@ "messageformat": "يساعدنا هذا على معرفة المزيد بخصوص الاتصالات وما يعمل وما لا يعمل. يمكنك عرض سِجل الأخطاء الخاص بك قبل الإرسال." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "بإرسال السِجل، سيتم مشاركة ملاحظاتك مع معلومات التشخيص المتعلقة باتصالك. يمكنك اختياريًا مشاركة سِجل تصحيح الأخطاء لمساعدتنا في تحسين جودة المكالمات." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "مشاركة سجل الأخطاء" @@ -7645,7 +7645,7 @@ "messageformat": "شكرًا على ملاحظاتك!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "افتح الشريط الجانبي للتفاعُل مع مُكبِّر الصوت" }, "icu:WhatsNew__bugfixes": { "messageformat": "يحتوي هذا الإصدار على عدد من التعديلات الصغيرة وإصلاحات الأخطاء للحفاظ على عمل سيجنال بسلاسة.", @@ -7679,6 +7679,6 @@ "messageformat": "أصلحنا خللًا بسيطًا في عرض أيقونة رفع اليد أثناء المكالمات الجماعية." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "تُسهّل الرسائل المُثبَّتة الوصول إلى المعلومات المهمة في أعلى الدردشة. أبقِ أسئلتك الأكثر شيوعًا، وحجوزات المطاعم، وخطط عطلاتك حاضرة دائمًا. الآن أصبحت حاضرة كلها في صدارة دردشاتك أيضًا." } } diff --git a/_locales/az-AZ/messages.json b/_locales/az-AZ/messages.json index 23ca070133..09a93db366 100644 --- a/_locales/az-AZ/messages.json +++ b/_locales/az-AZ/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Signal faylları diskə köçürmək icazəsinə malik olmadığı üçün çat tarixçənizi ixrac etmək mümkün deyil. Disk icazələrini dəyişib və ya sistem parametrlərini yeniləyib, yenidən ixrac edin." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Ehtiyat nüsxə ixrac olunur" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Ehtiyat nüsxənin ixracı tamamlandı" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Bu ehtiyat nüsxəni bərpa etmək üçün:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Ehtiyat nüsxə qovluğunuzu telefon yaddaşına köçürün" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Telefonunuzda Signal-ın yeni kopiyasını quraşdırın" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "\"Bərpa et və ya Köçür\"ə toxunub \"Cihazdakı ehtiyat nüsxə\" seçimini edin" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ay piktoqramı" @@ -7612,7 +7612,7 @@ "messageformat": "Bu, bizə zənglər və işə yarayıb-yaramayan düzəlişlərimiz haqqında ətraflı məlumat əldə etməyə kömək edir. Göndərməzdən əvvəl sazlama jurnalına nəzər sala bilərsiniz." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Təqdim etməklə zənginiz haqqındakı diaqnostik məlumatla birgə rəyiniz də paylaşılır. Zəng keyfiyyətini artırmağa kömək etmək üçün əlavə olaraq sazlama jurnalını da paylaşa bilərsiniz." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Sazlama jurnalını paylaşın" @@ -7645,7 +7645,7 @@ "messageformat": "Rəyiniz üçün təşəkkür edirik!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Meqafonla qarşılıqlı əlaqə qurmaq üçün yan paneli genişləndirin" }, "icu:WhatsNew__bugfixes": { "messageformat": "Bu versiya, Signal-ın problemsiz işləməsini təmin etmək üçün kiçik düzəltmələr və xəta düzəltmələri ehtiva edir.", @@ -7679,6 +7679,6 @@ "messageformat": "Biz sonradan yaranan yöndəmsiz sükutu aradan qaldıra bilməsək də, bir xətanı düzəltdik: bəzən kimsə əlini çox tez qaldırıb endirdikdə, qaldırılmış əl göstəricisi (sayı sıfır olduğu halda) ekranda qalırdı." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Vacib məlumatı əhatə edən mesajları sancaqlamaq onların asan tapılmasına kömək edir. Tez-tez verdiyiniz suallar, şam yeməyi üçün rezervasiyalar və tətil planları düşüncələrinizi ələ alıb. Artıq bu məsələləri çatda müzakirə edə bilərsiniz." } } diff --git a/_locales/bg-BG/messages.json b/_locales/bg-BG/messages.json index 6948351610..1771b7bed0 100644 --- a/_locales/bg-BG/messages.json +++ b/_locales/bg-BG/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Вашата история на чата не може да бъде експортирана, защото Signal няма разрешение да записва файлове на диска. Опитайте да промените разрешенията на диска или да актуализирате системните си настройки и след това експортирайте отново." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Експортиране на резервно копие" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Експортирането на резервно копие завърши" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "За да възстановите това резервно копие:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Прехвърлете папката с резервното копие в хранилището на телефона си" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Инсталирайте ново копие на Signal на телефона си" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Докоснете „Възстановяване или трансфер“ и изберете „На резервно копие на устройството“." }, "icu:NotificationProfile--moon-icon": { "messageformat": "Икона на луна" @@ -7612,7 +7612,7 @@ "messageformat": "Това ни помага да научим повече за обажданията и за това какво работи и какво не работи. Можете да видите своя доклад за дебъг, преди да го изпратите." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Когато изпращате обратна връзка, тя ще бъде споделена заедно с диагностична информация за вашето обаждане. По желание можете да споделите доклад за дебъг, за да ни помогнете да подобрим качеството на обажданията." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Споделяне на доклад за дебъг" @@ -7645,7 +7645,7 @@ "messageformat": "Благодарим за обратната връзка!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Разширете страничната лента, за да си взаимодействате с мегафона" }, "icu:WhatsNew__bugfixes": { "messageformat": "Тази версия съдържа редица дребни модификации и корекции на бъгове, за да поддържа гладката работа на Signal.", @@ -7679,6 +7679,6 @@ "messageformat": "Поправихме малък бъг с индикатора за вдигната ръка при групови разговори." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Закачените съобщения могат да ви помогнат да направите важната информация лесно достъпна в горната част на чата." } } diff --git a/_locales/bn-BD/messages.json b/_locales/bn-BD/messages.json index 91a35161f7..6889333af1 100644 --- a/_locales/bn-BD/messages.json +++ b/_locales/bn-BD/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "আপনার চ্যাট-এর ইতিহাস এক্সপোর্ট করা যাচ্ছে না, কারণ Signal-এর ডিস্কে ফাইল রাইট করার অনুমতি নেই। আপনার ডিস্কের অনুমতি পরিবর্তন করার চেষ্টা করুন অথবা আপনার সিস্টেম সেটিংস আপডেট করুন এবং তারপর আবার এক্সপোর্ট করুন।" }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "ব্যাকআপ এক্সপোর্ট করা হচ্ছে" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "ব্যাকআপ এক্সপোর্ট সম্পন্ন হয়েছে" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "এই ব্যাকআপটি পুনর্বহাল করতে:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "আপনার ব্যাকআপ ফোল্ডারটি আপনার ফোনের স্টোরেজে ট্রান্সফার করুন" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "আপনার ফোনে Signal-এর একটি নতুন কপি ইনস্টল করুন" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "\"পুনর্বহাল বা ট্রান্সফার করুন\"-এ ট্যাপ করুন এবং \"ডিভাইস ব্যাকআপ\" বেছে নিন" }, "icu:NotificationProfile--moon-icon": { "messageformat": "চাঁদের আইকন" @@ -7612,7 +7612,7 @@ "messageformat": "এটি আমাদের কলের ব্যাপারে, কী কী কাজ করছে বা কী কী করছে না সে সম্পর্কে আরো জানতে সাহায্য করে। জমা দেওয়ার আগে আপনি আপনার ডিবাগ লগ দেখতে পারেন।" }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "জমা দিলে আপনার কল সম্পর্কিত ডায়াগনস্টিক তথ্য সহ আপনার মতামত শেয়ার করা হবে। কলের মান উন্নত করতে আমাদের সাহায্য করার জন্য ইচ্ছা হলে আপনি একটি ডিবাগ লগ শেয়ার করতে পারেন।" }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "ডিবাগ লগ শেয়ার করুন" @@ -7645,7 +7645,7 @@ "messageformat": "আপনার ফিডব্যাকের জন্য ধন্যবাদ!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "মেগাফোনের সাথে ইন্টারঅ্যাক্ট করতে সাইডবারটি সম্প্রসারিত করুন" }, "icu:WhatsNew__bugfixes": { "messageformat": "সিগন্যালকে মসৃণভাবে চলমান রাখতে এই সংস্করণে অনেকগুলি ছোটখাট পরিবর্তন রয়েছে এবং বাগ সংশোধন করা হয়েছে।", @@ -7679,6 +7679,6 @@ "messageformat": "গ্রুপ কলে হাত উঁচু করার ইন্ডিকেটরের একটি ছোট ডিসপ্লে বাগ আমরা সংশোধন করেছি।" }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "মেসেজ পিন করার মাধ্যমে গুরুত্বপূর্ণ তথ্য সহজে অ্যাক্সেসযোগ্য রাখতে সাহায্য করুন। আপনি প্রায়শই জিজ্ঞাসা করেন এমন প্রশ্ন, রাতের খাবারের রিজার্ভেশন এবং ছুটিতে ঘুরতে যাবার বৃত্তান্ত ইতোমধ্যেই আপনার মনে সবার আগে স্থান নিয়ে আছে। এখন সেগুলো চ্যাটের শীর্ষেও থাকতে পারে।" } } diff --git a/_locales/bs-BA/messages.json b/_locales/bs-BA/messages.json index 3eaf185356..8ad99b0643 100644 --- a/_locales/bs-BA/messages.json +++ b/_locales/bs-BA/messages.json @@ -1245,7 +1245,7 @@ "messageformat": "Nestajuće poruke bit će otkačene kada im istekne tajmer, a poruka će biti uklonjena iz chata." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "Uredu" + "messageformat": "U redu" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {Zakačena poruka} few {Zakačene poruke} many {Zakačenih poruka} other {Zakačene poruke}}" @@ -5628,22 +5628,22 @@ "messageformat": "Vaša historija chata ne može biti izvezena jer Signal nema dozvolu za pisanje datoteka na disk. Pokušajte promijeniti dozvole diska ili ažurirati postavke sistema, a zatim ponovo izvezite." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Izvoz sigurnosne kopije" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Izvoz sigurnosne kopije je završen" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Da vratite ovu sigurnosnu kopiju:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Prenesite folder sigurnosne kopije u pohranu telefona" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Instalirajte novu kopiju Signala na svoj telefon" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Dodirnite \"Vrati ili prenesi\" i odaberite \"Sigurnosna kopija na uređaju\"" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ikona mjeseca" @@ -7612,7 +7612,7 @@ "messageformat": "Ovo nam pomaže da saznamo više o pozivima i šta funkcioniše, a šta ne. Možete pregledati svoj zapisnik o otklanjanju grešaka prije slanja." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Slanjem povratnih informacija podijelit ćete ih sa dijagnostičkim informacijama o vašem pozivu. Opcionalno možete podijeliti zapisnik o otklanjanju grešaka kako biste nam pomogli da poboljšamo kvalitet poziva." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Podijeli zapisnik o otklanjanju grešaka" @@ -7645,7 +7645,7 @@ "messageformat": "Hvala na povratnim informacijama!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Proširite bočnu traku za interakciju s megafonom" }, "icu:WhatsNew__bugfixes": { "messageformat": "Ova verzija sadrži brojna mala poboljšanja i ispravke grešaka kako bi Signal nesmetano funkcionirao.", @@ -7679,6 +7679,6 @@ "messageformat": "Ispravili smo manju programsku grešku u prikazu indikatora podignute ruke u grupnim pozivima." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Omogućite lak pristup važnim informacijama pomoću zakačenih poruka na vrhu chata." } } diff --git a/_locales/ca/messages.json b/_locales/ca/messages.json index a2fd061098..03dcb8753a 100644 --- a/_locales/ca/messages.json +++ b/_locales/ca/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "No es pot exportar el teu historial del xat perquè Signal no té permís per crear fitxers al disc. Prova de canviar els permisos del disc o d'actualitzar els teus ajustos del sistema i, a continuació, torna a exportar." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Exportant còpia de seguretat" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Exportació de còpia de seguretat completada" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Per restaurar aquesta còpia de seguretat:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Transfereix la carpeta de còpia de seguretat a l'emmagatzematge del teu telèfon" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Instal·la una còpia nova de Signal al teu telèfon" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Toca \"Restaurar o Transferir\" i tria \"Còpies de seguretat locals\"" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Icona de lluna" @@ -7612,7 +7612,7 @@ "messageformat": "Això ens ajuda a tenir més informació sobre què funciona (o no) durant les trucades. Pots veure el registre de depuració abans d'enviar-lo." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Si ho envies, compartiràs els teus comentaris juntament amb informació de diagnòstic sobre la teva trucada. Opcionalment, pots compartir un registre de depuració per ajudar-nos a millorar la qualitat de les trucades." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Compartir registre de depuració" @@ -7645,7 +7645,7 @@ "messageformat": "Gràcies pels teus comentaris!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Expandeix la barra lateral per interactuar amb el megàfon" }, "icu:WhatsNew__bugfixes": { "messageformat": "Aquesta versió conté una sèrie de petites modificacions i correccions d'errors per tal que el Signal funcioni sense problemes.", @@ -7679,6 +7679,6 @@ "messageformat": "Hem corregit un petit error relacionat amb l'indicador de mà aixecada a les trucades grupals." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Fes que la informació important sigui fàcilment accessible amb els missatges fixats. Les preguntes que més acostumes a respondre, la reserva per anar a sopar i els teus plans per les vacances ja són sempre el primer en què penses. Ara, també poden ser la primera cosa que apareix al xat." } } diff --git a/_locales/cs/messages.json b/_locales/cs/messages.json index 0a7c86f6ef..17a1171495 100644 --- a/_locales/cs/messages.json +++ b/_locales/cs/messages.json @@ -1239,7 +1239,7 @@ "messageformat": "Pokračovat" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Připnout mizející zprávy" + "messageformat": "Připnutí mizející zprávy" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { "messageformat": "Mizející zprávy budou po vypršení časového limitu odepnuty a zpráva bude z chatu odstraněna." @@ -5628,22 +5628,22 @@ "messageformat": "Historii chatů nelze exportovat, protože Signal nemá oprávnění k zápisu souborů na disk. Zkuste změnit oprávnění disku nebo aktualizovat nastavení systému a poté export zopakujte." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Exportování zálohy" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Export zálohy dokončen" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Pokud chcete tuto zálohu obnovit:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Přeneste složky se zálohou do úložiště svého telefonu" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Nainstalujte do telefonu novou verzi aplikace Signal" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Klepněte na Obnovit nebo přenést a vyberte Záloha v zařízení" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ikona měsíce" @@ -7612,7 +7612,7 @@ "messageformat": "Pomáhá nám to zjistit více o hovorech a o tom, co funguje a co ne. Před odesláním si můžete protokol ladění zobrazit." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Odesláním sdílíte svou zpětnou vazbu a diagnostické informace o svém hovoru. Volitelně můžete sdílet protokol ladění a pomoci nám tak zlepšovat kvalitu hovorů." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Odeslat protokol ladění" @@ -7645,7 +7645,7 @@ "messageformat": "Děkujeme vám za zpětnou vazbu!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Kliknutím rozbalíte postranní panel pro interakci s megafonem" }, "icu:WhatsNew__bugfixes": { "messageformat": "Tato verze obsahuje řadu drobných vylepšení a oprav chyb, aby Signal fungoval bez problémů.", @@ -7679,6 +7679,6 @@ "messageformat": "Opravili jsme drobnou chybu v zobrazení ikony zvednuté ruky ve skupinových hovorech." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Mějte důležité informace snadno dostupné pomocí připnutých zpráv. Vaše nejčastější dotazy, rezervace večeří a plány dovolené jsou pro vás prvořadé. Teď je můžete mít na prvním místě i v chatu." } } diff --git a/_locales/da/messages.json b/_locales/da/messages.json index 405b92a837..087f7cf0bc 100644 --- a/_locales/da/messages.json +++ b/_locales/da/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Din chathistorik kan ikke eksporteres, fordi Signal ikke har tilladelse til at gemme filer på disken. Skift dine diskrettigheder eller systemindstillinger, og prøv at eksportere igen." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Eksporterer sikkerhedskopi" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Eksport af sikkerhedskopi gennemført" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Sådan gendannes denne sikkerhedskopi:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Overfør din sikkerhedskopimappe til telefonens lagerplads" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Installér en ny kopi af Signal på din mobil" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Tryk på \"Overfør eller gendan\", og vælg “Sikkerhedskopi på enhed”" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Måneikon" @@ -7612,7 +7612,7 @@ "messageformat": "Dette hjælper os med at forstå opkald bedre og se, hvad der virker, og hvad der ikke gør. Du kan se din fejlsøgningslog, før du sender den." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Når du indsender, deles din feedback sammen med diagnostiske oplysninger om dit opkald. Du kan eventuelt dele en fejlfindingslog for at hjælpe os med at forbedre opkaldskvaliteten." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Del fejlsøgningslog" @@ -7645,7 +7645,7 @@ "messageformat": "Tak for din feedback!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Udvid sidebjælken for at bruge megafonen" }, "icu:WhatsNew__bugfixes": { "messageformat": "Denne version indeholder en række småjusteringer og fejlrettelser som sikrer, at Signal kører problemfrit.", @@ -7679,6 +7679,6 @@ "messageformat": "Vi kan ikke fjerne den akavede stilhed bagefter, men vi har rettet en fejl, der nogle gange gjorde, at indikatoren for oprakt hånd blev der (med en tæller på nul), hvis nogen hurtigt hævede og sænkede hånden." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Gør vigtige oplysninger nemme at finde med fastgjorte beskeder. Dine mest stillede spørgsmål, middagsreservationer og ferieplaner er allerede det, der er øverst på huskelisten. Nu kan de også ligge øverst i chatten." } } diff --git a/_locales/de/messages.json b/_locales/de/messages.json index cecd3b857a..ab48084701 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Dein Chat-Verlauf kann nicht exportiert werden, weil Signal keine Berechtigung hat, Dateien auf die Festplatte zu schreiben. Ändere die Berechtigungen deiner Festplatte oder aktualisiere deine Systemeinstellungen und versuche dann, die Daten erneut zu exportieren." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Backup wird exportiert" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Backup-Export abgeschlossen" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Um dieses Backup wiederherzustellen:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Übertrage deinen Backup-Ordner in den Speicher deines Telefons" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Installiere eine neue Kopie von Signal auf deinem Telefon" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Tippe auf »Wiederherstellen oder Übertragen« und wähle »Backup auf dem Gerät« aus" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Mondsymbol" @@ -7612,7 +7612,7 @@ "messageformat": "So erfahren wir mehr über Anrufe und darüber, was gut läuft und was nicht. Du kannst dein Diagnoseprotokoll ansehen, bevor du es abschickst." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Mit dem Absenden teilst du dein Feedback zusammen mit der Diagnose-Information zu deinem Anruf. Du kannst optional ein Diagnoseprotokoll mit uns teilen, um uns dabei zu helfen, die Anrufqualität zu verbessern." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Diagnoseprotokoll teilen" @@ -7645,7 +7645,7 @@ "messageformat": "Danke für dein Feedback!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Die Seitenleiste aufklappen, um mit dem Menü zu interagieren" }, "icu:WhatsNew__bugfixes": { "messageformat": "Diese Version enthält eine Reihe kleinerer Optimierungen und Fehlerbehebungen, damit Signal weiterhin reibungslos funktioniert.", @@ -7679,6 +7679,6 @@ "messageformat": "Wir haben einen Fehler behoben, der manchmal dazu führte, dass die „Gehobene Hand“-Ansicht sichtbar blieb (mit Zählstand Null), wenn jemand seine Hand sehr schnell hob und wieder senkte – leider war es uns nicht möglich, die peinliche Stille aufzulösen, die dabei entstehen kann." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Mit fixierten Nachrichten hast du wichtige Infos immer griffbereit. Deine am häufigsten gestellten Fragen, Tischreservierungen und Urlaubspläne stehen schon ganz oben auf deiner Liste. Jetzt kannst du sie auch ganz oben im Chat fixieren." } } diff --git a/_locales/el/messages.json b/_locales/el/messages.json index 2bc0cb0915..3af0292d1f 100644 --- a/_locales/el/messages.json +++ b/_locales/el/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Δεν είναι δυνατή η εξαγωγή του ιστορικού συνομιλιών σου επειδή το Signal δεν έχει άδεια εγγραφής αρχείων στον δίσκο. Δοκίμασε να αλλάξεις τα δικαιώματα του δίσκου σου ή να ενημερώσεις τις ρυθμίσεις του συστήματός σου και, στη συνέχεια, επανάλαβε την εξαγωγή." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Εξαγωγή αντιγράφου ασφαλείας" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Η εξαγωγή αντιγράφου ασφαλείας ολοκληρώθηκε" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Για να επαναφορά αυτού του αντίγραφου ασφαλείας:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Μετάφερε τον φάκελο αντιγράφων ασφαλείας στον χώρο αποθήκευσης του τηλεφώνου σου" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Κάνε εγκατάσταση ενός νέου αντίγραφου του Signal στο τηλέφωνό σου" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Πάτα «Επαναφορά ή Μεταφορά» και επίλεξε «Δημιουργία αντιγράφων ασφαλείας στη συσκευή»" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Εικονίδιο φεγγαριού" @@ -7612,7 +7612,7 @@ "messageformat": "Αυτό μας βοηθά να μάθουμε περισσότερα για τις κλήσεις και τι λειτουργεί ή δεν λειτουργεί. Μπορείς να δεις το αρχείο καταγραφής αποσφαλμάτωσης πριν από την υποβολή." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Με την υποβολή θα μοιραστείς τα σχόλιά σου μαζί με διαγνωστικές πληροφορίες σχετικά με την κλήση σου. Μπορείς προαιρετικά να κοινοποιήσεις ένα αρχείο καταγραφής αποσφαλμάτωσης για να μας βοηθήσεις να βελτιώσουμε την ποιότητα των κλήσεων." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Κοινή χρήση αρχείου καταγραφής αποσφαλμάτωσης" @@ -7645,7 +7645,7 @@ "messageformat": "Ευχαριστούμε για τα σχόλιά σου!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Ανάπτυξη της πλαϊνής μπάρας για αλληλεπίδραση με το μεγάφωνο" }, "icu:WhatsNew__bugfixes": { "messageformat": "Αυτή η έκδοση περιλαμβάνει διάφορες μικρές βελτιώσεις και αποσφαλματώσεις για να συνεχίσει το Signal να λειτουργεί ομαλά.", @@ -7679,6 +7679,6 @@ "messageformat": "Διορθώσαμε ένα μικρό σφάλμα στην οθόνη με την ένδειξη σηκωμένου χεριού στις ομαδικές κλήσεις." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Τα καρφιτσωμένα μηνύματα μπορούν να σε βοηθήσουν να διατηρήσεις τις σημαντικές πληροφορίες εύκολα προσβάσιμες στην κορυφή μιας συνομιλίας. Οι πιο συχνές ερωτήσεις, οι κρατήσεις για δείπνο και τα προγράμματα διακοπών σου είναι ήδη στο κεφάλι σου. Τώρα μπορούν να είναι και στην κορυφή της συζήτησης.\n\n" } } diff --git a/_locales/es/messages.json b/_locales/es/messages.json index 68b2c7bb37..8b9add23d0 100644 --- a/_locales/es/messages.json +++ b/_locales/es/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "No se puede exportar tu historial de chat porque Signal no tiene permiso para generar archivos en tu almacenamiento. Actualiza tus ajustes del sistema para cambiar los permisos de tu almacenamiento y vuelve a intentarlo." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Exportando copia de seguridad" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Exportación de copia de seguridad completada" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Para restaurar esta copia de seguridad:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Transfiere tu carpeta de copia de seguridad al almacenamiento de tu teléfono." }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Vuelve a instalar Signal en tu teléfono." }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Toca \"Restaurar o transferir\" y elige \"Copias de seguridad locales\"." }, "icu:NotificationProfile--moon-icon": { "messageformat": "Icono de luna" @@ -7612,7 +7612,7 @@ "messageformat": "Tu opinión nos ayuda a saber qué funciona y qué falla durante las llamadas. Puedes ver tu registro de depuración antes de enviarlo." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Si seleccionas Enviar, se compartirán tus comentarios junto con la información de diagnóstico de tu llamada. De manera opcional, puedes compartir tu registro de depuración para ayudarnos a mejorar la calidad de las llamadas." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Compartir registro de depuración" @@ -7645,7 +7645,7 @@ "messageformat": "¡Gracias por tus comentarios!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Expande la barra lateral para interactuar con el megáfono" }, "icu:WhatsNew__bugfixes": { "messageformat": "Esta versión incluye una series de ajustes y correcciones de errores para que Signal funcione sin problemas.", @@ -7679,6 +7679,6 @@ "messageformat": "No podemos arreglar los silencios incómodos en las llamadas grupales, pero sí hemos corregido un error que hacía que el indicador de \"mano levantada\" quedara visible (con un conteo de cero) si alguien levantaba y bajaba la mano muy rápido." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Mantén la información importante siempre accesible con los mensajes fijados. ¿Tu lista de pendientes de la semana o los planes de vacaciones ya son lo primero en lo que piensas? Ahora también pueden ser lo primero que aparezca en tus chats." } } diff --git a/_locales/et-EE/messages.json b/_locales/et-EE/messages.json index 228912bdac..f15f171c71 100644 --- a/_locales/et-EE/messages.json +++ b/_locales/et-EE/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Sinu vestlusajalugu ei saa eksportida, kuna Signalil pole luba kettale faile kirjutada. Proovi muuta oma ketta õigusi või värskendada süsteemi sätteid ja seejärel ekspordi uuesti." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Varukoopia eksportimine" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Varukoopia eksport on lõpule viidud" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Selle varukoopia taastamiseks toimi järgmiselt." }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Edasta oma varukoopiate kaust oma telefoni mälusse" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Paigalda telefoni uus Signali versioon" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Toksa valikut „Taasta või edasta“ ja vali „Varundamine seadmes“" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Kuu ikoon" @@ -7612,7 +7612,7 @@ "messageformat": "See aitab meil kõnede kohta rohkem teada saada ja mõista, mis toimib ja mis mitte. Enne esitamist saad oma silumislogi vaadata." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Esitades jagad oma tagasisidet ja diagnostilist teavet oma kõne kohta. Soovi korral saad jagada silumislogi, mis aitab meil kõnede kvaliteeti parandada." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Jaga silumislogi" @@ -7645,7 +7645,7 @@ "messageformat": "Täname tagasiside eest!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Megafoniga suhtlemiseks laienda külgriba" }, "icu:WhatsNew__bugfixes": { "messageformat": "See versioon sisaldab paljusid väikseid parendusi, mis Signali sujuvalt käimas.", @@ -7679,6 +7679,6 @@ "messageformat": "Parandasime grupivestluses käe tõstmise kuvamisvea." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Esiletõstetud sõnumite abil on oluline teave hõlpsasti leitav vestluse ülaosas." } } diff --git a/_locales/eu/messages.json b/_locales/eu/messages.json index 6a1f80bad2..1263aba62e 100644 --- a/_locales/eu/messages.json +++ b/_locales/eu/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Ezin da esportatu txat-historia, Signal-ek ez daukalako fitxategiak diskoan idazteko baimenik. Saiatu diskoaren baimenak edo eguneratu sistema-ezarpenak, eta saiatu berriro." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Babeskopia esportatzen" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Esportatu da babeskopia" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Babeskopia leheneratzeko:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Transferitu babeskopien karpeta telefonoaren biltegira" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Instalatu Signal-en kopia berri bat telefonoan" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Sakatu \"Leheneratu edo transferitu\" eta aukeratu \"Gailuko babeskopia\"" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ilargi-ikonoa" @@ -7612,7 +7612,7 @@ "messageformat": "Horrela, deiei buruzko informazio gehiago lortu, eta zerk funtzionatzen duen eta zerk funtzionatzen ez duen jakingo dugu. Bidali aurretik, arazketa-erregistroa ikusi ahalko duzu." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Bidaliz gero, iritzia eta deiari buruzko diagnostiko-informazioa bidaliko dira. Nahi baduzu, arazketa-erregistro bat parteka dezakezu, deien kalitatea hobetzen lagun diezagun." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Partekatu arazketa-erregistroa" @@ -7645,7 +7645,7 @@ "messageformat": "Eskerrik asko iritziarengatik!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Zabaldu alboko barra megafonoarekin interakzioan jarduteko" }, "icu:WhatsNew__bugfixes": { "messageformat": "Bertsio honek hainbat doikuntza txiki eta akats konpontzen ditu Signal-ek ondo funtzionatzen jarraitzeko.", @@ -7679,6 +7679,6 @@ "messageformat": "Taldeko deietan eskua jasotzean agertzen zen bistaratze-akats txiki bat konpondu dugu." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Mezu ainguratuekin, informazio garrantzitsua eskura izan dezakezu txaten goialdean." } } diff --git a/_locales/fa-IR/messages.json b/_locales/fa-IR/messages.json index 0df99706da..2969ee21ed 100644 --- a/_locales/fa-IR/messages.json +++ b/_locales/fa-IR/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "امکان صدور تاریخچه گفتگوی شما وجود ندارد زیرا سیگنال اجازه نوشتن فایل‌ها روی دیسک را ندارد. مجوزهای دیسک خود را تغییر دهید یا تنظیمات سیستم خود را به‌روزرسانی کنید و سپس دوباره صادر کنید." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "در حال خروجی گرفتن از نسخه پشتیبان" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "خروجی نسخه پشتیبان تکمیل شد" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "برای بازیابی این نسخه پشتیبان:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "پوشه پشتیبان خود را به فضای ذخیره‌سازی تلفنتان انتقال دهید" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "نسخه جدید سیگنال را در تلفنتان نصب کنید" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "روی «بازیابی یا انتقال» ضربه بزنید و «پشتیبان‌گیری در دستگاه» را انتخاب کنید" }, "icu:NotificationProfile--moon-icon": { "messageformat": "آیکون ماه" @@ -7612,7 +7612,7 @@ "messageformat": "این به ما کمک می‌کند درباره تماس‌ها و نقاط قوت و ضعف آن‌ها بیشتر بدانیم. می‌توانید قبل از ارسال، گزارش اشکال‌زدایی خود را ببینید." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "با ارسال، بازخوردتان همراه با اطلاعات عیب‌یابی درباره تماستان هم‌رسانی خواهد شد. همچنین می‌توانید با ارسال اختیاری گزارش اشکال‌زدایی، به ما کمک کنید کیفیت تماس را بهبود دهیم." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "هم‌رسانی گزارش اشکال‌زدایی" @@ -7645,7 +7645,7 @@ "messageformat": "از بازخورد شما متشکریم!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "گسترش نوار کناری برای تعامل با بلندگو" }, "icu:WhatsNew__bugfixes": { "messageformat": "این نسخه شامل شماری از بهینه سازی های کوچک و رفع عیب برای تداوم اجرای راحت سیگنال می باشد", @@ -7679,6 +7679,6 @@ "messageformat": "اشکال جزئی در نمایش را برطرف کردیم که در نشانگر دست‌بالا‌بردن در تماس‌های گروهی وجود داشت." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "سنجاق کردن پیام‌ها راهی برای کمک به تسهیل دسترسی به اطلاعات مهم. پرسش‌های پرتکرار، رزروهای شام، و برنامه‌های سفرتان را می‌توانید همیشه به خاطر بسپرید. حالا می‌توانند در بالای گفتگو هم بمانند." } } diff --git a/_locales/fi/messages.json b/_locales/fi/messages.json index 475bcf7c78..c99ccb8f73 100644 --- a/_locales/fi/messages.json +++ b/_locales/fi/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Keskusteluhistoriaa ei voida viedä, koska Signalilla ei ole oikeutta kirjoittaa tiedostoja levylle. Kokeile muuttaa levyn käyttöoikeuksia tai päivitä järjestelmäasetukset ja vie sitten uudelleen." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Viedään varmuuskopiota" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Varmuuskopion vienti valmis" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Näin palautat varmuuskopion:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Siirrä varmuuskopiokansio puhelimesi tallennustilaan" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Asenna puhelimeesi uusi kopio Signalista" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Napauta ”Palauta tai siirrä” ja valitse ”Varmuuskopio laitteessa”." }, "icu:NotificationProfile--moon-icon": { "messageformat": "Kuun kuvake" @@ -7612,7 +7612,7 @@ "messageformat": "Tämä auttaa meitä oppimaan lisää puheluista ja siitä, mikä toimii tai ei toimi. Voit tarkastella virheenkorjauslokia ennen lähettämistä." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Lähettämällä jaat palautteesi sekä puhelusi diagnostiikkatietoja. Voit halutessasi jakaa vianetsintälokin, joka auttaa meitä parantamaan puheluiden laatua." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Jaa vianetsintäloki" @@ -7645,7 +7645,7 @@ "messageformat": "Kiitos palautteestasi!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Voit olla vuorovaikutuksessa megafonin kanssa laajentamalla sivupalkkia" }, "icu:WhatsNew__bugfixes": { "messageformat": "Tämä versio sisältää useita pieniä parannuksia ja virhekorjauksia, jotka pitävät Signalin toiminnan sujuvana.", @@ -7679,6 +7679,6 @@ "messageformat": "Korjasimme pienen virheen käden noston ilmaisimessa ryhmäkeskusteluissa." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Pidä tärkeät tiedot helposti saatavilla kiinnitetyillä viesteillä. Useimmin kysytyt kysymykset, illallisvaraukset ja lomasuunnitelmat ovat mielen päällä jo muutenkin. Nyt voit pitää ne myös keskustelujen kärjessä." } } diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index 8337ed8d7d..6c56f2f121 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Impossible d'exporter l'historique de vos conversations, car vous n'avez pas autorisé Signal à enregistrer des fichiers sur votre ordinateur. Modifiez les autorisations de votre ordinateur ou les paramètres système, puis réessayez." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Exportation de la sauvegarde" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Exportation de la sauvegarde terminée" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Pour restaurer cette sauvegarde :" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Déplacez votre dossier de sauvegarde vers l'espace de stockage de votre téléphone." }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Réinstallez Signal sur votre téléphone." }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Appuyez sur \"Restaurer ou transférer le compte\", puis sélectionnez \"Sauvegarde sur l'appareil\"." }, "icu:NotificationProfile--moon-icon": { "messageformat": "Icône lune" @@ -7612,7 +7612,7 @@ "messageformat": "Vos retours nous permettent de comprendre ce qui fonctionne et ce que nous devons améliorer. Vous pouvez consulter votre journal de débogage avant de nous l'envoyer." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Lorsque vous nous envoyez vos commentaires, ceux-ci sont accompagnés d'informations de diagnostic sur votre appel. Vous pouvez également partager votre journal de débogage pour nous aider à améliorer la qualité des appels." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Partager le journal de débogage" @@ -7645,7 +7645,7 @@ "messageformat": "Merci pour vos commentaires !" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Développer la barre latérale pour interagir avec le mégaphone" }, "icu:WhatsNew__bugfixes": { "messageformat": "Dans cette version, nous avons apporté quelques ajustements et corrigé de petits bugs. Pour que votre messagerie préférée continue de fonctionner comme sur des roulettes.", @@ -7679,6 +7679,6 @@ "messageformat": "Lorsqu'un participant levait puis baissait la main très rapidement pendant un appel de groupe, le compteur de mains levées restait parfois visible (et affichait zéro). Un bug que nos équipes ont corrigé haut la main !" }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Grâce aux messages épinglés, les informations importantes restent facilement accessibles. L'organisation des vacances et l'ordre du jour de votre prochaine AG sont en haut de votre liste de priorités ? Ils peuvent aussi s'afficher en haut de vos conversations." } } diff --git a/_locales/ga-IE/messages.json b/_locales/ga-IE/messages.json index b7625134a2..9b598ca322 100644 --- a/_locales/ga-IE/messages.json +++ b/_locales/ga-IE/messages.json @@ -1239,10 +1239,10 @@ "messageformat": "Ar aghaidh" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "Greamú teachtaireachtaí sealadacha" + "messageformat": "Pionnáil teachtaireachtaí sealadacha" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "Déanfar teachtaireachtaí sealadacha a dhíghreamú nuair a bheidh a n-amadóir istigh agus nuair a bhainfear an teachtaireacht den chomhrá." + "messageformat": "Déanfar teachtaireachtaí sealadacha a dhíphionnáil nuair a bheidh a n-amadóir istigh agus nuair a bhainfear an teachtaireacht den chomhrá." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { "messageformat": "Tá go maith" @@ -5628,22 +5628,22 @@ "messageformat": "Ní féidir do stair comhráite a easpórtáil toisc nach bhfuil cead ag Signal comhaid a scríobh chuig an diosca. Triail ceadanna do dhiosca a athrú nó socruithe do chórais a nuashonrú agus ansin déan an easpórtáil arís." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Cúltaca á easpórtáil" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Easpórtáil an chúltaca críochnaithe" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Leis an gcúltaca sin a aischur:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Aistrigh fillteán do chúltacaí chuig stóras do ghutháin" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Suiteáil cóip nua de Signal ar do ghuthán" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Tapáil \"Aischuir nó Aistrigh\" agus roghnaigh \"Cúltacaigh ar an nGléas\"" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Deilbhín na gealaí" @@ -7612,7 +7612,7 @@ "messageformat": "Cabhraíonn sé seo linn tuilleadh a fhoghlaim faoina bhfuil ag obair agus nach bhfuil. Is féidir leat féachaint ar do loga dífhabhtaithe sula gcuireann tú isteach é." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Trína chur isteach, comhroinnfear d'aiseolas mar aon le faisnéis dhiagnóiseach faoi do ghlao. Is féidir leat loga dífhabhtaithe a chomhroinnt le cabhrú linn cáilíocht glaonna a fheabhsú." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Comhroinn an loga dífhabhtaithe" @@ -7645,7 +7645,7 @@ "messageformat": "Go raibh maith agat as d'aiseolas!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Fairsingigh an taobh-bharra le hidirghníomhú leis an meigeafón" }, "icu:WhatsNew__bugfixes": { "messageformat": "Tá roinnt mionathruithe agus paistí ar fhabhtanna sa leagan seo chun Signal a choinneáil ag rith go réidh.", @@ -7679,6 +7679,6 @@ "messageformat": "Réitíomar fabht beag taispeána le táscaire na láimhe ardaithe i ngrúpghlaonna." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Cabhraigh le faisnéis thábhachtach a choinneáil sorochtana le teachtaireachtaí pionnáilte. Is iad do cheisteanna is mó cur, áirithintí dinnéir agus cúrsaí taistil na clocha is mó ar do phaidrín. Is féidir leo a bheith ar na cinn is mó ar do chomhrá freisin." } } diff --git a/_locales/gl-ES/messages.json b/_locales/gl-ES/messages.json index f1c57c657f..cb42a80498 100644 --- a/_locales/gl-ES/messages.json +++ b/_locales/gl-ES/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Non se pode exportar o historal do chat porque Signal non ten permiso para crear ficheiros no disco. Proba a cambiar os permisos do disco ou a actualizar a configuración do sistema e tenta exportalo de novo." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Exportando copia de seguranza" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Exportación da copia de seguranza completada" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Para restaurar esta copia de seguranza é necesario:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Transferir o arquivo de copia de seguranza ao almacenamento do teléfono" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Instalar unha nova copia de Signal no teléfono" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Premer «Restaurar ou transferir» e escoller «Copia de seguranza no dispositivo»" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Icona de lúa" @@ -7612,7 +7612,7 @@ "messageformat": "Isto axúdanos a aprender máis sobre as chamadas e sobre o que funciona ou non funciona. Podes ver o teu rexistro de depuración antes de envialo." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "O envío compartirá os teus comentarios e a información do diagnóstico sobre a túa chamada. Tamén podes compartir de forma opcional un rexistro de depuración para axudarnos a mellorar a calidade da chamada." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Compartir rexistro de depuración" @@ -7645,7 +7645,7 @@ "messageformat": "Grazas pola túa observación!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Expandir a barra lateral para interactuar co megáfono" }, "icu:WhatsNew__bugfixes": { "messageformat": "Esta versión contén pequenos arranxos e reparacións que fan que Signal funcione sen problemas.", @@ -7679,6 +7679,6 @@ "messageformat": "Corriximos un pequeno erro na forma en que se mostraba o indicador de man alzada nas chamadas de grupo." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "As mensaxes fixadas na parte superior da conversa poden axudarche a acceder facilmente á información importante." } } diff --git a/_locales/gu-IN/messages.json b/_locales/gu-IN/messages.json index 54f6fff4c4..87827f230f 100644 --- a/_locales/gu-IN/messages.json +++ b/_locales/gu-IN/messages.json @@ -1245,7 +1245,7 @@ "messageformat": "ગાયબ થતાં મેસેજનું ટાઇમર સમાપ્ત થઈ ગયા પછી તે અનપિન થઈ જશે અને મેસેજ ચેટમાંથી દૂર થઈ જશે." }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { - "messageformat": "બરાબર" + "messageformat": "ઓકે" }, "icu:PinnedMessagesBar__AccessibilityLabel": { "messageformat": "{pinsCount, plural, one {પિન કરેલો મેસેજ} other {પિન કરેલા મેસેજ}}" @@ -5628,22 +5628,22 @@ "messageformat": "તમારી ચેટ હિસ્ટ્રી નિકાસ કરી શકાતી નથી કારણ કે Signal પાસે ડિસ્ક પર ફાઇલો લખવાની પરવાનગી નથી. તમારી ડિસ્કની પરવાનગીઓ બદલવાનો અથવા તમારી સિસ્ટમ સેટિંગ્સ અપડેટ કરવાનો પ્રયાસ કરો અને પછી ફરીથી નિકાસ કરો." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "બેકઅપ એક્સપોર્ટ કરી રહ્યાં છીએ" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "બેકઅપ એક્સપોર્ટ પૂર્ણ" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "આ બેકઅપ રિસ્ટોર કરવા:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "તમારા બેકઅપ ફોલ્ડરને તમારા ફોનના સ્ટોરેજમાં ટ્રાન્સફર કરો" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "તમારા ફોન પર Signalની નવી કૉપિ ઇન્સ્ટોલ કરો" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "\"રિસ્ટોર અથવા ટ્રાન્સફર કરો\" પર ટેપ કરો અને \"ડિવાઇસ પર બેકઅપ\" પસંદ કરો" }, "icu:NotificationProfile--moon-icon": { "messageformat": "ચંદ્રનો આઇકન" @@ -6006,7 +6006,7 @@ "messageformat": "છેલ્લું બેકઅપ" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "ક્યારેય નહિ" + "messageformat": "ક્યારેય નહીં" }, "icu:Preferences__local-backups-backup-now": { "messageformat": "હમણાં બેકઅપ લો" @@ -7612,7 +7612,7 @@ "messageformat": "આનાથી અમને કૉલ અને શું કામ કરી રહ્યું છે અને શું નથી કરી રહ્યું તે વિશે વધુ જાણવામાં મદદ મળે છે. સબમિટ કરતા પહેલાં તમે તમારો ડીબગ લૉગ જોઈ શકો છો." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "સબમિટ કરવાથી તમારા કૉલ વિશે ડાયગ્નોસ્ટિક માહિતીની સાથે તમારો પ્રતિસાદ શેર કરવામાં આવશે. કૉલ ગુણવત્તા સુધારવામાં અમારી સહાય માટે તમે વૈકલ્પિક રીતે ડીબગ લૉગ શેર કરી શકો છો." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "ડીબગ લૉગ શેર કરો" @@ -7645,7 +7645,7 @@ "messageformat": "તમારા પ્રતિભાવ બદલ આભાર!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "મેગાફોન સાથે ક્રિયાપ્રતિક્રિયા કરવા માટે સાઇડબાર મોટું કરો" }, "icu:WhatsNew__bugfixes": { "messageformat": "આ વર્ઝનમાં Signalને સરસ રીતે ચાલતું રાખવા માટે નાના ફેરફારો અને ભૂલ સુધાર શામેલ છે.", @@ -7679,6 +7679,6 @@ "messageformat": "અમે ગ્રૂપ કૉલમાં હાથ ઊંચા કરવાના સૂચક સાથે એક નાના ડિસ્પ્લે બગને સુધાર્યો છે." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "પિન કરેલા મેસેજ તમને ચેટની ટોચ પર મહત્ત્વપૂર્ણ માહિતીને સરળતાથી સુલભ રાખવામાં મદદ કરી શકે છે." } } diff --git a/_locales/he/messages.json b/_locales/he/messages.json index 45f2e0f956..60954f1140 100644 --- a/_locales/he/messages.json +++ b/_locales/he/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "לא ניתן לייצא את היסטוריית הצ'אט כי ל–Signal אין הרשאה לכתוב קבצים לדיסק. כדאי לשנות את הרשאות הדיסק או לעדכן את הגדרות המערכת שלך ולנסות לייצא שוב." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "ייצוא גיבוי" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "ייצוא הגיבוי הושלם" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "לשחזור גיבוי זה:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "העברת תיקיית הגיבוי לאחסון המכשיר" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "התקנת עותק חדש של Signal במכשיר" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "לחץ/י על ״שחזור או העברה״ ובחר/י ״גיבוי במכשיר״" }, "icu:NotificationProfile--moon-icon": { "messageformat": "סמל ירח" @@ -7612,7 +7612,7 @@ "messageformat": "זה עוזר לנו להבין טוב יותר שיחות ומה עובד או לא עובד. אפשר לראות את יומן ניפוי הבאגים שלך לפני ההגשה." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "שליחה תשתף משוב יחד עם מידע טכני על השיחה. ניתן לשתף יומן ניפוי באגים כדי לסייע בשיפור איכות השיחה." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "שיתוף יומן ניפוי באגים" @@ -7645,7 +7645,7 @@ "messageformat": "תודה על המשוב!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "יש להרחיב את הסרגל הצדדי לאינטראקציה עם המגפון" }, "icu:WhatsNew__bugfixes": { "messageformat": "גרסה זו מכילה מספר של שפצורים קטנים ותיקוני תקלים כדי לשמור על Signal שירוץ באופן חלק.", @@ -7679,6 +7679,6 @@ "messageformat": "תיקנו באג קטן בתצוגה של מחוון היד המורמת בשיחות קבוצתיות." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "הודעות מוצמדות מסייעות לשמור על מידע חשוב נגיש בקלות בראש הצ׳אט." } } diff --git a/_locales/hi-IN/messages.json b/_locales/hi-IN/messages.json index 2f1e2a9f93..3bb25882f9 100644 --- a/_locales/hi-IN/messages.json +++ b/_locales/hi-IN/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "आपकी पुरानी चैट एक्सपोर्ट नहीं की जा सकी, क्योंकि Signal के पास फ़ाइलों को डिस्क पर सेव करने की अनुमति नहीं है। अपने डिस्क की अनुमतियां बदलकर या सिस्टम सेटिंग अपडेट करके फिर से एक्सपोर्ट करने की कोशिश करें।" }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "बैकअप एक्सपोर्ट किया जा रहा है" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "बैकअप एक्सपोर्ट पूरा हुआ" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "इस बैकअप को रीस्टोर करने के लिए:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "अपने बैकअप फ़ोल्डर को अपने फ़ोन के स्टोरेज में ट्रांसफ़र करें" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "अपने फ़ोन पर Signal की एक नई कॉपी इंस्टॉल करें" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "'रीस्टोर या ट्रांसफ़र करें' पर टैप करें और 'ऑन-डिवाइस बैकअप' चुनें" }, "icu:NotificationProfile--moon-icon": { "messageformat": "चंद्रमा वाला आइकन" @@ -6009,7 +6009,7 @@ "messageformat": "कभी नहीं" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "अभी बैकअप लें।" + "messageformat": "अभी बैकअप लें" }, "icu:Preferences__local-backups-folder": { "messageformat": "बैकअप फ़ोल्डर" @@ -7612,7 +7612,7 @@ "messageformat": "इससे हमें कॉल के बारे में ज़्यादा जानकारी पाने और यह समझने में मदद मिलती है कि क्या काम कर रहा है और क्या नहीं। सबमिट करने से पहले आपके पास अपना डीबग लॉग देखने का विकल्प होता है।" }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "सबमिट करने पर आपका फ़ीडबैक और आपकी कॉल से जुड़ी समस्या की जानकारी भी शेयर हो जाएगी। कॉल की क्वालिटी को बेहतर बनाने में हमारी मदद करने के लिए, आप चाहें तो डीबग लॉग भी शेयर करें।" }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "डीबग लॉग शेयर करें" @@ -7645,7 +7645,7 @@ "messageformat": "आपके फ़ीडबैक के लिए शुक्रिया!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "मेगाफ़ोन इस्तेमाल करने के लिए साइडबार को बड़ा करें" }, "icu:WhatsNew__bugfixes": { "messageformat": "इस वर्ज़न में बग ठीक करने के साथ-साथ कई छोटे-छोटे बदलाव किए गए हैं, जिससे Signal की परफ़ॉर्मेंस और बेहतर हो सके।", @@ -7679,6 +7679,6 @@ "messageformat": "मीटिंग में हाथ उठते ही अचानक पैदा होने वाली खामोशी को तो हम ठीक नहीं कर सकते, लेकिन हमने एक गड़बड़ी ज़रूर ठीक कर दी है। इसमें कोई अगर बहुत जल्दी हाथ उठाकर नीचे कर देता था, तब भी हाथ उठाने का संकेत स्क्रीन पर मौजूद रहता था और उसकी गिनती शून्य दिखाई देती थी।" }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "ज़रूरी जानकारी तक तुरंत व आसान पहुंच के लिए मैसेज पिन करके रखें। आपके ज़रूरी सवाल, डिनर की बुकिंग, और ट्रिप के प्लान जैसी बातें हमेशा आपके मन में टॉप पर रहती हैं। अब इन्हें चैट में भी टॉप पर देखने का विकल्प आपके पास है।" } } diff --git a/_locales/hr-HR/messages.json b/_locales/hr-HR/messages.json index f27760c70f..29c378f09c 100644 --- a/_locales/hr-HR/messages.json +++ b/_locales/hr-HR/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Vaša povijest razgovora ne može se izvesti jer Signal nema dopuštenje za zapisivanje datoteka na disk. Pokušajte promijeniti dozvole diska ili ažurirati postavke sustava, a zatim ponovno pokušajte s izvozom." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Izvoz sigurnosne kopije" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Izvoz sigurnosne kopije je dovršen" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Za vraćanje podataka iz sigurnosne kopije:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Prenesite mapu sigurnosne kopije u prostor za pohranu vašeg telefona" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Instalirajte novu verziju Signala na vaš telefon" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Dodirnite „Vrati ili prenesi“ i odaberite „Sigurnosna kopija na uređaju“" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ikona mjeseca" @@ -7612,7 +7612,7 @@ "messageformat": "Vaše povratne informacije pomažu nam poboljšati pozive na Signalu. Možete pregledati zapisnik otklanjanja pogreške prije slanja." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Slanjem ćete podijeliti svoje povratne informacije zajedno s dijagnostičkim informacijama o vašem pozivu. Po želji možete podijeliti zapisnik otklanjanja pogreške kako biste nam pomogli poboljšati kvalitetu poziva." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Podijeli zapisnik otklanjanja pogreške" @@ -7645,7 +7645,7 @@ "messageformat": "Hvala na povratnim informacijama!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Proširite bočnu traku za interakciju s megafonom" }, "icu:WhatsNew__bugfixes": { "messageformat": "Ova verzija Signala sadrži niz malih podešavanja i ispravaka programskih pogrešaka za nesmetano korištenje aplikacije.", @@ -7679,6 +7679,6 @@ "messageformat": "Ispravili smo manju programsku pogrešku u prikazu indikatora podignute ruke u grupnim pozivima." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Prikvačite poruke na vrh razgovora za jednostavan pristup važnim informacijama." } } diff --git a/_locales/id/messages.json b/_locales/id/messages.json index 28925d30df..0c312d4e08 100644 --- a/_locales/id/messages.json +++ b/_locales/id/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Riwayat chat Anda tidak dapat diekspor karena Signal tidak memiliki izin untuk menulis file ke disk. Coba ubah izin disk Anda atau perbarui pengaturan sistem dan kemudian ekspor lagi." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Mengekspor cadangan" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Ekspor cadangan selesai" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Untuk memulihkan cadangan ini:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Transfer folder cadangan ke penyimpanan ponsel" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Instal Signal versi terbaru di ponsel" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Ketuk “Pulihkan atau Transfer” dan pilih “Cadangan di Perangkat”" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ikon bulan" @@ -7612,7 +7612,7 @@ "messageformat": "Ini akan membantu kami mempelajari lebih lanjut kualitas panggilan serta mengetahui apa yang berfungsi dengan baik dan apa yang bermasalah. Anda dapat melihat catatan debug sebelum mengirim." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Dengan mengirim ini, Anda akan memberikan masukan lengkap dengan informasi diagnostik terkait panggilan Anda. Anda bebas menentukan ingin berbagi catatan debug atau tidak untuk membantu kami meningkatkan kualitas panggilan." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Bagikan catatan debug" @@ -7645,7 +7645,7 @@ "messageformat": "Terima kasih atas masukannya!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Perluas panel samping untuk berinteraksi dengan megafon" }, "icu:WhatsNew__bugfixes": { "messageformat": "Versi ini mengandung sejumlah perubahan kecil dan perbaikan bug agar Signal tetap berjalan lancar.", @@ -7679,6 +7679,6 @@ "messageformat": "Hening sejenak saat ngobrol memang tak bisa kami tanggulangi, tapi kami telah memperbaiki bug ringan yang kadang terjadi pada indikator angkat tangan selama panggilan grup." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Fitur sematkan pesan membantu memastikan informasi penting bisa diakses dengan mudah. Hal-hal yang sering ditanyakan, reservasi restoran, dan rencana liburan kadang tenggelam dalam chat grup. Sekarang Anda juga bisa menempatkannya di urutan teratas susunan chat." } } diff --git a/_locales/it/messages.json b/_locales/it/messages.json index 8ccaaed4a4..d82bceca53 100644 --- a/_locales/it/messages.json +++ b/_locales/it/messages.json @@ -1191,7 +1191,7 @@ "messageformat": "Abbandona" }, "icu:ConversationHeader__CannotLeaveGroupBecauseYouAreLastAdminAlert__description": { - "messageformat": "Prima di abbandonare il gruppo, devi scegliere almeno un nuovo amministratore." + "messageformat": "Prima di abbandonare il gruppo, devi scegliere almeno un nuovo admin." }, "icu:PinnedMessageNotification__Message--You": { "messageformat": "Hai messo in evidenza un messaggio" @@ -1314,10 +1314,10 @@ "messageformat": "Messaggi in evidenza" }, "icu:PinnedMessagesPanel__UnpinAllMessages": { - "messageformat": "Rimuovi tutti i messaggi in evidenza" + "messageformat": "Rimuovi i messaggi in evidenza" }, "icu:PinnedMessagesPanel__UnpinAllMessages__ConfirmDialog__Title": { - "messageformat": "Rimuovere tutti i messaggi in evidenza?" + "messageformat": "Rimuovere i messaggi in evidenza?" }, "icu:PinnedMessagesPanel__UnpinAllMessages__ConfirmDialog__Description": { "messageformat": "I messaggi non appariranno più in evidenza per i membri di questa chat." @@ -1596,10 +1596,10 @@ "messageformat": "Messaggi non letti da tutte le chat" }, "icu:Preferences__ChatFoldersPage__SuggestedFoldersSection__DirectChatsFolder__Title": { - "messageformat": "Chat singole" + "messageformat": "Chat individuali" }, "icu:Preferences__ChatFoldersPage__SuggestedFoldersSection__DirectChatsFolder__Description": { - "messageformat": "Solo messaggi da chat singole" + "messageformat": "Solo messaggi da chat individuali" }, "icu:Preferences__ChatFoldersPage__SuggestedFoldersSection__GroupChatsFolder__Title": { "messageformat": "Gruppi" @@ -1626,7 +1626,7 @@ "messageformat": "Scegli le chat che vuoi vedere in questa cartella" }, "icu:Preferences__EditChatFolderPage__IncludedChatsSection__DirectChats": { - "messageformat": "Chat singole" + "messageformat": "Chat individuali" }, "icu:Preferences__EditChatFolderPage__IncludedChatsSection__GroupChats": { "messageformat": "Chat di gruppo" @@ -1647,7 +1647,7 @@ "messageformat": "Tipi di chat" }, "icu:Preferences__EditChatFolderPage__SelectChatsDialog__ChatTypesSection__DirectChats": { - "messageformat": "Chat singole" + "messageformat": "Chat individuali" }, "icu:Preferences__EditChatFolderPage__SelectChatsDialog__ChatTypesSection__GroupChats": { "messageformat": "Gruppi" @@ -2196,31 +2196,31 @@ "messageformat": "Per inviare un messaggio, sblocca questo gruppo." }, "icu:youChangedTheTimer": { - "messageformat": "Hai impostato il timer dei messaggi a scomparsa a {time}." + "messageformat": "Hai impostato il timer dei messaggi temporanei a {time}." }, "icu:timerSetOnSync": { - "messageformat": "Timer dei messaggi a scomparsa aggiornato a {time}." + "messageformat": "Timer dei messaggi temporanei aggiornato a {time}." }, "icu:timerSetByMember": { - "messageformat": "Un membro ha impostato il timer dei messaggi a scomparsa a {time}." + "messageformat": "Un utente ha impostato il timer dei messaggi temporanei a {time}." }, "icu:theyChangedTheTimer": { - "messageformat": "{name} ha impostato il timer dei messaggi a scomparsa a {time}." + "messageformat": "{name} ha impostato il timer dei messaggi temporanei a {time}." }, "icu:disappearingMessages__off": { "messageformat": "spento" }, "icu:disappearingMessages": { - "messageformat": "Messaggi a scomparsa" + "messageformat": "Messaggi temporanei" }, "icu:disappearingMessagesDisabled": { - "messageformat": "Messaggi a scomparsa disabilitati" + "messageformat": "Messaggi temporanei disabilitati" }, "icu:disappearingMessagesDisabledByMember": { - "messageformat": "Un membro ha disabilitato i messaggi a scomparsa." + "messageformat": "Un utente ha disabilitato i messaggi temporanei." }, "icu:disabledDisappearingMessages": { - "messageformat": "{name} ha disabilitato i messaggi a scomparsa." + "messageformat": "{name} ha disabilitato i messaggi temporanei." }, "icu:youDisabledDisappearingMessages": { "messageformat": "Hai disabilitato la scomparsa dei messaggi." @@ -2928,10 +2928,10 @@ "messageformat": "Prossima chat" }, "icu:Keyboard--previous-unread-conversation": { - "messageformat": "Chat non letta precedente" + "messageformat": "Chat da leggere precedente" }, "icu:Keyboard--next-unread-conversation": { - "messageformat": "Prossima chat non letta" + "messageformat": "Prossima chat da leggere" }, "icu:Keyboard--preferences": { "messageformat": "Preferenze" @@ -3144,7 +3144,7 @@ "messageformat": "Chat tornata fra le chat attive" }, "icu:conversationMarkedUnread": { - "messageformat": "Chat segnata come non letta" + "messageformat": "Chat segnata come da leggere" }, "icu:ArtCreator--Authentication--error": { "messageformat": "Installa Signal sul tuo telefono e sul desktop per usare il creatore di pacchetti di adesivi" @@ -3747,7 +3747,7 @@ "messageformat": "Non puoi inviare messaggi a quel gruppo." }, "icu:GroupV2--cannot-start-group-call": { - "messageformat": "Solo gli amministratori del gruppo possono iniziare una chiamata." + "messageformat": "Solo gli admin del gruppo possono iniziare una chiamata." }, "icu:GroupV2--join--invalid-link--title": { "messageformat": "Link non valido" @@ -3783,7 +3783,7 @@ "messageformat": "Non puoi unirti a questo gruppo tramite l'apposito link perché un admin ti ha rimosso. Contatta un admin per farti aggiungere di nuovo nel gruppo." }, "icu:GroupV2--join--prompt-with-approval": { - "messageformat": "Un admin deve approvare la tua richiesta prima che tu possa unirti a questo gruppo. Quando invii la richiesta, il tuo nome e la tua foto verranno condivisi con i membri del gruppo." + "messageformat": "Un admin deve approvare la tua richiesta prima che tu possa unirti a questo gruppo. Quando invii la richiesta, il tuo nome e la tua foto verranno condivisi con gli utenti del gruppo." }, "icu:GroupV2--join--join-button": { "messageformat": "Unisciti" @@ -3807,7 +3807,7 @@ "messageformat": "{memberCount, plural, one {Gruppo · {memberCount,number} persona} other {Gruppo · {memberCount,number} persone}}" }, "icu:GroupV2--join--requested": { - "messageformat": "La tua richiesta di unirti è stata inviata agli amministratori del gruppo. Riceverai una notifica quando interverranno." + "messageformat": "La tua richiesta di unirti è stata inviata agli admin del gruppo. Riceverai una notifica quando interverranno." }, "icu:GroupV2--join--general-join-failure--title": { "messageformat": "Errore link" @@ -3816,10 +3816,10 @@ "messageformat": "Impossibile unirsi al gruppo. Riprova più tardi." }, "icu:GroupV2--admin": { - "messageformat": "Amministratore" + "messageformat": "Admin" }, "icu:GroupV2--only-admins": { - "messageformat": "Solo gli amministratori" + "messageformat": "Solo gli admin" }, "icu:GroupV2--all-members": { "messageformat": "Tutti i membri" @@ -3873,10 +3873,10 @@ "messageformat": "Un membro ha rimosso l'avatar del gruppo." }, "icu:GroupV2--access-attributes--admins--other": { - "messageformat": "{adminName} ha cambiato chi può modificare le informazioni del gruppo in \"Solo gli amministratori.\"" + "messageformat": "{adminName} ha cambiato chi può modificare le informazioni del gruppo in \"Solo gli admin.\"" }, "icu:GroupV2--access-attributes--admins--you": { - "messageformat": "Hai cambiato chi può modificare le informazioni del gruppo in \"Solo gli amministratori.\"" + "messageformat": "Hai cambiato chi può modificare le informazioni del gruppo in \"Solo gli admin.\"" }, "icu:GroupV2--access-attributes--admins--unknown": { "messageformat": "Un admin ha cambiato chi può modificare le informazioni del gruppo in \"Solo gli admin.\"" @@ -3888,16 +3888,16 @@ "messageformat": "Hai cambiato chi può modificare le informazioni del gruppo in \"Tutti i membri.\"" }, "icu:GroupV2--access-attributes--all--unknown": { - "messageformat": "Un admin ha cambiato chi può modificare le informazioni del gruppo in \"Tutti i membri.\"" + "messageformat": "Un admin ha cambiato chi può modificare le informazioni del gruppo in \"Tutti gli utenti.\"" }, "icu:GroupV2--access-members--admins--other": { - "messageformat": "{adminName} ha cambiato chi può modificare l'appartenenza al gruppo in \"Solo gli amministratori.\"" + "messageformat": "{adminName} ha cambiato chi può modificare l'appartenenza al gruppo in \"Solo gli admin.\"" }, "icu:GroupV2--access-members--admins--you": { - "messageformat": "Hai cambiato chi può modificare l'appartenenza al gruppo in \"Solo gli amministratori.\"" + "messageformat": "Hai cambiato chi può modificare l'appartenenza al gruppo in \"Solo gli admin.\"" }, "icu:GroupV2--access-members--admins--unknown": { - "messageformat": "Un admin ha cambiato chi può modificare l'appartenenza al gruppo in \"Solo gli amministratori.\"" + "messageformat": "Un admin ha cambiato chi può modificare l'appartenenza al gruppo in \"Solo gli admin.\"" }, "icu:GroupV2--access-members--all--other": { "messageformat": "{adminName} ha cambiato chi può modificare l'appartenenza al gruppo in \"Tutti i membri.\"" @@ -3906,25 +3906,25 @@ "messageformat": "Hai cambiato chi può modificare l'appartenenza al gruppo in \"Tutti i membri.\"" }, "icu:GroupV2--access-members--all--unknown": { - "messageformat": "Un admin ha cambiato chi può modificare l'appartenenza al gruppo in \"Tutti i membri.\"" + "messageformat": "Un admin ha cambiato chi può modificare l'appartenenza al gruppo in \"Tutti gli utenti.\"" }, "icu:GroupV2--access-invite-link--disabled--you": { - "messageformat": "Hai disabilitato l'approvazione degli amministratori per il link del gruppo." + "messageformat": "Hai disabilitato l'approvazione degli admin per il link del gruppo." }, "icu:GroupV2--access-invite-link--disabled--other": { - "messageformat": "{adminName} ha disabilitato l'approvazione degli amministratori per il link del gruppo." + "messageformat": "{adminName} ha disabilitato l'approvazione degli admin per il link del gruppo." }, "icu:GroupV2--access-invite-link--disabled--unknown": { - "messageformat": "L'approvazione degli amministratori per il link del gruppo è stata disabilitata." + "messageformat": "L'approvazione degli admin per il link del gruppo è stata disabilitata." }, "icu:GroupV2--access-invite-link--enabled--you": { - "messageformat": "Hai abilitato l'approvazione degli amministratori per il link del gruppo." + "messageformat": "Hai abilitato l'approvazione degli admin per il link del gruppo." }, "icu:GroupV2--access-invite-link--enabled--other": { - "messageformat": "{adminName} ha abilitato l'approvazione degli amministratori per il link del gruppo." + "messageformat": "{adminName} ha abilitato l'approvazione degli admin per il link del gruppo." }, "icu:GroupV2--access-invite-link--enabled--unknown": { - "messageformat": "L'approvazione degli amministratori per il link del gruppo è stata abilitata." + "messageformat": "L'approvazione degli admin per il link del gruppo è stata abilitata." }, "icu:GroupV2--member-add--invited--you": { "messageformat": "Hai aggiunto il membro invitato {inviteeName}." @@ -4011,34 +4011,34 @@ "messageformat": "Sei stato rimosso dal gruppo." }, "icu:GroupV2--member-privilege--promote--other--other": { - "messageformat": "{adminName} ha reso {memberName} un amministratore." + "messageformat": "{adminName} ha reso {memberName} un admin." }, "icu:GroupV2--member-privilege--promote--other--you": { - "messageformat": "Hai reso {memberName} un amministratore." + "messageformat": "Hai reso {memberName} un admin." }, "icu:GroupV2--member-privilege--promote--other--unknown": { "messageformat": "Un admin ha reso {memberName} un admin." }, "icu:GroupV2--member-privilege--promote--you--other": { - "messageformat": "{adminName} ti ha reso un amministratore." + "messageformat": "{adminName} ti ha reso un admin." }, "icu:GroupV2--member-privilege--promote--you--unknown": { "messageformat": "Un admin ti ha reso un admin." }, "icu:GroupV2--member-privilege--demote--other--other": { - "messageformat": "{adminName} ha revocato i privilegi di amministrazione da {memberName}." + "messageformat": "{adminName} ha revocato i privilegi di admin da {memberName}." }, "icu:GroupV2--member-privilege--demote--other--you": { - "messageformat": "Hai revocato i privilegi di amministrazione da {memberName}." + "messageformat": "Hai revocato i privilegi di admin da {memberName}." }, "icu:GroupV2--member-privilege--demote--other--unknown": { - "messageformat": "Un admin ha revocato i privilegi di amministrazione da {memberName}." + "messageformat": "Un admin ha revocato i privilegi di admin da {memberName}." }, "icu:GroupV2--member-privilege--demote--you--other": { - "messageformat": "{adminName} ha revocato i tuoi privilegi di amministrazione." + "messageformat": "{adminName} ha revocato i tuoi privilegi di admin." }, "icu:GroupV2--member-privilege--demote--you--unknown": { - "messageformat": "Un admin ha revocato i tuoi privilegi di amministrazione." + "messageformat": "Un admin ha revocato i tuoi privilegi di admin." }, "icu:GroupV2--pending-add--one--other--other": { "messageformat": "{memberName} ha invitato 1 persona ad entrare nel gruppo." @@ -4146,7 +4146,7 @@ "messageformat": "Hai annullato la tua richiesta di unirti al gruppo." }, "icu:GroupV2--admin-approval-remove-one--you--unknown": { - "messageformat": "La tua richiesta di unirti al gruppo è stata rifiutata da un amministratore." + "messageformat": "La tua richiesta di unirti al gruppo è stata rifiutata da un admin." }, "icu:GroupV2--admin-approval-remove-one--other--you": { "messageformat": "Hai rifiutato una richiesta di unirsi al gruppo da {joinerName}." @@ -4164,22 +4164,22 @@ "messageformat": "{numberOfRequests, plural, one {{joinerName} ha richiesto e annullato la sua richiesta di unirsi al gruppo tramite il link} other {{joinerName} ha richiesto e annullato {numberOfRequests,number} richieste di unirsi al gruppo tramite il link}}" }, "icu:GroupV2--group-link-add--disabled--you": { - "messageformat": "Hai attivato il link del gruppo senza l'approvazione degli amministratori." + "messageformat": "Hai attivato il link del gruppo senza l'approvazione degli admin." }, "icu:GroupV2--group-link-add--disabled--other": { - "messageformat": "{adminName} ha attivato il link del gruppo senza l'approvazione degli amministratori." + "messageformat": "{adminName} ha attivato il link del gruppo senza l'approvazione degli admin." }, "icu:GroupV2--group-link-add--disabled--unknown": { - "messageformat": "Il link del gruppo è stato attivato senza l'approvazione degli amministratori." + "messageformat": "Il link del gruppo è stato attivato senza l'approvazione degli admin." }, "icu:GroupV2--group-link-add--enabled--you": { - "messageformat": "Hai attivato il link del gruppo con l'approvazione degli amministratori." + "messageformat": "Hai attivato il link del gruppo con l'approvazione degli admin." }, "icu:GroupV2--group-link-add--enabled--other": { - "messageformat": "{adminName} ha attivato il link del gruppo con l'approvazione degli amministratori." + "messageformat": "{adminName} ha attivato il link del gruppo con l'approvazione degli admin." }, "icu:GroupV2--group-link-add--enabled--unknown": { - "messageformat": "Il link del gruppo è stato attivato con l'approvazione degli amministratori." + "messageformat": "Il link del gruppo è stato attivato con l'approvazione degli admin." }, "icu:GroupV2--group-link-remove--you": { "messageformat": "Hai disattivato il link del gruppo." @@ -4218,13 +4218,13 @@ "messageformat": "La descrizione del gruppo è stata cambiata." }, "icu:GroupV2--announcements--admin--you": { - "messageformat": "Hai modificato le impostazioni del gruppo per consentire solo agli amministratori di inviare messaggi." + "messageformat": "Hai modificato le impostazioni del gruppo per consentire solo agli admin di inviare messaggi." }, "icu:GroupV2--announcements--admin--other": { - "messageformat": "{memberName} ha modificato le impostazioni del gruppo per consentire solo agli amministratori di inviare messaggi." + "messageformat": "{memberName} ha modificato le impostazioni del gruppo per consentire solo agli admin di inviare messaggi." }, "icu:GroupV2--announcements--admin--unknown": { - "messageformat": "Il gruppo è stato modificato per consentire solo agli amministratori di inviare messaggi." + "messageformat": "Il gruppo è stato modificato per consentire solo agli admin di inviare messaggi." }, "icu:GroupV2--announcements--member--you": { "messageformat": "Hai modificato le impostazioni del gruppo per consentire a tutti i membri di inviare messaggi." @@ -4239,7 +4239,7 @@ "messageformat": "L'elenco di persone o le impostazioni del gruppo sono state cambiate." }, "icu:GroupV1--Migration--disabled--link": { - "messageformat": "Aggiorna questo gruppo per attivare nuove funzioni come le @menzioni e i ruoli da amministratore. Le persone che non hanno condiviso il proprio nome o la foto del profilo con il gruppo riceveranno l'invito a unirsi. Scopri di più." + "messageformat": "Aggiorna questo gruppo per attivare nuove funzioni come le @menzioni e i ruoli da admin. Le persone che non hanno condiviso il proprio nome o la foto del profilo con il gruppo riceveranno l'invito a unirsi. Scopri di più." }, "icu:GroupV1--Migration--was-upgraded": { "messageformat": "Questo gruppo è stato aggiornato a un Nuovo Gruppo." @@ -4257,7 +4257,7 @@ "messageformat": "Aggiorna a Nuovo Gruppo" }, "icu:GroupV1--Migration--info--summary": { - "messageformat": "I Nuovi Gruppi hanno funzionalità come @menzioni e amministratori del gruppo e supporteranno più funzionalità in futuro." + "messageformat": "I Nuovi Gruppi hanno funzioni come le @menzioni e gli admin del gruppo e supporteranno più funzioni in futuro." }, "icu:GroupV1--Migration--info--keep-history": { "messageformat": "Tutta la cronologia dei messaggi e i contenuti multimediali sono stati conservati da prima dell'aggiornamento." @@ -4524,10 +4524,10 @@ "messageformat": "Soprannome" }, "icu:ContactModal--rm-admin": { - "messageformat": "Rimuovi come amministratore" + "messageformat": "Rimuovi da ruolo di admin" }, "icu:ContactModal--make-admin": { - "messageformat": "Rendi amministratore" + "messageformat": "Rendi admin" }, "icu:ContactModal--make-admin-info": { "messageformat": "{contact} potrà modificare questo gruppo e i suoi membri." @@ -4560,7 +4560,7 @@ "messageformat": "Link del gruppo" }, "icu:ConversationDetails--disappearing-messages-label": { - "messageformat": "Messaggi a scomparsa" + "messageformat": "Messaggi temporanei" }, "icu:ConversationDetails--disappearing-messages-info--group": { "messageformat": "Una volta abilitati, i messaggi inviati e ricevuti in questo gruppo spariranno dopo essere stati visti." @@ -4590,7 +4590,7 @@ "messageformat": "Chi può modificare le informazioni del gruppo" }, "icu:ConversationDetails--group-info-info": { - "messageformat": "Scegli chi può modificare il nome del gruppo, la foto, la descrizione e il timer dei messaggi a scomparsa." + "messageformat": "Scegli chi può modificare il nome del gruppo, la foto, la descrizione e il timer dei messaggi temporanei." }, "icu:ConversationDetails--add-members-label": { "messageformat": "Chi può aggiungere membri" @@ -4611,13 +4611,13 @@ "messageformat": "Abbandona il gruppo" }, "icu:ConversationDetailsActions--block-group": { - "messageformat": "Blocca gruppo" + "messageformat": "Blocca il gruppo" }, "icu:ConversationDetailsActions--unblock-group": { "messageformat": "Sblocca il gruppo" }, "icu:ConversationDetailsActions--leave-group-must-choose-new-admin": { - "messageformat": "Prima di abbandonarlo, devi scegliere almeno un nuovo admin per questo gruppo." + "messageformat": "Prima di abbandonare il gruppo, devi scegliere almeno un nuovo admin." }, "icu:ConversationDetailsActions--leave-group-modal-title": { "messageformat": "Vuoi davvero abbandonare?" @@ -5100,7 +5100,7 @@ "messageformat": "Tempo personalizzato" }, "icu:DisappearingTimeDialog__body": { - "messageformat": "Scegli un tempo personalizzato per i messaggi a scomparsa." + "messageformat": "Scegli un tempo personalizzato per i messaggi temporanei." }, "icu:DisappearingTimeDialog__set": { "messageformat": "Imposta" @@ -5409,13 +5409,13 @@ "messageformat": "Condivisione" }, "icu:AnnouncementsOnlyGroupBanner--modal": { - "messageformat": "Invia un messaggio a un amministratore" + "messageformat": "Invia un messaggio a un admin" }, "icu:AnnouncementsOnlyGroupBanner--announcements-only": { "messageformat": "Solo gli {admins} possono inviare messaggi" }, "icu:AnnouncementsOnlyGroupBanner--admins": { - "messageformat": "amministratori" + "messageformat": "admin" }, "icu:AvatarEditor--choose": { "messageformat": "Seleziona un avatar" @@ -5628,22 +5628,22 @@ "messageformat": "La tua cronologia chat non può essere esportata perché Signal non ha le autorizzazioni necessarie per sovrascrivere i file sullo spazio di archiviazione. Prova a cambiare le autorizzazioni per lo spazio di archiviazione oppure ad aggiornare le impostazioni di sistema, poi riprova l'esportazione." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Esportazione backup in corso" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Esportazione backup completata" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Per ripristinare questo backup:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Trasferisci la cartella del tuo backup nelll'archivio del tuo telefono" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Installa una nuova copia di Signal sul tuo telefono" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Tocca su \"Ripristina o trasferisci\" e scegli \"Sul backup del dispositivo\"" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Icona della luna" @@ -5661,10 +5661,10 @@ "messageformat": ":" }, "icu:NotificationProfileMenuItem": { - "messageformat": "Profilo di notifica" + "messageformat": "Profilo per le notifiche" }, "icu:NotificationProfileMenu--header": { - "messageformat": "Profilo di notifica" + "messageformat": "Profilo per le notifiche" }, "icu:NotificationProfileMenu--on": { "messageformat": "Sì" @@ -5694,13 +5694,13 @@ "messageformat": "Profilo per le notifiche ora disattivato" }, "icu:NotificationProfiles--setting": { - "messageformat": "Profili di notifica" + "messageformat": "Profili per le notifiche" }, "icu:NotificationProfiles--setup": { "messageformat": "Imposta" }, "icu:NotificationProfiles--title": { - "messageformat": "Profili di notifica" + "messageformat": "Profili per le notifiche" }, "icu:NotificationProfiles--setup-description": { "messageformat": "Crea un profilo per ricevere notifiche e chiamate solo dalle persone e dai gruppi da te scelti" @@ -5808,7 +5808,7 @@ "messageformat": "Profilo creato" }, "icu:NotificationProfiles--done-description": { - "messageformat": "Se hai aggiornato una programmazione, il tuo profilo si attiverà e disattiverà in automatico. Puoi anche cliccare sull'icona ··· nella parte superiore dell'elenco delle chat per attivarla o disattivarla manualmente." + "messageformat": "Se hai aggiunto una programmazione, il tuo profilo si attiverà e disattiverà in automatico. Puoi anche cliccare sull'icona ··· nella parte superiore dell'elenco delle chat per attivarlo o disattivarlo manualmente." }, "icu:NotificationProfiles--schedule-sunday-short": { "messageformat": "Dom" @@ -5847,7 +5847,7 @@ "messageformat": "Profili" }, "icu:NotificationProfiles--list--sync": { - "messageformat": "Sincronizza tutti i dispositivi" + "messageformat": "Sincronizza tra tutti i dispositivi" }, "icu:NotificationProfiles--list--sync--description": { "messageformat": "I tuoi profili verranno sincronizzati sui tuoi dispositivi. Attivare un profilo per un dispositivo comporterà l'attivazione anche per gli altri." @@ -7612,7 +7612,7 @@ "messageformat": "Ciò ci aiuta a monitorare la qualità e il corretto funzionamento delle chiamate. Puoi vedere il tuo log di debug prima di inviarlo." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Se procedi con l'invio, il tuo feedback verrà condiviso insieme ai dati diagnostici relativi alla tua chiamata. Se lo desideri, puoi condividere un log di debug per aiutarci a migliorare la qualità delle chiamate." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Condividi log di debug" @@ -7645,7 +7645,7 @@ "messageformat": "Grazie per il tuo feedback!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Espandi la barra laterale per interagire con il megafono." }, "icu:WhatsNew__bugfixes": { "messageformat": "Questa versione contiene una serie di piccole modifiche e correzioni di bug per far funzionare Signal senza problemi.", @@ -7679,6 +7679,6 @@ "messageformat": "Beh, colpa nostra, ma esisteva un bug dove l'indicatore delle mani alzate rimaneva visibile (con un conteggio pari a 0) se una persona alzava e poi abbassava la mano velocemente." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Da ora diventa più semplice ricordarsi delle cose importanti: basta usare i messaggi in evidenza! Le tue domande più frequenti, i piani per il weekend e gli itinerari di viaggio sono già in cima ai tuoi pensieri… beh, d'ora in poi saranno anche in cima alle tue chat!" } } diff --git a/_locales/ja/messages.json b/_locales/ja/messages.json index 97b52c9cd5..c804b77f44 100644 --- a/_locales/ja/messages.json +++ b/_locales/ja/messages.json @@ -1239,7 +1239,7 @@ "messageformat": "続ける" }, "icu:PinMessageDisappearingMessagesWarningDialog__Title": { - "messageformat": "消えるメッセージをピン留めする" + "messageformat": "消えるメッセージをピン留め" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { "messageformat": "消えるメッセージは、期間が過ぎてチャットから消えた時にピン留めも解除されます。" @@ -5628,22 +5628,22 @@ "messageformat": "Signalには、ディスクにファイルを書き込む権限がないため、チャット履歴をエクスポートできません。ディスクの権限を変更するか、システム設定を更新してからもう一度エクスポートしてください。" }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "バックアップをエクスポートしています" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "バックアップのエクスポートが完了しました" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "バックアップの復元方法" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "バックアップフォルダをスマートフォンのストレージに移行します" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "ご利用のスマートフォンに、Signalを新規でインストールします" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "「復元または移行する」をタップして、「端末上のバックアップ」を選択します" }, "icu:NotificationProfile--moon-icon": { "messageformat": "月のアイコン" @@ -6009,7 +6009,7 @@ "messageformat": "なし" }, "icu:Preferences__local-backups-backup-now": { - "messageformat": "いますぐバックアップする" + "messageformat": "いますぐバックアップ" }, "icu:Preferences__local-backups-folder": { "messageformat": "バックアップフォルダ" @@ -7612,7 +7612,7 @@ "messageformat": "デバッグログを共有していただくことで、通話状況、何が機能しているか、もしくは何が機能していないか、などを把握できます。送信前にデバッグログを表示することができます。" }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "提出すると、通話に関する診断情報とフィードバックが共有されます。デバッグログの共有(任意)は、通話品質の向上につながります。" }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "デバッグログを共有する" @@ -7645,7 +7645,7 @@ "messageformat": "フィードバックをありがとうございます!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "サイドバーを展開してメガホンを操作できます" }, "icu:WhatsNew__bugfixes": { "messageformat": "Signalをスムーズに動作させるための微調整とバグ修正を行いました。", @@ -7679,6 +7679,6 @@ "messageformat": "グループ通話中の、挙手回数表示に関する軽微なバグを修正しました。" }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "メッセージをピン留めすれば、重要な情報をチャットの上部ですぐに確認できます。" } } diff --git a/_locales/ka-GE/messages.json b/_locales/ka-GE/messages.json index 568ab38e18..a53a40157b 100644 --- a/_locales/ka-GE/messages.json +++ b/_locales/ka-GE/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "შენი ჩატის ისტორიის გადატანა შეუძლებელია, რადგან Signal-ს დისკზე ფაილების ჩაწერის ნებართვა არ აქვს. შენი დისკის ნებართვების შეცვლა ან სისტემის პარამეტრების განახლება სცადე და თავიდან გადაიტანე." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "მიმდინარეობს სათადარიგო ასლების ექსპორტირება" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "სათადარიგო ასლების ექსპორტირება დასრულებულია" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "ამ სათადარიგო ასლის აღსადგენად:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "გადაიტანე შენი სათადარიგო ასლების საქაღალდე შენი მობილურის მეხსიერებაში" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "გადმოიწერე Signal-ის ახალი ასლი შენს მობილურში" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "დააჭირე \"აღდგენა ან გადატანას\" და აირჩიე \"სათადარიგო ასლების შექმნა მოწყობილობაზე\"" }, "icu:NotificationProfile--moon-icon": { "messageformat": "მთვარის ხატულა" @@ -7612,7 +7612,7 @@ "messageformat": "ეს გვეხმარება, მეტი გავიგოთ ზარებზე და იმაზე, რა მუშაობს ან არ მუშაობს. შეგიძლია შენი გაუმართაობის რეესტრი ატვირთვამდე ნახო." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "ატვირთვა შენს უკუკავშირს შენი ზარის შესახებ დიაგნოსტიკურ ინფორმაციასთან ერთად გააზიარებს. შეგიძლია გაუმართაობის რეესტრი გაგვიზიარო, რათა ზარის ხარისხის გამოსწორებაში დაგვეხმარო." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "გაუმართაობის რეესტრის გაზიარება" @@ -7645,7 +7645,7 @@ "messageformat": "მადლობა უკუკავშირისთვის!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "გაადიდე გვერდით პანელი, რომ მეგაფონთან ინტერაქცია შეძლო" }, "icu:WhatsNew__bugfixes": { "messageformat": "ეს ვერსია შეიცავს უამრავ მცირე შესწორებას და ბაგების გამოსწორებებს Signal-ის შეუფერხებლად მუშაობის შესანარჩუნებლად.", @@ -7679,6 +7679,6 @@ "messageformat": "უხერხულ დუმილს ვერაფერს ვუშველით, თუმცა გამოვასწორეთ ბაგი, რომლის გამოც „აწეული ხელის“ ინდიკატორი ხილული რჩებოდა ხელის სწრაფი აწევა-ჩამოწევის შემდე." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "გახადე მნიშვნელოვანი ინფორმაცია მარტივად ხელმისაწვდომი აპინული წერილების საშუალებით. შენი ყველაზე ხშირად დასმული კითხვები, დაჯავშნილი რესტორნები და მოგზაურობის გეგმები ისედაც შენი ფიქრების სათავეშია. ახლა კი შეგიძლია ისინი ჩატის სათავეშიც მოაქციო." } } diff --git a/_locales/kk-KZ/messages.json b/_locales/kk-KZ/messages.json index 5efd882b27..db68cefcaf 100644 --- a/_locales/kk-KZ/messages.json +++ b/_locales/kk-KZ/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Чат тарихын экспорттау мүмкін емес, себебі Signal-да файлдарды дискіге жазу рұқсаты жоқ. Диск рұқсаттарын өзгертіп немесе жүйе параметрлерін жаңартып, әрекетті қайталап көріңіз." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Сақтық көшірме экспортталып жатыр" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Сақтық көшірмені экспорттау аяқталды" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Осы сақтық көшірмені қалпына келтіру үшін:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Сақтық көшірме қалтасын телефоныңыздың жадына тасымалдаңыз" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Телефоныңызда Signal-дың жаңа нұсқасын орнатыңыз" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "\"Қалпына келтіру немесе тасымалдау\" түймесін түртіңіз және \"Сақтық көшірмені құрылғыда жасау\" опциясын таңдаңыз" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ай белгішесі" @@ -7612,7 +7612,7 @@ "messageformat": "Бұл қоңыраулар сапасы туралы толық ақпарат алуға, сондай-ақ ненің дұрыс, ал ненің бұрыс екенін түсінуге көмектеседі. Жібермес бұрын ақауларды түзету журналыңызды көруіңізге болады." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": ""Жіберу" түймесін басу арқылы пікіріңізді қоңырауыңыз туралы диагностикалық ақпаратпен бірге бөлісесіз. Сондай-ақ ақауларды түзету журналын бөлісіп, қоңырау сапасын жақсартуға көмектесе аласыз." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Ақауларды түзету журналын бөлісу" @@ -7645,7 +7645,7 @@ "messageformat": "Пікіріңіз үшін рақмет!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Мегафонмен әрекеттесу үшін бүйірлік жолақты кеңейтіңіз" }, "icu:WhatsNew__bugfixes": { "messageformat": "Бұл нұсқада Signal-дың еш кінәратсыз жұмыс істеуіне қажетті бірнеше шағын түзетпе жасалды және ақаулар түзетілді.", @@ -7679,6 +7679,6 @@ "messageformat": "Кейіннен туындайтын қолайсыз тыныштықты түзете алмаймыз, алайда біреу қолын өте тез көтеріп-түсірген кезде, қол көтеру белгісі (саны нөл болса да) көрсетіліп тұра беретін ақауды түзеттік." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Бекітілген хабарлардың көмегімен маңызды ақпаратты көз алдыңызда ұстаңыз. Жиі қойылатын сұрақтар, кешкі асқа алдын ала тапсырыс беру және демалыс бағдарламалары енді ойыңыздан шығып кетпейді. Олар чаттың жоғарғы жағында тұратын болады." } } diff --git a/_locales/km-KH/messages.json b/_locales/km-KH/messages.json index 230499c152..1d83c8d305 100644 --- a/_locales/km-KH/messages.json +++ b/_locales/km-KH/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "ប្រវត្តិជជែករបស់អ្នកមិនអាចនាំចេញបានទេព្រោះ Signal មិនមានការអនុញ្ញាតឱ្យសរសេរឯកសារទៅឌីសទេ។ សាកល្បងផ្លាស់ប្តូរការអនុញ្ញាតនៃឌីសរបស់អ្នក ឬធ្វើបច្ចុប្បន្នភាពការកំណត់ប្រព័ន្ធរបស់អ្នក រួចនាំចេញម្តងទៀត។" }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "កំពុងនាំចេញការបម្រុងទុក" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "ការនាំចេញការបម្រុងទុកបានបញ្ចប់" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "ដើម្បីស្ដារការបម្រុងទុកនេះ៖" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "ផ្ទេរថតឯកសារបម្រុងទុករបស់អ្នកទៅកាន់កន្លែងផ្ទុកទិន្នន័យទូរសព្ទរបស់អ្នក" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "ដំឡើងច្បាប់ចម្លងថ្មីរបស់ Signal នៅលើទូរសព្ទរបស់អ្នក" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "ចុច “ស្តារ ឬផ្ទេរ” ហើយជ្រើសរើស ”នៅលើការបម្រុងទុកឧបករណ៍”" }, "icu:NotificationProfile--moon-icon": { "messageformat": "រូបព្រះចន្ទ" @@ -7612,7 +7612,7 @@ "messageformat": "វាជួយយើងឱ្យស្វែងយល់បន្ថែមអំពីការហៅទូរសព្ទ និងអ្វីដែលដំណើរការ ឬមិនដំណើរការ។ អ្នកអាចមើលកំណត់ត្រាបញ្ហារបស់អ្នកមុនពេលដាក់បញ្ជូន។" }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "ការដាក់បញ្ជូននឹងចែករំលែកមតិកែលម្អរបស់អ្នករួមជាមួយព័ត៌មានវិនិច្ឆយអំពីការហៅទូរសព្ទរបស់អ្នក។ ជាជម្រើស អ្នកអាចចែករំលែកកំណត់ត្រាបញ្ហាដើម្បីជួយយើងកែលម្អគុណភាពនៃការហៅទូរសព្ទ។" }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "ចែករំលែកកំណត់ត្រាបញ្ហា" @@ -7627,7 +7627,7 @@ "messageformat": "ព័ត៌មានដែលបានចែករំលែកជាមួយយើងមានព័ត៌មានកម្មវិធីកម្រិតទាប ហើយមិនរាប់បញ្ចូលខ្លឹមសារនៃការហៅទូរសព្ទរបស់អ្នកទេ។" }, "icu:CallDiagnosticWindow__title": { - "messageformat": "ព័ត៌មានវិនិច្ឆ័យ" + "messageformat": "ព័ត៌មានវិនិច្ឆយ" }, "icu:CallQualitySurvey__ConfirmSubmission__SubmitButton": { "messageformat": "ដាក់បញ្ជូន" @@ -7645,7 +7645,7 @@ "messageformat": "សូមអរគុណចំពោះមតិកែលម្អរបស់អ្នក!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "ពង្រីករបារចំហៀងដើម្បីធ្វើអន្តរកម្មជាមួយមេហ្គាហ្វូន" }, "icu:WhatsNew__bugfixes": { "messageformat": "កំណែ​នេះ​មាន​ការ​កែ​សម្រួល និង​ការកែបញ្ហាតូចៗ​មួយ​ចំនួន ដើម្បី​ឲ្យ​ Signal បន្ត​ដំណើរការ​ដោយ​រលូន។", @@ -7679,6 +7679,6 @@ "messageformat": "យើងបានដោះស្រាយបញ្ហាតូចមួយទាក់ទងនឹងការបង្ហាញ ដែលពេលខ្លះរូបលើកដៃឡើងនៅតែអាចមើលឃើញ ដោយគេគ្រាន់តែលើកដៃមួយភ្លែត រួចហើយដាក់ដៃចុះភ្លាមវិញ (ទោះបីជាគ្មាននរណាលើកដៃក៏ដោយ)។" }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "ងាយស្រួលស្វែងរកព័ត៌មានសំខាន់ៗជាមួយសារដែលបានខ្ទាស់។ សំណួរដែលគេច្រើនសួរបំផុត ការកក់ញ៉ាំអាហារពេលល្ងាច និងគម្រោងធ្វើដំណើរពេលវិស្សមកាលរបស់អ្នកគឺជាអ្វីដែលគេបានគិតទុករួចទៅហើយ។ ឥឡូវនេះវាក៏អាចជាប្រធានបទដែលគេនាំគ្នាជជែកច្រើនជាងគេដែរ។" } } diff --git a/_locales/kn-IN/messages.json b/_locales/kn-IN/messages.json index b3ba691803..7a842ef06c 100644 --- a/_locales/kn-IN/messages.json +++ b/_locales/kn-IN/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Signal ಡಿಸ್ಕ್‌ಗೆ ಫೈಲ್‌ಗಳನ್ನು ಬರೆಯಲು ಅನುಮತಿ ಹೊಂದಿಲ್ಲದ ಕಾರಣ ನಿಮ್ಮ ಚಾಟ್ ಇತಿಹಾಸವನ್ನು ಎಕ್ಸ್‌ಪೋರ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ಡಿಸ್ಕ್‌ನ ಅನುಮತಿಗಳನ್ನು ಬದಲಾಯಿಸಲು ಅಥವಾ ನಿಮ್ಮ ಸಿಸ್ಟಂ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ ಮತ್ತು ನಂತರ ಮತ್ತೆ ಎಕ್ಸ್‌ಪೋರ್ಟ್ ಮಾಡಿ." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "ಬ್ಯಾಕಪ್ ಅನ್ನು ಎಕ್ಸ್‌ಪೋರ್ಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "ಬ್ಯಾಕಪ್ ಅನ್ನು ಎಕ್ಸ್‌ಪೋರ್ಟ್ ಮಾಡುವುದು ಪೂರ್ಣಗೊಂಡಿದೆ" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "ಈ ಬ್ಯಾಕಪ್ ಅನ್ನು ರಿಸ್ಟೋರ್ ಮಾಡಲು:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "ನಿಮ್ಮ ಬ್ಯಾಕಪ್ ಫೋಲ್ಡರ್ ಅನ್ನು ನಿಮ್ಮ ಫೋನ್‌ನ ಸಂಗ್ರಹಣೆಗೆ ವರ್ಗಾಯಿಸಿ" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ Signal ನ ಕಾಪಿಯನ್ನು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿ" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "\"ರಿಸ್ಟೋರ್ ಅಥವಾ ವರ್ಗಾಯಿಸಿ\" ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು \"ಆನ್ ಡಿವೈಸ್ ಬ್ಯಾಕಪ್\" ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ" }, "icu:NotificationProfile--moon-icon": { "messageformat": "ಮೂನ್ ಐಕಾನ್" @@ -7612,7 +7612,7 @@ "messageformat": "ಇದು ಕರೆಗಳ ಬಗ್ಗೆ ಮತ್ತು ಯಾವುದು ಕೆಲಸ ಮಾಡುತ್ತಿದೆ ಅಥವಾ ಯಾವುದು ಕೆಲಸ ಮಾಡುತ್ತಿಲ್ಲ ಎಂಬುದರ ಕುರಿತು ಇನ್ನಷ್ಟು ತಿಳಿದುಕೊಳ್ಳಲು ನಮಗೆ ಸಹಾಯ ಮಾಡುತ್ತದೆ. ಸಲ್ಲಿಸುವ ಮೊದಲು ನಿಮ್ಮ ಡೀಬಗ್ ಲಾಗ್ ಅನ್ನು ನೀವು ವೀಕ್ಷಿಸಬಹುದು." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "ಸಲ್ಲಿಸುವುದರಿಂದ ನಿಮ್ಮ ಕರೆಯ ಕುರಿತ ಡಯಾಗ್ನಾಸ್ಟಿಕ್ ಮಾಹಿತಿ ಜೊತೆಗೆ ನಿಮ್ಮ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತದೆ . ಕರೆಯ ಗುಣಮಟ್ಟವನ್ನು ಸುಧಾರಿಸಲು ನಮಗೆ ಸಹಾಯ ಮಾಡುವುದಕ್ಕೆ ನೀವು ಐಚ್ಛಿಕವಾಗಿ ಡೀಬಗ್ ಲಾಗ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "ಡೀಬಗ್ ಲಾಗ್ ಹಂಚಿಕೊಳ್ಳಿ" @@ -7645,7 +7645,7 @@ "messageformat": "ನಿಮ್ಮ ಫೀಡ್‌ಬ್ಯಾಕ್‌ಗೆ ಧನ್ಯವಾದಗಳು!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "ಮೆಗಾಫೋನ್‌ನೊಂದಿಗೆ ಸಂವಹನ ನಡೆಸಲು ಸೈಡ್‌ಬಾರ್ ಅನ್ನು ವಿಸ್ತರಿಸಿ" }, "icu:WhatsNew__bugfixes": { "messageformat": " Signal ಅನ್ನು ಸರಾಗವಾಗಿ ಚಾಲ್ತಿಯಲ್ಲಿಡಲು ಈ ಆವೃತ್ತಿಯು ಸಾಕಷ್ಟು ಸಣ್ಣ ಟ್ವೀಕ್‌ಗಳನ್ನು ಹೊಂದಿದೆ ಮತ್ತು ಬಗ್ ಫಿಕ್ಸ್‌ಗಳನ್ನು ಹೊಂದಿದೆ.", @@ -7679,6 +7679,6 @@ "messageformat": "ನಂತರದ ವಿಚಿತ್ರವಾದ ಮೌನವನ್ನು ನಾವು ಸರಿಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ, ಆದರೆ ಯಾರಾದರೂ ನಿಜವಾಗಿಯೂ ಬೇಗನೆ ಕೈ ಎತ್ತಿ ಕೆಳಕ್ಕೆ ಇಳಿಸಿದರೆ ಕೆಲವೊಮ್ಮೆ ಎತ್ತಿದ ಕೈ ಸೂಚಕವು ಗೋಚರಿಸುವುದಕ್ಕೆ (ಶೂನ್ಯ ಎಣಿಕೆಯೊಂದಿಗೆ) ಕಾರಣವಾಗುವ ಬಗ್ ಅನ್ನು ನಾವು ಸರಿಪಡಿಸಿದ್ದೇವೆ." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "ಪಿನ್ ಮಾಡಿದ ಮೆಸೇಜ್‌ಗಳ ಮೂಲಕ ಪ್ರಮುಖ ಮಾಹಿತಿಯನ್ನು ಸುಲಭವಾಗಿ ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಸಹಾಯ ಮಾಡಿ. ನಿಮ್ಮ ಪದೇ ಪದೇ ಕೇಳಲಾಗುವ ಪ್ರಶ್ನೆಗಳು, ಡಿನ್ನರ್ ಕಾಯ್ದಿರಿಸುವಿಕೆಗಳು ಮತ್ತು ರಜೆಯ ಪ್ರಯಾಣದ ವಿವರಗಳು ಈಗಾಗಲೇ ನಿಮ್ಮ ಮನಸ್ಸಿನಲ್ಲಿವೆ. ಈಗ ಅವುಗಳು ಚಾಟ್‍ನ ಟಾಪ್‍ನಲ್ಲೂ ಇರಬಹುದು." } } diff --git a/_locales/ko/messages.json b/_locales/ko/messages.json index 43468d4058..6c98defe81 100644 --- a/_locales/ko/messages.json +++ b/_locales/ko/messages.json @@ -42,7 +42,7 @@ "messageformat": "고품질 미디어는 더 많은 모바일 데이터를 사용할 수 있습니다." }, "icu:Preferences__DonateTitle": { - "messageformat": "Signal에 기부" + "messageformat": "Signal 후원하기" }, "icu:sentMediaQualityStandard": { "messageformat": "기본" @@ -408,7 +408,7 @@ "messageformat": "음성 통화" }, "icu:ContactListItem__menu__video-call": { - "messageformat": "화상 통화" + "messageformat": "영상 통화" }, "icu:ContactListItem__menu__remove": { "messageformat": "제거" @@ -1356,10 +1356,10 @@ "messageformat": "전송 문제" }, "icu:DeliveryIssue--summary": { - "messageformat": "{sender} 님이 보낸 메시지, 스티커, 반응, 수신 확인 또는 미디어가 전달되지 못했습니다. 나에게 직접 보내거나 그룹 대화에서 보내려 했던 것으로 보여요." + "messageformat": "{sender} 님이 보낸 메시지, 스티커, 반응, 열람 확인 또는 미디어가 전달되지 못했습니다. 나에게 직접 보내거나 그룹 대화에서 보내려 했던 것으로 보여요." }, "icu:DeliveryIssue--summary--group": { - "messageformat": "이 대화에서 {sender} 님이 보낸 메시지, 스티커, 반응, 수신 확인 또는 미디어가 전달되지 못했습니다." + "messageformat": "이 대화에서 {sender} 님이 보낸 메시지, 스티커, 반응, 열람 확인 또는 미디어가 전달되지 못했습니다." }, "icu:ChangeNumber--notification": { "messageformat": "{sender} 님이 전화번호를 변경했습니다." @@ -2541,7 +2541,7 @@ "messageformat": "모바일에서 이 메시지를 탭하여 기부를 확인하세요." }, "icu:message--donation--unopened--label": { - "messageformat": "{sender} 님이 귀하를 대신해 Signal에 기부했습니다." + "messageformat": "{sender} 님이 나를 대신해 Signal을 후원했어요" }, "icu:message--donation--unopened--toast--incoming": { "messageformat": "이 기부를 열려면 휴대전화를 확인하세요." @@ -2550,13 +2550,13 @@ "messageformat": "이 기부를 보려면 휴대전화를 확인하세요." }, "icu:message--donation--preview--unopened": { - "messageformat": "{sender} 님이 귀하를 대신해 기부했습니다." + "messageformat": "{sender} 님이 나를 대신해 후원했어요" }, "icu:message--donation--preview--redeemed": { "messageformat": "기부를 사용했습니다." }, "icu:message--donation--preview--sent": { - "messageformat": "{recipient} 님을 대신해 기부했습니다." + "messageformat": "{recipient} 님을 대신해 후원했어요" }, "icu:message--pinned--preview--received": { "messageformat": "{sender} 님이 메시지를 고정했습니다" @@ -3114,7 +3114,7 @@ "messageformat": "음성 통화 시작" }, "icu:Keyboard--start-video-call": { - "messageformat": "화상 통화 시작" + "messageformat": "영상 통화 시작" }, "icu:Keyboard--decline-call": { "messageformat": "전화 거절" @@ -3402,7 +3402,7 @@ "messageformat": "음성 통화를 거부함" }, "icu:declinedIncomingVideoCall": { - "messageformat": "화상 통화를 거부함" + "messageformat": "영상 통화를 거부함" }, "icu:acceptedIncomingAudioCall": { "messageformat": "수신 음성 통화" @@ -3438,7 +3438,7 @@ "messageformat": "수신 음성 통화" }, "icu:incomingVideoCall": { - "messageformat": "수신 화상 통화" + "messageformat": "영상 통화 수신 중" }, "icu:outgoingAudioCall": { "messageformat": "발신 음성 통화" @@ -3576,16 +3576,16 @@ "messageformat": "{people, plural, other {{people,number}명이 통화 중}}" }, "icu:calling__call-notification__ended": { - "messageformat": "화상 통화를 종료했습니다" + "messageformat": "영상 통화를 종료했습니다" }, "icu:calling__call-notification__started-by-someone": { - "messageformat": "화상 통화를 시작함" + "messageformat": "영상 통화를 시작함" }, "icu:calling__call-notification__started-by-you": { - "messageformat": "화상 통화를 시작했습니다" + "messageformat": "영상 통화를 시작했습니다" }, "icu:calling__call-notification__started": { - "messageformat": "{name} 님이 화상 통화를 시작했습니다" + "messageformat": "{name} 님이 영상 통화를 시작했습니다" }, "icu:calling__in-another-call-tooltip": { "messageformat": "이미 통화 참가자 수 최대" @@ -4323,10 +4323,10 @@ "messageformat": "몇 분 정도 소요됩니다" }, "icu:BadgeDialog__become-a-sustainer-button": { - "messageformat": "Signal에 후원" + "messageformat": "Signal 후원하기" }, "icu:BadgeSustainerInstructions__header": { - "messageformat": "Signal에 후원" + "messageformat": "Signal 후원하기" }, "icu:BadgeSustainerInstructions__subheader": { "messageformat": "Signal은 여러분과 같은 사용자의 기여로 운영됩니다. 기부하고 배지를 받으세요." @@ -4338,7 +4338,7 @@ "messageformat": "설정을 열려면 왼쪽 상단의 프로필 사진을 탭하세요." }, "icu:BadgeSustainerInstructions__instructions__3": { - "messageformat": "'Singal에 기부'를 탭하여 구독하세요." + "messageformat": "'Singal 후원하기'를 탭하여 구독하세요." }, "icu:ProfileMovedModal__title": { "messageformat": "프로필을 이동함" @@ -5442,7 +5442,7 @@ "messageformat": "일반 설정" }, "icu:Preferences__button--donate": { - "messageformat": "Signal에 기부" + "messageformat": "Signal 후원하기" }, "icu:Preferences__button--appearance": { "messageformat": "모양" @@ -5628,22 +5628,22 @@ "messageformat": "Signal은 디스크에 파일을 쓸 권한이 없어 대화 기록을 내보낼 수 없습니다. 디스크 사용 권한을 변경하거나 시스템 설정을 업데이트한 다음 내보내기를 다시 시도해 보세요." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "백업을 내보내는 중" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "백업 내보내기 완료" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "백업 복원 방법:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "백업 폴더를 휴대폰 저장 공간으로 이전하세요" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "휴대폰에 Signal을 새로 설치하세요" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "'복원 또는 이전'을 탭한 다음 '기기 백업'을 선택하세요" }, "icu:NotificationProfile--moon-icon": { "messageformat": "달 아이콘" @@ -6390,7 +6390,7 @@ "messageformat": "{views, plural, other {답장 {views,number}개}}" }, "icu:MyStories__views-off": { - "messageformat": "수신 확인 꺼짐" + "messageformat": "열람 확인 꺼짐" }, "icu:MyStories__replies": { "messageformat": "{replyCount, plural, other {답장 {replyCount,number}개}}" @@ -6618,7 +6618,7 @@ "messageformat": "스토리 개인정보보호" }, "icu:StoriesSettings__view-receipts--label": { - "messageformat": "수신 확인" + "messageformat": "열람 확인" }, "icu:StoriesSettings__view-receipts--description": { "messageformat": "이 설정을 변경하려면 모바일 장치에서 Signal 앱을 열고 설정 -> 스토리로 이동합니다." @@ -6723,7 +6723,7 @@ "messageformat": "알림 켜기" }, "icu:StoryViewer__views-off": { - "messageformat": "수신 확인 꺼짐" + "messageformat": "열람 확인 꺼짐" }, "icu:StoryViewer__sending": { "messageformat": "보내는 중…" @@ -6750,7 +6750,7 @@ "messageformat": "첨부 파일 다운로드" }, "icu:StoryViewsNRepliesModal__read-receipts-off": { - "messageformat": "내 스토리를 본 사람을 확인하려면 수신 확인을 활성화하세요. 모바일 장치에서 Signal 앱을 열고 설정 > 스토리로 이동합니다." + "messageformat": "내 스토리를 본 사람을 확인하려면 열람 확인을 활성화하세요. 모바일 장치에서 Signal 앱을 열고 설정 > 스토리로 이동합니다." }, "icu:StoryViewsNRepliesModal__no-replies": { "messageformat": "답장 없음" @@ -7162,16 +7162,16 @@ "messageformat": "통화 링크" }, "icu:CallHistory__DescriptionVideoCall--Default": { - "messageformat": "{direction, select, Outgoing {발신 화상 통화} other {수신 화상 통화}}" + "messageformat": "{direction, select, Outgoing {발신 영상 통화} other {수신 영상 통화}}" }, "icu:CallHistory__DescriptionVideoCall--Missed": { - "messageformat": "부재중 화상 통화" + "messageformat": "부재중 영상 통화" }, "icu:CallHistory__DescriptionVideoCall--Unanswered": { - "messageformat": "응답하지 않은 화상 통화" + "messageformat": "응답하지 않은 영상 통화" }, "icu:CallHistory__DescriptionVideoCall--Declined": { - "messageformat": "화상 통화를 거부함" + "messageformat": "영상 통화를 거부함" }, "icu:CallLinkDetails__Join": { "messageformat": "참가" @@ -7327,7 +7327,7 @@ "messageformat": "영수증 세부 정보 보기" }, "icu:PreferencesDonations__faqs": { - "messageformat": "기부자 FAQ" + "messageformat": "후원자 FAQ" }, "icu:PreferencesDonations--receiptList__info": { "messageformat": "영수증은 여러 기기에서 동기화되지 않습니다. Signal을 다시 설치했다면 이전 기부 영수증은 사용할 수 없습니다." @@ -7456,7 +7456,7 @@ "messageformat": "기부에 성공했지만, 배지 설정을 업데이트하지 못했습니다." }, "icu:Donations__BadgeApplicationFailed__Description": { - "messageformat": "모바일 기기에서 배지 설정을 업데이트하려면, 설정 → Signal에 기부 → 배지로 이동하세요." + "messageformat": "모바일 기기에서 배지 설정을 업데이트하려면, 설정 → Signal 후원하기 → 배지로 이동하세요." }, "icu:Donations__DonationInterrupted": { "messageformat": "기부가 중단됨" @@ -7483,7 +7483,7 @@ "messageformat": "기부 과정에서 오류 발생" }, "icu:Donations__GenericError__Description": { - "messageformat": "귀하의 기부금이 처리되지 않았을 수 있습니다. 'Signal에 기부'를 클릭한 후 '기부 영수증'을 클릭하여 영수증을 확인하세요." + "messageformat": "내 후원금이 처리되지 않았을 수 있습니다. 'Signal 후원하기'를 클릭한 후 '기부 영수증'을 클릭하여 영수증을 확인하세요." }, "icu:DonationsErrorBoundary__DonationUnexpectedError": { "messageformat": "다시 시도하거나 디버그 로그를 지원팀에 제출하여 기부를 완료하는 데 도움을 받으세요. 디버그 로그를 제출하면 문제를 진단하고 수정하는 데 도움이 됩니다. 디버그 로그에는 식별 정보가 포함되지 않습니다." @@ -7525,13 +7525,13 @@ "messageformat": "지지와 성원에 감사드립니다!" }, "icu:Donations__badge-modal--description": { - "messageformat": "Signal에서 기부자 배지를 받았습니다! 프로필에 표시하여 Signal에 대한 지지를 보여주세요." + "messageformat": "Signal에서 후원자 배지를 받았어요! 프로필에 표시하여 Signal을 응원하는 마음을 표현해 보세요." }, "icu:Donations__badge-modal--display-on-profile": { "messageformat": "프로필에 표시" }, "icu:Donations__badge-modal--help-text": { - "messageformat": "모바일 장치의 설정 → Signal에 기부 → 배지에서 조정할 수 있습니다." + "messageformat": "모바일 앱의 설정 → Signal 후원하기 → 배지에서 조정할 수 있습니다." }, "icu:CallQualitySurvey__CloseButton__AccessibilityLabel": { "messageformat": "닫기" @@ -7612,7 +7612,7 @@ "messageformat": "이를 통해 통화 품질을 점검하고 개선점을 찾는 데 활용됩니다. 피드백은 디버그 로그를 확인한 후 제출할 수 있습니다." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "피드백을 제출하면 통화에 대한 진단 정보가 함께 공유됩니다. 원하는 경우 통화 품질 개선을 위해 디버그 로그를 함께 공유할 수도 있습니다." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "디버그 로그 공유" @@ -7645,7 +7645,7 @@ "messageformat": "피드백을 보내주셔서 감사합니다!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "메가폰을 사용하려면 사이드바를 펼치세요" }, "icu:WhatsNew__bugfixes": { "messageformat": "이 버전에는 Signal의 원활한 실행을 위한 일부 기능 업데이트와 버그 수정이 다수 포함되어 있습니다.", @@ -7679,6 +7679,6 @@ "messageformat": "그룹 통화에서 손 든 사람 표시가 제대로 나타나지 않던 사소한 버그를 수정했습니다." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "고정 메시지를 사용하면 중요한 정보를 쉽게 확인할 수 있도록 채팅 상단에 고정할 수 있습니다." } } diff --git a/_locales/ky-KG/messages.json b/_locales/ky-KG/messages.json index 93f8500db4..470c0a0fc3 100644 --- a/_locales/ky-KG/messages.json +++ b/_locales/ky-KG/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Signal'га файлдарды дискке жазганга уруксат берилбегендиктен, маек таржымалын экспорттой албайсыз. Уруксат берип же системанын параметрлерин өзгөртүп, кайра экспорттоп көрүңүз." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Камдык көчүрмө экспорттолууда" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Камдык көчүрмө экспорттолуп бүттү" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Бул камдык көчүрмөнү калыбына келтирүү үчүн:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Камдык көчүрмөлөрүңүздүн папкасын телефонуңуздун сактагычына ташыңыз" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Signal'дын жаңы көчүрмөсүн телефонуңузга орнотуңуз" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "\"Калыбына келтирүү же өткөрүү\" дегенди басып, \"Түзмөктүн камдык көчүрмөлөрүнө\" дегенди тандаңыз" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Айдын сүрөтчөсү" @@ -7612,7 +7612,7 @@ "messageformat": "Чалуулар тууралуу кененирээк маалымат алып, эмнелер иштеп же иштебей жатканын биле алабыз. Жөнөтөрдөн мурун аныкталган мүчүлүштүктөрдү карап көрсөңүз болот." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Пикириңиз чалууңуздагы мүчүлүштүктөр тууралуу маалымат менен кошо жөнөтүлөт. Чалуунун сапатын жакшыртуу үчүн мүчүлүштүктөр журналын да бөлүшсөңүз болот." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Мүчүлүштүктөр журналын бөлүшүү" @@ -7645,7 +7645,7 @@ "messageformat": "Пикириңиз үчүн чоң рахмат!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Мегафонду колдонуу үчүн капталдагы тилкени кеңейтиңиз" }, "icu:WhatsNew__bugfixes": { "messageformat": "Бул версия бир нече майда өзгөртүүлөрдү жана мүчүлүштүктөрдү оңдоолорду камтыйт.", @@ -7679,6 +7679,6 @@ "messageformat": "Оңтойсуз тынчтыкты буза албайбыз, бирок кээде көз ачып жумгуча көтөрүлүп түшүрүлгөн кол көрүнбөй калган мүчүлүштүктү оңдоп койдук (нөл деп эсептелген)." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Маанилүү маалымат дароо көрүнүп турушу үчүн билдирүүлөрдү кадаңыз. Эң көп сураган суроолоруңуз, ресторанда ээлеп койгон орундарыңыз жана өргүүлөрүңүз ар дайым көңүл чордонунда болот. Эми алар маектин жогору жагында да көрүнөт.\n\n" } } diff --git a/_locales/lt-LT/messages.json b/_locales/lt-LT/messages.json index 13ee916543..a8761fedd9 100644 --- a/_locales/lt-LT/messages.json +++ b/_locales/lt-LT/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Jūsų pokalbių istorijos negalima eksportuoti, nes „Signal“ neturi leidimo įrašyti failus į diską. Pabandykite pakeisti disko leidimus arba atnaujinti sistemos nustatymus ir tada eksportuoti dar kartą." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Eksportuojama atsarginė kopija" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Atsarginės kopijos eksportavimas baigtas" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Norėdami atkurti šią atsarginę kopiją:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Perkelkite atsarginių kopijų aplanką į telefono saugyklą." }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Įdiekite naują „Signal“ kopiją savo telefone." }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Palieskite „Atkurti arba perkelti“ ir pasirinkite „Atsarginė kopija įrenginyje“." }, "icu:NotificationProfile--moon-icon": { "messageformat": "Mėnulio piktograma" @@ -7612,7 +7612,7 @@ "messageformat": "Tai padeda mums daugiau sužinoti apie skambučius ir tai, kas veikia ir neveikia. Prieš pateikdami derinimo žurnalą galite jį peržiūrėti." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Pateikus atsiliepimą juo bus dalijamasi kartu su diagnostine informacija apie skambutį. Jei norite, galite pasidalinti derinimo žurnalu, kad padėtumėte mums gerinti skambučių kokybę." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Bendrinti derinimo žurnalą" @@ -7645,7 +7645,7 @@ "messageformat": "Ačiū už atsiliepimą!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Išskleiskite šoninę juostą, kad galėtumėte naudotis megafonu" }, "icu:WhatsNew__bugfixes": { "messageformat": "Šioje versijoje yra daug smulkių patobulinimų ir klaidų ištaisymų, kurie padės Signal sklandžiai veikti.", @@ -7679,6 +7679,6 @@ "messageformat": "Ištaisėme nedidelę rodymo klaidą, susijusią su pakeltos rankos indikatoriumi grupės skambučiuose." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Prisegtos žinutės gali padėti lengvai pasiekti svarbią informaciją pokalbio viršuje." } } diff --git a/_locales/lv-LV/messages.json b/_locales/lv-LV/messages.json index de7f708ecc..9b42ac0e6e 100644 --- a/_locales/lv-LV/messages.json +++ b/_locales/lv-LV/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Sarunu vēsturi nevar eksportēt, jo Signal nav atļaujas ierakstīt failus diskā. Mēģiniet mainīt diska atļaujas vai atjaunināt sistēmas iestatījumus un pēc tam eksportējiet vēlreiz." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Rezerves kopiju eksportēšana" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Rezerves kopiju eksportēšana pabeigta" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Lai atjaunotu šo rezerves kopiju:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "pārsūtiet savu rezerves kopiju mapi uz tālruņa krātuvi;" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "instalējiet jaunu Signal kopiju savā tālrunī;" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "pieskarieties pie \"Atjaunot vai pārsūtīt\" un izvēlieties \"Rezerves kopijas ierīcē\"." }, "icu:NotificationProfile--moon-icon": { "messageformat": "Mēness ikona" @@ -7612,7 +7612,7 @@ "messageformat": "Tas palīdz mums uzlabot zvanus un saprast, kas darbojas vai nedarbojas. Pirms iesniegšanas varat apskatīt atkļūdošanas žurnālu." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Iesniedzot atsauksmi, jūsu atsauksmei tiks pievienota arī diagnostikas informācija par zvanu. Varat izvēlēties kopīgot arī atkļūdošanas žurnālu, lai palīdzētu mums uzlabot zvanu kvalitāti." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Kopīgot atkļūdošanas žurnālu" @@ -7645,7 +7645,7 @@ "messageformat": "Paldies par atsauksmēm!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Izvērsiet sānjoslu, lai mijiedarbotos ar megafonu" }, "icu:WhatsNew__bugfixes": { "messageformat": "Šī versija ietver vairākus nelielus uzlabojumus un kļūdu labojumus, lai Signal darbotos bez problēmām.", @@ -7679,6 +7679,6 @@ "messageformat": "Mēs nevaram novērst neveiklu klusumu, toties mēs novērsām kļūdu, kuras dēļ paceltas rokas indikators reizēm vēl aizvien palika redzams, kad kāds strauji pacēla un nolaida roku." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Padariet svarīgu informāciju viegli pieejamu, izmantojot piespraustās ziņas. Jūsu biežāk uzdotie jautājumi, vakariņu rezervācijas un atvaļinājuma plāni ir būtiski. Tagad tos var piespraust arī sarunas augšdaļā." } } diff --git a/_locales/mk-MK/messages.json b/_locales/mk-MK/messages.json index ced4061008..b46a25bc55 100644 --- a/_locales/mk-MK/messages.json +++ b/_locales/mk-MK/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Вашата историја на разговори не може да се извезе бидејќи Signal нема дозвола да зачува датотеки на вашиот диск. Обидете се да ги промените дозволите на дискот или да ги ажурирате системските поставки, а потоа повторно извезете." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Извоз на резервна копија" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Извозот на резервна копија е завршен" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "За да ја вратите оваа резервна копија:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Пренесете ја папката со резервни копии во меморијата на вашиот телефон" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Инсталирајте нова копија од Signal на вашиот телефон" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Допрете „Врати или пренеси“ и изберете „Резервна копија на уредот“" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Икона месечина" @@ -7612,7 +7612,7 @@ "messageformat": "Ова ни помага да дознаеме повеќе за повиците и што функционира, а што не. Можете да го видите вашиот запис за отстранување грешки пред да го испратите." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Поднесувањето ќе ги сподели вашите коментари заедно со дијагностички информации за вашиот повик. Можете исто така да споделите запис за отстранување грешки за да ни помогнете да го подобриме квалитетот на повиците." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Споделете запис за дебагирање" @@ -7645,7 +7645,7 @@ "messageformat": "Ви благодариме за коментарите!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Проширете ја страничната лента за интеракција со мегафонот" }, "icu:WhatsNew__bugfixes": { "messageformat": "Оваа верзија има некои мали подобрувања и решени багови за Signal да функционира беспрекорно.", @@ -7679,6 +7679,6 @@ "messageformat": "Поправивме мала дисплеј грешка со индикаторот за крената рака во групните повици." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Закачените пораки ги прават важните информации лесно достапни на врвот на разговорот. Вашите најчесто поставувани прашања, резервации за вечера и распореди за патувања веќе ви се први на мисла. Сега тие можат да бидат и на врвот на разговорот." } } diff --git a/_locales/ml-IN/messages.json b/_locales/ml-IN/messages.json index 1b59bb027e..ba3dc8c758 100644 --- a/_locales/ml-IN/messages.json +++ b/_locales/ml-IN/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Signal-ന് ഡിസ്കിലേക്ക് ഫയലുകൾ എഴുതാൻ അനുമതിയില്ലാത്തതിനാൽ നിങ്ങളുടെ ചാറ്റ് ചരിത്രം എക്സ്പോർട്ട് ചെയ്യാൻ കഴിയില്ല. നിങ്ങളുടെ ഡിസ്കിന്റെ അനുമതികൾ മാറ്റാനോ സിസ്റ്റം ക്രമീകരണങ്ങൾ അപ്ഡേറ്റ് ചെയ്യാനോ ശ്രമിക്കുക, തുടർന്ന് വീണ്ടും എക്സ്പോർട്ട് ചെയ്യുക." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "ബാക്കപ്പ് എക്‌സ്‌പോർട്ടുചെയ്യുന്നു" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "ബാക്കപ്പ് എക്‌സ്‌പോർട്ട് പൂർത്തിയായി" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "ഈ ബാക്കപ്പ് പുനഃസ്ഥാപിക്കാൻ:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "നിങ്ങളുടെ ഫോണിന്റെ സംഭരണത്തിലേക്ക് ബാക്കപ്പ് ഫോൾഡർ മാറ്റുക" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "നിങ്ങളുടെ ഫോണിൽ Signal-ന്റെ ഒരു പുതിയ പകർപ്പ് ഇൻസ്റ്റാൾ ചെയ്യുക" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "\"പുനഃസ്ഥാപിക്കുക അല്ലെങ്കിൽ കൈമാറുക\" ടാപ്പ് ചെയ്‌ത് \"ഉപകരണ ബാക്കപ്പിൽ\" തിരഞ്ഞെടുക്കുക" }, "icu:NotificationProfile--moon-icon": { "messageformat": "മൂൺ ഐക്കൺ" @@ -7612,7 +7612,7 @@ "messageformat": "കോളുകളെക്കുറിച്ചും എന്താണ് പ്രവർത്തിക്കുന്നത് അല്ലെങ്കിൽ പ്രവർത്തിക്കാത്തത് എന്നതിനെക്കുറിച്ചും കൂടുതലറിയാൻ ഇത് ഞങ്ങളെ സഹായിക്കുന്നു. സമർപ്പിക്കുന്നതിന് മുമ്പ് നിങ്ങളുടെ ഡീബഗ് ലോഗ് കാണാൻ കഴിയും." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "സമർപ്പിക്കുന്നത് നിങ്ങളുടെ കോളിനെക്കുറിച്ചുള്ള പ്രശ്നനിർണ്ണയ വിവരങ്ങൾക്ക്ഒപ്പം നിങ്ങളുടെ ഫീഡ്‌ബാക്കും പങ്കിടും. കോൾ നിലവാരം മെച്ചപ്പെടുത്താൻ ഞങ്ങളെ സഹായിക്കുന്നതിന് നിങ്ങൾക്ക് ഒരു ഡീബഗ് ലോഗ് ഓപ്ഷണലായി പങ്കിടാവുന്നതാണ്." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "ഡീബഗ് ലോഗ് പങ്കിടുക" @@ -7645,7 +7645,7 @@ "messageformat": "നിങ്ങളുടെ പ്രതികരണത്തിന് നന്ദി!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "മെഗാഫോണുമായി സംവദിക്കാൻ സൈഡ്‌ബാർ വികസിപ്പിക്കുക" }, "icu:WhatsNew__bugfixes": { "messageformat": "Signal സുഗമമായി പ്രവർത്തിപ്പിക്കുന്നതിന് ആവശ്യമായ ഏതാനും ചെറിയ മാറ്റങ്ങളും ബഗ് ഫിക്‌സുകളും ഈ പതിപ്പിൽ അടങ്ങിയിട്ടുണ്ട്.", @@ -7679,6 +7679,6 @@ "messageformat": "തുടർന്നുണ്ടാകുന്ന അസ്വാഭാവികമായ നിശബ്ദത പരിഹരിക്കാൻ ഞങ്ങൾക്ക് കഴിയില്ല, എന്നാൽ ആരെങ്കിലും വളരെ വേഗത്തിൽ കൈ ഉയർത്തുകയും താഴ്ത്തുകയും ചെയ്താൽ ഉയർത്തിയ കൈ സൂചകം ദൃശ്യമാകുന്ന ഒരു ബഗ് (പൂജ്യം എണ്ണത്തിൽ) ഞങ്ങൾ പരിഹരിച്ചിട്ടുണ്ട്." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "പിൻ ചെയ്‌ത സന്ദേശങ്ങൾ ഉപയോഗിച്ച് പ്രധാനപ്പെട്ട വിവരങ്ങൾ എളുപ്പത്തിൽ ആക്‌സസ് ചെയ്യാൻ സഹായിക്കുക. നിങ്ങളുടെ പതിവ് ചോദ്യങ്ങൾ, അത്താഴ റിസർവേഷനുകൾ, അവധിക്കാല യാത്രാ പദ്ധതികൾ എന്നിവ ഇതിനകം തന്നെ നിങ്ങളുടെ മനസ്സിലെ പ്രധാന കാര്യങ്ങളാണ്. അവയെ ചാറ്റിലെയും പ്രധാന കാര്യങ്ങളാക്കാം." } } diff --git a/_locales/mr-IN/messages.json b/_locales/mr-IN/messages.json index 86cf749711..c456b634dc 100644 --- a/_locales/mr-IN/messages.json +++ b/_locales/mr-IN/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "तुमचा चॅट इतिहास एक्सपोर्ट करता येत नाही कारण Signal कडे फाईल्स डिस्कवर राइट करण्याची अनुमती नाही. तुमच्या डिस्कच्या परवानग्या बदलून पाहा किंवा तुमच्या सिस्टीमच्या सेटिंग्ज अद्ययावत करा आणि मग पुन्हा एक्सपोर्ट करा." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "बॅकअप एक्सपोर्ट होत आहे" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "बॅकअप एक्सपोर्ट पूर्ण झाला" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "हे बॅकअप रीस्टोर करण्यासाठी:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "तुमच्या बॅकअपचा फोल्डर तुमच्या फोनच्या साठवणीमध्ये हस्तांतरित करा" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "तुमच्या फोनवर Signal ची एक नवी प्रत इन्स्टॉल करा" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "\"रीस्टोर किंवा हस्तांतरण करा\" वर टॅप करा आणि \"डिव्हाईस बॅकअपवर\" निवडा" }, "icu:NotificationProfile--moon-icon": { "messageformat": "चंद्राचा आयकन" @@ -7612,7 +7612,7 @@ "messageformat": "यामुळे आम्हाला कॉल्सविषयी अधिक जाणून घेण्यास मदत होते आणि काय काम करत आहे व काय करत नाही हे समजून घेता येते. तुम्ही सबमिट करण्यापूर्वी तुमचा डीबग लॉग पाहू शकता." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "सबमिट केल्याने तुमचा प्रतिसाद तुमच्या कॉलबद्दलच्या निदानात्मक माहितीसह शेअर केला जाईल. तुम्ही पर्याय म्हणून आम्हाला कॉलची गुणवत्ता सुधारण्यास मदत करण्यासाठी डीबग लॉग शेअर करू शकता." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "डीबग लॉग शेअर करा" @@ -7645,7 +7645,7 @@ "messageformat": "तुमच्या प्रतिसादाबद्दल धन्यवाद!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "मेगाफोनसह संवाद साधण्यासाठी साईडबार मोठा करा" }, "icu:WhatsNew__bugfixes": { "messageformat": "Signal निर्विघ्नपणे चालत ठेवण्यासाठी या आवृत्तीत अनेक लहान समन्वय आणि त्रुटी दुरुस्त्या समाविष्ट आहेत", @@ -7679,6 +7679,6 @@ "messageformat": "आम्ही गट कॉल्समधील एक छोटा डिस्प्ले बग दुरुस्त केला ज्यामुळे हात उचलल्याचा इंडिकेटर काम झाल्यावरही दिसत राहायचा (शून्य मोजणीसह)." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "पिन केलेल्या संदेशांच्या मदतीने महत्त्वाची माहिती सहजपणे मिळवणे सोपे करा. तुम्हाला वारंवार पडणारे प्रश्न, बाहेर जेवायच्या ठरलेल्या वेळा आणि सहलीचे ठरलेले कार्यक्रम नेहमीच तुमच्या मनात सर्वोच्च स्थानी असतात. आता ते चॅटमध्येही सर्वोच्च स्थानी असू शकतात." } } diff --git a/_locales/ms/messages.json b/_locales/ms/messages.json index d8fdabbae8..04e85a4372 100644 --- a/_locales/ms/messages.json +++ b/_locales/ms/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Sejarah sembang anda tidak boleh dieksport kerana Signal tidak mempunyai kebenaran untuk menulis fail ke cakera. Cuba tukar keizinan cakera anda atau kemas kini tetapan sistem anda dan kemudian eksport semula." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Mengeksport sandaran" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Eksport sandaran selesai" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Untuk memulihkan sandaran ini:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Pindahkan folder sandaran anda ke storan telefon anda" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Pasang salinan baharu Signal pada telefon anda" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Ketik \"Pulihkan atau Pindahkan\" dan pilih \"Sandaran Pada Peranti\"" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ikon bulan" @@ -7612,7 +7612,7 @@ "messageformat": "Ini membantu kami mengetahui lebih lanjut tentang panggilan dan perkara yang berfungsi atau tidak berfungsi. Anda boleh melihat log nyahpepijat anda sebelum menghantar." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Penyerahan akan berkongsi maklum balas anda bersama maklumat diagnostik tentang panggilan anda. Anda boleh berkongsi log nyahpepijat secara pilihan untuk membantu kami meningkatkan kualiti panggilan." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Kongsi log nyahpepijat" @@ -7645,7 +7645,7 @@ "messageformat": "Terima kasih atas maklum balas anda!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Kembangkan bar sisi untuk berinteraksi dengan megafon" }, "icu:WhatsNew__bugfixes": { "messageformat": "Versi ini mengandungi sedikit tweak kecil dan pembetulan pepijat untuk memastikan Signal berjalan dengan lancar.", @@ -7679,6 +7679,6 @@ "messageformat": "Kami telah membetulkan pepijat paparan kecil pada penunjuk angkat tangan dalam panggilan kumpulan." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Mesej yang dipin boleh membantu anda memastikan maklumat penting sentiasa mudah diakses di bahagian atas sembang." } } diff --git a/_locales/my/messages.json b/_locales/my/messages.json index 8c427d8c58..058e357646 100644 --- a/_locales/my/messages.json +++ b/_locales/my/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Signal တွင် ဖိုင်များရေးရန် ခွင့်ပြုချက်မရှိသောကြောင့် သင့်ချက်(တ်)မှတ်တမ်းကို ထုတ်ယူ၍မရပါ။ သင့်ဒစ်ခ်၏ ခွင့်ပြုချက်များကို ပြောင်းလဲကြည့်ပါ သို့မဟုတ် သင့်စနစ်ဆက်တင်ကို အပ်ဒိတ်လုပ်ပြီး ထပ်မံထုတ်ယူကြည့်ပါ။" }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "ဘက်ခ်အပ် ထုတ်သိမ်းနေပါသည်" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "ဘက်ခ်အပ် ထုတ်သိမ်းမှု ပြီးပါပြီ" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "ဘက်ခ်အပ် ပြန်လည်ရယူရန်" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "သင့် ဘက်ခ်အပ်ဖိုင်တွဲကို ဖုန်း၏ထားသိုမှုထဲသို့ လွှဲပြောင်းပါ" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "သင့်ဖုန်းတွင် Signal အသစ်ကို ထည့်သွင်းပါ" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "“ပြန်လည်ရယူရန် သို့မဟုတ် လွှဲပြောင်းရန်” ကိုနှိပ်ပြီး “စက်ပေါ်တွင် ဘက်ခ်အပ်ပြုလုပ်ရန်” ကို ရွေးချယ်ပါ။" }, "icu:NotificationProfile--moon-icon": { "messageformat": "လပုံစံ အိုင်ကွန်" @@ -7612,7 +7612,7 @@ "messageformat": "၎င်းက ဖုန်းခေါ်ဆိုမှုများအပြင် မည်သည့်အရာများက ကောင်းစွာ အလုပ်လုပ်သည်၊ မလုပ်သည်ကို ပိုမိုလေ့လာရန် ကူညီပေးပါသည်။ တင်သွင်းခြင်းမပြုမီ သင်၏ ပြစ်ချက်မှတ်တမ်းကို ကြည့်ရှုနိုင်ပါသည်။" }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "တင်သွင်းရာတွင် သင့်တုံ့ပြန်ချက်ကို ခေါ်ဆိုမှုနှင့် ပတ်သက်သည့် ချွတ်ယွင်းချက် အချက်အလက်နှင့်အတူ မျှဝေပါမည်။ ဖုန်းခေါ်ဆိုမှု အရည်အသွေး မြှင့်တင်ရေးတွင် ကူညီပေးရန်အတွက် ပြစ်ချက်မှတ်တမ်းတစ်ခုကို ရွေးချယ်၍ မျှဝေနိုင်ပါသည်။" }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "ပြစ်ချက်မှတ်တမ်း မျှဝေရန်" @@ -7645,7 +7645,7 @@ "messageformat": "သင့်အကြံပြုချက်အတွက် ကျေးဇူးတင်ပါသည်။" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "မက်ဂါဖုန်းနှင့် အပြန်အလှန်ဆက်သွယ်ရန် ဘေးဘက်ဘားကို ချဲ့ပါ" }, "icu:WhatsNew__bugfixes": { "messageformat": "ဤဗားရှင်းတွင် Signal အား အထစ်အငေါ့မရှိ လုပ်ဆောင်နိုင်စေရန် ချို့ယွင်းချက် ပြင်ဆင်မှုများနှင့် အနေအထား ပြုပြင်မှု အသေးလေးများ ပါဝင်ပါသည်။", @@ -7679,6 +7679,6 @@ "messageformat": "အဖွဲ့လိုက်ခေါ်ဆိုမှုများတွင် ချွတ်ယွင်းချက်အသေးအဖွဲဖြစ်သော လက်ထောင်ထားသည့်ညွှန်ပြချက် ရုပ်ပုံကို ပြင်ဆင်ထားပါသည်။" }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "မက်ဆေ့ချ်များကို ပင်တွဲခြင်းအားဖြင့် အရေးကြီးသော အချက်အလက်များကို ချက်(တ်)၏ထိပ်တွင် အလွယ်တကူ ဝင်ရောက်ကြည့်ရှုနိုင်စေရန် ကူညီပေးပါသည်။" } } diff --git a/_locales/nb/messages.json b/_locales/nb/messages.json index 3dd94f9313..03a9f38f06 100644 --- a/_locales/nb/messages.json +++ b/_locales/nb/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Samtaleloggen din kunne ikke eksporteres fordi Signal ikke har tillatelse til å lagre filer på disken din. Du må endre tillatelsene for disken eller systeminnstillingene før du kan prøve på nytt." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Eksporterer sikkerhetskopi" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Eksporten er fullført" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Slik gjenoppretter du sikkerhetskopien:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Overfør sikkerhetskopimappen til lagringsplassen på mobilen" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Installer Signal på mobilen på nytt" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Trykk på «Gjenopprett eller overfør» og velg «På enheten»" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Måneikon" @@ -7612,7 +7612,7 @@ "messageformat": "Dette gir oss mer innsikt i hva som virker og ikke virker i samtaler. Du kan se gjennom feilsøkingsloggen før du sender den inn." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Når du sender inn tilbakemeldingen, sendes også diagnostisk informasjon om anropet. Du kan også dele feilsøkingsloggen din for å bidra til å gjøre anropskvaliteten bedre." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Del feilsøkingslogg" @@ -7645,7 +7645,7 @@ "messageformat": "Takk for tilbakemeldingen!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Utvid sidefeltet for å bruke megafonen" }, "icu:WhatsNew__bugfixes": { "messageformat": "Denne versjonen inneholder noen justeringer og feilrettinger som sikrer at Signal fungerer optimalt.", @@ -7679,6 +7679,6 @@ "messageformat": "Vi rettet opp i en liten feil med indikatoren som viser at noen har rukket opp hånden i en gruppesamtale." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Hold viktig informasjon lett tilgjengelig med festede meldinger. De vanligste spørsmålene, bordreservasjonene og ferieplanene dine ligger alltid fremst i pannebrasken. Nå kan de også ligge fremst i samtalen." } } diff --git a/_locales/nl/messages.json b/_locales/nl/messages.json index b298e55b82..25fce63f12 100644 --- a/_locales/nl/messages.json +++ b/_locales/nl/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Je chatgeschiedenis kan niet worden geëxporteerd omdat Signal geen toestemming heeft om bestanden naar de schijf te schrijven. Probeer de rechten van je schijf te wijzigen of je systeeminstellingen bij te werken en exporteer dan opnieuw." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Back-up exporteren" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Back-up exporteren voltooid" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Om deze back-up te herstellen:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Zet je back-upmap over naar de opslag van je telefoon" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Installeer Signal opnieuw op je telefoon" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Tik op ‘Herstellen of overzetten’ en kies ‘Lokale back-up’" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Maanpictogram" @@ -7612,7 +7612,7 @@ "messageformat": "Dit helpt ons om oproepen in Signal te verbeteren. Je kunt je foutopsporingslog bekijken voordat je het indient." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Door te versturen ontvangen we jouw feedback samen met diagnostische informatie over je oproep. Optioneel kun je een foutopsporingslog delen om ons te helpen de gesprekskwaliteit te verbeteren." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Foutopsporingslog delen" @@ -7645,7 +7645,7 @@ "messageformat": "Bedankt voor je feedback!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Zijbalk uitklappen om megafoon te bekijken" }, "icu:WhatsNew__bugfixes": { "messageformat": "Deze versie bevat een aantal kleine foutoplossingen waardoor Signal voor nog meer mensen goed werkt.", @@ -7679,6 +7679,6 @@ "messageformat": "We kunnen de ongemakkelijke stilte die daarop volgt niet verhelpen, maar we hebben wel een bug opgelost die er soms voor zorgde dat de opgestoken handindicator zichtbaar bleef (met een telling van nul) als iemand zijn hand heel snel opstak en weer liet zakken." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Zorg voor gemakkelijke toegang tot belangrijke informatie met vastgezette berichten. Je meestgestelde vragen, restaurantreserveringen en vakantieplannen staan al bovenaan je prioriteitenlijst. Ze kunnen nu ook bovenaan een chat staan." } } diff --git a/_locales/pa-IN/messages.json b/_locales/pa-IN/messages.json index ff793a80d4..ed5cfaaea3 100644 --- a/_locales/pa-IN/messages.json +++ b/_locales/pa-IN/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "ਤੁਹਾਡੀ ਪੁਰਾਣੀ ਚੈਟ ਨੂੰ ਐਕਸਪੋਰਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਕਿਉਂਕਿ Signal ਕੋਲ ਡਿਸਕ 'ਤੇ ਫਾਈਲਾਂ ਲਿਖਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ। ਆਪਣੀ ਡਿਸਕ ਦੀਆਂ ਇਜਾਜ਼ਤਾਂ ਬਦਲਣ ਜਾਂ ਆਪਣੀਆਂ ਸਿਸਟਮ ਸੈਟਿੰਗਾਂ ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ ਅਤੇ ਫਿਰ ਦੁਬਾਰਾ ਐਕਸਪੋਰਟ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "ਬੈਕਅੱਪ ਐਕਸਪੋਰਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "ਬੈਕਅੱਪ ਐਕਸਪੋਰਟ ਪੂਰਾ ਹੋਇਆ" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "ਇਸ ਬੈਕਅੱਪ ਨੂੰ ਰੀਸਟੋਰ ਕਰਨ ਲਈ:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "ਆਪਣੇ ਬੈਕਅੱਪ ਫੋਲਡਰ ਨੂੰ ਆਪਣੇ ਫ਼ੋਨ ਦੀ ਸਟੋਰੇਜ ਵਿੱਚ ਟ੍ਰਾਂਸਫਰ ਕਰੋ" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "ਆਪਣੇ ਫ਼ੋਨ 'ਤੇ Signal ਦੀ ਇੱਕ ਨਵੀਂ ਕਾਪੀ ਇੰਸਟਾਲ ਕਰੋ" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "\"ਰੀਸਟੋਰ ਕਰੋ ਜਾਂ ਟ੍ਰਾਂਸਫਰ ਕਰੋ\" 'ਤੇ ਟੈਪ ਕਰੋ ਅਤੇ \"ਡਿਵਾਈਸ-ਉੱਤੇ ਬੈਕਅੱਪ\" ਨੂੰ ਚੁਣੋ" }, "icu:NotificationProfile--moon-icon": { "messageformat": "ਚੰਦਰਮਾ ਦਾ ਆਈਕਾਨ" @@ -7612,7 +7612,7 @@ "messageformat": "ਇਹ ਸਾਨੂੰ ਕਾਲਾਂ ਬਾਰੇ ਜਾਣਨ ਅਤੇ ਕੀ ਕੰਮ ਕਰ ਰਿਹਾ ਹੈ ਅਤੇ ਕੀ ਨਹੀਂ, ਇਸ ਬਾਰੇ ਹੋਰ ਜਾਣਨ ਵਿੱਚ ਮਦਦ ਮਿਲਦੀ ਹੈ। ਤੁਸੀਂ ਦਰਜ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਆਪਣਾ ਡੀਬੱਗ ਲੌਗ ਦੇਖ ਸਕਦੇ ਹੋ।" }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "ਦਰਜ ਕਰਨ ਨਾਲ ਤੁਹਾਡਾ ਫੀਡਬੈਕ ਤੁਹਾਡੀ ਕਾਲ ਬਾਰੇ ਡਾਇਗਨੌਸਟਿਕਸ ਜਾਣਕਾਰੀ ਦੇ ਨਾਲ ਸਾਂਝਾ ਕੀਤਾ ਜਾਵੇਗਾ। ਕਾਲ ਦੀ ਗੁਣਵੱਤਾ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਸਾਡੀ ਮਦਦ ਕਰਨ ਲਈ ਜੇ ਤੁਸੀਂ ਚਾਹੋ ਤਾਂ ਡੀਬੱਗ ਲੌਗ ਵੀ ਸਾਂਝਾ ਕਰ ਸਕਦੇ ਹੋ।" }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "ਡੀਬੱਗ ਲੌਗ ਸਾਂਝਾ ਕਰੋ" @@ -7645,7 +7645,7 @@ "messageformat": "ਫੀਡਬੈਕ ਦੇਣ ਲਈ ਤੁਹਾਡਾ ਧੰਨਵਾਦ!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "ਮੈਗਾਫੋਨ ਨਾਲ ਇੰਟਰੈਕਟ ਕਰਨ ਲਈ ਸਾਈਡਬਾਰ ਨੂੰ ਵੱਡਾ ਕਰੋ" }, "icu:WhatsNew__bugfixes": { "messageformat": "Signal ਨੂੰ ਸੁਚਾਰੂ ਢੰਗ ਨਾਲ ਚੱਲਦਾ ਰੱਖਣ ਲਈ ਇਸ ਵਰਜ਼ਨ ਵਿੱਚ ਨਿੱਕੇ-ਮੋਟੇ ਸੁਧਾਰ ਅਤੇ ਬੱਗ ਠੀਕ ਕੀਤੇ ਗਏ ਹਨ।", @@ -7679,6 +7679,6 @@ "messageformat": "ਅਸੀਂ ਗਰੁੱਪ ਕਾਲਾਂ ਵਿੱਚ ਹੱਥ ਉੱਪਰ ਕਰਨ ਵਾਲੇ ਸੂਚਕ ਨਾਲ ਜੁੜੀ ਛੋਟੀ ਜਿਹੀ ਡਿਸਪਲੇ ਦੀ ਖ਼ਰਾਬੀ ਨੂੰ ਦਰੁਸਤ ਕੀਤਾ ਹੈ।" }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "ਪਿੰਨ ਕੀਤੇ ਸੁਨੇਹੇ ਚੈਟ ਦੇ ਸਿਖਰ 'ਤੇ ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਨੂੰ ਆਸਾਨੀ ਨਾਲ ਪਹੁੰਚਯੋਗ ਰੱਖਣ ਵਿੱਚ ਤੁਹਾਡੀ ਮਦਦ ਕਰ ਸਕਦੇ ਹਨ।" } } diff --git a/_locales/pl/messages.json b/_locales/pl/messages.json index 667c82122a..14d06f7a7b 100644 --- a/_locales/pl/messages.json +++ b/_locales/pl/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Nie można wyeksportować historii czatu, ponieważ Signal nie ma uprawnień do zapisywania plików na dysku. Zmień uprawnienia dostępu do dysku lub ustawienia systemowe, a następnie spróbuj ponownie." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Eksportowanie kopii zapasowej" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Eksport kopii zapasowej zakończony" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Aby przywrócić tę kopię zapasową:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Przenieś folder z kopią zapasową do pamięci telefonu" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Zainstaluj ponownie aplikację Signal na telefonie" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Wybierz opcję „Przywróć lub przenieś”, a następnie opcję „Kopia zapasowa na urządzeniu”" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ikona księżyca" @@ -7612,7 +7612,7 @@ "messageformat": "Dzięki Twojemu dziennikowi debugowania będziemy mieć lepszy wgląd w to, jak działają połączenia i co możemy w nich poprawić. Zanim wyślesz nam dziennik debugowania, możesz go wyświetlić." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Twoja opinia zostanie do nas przesłana wraz z informacjami diagnostycznymi dotyczącymi połączenia. Opcjonalnie możesz też udostępnić dziennik debugowania, który pomoże nam poprawić jakość połączeń." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Udostępnij dziennik debugowania" @@ -7645,7 +7645,7 @@ "messageformat": "Dziękujemy za opinię!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Rozwiń pasek boczny, aby wejść w interakcję z megafonem" }, "icu:WhatsNew__bugfixes": { "messageformat": "Ta wersja obejmuje wiele drobnych ulepszeń i poprawek błędów. Wszystko po to, aby aplikacja Signal działała płynnie.", @@ -7679,6 +7679,6 @@ "messageformat": "Zdarzało Ci się widzieć wskaźnik podniesionej ręki, choć nikt akurat się nie zgłaszał? Ten błąd pojawiał się czasem, gdy ktoś bardzo szybko podniósł i opuścił rękę. Na szczęście to już przeszłość. Teraz, gdy widzisz las rąk, znów możesz liczyć na ożywioną dyskusję." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Wracaj łatwo do ważnych informacji dzięki przypiętym wiadomościom. Link do zrzutki, wakacyjne plany czy trasa rowerowa na najbliższy weekend… Już nie musisz scrollować rozmowy w poszukiwaniu ważnych informacji. Znajdziesz je w kilka sekund." } } diff --git a/_locales/pt-BR/messages.json b/_locales/pt-BR/messages.json index 0f3dc299ba..0100c85d44 100644 --- a/_locales/pt-BR/messages.json +++ b/_locales/pt-BR/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Seu histórico de conversas não pode ser exportado porque o Signal não tem permissão para gravar arquivos no disco. Tente ajustar as permissões do disco ou atualizar as configurações do sistema e, depois, exporte novamente. " }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Exportando backup" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Exportação de backup concluída" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Para restaurar este backup:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Transfira sua pasta de backup para o armazenamento do seu telefone" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Instale uma cópia nova do Signal no seu telefone" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Toque em “Restaurar ou Transferir” e escolha “Backup no dispositivo”." }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ícone da lua" @@ -7612,7 +7612,7 @@ "messageformat": "Isso nos ajuda a saber mais sobre as chamadas e a compreender o que está funcionando ou não. Você pode ver seu registro de depuração antes de enviar." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Ao enviar, você compartilhará seu feedback juntamente com informações de diagnóstico sobre sua chamada. Você pode compartilhar, se quiser, um registro de depuração para nos ajudar a melhorar a qualidade da chamada." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Compartilhar registro de depuração" @@ -7645,7 +7645,7 @@ "messageformat": "Agradecemos seu feedback!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Expanda a barra lateral para interagir com o megafone" }, "icu:WhatsNew__bugfixes": { "messageformat": "Essa versão contém pequenos retoques e consertos no Signal para ele continuar funcionando confortavelmente.", @@ -7679,6 +7679,6 @@ "messageformat": "Corrigimos um erro que às vezes fazia o indicador de mão levantada continuar visível (com contagem zero) quando alguém levantava e abaixava a mão muito rápido. " }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Mantenha informações importantes facilmente acessíveis com mensagens fixadas. Agora você pode fixar até três mensagens no topo de qualquer conversa individual ou em grupo para compartilhar informações importantes. \n\n" } } diff --git a/_locales/pt-PT/messages.json b/_locales/pt-PT/messages.json index 3d622b9f65..dc9536fa59 100644 --- a/_locales/pt-PT/messages.json +++ b/_locales/pt-PT/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "O seu histórico de chats não pode ser exportado porque o Signal não tem permissão para gravar ficheiros no disco. Experimente alterar as permissões do seu disco ou atualizar as definições do seu sistema e depois volte a exportar." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "A exportar cópia de segurança" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Exportação da cópia de segurança concluída" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Para restaurar esta cópia de segurança:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Transfira a pasta da cópia de segurança para o armazenamento do telemóvel" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Instale uma nova cópia do Signal no seu telemóvel" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Toque em \"Restaurar ou transferir\" e escolha \"Cópia de segurança no dispositivo\"" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ícone de lua" @@ -7612,7 +7612,7 @@ "messageformat": "Isto ajuda-nos a saber mais sobre as chamadas e o que está a funcionar ou não. Pode ver o seu registo de depuração antes de submeter." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Ao enviar, partilhará o seu feedback juntamente com informações de diagnóstico sobre a sua chamada. Também pode opcionalmente partilhar um relatório de depuração para nos ajudar a melhorar a qualidade das chamadas." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Partilhar relatório de depuração" @@ -7645,7 +7645,7 @@ "messageformat": "Obrigado pelo seu feedback!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Expande a barra lateral para interagir com o megafone" }, "icu:WhatsNew__bugfixes": { "messageformat": "Esta versão contém um número de pequenas funcionalidades e correções de erros de forma a manter o Signal a correr suavemente.", @@ -7679,6 +7679,6 @@ "messageformat": "Corrigimos um erro visual menor com o indicador de mão levantada em chamadas de grupo." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Ajude a manter as informações importantes facilmente acessíveis com mensagens afixadas. As suas perguntas mais frequentes, reservas de jantar e itinerários de férias já estão no topo da lista. Agora também podem ficar no topo do chat.\n\n" } } diff --git a/_locales/ro-RO/messages.json b/_locales/ro-RO/messages.json index 87b2b7d628..8b36901798 100644 --- a/_locales/ro-RO/messages.json +++ b/_locales/ro-RO/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Istoricul conversațiilor nu poate fi exportat deoarece Signal nu are permisiunea de a scrie fișiere pe disc. Încearcă să modifici permisiunile discului sau să actualizezi setările de sistem, apoi exportă din nou." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Se exportă copia de rezervă" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Exportul copiei de rezervă a fost finalizat" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Pentru a restaura această copie de rezervă:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Transferă dosarul de backup în memoria telefonului" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Instalează o nouă copie a Signal pe telefon" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Atinge „Restaurare sau transfer” și alege „Backup pe dispozitiv”" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Pictograma lună" @@ -7612,7 +7612,7 @@ "messageformat": "Acest lucru ne ajută să aflăm mai multe despre apeluri și ce funcționează și ce nu funcționează. Poți vizualiza jurnalul de depanare înainte de trimitere." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Trimiterea va permite partajarea feedback-ului tău împreună cu informații de diagnostic despre apelul tău. Opțional, poți partaja un jurnal de depanare pentru a ne ajuta să îmbunătățim calitatea apelurilor." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Trimite jurnalul de depanare" @@ -7645,7 +7645,7 @@ "messageformat": "Mulțumesc pentru feedback!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Extinde bara laterală, pentru a interacționa cu megafonul" }, "icu:WhatsNew__bugfixes": { "messageformat": "Această versiune conține o serie de mici modificări și remedieri ale unor erori pentru ca Signal să funcționeze fără probleme.", @@ -7679,6 +7679,6 @@ "messageformat": "Nu putem remedia tăcerea stânjenitoare care urmează, dar am corectat un bug care uneori făcea ca indicatorul mâinii ridicate să rămână vizibil (cu un număr de zero) dacă cineva ridica și cobora mâna foarte repede." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Menține informațiile importante ușor accesibile cu ajutorul mesajelor fixate. Cele mai frecvente întrebări, rezervările pentru cină și itinerariile de vacanță sunt deja în topul gândurilor tale. Acum, ele pot fi și în topul chat-ului." } } diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index 082c1e8c44..89e6536876 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Историю чата нельзя экспортировать, потому что у Signal нет разрешения на запись файлов на диск. Попробуйте изменить права доступа к диску или обновить системные настройки, а затем экспортировать ещё раз." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Экспорт резервной копии" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Экспорт резервной копии завершён" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Чтобы восстановить эту резервную копию:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Перенесите папку с резервной копией в хранилище вашего телефона" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Установите новую копию Signal на свой телефон" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Нажмите «Восстановить или перенести» и выберите «Резервное копирование на устройстве»" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Значок луны" @@ -7612,7 +7612,7 @@ "messageformat": "Это помогает нам получить более подробную информацию о звонках и понять, что работает, а что нет. Вы можете просмотреть свой журнал отладки перед отправкой." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Отправьте свой отзыв вместе с диагностической информацией о вашем звонке. Вы можете, если хотите, поделиться с нами журналом отладки. Это поможет улучшить качество звонков." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Поделиться журналом отладки" @@ -7645,7 +7645,7 @@ "messageformat": "Спасибо за ваш отзыв!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Расширьте боковую панель для взаимодействия с мегафоном" }, "icu:WhatsNew__bugfixes": { "messageformat": "Эта версия содержит несколько небольших изменений и исправлений ошибок.", @@ -7679,6 +7679,6 @@ "messageformat": "Мы не можем исправить неловкую тишину, но зато исправили ошибку, из-за которой индикатор поднятой руки временами оставался видимым (с нулевым счётчиком), если кто-то очень быстро поднимал и опускал руку." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Помогите сохранить важную информацию легкодоступной с помощью закреплённых сообщений. Ваши самые часто задаваемые вопросы, бронь столиков и маршруты отпуска уже в центре внимания. Теперь они могут быть и в топе чата." } } diff --git a/_locales/sk-SK/messages.json b/_locales/sk-SK/messages.json index 25bd3f98d1..6b0e030961 100644 --- a/_locales/sk-SK/messages.json +++ b/_locales/sk-SK/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Históriu četov sa nepodarilo exportovať, pretože Signal nemá povolenie na zapisovanie súborov na disk. Skúste zmeniť povolenia disku alebo aktualizovať systémové nastavenia a potom exportujte znova." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Exportuje sa záloha" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Export zálohy bol úspešne dokončený" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Ak chcete obnoviť túto zálohu:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Preneste priečinok so zálohou do úložiska telefónu" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Nainštalujte si novú kópiu aplikácie Signal do telefónu" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Ťuknite na „Obnoviť alebo preniesť“ a vyberte „Záloha na zariadení“" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ikona mesiaca" @@ -7612,7 +7612,7 @@ "messageformat": "Pomáha nám to dozvedieť sa viac o hovoroch a o tom, čo funguje alebo naopak nefunguje. Pred odoslaním si môžete zobraziť protokol ladenia." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Odoslaním sa vaša spätná väzba zdieľa spolu s diagnostickými údajmi o vašom hovore. Môžete tiež zdieľať protokol ladenia, ktorý nám pomôže zlepšiť kvalitu hovoru." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Zdieľať protokol ladenia" @@ -7645,7 +7645,7 @@ "messageformat": "Ďakujeme za vašu spätnú väzbu!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Rozbaľte bočný panel pre interakciu s megafónom" }, "icu:WhatsNew__bugfixes": { "messageformat": "Táto verzia obsahuje množstvo drobných vylepšení a opráv chýb, ktoré zaisťujú bezproblémový chod systému Signal.", @@ -7679,6 +7679,6 @@ "messageformat": "Opravili sme menšiu chybu zobrazenia indikátora zdvihnutej ruky v skupinových hovoroch." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Pripnuté správy vám pomôžu sprístupniť dôležité informácie v hornej časti četu." } } diff --git a/_locales/sl-SI/messages.json b/_locales/sl-SI/messages.json index 5f123d061a..84be9576fb 100644 --- a/_locales/sl-SI/messages.json +++ b/_locales/sl-SI/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Zgodovine klepeta ni mogoče izvoziti, ker Signal nima dovoljenja za zapisovanje datotek na disk. Poskusite spremeniti dovoljenja diska ali posodobiti sistemske nastavitve in nato znova izvozite." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Izvoz varnostne kopije" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Izvoz varnostne kopije je končan" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Če želite obnoviti to varnostno kopijo:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Prenesite mapo z varnostnimi kopijami v pomnilnik telefona" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Namestite novo kopijo Signala v telefon" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Tapnite »Obnovi ali prenesi« in izberite »Varnostno kopiranje v napravi«" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ikona lune" @@ -7612,7 +7612,7 @@ "messageformat": "To nam pomaga izvedeti več o klicih in o tem, kaj deluje oziroma ne deluje. Pred oddajo si lahko ogledate dnevnik sistemskih zabeležb." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Z oddajo boste delili svoje povratne informacije skupaj z diagnostičnimi informacijami o vašem klicu. Po želji lahko delite dnevnik sistemskih zabeležb, da nam pomagate izboljšati kakovost klicev." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Delite sistemske zabeležbe" @@ -7645,7 +7645,7 @@ "messageformat": "Hvala za vaše povratne informacije!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Razširite stransko vrstico za interakcijo z megafonom" }, "icu:WhatsNew__bugfixes": { "messageformat": "Ta različica vsebuje majhne spremembe in popravke, ki omogočajo, da Signal teče brez težav.", @@ -7679,6 +7679,6 @@ "messageformat": "Odpravili smo manjšo napako v zvezi s prikazom dvignjene roke v skupinskih klicih." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Pomembne informacije naj bodo vedno enostavno dostopne s pripetimi sporočili. Vaša najpogostejša vprašanja, rezervacije večerij in načrti potovanj so že v vaših mislih. Zdaj so lahko tudi na vrhu klepeta." } } diff --git a/_locales/sq-AL/messages.json b/_locales/sq-AL/messages.json index 61c5327694..a5b6734f5f 100644 --- a/_locales/sq-AL/messages.json +++ b/_locales/sq-AL/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Historiku i bisedës nuk mund të eksportohet sepse Signal nuk ka leje për të shkruar skedarë në disk. Provo të ndryshosh lejet e diskut ose të përditësosh parametrat e sistemit dhe pastaj eksporto përsëri." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Kopjeruajtja po eksportohet" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Eksportimi i kopjeruajtjes përfundoi" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Për të rikthyer këtë kopjeruajtje:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Transfero dosjen e kopjeruajtjeve në hapësirën ruajtëse të telefonit" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Instalo një kopje të re të Signal në telefon" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Prek te \"Rikthe ose Transfero\" dhe zgjidh \"Kopjeruajtjet në pajisje\"" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ikona e hënës" @@ -7612,7 +7612,7 @@ "messageformat": "Kjo na ndihmon të mësojmë më shumë rreth thirrjeve dhe çfarë funksionon apo nuk funksionon. Mund ta shikosh regjistrin e diagnostikimeve përpara se të bësh dërgimin." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Dorëzimi do t'i ndajë reagimet së bashku me informacion diagnostikues rreth thirrjes sate. Mund të ndash opsionalisht një regjistër diagnostikimesh për të na ndihmuar të përmirësojmë cilësinë e thirrjeve." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Ndaj regjistrin e diagnostikimit" @@ -7645,7 +7645,7 @@ "messageformat": "Faleminderit për përshtypjet!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Zgjero shiritin anësor për të bashkëvepruar me megafonin" }, "icu:WhatsNew__bugfixes": { "messageformat": "Ky version përmban një numër përimtimesh të vockla dhe ndreqje të metash për ta mbajtur të rrjedhshme punën e Signal-it.", @@ -7679,6 +7679,6 @@ "messageformat": "Nuk mund ta rregullojmë heshtjen e sikletshme që vijon, por rregulluam një gabim që ndonjëherë bënte që treguesi i dorës së ngritur të mbetej i dukshëm (me numërimin zero) nëse dikush e ngrinte dhe e ulte dorën shumë shpejt." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Ndihmo që informacioni i rëndësishëm të jetë lehtësisht i arritshëm me mesazhe të fiksuara. Pyetjet më të shpeshta, rezervimet e darkës dhe itineraret e pushimeve janë tashmë në mendje. Tani ato mund të jenë edhe në krye të bisedës." } } diff --git a/_locales/sr/messages.json b/_locales/sr/messages.json index 151870cdba..b20a65af42 100644 --- a/_locales/sr/messages.json +++ b/_locales/sr/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Извоз ваше историје ћаскања није могућ јер Signal нема дозволу да записује фајлове на диск. Покушајте да промените дозволе на диску или да ажурирате систем и извезите поново." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Резервна копија се извози" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Извоз резервне копије је завршен" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "За враћање ове резервне копије:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Пребаците фолдер резервне копије на меморијски простор телефона" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Инсталирајте нову верзију Signal-а на телефону" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Додирните „Врати или пребаци“ и изаберите „Резервна копија на уређају“" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Икона месеца" @@ -7612,7 +7612,7 @@ "messageformat": "Ово нам помаже да сазнамо више о позивима и шта функционише или не функционише. Пре слања можете погледати извештај о грешкама." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Слањем ћете поделити ваше повратне информације, као и дијагностичке информације о позиву. По жељи можете поделити и извештај о грешкама ради побољшања квалитета позива." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Пошаљи извештај о грешкама" @@ -7645,7 +7645,7 @@ "messageformat": "Хвала вам на повратним информацијама!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Проширите бочну траку за интеракцију са мегафоном" }, "icu:WhatsNew__bugfixes": { "messageformat": "Ова верзија садржи низ мањих подешавања и исправки грешака како би Signal радио несметано.", @@ -7679,6 +7679,6 @@ "messageformat": "Поправили смо малу грешку у приказивању подигнуте руке у групним позивима." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Захваљујући закаченим порукама важне информације ће бити лако доступне на врху ћаскања." } } diff --git a/_locales/sw/messages.json b/_locales/sw/messages.json index e84a88ee54..89755ad652 100644 --- a/_locales/sw/messages.json +++ b/_locales/sw/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Historia yako ya gumzo imeshindwa kuhamishwa kwa sababu Signal haina ruhusa ya kuhifadhi faili kwenye diski. Jaribu kubadilisha ruhusa za diski yako au kusasisha mipangilio yako ya mfumo kisha uhamishe tena." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Kuhamisha nakala hifadhi" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Uhamishaji wa nakala hifadhi umekamilika" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Ili kurejesha nakala hii:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Hamisha folda yako ya hifadhi nakala kwenye simu yako" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Weka nakala mpya ya Signal kwenye simu yako" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Gusa “Rejesha au Hamisha” kisha uchague “Uhifadhi Nakala Kwenye Simu”" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Aikoni ya mwezi" @@ -7612,7 +7612,7 @@ "messageformat": "Hii inatusaidia kupata maelezo zaidi kuhusu simu na kitu gani kimefanikiwa au hakijafanikiwa. Unaweza tazama faili la rekebisho kabla ya kuwasilisha." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Kuwasilisha kutatuma maoni yako pamoja na taarifa za uchunguzi kuhusu simu yako. Unaweza kututumia kwa hiari faili la rekebisho ili kutusaidia kuboresha ubora wa simu." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Shiriki faili la rekebisho" @@ -7645,7 +7645,7 @@ "messageformat": "Asante kwa maoni yako!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Tanua utepe ili utumie megafoni" }, "icu:WhatsNew__bugfixes": { "messageformat": "Toleo hili lina mabadiliko kidogo na maboresho ya program kuiwezesha Signal kufanya kazi vizuri.", @@ -7679,6 +7679,6 @@ "messageformat": "Hatuwezi kurekebisha ukimya wa aibu unaofuata, lakini tumerekebisha hitilafu iliyokuwa ikisababisha kipengele cha mkono ulioinuliwa kuendelea kuonekana (ikiwa na hesabu ya sufuri) endapo mtu angeinua na kushusha mkono wake haraka sana." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Saidia kufanya taarifa muhimu zipatikane kwa urahisi kupitia jumbe zilizobandikwa. Maswali unayoulizwa mara kwa mara, kuweka nafasi kwa ajili ya chakula cha jioni, na ratiba za likizo tayari zimeshapewa kipaumbele. Sasa yanaweza kuwekwa juu kwenye gumzo pia." } } diff --git a/_locales/ta-IN/messages.json b/_locales/ta-IN/messages.json index 6c248ac100..b17eb20be3 100644 --- a/_locales/ta-IN/messages.json +++ b/_locales/ta-IN/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "சிக்னலுக்கு டிஸ்க்கில் கோப்புகளை எழுத அனுமதி இல்லாததால், உங்கள் சாட் வரலாற்றை ஏற்றுமதி செய்ய முடியாது. உங்கள் டிஸ்க்கின் அனுமதிகளை மாற்றி அல்லது உங்கள் சிஸ்டம் அமைப்புகளைப் புதுப்பித்து, பிறகு மீண்டும் ஏற்றுமதி செய்ய முயற்சிக்கவும்." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "காப்புப்பிரதியை ஏற்றுமதி செய்கிறது" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "காப்புப்பிரதியை ஏற்றுமதி செய்வது முடிந்தது" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "காப்புப்பிரதியை மீட்டமைக்க:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "உங்கள் காப்புப் பிரதி கோப்புறையை உங்கள் ஃபோனின் சேமிப்பகத்திற்கு இடமாற்றவும்" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "உங்கள் ஃபோனில் சிக்னலின் புதிய நகலை நிறுவவும்" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "\"மீட்டமை அல்லது இடமாற்றுக\" என்பதைத் தட்டி, \"சாதனத்தில் உள்ள காப்புப்பிரதி\" என்பதைத் தேர்ந்தெடுக்கவும்" }, "icu:NotificationProfile--moon-icon": { "messageformat": "மூன் ஐகான்" @@ -7612,7 +7612,7 @@ "messageformat": "இது அழைப்புகள் பற்றியும், எவை பயனளிக்கிறது அல்லது பயனளிக்கவில்லை என்பதைப் பற்றி மேலும் அறிய உதவுகிறது. சமர்ப்பிக்கும் முன் உங்கள் பிழைத்திருத்தப் பதிவை நீங்கள் பார்க்கலாம்." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "இதைச் சமர்ப்பிப்பதன் மூலம், உங்கள் கருத்துக்களுடன் உங்கள் அழைப்பைப் பற்றிய கண்டறியும் தகவலைப் பகிரும். அழைப்பின் தரத்தை மேம்படுத்த எங்களுக்கு உதவ, நீங்கள் விரும்பினால் பிழைத் திருத்தப் பதிவைப் பகிரலாம்." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "பிழைத்திருத்தப் பதிவைப் பகிருங்கள்" @@ -7645,7 +7645,7 @@ "messageformat": "நீங்கள் வழங்கிய கருத்துக்கு நன்றி!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "மெகாஃபோனுடன் தொடர்பு கொள்ள பக்கப்பட்டியை விரிவாக்குங்கள்" }, "icu:WhatsNew__bugfixes": { "messageformat": "இந்த பதிப்பில் சிக்னலை சீராக இயங்க வைக்க பல சிறிய மாற்றங்கள் மற்றும் பிழை திருத்தங்கள் உள்ளன.", @@ -7679,6 +7679,6 @@ "messageformat": "தொகுப்பு அழைப்புகளில், கையை உயர்த்தும் குறியீட்டில் இருந்த ஒரு சிறிய காட்சிப் பிழையைச் சரிசெய்துள்ளோம்." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "பின் செய்யப்பட்ட மெசேஜ்கள், அரட்டையின் மேற்பகுதியில் முக்கியமான தகவல்களை எளிதில் அணுகக்கூடியதாக வைத்திருக்க உதவும்." } } diff --git a/_locales/te-IN/messages.json b/_locales/te-IN/messages.json index 770f7c04ff..2509b066df 100644 --- a/_locales/te-IN/messages.json +++ b/_locales/te-IN/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "డిస్క్‌కు ఫైల్‌లను రాయడానికి Signal కు అనుమతి లేనందున మీ చాట్ చరిత్రను ఎగుమతి చేయడం సాధ్యం కాదు. మీ డిస్క్ యొక్క అనుమతులను మార్చడానికి లేదా మీ సిస్టమ్ సెట్టింగ్‌లను అప్‌డేట్ చేయడానికి ప్రయత్నించండి మరియు ఆపై మళ్ళీ ఎగుమతి చేయండి." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "బ్యాకప్‌ను ఎగుమతి చేస్తోంది" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "బ్యాకప్ ఎగుమతి పూర్తయింది" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "ఈ బ్యాకప్‌ను పునరుద్ధరించడానికి:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "మీ బ్యాకప్ ఫోల్డర్‌ను మీ ఫోన్ యొక్క నిల్వకు బదిలీ చేయండి" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "మీ ఫోన్‌లో Signal యొక్క కొత్త కాపీని ఇన్‌స్టాల్ చేయండి" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "“పునరుద్ధరించండి లేదా బదిలీ చేయండి” పై తట్టండి మరియు “పరికరంలో బ్యాకప్” ను ఎంచుకోండి" }, "icu:NotificationProfile--moon-icon": { "messageformat": "చంద్రుడు ఐకాన్" @@ -7612,7 +7612,7 @@ "messageformat": "ఇది కాల్స్ గురించి మరియు ఏది పని చేస్తుంది లేదా పని చేయదు అనే దాని గురించి మరింత తెలుసుకోవడానికి మాకు సహాయపడుతుంది. సమర్పించడానికి ముందు మీరు మీ డీబగ్ లాగ్‌ను వీక్షించవచ్చు." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "సమర్పించడం వలన మీ కాల్ గురించిన డయాగ్నస్టిక్ సమాచారం తో పాటు మీ అభిప్రాయం పంచుకోబడుతుంది. మీరు కాల్ నాణ్యతను మెరుగుపరచడంలో మాకు సహాయపడటానికి ఐచ్ఛికంగా డీబగ్ లాగ్‌ను పంచుకోవచ్చు." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "డీబగ్ లాగ్‌ను పంచుకోండి" @@ -7645,7 +7645,7 @@ "messageformat": "మీ ఫీడ్‌బ్యాక్‌కు ధన్యవాదాలు!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "మెగాఫోన్‌తో పరస్పరం సంభాషించుకోవడానికి సైడ్‌బార్‌ను విస్తరించండి" }, "icu:WhatsNew__bugfixes": { "messageformat": "Signal ని సజావుగా నడిపించడానికి ఈ వెర్షన్‌లో చిన్నపాటి ట్వీక్‌లు మరియు బగ్ ఫిక్స్‌లు ఉన్నాయి.", @@ -7679,6 +7679,6 @@ "messageformat": "మేము గ్రూప్ కాల్‌లలో పైకెత్తిన చేయి సూచికకు సంబంధించిన ఒక చిన్న డిస్‌ప్లే బగ్‌ను పరిష్కరించాము." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "ముఖ్యమైన సమాచారాన్ని చాట్ పైభాగంలో సులభంగా అందుబాటులో ఉంచడానికి పిన్ చేసిన సందేశాలు మీకు సహాయపడతాయి." } } diff --git a/_locales/th/messages.json b/_locales/th/messages.json index 4f5d0f9247..2e9387c317 100644 --- a/_locales/th/messages.json +++ b/_locales/th/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "ไม่สามารถส่งออกประวัติการแชทของคุณได้เนื่องจาก Signal ไม่ได้รับสิทธิ์ในการบันทึกไฟล์ลงพื้นที่จัดเก็บ โปรดลองเปลี่ยนการอนุญาตสิทธิ์ของพื้นที่จัดเก็บในเครื่องหรืออัปเดตการตั้งค่าระบบของคุณแล้วลองส่งออกอีกครั้ง" }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "กำลังส่งออกข้อมูลสำรอง" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "ส่งออกข้อมูลสำรองเรียบร้อยแล้ว" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "วิธีกู้คืนจากข้อมูลสำรองนี้:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "ย้ายโฟลเดอร์ข้อมูลสำรองไปยังพื้นที่จัดเก็บของโทรศัพท์คุณ" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "ติดตั้ง Signal ใหม่บนโทรศัพท์" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "แตะ “กู้คืนหรือถ่ายโอน” แล้วเลือก “การสำรองข้อมูลไว้บนอุปกรณ์”" }, "icu:NotificationProfile--moon-icon": { "messageformat": "ไอคอนรูปพระจันทร์" @@ -7612,7 +7612,7 @@ "messageformat": "ช่วยให้เรารับทราบเกี่ยวกับประสิทธิภาพในการใช้งานและเข้าใจปัญหาของการโทรยิ่งขึ้น โดยคุณสามารถดูบันทึกดีบักก่อนส่งข้อมูลได้" }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "การส่งรายงานจะเป็นการแชร์ความคิดเห็นของคุณรวมถึงข้อมูลผลการวิเคราะห์ปัญหาเกี่ยวกับการโทรของคุณ คุณยังสามารถเลือกที่จะแชร์บันทึกดีบักเพื่อช่วยให้เราพัฒนาคุณภาพการโทรให้ดียิ่งขึ้น" }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "แชร์บันทึกดีบัก" @@ -7645,7 +7645,7 @@ "messageformat": "ขอบคุณสำหรับความคิดเห็น" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "ขยายแถบรายการแชทเพื่อดูประกาศ" }, "icu:WhatsNew__bugfixes": { "messageformat": "รุ่นนี้มาพร้อมการปรับเปลี่ยนเล็กๆ น้อยๆ และการแก้ไขบั๊กต่างๆ เพื่อให้ Signal ทำงานได้อย่างราบรื่นไร้ปัญหา", @@ -7679,6 +7679,6 @@ "messageformat": "แก้ไขบั๊กเกี่ยวกับตัวแจ้งสถานะเมื่อมีคนยกมือในสายโทรกลุ่ม" }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "มองเห็นข้อมูลสำคัญได้ทันทีด้วยการปักหมุดข้อความเอาไว้ให้โดดเด่นอยู่ด้านบนสุดของแชท" } } diff --git a/_locales/tl-PH/messages.json b/_locales/tl-PH/messages.json index 26179a6eae..f4f46b4146 100644 --- a/_locales/tl-PH/messages.json +++ b/_locales/tl-PH/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Hindi ma-export ang chat history mo dahil ang Signal ay walang permiso para magsulat ng files sa disk. Subukang baguhin ang permissions ng iyong disk o i-update ang system settings mo at subukan ulit mag-export." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Ine-export ang backup" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Tapos na ang pag-export ng backup" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Para ma-restore ang backup na ito:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Ilipat ang backup folder mo sa storage ng iyong phone" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Mag-install ng bagong kopya ng Signal sa phone mo" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "I-tap ang \"Restore o Transfer\" at piliin ang \"Sa Backup ng Device\"" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Icon ng buwan" @@ -7612,7 +7612,7 @@ "messageformat": "Makatutulong ito sa amin para mas mapabuti pa ang quality ng calls. Maaari mong tignan ang debug log mo bago mag-submit." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Ang pag-submit ay magbabahagi ng feedback mo kasama ang diagnostic information tungkol sa tawag mo. Maaari ka ring magbahagi ng debug log para matulungan mo kaming mapaganda ang call quality." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "I-share ang debug log" @@ -7645,7 +7645,7 @@ "messageformat": "Maraming salamat sa feedback mo!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Palakihin ang sidebar para makipag-interact sa megaphone" }, "icu:WhatsNew__bugfixes": { "messageformat": "Ang version na ito'y may small tweaks at bug fixes to keep Signal running smoothly.", @@ -7679,6 +7679,6 @@ "messageformat": "May inayos kaming minor display bug sa raised hand indicator sa group calls." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Pinapadali ng pinned messages ang pag-access ng importanteng impormasyon sa pamamagitan ng paglagay nito sa taas ng chat." } } diff --git a/_locales/tr/messages.json b/_locales/tr/messages.json index 756c206143..dfb13400e0 100644 --- a/_locales/tr/messages.json +++ b/_locales/tr/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Signal'ın diske dosya yazma izni olmadığı için sohbet geçmişin dışa aktarılamıyor. Diskinin izinlerini değiştirmeyi veya sistem ayarlarını güncellemeyi dene ve ardından tekrar dışa aktar." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Yedekleme dışa aktarılıyor" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Yedekleme dışa aktarımı tamamlandı" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Bu yedeklemeyi geri yüklemek için:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Yedekleme klasörünü telefonunun depolama alanına aktar" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Telefonuna Signal'ın yeni bir kopyasını yükle" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "\"Geri Yükle veya Aktar\"a dokun ve \"Cihazda Yedekleme\"yi seç" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Ay simgesi" @@ -7612,7 +7612,7 @@ "messageformat": "Bu, aramalar ve neyin işe yarayıp neyin yaramadığı hakkında daha fazla bilgi edinmemize yardımcı olur. Göndermeden önce hata ayıklama günlüğünü görüntüleyebilirsin." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Gönderdiğinde, aramanla ilgili tanılama bilgileri ile birlikte geri bildirimin de paylaşılacaktır. Arama kalitesini iyileştirmemize yardımcı olmak için, isteğe bağlı olarak bir hata ayıklama günlüğü paylaşabilirsin." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Hata ayıklama günlüğünü paylaş" @@ -7624,7 +7624,7 @@ "messageformat": "Hata ayıklama günlükleri, düşük düzeyde uygulama bilgisi içerir ve hiçbir mesaj içeriğini açıklamaz." }, "icu:CallQualitySurvey__ConfirmSubmission__PrivacyNote": { - "messageformat": "Bizimle paylaşılan bilgiler düşük seviyeli uygulama bilgilerini içerir ve aramalarının içeriğini içermez." + "messageformat": "Bizimle paylaşılan bilgiler düşük seviyeli uygulama bilgilerini içerir ve aramalarının içeriğini kapsamaz." }, "icu:CallDiagnosticWindow__title": { "messageformat": "Tanılama bilgileri" @@ -7645,7 +7645,7 @@ "messageformat": "Geri bildirimin için teşekkürler!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Megafon ile etkileşim için kenar çubuğunu genişlet" }, "icu:WhatsNew__bugfixes": { "messageformat": "Bu sürüm Signal'in sorunsuz çalışması için gereken bir takım küçük düzeltme ve hata gidermelerini içerir.", @@ -7679,6 +7679,6 @@ "messageformat": "Grup görüşmelerinde kaldırılan el göstergesiyle ilgili ufak bir ekran hatasını giderdik." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Sabitlenmiş mesajlar, önemli bilgilerin sohbetin üstünde kolayca erişilebilir kalmasını sağlayabilir. En sık sorulan soruların, akşam yemeği rezervasyonların ve tatil güzergahların zaten aklının bir köşesinde. Artık bunlar sohbetin de zirvesinde olabilir." } } diff --git a/_locales/uk-UA/messages.json b/_locales/uk-UA/messages.json index 0e2f3fb417..8ba86e3de8 100644 --- a/_locales/uk-UA/messages.json +++ b/_locales/uk-UA/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Неможливо експортувати історію чатів, оскільки Signal не має дозволу зберігати файли на диску. Змініть дозволи для диска або оновіть налаштування системи й спробуйте знову." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Експортування резервної копії" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Резервну копію експортовано" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Щоб відновити дані з резервної копії:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Перенесіть папку резервної копії у сховище телефона" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Заново встановіть Signal на телефоні" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Натисніть «Відновлення або перенесення акаунту» й виберіть «Резервна копія на пристрої»" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Значок місяця" @@ -7612,7 +7612,7 @@ "messageformat": "Так ви допоможете нам більше дізнатися про те, як проходять виклики, і можливі проблеми. Ви можете переглянути журнал налагодження, перш ніж надіслати його." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Надсилаючи свій відгук, ви також ділитеся діагностичною інформацією про виклик. Якщо хочете, то можете поділитися журналом налагодження — це допоможе нам покращити якість викликів." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Надіслати журнал налагодження" @@ -7645,7 +7645,7 @@ "messageformat": "Дякуємо за відгук!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Розгорніть бічну панель, щоб побачити оголошення" }, "icu:WhatsNew__bugfixes": { "messageformat": "Ця версія містить ряд невеликих покращень і виправлень помилок для забезпечення безперебійної роботи Signal.", @@ -7679,6 +7679,6 @@ "messageformat": "Ми не можемо виправити незручну тишу, що виникає в такій ситуації, але ми виправили помилку, через яку індикатор піднятої руки іноді залишався видимим (з числом нуль), коли хтось дуже швидко підіймав і опускав руку." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Тримайте важливу інформацію під рукою завдяки закріпленим повідомленням. Часті запитання, бронювання й маршрути для відпустки й без того постійно крутяться в голові. Добре, що тепер їх можна закріпити вгорі чату." } } diff --git a/_locales/ur/messages.json b/_locales/ur/messages.json index 52671f845d..e25fefabba 100644 --- a/_locales/ur/messages.json +++ b/_locales/ur/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "آپ کی چیٹ ہسٹری ایکسپورٹ نہیں ہو سکتی کیونکہ Signal کو ڈسک پر فائلز محفوظ کرنے کی اجازت نہیں ہے۔ اپنی ڈسک کی اجازتوں کو تبدیل کرنے یا اپنے سسٹم کی سیٹنگز کو اپ ڈیٹ کرنے کی کوشش کریں اور پھر دوبارہ ایکسپورٹ کریں۔" }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "بیک اپ برآمد کیا جا رہا ہے" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "بیک اپ برآمد مکمل ہو گیا ہے" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "اس بیک اپ کو بحال کرنے کے لیے:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "اپنے فون کی اسٹوریج میں اپنا بیک اپ فولڈر ٹرانسفر کریں" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "اپنے فون پر Signal کی نئی کاپی انسٹال کریں" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "\"بحال یا ٹرانسفر\" کریں پر ٹیپ کریں اور \"ڈیوائس پر بیک اپ\" کو منتخب کریں" }, "icu:NotificationProfile--moon-icon": { "messageformat": "چاند کا آئیکن" @@ -7612,7 +7612,7 @@ "messageformat": "اس سے ہمیں کالز اور اس بارے میں مزید جاننے میں مدد ملتی ہے کہ کیا چیز کام کر رہی یا نہیں کر رہی ہے۔ آپ جمع کروانے سے پہلے اپنا ڈی بگ لاگ دیکھ سکتے ہیں۔" }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "جمع کروانے پر آپ کی کال کے بارے میں تشخیصی معلومات کے علاوہ آپ کی رائے بھی شیئر کی جائے گی۔ آپ اختیاری طور پر ڈی بگ لاگ شیئر کر سکتے ہیں تاکہ ہمیں کال کے معیار کو بہتر بنانے میں مدد مل سکے۔" }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "ڈی بگ لاگ شیئر کریں" @@ -7645,7 +7645,7 @@ "messageformat": "آپ کی رائے کا شکریہ!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "میگافون کے ساتھ تعامل کرنے کے لیے سائیڈ بار کو بڑھائیں" }, "icu:WhatsNew__bugfixes": { "messageformat": "یہ ورژن Signal کو بے خلل طور پر چلتا رکھنے کے لیے کچھ معمولی تبدیلیوں اور بگ درستگیوں پر مشتمل ہے۔", @@ -7679,6 +7679,6 @@ "messageformat": "ہم اس عجیب خاموشی کو ٹھیک نہیں کر سکتے جو اس کے بعد آتی ہے، لیکن ہم نے ایک نقص ٹھیک کیا ہے جس کی وجہ سے کبھی کبھار اگر کوئی ہاتھ تیزی سے اٹھا یا نیچے کرتا تو ہاتھ کا اشارہ نظر آتا (صفر کی گنتی کے ساتھ)۔" }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "پِن شدہ میسجز اہم معلومات کو چیٹ میں سب سے اوپر آسانی سے قابل رسائی رکھنے میں آپ کی مدد کر سکتے ہیں۔" } } diff --git a/_locales/vi/messages.json b/_locales/vi/messages.json index 99f9a0ce6b..17216f5132 100644 --- a/_locales/vi/messages.json +++ b/_locales/vi/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "Lịch sử trò chuyện của bạn không thể được xuất vì Signal không có quyền ghi tập tin vào ổ lưu trữ. Hãy thử thay đổi quyền của ổ lưu trữ hoặc cập nhật cài đặt hệ thống của bạn và sau đó xuất lại." }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "Đang xuất bản sao lưu" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "Hoàn tất xuất bản sao lưu" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "Để khôi phục bản sao lưu này:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "Chuyển thư mục sao lưu vào bộ nhớ trên điện thoại của bạn" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "Cài mới Signal trên điện thoại của bạn" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "Nhấn \"Khôi phục hoặc chuyển\" và chọn \"Sao lưu trên thiết bị\"" }, "icu:NotificationProfile--moon-icon": { "messageformat": "Biểu tượng mặt trăng" @@ -7612,7 +7612,7 @@ "messageformat": "Điều này giúp chúng tôi tìm hiểu thêm về chất lượng cuộc gọi và biết khi có vấn đề. Bạn có thể xem nhật ký gỡ lỗi trước khi gửi." }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "Khi gửi, bạn sẽ chia sẻ phản hồi cùng thông tin chẩn đoán về cuộc gọi của bạn. Bạn có thể chia sẻ (không bắt buộc) nhật ký gỡ lỗi để giúp chúng tôi tăng chất lượng cuộc gọi." }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "Chia sẻ nhật ký gỡ lỗi" @@ -7645,7 +7645,7 @@ "messageformat": "Cảm ơn góp ý của bạn!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "Mở rộng thanh bên để tương tác với biểu tượng loa cầm tay" }, "icu:WhatsNew__bugfixes": { "messageformat": "Phiên bản này có một số tinh chỉnh và sửa lỗi để giữ cho Signal hoạt động mượt mà.", @@ -7679,6 +7679,6 @@ "messageformat": "Chúng tôi đã sửa một lỗi nhỏ liên quan đến chỉ báo giơ tay trong cuộc gọi nhóm." }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "Tính năng ghim tin nhắn ở đầu cuộc trò chuyện có thể giúp dễ dàng tham khảo thông tin quan trọng." } } diff --git a/_locales/yue/messages.json b/_locales/yue/messages.json index 98f58e882a..d3fc2a4317 100644 --- a/_locales/yue/messages.json +++ b/_locales/yue/messages.json @@ -1242,7 +1242,7 @@ "messageformat": "將過眼雲煙訊息置頂" }, "icu:PinMessageDisappearingMessagesWarningDialog__Description": { - "messageformat": "當過眼雲煙訊息喺倒數完同埋喺聊天度剔走嗰陣,系統會將訊息取消置頂。" + "messageformat": "當時間到咗,過眼雲煙訊息會取消置頂,同埋喺聊天度消失。" }, "icu:PinMessageDisappearingMessagesWarningDialog__Okay": { "messageformat": "確定" @@ -5628,22 +5628,22 @@ "messageformat": "匯出唔到聊天紀錄,因為 Signal 冇權限將檔案寫入磁碟。試下更改磁碟權限或者更新系統設定,然後再匯出。" }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "匯出備份" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "備份匯出完成" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "想攞返呢個備份嚟還原嘅話:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "將備份資料夾轉移去手機嘅儲存空間" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "喺您部手機度安裝新嘅 Signal 版本" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "㩒一下「還原或者轉移」,然後揀「裝置上備份」" }, "icu:NotificationProfile--moon-icon": { "messageformat": "月亮圖示" @@ -7612,7 +7612,7 @@ "messageformat": "幫我哋了解多啲通話嘅情況,同埋做啲咩係有效、咩係冇效。你可以响提交之前睇吓除錯記錄。" }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "提交會將你嘅意見,同埋關於你通話嘅診斷資訊分享俾我哋。你可以揀分享除錯記錄,幫我哋提高通話品質。" }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "分享除錯記錄" @@ -7645,7 +7645,7 @@ "messageformat": "多謝你嘅回應!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "展開側邊欄用大聲公溝通" }, "icu:WhatsNew__bugfixes": { "messageformat": "呢個版本包含咗少少調整同埋錯誤修復,等 Signal 可以順暢運作。", @@ -7679,6 +7679,6 @@ "messageformat": "俾人見到舉錯手係有啲尷尬嘅,好彩我們整返好個錯誤 – 之前,喺谷通話嗰陣,如果有人舉手之後即刻放低手,有時個舉手指示唔會消失(而且舉手計數顯示係零)。" }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "用訊息置頂功能,方便睇到重要資訊。你成日問嘅問題、約咗幾點食飯同埋度假行程都喺個腦度排頭位。而家可以將呢啲重要訊息放喺聊天嘅最頂位置喇。" } } diff --git a/_locales/zh-CN/messages.json b/_locales/zh-CN/messages.json index 585d8ebc75..8aa2531f0f 100644 --- a/_locales/zh-CN/messages.json +++ b/_locales/zh-CN/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "无法导出您的聊天记录,因为 Signal 没有向磁盘写入文件的权限。请尝试更改磁盘权限或更新系统设置,然后再导出。" }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "正在导出备份" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "备份导出完成" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "要恢复此备份:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "将您的备份文件夹转移到您的手机存储空间" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "在您的手机上安装新的 Signal 版本" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "点击“恢复或转移”,然后选择“设备本地备份”" }, "icu:NotificationProfile--moon-icon": { "messageformat": "月亮图标" @@ -6006,7 +6006,7 @@ "messageformat": "上次备份" }, "icu:Preferences__local-backups-last-backup-never": { - "messageformat": "永不" + "messageformat": "从未" }, "icu:Preferences__local-backups-backup-now": { "messageformat": "现在备份" @@ -7612,7 +7612,7 @@ "messageformat": "这有助于我们进一步了解通话情况,以及哪些功能正常,哪些存在问题。您可以先查看您的调试日志再提交。" }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "提交日志将共享您的反馈以及有关您通话的诊断信息。您可以选择共享调试日志,帮助我们改进通话质量。" }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "分享调试日志" @@ -7645,7 +7645,7 @@ "messageformat": "感谢您的反馈!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "展开侧边栏与扩音器交互" }, "icu:WhatsNew__bugfixes": { "messageformat": "此版本包含多个小调整和漏洞修复,以维持 Signal 的顺畅运行。", @@ -7679,6 +7679,6 @@ "messageformat": "我们修复了群组通话中举手指示器的一个微小显示漏洞。" }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "置顶消息功能可让重要消息固定在聊天顶部,方便快速查看。" } } diff --git a/_locales/zh-HK/messages.json b/_locales/zh-HK/messages.json index 78e72f756d..92b25995dd 100644 --- a/_locales/zh-HK/messages.json +++ b/_locales/zh-HK/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "無法匯出聊天紀錄,因為 Signal 沒有權限將檔案寫入磁碟。請嘗試變更磁碟權限或更新系統設定,然後再匯出。" }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "匯出備份" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "備份匯出完成" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "要還原此備份:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "將備份資料夾轉移至手機的儲存空間" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "在手機上安裝新的 Signal 副本" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "輕按「還原或轉移」,然後選擇「裝置上備份」" }, "icu:NotificationProfile--moon-icon": { "messageformat": "月亮圖示" @@ -7612,7 +7612,7 @@ "messageformat": "這有助於我們深入了解通話的情況,以及哪些做法真正有效。你可在提交前檢視除錯日誌。" }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "提交將分享你的意見回饋,以及關於你通話的診斷資訊。你可以選擇分享除錯日誌,協助我們改善通話品質。" }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "分享除錯日誌" @@ -7645,7 +7645,7 @@ "messageformat": "感謝你的意見!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "展開側邊欄用擴音器開始互動" }, "icu:WhatsNew__bugfixes": { "messageformat": "此版本包含許多小調整和錯誤修復,以維持 Signal 穩定運作。", @@ -7679,6 +7679,6 @@ "messageformat": "我們修正了一個群組通話中舉手指示器的錯誤:如果有人非常快速地舉起和放下手,有時舉手指示器會持續顯示(且計數為零)。" }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "使用已釘選訊息功能,讓重要資訊隨時觸手可及。你最常詢問的問題、晚餐預約以及度假行程都是首要事項。現在也可以將它們放到聊天的頂端。" } } diff --git a/_locales/zh-Hant/messages.json b/_locales/zh-Hant/messages.json index 36795b0ffe..9c657cbf55 100644 --- a/_locales/zh-Hant/messages.json +++ b/_locales/zh-Hant/messages.json @@ -5628,22 +5628,22 @@ "messageformat": "無法匯出聊天紀錄,因為 Signal 沒有權限將檔案寫入磁碟。請嘗試變更磁碟權限或更新系統設定,然後再匯出。" }, "icu:LocalBackupExport--ProgressDialog--Header": { - "messageformat": "Exporting backup" + "messageformat": "匯出備份" }, "icu:LocalBackupExport--CompleteDialog--Header": { - "messageformat": "Backup export complete" + "messageformat": "備份匯出完成" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsHeader": { - "messageformat": "To restore this backup:" + "messageformat": "要還原此備份:" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsTransfer": { - "messageformat": "Transfer your backup folder to your phone's storage" + "messageformat": "將備份資料夾轉移至手機的儲存空間" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsInstall": { - "messageformat": "Install a new copy of Signal on your phone" + "messageformat": "在手機上安裝新的 Signal 副本" }, "icu:LocalBackupExport--CompleteDialog--RestoreInstructionsRestore": { - "messageformat": "Tap “Restore or Transfer” and choose “On Device Backup”" + "messageformat": "輕按「還原或轉移」,然後選擇「裝置上備份」" }, "icu:NotificationProfile--moon-icon": { "messageformat": "月亮圖示" @@ -7612,7 +7612,7 @@ "messageformat": "這有助於我們深入了解通話的情況,以及哪些做法真正有效。你可在提交前檢視除錯日誌。" }, "icu:CallQualitySurvey__ConfirmSubmission__PageDescriptionWithDiagnosticLink": { - "messageformat": "Submitting will share your feedback along with diagnostic information about your call. You can optionally share a debug log to help us improve call quality." + "messageformat": "提交將分享你的意見回饋,以及關於你通話的診斷資訊。你可以選擇分享除錯日誌,協助我們改善通話品質。" }, "icu:CallQualitySurvey__ConfirmSubmission__ShareDebugLog__Label": { "messageformat": "分享除錯日誌" @@ -7645,7 +7645,7 @@ "messageformat": "感謝你的意見!" }, "icu:Megaphone__ExpandNarrowSidebar": { - "messageformat": "Expand sidebar to interact with megaphone" + "messageformat": "展開側邊欄用擴音器開始互動" }, "icu:WhatsNew__bugfixes": { "messageformat": "此版本包含許多小調整和錯誤修復,以維持 Signal 穩定運作。", @@ -7679,6 +7679,6 @@ "messageformat": "我們修正了一個群組通話中舉手指示器的錯誤:如果有人非常快速地舉起和放下手,有時舉手指示器會持續顯示(且計數為零)。" }, "icu:WhatsNew__7.87--0": { - "messageformat": "Help keep important information easily accessible with pinned messages. Your most frequently asked questions, dinner reservations, and vacation itineraries are already top of mind. Now they can be top of chat as well." + "messageformat": "使用已釘選訊息功能,讓重要資訊隨時觸手可及。你最常詢問的問題、晚餐預約以及度假行程都是首要事項。現在也可以將它們放到聊天的頂端。" } } From 531ad4194cd62f62aa463a09477acec77f7b80b2 Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Wed, 28 Jan 2026 13:41:37 -0800 Subject: [PATCH 48/49] 7.87.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6dd0e73404..50ca105cdf 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "description": "Private messaging from your desktop", "desktopName": "signal.desktop", "repository": "https://github.com/signalapp/Signal-Desktop.git", - "version": "7.87.0-beta.2", + "version": "7.87.0", "license": "AGPL-3.0-only", "author": { "name": "Signal Messenger, LLC", From 818b5b78cfe2a9930d5a35cafeb2a52aab3c2323 Mon Sep 17 00:00:00 2001 From: Micah Lee Date: Mon, 2 Feb 2026 17:56:43 -0800 Subject: [PATCH 49/49] Add merge automation scripts and documentation - scripts/merge-upstream.sh: Main merge helper script - Auto-accepts upstream for locale files and generated files - Auto-applies Observer Vault branding to package.json - Removes @signalapp/ringrtc (we use our fork) - Lists remaining conflicts for manual review - scripts/fix-ringrtc-imports.sh: Quick fix for RingRTC imports - Replaces @signalapp/ringrtc with @lockdown-systems/ringrtc - scripts/audit-customizations.sh: Lists all customized files - Files with @lockdown-systems/ringrtc imports - Files with Observer Vault comments - Custom observervault modules - docs/UPSTREAM-MERGE-GUIDE.md: Complete merge documentation - Lists all Observer Vault customizations - Explains auto-accept vs manual review files - Provides merge process checklist - Troubleshooting guide --- docs/UPSTREAM-MERGE-GUIDE.md | 245 ++++++++++++++++++ scripts/audit-customizations.sh | 57 +++++ scripts/fix-ringrtc-imports.sh | 38 +++ scripts/merge-upstream.sh | 429 ++++++++++++++++++++++++++++++++ 4 files changed, 769 insertions(+) create mode 100644 docs/UPSTREAM-MERGE-GUIDE.md create mode 100755 scripts/audit-customizations.sh create mode 100755 scripts/fix-ringrtc-imports.sh create mode 100755 scripts/merge-upstream.sh diff --git a/docs/UPSTREAM-MERGE-GUIDE.md b/docs/UPSTREAM-MERGE-GUIDE.md new file mode 100644 index 0000000000..d8a0ea868f --- /dev/null +++ b/docs/UPSTREAM-MERGE-GUIDE.md @@ -0,0 +1,245 @@ +# Observer Vault: Upstream Merge Guide + +This document describes Observer Vault's customizations from Signal-Desktop and how to merge upstream releases. + +## Quick Start + +```bash +# Add upstream remote (one-time setup) +git remote add upstream https://github.com/signalapp/Signal-Desktop.git + +# Merge a new release +./scripts/merge-upstream.sh v7.88.0 +``` + +## Observer Vault Customizations + +These are the key differences from upstream Signal-Desktop that must be preserved during merges: + +### 1. Branding (package.json) + +```json +{ + "name": "observer-vault", + "productName": "Observer Vault", + "description": "Secure video call recorder for community observers", + "desktopName": "observervault.desktop", + "repository": "https://github.com/micahflee/observer-vault.git" +} +``` + +**Merge strategy:** The script auto-applies branding after accepting upstream version. + +### 2. RingRTC Fork + +We use `@lockdown-systems/ringrtc` instead of `@signalapp/ringrtc` for audio sink features (call recording). + +**Files affected:** + +- `package.json` - dependency reference +- `ts/util/callQualitySurvey.dom.ts` - import path +- Any file importing from `@signalapp/ringrtc` + +**Merge strategy:** Manual review to ensure our fork is used. + +### 3. Disabled Call Quality Survey + +The call quality survey is disabled in Observer Vault. + +**File:** `ts/util/callQualitySurvey.dom.ts` + +```typescript +// Observer Vault: Call quality survey is disabled +export function shouldShowCallQualitySurvey(...): boolean { + return false; +} +``` + +**Merge strategy:** Preserve our implementation that always returns `false`. + +### 4. Registration Challenge Handler + +Custom challenge handler for registration captcha. + +**Files:** + +- `ts/state/smart/InstallScreen.preload.tsx` +- `ts/observervault/` directory + +**Merge strategy:** Keep our custom imports and challenge handler integration. + +### 5. 30-Second Disappearing Messages + +Additional disappearing message option. + +**Merge strategy:** Check if upstream modifies disappearing message options. + +## Files That Can Auto-Accept Upstream + +These files have no Observer Vault customizations and can always accept upstream: + +| Category | Pattern | Reason | +| --------------- | -------------------------------- | -------------- | +| Locales | `_locales/*/messages.json` | Not localized | +| Generated | `ACKNOWLEDGMENTS.md` | Regenerated | +| Storybook | `.storybook/**` | Not used | +| Sticker Creator | `sticker-creator/**` | Not used | +| Docs | `CONTRIBUTING.md`, `SECURITY.md` | Not customized | + +## Files Deleted from Upstream + +These files are automatically deleted during merges: + +| File/Directory | Reason | +| ---------------------------------- | --------------------------------- | +| `.github/ISSUE_TEMPLATE/` | We don't use Signal's issue forms | +| `.github/PULL_REQUEST_TEMPLATE.md` | We have our own workflow | +| `.github/dependabot.yml` | We manage dependencies manually | + +## Workflows Disabled from Upstream + +These workflows are renamed to `.disabled` to prevent them from running: + +| Workflow | Reason | +| ------------------------- | ------------------------------- | +| `backport.yml` | Not used | +| `benchmark.yml` | Not used | +| `commits.yml` | Not used | +| `danger.yml` | Not used | +| `icu-book.yml` | Not used | +| `notes.yml` | Not used | +| `release-notes.yml` | Not used | +| `release.yml` | We have our own release process | +| `reproducible-build*.yml` | Not used | +| `stories.yml` | Not used | + +**Kept workflows:** `ci.yml` (auto-accept upstream), `linux-release.yml` (our custom workflow) + +## Files Requiring Manual Review + +Always review these files carefully when they have conflicts: + +### Core Customization Files + +| File | Customization | +| ------------------------------------------ | ------------------------- | +| `package.json` | Branding, RingRTC fork | +| `ts/util/callQualitySurvey.dom.ts` | Disabled survey | +| `ts/state/smart/InstallScreen.preload.tsx` | Challenge handler | +| `ts/background.preload.ts` | Background customizations | + +### Observer Vault Modules (Always Keep Ours) + +- `ts/observervault/callRecorder.node.ts` +- `ts/observervault/initializeSettings.preload.ts` +- `ts/observervault/messageHandler.preload.ts` + +### Files with RingRTC Imports + +These import from `@lockdown-systems/ringrtc` instead of `@signalapp/ringrtc`. +Run `./scripts/audit-customizations.sh` for the current full list. + +**Quick fix after merge:** Run `./scripts/fix-ringrtc-imports.sh` to replace any `@signalapp/ringrtc` imports. + +## Merge Process + +### Automated Steps (handled by script) + +1. **Fetch upstream and create merge branch** +2. **Auto-accept locale files** - Accept all `_locales/*/messages.json` from upstream +3. **Auto-accept generated files** - `ACKNOWLEDGMENTS.md`, etc. +4. **Handle package.json** - Accept upstream, reapply branding +5. **Handle lockfile** - Accept upstream (regenerated later) + +### Manual Steps (your responsibility) + +1. **Review remaining conflicts** - The script will list them +2. **Preserve customizations** - Keep our RingRTC import, disabled survey, etc. +3. **Run pnpm install** - Regenerate lockfile +4. **Run pnpm generate** - Verify build works +5. **Test the application** - Especially call recording features +6. **Commit the merge** + +## Common Conflict Patterns + +### Pattern 1: Import Changes + +Upstream adds new imports to a file we've customized: + +```typescript +// CONFLICT: Upstream added 'newImport', we have 'challengeHandler' +// SOLUTION: Keep both imports +import { existingImport, newImport } from 'module'; +import { challengeHandler } from '../../observervault/challengeHandler'; +``` + +### Pattern 2: API Changes + +Upstream changes function signatures: + +```typescript +// CONFLICT: Function signature changed +// SOLUTION: Update to new signature but keep our logic +export function shouldShowCallQualitySurvey( + newParam: NewType, // Accept new parameter + cqsTestMode?: boolean +): boolean { + return false; // Keep our disabled implementation +} +``` + +### Pattern 3: WhatsNew Modal + +Upstream adds new version entries: + +```typescript +// SOLUTION: Accept upstream's new version entries +// (We don't customize release notes) +``` + +## Post-Merge Checklist + +- [ ] All conflicts resolved +- [ ] `pnpm install` succeeds +- [ ] `pnpm generate` succeeds +- [ ] Application launches +- [ ] Registration flow works +- [ ] Call recording works +- [ ] No TypeScript errors + +## Troubleshooting + +### JSON Syntax Errors in Locale Files + +If you see JSON parse errors after resolving locale conflicts: + +```bash +# Reset all locales to upstream +git checkout -- _locales/*/messages.json +git add _locales/ +``` + +### Build Errors After Merge + +1. Check for missing imports +2. Verify RingRTC import paths +3. Look for API changes that need adaptation + +### Lockfile Conflicts + +Always regenerate the lockfile: + +```bash +git checkout --theirs pnpm-lock.yaml +pnpm install +git add pnpm-lock.yaml +``` + +## Reducing Future Conflicts + +### Keep Customizations Minimal + +- Only modify files when necessary +- Add new features in new files when possible +- Use the `ts/observervault/` directory for custom code +- Avoid modifying upstream files if hooks/extensions work diff --git a/scripts/audit-customizations.sh b/scripts/audit-customizations.sh new file mode 100755 index 0000000000..ea8f826265 --- /dev/null +++ b/scripts/audit-customizations.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +# +# List all Observer Vault customizations +# +# This script identifies files that differ from upstream Signal-Desktop +# and helps track what needs manual attention during merges. +# +set -euo pipefail + +BLUE='\033[0;34m' +YELLOW='\033[1;33m' +NC='\033[0m' + +echo "" +echo "=====================================" +echo " Observer Vault Customization Audit" +echo "=====================================" +echo "" + +echo -e "${BLUE}Files importing @lockdown-systems/ringrtc:${NC}" +echo "(These use our RingRTC fork instead of @signalapp/ringrtc)" +echo "" +grep -r "@lockdown-systems/ringrtc" --include="*.ts" --include="*.tsx" ts/ 2>/dev/null | \ + grep -v "node_modules" | \ + cut -d: -f1 | \ + sort -u | \ + while read -r file; do + echo " $file" + done +echo "" + +echo -e "${BLUE}Observer Vault custom modules:${NC}" +echo "" +find ts/observervault -name "*.ts" 2>/dev/null | while read -r file; do + echo " $file" +done +echo "" + +echo -e "${BLUE}Files with 'Observer Vault' or 'observer-vault' comments/strings:${NC}" +echo "" +grep -r -l "Observer Vault\|observer-vault" --include="*.ts" --include="*.tsx" ts/ 2>/dev/null | \ + grep -v "node_modules" | \ + sort -u | \ + while read -r file; do + echo " $file" + done +echo "" + +echo -e "${YELLOW}Summary:${NC}" +echo "" +echo "Key customizations to preserve during merges:" +echo " 1. @lockdown-systems/ringrtc imports (not @signalapp/ringrtc)" +echo " 2. ts/observervault/ directory (custom features)" +echo " 3. Disabled call quality survey in ts/util/callQualitySurvey.dom.ts" +echo " 4. Challenge handler in InstallScreen" +echo " 5. Branding in package.json" +echo "" diff --git a/scripts/fix-ringrtc-imports.sh b/scripts/fix-ringrtc-imports.sh new file mode 100755 index 0000000000..31c69ba3e3 --- /dev/null +++ b/scripts/fix-ringrtc-imports.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +# +# Fix RingRTC imports after merge +# +# After accepting upstream changes, this script replaces @signalapp/ringrtc +# with @lockdown-systems/ringrtc in all TypeScript files. +# +set -euo pipefail + +GREEN='\033[0;32m' +BLUE='\033[0;34m' +NC='\033[0m' + +echo "" +echo "Fixing RingRTC imports..." +echo "" + +# Find all files with @signalapp/ringrtc imports +files=$(grep -r -l "@signalapp/ringrtc" --include="*.ts" --include="*.tsx" ts/ 2>/dev/null || true) + +if [[ -z "$files" ]]; then + echo -e "${GREEN}No @signalapp/ringrtc imports found - nothing to fix${NC}" + exit 0 +fi + +count=0 +while IFS= read -r file; do + if [[ -n "$file" ]]; then + echo -e "${BLUE}Fixing:${NC} $file" + sed -i 's/@signalapp\/ringrtc/@lockdown-systems\/ringrtc/g' "$file" + ((count++)) + fi +done <<< "$files" + +echo "" +echo -e "${GREEN}Fixed $count files${NC}" +echo "" +echo "Don't forget to run 'pnpm generate' to verify the build!" diff --git a/scripts/merge-upstream.sh b/scripts/merge-upstream.sh new file mode 100755 index 0000000000..10a5c8a3fd --- /dev/null +++ b/scripts/merge-upstream.sh @@ -0,0 +1,429 @@ +#!/usr/bin/env bash +# +# Observer Vault: Merge Upstream Signal-Desktop +# +# This script helps automate merging new Signal-Desktop releases into Observer Vault. +# It handles common conflict patterns automatically and highlights files needing manual review. +# +# Usage: +# ./scripts/merge-upstream.sh v7.88.0 +# +# Prerequisites: +# - You must have 'upstream' remote pointing to Signal-Desktop +# - Working directory must be clean (no uncommitted changes) +# +set -euo pipefail + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Files that should ALWAYS accept upstream version (no Observer Vault customizations) +AUTO_ACCEPT_UPSTREAM=( + # Locale files - Observer Vault is not localized + "_locales/*/messages.json" + + # Generated files - will be regenerated + "ACKNOWLEDGMENTS.md" + + # Documentation we don't customize + "CONTRIBUTING.md" + "SECURITY.md" + + # Storybook (we don't customize) + ".storybook/**" + "sticker-creator/**" +) + +# Files/directories from upstream that should be DELETED (not used in Observer Vault) +DELETE_FROM_UPSTREAM=( + # Issue templates - we don't want Signal's issue templates + ".github/ISSUE_TEMPLATE" + + # PR template - we have our own workflow + ".github/PULL_REQUEST_TEMPLATE.md" + + # Dependabot - we manage dependencies manually + ".github/dependabot.yml" +) + +# Workflow files that should be DISABLED (renamed to .disabled) +# These are upstream workflows we don't run but keep for reference +DISABLE_WORKFLOWS=( + ".github/workflows/backport.yml" + ".github/workflows/benchmark.yml" + ".github/workflows/commits.yml" + ".github/workflows/danger.yml" + ".github/workflows/icu-book.yml" + ".github/workflows/notes.yml" + ".github/workflows/release-notes.yml" + ".github/workflows/release.yml" + ".github/workflows/reproducible-build-scheduler.yml" + ".github/workflows/reproducible-builds.yml" + ".github/workflows/stories.yml" +) + +# Files with Observer Vault customizations that MUST be reviewed manually +# Generated by: ./scripts/audit-customizations.sh +MANUAL_REVIEW_REQUIRED=( + # Branding + "package.json" + + # Observer Vault custom modules (always ours) + "ts/observervault/**" + + # Background process customizations + "ts/background.preload.ts" + + # Call quality survey (disabled) + "ts/util/callQualitySurvey.dom.ts" + + # Registration/Install flow + "ts/state/smart/InstallScreen.preload.tsx" + "ts/components/installScreen/InstallScreenCreatingAccountStep.dom.tsx" + + # Files with @lockdown-systems/ringrtc imports + "ts/calling/VideoSupport.preload.ts" + "ts/calling/findBestMatchingDevice.std.ts" + "ts/components/CallManager.dom.tsx" + "ts/components/CallScreen.dom.tsx" + "ts/components/CallingDeviceSelection.dom.tsx" + "ts/components/CallingPip.dom.tsx" + "ts/components/CallingPipRemoteVideo.dom.tsx" + "ts/components/CallingLobby.dom.tsx" + "ts/components/GroupCallOverflowArea.dom.tsx" + "ts/components/GroupCallRemoteParticipant.dom.tsx" + "ts/components/GroupCallRemoteParticipants.dom.tsx" + "ts/components/Preferences.dom.tsx" + "ts/components/GlobalModalContainer.dom.tsx" + "ts/components/IncomingCallBar.dom.tsx" + "ts/components/LeftPane.dom.tsx" + "ts/components/ToastManager.dom.tsx" + "ts/services/calling.preload.ts" + "ts/state/ducks/calling.preload.ts" + "ts/state/ducks/globalModals.preload.ts" + "ts/state/ducks/conversations.preload.ts" + "ts/state/smart/Preferences.preload.tsx" + "ts/types/CallLink.std.ts" + "ts/types/CallQualitySurvey.std.ts" + "ts/types/Calling.std.ts" + "ts/types/Storage.d.ts" + "ts/util/callDisposition.preload.ts" + "ts/util/callLinks/zkgroup.preload.ts" + "ts/util/callLinksRingrtc.node.ts" + "ts/util/callingMessageToProto.node.ts" + "ts/util/callingPermissions.std.ts" + "ts/util/onCallLinkUpdateSync.preload.ts" + "ts/util/requestMicrophonePermissions.std.ts" + "ts/util/queueAttachmentDownloads.preload.ts" + + # Build/config files referencing our fork + "scripts/esbuild.js" + "scripts/generate-acknowledgments.js" + ".eslint/rules/file-suffix.js" +) + +log_info() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +log_success() { + echo -e "${GREEN}[SUCCESS]${NC} $1" +} + +log_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# Check if we're in the right directory +check_repo() { + if [[ ! -f "package.json" ]] || ! grep -q '"name": "observer-vault"' package.json 2>/dev/null; then + log_error "This script must be run from the observer-vault repository root" + exit 1 + fi +} + +# Check for clean working directory +check_clean() { + if [[ -n $(git status --porcelain) ]]; then + log_error "Working directory is not clean. Commit or stash your changes first." + exit 1 + fi +} + +# Fetch upstream and verify tag exists +fetch_upstream() { + local tag="$1" + + log_info "Fetching upstream..." + git fetch upstream --tags + + if ! git rev-parse "$tag" >/dev/null 2>&1; then + log_error "Tag '$tag' not found. Available recent tags:" + git tag -l 'v7.*' | sort -V | tail -10 + exit 1 + fi + + log_success "Found tag $tag" +} + +# Start the merge +start_merge() { + local tag="$1" + local branch="merge-${tag}" + + log_info "Creating merge branch: $branch" + git checkout -b "$branch" 2>/dev/null || git checkout "$branch" + + log_info "Starting merge of $tag..." + if git merge "$tag" --no-commit --no-ff 2>/dev/null; then + log_success "Merge completed without conflicts!" + return 0 + else + log_warning "Merge has conflicts. Processing..." + return 1 + fi +} + +# Auto-accept upstream for specified file patterns +auto_accept_upstream() { + log_info "Auto-accepting upstream for non-customized files..." + + local conflicts + conflicts=$(git diff --name-only --diff-filter=U 2>/dev/null || true) + + if [[ -z "$conflicts" ]]; then + log_info "No conflicts to auto-resolve" + return 0 + fi + + local auto_resolved=0 + + for pattern in "${AUTO_ACCEPT_UPSTREAM[@]}"; do + # Find conflicting files matching this pattern + local matching_files + matching_files=$(echo "$conflicts" | grep -E "^${pattern//\*/.*}$" 2>/dev/null || true) + + if [[ -n "$matching_files" ]]; then + while IFS= read -r file; do + if [[ -n "$file" ]]; then + log_info " Auto-accepting upstream: $file" + git checkout --theirs "$file" 2>/dev/null && git add "$file" + ((auto_resolved++)) || true + fi + done <<< "$matching_files" + fi + done + + log_success "Auto-resolved $auto_resolved files by accepting upstream" +} + +# Handle package.json specially +handle_package_json() { + if git diff --name-only --diff-filter=U | grep -q "^package.json$"; then + log_warning "package.json has conflicts - applying Observer Vault branding..." + + # Get upstream version + local upstream_version + upstream_version=$(git show MERGE_HEAD:package.json | grep '"version"' | head -1 | sed 's/.*: *"\([^"]*\)".*/\1/') + + # Accept upstream first + git checkout --theirs package.json + + # Apply Observer Vault branding + local tmp_file=$(mktemp) + cat package.json | \ + sed 's/"name": "signal-desktop"/"name": "observer-vault"/' | \ + sed 's/"productName": "Signal"/"productName": "Observer Vault"/' | \ + sed 's/"description": "Private messaging from your desktop"/"description": "Secure video call recorder for community observers"/' | \ + sed 's/"desktopName": "signal.desktop"/"desktopName": "observervault.desktop"/' | \ + sed 's|"repository": "https://github.com/signalapp/Signal-Desktop.git"|"repository": "https://github.com/micahflee/observer-vault.git"|' \ + > "$tmp_file" + + mv "$tmp_file" package.json + + # Remove @signalapp/ringrtc if present (we use @lockdown-systems/ringrtc) + if grep -q '"@signalapp/ringrtc"' package.json; then + log_info " Removing @signalapp/ringrtc (we use @lockdown-systems/ringrtc)" + # Use node to properly edit JSON + node -e " + const fs = require('fs'); + const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8')); + delete pkg.dependencies['@signalapp/ringrtc']; + fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2) + '\n'); + " + fi + + git add package.json + log_success "package.json updated with Observer Vault branding (version: $upstream_version)" + fi +} + +# Handle pnpm-lock.yaml +handle_lockfile() { + if git diff --name-only --diff-filter=U | grep -q "^pnpm-lock.yaml$"; then + log_info "Accepting upstream pnpm-lock.yaml (will regenerate with pnpm install)" + git checkout --theirs pnpm-lock.yaml + git add pnpm-lock.yaml + fi +} + +# Delete files/directories that upstream adds but we don't want +delete_unwanted_files() { + log_info "Removing unwanted upstream files..." + + local deleted=0 + + for path in "${DELETE_FROM_UPSTREAM[@]}"; do + if [[ -e "$path" ]]; then + log_info " Deleting: $path" + git rm -rf "$path" 2>/dev/null || rm -rf "$path" + ((deleted++)) || true + fi + done + + if [[ $deleted -gt 0 ]]; then + log_success "Deleted $deleted unwanted files/directories" + else + log_info "No unwanted files to delete" + fi +} + +# Disable upstream workflows by renaming to .disabled +disable_workflows() { + log_info "Disabling upstream workflows..." + + local disabled=0 + + for workflow in "${DISABLE_WORKFLOWS[@]}"; do + if [[ -f "$workflow" ]]; then + local disabled_name="${workflow}.disabled" + log_info " Disabling: $workflow -> $disabled_name" + git mv "$workflow" "$disabled_name" 2>/dev/null || mv "$workflow" "$disabled_name" + git add "$disabled_name" 2>/dev/null || true + ((disabled++)) || true + fi + done + + if [[ $disabled -gt 0 ]]; then + log_success "Disabled $disabled workflows" + else + log_info "No workflows to disable" + fi +} + +# Show remaining conflicts +show_remaining_conflicts() { + local conflicts + conflicts=$(git diff --name-only --diff-filter=U 2>/dev/null || true) + + if [[ -z "$conflicts" ]]; then + log_success "All conflicts resolved!" + return 0 + fi + + echo "" + log_warning "The following files still have conflicts and need manual review:" + echo "" + + while IFS= read -r file; do + if [[ -n "$file" ]]; then + # Check if it's a known customized file + local is_known=false + for pattern in "${MANUAL_REVIEW_REQUIRED[@]}"; do + if [[ "$file" == $pattern ]] || [[ "$file" =~ ^${pattern//\*/.*}$ ]]; then + is_known=true + break + fi + done + + if $is_known; then + echo -e " ${YELLOW}[CUSTOMIZED]${NC} $file" + else + echo -e " ${RED}[UNKNOWN]${NC} $file - may need investigation" + fi + fi + done <<< "$conflicts" + + echo "" + log_info "Tips for resolving remaining conflicts:" + echo " 1. For files with Observer Vault customizations, carefully review both versions" + echo " 2. Keep our custom imports (e.g., @lockdown-systems/ringrtc)" + echo " 3. Keep our disabled features (e.g., call quality survey)" + echo " 4. Accept upstream API changes but preserve our customizations" + echo "" + echo "After resolving, run:" + echo " git add " + echo " pnpm install" + echo " pnpm generate" + echo " git commit" + + return 1 +} + +# Regenerate dependencies and build +regenerate() { + log_info "Running pnpm install to regenerate lockfile..." + pnpm install + + log_info "Running pnpm generate to verify build..." + if pnpm generate; then + log_success "Build successful!" + else + log_error "Build failed - check for issues" + return 1 + fi +} + +# Main +main() { + if [[ $# -lt 1 ]]; then + echo "Usage: $0 " + echo "Example: $0 v7.88.0" + exit 1 + fi + + local tag="$1" + + echo "" + echo "==========================================" + echo " Observer Vault Upstream Merge Helper" + echo "==========================================" + echo "" + + check_repo + check_clean + fetch_upstream "$tag" + + if start_merge "$tag"; then + # No conflicts - still need to handle deletions and disabled workflows + delete_unwanted_files + disable_workflows + regenerate + git add -A + log_success "Ready to commit! Run: git commit" + else + # Handle conflicts + auto_accept_upstream + handle_package_json + handle_lockfile + delete_unwanted_files + disable_workflows + + if show_remaining_conflicts; then + # All resolved + regenerate + git add -A + log_success "Ready to commit! Run: git commit" + fi + fi +} + +main "$@"