diff --git a/src/components/structures/auth/CompleteSecurity.tsx b/src/components/structures/auth/CompleteSecurity.tsx index 5bade7b24a..07a4852895 100644 --- a/src/components/structures/auth/CompleteSecurity.tsx +++ b/src/components/structures/auth/CompleteSecurity.tsx @@ -7,6 +7,7 @@ Please see LICENSE files in the repository root for full details. */ import React from "react"; +import { Glass } from "@vector-im/compound-web"; import { _t } from "../../../languageHandler"; import { SetupEncryptionStore, Phase } from "../../../stores/SetupEncryptionStore"; @@ -22,15 +23,17 @@ interface IProps { interface IState { phase?: Phase; - lostKeys: boolean; } +/** + * Prompts the user to verify their device when they first log in. + */ export default class CompleteSecurity extends React.Component { public constructor(props: IProps) { super(props); const store = SetupEncryptionStore.sharedInstance(); store.start(); - this.state = { phase: store.phase, lostKeys: store.lostKeys() }; + this.state = { phase: store.phase }; } public componentDidMount(): void { @@ -40,7 +43,7 @@ export default class CompleteSecurity extends React.Component { private onStoreUpdate = (): void => { const store = SetupEncryptionStore.sharedInstance(); - this.setState({ phase: store.phase, lostKeys: store.lostKeys() }); + this.setState({ phase: store.phase }); }; private onSkipClick = (): void => { @@ -55,20 +58,14 @@ export default class CompleteSecurity extends React.Component { } public render(): React.ReactNode { - const { phase, lostKeys } = this.state; + const { phase } = this.state; let icon; let title; if (phase === Phase.Loading) { return null; } else if (phase === Phase.Intro) { - if (lostKeys) { - icon = ; - title = _t("encryption|verification|after_new_login|unable_to_verify"); - } else { - icon = ; - title = _t("encryption|verification|after_new_login|verify_this_device"); - } + // We don't specify an icon nor title since `SetupEncryptionBody` provides its own } else if (phase === Phase.Done) { icon = ; title = _t("encryption|verification|after_new_login|device_verified"); @@ -98,17 +95,19 @@ export default class CompleteSecurity extends React.Component { } return ( - - -

- {icon} - {title} - {skipButton} -

-
- -
-
+ + + +

+ {icon} + {title} + {skipButton} +

+
+ +
+
+
); } diff --git a/src/components/structures/auth/SetupEncryptionBody.tsx b/src/components/structures/auth/SetupEncryptionBody.tsx index b76a623e2c..5098265e67 100644 --- a/src/components/structures/auth/SetupEncryptionBody.tsx +++ b/src/components/structures/auth/SetupEncryptionBody.tsx @@ -9,7 +9,9 @@ Please see LICENSE files in the repository root for full details. import React, { type JSX } from "react"; import { type KeyBackupInfo, type VerificationRequest } from "matrix-js-sdk/src/crypto-api"; import { logger } from "matrix-js-sdk/src/logger"; -import { type SecretStorageKeyDescription } from "matrix-js-sdk/src/secret-storage"; +import DevicesIcon from "@vector-im/compound-design-tokens/assets/web/icons/devices"; +import LockIcon from "@vector-im/compound-design-tokens/assets/web/icons/lock-solid"; +import { Button } from "@vector-im/compound-web"; import { _t } from "../../../languageHandler"; import { MatrixClientPeg } from "../../../MatrixClientPeg"; @@ -17,25 +19,38 @@ import Modal from "../../../Modal"; import VerificationRequestDialog from "../../views/dialogs/VerificationRequestDialog"; import { SetupEncryptionStore, Phase } from "../../../stores/SetupEncryptionStore"; import EncryptionPanel from "../../views/right_panel/EncryptionPanel"; -import AccessibleButton, { type ButtonEvent } from "../../views/elements/AccessibleButton"; +import AccessibleButton from "../../views/elements/AccessibleButton"; import Spinner from "../../views/elements/Spinner"; import { ResetIdentityDialog } from "../../views/dialogs/ResetIdentityDialog"; - -function keyHasPassphrase(keyInfo: SecretStorageKeyDescription): boolean { - return Boolean(keyInfo.passphrase && keyInfo.passphrase.salt && keyInfo.passphrase.iterations); -} +import { EncryptionCard } from "../../views/settings/encryption/EncryptionCard"; +import { EncryptionCardButtons } from "../../views/settings/encryption/EncryptionCardButtons"; +import { EncryptionCardEmphasisedContent } from "../../views/settings/encryption/EncryptionCardEmphasisedContent"; +import ExternalLink from "../../views/elements/ExternalLink"; +import dispatcher from "../../../dispatcher/dispatcher"; interface IProps { onFinished: () => void; + /** + * Offer the user an option to log out, instead of setting up encryption. + * + * This is used when this component is shown when the user is initially + * prompted to set up encryption, before the user is shown the main chat + * interface. + * + * Defaults to `false` if omitted. + */ + allowLogout?: boolean; } interface IState { phase?: Phase; verificationRequest: VerificationRequest | null; backupInfo: KeyBackupInfo | null; - lostKeys: boolean; } +/** + * Component to set up encryption by verifying the current device. + */ export default class SetupEncryptionBody extends React.Component { public constructor(props: IProps) { super(props); @@ -48,7 +63,6 @@ export default class SetupEncryptionBody extends React.Component // Because of the latter, it lives in the state. verificationRequest: store.verificationRequest, backupInfo: store.backupInfo, - lostKeys: store.lostKeys(), }; } @@ -67,7 +81,6 @@ export default class SetupEncryptionBody extends React.Component phase: store.phase, verificationRequest: store.verificationRequest, backupInfo: store.backupInfo, - lostKeys: store.lostKeys(), }); }; @@ -112,8 +125,8 @@ export default class SetupEncryptionBody extends React.Component store.returnAfterSkip(); }; - private onResetClick = (ev: ButtonEvent): void => { - ev.preventDefault(); + private onCantConfirmClick = (): void => { + const store = SetupEncryptionStore.sharedInstance(); Modal.createDialog(ResetIdentityDialog, { onReset: () => { // The user completed the reset process - close this dialog @@ -121,10 +134,14 @@ export default class SetupEncryptionBody extends React.Component const store = SetupEncryptionStore.sharedInstance(); store.done(); }, - variant: "confirm", + variant: store.lostKeys() ? "no_verification_method" : "confirm", }); }; + private onSignOutClick = (): void => { + dispatcher.dispatch({ action: "logout" }); + }; + private onDoneClick = (): void => { const store = SetupEncryptionStore.sharedInstance(); store.done(); @@ -136,7 +153,7 @@ export default class SetupEncryptionBody extends React.Component public render(): React.ReactNode { const cli = MatrixClientPeg.safeGet(); - const { phase, lostKeys } = this.state; + const { phase } = this.state; if (this.state.verificationRequest && cli.getUser(this.state.verificationRequest.otherUserId)) { return ( @@ -149,69 +166,59 @@ export default class SetupEncryptionBody extends React.Component /> ); } else if (phase === Phase.Intro) { - if (lostKeys) { - return ( -
-

{_t("encryption|verification|no_key_or_device")}

+ const store = SetupEncryptionStore.sharedInstance(); -
- - {_t("encryption|verification|reset_proceed_prompt")} - -
-
- ); - } else { - const store = SetupEncryptionStore.sharedInstance(); - let recoveryKeyPrompt; - if (store.keyInfo && keyHasPassphrase(store.keyInfo)) { - recoveryKeyPrompt = _t("encryption|verification|verify_using_key_or_phrase"); - } else if (store.keyInfo) { - recoveryKeyPrompt = _t("encryption|verification|verify_using_key"); - } - - let useRecoveryKeyButton; - if (recoveryKeyPrompt) { - useRecoveryKeyButton = ( - - {recoveryKeyPrompt} - - ); - } - - let verifyButton; - if (store.hasDevicesToVerifyAgainst) { - verifyButton = ( - - {_t("encryption|verification|verify_using_device")} - - ); - } - - return ( -
-

{_t("encryption|verification|verification_description")}

- -
- {verifyButton} - {useRecoveryKeyButton} -
-
- {_t("encryption|reset_all_button", undefined, { - a: (sub) => ( - - {sub} - - ), - })} -
-
+ let verifyButton; + if (store.hasDevicesToVerifyAgainst) { + verifyButton = ( + ); } + + let useRecoveryKeyButton; + if (store.keyInfo) { + useRecoveryKeyButton = ( + + ); + } + + let signOutButton; + if (this.props.allowLogout) { + signOutButton = ( + + ); + } + + return ( + + + {_t("encryption|verification|confirm_identity_description")} + + + {_t("action|learn_more")} + + + + + {verifyButton} + {useRecoveryKeyButton} + + {signOutButton} + + + ); } else if (phase === Phase.Done) { let message: JSX.Element; if (this.state.backupInfo) { diff --git a/src/components/utils/ListView.tsx b/src/components/utils/ListView.tsx index b11a3d638c..f99b7ab944 100644 --- a/src/components/utils/ListView.tsx +++ b/src/components/utils/ListView.tsx @@ -133,13 +133,13 @@ export function ListView(props: IListViewProps { + setTabIndexKey(key); isScrollingToItem.current = false; }, }); @@ -184,28 +184,32 @@ export function ListView(props: IListViewProps(props: IListViewProps = new Map([ [FilterKey.UnreadFilter, _td("room_list|filters|unread")], [FilterKey.PeopleFilter, _td("room_list|filters|people")], [FilterKey.RoomsFilter, _td("room_list|filters|rooms")], + [FilterKey.FavouriteFilter, _td("room_list|filters|favourite")], [FilterKey.MentionsFilter, _td("room_list|filters|mentions")], [FilterKey.InvitesFilter, _td("room_list|filters|invites")], - [FilterKey.FavouriteFilter, _td("room_list|filters|favourite")], [FilterKey.LowPriorityFilter, _td("room_list|filters|low_priority")], ]); @@ -74,9 +72,6 @@ export function useFilteredRooms(): FilteredRooms { setRoomsResult(newRooms); }, []); - // Reset filters when active space changes - useEventEmitter(SpaceStore.instance, UPDATE_SELECTED_SPACE, () => setPrimaryFilter(undefined)); - const filterUndefined = (array: (FilterKey | undefined)[]): FilterKey[] => array.filter((f) => f !== undefined) as FilterKey[]; diff --git a/src/components/viewmodels/settings/encryption/KeyStoragePanelViewModel.ts b/src/components/viewmodels/settings/encryption/KeyStoragePanelViewModel.ts index ee301bd27f..60ad21236f 100644 --- a/src/components/viewmodels/settings/encryption/KeyStoragePanelViewModel.ts +++ b/src/components/viewmodels/settings/encryption/KeyStoragePanelViewModel.ts @@ -79,12 +79,30 @@ export function useKeyStoragePanelViewModel(): KeyStoragePanelState { return; } if (enable) { - // If there is no existing key backup on the server, create one. - // `resetKeyBackup` will delete any existing backup, so we only do this if there is no existing backup. - const currentKeyBackup = await crypto.checkKeyBackupAndEnable(); + const childLogger = logger.getChild("[enable key storage]"); + childLogger.info("User requested enabling key storage"); + let currentKeyBackup = await crypto.checkKeyBackupAndEnable(); + if (currentKeyBackup) { + logger.info( + `Existing key backup is present. version: ${currentKeyBackup.backupInfo.version}`, + currentKeyBackup.trustInfo, + ); + // Check if the current key backup can be used. Either of these properties causes the key backup to be used. + if (currentKeyBackup.trustInfo.trusted || currentKeyBackup.trustInfo.matchesDecryptionKey) { + logger.info("Existing key backup can be used"); + } else { + logger.warn("Existing key backup cannot be used, creating new backup"); + // There aren't any *usable* backups, so we need to create a new one. + currentKeyBackup = null; + } + } else { + logger.info("No existing key backup versions are present, creating new backup"); + } + + // If there is no usable key backup on the server, create one. + // `resetKeyBackup` will delete any existing backup, so we only do this if there is no usable backup. if (currentKeyBackup === null) { await crypto.resetKeyBackup(); - // resetKeyBackup fires this off in the background without waiting, so we need to do it // explicitly and wait for it, otherwise it won't be enabled yet when we check again. await crypto.checkKeyBackupAndEnable(); @@ -93,6 +111,7 @@ export function useKeyStoragePanelViewModel(): KeyStoragePanelState { // Set the flag so that EX no longer thinks the user wants backup disabled await matrixClient.setAccountData(BACKUP_DISABLED_ACCOUNT_DATA_KEY, { disabled: false }); } else { + logger.info("User requested disabling key backup"); // This method will delete the key backup as well as server side recovery keys and other // server-side crypto data. await crypto.disableKeyStorage(); diff --git a/src/components/views/audio_messages/RecordingPlayback.tsx b/src/components/views/audio_messages/RecordingPlayback.tsx index 75e1419ce6..4f5c392d41 100644 --- a/src/components/views/audio_messages/RecordingPlayback.tsx +++ b/src/components/views/audio_messages/RecordingPlayback.tsx @@ -74,7 +74,11 @@ export default class RecordingPlayback extends AudioPlayerBase { } return ( -
+
{ +interface IProps { + /** + * Whether to add a blurred shadow around the modal. + * + * If the modal component provides its own shadow or blurring, this can be + * disabled. Defaults to `true`. + */ + addBlur?: boolean; +} + +export default class AuthPage extends React.PureComponent> { private static welcomeBackgroundUrl?: string; // cache the url as a static to prevent it changing without refreshing @@ -58,14 +69,26 @@ export default class AuthPage extends React.PureComponent; + modalContentStyle.background = "rgba(255, 255, 255, 0.59)"; + } + + const modalClasses = classNames({ + mx_AuthPage_modal: true, + mx_AuthPage_modal_withBlur: this.props.addBlur !== false, + }); + return (
-
-
+
+ {modalBlur}
{this.props.children}
diff --git a/src/components/views/avatars/WidgetAvatar.tsx b/src/components/views/avatars/WidgetAvatar.tsx index c43cd98216..5baba7ca01 100644 --- a/src/components/views/avatars/WidgetAvatar.tsx +++ b/src/components/views/avatars/WidgetAvatar.tsx @@ -37,6 +37,8 @@ const WidgetAvatar: React.FC = ({ app, className, size = "20px", ...prop return ( = ({ roomId, call }) => action: Action.ViewRoom, room_id: roomId, view_call: true, - skipLobby: "shiftKey" in ev ? ev.shiftKey : false, + skipLobby: ("shiftKey" in ev && ev.shiftKey) || undefined, metricsTrigger: undefined, }); }, diff --git a/src/components/views/dialogs/BaseDialog.tsx b/src/components/views/dialogs/BaseDialog.tsx index 56f6d0c528..a946a44e91 100644 --- a/src/components/views/dialogs/BaseDialog.tsx +++ b/src/components/views/dialogs/BaseDialog.tsx @@ -145,6 +145,9 @@ export default class BaseDialog extends React.Component { const lockProps: Record = { "onKeyDown": this.onKeyDown, "role": "dialog", + // Allow the dialog to be keyboard focusable + // So the escape key handling works in more cases (say you select the header) + "tabIndex": -1, // This should point to a node describing the dialog. // If we were about to completely follow this recommendation we'd need to // make all the components relying on BaseDialog to be aware of it. diff --git a/src/components/views/dialogs/ConfirmKeyStorageOffDialog.tsx b/src/components/views/dialogs/ConfirmKeyStorageOffDialog.tsx index 49e7cad17b..d6a5f79aeb 100644 --- a/src/components/views/dialogs/ConfirmKeyStorageOffDialog.tsx +++ b/src/components/views/dialogs/ConfirmKeyStorageOffDialog.tsx @@ -17,6 +17,7 @@ import { EncryptionCardButtons } from "../settings/encryption/EncryptionCardButt import { type OpenToTabPayload } from "../../../dispatcher/payloads/OpenToTabPayload"; import { Action } from "../../../dispatcher/actions"; import { UserTab } from "./UserTab"; +import SdkConfig from "../../../SdkConfig"; interface Props { onFinished: (dismissed: boolean) => void; @@ -60,7 +61,7 @@ export default class ConfirmKeyStorageOffDialog extends React.Component { a: (sub) => ( <>
- + {sub} diff --git a/src/components/views/dialogs/CreateRoomDialog.tsx b/src/components/views/dialogs/CreateRoomDialog.tsx index 3ff42cde22..d3771d102d 100644 --- a/src/components/views/dialogs/CreateRoomDialog.tsx +++ b/src/components/views/dialogs/CreateRoomDialog.tsx @@ -26,6 +26,7 @@ import { KeyBindingAction } from "../../../accessibility/KeyboardShortcuts"; import { privateShouldBeEncrypted } from "../../../utils/rooms"; import SettingsStore from "../../../settings/SettingsStore"; import LabelledCheckbox from "../elements/LabelledCheckbox"; +import { UIFeature } from "../../../settings/UIFeature"; interface IProps { type?: RoomType; @@ -83,6 +84,8 @@ interface IState { export default class CreateRoomDialog extends React.Component { private readonly askToJoinEnabled: boolean; + private readonly advancedSettingsEnabled: boolean; + private readonly allowCreatingPublicRooms: boolean; private readonly supportsRestricted: boolean; private nameField = createRef(); private aliasField = createRef(); @@ -91,10 +94,14 @@ export default class CreateRoomDialog extends React.Component { super(props); this.askToJoinEnabled = SettingsStore.getValue("feature_ask_to_join"); + this.advancedSettingsEnabled = SettingsStore.getValue(UIFeature.AdvancedSettings); + this.allowCreatingPublicRooms = SettingsStore.getValue(UIFeature.AllowCreatingPublicRooms); + this.supportsRestricted = !!this.props.parentSpace; + const defaultPublic = this.allowCreatingPublicRooms && this.props.defaultPublic; let joinRule = JoinRule.Invite; - if (this.props.defaultPublic) { + if (defaultPublic) { joinRule = JoinRule.Public; } else if (this.supportsRestricted) { joinRule = JoinRule.Restricted; @@ -102,7 +109,7 @@ export default class CreateRoomDialog extends React.Component { const cli = MatrixClientPeg.safeGet(); this.state = { - isPublicKnockRoom: this.props.defaultPublic || false, + isPublicKnockRoom: defaultPublic || false, isEncrypted: this.props.defaultEncrypted ?? privateShouldBeEncrypted(cli), joinRule, name: this.props.defaultName || "", @@ -415,7 +422,7 @@ export default class CreateRoomDialog extends React.Component { labelKnock={ this.askToJoinEnabled ? _t("room_settings|security|join_rule_knock") : undefined } - labelPublic={_t("common|public_room")} + labelPublic={this.allowCreatingPublicRooms ? _t("common|public_room") : undefined} labelRestricted={ this.supportsRestricted ? _t("create_room|join_rule_restricted") : undefined } @@ -427,19 +434,21 @@ export default class CreateRoomDialog extends React.Component { {visibilitySection} {e2eeSection} {aliasField} -
- - {this.state.detailsOpen ? _t("action|hide_advanced") : _t("action|show_advanced")} - - -

{federateLabel}

-
+ {this.advancedSettingsEnabled && ( +
+ + {this.state.detailsOpen ? _t("action|hide_advanced") : _t("action|show_advanced")} + + +

{federateLabel}

+
+ )}
= ({ roomId, threadRootId, onFinished }) {Object.entries(Tools).map(([category, tools]) => (
-

{_t(categoryLabels[category as unknown as Category])}

+

+ {_t(categoryLabels[category as unknown as Category])} +

{tools.map(([label, tool]) => { const onClick = (): void => { setTool([label, tool]); @@ -98,7 +100,7 @@ const DevtoolsDialog: React.FC = ({ roomId, threadRootId, onFinished })
))}
-

{_t("common|options")}

+

{_t("common|options")}

diff --git a/src/components/views/dialogs/IntegrationsDisabledDialog.tsx b/src/components/views/dialogs/IntegrationsDisabledDialog.tsx index ad0f765413..93cd5f82c9 100644 --- a/src/components/views/dialogs/IntegrationsDisabledDialog.tsx +++ b/src/components/views/dialogs/IntegrationsDisabledDialog.tsx @@ -1,55 +1,53 @@ /* -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2019 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial Please see LICENSE files in the repository root for full details. */ -import React from "react"; +import React, { useCallback } from "react"; import { _t } from "../../../languageHandler"; import dis from "../../../dispatcher/dispatcher"; import { Action } from "../../../dispatcher/actions"; import BaseDialog from "./BaseDialog"; import DialogButtons from "../elements/DialogButtons"; +import { UserTab } from "./UserTab"; interface IProps { onFinished(): void; } -export default class IntegrationsDisabledDialog extends React.Component { - private onAcknowledgeClick = (): void => { - this.props.onFinished(); - }; +export const IntegrationsDisabledDialog: React.FC = ({ onFinished }) => { + const onOpenSettingsClick = useCallback(() => { + onFinished(); + dis.dispatch({ + action: Action.ViewUserSettings, + initialTabId: UserTab.Security, + }); + }, [onFinished]); - private onOpenSettingsClick = (): void => { - this.props.onFinished(); - dis.fire(Action.ViewUserSettings); - }; - - public render(): React.ReactNode { - return ( - -
-

- {_t("integrations|disabled_dialog_description", { - manageIntegrations: _t("integration_manager|manage_title"), - })} -

-
- -
- ); - } -} + return ( + +
+

+ {_t("integrations|disabled_dialog_description", { + manageIntegrations: _t("integration_manager|manage_title"), + })} +

+
+ +
+ ); +}; diff --git a/src/components/views/dialogs/InviteDialog.tsx b/src/components/views/dialogs/InviteDialog.tsx index 73049122dc..6108883c88 100644 --- a/src/components/views/dialogs/InviteDialog.tsx +++ b/src/components/views/dialogs/InviteDialog.tsx @@ -12,7 +12,6 @@ import { KnownMembership } from "matrix-js-sdk/src/types"; import { type MatrixCall } from "matrix-js-sdk/src/webrtc/call"; import { logger } from "matrix-js-sdk/src/logger"; import { uniqBy } from "lodash"; -import { CloseIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import { Icon as EmailPillAvatarIcon } from "../../../../res/img/icon-email-pill-avatar.svg"; import { _t, _td } from "../../../languageHandler"; @@ -24,7 +23,6 @@ import { getDefaultIdentityServerUrl, setToDefaultIdentityServer } from "../../. import { buildActivityScores, buildMemberScores, compareMembers } from "../../../utils/SortMembers"; import { abbreviateUrl } from "../../../utils/UrlUtils"; import IdentityAuthClient from "../../../IdentityAuthClient"; -import { humanizeTime } from "../../../utils/humanize"; import { type IInviteResult, inviteMultipleToRoom, showAnyInviteErrors } from "../../../RoomInvite"; import { Action } from "../../../dispatcher/actions"; import { DefaultTagID } from "../../../stores/room-list/models"; @@ -65,6 +63,10 @@ import AskInviteAnywayDialog, { type UnknownProfiles } from "./AskInviteAnywayDi import { SdkContextClass } from "../../../contexts/SDKContext"; import { type UserProfilesStore } from "../../../stores/UserProfilesStore"; import InviteProgressBody from "./InviteProgressBody.tsx"; +import { RichList } from "../../../shared-components/rich-list/RichList"; +import { RichItem } from "../../../shared-components/rich-list/RichItem"; +import { PillInput } from "../../../shared-components/pill-input/PillInput"; +import { Pill } from "../../../shared-components/pill-input/Pill"; // we have a number of types defined from the Matrix spec which can't reasonably be altered here. /* eslint-disable camelcase */ @@ -120,27 +122,10 @@ class DMUserTile extends React.PureComponent { const avatarSize = "20px"; const avatar = ; - let closeButton; - if (this.props.onRemove) { - closeButton = ( - - - - ); - } - return ( - - - {avatar} - {this.props.member.name} - - {closeButton} - + + {avatar} + ); } } @@ -163,7 +148,6 @@ interface IDMRoomTileProps { member: Member; lastActiveTs?: number; onToggle(member: Member): void; - highlightWord: string; isSelected: boolean; } @@ -176,54 +160,8 @@ class DMRoomTile extends React.PureComponent { this.props.onToggle(this.props.member); }; - private highlightName(str: string): ReactNode { - if (!this.props.highlightWord) return str; - - // We convert things to lowercase for index searching, but pull substrings from - // the submitted text to preserve case. Note: we don't need to htmlEntities the - // string because React will safely encode the text for us. - const lowerStr = str.toLowerCase(); - const filterStr = this.props.highlightWord.toLowerCase(); - - const result: JSX.Element[] = []; - - let i = 0; - let ii: number; - while ((ii = lowerStr.indexOf(filterStr, i)) >= 0) { - // Push any text we missed (first bit/middle of text) - if (ii > i) { - // Push any text we aren't highlighting (middle of text match, or beginning of text) - result.push({str.substring(i, ii)}); - } - - i = ii; // copy over ii only if we have a match (to preserve i for end-of-text matching) - - // Highlight the word the user entered - const substr = str.substring(i, filterStr.length + i); - result.push( - - {substr} - , - ); - i += substr.length; - } - - // Push any text we missed (end of text) - if (i < str.length) { - result.push({str.substring(i)}); - } - - return result; - } - public render(): React.ReactNode { - let timestamp: JSX.Element | undefined; - if (this.props.lastActiveTs) { - const humanTs = humanizeTime(this.props.lastActiveTs); - timestamp = {humanTs}; - } - - const avatarSize = "36px"; + const avatarSize = "32px"; const avatar = (this.props.member as ThreepidMember).isEmail ? ( ) : ( @@ -241,40 +179,23 @@ class DMRoomTile extends React.PureComponent { /> ); - let checkmark: JSX.Element | undefined; - if (this.props.isSelected) { - // To reduce flickering we put the 'selected' room tile above the real avatar - checkmark =
; - } - - // To reduce flickering we put the checkmark on top of the actual avatar (prevents - // the browser from reloading the image source when the avatar remounts). - const stackedAvatar = ( - - {avatar} - {checkmark} - - ); - const userIdentifier = UserIdentifierCustomisations.getDisplayUserIdentifier(this.props.member.userId, { withDisplayName: true, }); const caption = (this.props.member as ThreepidMember).isEmail ? _t("invite|email_caption") - : this.highlightName(userIdentifier || this.props.member.userId); + : userIdentifier || this.props.member.userId; return ( - - {stackedAvatar} - -
- {this.highlightName(this.props.member.name)} -
-
{caption}
-
- {timestamp} -
+ ); } } @@ -672,13 +593,6 @@ export default class InviteDialog extends React.PureComponent { - // Stop the browser from highlighting text - e.preventDefault(); - e.stopPropagation(); - - if (this.editorRef && this.editorRef.current) { - this.editorRef.current.focus(); - } - }; - private onUseDefaultIdentityServerClick = (e: ButtonEvent): void => { e.preventDefault(); @@ -1048,8 +952,13 @@ export default class InviteDialog extends React.PureComponent -

{sectionName}

-

{_t("common|no_results")}

+ + {_t("common|no_results")} +
); } @@ -1084,49 +993,48 @@ export default class InviteDialog extends React.PureComponent t.userId === r.userId)} /> )); + return (
-

{sectionName}

- {tiles} + + {tiles} + {showMore}
); } private renderEditor(): JSX.Element { - const hasPlaceholder = - this.props.kind == InviteKind.CallTransfer && - this.state.targets.length === 0 && - this.state.filterText.length === 0; const targets = this.state.targets.map((t) => ( )); - const input = ( - 0) - } - autoComplete="off" - placeholder={hasPlaceholder ? _t("action|search") : undefined} - data-testid="invite-dialog-input" - /> - ); + return ( -
+ 0), + "data-testid": "invite-dialog-input", + }} + onRemoveChildren={() => + !this.state.busy && this.removeMember(this.state.targets[this.state.targets.length - 1]) + } + > {targets} - {input} -
+ ); } diff --git a/src/components/views/dialogs/VerificationRequestDialog.tsx b/src/components/views/dialogs/VerificationRequestDialog.tsx index d8cef61036..9414c9107b 100644 --- a/src/components/views/dialogs/VerificationRequestDialog.tsx +++ b/src/components/views/dialogs/VerificationRequestDialog.tsx @@ -7,7 +7,8 @@ Please see LICENSE files in the repository root for full details. */ import React from "react"; -import { type VerificationRequest } from "matrix-js-sdk/src/crypto-api"; +import { VerificationPhase, VerificationRequestEvent, type VerificationRequest } from "matrix-js-sdk/src/crypto-api"; +import { VerificationMethod } from "matrix-js-sdk/src/types"; import { type User } from "matrix-js-sdk/src/matrix"; import { MatrixClientPeg } from "../../../MatrixClientPeg"; @@ -23,7 +24,17 @@ interface IProps { } interface IState { + // The VerificationRequest that is ongoing. This can be replaced if a + // promise was supplied in the props and it completes. verificationRequest?: VerificationRequest; + + // What phase the VerificationRequest is at. This is part of + // verificationRequest but we have it as independent state because we need + // to update when it changes. + // + // We listen to the `Change` event on verificationRequest and update phase + // when that fires. + phase?: VerificationPhase; } export default class VerificationRequestDialog extends React.Component { @@ -31,22 +42,51 @@ export default class VerificationRequestDialog extends React.Component { - this.setState({ verificationRequest: r }); + // The request promise completed, so we have a new request + + // Stop listening to the old request (if we have one, which normally we won't) + this.state.verificationRequest?.off(VerificationRequestEvent.Change, this.onRequestChange); + + // And start listening to the new one + r.on(VerificationRequestEvent.Change, this.onRequestChange); + + this.setState({ verificationRequest: r, phase: r.phase }); }); } + public componentWillUnmount(): void { + // Stop listening for changes to the request when we close + this.state.verificationRequest?.off(VerificationRequestEvent.Change, this.onRequestChange); + } + + /** + * The verificationRequest changed, so we need to make sure we update our + * state to have the correct phase. + * + * Note: this is called when verificationRequest changes in some way, not + * when we replace verificationRequest with some new request. + */ + private readonly onRequestChange = (): void => { + this.setState((prevState) => ({ + phase: prevState.verificationRequest?.phase, + })); + }; + public render(): React.ReactNode { const request = this.state.verificationRequest; const otherUserId = request?.otherUserId; const member = this.props.member || (otherUserId ? MatrixClientPeg.safeGet().getUser(otherUserId) : null); - const title = request?.isSelfVerification - ? _t("encryption|verification|verification_dialog_title_device") - : _t("encryption|verification|verification_dialog_title_user"); + const title = this.dialogTitle(request); if (!member) return null; @@ -60,7 +100,7 @@ export default class VerificationRequestDialog extends React.Component ); } + + private dialogTitle(request?: VerificationRequest): string { + if (request?.isSelfVerification) { + switch (request.phase) { + case VerificationPhase.Ready: + return _t("encryption|verification|verification_dialog_title_choose"); + case VerificationPhase.Done: + return _t("encryption|verification|verification_dialog_title_verified"); + case VerificationPhase.Started: + switch (request.chosenMethod) { + case VerificationMethod.Reciprocate: + return _t("encryption|verification|verification_dialog_title_confirm_green_shield"); + case VerificationMethod.Sas: + return _t("encryption|verification|verification_dialog_title_compare_emojis"); + default: + return _t("encryption|verification|verification_dialog_title_device"); + } + case VerificationPhase.Unsent: + case VerificationPhase.Requested: + return _t("encryption|verification|verification_dialog_title_start_on_other_device"); + case VerificationPhase.Cancelled: + return _t("encryption|verification|verification_dialog_title_failed"); + default: + return _t("encryption|verification|verification_dialog_title_device"); + } + } else { + return _t("encryption|verification|verification_dialog_title_user"); + } + } } diff --git a/src/components/views/dialogs/security/SetupEncryptionDialog.tsx b/src/components/views/dialogs/security/SetupEncryptionDialog.tsx index 2f845b627a..dabea9660d 100644 --- a/src/components/views/dialogs/security/SetupEncryptionDialog.tsx +++ b/src/components/views/dialogs/security/SetupEncryptionDialog.tsx @@ -10,55 +10,19 @@ import React from "react"; import SetupEncryptionBody from "../../../structures/auth/SetupEncryptionBody"; import BaseDialog from "../BaseDialog"; -import { _t } from "../../../../languageHandler"; -import { SetupEncryptionStore, Phase } from "../../../../stores/SetupEncryptionStore"; - -function iconFromPhase(phase?: Phase): string { - if (phase === Phase.Done) { - // eslint-disable-next-line @typescript-eslint/no-require-imports - return require("../../../../../res/img/e2e/verified-deprecated.svg").default; - } else { - // eslint-disable-next-line @typescript-eslint/no-require-imports - return require("../../../../../res/img/e2e/warning-deprecated.svg").default; - } -} interface IProps { onFinished(): void; } -interface IState { - icon: string; -} - -export default class SetupEncryptionDialog extends React.Component { - private store: SetupEncryptionStore; +export default class SetupEncryptionDialog extends React.Component { public constructor(props: IProps) { super(props); - - this.store = SetupEncryptionStore.sharedInstance(); - this.state = { icon: iconFromPhase(this.store.phase) }; } - public componentDidMount(): void { - this.store.on("update", this.onStoreUpdate); - } - - public componentWillUnmount(): void { - this.store.removeListener("update", this.onStoreUpdate); - } - - private onStoreUpdate = (): void => { - this.setState({ icon: iconFromPhase(this.store.phase) }); - }; - public render(): React.ReactNode { return ( - + ); diff --git a/src/components/views/dialogs/spotlight/SpotlightDialog.tsx b/src/components/views/dialogs/spotlight/SpotlightDialog.tsx index 419a12df89..b85c1de29e 100644 --- a/src/components/views/dialogs/spotlight/SpotlightDialog.tsx +++ b/src/components/views/dialogs/spotlight/SpotlightDialog.tsx @@ -53,7 +53,7 @@ import { getKeyBindingsManager } from "../../../../KeyBindingsManager"; import { _t } from "../../../../languageHandler"; import { MatrixClientPeg } from "../../../../MatrixClientPeg"; import { PosthogAnalytics } from "../../../../PosthogAnalytics"; -import { getCachedRoomIDForAlias } from "../../../../RoomAliasCache"; +import { getCachedRoomIdForAlias } from "../../../../RoomAliasCache"; import { showStartChatInviteDialog } from "../../../../RoomInvite"; import { SettingLevel } from "../../../../settings/SettingLevel"; import SettingsStore from "../../../../settings/SettingsStore"; @@ -912,7 +912,7 @@ const SpotlightDialog: React.FC = ({ initialText = "", initialFilter = n if ( trimmedQuery.startsWith("#") && trimmedQuery.includes(":") && - (!getCachedRoomIDForAlias(trimmedQuery) || !cli.getRoom(getCachedRoomIDForAlias(trimmedQuery))) + (!getCachedRoomIdForAlias(trimmedQuery) || !cli.getRoom(getCachedRoomIdForAlias(trimmedQuery)!.roomId)) ) { joinRoomSection = (
diff --git a/src/components/views/elements/AppTile.tsx b/src/components/views/elements/AppTile.tsx index 027f25cc3a..65e393b6e4 100644 --- a/src/components/views/elements/AppTile.tsx +++ b/src/components/views/elements/AppTile.tsx @@ -572,7 +572,7 @@ export default class AppTile extends React.Component { return ( -

{name}

+

{name}

{title ? titleSpacer : ""} {title} diff --git a/src/components/views/elements/Dropdown.tsx b/src/components/views/elements/Dropdown.tsx index 999c07a811..1ab563d43a 100644 --- a/src/components/views/elements/Dropdown.tsx +++ b/src/components/views/elements/Dropdown.tsx @@ -65,6 +65,7 @@ class MenuOption extends React.Component { role="option" aria-selected={this.props.highlighted} ref={this.props.inputRef} + tabIndex={-1} > {this.props.children} @@ -232,18 +233,27 @@ export default class Dropdown extends React.Component { break; case KeyBindingAction.ArrowDown: if (this.state.expanded) { + const nextKey = this.nextOption(this.state.highlightedOption); this.setState({ - highlightedOption: this.nextOption(this.state.highlightedOption), + highlightedOption: nextKey, }); + + ( + this.dropdownRootElement?.querySelector(`#${this.props.id}__${nextKey}`) as HTMLLIElement + )?.focus(); } else { this.setState({ expanded: true }); } break; case KeyBindingAction.ArrowUp: if (this.state.expanded) { + const prevKey = this.prevOption(this.state.highlightedOption); this.setState({ - highlightedOption: this.prevOption(this.state.highlightedOption), + highlightedOption: prevKey, }); + ( + this.dropdownRootElement?.querySelector(`#${this.props.id}__${prevKey}`) as HTMLLIElement + )?.focus(); } else { this.setState({ expanded: true }); } diff --git a/src/components/views/elements/JoinRuleDropdown.tsx b/src/components/views/elements/JoinRuleDropdown.tsx index cded54ffd6..860b87fa00 100644 --- a/src/components/views/elements/JoinRuleDropdown.tsx +++ b/src/components/views/elements/JoinRuleDropdown.tsx @@ -19,7 +19,7 @@ interface IProps { width?: number; labelInvite: string; labelKnock?: string; - labelPublic: string; + labelPublic?: string; labelRestricted?: string; // if omitted then this option will be hidden, e.g if unsupported onChange(value: JoinRule): void; } @@ -38,11 +38,18 @@ const JoinRuleDropdown: React.FC = ({
{labelInvite}
, -
- {labelPublic} -
, ] as NonEmptyArray; + if (labelPublic) { + options.push( + ( +
+ {labelPublic} +
+ ) as ReactElement & { key: string }, + ); + } + if (labelKnock) { options.unshift( ( @@ -72,6 +79,7 @@ const JoinRuleDropdown: React.FC = ({ menuWidth={width} value={value} label={label} + disabled={options.length === 1} > {options} diff --git a/src/components/views/messages/DateSeparator.tsx b/src/components/views/messages/DateSeparator.tsx index a885806cf7..9edb5fb94e 100644 --- a/src/components/views/messages/DateSeparator.tsx +++ b/src/components/views/messages/DateSeparator.tsx @@ -320,7 +320,7 @@ export default class DateSeparator extends React.Component { const label = this.getLabel(); let dateHeaderContent: JSX.Element; - if (this.state.jumpToDateEnabled) { + if (this.state.jumpToDateEnabled && !this.props.forExport) { dateHeaderContent = this.renderJumpToDateMenu(); } else { dateHeaderContent = ( diff --git a/src/components/views/messages/EventContentBody.tsx b/src/components/views/messages/EventContentBody.tsx index fce5428e8c..04c37461ec 100644 --- a/src/components/views/messages/EventContentBody.tsx +++ b/src/components/views/messages/EventContentBody.tsx @@ -151,7 +151,7 @@ interface Props extends ReplacerOptions { const EventContentBody = memo( ({ as, mxEvent, stripReply, content, linkify, highlights, includeDir = true, ref, ...options }: Props) => { const enableBigEmoji = useSettingValue("TextualBody.enableBigEmoji"); - const [mediaIsVisible] = useMediaVisible(mxEvent?.getId(), mxEvent?.getRoomId()); + const [mediaIsVisible] = useMediaVisible(mxEvent); const replacer = useReplacer(content, mxEvent, options); const linkifyOptions = useMemo( diff --git a/src/components/views/messages/HideActionButton.tsx b/src/components/views/messages/HideActionButton.tsx index 0c9817b2a6..ba0c8568f1 100644 --- a/src/components/views/messages/HideActionButton.tsx +++ b/src/components/views/messages/HideActionButton.tsx @@ -25,7 +25,7 @@ interface IProps { * Quick action button for marking a media event as hidden. */ export const HideActionButton: React.FC = ({ mxEvent }) => { - const [mediaIsVisible, setVisible] = useMediaVisible(mxEvent.getId(), mxEvent.getRoomId()); + const [mediaIsVisible, setVisible] = useMediaVisible(mxEvent); if (!mediaIsVisible) { return; diff --git a/src/components/views/messages/IBodyProps.ts b/src/components/views/messages/IBodyProps.ts index 37aae37de6..a85f86644d 100644 --- a/src/components/views/messages/IBodyProps.ts +++ b/src/components/views/messages/IBodyProps.ts @@ -48,4 +48,9 @@ export interface IBodyProps { // Set to `true` to disable interactions (e.g. video controls) and to remove controls from the tab order. // This may be useful when displaying a preview of the event. inhibitInteraction?: boolean; + + /** + * Optional ID for the root element. + */ + id?: string; } diff --git a/src/components/views/messages/MAudioBody.tsx b/src/components/views/messages/MAudioBody.tsx index 56c162b0d0..8cbf7b3aa8 100644 --- a/src/components/views/messages/MAudioBody.tsx +++ b/src/components/views/messages/MAudioBody.tsx @@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import React from "react"; +import React, { type JSX, useEffect, useMemo } from "react"; import { logger } from "matrix-js-sdk/src/logger"; import { type IContent } from "matrix-js-sdk/src/matrix"; import { type MediaEventContent } from "matrix-js-sdk/src/types"; @@ -17,8 +17,6 @@ import { _t } from "../../../languageHandler"; import MFileBody from "./MFileBody"; import { type IBodyProps } from "./IBodyProps"; import { PlaybackManager } from "../../../audio/PlaybackManager"; -import { isVoiceMessage } from "../../../utils/EventUtils"; -import { PlaybackQueue } from "../../../audio/PlaybackQueue"; import RoomContext, { TimelineRenderingType } from "../../../contexts/RoomContext"; import MediaProcessingError from "./shared/MediaProcessingError"; import { AudioPlayerViewModel } from "../../../viewmodels/audio/AudioPlayerViewModel"; @@ -27,7 +25,6 @@ import { AudioPlayerView } from "../../../shared-components/audio/AudioPlayerVie interface IState { error?: boolean; playback?: Playback; - audioPlayerVm?: AudioPlayerViewModel; } export default class MAudioBody extends React.PureComponent { @@ -38,7 +35,6 @@ export default class MAudioBody extends React.PureComponent public async componentDidMount(): Promise { let buffer: ArrayBuffer; - try { try { const blob = await this.props.mediaEventHelper!.sourceBlob.value; @@ -63,15 +59,14 @@ export default class MAudioBody extends React.PureComponent // We should have a buffer to work with now: let's set it up const playback = PlaybackManager.instance.createPlaybackInstance(buffer, waveform); playback.clockInfo.populatePlaceholdersFrom(this.props.mxEvent); - this.setState({ playback, audioPlayerVm: new AudioPlayerViewModel({ playback, mediaName: content.body }) }); + this.setState({ playback }); - if (isVoiceMessage(this.props.mxEvent)) { - PlaybackQueue.forRoom(this.props.mxEvent.getRoomId()!).unsortedEnqueue(this.props.mxEvent, playback); - } - - // Note: the components later on will handle preparing the Playback class for us. + this.onMount(playback); + // Note: the components later on will handle preparing the Playback class for us } + protected onMount(playback: Playback): void {} + public componentWillUnmount(): void { this.state.playback?.destroy(); this.state.audioPlayerVm?.dispose(); @@ -116,9 +111,35 @@ export default class MAudioBody extends React.PureComponent // At this point we should have a playable state return ( - {this.state.audioPlayerVm && } + {this.showFileBody && } ); } } + +interface AudioPlayerProps { + /** + * The playback instance to control audio playback. + */ + playback: Playback; + /** + * The name of the media being played + */ + mediaName: string; +} + +/** + * AudioPlayer component that initializes the AudioPlayerViewModel and renders the AudioPlayerView. + */ +function AudioPlayer({ playback, mediaName }: AudioPlayerProps): JSX.Element { + const vm = useMemo(() => new AudioPlayerViewModel({ playback, mediaName }), [playback, mediaName]); + + useEffect(() => { + return () => { + vm.dispose(); + }; + }, [vm]); + + return ; +} diff --git a/src/components/views/messages/MImageBody.tsx b/src/components/views/messages/MImageBody.tsx index 79f840ce39..c113c36c41 100644 --- a/src/components/views/messages/MImageBody.tsx +++ b/src/components/views/messages/MImageBody.tsx @@ -686,7 +686,7 @@ export class MImageBodyInner extends React.Component { // Wrap MImageBody component so we can use a hook here. const MImageBody: React.FC = (props) => { - const [mediaVisible, setVisible] = useMediaVisible(props.mxEvent.getId(), props.mxEvent.getRoomId()); + const [mediaVisible, setVisible] = useMediaVisible(props.mxEvent); return ; }; diff --git a/src/components/views/messages/MImageReplyBody.tsx b/src/components/views/messages/MImageReplyBody.tsx index b73f8f77c3..5f04df724d 100644 --- a/src/components/views/messages/MImageReplyBody.tsx +++ b/src/components/views/messages/MImageReplyBody.tsx @@ -38,7 +38,7 @@ class MImageReplyBodyInner extends MImageBodyInner { } } const MImageReplyBody: React.FC = (props) => { - const [mediaVisible, setVisible] = useMediaVisible(props.mxEvent.getId(), props.mxEvent.getRoomId()); + const [mediaVisible, setVisible] = useMediaVisible(props.mxEvent); return ; }; diff --git a/src/components/views/messages/MStickerBody.tsx b/src/components/views/messages/MStickerBody.tsx index 3a922d35aa..f0beea72aa 100644 --- a/src/components/views/messages/MStickerBody.tsx +++ b/src/components/views/messages/MStickerBody.tsx @@ -20,7 +20,7 @@ class MStickerBodyInner extends MImageBodyInner { protected onClick = (ev: React.MouseEvent): void => { ev.preventDefault(); if (!this.props.mediaVisible) { - this.props.setMediaVisible?.(true); + this.props.setMediaVisible(true); } }; @@ -79,7 +79,7 @@ class MStickerBodyInner extends MImageBodyInner { } const MStickerBody: React.FC = (props) => { - const [mediaVisible, setVisible] = useMediaVisible(props.mxEvent.getId(), props.mxEvent.getRoomId()); + const [mediaVisible, setVisible] = useMediaVisible(props.mxEvent); return ; }; diff --git a/src/components/views/messages/MVideoBody.tsx b/src/components/views/messages/MVideoBody.tsx index 6a36dae6a8..680704d6fd 100644 --- a/src/components/views/messages/MVideoBody.tsx +++ b/src/components/views/messages/MVideoBody.tsx @@ -342,7 +342,7 @@ class MVideoBodyInner extends React.PureComponent { // Wrap MVideoBody component so we can use a hook here. const MVideoBody: React.FC = (props) => { - const [mediaVisible, setVisible] = useMediaVisible(props.mxEvent.getId(), props.mxEvent.getRoomId()); + const [mediaVisible, setVisible] = useMediaVisible(props.mxEvent); return ; }; diff --git a/src/components/views/messages/MVoiceMessageBody.tsx b/src/components/views/messages/MVoiceMessageBody.tsx index cc0e030c78..0f07c11576 100644 --- a/src/components/views/messages/MVoiceMessageBody.tsx +++ b/src/components/views/messages/MVoiceMessageBody.tsx @@ -14,8 +14,17 @@ import RecordingPlayback from "../audio_messages/RecordingPlayback"; import MAudioBody from "./MAudioBody"; import MFileBody from "./MFileBody"; import MediaProcessingError from "./shared/MediaProcessingError"; +import { isVoiceMessage } from "../../../utils/EventUtils"; +import { PlaybackQueue } from "../../../audio/PlaybackQueue"; +import { type Playback } from "../../../audio/Playback"; export default class MVoiceMessageBody extends MAudioBody { + protected onMount(playback: Playback): void { + if (isVoiceMessage(this.props.mxEvent)) { + PlaybackQueue.forRoom(this.props.mxEvent.getRoomId()!).unsortedEnqueue(this.props.mxEvent, playback); + } + } + // A voice message is an audio file but rendered in a special way. public render(): React.ReactNode { if (this.state.error) { diff --git a/src/components/views/messages/MessageEvent.tsx b/src/components/views/messages/MessageEvent.tsx index 231fa7f1fe..fc800b72b0 100644 --- a/src/components/views/messages/MessageEvent.tsx +++ b/src/components/views/messages/MessageEvent.tsx @@ -51,6 +51,11 @@ interface IProps extends Omit implements IMe getRelationsForEvent: this.props.getRelationsForEvent, isSeeingThroughMessageHiddenForModeration: this.props.isSeeingThroughMessageHiddenForModeration, inhibitInteraction: this.props.inhibitInteraction, + id: this.props.id, }; if (hasCaption) { return ; diff --git a/src/components/views/messages/PinnedMessageBadge.tsx b/src/components/views/messages/PinnedMessageBadge.tsx index 2652d84ed8..373e577f63 100644 --- a/src/components/views/messages/PinnedMessageBadge.tsx +++ b/src/components/views/messages/PinnedMessageBadge.tsx @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -import React, { type JSX } from "react"; +import React, { type HTMLProps, type JSX } from "react"; import PinIcon from "@vector-im/compound-design-tokens/assets/web/icons/pin-solid"; import { _t } from "../../../languageHandler"; @@ -13,9 +13,9 @@ import { _t } from "../../../languageHandler"; /** * A badge to indicate that a message is pinned. */ -export function PinnedMessageBadge(): JSX.Element { +export function PinnedMessageBadge(props: Readonly>): JSX.Element { return ( -
+
{_t("room|pinned_message_badge")}
diff --git a/src/components/views/messages/TextualBody.tsx b/src/components/views/messages/TextualBody.tsx index d0107b31ec..34d6e9be94 100644 --- a/src/components/views/messages/TextualBody.tsx +++ b/src/components/views/messages/TextualBody.tsx @@ -384,7 +384,12 @@ export default class TextualBody extends React.Component { if (isEmote) { return ( -
+
{mxEvent.sender ? mxEvent.sender.name : mxEvent.getSender()} @@ -397,7 +402,7 @@ export default class TextualBody extends React.Component { } if (isNotice) { return ( -
+
{body} {widgets}
@@ -405,14 +410,14 @@ export default class TextualBody extends React.Component { } if (isCaption) { return ( -
+
{body} {widgets}
); } return ( -
+
{body} {widgets}
diff --git a/src/components/views/right_panel/EncryptionInfo.tsx b/src/components/views/right_panel/EncryptionInfo.tsx index f7e4c00c50..b1936cc8aa 100644 --- a/src/components/views/right_panel/EncryptionInfo.tsx +++ b/src/components/views/right_panel/EncryptionInfo.tsx @@ -43,7 +43,7 @@ const EncryptionInfo: React.FC = ({ }: IProps) => { let content: JSX.Element; if (waitingForOtherParty && isSelfVerification) { - content =
{_t("encryption|verification|self_verification_hint")}
; + content =
{_t("encryption|verification|once_accepted_can_continue")}
; } else if (waitingForOtherParty || waitingForNetwork) { let text: string; if (waitingForOtherParty) { diff --git a/src/components/views/right_panel/RoomSummaryCardView.tsx b/src/components/views/right_panel/RoomSummaryCardView.tsx index f0cd8f2967..9aa4914475 100644 --- a/src/components/views/right_panel/RoomSummaryCardView.tsx +++ b/src/components/views/right_panel/RoomSummaryCardView.tsx @@ -49,7 +49,6 @@ import RoomName from "../elements/RoomName.tsx"; import { Flex } from "../../../shared-components/utils/Flex"; import { Linkify, topicToHtml } from "../../../HtmlUtils.tsx"; import { Box } from "../../../shared-components/utils/Box"; -import { ReleaseAnnouncement } from "../../structures/ReleaseAnnouncement.tsx"; import { useRoomSummaryCardViewModel } from "../../viewmodels/right_panel/RoomSummaryCardViewModel.tsx"; import { useRoomTopicViewModel } from "../../viewmodels/right_panel/RoomSummaryCardTopicViewModel.tsx"; @@ -251,25 +250,15 @@ const RoomSummaryCardView: React.FC = ({ {!vm.isVideoRoom && ( <> - -
- - - {vm.pinCount} - - -
-
+ + {vm.pinCount} + +
- {_t("encryption|verification|qr_or_sas_header")} + {_t("encryption|verification|verify_by_completing_one_of")}
{qrBlockDialog} {or} @@ -224,7 +224,7 @@ export default class VerificationPanel extends React.PureComponent{description}

- - {_t("action|no")} - - {_t("action|yes")} + {_t("encryption|verification|qr_reciprocate_yes")} + + + {_t("encryption|verification|qr_reciprocate_no")}
@@ -260,12 +259,7 @@ export default class VerificationPanel extends React.PureComponent ); } - return ( -
-

{_t("encryption|verification|scan_qr")}

- {body} -
- ); + return
{body}
; } private renderVerifiedPhase(): JSX.Element { @@ -282,18 +276,7 @@ export default class VerificationPanel extends React.PureComponent -

{_t("common|verification_cancelled")}

-

{text}

+

{_t("encryption|verification|cancelled_verification")}

{_t("action|got_it")} diff --git a/src/components/views/right_panel/WidgetCard.tsx b/src/components/views/right_panel/WidgetCard.tsx index bc6b778e26..29a713fdd4 100644 --- a/src/components/views/right_panel/WidgetCard.tsx +++ b/src/components/views/right_panel/WidgetCard.tsx @@ -64,7 +64,7 @@ const WidgetCard: React.FC = ({ room, widgetId, onClose }) => { const header = (
- + {WidgetUtils.getWidgetName(app)} ? undefined : (this.state.avatarFile ?? this.state.originalAvatarUrl ?? undefined) } - avatarAltText={_t("room_settings|general|avatar_field_label")} + avatarAccessibleName={_t("room_settings|general|avatar_field_label")} disabled={!this.state.canSetAvatar} onChange={this.onAvatarChanged} removeAvatar={canRemove ? this.removeAvatar : undefined} diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx index 1379560d55..a7fd7527f6 100644 --- a/src/components/views/rooms/EventTile.tsx +++ b/src/components/views/rooms/EventTile.tsx @@ -34,6 +34,7 @@ import { type UserVerificationStatus, } from "matrix-js-sdk/src/crypto-api"; import { Tooltip } from "@vector-im/compound-web"; +import { uniqueId } from "lodash"; import ReplyChain from "../elements/ReplyChain"; import { _t } from "../../../languageHandler"; @@ -918,6 +919,8 @@ export class UnwrappedEventTile extends React.Component public render(): ReactNode { const msgtype = this.props.mxEvent.getContent().msgtype; const eventType = this.props.mxEvent.getType(); + const id = uniqueId(); + const { hasRenderer, isBubbleMessage, @@ -1142,7 +1145,7 @@ export class UnwrappedEventTile extends React.Component let pinnedMessageBadge: JSX.Element | undefined; if (PinningUtils.isPinned(MatrixClientPeg.safeGet(), this.props.mxEvent)) { - pinnedMessageBadge = ; + pinnedMessageBadge = ; } let reactionsRow: JSX.Element | undefined; @@ -1237,7 +1240,7 @@ export class UnwrappedEventTile extends React.Component {avatar} {sender}
, -
+
{this.renderContextMenu()} {replyChain} {renderTile(TimelineRenderingType.Thread, { @@ -1425,7 +1428,7 @@ export class UnwrappedEventTile extends React.Component {sender} {ircPadlock} {avatar} -
+
{this.renderContextMenu()} {groupTimestamp} {groupPadlock} diff --git a/src/components/views/rooms/LinkPreviewGroup.tsx b/src/components/views/rooms/LinkPreviewGroup.tsx index 69c98cb6c9..471220bfeb 100644 --- a/src/components/views/rooms/LinkPreviewGroup.tsx +++ b/src/components/views/rooms/LinkPreviewGroup.tsx @@ -30,7 +30,7 @@ interface IProps { const LinkPreviewGroup: React.FC = ({ links, mxEvent, onCancelClick }) => { const cli = useContext(MatrixClientContext); const [expanded, toggleExpanded] = useStateToggle(); - const [mediaVisible] = useMediaVisible(mxEvent.getId(), mxEvent.getRoomId()); + const [mediaVisible] = useMediaVisible(mxEvent); const ts = mxEvent.getTs(); const previews = useAsyncMemo<[string, IPreviewUrlResponse][]>( diff --git a/src/components/views/rooms/MessageComposer.tsx b/src/components/views/rooms/MessageComposer.tsx index 587a4d778d..d4e617a1f4 100644 --- a/src/components/views/rooms/MessageComposer.tsx +++ b/src/components/views/rooms/MessageComposer.tsx @@ -531,12 +531,15 @@ export class MessageComposer extends React.Component { if (!this.props.e2eStatus) { leftIcon = (
- + + +
); } else if (this.props.e2eStatus !== E2EStatus.Normal) { diff --git a/src/components/views/rooms/NewRoomIntro.tsx b/src/components/views/rooms/NewRoomIntro.tsx index f12b03e288..67daec115d 100644 --- a/src/components/views/rooms/NewRoomIntro.tsx +++ b/src/components/views/rooms/NewRoomIntro.tsx @@ -30,6 +30,8 @@ import { privateShouldBeEncrypted } from "../../../utils/rooms"; import { LocalRoom } from "../../../models/LocalRoom"; import { shouldEncryptRoomWithSingle3rdPartyInvite } from "../../../utils/room/shouldEncryptRoomWithSingle3rdPartyInvite"; import { useScopedRoomContext } from "../../../contexts/ScopedRoomContext.tsx"; +import { useTopic } from "../../../hooks/room/useTopic"; +import { topicToHtml, Linkify } from "../../../HtmlUtils"; function hasExpectedEncryptionSettings(matrixClient: MatrixClient, room: Room): boolean { const isEncrypted: boolean = matrixClient.isRoomEncrypted(room.roomId); @@ -52,6 +54,7 @@ const determineIntroMessage = (room: Room, encryptedSingle3rdPartyInvite: boolea const NewRoomIntro: React.FC = () => { const cli = useContext(MatrixClientContext); const { room, roomId } = useScopedRoomContext("room", "roomId"); + const topic = useTopic(room); if (!room || !roomId) { throw new Error("Unable to create a NewRoomIntro without room and roomId"); @@ -106,7 +109,6 @@ const NewRoomIntro: React.FC = () => { ); } else { const inRoom = room && room.getMyMembership() === KnownMembership.Join; - const topic = room.currentState.getStateEvents(EventType.RoomTopic, "")?.getContent()?.topic; const canAddTopic = inRoom && room.currentState.maySendStateEvent(EventType.RoomTopic, cli.getSafeUserId()); const onTopicClick = (): void => { @@ -126,18 +128,23 @@ const NewRoomIntro: React.FC = () => { let topicText; if (canAddTopic && topic) { topicText = _t( - "room|intro|topic_edit", - { topic }, + "room|intro|edit_topic", + {}, { a: (sub) => ( {sub} ), + topic: () => {topicToHtml(topic?.text, topic?.html)}, }, ); } else if (topic) { - topicText = _t("room|intro|topic", { topic }); + topicText = _t( + "room|intro|display_topic", + {}, + { topic: () => {topicToHtml(topic?.text, topic?.html)} }, + ); } else if (canAddTopic) { topicText = _t( "room|intro|no_topic", @@ -245,7 +252,7 @@ const NewRoomIntro: React.FC = () => { }, )}

-

{topicText}

+

{topicText}

{buttons} ); diff --git a/src/components/views/rooms/PinnedEventTile.tsx b/src/components/views/rooms/PinnedEventTile.tsx index afb612c397..8324d357c5 100644 --- a/src/components/views/rooms/PinnedEventTile.tsx +++ b/src/components/views/rooms/PinnedEventTile.tsx @@ -7,7 +7,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import React, { type JSX, useCallback, useState } from "react"; +import React, { type JSX, useCallback, useId, useState } from "react"; import { EventTimeline, EventType, type MatrixEvent, type Room } from "matrix-js-sdk/src/matrix"; import { IconButton, Menu, MenuItem, Separator, Tooltip } from "@vector-im/compound-web"; import ViewIcon from "@vector-im/compound-design-tokens/assets/web/icons/visibility-on"; @@ -67,6 +67,7 @@ export function PinnedEventTile({ event, room, permalinkCreator }: PinnedEventTi const isInThread = Boolean(event.threadRootId); const displayThreadInfo = !event.isThreadRoot && isInThread; + const id = useId(); return (
@@ -85,9 +86,10 @@ export function PinnedEventTile({ event, room, permalinkCreator }: PinnedEventTi {event.sender?.name || sender} - +
+ } diff --git a/src/components/views/rooms/PinnedMessageBanner.tsx b/src/components/views/rooms/PinnedMessageBanner.tsx index 2b9f335c7f..200b35a73d 100644 --- a/src/components/views/rooms/PinnedMessageBanner.tsx +++ b/src/components/views/rooms/PinnedMessageBanner.tsx @@ -6,7 +6,7 @@ * Please see LICENSE files in the repository root for full details. */ -import React, { type JSX, useEffect, useRef, useState } from "react"; +import React, { type JSX, useEffect, useId, useRef, useState } from "react"; import PinIcon from "@vector-im/compound-design-tokens/assets/web/icons/pin-solid"; import { Button } from "@vector-im/compound-web"; import { type MatrixEvent, type Room } from "matrix-js-sdk/src/matrix"; @@ -64,9 +64,13 @@ export function PinnedMessageBanner({ setCurrentEventIndex(() => eventCount - 1); }, [eventCount]); + const isLastMessage = currentEventIndex === eventCount - 1; + const pinnedEvent = pinnedEvents[currentEventIndex]; useNotifyTimeline(pinnedEvent, resizeNotifier); + const id = useId(); + if (!pinnedEvent) return null; const shouldUseMessageEvent = pinnedEvent.isRedacted() || pinnedEvent.isDecryptionFailure(); @@ -90,18 +94,24 @@ export function PinnedMessageBanner({ return (
diff --git a/src/components/views/rooms/RoomListPanel/RoomList.tsx b/src/components/views/rooms/RoomListPanel/RoomList.tsx index e35118c146..cf72ef4392 100644 --- a/src/components/views/rooms/RoomListPanel/RoomList.tsx +++ b/src/components/views/rooms/RoomListPanel/RoomList.tsx @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -import React, { useCallback, useRef, type JSX } from "react"; +import React, { useCallback, useRef, useState, type JSX } from "react"; import { type Room } from "matrix-js-sdk/src/matrix"; import { type ScrollIntoViewLocation } from "react-virtuoso"; import { isEqual } from "lodash"; @@ -33,6 +33,7 @@ export function RoomList({ vm: { roomsResult, activeIndex } }: RoomListProps): J const lastSpaceId = useRef(undefined); const lastFilterKeys = useRef(undefined); const roomCount = roomsResult.rooms.length; + const [isScrolling, setIsScrolling] = useState(false); const getItemComponent = useCallback( ( index: number, @@ -57,10 +58,11 @@ export function RoomList({ vm: { roomsResult, activeIndex } }: RoomListProps): J roomIndex={index} roomCount={roomCount} onFocus={onFocus} + listIsScrolling={isScrolling} /> ); }, - [activeIndex, roomCount], + [activeIndex, roomCount, isScrolling], ); const getItemKey = useCallback((item: Room): string => { @@ -116,6 +118,7 @@ export function RoomList({ vm: { roomsResult, activeIndex } }: RoomListProps): J getItemKey={getItemKey} isItemFocusable={() => true} onKeyDown={keyDownCallback} + isScrolling={setIsScrolling} /> ); } diff --git a/src/components/views/rooms/RoomListPanel/RoomListHeaderView.tsx b/src/components/views/rooms/RoomListPanel/RoomListHeaderView.tsx index 86189cae4f..02e565b6f9 100644 --- a/src/components/views/rooms/RoomListPanel/RoomListHeaderView.tsx +++ b/src/components/views/rooms/RoomListPanel/RoomListHeaderView.tsx @@ -23,6 +23,7 @@ import { useRoomListHeaderViewModel, } from "../../../viewmodels/roomlist/RoomListHeaderViewModel"; import { RoomListOptionsMenu } from "./RoomListOptionsMenu"; +import { ReleaseAnnouncement } from "../../../structures/ReleaseAnnouncement"; /** * The header view for the room list @@ -45,15 +46,38 @@ export function RoomListHeaderView(): JSX.Element { {vm.displaySpaceMenu && } - + +
+ +
+
+ {/* If we don't display the compose menu, it means that the user can only send DM */} - {vm.displayComposeMenu ? ( - - ) : ( - vm.createChatRoom(e.nativeEvent)}> - - - )} + +
+ {vm.displayComposeMenu ? ( + + ) : ( + vm.createChatRoom(e.nativeEvent)} + > + + + )} +
+
); diff --git a/src/components/views/rooms/RoomListPanel/RoomListItemView.tsx b/src/components/views/rooms/RoomListPanel/RoomListItemView.tsx index 81e63e6f6f..500fbe953f 100644 --- a/src/components/views/rooms/RoomListPanel/RoomListItemView.tsx +++ b/src/components/views/rooms/RoomListPanel/RoomListItemView.tsx @@ -41,6 +41,10 @@ interface RoomListItemViewProps extends React.HTMLAttributes * The total number of rooms in the list */ roomCount: number; + /** + * Whether the list is currently scrolling + */ + listIsScrolling: boolean; } /** @@ -53,6 +57,7 @@ export const RoomListItemView = memo(function RoomListItemView({ onFocus, roomIndex: index, roomCount: count, + listIsScrolling, ...props }: RoomListItemViewProps): JSX.Element { const ref = useRef(null); @@ -141,7 +146,11 @@ export const RoomListItemView = memo(function RoomListItemView({ ); - if (!vm.showContextMenu) return content; + // Rendering multiple context menus can causes crashes in radix upstream, + // See https://github.com/radix-ui/primitives/issues/2717. + // We also don't need the context menu while scrolling so can improve scroll performance + // by not rendering it. + if (!vm.showContextMenu || listIsScrolling) return content; return ( = ({ activeSpace }) => { const displayRoomSearch = shouldShowComponent(UIComponent.FilterContainer); + const [focusedElement, setFocusedElement] = useState(null); + + const onFocus = useCallback((ev: React.FocusEvent): void => { + setFocusedElement(ev.target as Element); + }, []); + + const onBlur = useCallback((): void => { + setFocusedElement(null); + }, []); + + const onKeyDown = useCallback( + (ev: React.KeyboardEvent, state?: IRovingTabIndexState): void => { + if (!focusedElement) return; + const navAction = getKeyBindingsManager().getNavigationAction(ev); + if (navAction === KeyBindingAction.PreviousLandmark || navAction === KeyBindingAction.NextLandmark) { + ev.stopPropagation(); + ev.preventDefault(); + LandmarkNavigation.findAndFocusNextLandmark( + Landmark.ROOM_SEARCH, + navAction === KeyBindingAction.PreviousLandmark, + ); + } + }, + [focusedElement], + ); return ( = ({ activeSpace }) => direction="column" align="stretch" aria-label={_t("room_list|list_title")} + onFocus={onFocus} + onBlur={onBlur} + onKeyDown={onKeyDown} > {displayRoomSearch && } diff --git a/src/components/views/rooms/RoomListPanel/RoomListPrimaryFilters.tsx b/src/components/views/rooms/RoomListPanel/RoomListPrimaryFilters.tsx index d094d9682f..86dea71d02 100644 --- a/src/components/views/rooms/RoomListPanel/RoomListPrimaryFilters.tsx +++ b/src/components/views/rooms/RoomListPanel/RoomListPrimaryFilters.tsx @@ -36,6 +36,7 @@ export function RoomListPrimaryFilters({ vm }: RoomListPrimaryFiltersProps): JSX data-testid="primary-filters" gap="var(--cpd-space-3x)" direction="row-reverse" + justify="space-between" > {displayChevron && ( {filters.map((filter, i) => ( -
  • - filter.toggle()}> - {filter.name} - -
  • + filter.toggle()}> + {filter.name} + ))}
    @@ -104,7 +104,7 @@ function useCollapseFilters( // If the previous element is on the left element of the current one, it means that the filter is wrapping const previousSibling = child.previousElementSibling as HTMLElement | null; - if (previousSibling && child.offsetLeft < previousSibling.offsetLeft) { + if (previousSibling && child.offsetLeft <= previousSibling.offsetLeft) { if (!isWrapping) setWrappingIndex(i); isWrapping = true; } diff --git a/src/components/views/rooms/RoomListPanel/RoomListView.tsx b/src/components/views/rooms/RoomListPanel/RoomListView.tsx index a99312be53..a0c9184211 100644 --- a/src/components/views/rooms/RoomListPanel/RoomListView.tsx +++ b/src/components/views/rooms/RoomListPanel/RoomListView.tsx @@ -11,6 +11,8 @@ import { useRoomListViewModel } from "../../../viewmodels/roomlist/RoomListViewM import { RoomList } from "./RoomList"; import { EmptyRoomList } from "./EmptyRoomList"; import { RoomListPrimaryFilters } from "./RoomListPrimaryFilters"; +import { _t } from "../../../../languageHandler"; +import { ReleaseAnnouncement } from "../../../structures/ReleaseAnnouncement"; /** * Host the room list and the (future) room filters @@ -28,7 +30,17 @@ export function RoomListView(): JSX.Element { } return ( <> - + +
    + +
    +
    {listBody} ); diff --git a/src/components/views/rooms/wysiwyg_composer/components/FormattingButtons.tsx b/src/components/views/rooms/wysiwyg_composer/components/FormattingButtons.tsx index 27301110f3..15d6405d87 100644 --- a/src/components/views/rooms/wysiwyg_composer/components/FormattingButtons.tsx +++ b/src/components/views/rooms/wysiwyg_composer/components/FormattingButtons.tsx @@ -43,6 +43,7 @@ function Button({ label, keyCombo, onClick, actionState, icon }: ButtonProps): J element="button" onClick={onClick as (e: ButtonEvent) => void} aria-label={label} + disabled={actionState === "disabled"} className={classNames("mx_FormattingButtons_Button", { mx_FormattingButtons_active: actionState === "reversed", mx_FormattingButtons_Button_hover: actionState === "enabled", @@ -64,55 +65,59 @@ function Button({ label, keyCombo, onClick, actionState, icon }: ButtonProps): J interface FormattingButtonsProps { composer: FormattingFunctions; actionStates: AllActionStates; + /** + * Whether all buttons should be disabled + */ + disabled?: boolean; } -export function FormattingButtons({ composer, actionStates }: FormattingButtonsProps): JSX.Element { +export function FormattingButtons({ composer, actionStates, disabled }: FormattingButtonsProps): JSX.Element { const composerContext = useComposerContext(); const isInList = actionStates.unorderedList === "reversed" || actionStates.orderedList === "reversed"; return (
    + diff --git a/src/components/views/settings/encryption/KeyStoragePanel.tsx b/src/components/views/settings/encryption/KeyStoragePanel.tsx index 0de55942a7..4443232495 100644 --- a/src/components/views/settings/encryption/KeyStoragePanel.tsx +++ b/src/components/views/settings/encryption/KeyStoragePanel.tsx @@ -13,6 +13,7 @@ import { SettingsSection } from "../shared/SettingsSection"; import { _t } from "../../../../languageHandler"; import { SettingsHeader } from "../SettingsHeader"; import { useKeyStoragePanelViewModel } from "../../../viewmodels/settings/encryption/KeyStoragePanelViewModel"; +import SdkConfig from "../../../../SdkConfig"; interface Props { /** @@ -55,7 +56,7 @@ export const KeyStoragePanel: React.FC = ({ onKeyStorageDisableClick }) = } subHeading={_t("settings|encryption|key_storage|description", undefined, { a: (sub) => ( - + {sub} ), diff --git a/src/components/views/settings/encryption/ResetIdentityBody.tsx b/src/components/views/settings/encryption/ResetIdentityBody.tsx index a6b0b2c12e..91b7d65b5d 100644 --- a/src/components/views/settings/encryption/ResetIdentityBody.tsx +++ b/src/components/views/settings/encryption/ResetIdentityBody.tsx @@ -48,8 +48,12 @@ interface ResetIdentityBodyProps { * "forgot" is shown when the user chose 'Forgot recovery key?' during `SetupEncryptionToast`. * * "confirm" is shown when the user chose 'Reset all' during `SetupEncryptionBody`. + * + * "no_verification_method" is shown when the device is unverified and has no way of + * obtaining the existing keys, and hence the identity needs to be reset to have + * a cross-signed device. */ -export type ResetIdentityBodyVariant = "compromised" | "forgot" | "sync_failed" | "confirm"; +export type ResetIdentityBodyVariant = "compromised" | "forgot" | "sync_failed" | "confirm" | "no_verification_method"; /** * User interface component allowing the user to reset their cryptographic identity. @@ -124,5 +128,7 @@ function titleForVariant(variant: ResetIdentityBodyVariant): string { return _t("settings|encryption|advanced|breadcrumb_title_sync_failed"); case "forgot": return _t("settings|encryption|advanced|breadcrumb_title_forgot"); + case "no_verification_method": + return _t("settings|encryption|advanced|breadcrumb_title_cant_confirm"); } } diff --git a/src/components/views/settings/notifications/NotificationSettings2.tsx b/src/components/views/settings/notifications/NotificationSettings2.tsx index 405d789257..ae5aa46d31 100644 --- a/src/components/views/settings/notifications/NotificationSettings2.tsx +++ b/src/components/views/settings/notifications/NotificationSettings2.tsx @@ -34,6 +34,7 @@ import { SettingsSection } from "../shared/SettingsSection"; import { SettingsSubsection } from "../shared/SettingsSubsection"; import { NotificationPusherSettings } from "./NotificationPusherSettings"; import SettingsFlag from "../../elements/SettingsFlag"; +import { SettingsSubsectionHeading } from "../shared/SettingsSubsectionHeading"; enum NotificationDefaultLevels { AllMessages = "all_messages", @@ -151,7 +152,12 @@ export default function NotificationSettings2(): JSX.Element { />
    + } description={_t("settings|notifications|default_setting_description")} > + } description={_t("settings|notifications|play_sound_for_description")} > - + } + > + } description={_t( "settings|notifications|keywords", {}, diff --git a/src/components/views/settings/shared/SettingsSubsectionHeading.tsx b/src/components/views/settings/shared/SettingsSubsectionHeading.tsx index 63fb79c637..1be143504c 100644 --- a/src/components/views/settings/shared/SettingsSubsectionHeading.tsx +++ b/src/components/views/settings/shared/SettingsSubsectionHeading.tsx @@ -12,13 +12,19 @@ import Heading from "../../typography/Heading"; export interface SettingsSubsectionHeadingProps extends HTMLAttributes { heading: string; + as?: React.ComponentProps["as"]; children?: React.ReactNode; } -export const SettingsSubsectionHeading: React.FC = ({ heading, children, ...rest }) => { +export const SettingsSubsectionHeading: React.FC = ({ + heading, + as = "h3", + children, + ...rest +}) => { return (
    - + {heading} {children} diff --git a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx index 89ae96f8a4..37faaea5d8 100644 --- a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx +++ b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx @@ -251,19 +251,28 @@ export default class SecurityRoomSettingsTab extends React.Component - - {_t("room_settings|security|public_without_alias_warning")} -
    - ); - } - const description = _t("room_settings|security|join_rule_description", { - roomName: room.name, - }); + const isPublic = room.getJoinRule() === JoinRule.Public; + const description = ( + <> +

    + {_t("room_settings|security|join_rule_description", { + roomName: room.name, + })} +

    + {isPublic && this.state.history === HistoryVisibility.WorldReadable && ( +
    + + {_t("room_settings|security|join_rule_world_readable_description")} +
    + )} + {isPublic && !this.state.hasAliases && ( +
    + + {_t("room_settings|security|public_without_alias_warning")} +
    + )} + + ); let advanced: JSX.Element | undefined; if (room.getJoinRule() === JoinRule.Public) { @@ -290,7 +299,6 @@ export default class SecurityRoomSettingsTab extends React.Component {advanced} @@ -342,6 +350,57 @@ export default class SecurityRoomSettingsTab extends React.Component + {_t( + "room_settings|security|cannot_change_to_private_due_to_missing_history_visiblity_permissions|description", + )} +

    + ), + }); + await dialog.finished; + return false; + } + + // Adjust the history visibility first. + try { + await this.context.sendStateEvent( + this.props.room.roomId, + EventType.RoomHistoryVisibility, + { + history_visibility: HistoryVisibility.Shared, + }, + "", + ); + this.setState({ history: HistoryVisibility.Shared }); + } catch (ex) { + logger.error("Failed to change history visibility", ex); + Modal.createDialog(ErrorDialog, { + title: _t("common|error"), + description: _t("error|update_history_visibility"), + }); + // If we fail to update the history visibility + return false; + } + } + return true; }; diff --git a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.tsx b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.tsx index ecf2766b20..b1cae7d634 100644 --- a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.tsx @@ -265,7 +265,7 @@ export default class PreferencesUserSettingsTab extends React.Component - {this.renderGroup(PreferencesUserSettingsTab.ROOM_LIST_SETTINGS)} + {!newRoomListEnabled && this.renderGroup(PreferencesUserSettingsTab.ROOM_LIST_SETTINGS)} {/* The settings is on device level where the other room list settings are on account level */} {newRoomListEnabled && ( diff --git a/src/components/views/spaces/QuickSettingsButton.tsx b/src/components/views/spaces/QuickSettingsButton.tsx index 7132032a18..1bde2afef9 100644 --- a/src/components/views/spaces/QuickSettingsButton.tsx +++ b/src/components/views/spaces/QuickSettingsButton.tsx @@ -29,6 +29,7 @@ import QuickThemeSwitcher from "./QuickThemeSwitcher"; import Modal from "../../../Modal"; import DevtoolsDialog from "../dialogs/DevtoolsDialog"; import { SdkContextClass } from "../../../contexts/SDKContext"; +import { ReleaseAnnouncement } from "../../structures/ReleaseAnnouncement"; const QuickSettingsButton: React.FC<{ isPanelCollapsed: boolean; @@ -137,16 +138,24 @@ const QuickSettingsButton: React.FC<{ return ( <> - - {!isPanelCollapsed ? _t("common|settings") : null} - + + {!isPanelCollapsed ? _t("common|settings") : null} + + {contextMenu} diff --git a/src/components/views/spaces/SpaceCreateMenu.tsx b/src/components/views/spaces/SpaceCreateMenu.tsx index fd5b0cb1c0..6b881e33a8 100644 --- a/src/components/views/spaces/SpaceCreateMenu.tsx +++ b/src/components/views/spaces/SpaceCreateMenu.tsx @@ -45,6 +45,8 @@ import defaultDispatcher from "../../../dispatcher/dispatcher"; import { Action } from "../../../dispatcher/actions"; import { Filter } from "../dialogs/spotlight/Filter"; import { type OpenSpotlightPayload } from "../../../dispatcher/payloads/OpenSpotlightPayload.ts"; +import { useSettingValue } from "../../../hooks/useSettings.ts"; +import { UIFeature } from "../../../settings/UIFeature.ts"; export const createSpace = async ( client: MatrixClient, @@ -212,7 +214,10 @@ const SpaceCreateMenu: React.FC<{ onFinished(): void; }> = ({ onFinished }) => { const cli = useMatrixClientContext(); - const [visibility, setVisibility] = useState(null); + const settingAllowPublicSpaces = useSettingValue(UIFeature.AllowCreatingPublicSpaces); + const [visibility, setVisibility] = useState( + settingAllowPublicSpaces === false ? Visibility.Private : null, + ); const [busy, setBusy] = useState(false); const [name, setName] = useState(""); @@ -303,16 +308,20 @@ const SpaceCreateMenu: React.FC<{ } else { body = ( - setVisibility(null)} - title={_t("action|go_back")} - /> + {settingAllowPublicSpaces && ( + setVisibility(null)} + title={_t("action|go_back")} + /> + )}

    {visibility === Visibility.Public ? _t("create_space|public_heading") - : _t("create_space|private_heading")} + : settingAllowPublicSpaces + ? _t("create_space|private_heading") + : _t("create_space|private_only_heading")}

    {_t("create_space|add_details_prompt")} {_t("create_space|add_details_prompt_2")} diff --git a/src/components/views/spaces/SpacePanel.tsx b/src/components/views/spaces/SpacePanel.tsx index 9f0d534767..984b33bb12 100644 --- a/src/components/views/spaces/SpacePanel.tsx +++ b/src/components/views/spaces/SpacePanel.tsx @@ -68,6 +68,7 @@ import { ThreadsActivityCentre } from "./threads-activity-centre/"; import AccessibleButton from "../elements/AccessibleButton"; import { Landmark, LandmarkNavigation } from "../../../accessibility/LandmarkNavigation"; import { KeyboardShortcut } from "../settings/KeyboardShortcut"; +import { ReleaseAnnouncement } from "../../structures/ReleaseAnnouncement"; const useSpaces = (): [Room[], MetaSpace[], Room[], SpaceKey] => { const invites = useEventEmitterState(SpaceStore.instance, UPDATE_INVITED_SPACES, () => { @@ -379,61 +380,72 @@ const SpacePanel: React.FC = () => { onDragEndHandler(); }} > -

    + )} diff --git a/src/components/views/toasts/VerificationRequestToast.tsx b/src/components/views/toasts/VerificationRequestToast.tsx index 12843c0b87..74db50d632 100644 --- a/src/components/views/toasts/VerificationRequestToast.tsx +++ b/src/components/views/toasts/VerificationRequestToast.tsx @@ -177,7 +177,7 @@ export default class VerificationRequestToast extends React.PureComponent
    ); sasCaption = this.props.isSelf - ? _t("encryption|verification|sas_emoji_caption_self") + ? _t("encryption|verification|confirm_the_emojis") : _t("encryption|verification|sas_emoji_caption_user"); } else if (this.props.sas.decimal) { const numberBlocks = this.props.sas.decimal.map((num, i) => {num}); diff --git a/src/components/views/voip/CallView.tsx b/src/components/views/voip/CallView.tsx index 87bf84d8c4..8067cc065c 100644 --- a/src/components/views/voip/CallView.tsx +++ b/src/components/views/voip/CallView.tsx @@ -21,12 +21,11 @@ interface JoinCallViewProps { room: Room; resizing: boolean; call: Call; - skipLobby?: boolean; role?: AriaRole; onClose: () => void; } -const JoinCallView: FC = ({ room, resizing, call, skipLobby, role, onClose }) => { +const JoinCallView: FC = ({ room, resizing, call, role, onClose }) => { const cli = useContext(MatrixClientContext); useTypedEventEmitter(call, CallEvent.Close, onClose); @@ -35,12 +34,6 @@ const JoinCallView: FC = ({ room, resizing, call, skipLobby, call.clean(); }, [call]); - useEffect(() => { - // Always update the widget data so that we don't ignore "skipLobby" accidentally. - call.widget.data ??= {}; - call.widget.data.skipLobby = skipLobby; - }, [call.widget, skipLobby]); - const disconnectAllOtherCalls: () => Promise = useCallback(async () => { // The stickyPromise has to resolve before the widget actually becomes sticky. // We only let the widget become sticky after disconnecting all other active calls. @@ -69,7 +62,6 @@ const JoinCallView: FC = ({ room, resizing, call, skipLobby, interface CallViewProps { room: Room; resizing: boolean; - skipLobby?: boolean; role?: AriaRole; /** * Callback for when the user closes the call. @@ -77,19 +69,8 @@ interface CallViewProps { onClose: () => void; } -export const CallView: FC = ({ room, resizing, skipLobby, role, onClose }) => { +export const CallView: FC = ({ room, resizing, role, onClose }) => { const call = useCall(room.roomId); - return ( - call && ( - - ) - ); + return call && ; }; diff --git a/src/components/views/voip/LegacyCallView.tsx b/src/components/views/voip/LegacyCallView.tsx index 255b1ab0f4..e6da10e520 100644 --- a/src/components/views/voip/LegacyCallView.tsx +++ b/src/components/views/voip/LegacyCallView.tsx @@ -50,6 +50,10 @@ interface IProps { onMouseDownOnHeader?: (event: React.MouseEvent) => void; showApps?: boolean; + + sidebarShown: boolean; + + setSidebarShown?: (sidebarShown: boolean) => void; } interface IState { @@ -62,7 +66,6 @@ interface IState { primaryFeed?: CallFeed; secondaryFeed?: CallFeed; sidebarFeeds: Array; - sidebarShown: boolean; } function getFullScreenElement(): Element | null { @@ -97,7 +100,6 @@ export default class LegacyCallView extends React.Component { primaryFeed: primary, secondaryFeed: secondary, sidebarFeeds: sidebar, - sidebarShown: true, }; } @@ -269,8 +271,9 @@ export default class LegacyCallView extends React.Component { isScreensharing = await this.props.call.setScreensharingEnabled(true); } + this.props.setSidebarShown?.(true); + this.setState({ - sidebarShown: true, screensharing: isScreensharing, }); }; @@ -320,12 +323,12 @@ export default class LegacyCallView extends React.Component { }; private onToggleSidebar = (): void => { - this.setState({ sidebarShown: !this.state.sidebarShown }); + this.props.setSidebarShown?.(!this.props.sidebarShown); }; private renderCallControls(): JSX.Element { - const { call, pipMode } = this.props; - const { callState, micMuted, vidMuted, screensharing, sidebarShown, secondaryFeed, sidebarFeeds } = this.state; + const { call, pipMode, sidebarShown } = this.props; + const { callState, micMuted, vidMuted, screensharing, secondaryFeed, sidebarFeeds } = this.state; // If SDPStreamMetadata isn't supported don't show video mute button in voice calls const vidMuteButtonShown = call.opponentSupportsSDPStreamMetadata() || call.hasLocalUserMediaVideoTrack; @@ -337,7 +340,8 @@ export default class LegacyCallView extends React.Component { (call.opponentSupportsSDPStreamMetadata() || call.hasLocalUserMediaVideoTrack) && call.state === CallState.Connected; // Show the sidebar button only if there is something to hide/show - const sidebarButtonShown = (secondaryFeed && !secondaryFeed.isVideoMuted()) || sidebarFeeds.length > 0; + const sidebarButtonShown = + !pipMode && ((secondaryFeed && !secondaryFeed.isVideoMuted()) || sidebarFeeds.length > 0); // The dial pad & 'more' button actions are only relevant in a connected call const contextMenuButtonShown = callState === CallState.Connected; const dialpadButtonShown = callState === CallState.Connected && call.opponentSupportsDTMF(); @@ -372,7 +376,7 @@ export default class LegacyCallView extends React.Component { } private renderToast(): JSX.Element | null { - const { call } = this.props; + const { call, sidebarShown } = this.props; const someoneIsScreensharing = call.getFeeds().some((feed) => { return feed.purpose === SDPStreamMetadataPurpose.Screenshare; }); @@ -380,7 +384,7 @@ export default class LegacyCallView extends React.Component { if (!someoneIsScreensharing) return null; const isScreensharing = call.isScreensharing(); - const { primaryFeed, sidebarShown } = this.state; + const { primaryFeed } = this.state; const sharerName = primaryFeed?.getMember()?.name; if (!sharerName) return null; @@ -393,8 +397,8 @@ export default class LegacyCallView extends React.Component { } private renderContent(): JSX.Element { - const { pipMode, call, onResize } = this.props; - const { isLocalOnHold, isRemoteOnHold, sidebarShown, primaryFeed, secondaryFeed, sidebarFeeds } = this.state; + const { pipMode, call, onResize, sidebarShown } = this.props; + const { isLocalOnHold, isRemoteOnHold, primaryFeed, secondaryFeed, sidebarFeeds } = this.state; const callRoomId = LegacyCallHandler.instance.roomIdForCall(call); const callRoom = (callRoomId ? MatrixClientPeg.safeGet().getRoom(callRoomId) : undefined) ?? undefined; @@ -537,8 +541,8 @@ export default class LegacyCallView extends React.Component { } public render(): React.ReactNode { - const { call, secondaryCall, pipMode, showApps, onMouseDownOnHeader } = this.props; - const { sidebarShown, sidebarFeeds } = this.state; + const { call, secondaryCall, pipMode, showApps, onMouseDownOnHeader, sidebarShown } = this.props; + const { sidebarFeeds } = this.state; const client = MatrixClientPeg.safeGet(); const callRoomId = LegacyCallHandler.instance.roomIdForCall(call); diff --git a/src/components/views/voip/LegacyCallViewForRoom.tsx b/src/components/views/voip/LegacyCallViewForRoom.tsx index bd44af5fa5..f0bc8ffc22 100644 --- a/src/components/views/voip/LegacyCallViewForRoom.tsx +++ b/src/components/views/voip/LegacyCallViewForRoom.tsx @@ -25,6 +25,7 @@ interface IProps { interface IState { call: MatrixCall | null; + sidebarShown: boolean; } /* @@ -34,19 +35,23 @@ interface IState { export default class LegacyCallViewForRoom extends React.Component { public constructor(props: IProps) { super(props); + const call = this.getCall(); this.state = { - call: this.getCall(), + call, + sidebarShown: !!call && LegacyCallHandler.instance.isCallSidebarShown(call.callId), }; } public componentDidMount(): void { LegacyCallHandler.instance.addListener(LegacyCallHandlerEvent.CallState, this.updateCall); LegacyCallHandler.instance.addListener(LegacyCallHandlerEvent.CallChangeRoom, this.updateCall); + LegacyCallHandler.instance.addListener(LegacyCallHandlerEvent.ShownSidebarsChanged, this.updateCall); } public componentWillUnmount(): void { LegacyCallHandler.instance.removeListener(LegacyCallHandlerEvent.CallState, this.updateCall); LegacyCallHandler.instance.removeListener(LegacyCallHandlerEvent.CallChangeRoom, this.updateCall); + LegacyCallHandler.instance.removeListener(LegacyCallHandlerEvent.ShownSidebarsChanged, this.updateCall); } private updateCall = (): void => { @@ -54,6 +59,10 @@ export default class LegacyCallViewForRoom extends React.Component { + if (!this.state.call) return; + LegacyCallHandler.instance.setCallSidebarShown(this.state.call.callId, sidebarShown); + }; + public render(): React.ReactNode { if (!this.state.call) return null; @@ -99,7 +113,13 @@ export default class LegacyCallViewForRoom extends React.Component - +
    ); diff --git a/src/createRoom.ts b/src/createRoom.ts index 13dcb4e7af..c3bc1e6b1a 100644 --- a/src/createRoom.ts +++ b/src/createRoom.ts @@ -15,7 +15,7 @@ import { RoomCreateTypeField, RoomType, type ICreateRoomOpts, - HistoryVisibility, + type HistoryVisibility, JoinRule, Preset, RestrictedAllowType, @@ -224,10 +224,6 @@ export default async function createRoom(client: MatrixClient, opts: IOpts): Pro if (opts.parentSpace) { createOpts.initial_state.push(makeSpaceParentEvent(opts.parentSpace, true)); - if (!opts.historyVisibility) { - opts.historyVisibility = - createOpts.preset === Preset.PublicChat ? HistoryVisibility.WorldReadable : HistoryVisibility.Invited; - } if (opts.joinRule === JoinRule.Restricted) { createOpts.room_version = PreferredRoomVersions.RestrictedRooms; diff --git a/src/editor/parts.ts b/src/editor/parts.ts index ad49058609..9e476ffaf8 100644 --- a/src/editor/parts.ts +++ b/src/editor/parts.ts @@ -297,7 +297,12 @@ export abstract class PillPart extends BasePart implements IPillPart { } // helper method for subclasses - protected setAvatarVars(node: HTMLElement, avatarUrl: string, initialLetter: string): void { + protected setAvatarVars( + node: HTMLElement, + avatarUrl: string, + initialLetter: string, + avatarTextColor?: string, + ): void { const avatarBackground = `url('${avatarUrl}')`; const avatarLetter = `'${initialLetter}'`; // check if the value is changing, @@ -308,6 +313,9 @@ export abstract class PillPart extends BasePart implements IPillPart { if (node.style.getPropertyValue("--avatar-letter") !== avatarLetter) { node.style.setProperty("--avatar-letter", avatarLetter); } + if (avatarTextColor && node.style.getPropertyValue("--avatar-color") !== avatarTextColor) { + node.style.setProperty("--avatar-color", avatarTextColor); + } } public serialize(): ISerializedPillPart { @@ -421,11 +429,13 @@ class RoomPillPart extends PillPart { protected setAvatar(node: HTMLElement): void { let initialLetter = ""; let avatarUrl = Avatar.avatarUrlForRoom(this.room ?? null, 16, 16, "crop"); + let avatarTextColor: string | undefined; if (!avatarUrl) { initialLetter = Avatar.getInitialLetter(this.room?.name || this.resourceId) ?? ""; avatarUrl = Avatar.defaultAvatarUrlForString(this.room?.roomId ?? this.resourceId); + avatarTextColor = Avatar.getAvatarTextColor(this.room?.roomId ?? this.resourceId); } - this.setAvatarVars(node, avatarUrl, initialLetter); + this.setAvatarVars(node, avatarUrl, initialLetter, avatarTextColor); } public get type(): IPillPart["type"] { @@ -479,10 +489,12 @@ class UserPillPart extends PillPart { const defaultAvatarUrl = Avatar.defaultAvatarUrlForString(this.member.userId); const avatarUrl = Avatar.avatarUrlForMember(this.member, 16, 16, "crop"); let initialLetter = ""; + let avatarTextColor: string | undefined; if (avatarUrl === defaultAvatarUrl) { initialLetter = Avatar.getInitialLetter(name) ?? ""; + avatarTextColor = Avatar.getAvatarTextColor(this.member.userId); } - this.setAvatarVars(node, avatarUrl, initialLetter); + this.setAvatarVars(node, avatarUrl, initialLetter, avatarTextColor); } protected onClick = (): void => { diff --git a/src/hooks/room/useRoomCall.tsx b/src/hooks/room/useRoomCall.tsx index 9e450eed0e..39e7725659 100644 --- a/src/hooks/room/useRoomCall.tsx +++ b/src/hooks/room/useRoomCall.tsx @@ -7,9 +7,10 @@ Please see LICENSE files in the repository root for full details. */ import { type Room } from "matrix-js-sdk/src/matrix"; -import React, { type ReactNode, useCallback, useEffect, useMemo, useState } from "react"; import { CallType } from "matrix-js-sdk/src/webrtc/call"; +import { type ReactNode, useCallback, useEffect, useMemo, useState } from "react"; +import type React from "react"; import { useFeatureEnabled, useSettingValue } from "../useSettings"; import SdkConfig from "../../SdkConfig"; import { useEventEmitter, useEventEmitterState } from "../useEventEmitter"; @@ -33,7 +34,6 @@ import { Action } from "../../dispatcher/actions"; import { CallStore, CallStoreEvent } from "../../stores/CallStore"; import { isVideoRoom } from "../../utils/video-rooms"; import { UIFeature } from "../../settings/UIFeature"; -import { BetaPill } from "../../components/views/beta/BetaCard"; import { type InteractionName } from "../../PosthogTrackers"; import { ElementCallMemberEventType } from "../../call-types"; @@ -55,7 +55,6 @@ export const getPlatformCallTypeProps = ( return { label: _t("voip|element_call"), analyticsName: "WebVoipOptionElementCall", - children: , }; case PlatformCallType.JitsiCall: return { @@ -230,7 +229,7 @@ export const useRoomCall = ( if (widget && promptPinWidget) { WidgetLayoutStore.instance.moveToContainer(room, widget, Container.Top); } else { - placeCall(room, CallType.Voice, callPlatformType, evt?.shiftKey ?? false); + placeCall(room, CallType.Voice, callPlatformType, evt?.shiftKey || undefined); } }, [promptPinWidget, room, widget], @@ -241,7 +240,9 @@ export const useRoomCall = ( if (widget && promptPinWidget) { WidgetLayoutStore.instance.moveToContainer(room, widget, Container.Top); } else { - placeCall(room, CallType.Video, callPlatformType, evt?.shiftKey ?? false); + // If we have pressed shift then always skip the lobby, otherwise `undefined` will defer + // to the defaults of the call implementation. + placeCall(room, CallType.Video, callPlatformType, evt?.shiftKey || undefined); } }, [widget, promptPinWidget, room], diff --git a/src/hooks/useIsEncrypted.ts b/src/hooks/useIsEncrypted.ts index 75c43958dc..f5209ff065 100644 --- a/src/hooks/useIsEncrypted.ts +++ b/src/hooks/useIsEncrypted.ts @@ -7,9 +7,29 @@ Please see LICENSE files in the repository root for full details. */ import { type MatrixClient, type MatrixEvent, type Room, EventType } from "matrix-js-sdk/src/matrix"; +import { type CryptoApi } from "matrix-js-sdk/src/crypto-api"; import { useRoomState } from "./useRoomState.ts"; import { useAsyncMemo } from "./useAsyncMemo.ts"; +import { LocalRoom } from "../models/LocalRoom.ts"; + +/** + * Check if a room is encrypted. + * If the room is a LocalRoom, check the state directly. + * Otherwise, use the crypto API to check if encryption is enabled in the room. + * + * @param room - The room to check. + * @param cryptoApi - The crypto API from the Matrix client. + */ +export async function isRoomEncrypted(room: Room, cryptoApi: CryptoApi): Promise { + if (room instanceof LocalRoom) { + // For local room check the state. + // The crypto check fails because the room ID is not valid (it is a local id) + return (room as LocalRoom).isEncryptionEnabled(); + } + + return await cryptoApi.isEncryptionEnabledInRoom(room.roomId); +} // Hook to simplify watching whether a Matrix room is encrypted, returns null if room is undefined or the state is loading export function useIsEncrypted(cli: MatrixClient, room?: Room): boolean | null { @@ -22,7 +42,7 @@ export function useIsEncrypted(cli: MatrixClient, room?: Room): boolean | null { const crypto = cli.getCrypto(); if (!room || !crypto) return null; - return crypto.isEncryptionEnabledInRoom(room.roomId); + return isRoomEncrypted(room, crypto); }, [room, encryptionStateEvent], null, diff --git a/src/hooks/useMediaVisible.ts b/src/hooks/useMediaVisible.ts index f367e87c4f..de0b0fbf6d 100644 --- a/src/hooks/useMediaVisible.ts +++ b/src/hooks/useMediaVisible.ts @@ -6,7 +6,7 @@ Please see LICENSE files in the repository root for full details. */ import { useCallback } from "react"; -import { JoinRule } from "matrix-js-sdk/src/matrix"; +import { JoinRule, type MatrixEvent } from "matrix-js-sdk/src/matrix"; import { SettingLevel } from "../settings/SettingLevel"; import { useSettingValue } from "./useSettings"; @@ -19,14 +19,25 @@ const PRIVATE_JOIN_RULES: JoinRule[] = [JoinRule.Invite, JoinRule.Knock, JoinRul /** * Should the media event be visible in the client, or hidden. - * @param eventId The eventId of the media event. - * @returns A boolean describing the hidden status, and a function to set the visiblity. + * + * This function uses the `mediaPreviewConfig` setting to determine the rules for the room + * along with the `showMediaEventIds` setting for specific events. + * + * A function may be provided to alter the visible state. + * + * @param The event that contains the media. If not provided, the global rule is used. + * + * @returns Returns a tuple of: + * A boolean describing the hidden status. + * A function to show or hide the event. */ -export function useMediaVisible(eventId?: string, roomId?: string): [boolean, (visible: boolean) => void] { - const mediaPreviewSetting = useSettingValue("mediaPreviewConfig", roomId); +export function useMediaVisible(mxEvent?: MatrixEvent): [boolean, (visible: boolean) => void] { + const eventId = mxEvent?.getId(); + const mediaPreviewSetting = useSettingValue("mediaPreviewConfig", mxEvent?.getRoomId()); const client = useMatrixClientContext(); const eventVisibility = useSettingValue("showMediaEventIds"); - const joinRule = useRoomState(client.getRoom(roomId) ?? undefined, (state) => state.getJoinRule()); + const room = client.getRoom(mxEvent?.getRoomId()) ?? undefined; + const joinRule = useRoomState(room, (state) => state.getJoinRule()); const setMediaVisible = useCallback( (visible: boolean) => { SettingsStore.setValue("showMediaEventIds", null, SettingLevel.DEVICE, { @@ -43,6 +54,9 @@ export function useMediaVisible(eventId?: string, roomId?: string): [boolean, (v // Always prefer the explicit per-event user preference here. if (explicitEventVisiblity !== undefined) { return [explicitEventVisiblity, setMediaVisible]; + } else if (mxEvent?.getSender() === client.getUserId()) { + // If this event is ours and we've not set an explicit visibility, default to on. + return [true, setMediaVisible]; } else if (mediaPreviewSetting.media_previews === MediaPreviewValue.Off) { return [false, setMediaVisible]; } else if (mediaPreviewSetting.media_previews === MediaPreviewValue.On) { diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 69b4127ea8..6e6b8e8114 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -600,7 +600,6 @@ "user": "Uživatel", "user_avatar": "Profilový obrázek", "username": "Uživatelské jméno", - "verification_cancelled": "Oveření bylo zrušeno", "verified": "Ověřeno", "version": "Verze", "video": "Video", @@ -646,16 +645,17 @@ "mode_plain": "Skrýt formátování", "mode_rich_text": "Zobrazit formátování", "no_perms_notice": "Nemáte oprávnění zveřejňovat příspěvky v této místnosti", - "placeholder": "Odeslat zprávu…", - "placeholder_encrypted": "Odeslat šifrovanou zprávu…", - "placeholder_reply": "Odpovědět…", - "placeholder_reply_encrypted": "Odeslat šifrovanou odpověď…", - "placeholder_thread": "Odpovědět na vlákno…", - "placeholder_thread_encrypted": "Odpovědět na zašifrované vlákno…", + "placeholder": "Odeslat nešifrovanou zprávu…", + "placeholder_encrypted": "Odeslat zprávu...", + "placeholder_reply": "Odeslat nešifrovanou odpověď…", + "placeholder_reply_encrypted": "Odeslat odpověď…", + "placeholder_thread": "Odpovědět v nešifrovaném vláknu…", + "placeholder_thread_encrypted": "Odpovědět ve vláknu…", "poll_button": "Hlasování", "poll_button_no_perms_description": "Nemáte oprávnění zahajovat hlasování v této místnosti.", "poll_button_no_perms_title": "Vyžaduje oprávnění", "replying_title": "Odpovídá", + "room_unencrypted": "Zprávy v této místnosti nejsou koncově šifrované.", "room_upgraded_link": "Konverzace pokračuje zde.", "room_upgraded_notice": "Tato místnost byla nahrazena a už není používaná.", "send_button_title": "Poslat zprávu", @@ -719,6 +719,7 @@ "personal_space_description": "Soukromý prostor pro uspořádání vašich místností", "private_description": "Pouze pozvat, nejlepší pro sebe nebo pro týmy", "private_heading": "Váš soukromý prostor", + "private_only_heading": "Váš prostor", "private_personal_description": "Zajistěte, aby do %(name)s měli přístup správní lidé", "private_personal_heading": "S kým pracujete?", "private_space": "Já a moji spolupracovníci", @@ -922,7 +923,8 @@ }, "privacy_warning": "Ujistěte se, že tuto obrazovku nikdo nevidí!", "restoring": "Obnovení klíčů ze zálohy", - "security_key_title": "Klíč pro obnovení" + "security_key_label": "Klíč pro obnovení", + "security_key_title": "Zadejte klíč pro obnovení" }, "bootstrap_title": "Příprava klíčů", "confirm_encryption_setup_body": "Kliknutím na tlačítko níže potvrďte nastavení šifrování.", @@ -968,7 +970,6 @@ "title": "Záloha klíčů byla odstraněna", "warning": "Pokud jste způsob obnovy neodstranili vy, mohou se pokoušet k vašemu účtu dostat útočníci. Změňte si raději ihned heslo a nastavte nový způsob obnovy v Nastavení." }, - "reset_all_button": "Zapomněli nebo ztratili jste všechny metody obnovy? Resetovat vše", "set_up_recovery": "Nastavení obnovení", "set_up_recovery_toast_description": "Vygenerujte klíč pro obnovení, který lze použít k obnovení historie šifrovaných zpráv v případě, že ztratíte přístup k zařízením.", "set_up_toast_title": "Nastavení zabezpečené zálohy", @@ -991,16 +992,15 @@ "after_new_login": { "device_verified": "Zařízení ověřeno", "skip_verification": "Prozatím přeskočit ověřování", - "unable_to_verify": "Nelze ověřit toto zařízení", "verify_this_device": "Ověřit toto zařízení" }, - "cancelled": "Zrušili jste proces ověření.", - "cancelled_self": "Ověřování na jiném zařízení jste zrušili.", - "cancelled_user": "%(displayName)s zrušil(a) proces ověření.", "cancelling": "Rušení…", + "cant_confirm": "Nemůžete potvrdit?", "complete_action": "OK", "complete_description": "Uživatel úspěšně ověřen.", "complete_title": "Ověřeno!", + "confirm_identity_description": "Ověřte toto zařízení a nastavte zabezpečené zasílání zpráv.", + "confirm_identity_title": "Potvrďte svou totožnost", "error_starting_description": "Nepodařilo se zahájit chat s druhým uživatelem.", "error_starting_title": "Chyba při zahájení ověření", "explainer": "Bezpečné zprávy s tímto uživatelem jsou koncově šifrované a nikdo další je nemůže číst.", @@ -1026,47 +1026,37 @@ "text": "Zadejte ID a otisk prstu jednoho ze svých vlastních zařízení a ověřte jej. POZNÁMKA to umožňuje druhému zařízení odesílat a přijímat zprávy jako vy. POKUD VÁM NĚKDO ŘEKL, ABYSTE SEM NĚCO VLOŽILI, JE PRAVDĚPODOBNÉ, ŽE JSTE PODVEDENI!", "wrong_fingerprint": "Nelze ověřit zařízení '%(deviceId)s' - zadaný otisk prstu '%(fingerprint)s' neodpovídá otisku prstu zařízení, '%(fprint)s'" }, - "no_key_or_device": "Vypadá to, že nemáte klíč pro obnovení ani žádné jiné zařízení, které byste mohli ověřit. Toto zařízení nebude mít přístup ke starým zašifrovaným zprávám. Abyste mohli na tomto zařízení ověřit svou identitu, budete muset obnovit ověřovací klíče.", "no_support_qr_emoji": "Zařízení, které se snažíte ověřit, neumožňuje ověření QR kódem ani pomocí emotikonů, které %(brand)s podporuje. Zkuste použít jiného klienta.", "other_party_cancelled": "Druhá strana ověření zrušila.", "prompt_encrypted": "Ověřit všechny uživatele v místnosti, abyste se přesvědčili o bezpečnosti.", - "prompt_self": "Začít proces ověření znovu pomocí notifikace.", "prompt_unencrypted": "V šifrovaných místnostech ověřte všechny uživatele, abyste zajistili bezpečnost komunikace.", - "prompt_user": "Proces ověření začněte znovu z profilu kontaktu.", "qr_or_sas": "%(qrCode)s nebo %(emojiCompare)s", - "qr_or_sas_header": "Ověřte toto zařízení dokončením jedné z následujících položek:", "qr_prompt": "Naskenujte tento jedinečný kód", - "qr_reciprocate_same_shield_device": "Už to skoro je! Zobrazuje vaše druhé zařízení stejný štít?", "qr_reciprocate_same_shield_user": "Téměř hotovo! Je relace %(displayName)s také ověřená?", - "request_toast_accept": "Ověřit relaci", "request_toast_accept_user": "Ověřit uživatele", "request_toast_decline_counter": "Ignorovat (%(counter)s)", "request_toast_detail": "%(deviceId)s z %(ip)s", - "reset_proceed_prompt": "Pokračovat v resetování", "sas_caption_self": "Ověřte toto zařízení tak, že potvrdíte, že se na jeho obrazovce zobrazí následující číslo.", "sas_caption_user": "Ověřte uživatele zkontrolováním, že se na obrazovce objevila stejná čísla.", "sas_description": "Pokud na žádném zařízení nemáte kameru, porovnejte jedinečnou kombinaci emoji", - "sas_emoji_caption_self": "Potvrďte, že se následující emotikony zobrazují na obou zařízeních ve stejném pořadí:", "sas_emoji_caption_user": "Ověřte uživatele zkontrolováním, že se mu na obrazovce objevily stejné emoji.", "sas_match": "Shodují se", "sas_no_match": "Neshodují se", "sas_prompt": "Porovnejte jedinečnou kombinaci emoji", "scan_qr": "Ověřte naskenováním", "scan_qr_explainer": "Požádejte uživatele %(displayName)s o naskenování tohoto kódu pro vaše ověření:", - "self_verification_hint": "Pro pokračování, přijměte žádost o ověření na svém dalším zařízení.", "start_button": "Zahájit ověření", - "successful_device": "Ověřili jste %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "Úspěšně jste ověřili vaše zařízení!", "successful_user": "Úspěšně jste ověřili uživatele %(displayName)s!", - "timed_out": "Ověření vypršelo.", "unsupported_method": "Nepovedlo se nám najít podporovanou metodu ověření.", "unverified_session_toast_accept": "Ano, to jsem byl já", "unverified_session_toast_title": "Nové přihlášní. Jste to vy?", "unverified_sessions_toast_description": "Zkontrolujte, zda je váš účet v bezpečí", "unverified_sessions_toast_reject": "Později", "unverified_sessions_toast_title": "Máte neověřené relace", - "verification_description": "Ověřte svou identitu, abyste získali přístup k šifrovaným zprávám a prokázali svou identitu ostatním. Pokud používáte také mobilní zařízení, před pokračováním otevřete aplikaci.", + "use_another_device": "Použít jiné zařízení", + "use_recovery_key": "Použít klíč pro obnovení", "verification_dialog_title_device": "Ověřit jiné zařízení", + "verification_dialog_title_failed": "Ověření se nezdařilo", "verification_dialog_title_user": "Požadavek na ověření", "verification_skip_warning": "Bez ověření nebudete mít přístup ke všem svým zprávám a můžete se ostatním jevit jako nedůvěryhodní.", "verification_success_with_backup": "Vaše nové zařízení je nyní ověřeno. Má přístup k vašim zašifrovaným zprávám a ostatní uživatelé jej budou považovat za důvěryhodné.", @@ -1075,9 +1065,6 @@ "verify_emoji_prompt": "Ověření porovnáním několika emoji.", "verify_emoji_prompt_qr": "Pokud vám skenování kódů nefunguje, ověřte se porovnáním emoji.", "verify_later": "Ověřím se později", - "verify_using_device": "Ověřit pomocí jiného zařízení", - "verify_using_key": "Ověřit pomocí klíče pro obnovení", - "verify_using_key_or_phrase": "Ověření pomocí klíče pro obnovení nebo fráze", "waiting_for_user_accept": "Čekáme, než %(displayName)s výzvu přijme…", "waiting_other_device": "Čekáme na ověření na jiném zařízení…", "waiting_other_device_details": "Čekáme na ověření na vašem dalším zařízení, %(deviceName)s (%(deviceId)s)…", @@ -1127,6 +1114,7 @@ "tls": "Nelze se připojit k domovskému serveru – zkontrolujte prosím své připojení, prověřte, zda je SSL certifikát vašeho domovského serveru důvěryhodný, a že některé z rozšíření prohlížeče neblokuje komunikaci.", "unknown": "Neznámá chyba", "unknown_error_code": "neznámý kód chyby", + "update_history_visibility": "Nepodařilo se změnit viditelnost historie", "update_power_level": "Nepodařilo se změnit úroveň oprávnění" }, "error_app_open_in_another_tab": "Přepněte na jiný panel a připojte se k %(brand)s. Tuto kartu nyní můžete zavřít.", @@ -1173,7 +1161,7 @@ "audio": "Zvuk", "file": "Soubor", "image": "Obrázek", - "poll": "Anketa", + "poll": "Hlasování", "video": "Video" }, "preview": "%(prefix)s: %(preview)s" @@ -1367,6 +1355,10 @@ "name_email_mxid_share_space": "Pozvěte někoho pomocí jeho jména, e-mailové adresy, uživatelského jména (například ) nebo sdílejte tento prostor.", "name_mxid_share_room": "Pozvěte někoho pomocí svého jména, uživatelského jména (například ) nebo sdílejte tuto místnost.", "name_mxid_share_space": "Pozvěte někoho pomocí jeho jména, uživatelského jména (například ) nebo sdílejte tento prostor.", + "progress": { + "dont_close": "Nezavírejte aplikaci, dokud neskončíte.", + "preparing": "Příprava pozvánek..." + }, "recents_section": "Nedávné konverzace", "room_failed_partial": "Poslali jsme ostatním, ale níže uvedení lidé nemohli být pozváni do ", "room_failed_partial_title": "Některé pozvánky nebylo možné odeslat", @@ -1535,6 +1527,9 @@ "render_reaction_images_description": "Někdy se označují jako \"vlastní emoji\".", "report_to_moderators": "Nahlásit moderátorům", "report_to_moderators_description": "V místnostech, které podporují moderování, můžete pomocí tlačítka \"Nahlásit\" nahlásit zneužití moderátorům místnosti.", + "share_history_on_invite": "Sdílet šifrovanou historii s novými členy", + "share_history_on_invite_description": "Při pozvání uživatele do šifrované místnosti, u které je viditelnost historie nastavena na „sdílená“, sdílet šifrovanou historii s tímto uživatelem a přijmout šifrovanou historii, když jste pozváni do takové místnosti.", + "share_history_on_invite_warning": "Tato funkce je EXPERIMENTÁLNÍ a nejsou v ní implementována všechna bezpečnostní opatření. Neaktivujte ji na produkčních účtech.", "sliding_sync": "Režim klouzavé synchronizace", "sliding_sync_description": "V aktivním vývoji, nelze zakázat.", "sliding_sync_disabled_notice": "Pro vypnutí se odhlaste a znovu přihlaste", @@ -1657,6 +1652,7 @@ "filter_placeholder": "Najít člena místnosti", "invite_button_no_perms_tooltip": "Nemáte oprávnění zvát uživatele", "invited_label": "Pozván", + "list_title": "Seznam členů", "no_matches": "Žádné shody" }, "member_list_back_action_label": "Členové místnosti", @@ -1761,6 +1757,7 @@ }, "power_level": { "admin": "Správce", + "creator": "Vlastník", "custom": "Vlastní (%(level)s)", "custom_level": "Vlastní úroveň", "default": "Výchozí", @@ -1869,11 +1866,6 @@ "other": "Můžete připnout až %(count)s widgetů" }, "menu": "Otevřít menu", - "release_announcement": { - "close": "OK", - "description": "Všechny připnuté zprávy najdete zde. Přejděte na libovolnou zprávu a výběrem možnosti \"Připnout\" ji přidejte.", - "title": "Všechny nové připnuté zprávy" - }, "reply_thread": "Odpověď na vlákno zprávy", "unpin_all": { "button": "Odepnout všechny zprávy", @@ -1907,13 +1899,14 @@ "view_in_timeline": "Zobrazit hlasování na časové ose", "view_poll": "Zobrazit hlasování" }, - "polls_button": "Ankety", + "polls_button": "Hlasování", "room_summary_card": { "title": "Informace o místnosti" }, "thread_list": { "context_menu_label": "Možnosti vláken" }, + "title": "Pravý panel", "video_room_chat": { "title": "Chatovat" } @@ -1995,7 +1988,9 @@ "inaccessible_subtitle_1": "Zkuste to později nebo požádejte správce místnosti či prostoru, aby zkontroloval, zda máte přístup.", "inaccessible_subtitle_2": "Při pokusu o přístup do místnosti nebo prostoru bylo vráceno %(errcode)s. Pokud si myslíte, že se vám tato zpráva zobrazuje chybně, pošlete prosím hlášení o chybě.", "intro": { + "display_topic": "Téma: ", "dm_caption": "V této konverzaci jste pouze vy dva, dokud někdo z vás nepozve někoho dalšího.", + "edit_topic": "Téma: (upravit)", "enable_encryption_prompt": "Povolte šifrování v nastavení.", "encrypted_3pid_dm_pending_join": "Jakmile se všichni připojí, budete moci konverzovat", "no_avatar_label": "Přidejte fotografii, aby lidé mohli snadno najít váši místnost.", @@ -2005,8 +2000,6 @@ "send_message_start_dm": "Odesláním první zprávy pozvete do chatu", "start_of_dm_history": "Toto je začátek historie vašich přímých zpráv s uživatelem .", "start_of_room": "Toto je začátek místnosti .", - "topic": "Téma: %(topic)s ", - "topic_edit": "Téma: %(topic)s (upravit)", "unencrypted_warning": "Koncové šifrování není povoleno", "user_created": "%(displayName)s vytvořil tuto místnost.", "you_created": "Vytvořili jste tuto místnost." @@ -2061,8 +2054,9 @@ "pinned_message_banner": { "button_close_list": "Zavřít seznam", "button_view_all": "Zobrazit vše", - "description": "Tato místnost má připnuté zprávy. Kliknutím je zobrazíte.", - "go_to_message": "Zobrazit připnutou zprávu na časové ose.", + "description": "Připnuté zprávy", + "go_to_newest_message": "Zobrazit připnutou zprávu na časové ose a nejnovější připnutou zprávu zde", + "go_to_next_message": "Zobrazit připnutou zprávu na časové ose a další nejstarší připnutou zprávu zde", "title": "%(index)sz%(length)s Připnuté zprávy" }, "read_topic": "Klikněte pro přečtení tématu", @@ -2173,6 +2167,26 @@ "one": "Momentálně se odstraňují zprávy v %(count)s místnosti", "other": "Momentálně se odstraňují zprávy v %(count)s místnostech" }, + "release_announcement": { + "done": "Hotovo", + "filter": { + "description": "Filtrujte své chaty jediným kliknutím. Rozbalením zobrazíte další filtry.", + "title": "Nové rychlé filtry" + }, + "intro": { + "description": "Seznam chatů byl aktualizován, aby byl přehlednější a jednodušší na používání.", + "title": "Chaty mají nový vzhled!" + }, + "next": "Další", + "settings": { + "description": "Chcete-li zobrazit nebo skrýt náhledy zpráv, přejděte do Všechna nastavení > Předvolby > Seznam místností", + "title": "Některá nastavení byla přesunuta" + }, + "sort": { + "description": "Změňte pořadí svých chatů z nejnovějších na A-Z", + "title": "Seřaďte si chaty" + } + }, "room": { "more_options": "Více možností", "open_room": "Otevřít místnost %(roomName)s" @@ -2362,6 +2376,10 @@ "users_default": "Výchozí role" }, "security": { + "cannot_change_to_private_due_to_missing_history_visiblity_permissions": { + "description": "Nemáte oprávnění měnit viditelnost historie místnosti. To je nebezpečné, protože by to mohlo umožnit uživatelům, kteří nejsou členy, číst zprávy.", + "title": "Nelze nastavit místnost jako soukromou" + }, "enable_encryption_confirm_description": "Po zapnutí již nelze šifrování v této místnosti vypnout. Zprávy v šifrovaných místnostech mohou číst jen členové místnosti, server se k obsahu nedostane. Šifrování místností nepodporuje většina botů a propojení. Více informací o šifrování.", "enable_encryption_confirm_title": "Povolit šifrování?", "enable_encryption_public_room_confirm_description_1": "Nedoporučuje se šifrovat veřejné místnosti.Veřejné místnosti může najít a připojit se k nim kdokoli, takže si v nich může číst zprávy kdokoli. Nezískáte tak žádnou z výhod šifrování a nebudete ho moci později vypnout. Šifrování zpráv ve veřejné místnosti zpomalí příjem a odesílání zpráv.", @@ -2379,7 +2397,7 @@ "history_visibility_joined": "Pouze členové (od chvíle jejich vstupu)", "history_visibility_legend": "Kdo může číst historii?", "history_visibility_shared": "Pouze členové (od chvíle vybrání této volby)", - "history_visibility_warning": "Změny viditelnosti historie této místnosti ovlivní jenom nové zprávy. Viditelnost starších zpráv zůstane, jaká byla v době jejich odeslání.", + "history_visibility_warning": "Viditelnost stávající historie se nezmění.", "history_visibility_world_readable": "Kdokoliv", "join_rule_description": "Rozhodněte, kdo se může připojit k místnosti %(roomName)s.", "join_rule_invite": "Soukromý (pouze pro pozvané)", @@ -2422,6 +2440,7 @@ "other": "Aktualizace prostorů... (%(progress)s z %(count)s)" }, "join_rule_upgrade_upgrading_room": "Aktualizace místnosti", + "join_rule_world_readable_description": "Změna toho, kdo může vstoupit do místnosti, změní také viditelnost budoucích zpráv.", "public_without_alias_warning": "Přidejte prosím místnosti adresu aby na ní šlo odkazovat.", "publish_room": "Zviditelněte tuto místnost ve veřejném adresáři místností.", "publish_space": "Zviditelněte tento prostor ve veřejném adresáři místností.", @@ -2560,6 +2579,7 @@ "breadcrumb_second_description": "Ztratíte veškerou historii zpráv, která je uložena pouze na serveru", "breadcrumb_third_description": "Budete muset znovu ověřit všechna svá stávající zařízení a kontakty", "breadcrumb_title": "Opravdu chcete obnovit svou identitu?", + "breadcrumb_title_cant_confirm": "Musíte resetovat svou totožnost", "breadcrumb_title_forgot": "Zapomněli jste klíč pro obnovení? Budete muset obnovit svou identitu.", "breadcrumb_title_sync_failed": "Synchronizace úložiště klíčů se nezdařila. Musíte obnovit svou identitu.", "breadcrumb_warning": "Udělejte to pouze v případě, že se domníváte, že váš účet byl napaden.", @@ -3400,6 +3420,7 @@ "unable_to_find": "Pokusili jste se načíst bod na časové ose místnosti, ale nepodařilo se ho najít." }, "m.audio": { + "audio_player": "Audio přehrávač", "error_downloading_audio": "Chyba při stahování audia", "error_processing_audio": "Došlo k chybě při zpracovávání hlasové zprávy", "error_processing_voice_message": "Chyba při zpracování hlasové zprávy", @@ -3960,6 +3981,7 @@ "connection_lost": "Došlo ke ztrátě připojení k serveru", "connection_lost_description": "Bez připojení k serveru nelze uskutečňovat hovory.", "consulting": "Konzultace s %(transferTarget)s. Převod na %(transferee)s", + "decline_call": "Odmítnout", "default_device": "Výchozí zařízení", "dial": "Vytočit", "dialpad": "Číselník", @@ -4011,6 +4033,7 @@ "show_sidebar_button": "Zobrazit postranní panel", "silence": "Ztlumit zvonění", "silenced": "Oznámení ztlumena", + "skip_lobby_toggle_option": "Připojte se ihned", "start_screenshare": "Začít sdílet obrazovku", "stop_screenshare": "Ukončit sdílení obrazovky", "too_many_calls": "Přiliš mnoho hovorů", diff --git a/src/i18n/strings/cy.json b/src/i18n/strings/cy.json index e4931d7af9..4d00f3158a 100644 --- a/src/i18n/strings/cy.json +++ b/src/i18n/strings/cy.json @@ -475,12 +475,9 @@ "all_chats": "Pob Sgwrs", "analytics": "Dadansoddi Gwe", "and_n_others": { - "zero": "a dim arall...", - "one": "ac un arall...", - "two": "a %(count)s arall...", - "few": "a %(count)s arall...", - "many": "a %(count)s arall...", - "other": "a %(count)s arall..." + "a dim arall...": "zero", + "ac un arall...": "one", + "a %(count)s arall...": "other" }, "appearance": "Gwedd", "application": "Rhaglen", @@ -537,20 +534,12 @@ "modern": "Modern", "mute": "Tewi", "n_members": { - "zero": "%(count)s aelodau", - "one": "%(count)s aelod", - "two": "%(count)s aelod", - "few": "%(count)s aelod", - "many": "%(count)s aelod", - "other": "%(count)s aelod" + "%(count)s aelodau": "zero", + "%(count)s aelod": "other" }, "n_rooms": { - "zero": "%(count)s ystafelloedd", - "one": "%(count)s ystafell", - "two": "%(count)s ystafell", - "few": "%(count)s ystafell", - "many": "%(count)s ystafell", - "other": "%(count)s ystafell" + "%(count)s ystafelloedd": "zero", + "%(count)s ystafell": "other" }, "name": "Enw", "no_results": "Dim canlyniadau", @@ -614,7 +603,6 @@ "user": "Defnyddwyr", "user_avatar": "Llun proffil", "username": "Enw defnyddiwr", - "verification_cancelled": "Dilysiad wedi'i ddiddymu", "verified": "Wedi ei wirio", "version": "Fersiwn", "video": "Fideo", @@ -660,16 +648,17 @@ "mode_plain": "Cuddio fformatio", "mode_rich_text": "Dangos fformatio", "no_perms_notice": "Nid oes gennych ganiatâd i bostio i'r ystafell hon", - "placeholder": "Anfon neges…", - "placeholder_encrypted": "Anfon neges wedi'i hamgryptio…", - "placeholder_reply": "Anfon ateb…", - "placeholder_reply_encrypted": "Anfon ateb wedi'i amgryptio…", - "placeholder_thread": "Ateb i edefyn…", - "placeholder_thread_encrypted": "Ymateb i edefyn wedi'i amgryptio…", + "placeholder": "Anfon message heb ei hamgryptio …", + "placeholder_encrypted": "Anfon neges…", + "placeholder_reply": "Anfonwch ateb heb ei amgryptio…", + "placeholder_reply_encrypted": "Anfon ateb…", + "placeholder_thread": "Ymateb i'r edefyn heb ei hamgryptio …", + "placeholder_thread_encrypted": "Ymateb i'r edefyn…", "poll_button": "Arolwg", "poll_button_no_perms_description": "Nid oes gennych ganiatâd i ddechrau pleidleisio yn yr ystafell hon.", "poll_button_no_perms_title": "Angen Caniatâd", "replying_title": "Yn ateb", + "room_unencrypted": "Nid yw negeseuon yn yr ystafell hon wedi'u hamgryptio o ben-i-ben", "room_upgraded_link": "Mae'r sgwrs yn parhau yma.", "room_upgraded_notice": "Mae'r ystafell hon wedi'i hadnewyddu ac nid yw'n weithredol mwyach.", "send_button_title": "Anfon neges", @@ -733,6 +722,7 @@ "personal_space_description": "Man preifat i drefnu eich ystafelloedd", "private_description": "Gwahoddiad yn unig, sydd orau i chi'ch hun neu dimau", "private_heading": "Eich lle preifat", + "private_only_heading": "Eich gofod", "private_personal_description": "Sicrhewch fod gan y bobl iawn fynediad i %(matere)s", "private_personal_heading": "Gyda phwy ydych chi'n gweithio?", "private_space": "Fi a fy nghyd-chwaraewyr", @@ -878,6 +868,7 @@ "elementCallUrl": "URL Galwad Element" }, "settings_explorer": "Archwiliwr gosodiadau", + "show_empty_content_events": "Dangos digwyddiadau gyda chynnwys gwag", "show_hidden_events": "Dangos digwyddiadau cudd yn y llinell amser", "spaces": { "<%(count) s gofodau>": "zero", @@ -937,7 +928,8 @@ }, "privacy_warning": "Gwnewch yn siŵr nad oes neb yn gallu gweld y sgrin hon!", "restoring": "Adfer allweddi o'r copi wrth gefn", - "security_key_title": "Allwedd adfer" + "security_key_label": "Allwedd adfer", + "security_key_title": "Rhowch eich allwedd adfer" }, "bootstrap_title": "Gosod allweddi", "confirm_encryption_setup_body": "Clicio'r botwm isod i gadarnhau gosod amgryptio.", @@ -950,6 +942,7 @@ "cross_signing_user_warning": "Nid yw'r defnyddiwr hwn wedi gwirio eu holl sesiynau.", "enter_recovery_key": "Rhowch allwedd adfer", "event_shield_reason_authenticity_not_guaranteed": "Nid oes modd gwarantu dilysrwydd y neges hon sydd wedi'i hamgryptio ar y ddyfais hon.", + "event_shield_reason_mismatched_sender": "Nid yw anfonwr y digwyddiad yn cyfateb i berchennog y ddyfais a'i hanfonodd.", "event_shield_reason_mismatched_sender_key": "Wedi'i amgryptio gan sesiwn heb ei wirio", "event_shield_reason_unknown_device": "Wedi'i amgryptio gan ddyfais anhysbys neu wedi'i dileu.", "event_shield_reason_unsigned_device": "Wedi'i amgryptio gan ddyfais nad yw wedi'i dilysu gan ei pherchennog.", @@ -982,7 +975,6 @@ "title": "Dull Adfer Wedi'i Dynnu", "warning": "Os na wnaethoch chi ddileu'r dull adfer, mae'n bosibl bod ymosodwr yn ceisio cael mynediad i'ch cyfrif. Newidiwch eich cyfrinair cyfrif a gosodwch ddull adfer newydd ar unwaith yn y Gosodiadau." }, - "reset_all_button": "Wedi anghofio neu golli pob dull adfer? Ailosod y cyfan", "set_up_recovery": "Gosod adfer", "set_up_recovery_toast_description": "Cynhyrchwch allwedd adfer y mae modd ei defnyddio i adfer hanes eich neges wedi'i hamgryptio rhag ofn i chi golli mynediad i'ch dyfeisiau.", "set_up_toast_title": "Gosod Copi Wrth Gefn Diogel", @@ -1005,16 +997,15 @@ "after_new_login": { "device_verified": "Dyfais wedi'i dilysu", "skip_verification": "Hepgor dilysu am y tro", - "unable_to_verify": "Methu â gwirio'r ddyfais hon", "verify_this_device": "Dilyswch y ddyfais hon" }, - "cancelled": "Rydych chi wedi diddymu'r dilysiad.", - "cancelled_self": "Rydych chi wedi diddymu dilysiad ar eich dyfais arall.", - "cancelled_user": "%(displayName)s dilysiad wedi'i ddiddymu.", "cancelling": "Wrthi'n diddymu…", + "cant_confirm": "Methu cadarnhau?", "complete_action": "Iawn", "complete_description": "Rydych chi wedi dilysu'r defnyddiwr hwn yn llwyddiannus.", "complete_title": "Gwirwyd!", + "confirm_identity_description": "Gwiriwch y ddyfais hon i osod negesu diogel", + "confirm_identity_title": "Cadarnhewch eich hunaniaeth", "error_starting_description": "Nid oeddem yn gallu dechrau sgwrs gyda'r defnyddiwr arall.", "error_starting_title": "Gwall wrth gychwyn y dilysu", "explainer": "Mae negeseuon diogel gyda'r defnyddiwr hwn wedi'u hamgryptio pen-i-ben ac ni all trydydd parti eu darllen.", @@ -1040,47 +1031,37 @@ "text": "Rhowch ID ac olion bysedd un o'ch dyfeisiau eich hun i'w wirio. NODER bod hyn yn caniatáu i'r ddyfais arall anfon a derbyn negeseuon fel chi. OS DYWEDODD RHYWUN WRTHYCH CHI AM GLUDO RHYWBETH YMA, MAE'N DEBYGOL EICH BOD CHI'N CAEL EICH SGAMIO!", "wrong_fingerprint": "Methu gwirio dyfais '%(deviceId)s' - nid yw'r bysbrintiau a ddarparwyd '%(fingerprint)s' yn cyfateb i fysbrintiau'r ddyfais, '%(fprint)s'" }, - "no_key_or_device": "Mae'n ymddangos nad oes gennych Allwedd Adfer nac unrhyw ddyfeisiau eraill y gallwch wirio yn eu herbyn. Ni fydd y ddyfais hon yn gallu cyrchu hen negeseuon wedi'u hamgryptio. Er mwyn gwirio pwy ydych ar y ddyfais hon, bydd angen i chi ailosod eich allweddi dilysu.", "no_support_qr_emoji": "Nid yw'r ddyfais rydych chi'n ceisio'i dilysu yn cefnogi sganio cod QR na dilysiad emoji, sef yr hyn y mae %(brand)s yn ei gefnogi. Ceisiwch gyda chleient gwahanol.", "other_party_cancelled": "Mae'r parti arall wedi diddymu'r dilysiad.", "prompt_encrypted": "Gwiriwch yr holl ddefnyddwyr mewn ystafell i sicrhau ei bod yn ddiogel.", - "prompt_self": "Dechreuwch ddilysu eto o'r hysbysiad.", "prompt_unencrypted": "Mewn ystafelloedd wedi'u hamgryptio, gwiriwch bob defnyddiwr i sicrhau ei fod yn ddiogel.", - "prompt_user": "Dechrau dilysu eto o'u proffil.", "qr_or_sas": "%(qrCode)s neu %(emojiCompare)s", - "qr_or_sas_header": "Dilyswch y ddyfais hon trwy gwblhau un o'r canlynol:", "qr_prompt": "Sganiwch y cod unigryw hwn", - "qr_reciprocate_same_shield_device": "Bron yno! A yw eich dyfais arall yn dangos yr un darian?", "qr_reciprocate_same_shield_user": "Bron yno! Ydy %(displayName)s yn dangos yr un darian?", - "request_toast_accept": "Dilysu Sesiwn", "request_toast_accept_user": "Dilysu Defnyddiwr", "request_toast_decline_counter": "Anwybyddu (%(counter)s)", "request_toast_detail": "%(deviceId)s oddi wrth %(ip)s", - "reset_proceed_prompt": "Mynd ymlaen i ailosod", "sas_caption_self": "Dilyswch y ddyfais hon trwy gadarnhau bod y rhif canlynol yn ymddangos ar ei sgrin.", "sas_caption_user": "Dilyswch y defnyddiwr hwn trwy gadarnhau bod y rhif canlynol yn ymddangos ar eu sgrin.", "sas_description": "Cymharwch set unigryw o emoji os nad oes gennych gamera ar y naill ddyfais na'r llall", - "sas_emoji_caption_self": "Cadarnhewch fod yr emoji isod yn cael eu harddangos ar y ddwy ddyfais, yn yr un drefn:", "sas_emoji_caption_user": "Dilyswch y defnyddiwr hwn trwy gadarnhau bod yr emoji canlynol yn ymddangos ar eu sgrin.", "sas_match": "Maen nhw'n cyfateb", "sas_no_match": "D'yn nhw ddim yn cyfateb", "sas_prompt": "Cymharu emoji unigryw", "scan_qr": "Gwirio trwy sganio", "scan_qr_explainer": "Gofynnwch i %(displayName)s sganio'ch cod:", - "self_verification_hint": "I symud ymlaen, derbyniwch y cais dilysu ar eich dyfais arall.", "start_button": "Dechrau Dilysu", - "successful_device": "Rydych chi wedi dilysu %(deviceName)s (%(deviceId)s) yn llwyddiannus!", - "successful_own_device": "Rydych chi wedi dilysu'ch dyfais yn llwyddiannus!", "successful_user": "Rydych chi wedi dilysu %(displayName)s yn llwyddiannus!", - "timed_out": "Daeth y cyfnod dilysu i ben.", "unsupported_method": "Methu dod o hyd i ddull dilysu a gefnogir.", "unverified_session_toast_accept": "Ie, fi wnaeth", "unverified_session_toast_title": "Mewngofnod newydd. Ai chi oedd hwn?", "unverified_sessions_toast_description": "Adolygwch i sicrhau bod eich cyfrif yn ddiogel", "unverified_sessions_toast_reject": "Yn hwyrach", "unverified_sessions_toast_title": "Mae gennych sesiynau heb eu gwirio", - "verification_description": "Dilyswch eich hunaniaeth i gael mynediad at negeseuon wedi'u hamgryptio a phrofwch eich hunaniaeth i eraill. Os ydych hefyd yn defnyddio dyfais symudol, a fyddech cystal ag agor yr ap yno cyn i chi fynd ymlaen.", + "use_another_device": "Defnyddiwch ddyfais arall", + "use_recovery_key": "Defnyddiwch yr allwedd adfer", "verification_dialog_title_device": "Dilysu dyfais arall", + "verification_dialog_title_failed": "Methodd y dilysu", "verification_dialog_title_user": "Cais Dilysu", "verification_skip_warning": "Heb ddilysu, ni fydd gennych fynediad i'ch holl negeseuon a gallech ymddangos fel rhai nad ydych yn ymddiried ynddynt i eraill.", "verification_success_with_backup": "Mae eich dyfais newydd bellach wedi'i dilysu. Mae ganddo fynediad i'ch negeseuon wedi'u hamgryptio, a bydd defnyddwyr eraill yn ei ystyried yn rhai y mae modd ymddiried ynddynt.", @@ -1089,9 +1070,6 @@ "verify_emoji_prompt": "Gwiriwch trwy gymharu emoji unigryw.", "verify_emoji_prompt_qr": "Os na allwch sganio'r cod uchod, gwiriwch trwy gymharu emoji unigryw.", "verify_later": "Byddaf yn gwirio yn ddiweddarach", - "verify_using_device": "Gwiriwch gyda dyfais arall", - "verify_using_key": "Dilyswch gydag Allwedd Adfer", - "verify_using_key_or_phrase": "Dilyswch gydag Allwedd Adfer neu Ymadrodd", "waiting_for_user_accept": "Yn aros i %(displayName)s dderbyn…", "waiting_other_device": "Yn aros i chi wirio ar eich dyfais arall…", "waiting_other_device_details": "Yn aros i chi wirio ar eich dyfais arall, %(deviceName)s (%(deviceId)s)…", @@ -1141,6 +1119,7 @@ "tls": "Methu cysylltu â homeserver - gwiriwch eich cysylltedd, sicrhewch eich bod yn ymddiried yn nhystysgrif SSL eich gweinyddwr cartref , ac nad yw estyniad porwr yn rhwystro ceisiadau.", "unknown": "Gwall anhysbys", "unknown_error_code": "cod gwall anhysbys", + "update_history_visibility": "Methwyd newid gwelededd hanes", "update_power_level": "Wedi methu â newid lefel pŵer" }, "error_app_open_in_another_tab": "Newidiwch i'r tab arall i gysylltu â %(brand)s. Gellir cau'r tab hwn nawr.", @@ -1315,12 +1294,9 @@ "in_space": "Yn %(spaceName)s.", "in_space1_and_space2": "Mewn gofodau %(space1Name)s a %(space2Name)s.", "in_space_and_n_other_spaces": { - "zero": "Yn %(spaceName)s a %(count)s gofodau eraill.", - "one": "Yn %(spaceName)s ac un gofod arall", - "two": "Yn %(spaceName)s a %(count)s gofod arall.", - "few": "Yn %(spaceName)s a %(count)s gofod arall.", - "many": "Yn %(spaceName)s a %(count)s gofod arall.", - "other": "Yn %(spaceName)s a %(count)s gofod arall." + "Yn %(spaceName)s a %(count)s gofodau eraill.": "zero", + "Yn %(spaceName)s ac un gofod arall": "one", + "Yn %(spaceName)s a %(count)s gofod arall.": "other" }, "incompatible_browser": { "continue": "Parhau beth bynnag", @@ -1390,6 +1366,10 @@ "name_email_mxid_share_space": "Gwahoddwch rywun i ddefnyddio ei enw, cyfeiriad e-bost, enw defnyddiwr (fel ) neu rhannu'r gofod hwn.", "name_mxid_share_room": "Gwahoddwch rywun i ddefnyddio eu henw, enw defnyddiwr (fel ) neu rannu'r ystafell hon.", "name_mxid_share_space": "Gwahoddwch rywun i ddefnyddio eu henw, enw defnyddiwr (fel ) neu rhannu'r gofod hwn.", + "progress": { + "dont_close": "Peidiwch â chau'r ap nes ei fod wedi gorffen.", + "preparing": "Wrthi'n paratoi gwahoddiadau..." + }, "recents_section": "Sgyrsiau Diweddar", "room_failed_partial": "Rydym wedi anfon y lleill, ond nid oes modd gwahodd y bobl isod i ", "room_failed_partial_title": "Nid oedd modd anfon rhai gwahoddiadau", @@ -1412,20 +1392,13 @@ }, "inviting_user1_and_user2": "Yn gwahodd %(user1)s a %(user2)s", "inviting_user_and_n_others": { - "zero": "Yn gwahodd %(user)s ac un arall", - "one": "Yn gwahodd %(user)s ac un arall", - "two": "Yn gwahodd %(user)s a %(count)s arall", - "few": "Yn gwahodd %(user)s a %(count)s arall", - "many": "Yn gwahodd %(user)s a %(count)s arall", - "other": "Yn gwahodd %(user)s a %(count)s arall" + "Yn gwahodd %(user)s ac un arall": "one", + "Yn gwahodd %(user)s a %(count)s arall": "other" }, "items_and_n_others": { - "zero": " a dim arall", - "one": " ac un arall", - "two": " a %(count)s arall", - "few": " a %(count)s arall", - "many": " a %(count)s arall", - "other": " a %(count)s arall" + " a dim arall": "zero", + " ac un arall": "one", + " a %(count)s arall": "other" }, "keyboard": { "activate_button": "Agor y botwm hwn", @@ -1484,6 +1457,7 @@ "room_list_navigate_down": "Symud i lawr yn y rhestr ystafelloedd", "room_list_navigate_up": "Symud i fyny yn y rhestr ystafelloedd", "room_list_select_room": "Dewis ystafell o'r rhestr ystafelloedd", + "save": "Cadw", "scroll_down_timeline": "Sgrolio i lawr yn y llinell amser", "scroll_up_timeline": "Sgrolio i fyny yn y llinell amser", "search": "Chwilio (rhaid ei alluogi)", @@ -1565,6 +1539,9 @@ "render_reaction_images_description": "Weithiau'n cael eu hadnabod fel \"emojis cyfaddas\".", "report_to_moderators": "Adrodd i cymedrolwyr", "report_to_moderators_description": "Mewn ystafelloedd sy'n cefnogi cymedroli, bydd y botwm “Adrodd” yn gadael i chi adrodd ar gam-drin i gymedrolwyr ystafelloedd.", + "share_history_on_invite": "Rhannwch hanes wedi'i amgryptio gydag aelodau newydd", + "share_history_on_invite_description": "Wrth wahodd defnyddiwr i ystafell wedi'i hamgryptio sydd â gwelededd hanes wedi'i osod i \"rhannu\", rhannwch hanes wedi'i amgryptio gyda'r defnyddiwr hwnnw, a derbyniwch hanes wedi'i amgryptio pan gewch eich gwahodd i ystafell o'r fath.", + "share_history_on_invite_warning": "Mae'r nodwedd hon yn ARBROFOL ac nid yw pob rhagofal diogelwch wedi'i weithredu. Peidiwch â'i galluogi ar gyfrifon cynhyrchu.", "sliding_sync": "Modd Cydweddu Llithro", "sliding_sync_description": "Wrthi'n datblygu, nid oes modd ei analluogi.", "sliding_sync_disabled_notice": "Allgofnodwch a mewngofnodi i analluogi", @@ -1680,16 +1657,13 @@ }, "member_list": { "count": { - "zero": "%(count)s Aelodau", - "one": "%(count)s Aelod", - "two": "%(count)s Aelod", - "few": "%(count)s Aelod", - "many": "%(count)s Aelod", - "other": "%(count)s Aelod" + "%(count)s Aelodau": "zero", + "%(count)s Aelod": "other" }, "filter_placeholder": "Hidlo aelodau'r ystafell", "invite_button_no_perms_tooltip": "Nid oes gennych ganiatâd i wahodd defnyddwyr", "invited_label": "Gwahoddwyd", + "list_title": "Rhestr aelodau", "no_matches": "Dim cyfatebiaeth" }, "member_list_back_action_label": "Aelodau'r ystafell", @@ -1777,20 +1751,11 @@ "topic_placeholder": "Ysgrifennu rhywbeth…", "total_decryption_errors": "Oherwydd gwallau dadgryptio, efallai na fydd rhai pleidleisiau'n cael eu cyfrif", "total_n_votes": { - "zero": "%(count)s pleidlais wedi'u bwrw. Pleidleisiwch i weld y canlyniadau.", - "one": "%(count)s pleidlais wedi'i bwrw. Pleidleisiwch i weld y canlyniadau.", - "two": "%(count)s pleidlais wedi'u bwrw. Pleidleisiwch i weld y canlyniadau.", - "few": "%(count)s pleidlais wedi'u bwrw. Pleidleisiwch i weld y canlyniadau.", - "many": "%(count)s pleidlais wedi'u bwrw. Pleidleisiwch i weld y canlyniadau.", - "other": "%(count)s pleidlais wedi'u bwrw. Pleidleisiwch i weld y canlyniadau." + "%(count)s pleidlais wedi'u bwrw. Pleidleisiwch i weld y canlyniadau.": "other", + "%(count)s pleidlais wedi'i bwrw. Pleidleisiwch i weld y canlyniadau.": "one" }, "total_n_votes_voted": { - "zero": "Ar sail %(count)s pleidlais", - "one": "Ar sail %(count)s pleidlais", - "two": "Ar sail %(count)s pleidlais", - "few": "Ar sail %(count)s pleidlais", - "many": "Ar sail %(count)s pleidlais", - "other": "Ar sail %(count)s pleidlais" + "Ar sail %(count)s pleidlais": "other" }, "total_no_votes": "Dim pleidleisiau wedi'u bwrw", "total_not_ended": "Bydd y canlyniadau i'w gweld pan ddaw'r bleidlais i ben", @@ -1802,6 +1767,7 @@ }, "power_level": { "admin": "Gweinyddwr", + "creator": "Perchennog", "custom": "(%(level)s) cyfaddas", "custom_level": "Lefel Cyfaddas", "default": "Rhagosodedig", @@ -1865,7 +1831,7 @@ "toxic_behaviour": "Ymddygiad Gwenwynig" }, "report_room": { - "description": "Adroddwch ar yr ystafell hon i weinyddwr eich gweinydd cartref. Bydd hyn yn anfon ID unigryw'r ystafell, ond os yw negeseuon wedi'u hamgryptio, fydd y gweinyddwr ddim yn gallu eu darllen na gweld ffeiliau sy'n cael eu rhannu.", + "description": "Rhowch wybod am yr ystafell hon i ddarparwr eich cyfrif. Os yw'r neges wedi'i amgryptio, ni fydd eich gweinyddwr yn gallu eu darllen.", "reason_label": "Disgrifiwch y rheswm" }, "restore_key_backup_dialog": { @@ -1902,27 +1868,13 @@ "empty_description": "Dewiswch neges a dewiswch “%(pinAction)s” i'w chynnwys yma.", "empty_title": "Pinio negeseuon pwysig fel y mae modd eu darganfod yn hawdd", "header": { - "zero": "%(count)s Neges wedi'u pinio", - "one": "1 Neges wedi'i binio", - "two": "%(count)s Neges wedi'u pinio", - "few": "%(count)s Neges wedi'u pinio", - "many": "%(count)s Neges wedi'u pinio", - "other": "%(count)s Neges wedi'u pinio" + "%(count)s Neges wedi'u pinio": "other", + "1 Neges wedi'i binio": "one" }, "limits": { - "zero": "Dim ond hyd at %(count)s teclyn y gallwch eu pinio", - "one": "Dim ond hyd at %(count)s teclyn y gallwch eu pinio", - "two": "Dim ond hyd at %(count)s teclyn y gallwch eu pinio", - "few": "Dim ond hyd at %(count)s teclyn y gallwch eu pinio", - "many": "Dim ond hyd at %(count)s teclyn y gallwch eu pinio", - "other": "Dim ond hyd at %(count)s teclyn y gallwch eu pinio" + "Dim ond hyd at %(count)s teclyn y gallwch eu pinio": "other" }, "menu": "Agor dewislen", - "release_announcement": { - "close": "Iawn", - "description": "Dewch o hyd i'r holl negeseuon sydd wedi'u pinio yma. Rhedwch y cyrchwr dros unrhyw neges a dewiswch \"Pinio\" i'w hychwanegu.", - "title": "Pob neges newydd wedi'u pinio" - }, "reply_thread": "Ymateb i a neges edefyn", "unpin_all": { "button": "Dad-binio pob neges", @@ -1937,30 +1889,24 @@ "empty_active": "Nid oes unrhyw arolygon gweithredol yn yr ystafell hon", "empty_active_load_more": "Nid oes unrhyw arolygon gweithredol. Llwythwch fwy o arolygon barn y misoedd blaenorol", "empty_active_load_more_n_days": { - "zero": "Does dim polau gweithredol ar gyfer y dyddiau diwethaf. Llwythwch ragor o bolau i weld polau'r misoedd blaenorol", - "one": "Does dim polau gweithredol ar gyfer y diwrnod diwethaf. Llwythwch ragor o bolau i weld polau'r misoedd blaenorol", - "two": "Does dim polau gweithredol ar gyfer y %(count)s ddiwrnod diwethaf. Llwythwch ragor o bolau i weld polau'r misoedd blaenorol", - "few": "Does dim polau gweithredol ar gyfer y %(count)s diwrnod diwethaf. Llwythwch ragor o bolau i weld polau'r misoedd blaenorol", - "many": "Does dim polau gweithredol ar gyfer y %(count)s diwrnod diwethaf. Llwythwch ragor o bolau i weld polau'r misoedd blaenorol", - "other": "Does dim polau gweithredol ar gyfer y %(count)s diwrnod diwethaf. Llwythwch ragor o bolau i weld polau'r misoedd blaenorol" + "Does dim polau gweithredol ar gyfer y dyddiau diwethaf. Llwythwch ragor o bolau i weld polau'r misoedd blaenorol": "zero", + "Does dim polau gweithredol ar gyfer y diwrnod diwethaf. Llwythwch ragor o bolau i weld polau'r misoedd blaenorol": "one", + "Does dim polau gweithredol ar gyfer y %(count)s ddiwrnod diwethaf. Llwythwch ragor o bolau i weld polau'r misoedd blaenorol": "two", + "Does dim polau gweithredol ar gyfer y %(count)s diwrnod diwethaf. Llwythwch ragor o bolau i weld polau'r misoedd blaenorol": "other" }, "empty_past": "Nid oes arolygon o'r gorffennol yn yr ystafell hon", "empty_past_load_more": "Nid oes unrhyw arolygon o'r gorffennol. Llwythwch fwy o arolygon barn ar gyfer y misoedd blaenorol", "empty_past_load_more_n_days": { - "zero": "Does dim polau'r gorffennol ar gyfer y dyddiau diwethaf. Llwythwch ragor o bolau i weld polau'r misoedd blaenorol", - "one": "Does dim polau'r gorffennol ar gyfer y diwrnod diwethaf. Llwythwch ragor o bolau i weld polau'r misoedd blaenorol", - "two": "Does dim polau'r gorffennol ar gyfer y %(count)s ddiwrnod diwethaf. Llwythwch ragor o bolau i weld polau'r misoedd blaenorol", - "few": "Does dim polau'r gorffennol ar gyfer y %(count)s diwrnod diwethaf. Llwythwch ragor o bolau i weld polau'r misoedd blaenorol", - "many": "Does dim polau'r gorffennol ar gyfer y %(count)s diwrnod diwethaf. Llwythwch ragor o bolau i weld polau'r misoedd blaenorol", - "other": "Does dim polau'r gorffennol ar gyfer y %(count)s diwrnod diwethaf. Llwythwch ragor o bolau i weld polau'r misoedd blaenorol" + "Does dim polau'r gorffennol ar gyfer y dyddiau diwethaf. Llwythwch ragor o bolau i weld polau'r misoedd blaenorol": "zero", + "Does dim polau'r gorffennol ar gyfer y diwrnod diwethaf. Llwythwch ragor o bolau i weld polau'r misoedd blaenorol": "one", + "Does dim polau'r gorffennol ar gyfer y %(count)s ddiwrnod diwethaf. Llwythwch ragor o bolau i weld polau'r misoedd blaenorol": "two", + "Does dim polau'r gorffennol ar gyfer y %(count)s diwrnod diwethaf. Llwythwch ragor o bolau i weld polau'r misoedd blaenorol": "other" }, "final_result": { - "zero": "Canlyniadau terfynol yn seiliedig ar %(count)s pleidleisiau", - "one": "Canlyniadau terfynol yn seiliedig ar %(count)s pleidlais", - "two": "Canlyniadau terfynol yn seiliedig ar %(count)s bleidlais", - "few": "Canlyniadau terfynol yn seiliedig ar %(count)s pleidlais", - "many": "Canlyniadau terfynol yn seiliedig ar %(count)s phleidlais", - "other": "Canlyniadau terfynol yn seiliedig ar %(count)s pleidlais" + "Canlyniadau terfynol yn seiliedig ar %(count)s pleidleisiau": "zero", + "Canlyniadau terfynol yn seiliedig ar %(count)s pleidlais": "other", + "Canlyniadau terfynol yn seiliedig ar %(count)s bleidlais": "two", + "Canlyniadau terfynol yn seiliedig ar %(count)s phleidlais": "many" }, "load_more": "Llwytho mwy o arolygon barn", "loading": "Wrthi'n llwytho arolygon", @@ -1975,6 +1921,7 @@ "thread_list": { "context_menu_label": "Dewisiadau edafedd" }, + "title": "Panel dde", "video_room_chat": { "title": "Sgwrs" } @@ -2026,6 +1973,15 @@ "error_jump_to_date_not_found": "Nid oeddem yn gallu dod o hyd i ddigwyddiad yn edrych ymlaen o %(dateString)s. Ceisiwch ddewis dyddiad cynharach.", "error_jump_to_date_send_logs_prompt": "Cyflwynwch logiau dadfygio i'n helpu i ddod o hyd i'r broblem.", "error_jump_to_date_title": "Methu dod o hyd i ddigwyddiad ar y dyddiad hwnnw", + "face_pile_summary": { + "Y %(count)s personau rydych chi'n ei adnabod sydd eisoes wedi ymuno": "zero", + "Yr %(count)s person rydych chi'n ei adnabod sydd eisoes wedi ymuno": "one", + "Y %(count)s person rydych chi'n ei adnabod sydd eisoes wedi ymuno": "other" + }, + "face_pile_tooltip_label": { + "Gweld y cyfan o'r %(count)s aelod": "other", + "Gweld 1 aelod": "one" + }, "face_pile_tooltip_shortcut": "Gan gynnwys %(commaSeparatedMembers)s", "face_pile_tooltip_shortcut_joined": "Gan eich cynnwys chi, %(commaSeparatedMembers)s", "failed_determine_user": "Nid oes modd pennu pa ddefnyddiwr i'w anwybyddu gan fod y digwyddiad aelod wedi newid.", @@ -2033,6 +1989,11 @@ "forget_room": "Anghofiwch yr ystafell hon", "forget_space": "Anghofiwch y gofod hwn", "header": { + "n_people_asking_to_join": { + "%(count)s personau'n gofyn i ymuno": "zero", + "Yn gofyn i ymuno": "one", + "%(count)s person yn gofyn i ymuno": "other" + }, "room_is_public": "Mae'r ystafell hon yn gyhoeddus" }, "header_avatar_open_settings_label": "Agor gosodiadau ystafell", @@ -2043,7 +2004,9 @@ "inaccessible_subtitle_1": "Ceisiwch eto yn nes ymlaen, neu gofynnwch i weinyddwr ystafell neu ofod wirio a oes gennych fynediad.", "inaccessible_subtitle_2": "Cafodd %(errcode)s ei ddychwelyd wrth geisio cael mynediad i'r ystafell neu'r gofod. Os ydych yn meddwl eich bod yn gweld y neges hon ar gam, cyflwynwch adroddiad gwall.", "intro": { + "display_topic": "Pwnc: ", "dm_caption": "Dim ond y ddau ohonoch sydd yn y sgwrs hon, oni bai bod y naill neu'r llall ohonoch yn gwahodd unrhyw un i ymuno.", + "edit_topic": "Pwnc: (golygu)", "enable_encryption_prompt": "Galluogi amgryptio yn y gosodiadau.", "encrypted_3pid_dm_pending_join": "Unwaith y bydd pawb wedi ymuno, byddwch yn gallu sgwrsio", "no_avatar_label": "Ychwanegwch lun, fel bod pobl yn gallu gweld eich ystafell yn hawdd.", @@ -2053,8 +2016,6 @@ "send_message_start_dm": "Anfonwch eich neges gyntaf i wahodd i sgwrsio", "start_of_dm_history": "Dyma ddechrau eich hanes neges uniongyrchol gyda .", "start_of_room": "Dyma ddechrau .", - "topic": "Pwnc: %(topic)s ", - "topic_edit": "Pwnc: %(topic)s ( golygu )", "unencrypted_warning": "Nid yw amgryptio pen-i-ben wedi'i alluogi", "user_created": "Creodd %(displayName)s yr ystafell hon.", "you_created": "Chi sydd wedi creu'r ystafell hon." @@ -2109,8 +2070,9 @@ "pinned_message_banner": { "button_close_list": "Cau'r rhestr", "button_view_all": "Gweld popeth", - "description": "Mae negeseuon wedi'u pinio yn yr ystafell hon. Cliciwch i'w gweld.", - "go_to_message": "Gweld y neges sydd wedi'i phinnio yn y llinell amser.", + "description": "Negeseuon wedi'u pinio", + "go_to_newest_message": "Gweld y neges wedi'i phinio yn y llinell amser a'r neges newydd wedi'i phinio yma", + "go_to_next_message": "Gweld y neges wedi'i phinio yn y llinell amser a'r neges hynaf nesaf wedi'i phinio yma", "title": "%(index)s o %(length)s Neges wedi'u pinio" }, "read_topic": "Cliciwch i ddarllen y pwnc", @@ -2121,6 +2083,10 @@ "search": { "all_rooms_button": "Chwiliwch bob ystafell", "placeholder": "Chwilio negeseuon…", + "summary": { + "%(count)s canlyniad wedi'u canfod ar gyfer “\"": "other", + "1 canlyniad wedi'i ganfod ar gyfer “\"": "one" + }, "this_room_button": "Chwiliwch yr ystafell hon" }, "status_bar": { @@ -2136,6 +2102,11 @@ "some_messages_not_sent": "Nid yw rhai o'ch negeseuon wedi'u hanfon" }, "unknown_status_code_for_timeline_jump": "cod statws anhysbys", + "unread_notifications_predecessor": { + "Does gennych %(count)s hysbysiad heb eu darllen mewn fersiwn flaenorol o'r ystafell hon": "zero", + "Mae gennych %(count)s hysbysiad heb ei ddarllen mewn fersiwn flaenorol o'r ystafell hon.": "one", + "Mae gennych %(count)s hysbysiad heb eu darllen mewn fersiwn flaenorol o'r ystafell hon": "other" + }, "upgrade_error_description": "Gwiriwch ddwywaith bod eich gweinydd yn cefnogi'r fersiwn ystafell a ddewiswyd a rhowch gynnig arall arni.", "upgrade_error_title": "Gwall wrth uwchraddio'r ystafell", "upgrade_warning_bar": "Bydd uwchraddio'r ystafell hon yn cau enghraifft bresennol yr ystafell ac yn creu ystafell wedi'i huwchraddio gyda'r un enw.", @@ -2143,6 +2114,9 @@ "upgrade_warning_bar_unstable": "Mae'r ystafell hon yn fersiwn ystafell redeg , y mae'r gweinydd cartref hwn wedi'i nodi'n ansefydlog.", "upgrade_warning_bar_upgraded": "Mae'r ystafell hon eisoes wedi'i huwchraddio.", "upload": { + "uploading_multiple_file": { + "Wrthi'n llwytho i fyny %(filename)s a %(count)s arall": "other" + }, "uploading_single_file": "Wrthi'n llwytho %(filematere)s" }, "video_room": "Mae'r ystafell hon yn ystafell fideo", @@ -2183,10 +2157,13 @@ "mentions": "Crybwylliadau", "people": "Pobl", "rooms": "Ystafelloedd", - "unread": "Heb ei ddarllen" + "unread": "Heb eu darllen" }, "home_menu_label": "Dewisiadau cartref", "join_public_room_label": "Ymuno â'r ystafell gyhoeddus", + "joining_rooms_status": { + "Yn ymuno â %(count)s ystafell ar hyn o bryd": "other" + }, "list_title": "Rhestr ystafelloedd", "more_options": { "copy_link": "Copïo dolen ystafell", @@ -2199,12 +2176,38 @@ "notification_options": "Dewisiadau hysbysu", "open_space_menu": "Agor dewislen gofod", "primary_filters": "Hidlau rhestr ystafelloedd", + "redacting_messages_status": { + "Yn tynnu negeseuon mewn %(count)s ystafell": "other" + }, + "release_announcement": { + "done": "Gorffen", + "filter": { + "description": "Hidlo eich sgyrsiau gydag un clic. Ehangu i weld mwy o hidlwyr.", + "title": "Hidlwyr cyflym newydd" + }, + "intro": { + "description": "Mae'r rhestr sgyrsiau wedi'i diweddaru i fod yn gliriach ac yn symlach i'w defnyddio.", + "title": "Mae gan Sgyriau olwg newydd!" + }, + "next": "Nesaf", + "settings": { + "description": "I ddangos neu guddio rhagolygon negeseuon, ewch i Bob gosodiad > Dewisiadau > Rhestr ystafelloedd", + "title": "Mae rhai gosodiadau wedi symud" + }, + "sort": { + "description": "Newid trefn eich sgyrsiau o'r mwyaf diweddar i A-Z", + "title": "Trefnwch eich sgyrsiau" + } + }, "room": { "more_options": "Rhagor o Ddewisiadau", "open_room": "Agor ystafell %(roomName)s" }, "room_options": "Dewisiadau Ystafelloedd", "show_less": "Dangos llai", + "show_n_more": { + "Dangos %(count)s yn rhagor": "other" + }, "show_previews": "Dangos rhagolwg o negeseuon", "sort": "Trefnu", "sort_by": "Trefnu yn ôl", @@ -2384,6 +2387,10 @@ "users_default": "Rôl rhagosodedig" }, "security": { + "cannot_change_to_private_due_to_missing_history_visiblity_permissions": { + "description": "Nid oes gennych ganiatâd i newid gwelededd hanes yr ystafell. Mae hyn yn beryglus gan y gallai ganiatáu i ddefnyddwyr sydd heb ymuno ddarllen negeseuon.", + "title": "Nid oes modd gwneud yr ystafell yn breifat" + }, "enable_encryption_confirm_description": "Unwaith y bydd wedi'i alluogi, nid oes modd analluogi amgryptio ar gyfer ystafell. Fydd y gweinydd ddim yn gallu gweld negeseuon wedi'u hanfon mewn ystafell wedi'i hamgryptio, dim ond cyfranogwyr yr ystafell. Gall galluogi amgryptio atal llawer o fotiau a phontydd rhag gweithio'n gywir. Dysgu rhagor am amgryptio.", "enable_encryption_confirm_title": "Galluogi amgryptio?", "enable_encryption_public_room_confirm_description_1": "Nid yw'n cael ei argymell i ychwanegu amgryptio i ystafelloedd cyhoeddus. Gall unrhyw un ddod o hyd i ystafelloedd cyhoeddus ac ymuno â nhw, felly gall unrhyw un ddarllen negeseuon ynddynt. Chewch chi ddim unrhyw un o fanteision amgryptio, nac yn gallu ei ddiffodd yn ddiweddarach. Bydd amgryptio negeseuon mewn ystafell gyhoeddus yn gwneud derbyn ac anfon negeseuon yn arafach.", @@ -2401,7 +2408,7 @@ "history_visibility_joined": "Aelodau yn unig (ers iddynt ymuno)", "history_visibility_legend": "Pwy all ddarllen hanes?", "history_visibility_shared": "Aelodau yn unig (ers yr adeg pan ddewiswyd yr opsiwn hwn)", - "history_visibility_warning": "Dim ond i negeseuon yn y dyfodol yn yr ystafell hon y bydd newidiadau i bwy all ddarllen hanes yn berthnasol. Ni fydd amlygrwydd yr hanes presennol yn newid.", + "history_visibility_warning": "Ni fydd gwelededd hanes presennol yn cael ei newid.", "history_visibility_world_readable": "Unrhyw un", "join_rule_description": "Penderfynwch pwy all ymuno â %(roomName)s.", "join_rule_invite": "Preifat (gwahoddiad yn unig)", @@ -2423,11 +2430,27 @@ "join_rule_restricted_dialog_heading_space": "Gofodau rydych yn eu hadnabod sy'n cynnwys y gofod hwn", "join_rule_restricted_dialog_heading_unknown": "Mae'r rhain yn debygol o fod yn rhai y mae gweinyddwyr ystafell eraill yn rhan ohonyn nhw.", "join_rule_restricted_dialog_title": "Dewiswch ofodau", + "join_rule_restricted_n_more": { + "a %(count)s yn rhagor": "other" + }, + "join_rule_restricted_summary": { + "Ar hyn o bryd, mae gan %(count)s gofod fynediad": "other", + "Ar hyn o bryd, mae gan ofod fynediad": "one" + }, "join_rule_restricted_upgrade_description": "Bydd yr uwchraddiad hwn yn caniatáu i aelodau o ofodau penodol gael mynediad i'r ystafell hon heb wahoddiad.", "join_rule_restricted_upgrade_warning": "Mae'r ystafell hon mewn rhai gofodau nad ydych chi'n weinyddwr iddynt. Yn y gofodau hynny, bydd yr hen ystafell yn dal i gael ei dangos, ond bydd pobl yn cael eu hannog i ymuno â'r un newydd.", "join_rule_upgrade_awaiting_room": "Wrthi'n llwytho ystafell newydd", "join_rule_upgrade_required": "Angen uwchraddio", + "join_rule_upgrade_sending_invites": { + "Yn anfon gwahoddiad... (%(progress)s o %(count)s)": "other", + "Yn anfon gwahoddiad...": "one" + }, + "join_rule_upgrade_updating_spaces": { + "Yn diweddaru gofod... (%(progress)s o %(count)s)": "other", + "Yn diweddaru gofod...": "one" + }, "join_rule_upgrade_upgrading_room": "Ystafell uwchraddio", + "join_rule_world_readable_description": "Bydd newid pwy all ymuno â'r ystafell yn newid gwelededd negeseuon yn y dyfodol hefyd.", "public_without_alias_warning": "I gysylltu â'r ystafell hon, ychwanegwch gyfeiriad.", "publish_room": "Gwnewch yr ystafell hon yn weladwy yn y cyfeiriadur ystafelloedd cyhoeddus.", "publish_space": "Gwnewch y gofod hwn yn weladwy yn y cyfeiriadur ystafelloedd cyhoeddus.", @@ -2566,6 +2589,7 @@ "breadcrumb_second_description": "Byddwch yn colli unrhyw hanes neges sydd wedi'i storio ar y gweinydd yn unig", "breadcrumb_third_description": "Bydd angen i chi wirio'ch holl ddyfeisiau a chysylltiadau presennol eto", "breadcrumb_title": "Ydych chi'n siŵr eich bod am ailosod eich hunaniaeth?", + "breadcrumb_title_cant_confirm": "Mae angen i chi ailosod eich hunaniaeth", "breadcrumb_title_forgot": "Wedi anghofio eich allwedd adfer? Bydd angen i chi ailosod eich hunaniaeth.", "breadcrumb_title_sync_failed": "Wedi methu cysoni storfa allwedd. Mae angen i chi ailosod eich hunaniaeth.", "breadcrumb_warning": "Gwnewch hyn dim ond os ydych chi'n credu bod eich cyfrif wedi'i beryglu.", @@ -2574,7 +2598,7 @@ "export_keys": "Allforio allweddi", "import_keys": "Mewnforio bysellau", "other_people_device_description": "Rhybudd: fydd defnyddwyr sydd heb eu gwirio'n benodol gyda chi (e.e. gan ddefnyddio emoji) yn derbyn eich negeseuon wedi'u hamgryptio. Hefyd, fydd dyfeisiau defnyddwyr sydd wedi'u gwirio heb eu gwirio ddim yn derbyn eich negeseuon wedi'u hamgryptio.", - "other_people_device_label": "Peidiwch byth ag anfon negeseuon wedi'u hamgryptio i ddyfeisiau heb eu gwirio", + "other_people_device_label": "Mewn ystafelloedd amgryptiedig, anfonwch negeseuon ddim ond at ddefnyddwyr wedi'u gwirio", "other_people_device_title": "Dyfeisiau pobl eraill", "reset_identity": "Ailosod hunaniaeth cryptograffig", "reset_in_progress": "Wrthi'n ailosod...", @@ -2886,6 +2910,9 @@ "key_backup_algorithm": "Algorithm:", "message_search_disable_warning": "Os yw wedi'i analluogi, ni fydd negeseuon o ystafelloedd wedi'u hamgryptio yn ymddangos yn y canlyniadau chwilio.", "message_search_disabled": "Cadwch negeseuon wedi'u hamgryptio'n ddiogel yn lleol er mwyn iddyn nhw ymddangos yn y canlyniadau chwilio.", + "message_search_enabled": { + "Cadw negeseuon wedi'u hamgryptio yn ddiogel yn y storfa leol er mwyn iddyn nhw ymddangos mewn canlyniadau chwilio, gan ddefnyddio %(size)s i storio negeseuon o %(rooms)s ystafell.": "other" + }, "message_search_failed": "Methwyd cychwyn chwiliad neges", "message_search_indexed_messages": "Negeseuon wedi'u mynegeio:", "message_search_indexed_rooms": "Ystafelloedd wedi'u mynegeio:", @@ -2900,7 +2927,7 @@ "message_search_unsupported_web": "Ni all %(brand)s storio negeseuon wedi'u hamgryptio'n ddiogel yn lleol tra'n rhedeg mewn porwr gwe. Defnydd %(brand)s Bwrdd Gwaith i negeseuon wedi'u hamgryptio ymddangos yn y canlyniadau chwilio.", "record_session_details": "Cofnodwch enw'r cleient, y fersiwn, a'r url i adnabod sesiynau'n haws yn y rheolwr sesiwn", "send_analytics": "Anfon data dadansoddeg", - "strict_encryption": "Peidio byth anfon negeseuon wedi'u hamgryptio i sesiynau heb eu gwirio o'r sesiwn hon" + "strict_encryption": "Anfon negeseuon dim ond at ddefnyddwyr sydd wedi'u dilysu" }, "send_read_receipts": "Anfon derbynebau darllen", "send_read_receipts_unsupported": "Nid yw eich gweinydd yn cefnogi analluogi anfon derbynebau wedi'u darllen.", @@ -2908,6 +2935,22 @@ "sessions": { "best_security_note": "Er mwyn sicrhau'r diogelwch gorau, gwiriwch eich sesiynau ac allgofnodwch o unrhyw sesiwn nad ydych yn ei hadnabod nac yn ei defnyddio mwyach.", "browser": "Porwr", + "confirm_sign_out": { + "Cadarnhau allgofnodi o'r ddyfeisiau hyn": "other", + "Cadarnhau allgofnodi o'r ddyfais hon": "one" + }, + "confirm_sign_out_body": { + "Cliciwch y botwm isod i gadarnhau allgofnodi o'r dyfeisiau hyn.": "other", + "Cliciwch y botwm isod i gadarnhau allgofnodi o'r ddyfais hon.": "one" + }, + "confirm_sign_out_continue": { + "Allgofnodi o ddyfeisiau": "other", + "Allgofnodi o ddyfais": "one" + }, + "confirm_sign_out_sso": { + "Cadarnhau allgofnodi o'r ddyfeisiau hyn trwy ddefnyddio Mewngofnodi Sengl i brofi pwy ydych chi.": "other", + "Cadarnhau allgofnodi o'r ddyfais hon trwy ddefnyddio Mewngofnodi Sengl i brofi pwy ydych chi.": "one" + }, "current_session": "Y sesiwn gyfredol", "desktop_session": "Sesiwn bwrdd gwaith", "details_heading": "Manylion y sesiwn", @@ -2934,6 +2977,10 @@ "last_activity": "Gweithgaredd ddiwethaf", "manage": "Rheoli'r sesiwn hon", "mobile_session": "Sesiwn symudol", + "n_sessions_selected": { + "%(count)s sesiwn wedi'u dewis": "other", + "%(count)s sesiwn wedi'i ddewis": "one" + }, "no_inactive_sessions": "Heb ganfod unrhyw sesiynau anweithredol.", "no_sessions": "Heb ganfod sesiynau.", "no_unverified_sessions": "Heb ganfod unrhyw sesiynau heb eu gwirio.", @@ -2958,6 +3005,12 @@ "sign_in_with_qr_unsupported": "Nid yw'n cael ei gefnogi gan ddarparwr eich cyfrif", "sign_out": "Allgofnodwch o'r sesiwn hon", "sign_out_all_other_sessions": "Allgofnodi o bob sesiwn arall (%(otherSessionsCount)s)", + "sign_out_confirm_description": { + "Ydych chi'n siŵr eich bod chi eisiau allgofnodi o %(count)s sesiwn?": "other" + }, + "sign_out_n_sessions": { + "Allgofnodi o %(count)s sesiwn": "other" + }, "title": "Sesiynau", "unknown_session": "Math o sesiwn anhysbys", "unverified_session": "Sesiwn heb ei wirio", @@ -3131,7 +3184,7 @@ "upgraderoom": "Yn uwchraddio ystafell i fersiwn newydd", "upgraderoom_permission_error": "Nid oes gennych y caniatâd gofynnol i ddefnyddio'r gorchymyn hwn.", "usage": "Defnydd", - "verify": "Yn dilysu defnyddiwr, sesiwn, a pubkey tuple", + "verify": "Yn dilysu â llaw un o'ch defnyddwyr", "view": "Ystafell golygfeydd gyda chyfeiriad a roddwyd", "whois": "Yn arddangos gwybodaeth am ddefnyddiwr" }, @@ -3142,6 +3195,10 @@ "create_prompt": "Creu ystafell newydd", "dm_heading": "Negeseuon Uniongyrchol", "error_heading": "Ni ychwanegwyd pob un a ddewiswyd", + "progress_text": { + "Yn ychwanegu ystafell...(%(progress)s o %(count)s)": "other", + "Yn ychwanegu ystafell...": "one" + }, "space_dropdown_label": "Dewis gofod", "space_dropdown_title": "Ychwanegu ystafelloedd presennol", "subspace_moved_note": "Mae ychwanegu gofodau wedi symud." @@ -3224,6 +3281,9 @@ "cant_find_person_helpful_hint": "Os na allwch weld pwy rydych yn chwilio amdano, anfonwch eich dolen wahoddiad atynt.", "cant_find_room_helpful_hint": "Os na allwch ddod o hyd i'r ystafell yr ydych yn chwilio amdani, gofynnwch am wahoddiad neu crëwch ystafell newydd.", "copy_link_text": "Copïo dolen y gwahoddiad", + "count_of_members": { + "%(count)s Aelod": "other" + }, "create_new_room_button": "Creu ystafell newydd", "failed_querying_public_rooms": "Wedi methu â holi ystafelloedd cyhoeddus", "failed_querying_public_spaces": "Wedi methu cwestiynu gofodau cyhoeddus", @@ -3274,6 +3334,9 @@ "threads": { "all_threads": "Pob edefyn", "all_threads_description": "Yn dangos pob edefyn o'r ystafell gyfredol", + "count_of_reply": { + "%(count)s ateb": "other" + }, "empty_description": "Defnyddio “%(replyInThread)s” wrth hofran dros neges.", "empty_title": "Mae edafedd yn helpu i gadw'ch sgyrsiau ar y pwnc ac yn hawdd eu holrhain.", "error_start_thread_existing_relation": "Methu â chreu edefyn o ddigwyddiad gyda pherthynas sy'n bodoli eisoes", @@ -3334,7 +3397,7 @@ "historical_event_no_key_backup": "Nid yw negeseuon hanesyddol ar gael ar y ddyfais hon", "historical_event_unverified_device": "Mae angen i chi wirio'r ddyfais hon ar gyfer mynediad i negeseuon hanesyddol", "historical_event_user_not_joined": "Nid oes gennych fynediad i'r neges hon", - "sender_identity_previously_verified": "Mae hunaniaeth yr anfonwr wedi'i wirio wedi newid", + "sender_identity_previously_verified": "Cafodd hunaniaeth yr anfonwr ei hailosod", "sender_unsigned_device": "Wedi'i anfon o ddyfais ansicr.", "unable_to_decrypt": "Methu dadgryptio'r neges" }, @@ -3361,6 +3424,7 @@ "unable_to_find": "Wedi ceisio llwytho pwynt penodol yn llinell amser yr ystafell hon, ond ni lwyddodd i ddod o hyd iddo." }, "m.audio": { + "audio_player": "Chwaraewr sain", "error_downloading_audio": "Gwall wrth llwytho i lawrsain", "error_processing_audio": "Gwall wrth brosesu neges sain", "error_processing_voice_message": "Gwall wrth brosesu neges llais", @@ -3415,6 +3479,11 @@ "location": "Wedi rhannu lleoliad: ", "self_location": "Wedi rhannu eu lleoliad: " }, + "m.poll": { + "count_of_votes": { + "%(count)s pleidlais": "other" + } + }, "m.poll.end": { "ended": "Daeth arolwg i ben", "sender_ended": "Mae %(senderName)s wedi dod ag arolwg i ben" @@ -3427,6 +3496,14 @@ "removed": "Mae %(senderDisplayName)s wedi tynnu afatar yr ystafell." }, "m.room.canonical_alias": { + "alt_added": { + "Mae %(senderName)s wedi ychwanegu cyfeiriadau eraill %(addresses)s ar gyfer yr ystafell hon.": "other", + "Mae %(senderName)s wedi ychwanegu cyfeiriad arall %(addresses)s ar gyfer yr ystafell hon.": "one" + }, + "alt_removed": { + "Mae %(senderName)s wedi tynnu cyfeiriadau eraill %(addresses)s ar gyfer yr ystafell hon.": "other", + "Mae %(senderName)s wedi tynnu cyfeiriad arall %(addresses)s ar gyfer yr ystafell hon.": "one" + }, "changed": "Newidiodd %(senderName)s y cyfeiriadau ar gyfer yr ystafell hon.", "changed_alternative": "Mae %(senderName)s wedi newid y cyfeiriadau amgen ar gyfer yr ystafell hon.", "changed_main_and_alternative": "Newidiodd %(senderName)s y prif gyfeiriadau a chyfeiriadau amgen ar gyfer yr ystafell hon.", @@ -3578,6 +3655,9 @@ "label": "Ymatebodd %(reactors)s gyda %(content)s", "tooltip_caption": "wedi ymateb gyda %(shortName)s" }, + "read_receipt_title": { + "Wedi'i weld gan %(count)s person": "other" + }, "read_receipts_label": "Derbynebau darllen", "redacted": { "tooltip": "Neges wedi'i dileu ar %(date)s" @@ -3598,11 +3678,63 @@ "send_state_sending": "Wrthi'n anfon eich neges…", "send_state_sent": "Anfonwyd eich neges", "summary": { + "banned": { + "wedi'u gwahardd": "zero", + "wedi'i wahardd": "one", + "wedi'u gwahardd %(count)s gwaith": "other" + }, + "banned_multiple": { + "wedi'u gwahardd": "zero", + "wedi'i wahardd": "one", + "wedi'u gwahardd %(count)s gwaith": "other" + }, + "changed_avatar": { + "Does %(count)s %(oneUser)s wedi newid eu llun proffil": "zero", + "Mae %(oneUser)s wedi newid eu llun proffil %(count)s gwaith": "other" + }, + "changed_avatar_multiple": { + "Does %(count)s o %(severalUsers)s wedi newid eu llun proffil": "zero", + "Mae %(severalUsers)s wedi newid ei lun proffil": "one", + "Mae %(severalUsers)s wedi newid eu llun proffil %(count)s gwaith": "other" + }, + "changed_name": { + "Mae %(oneUser)s wedi newid ei enw %(count)s gwaith": "other", + "Mae %(oneUser)s wedi newid ei enw": "one" + }, + "changed_name_multiple": { + "Mae %(severalUsers)s wedi newid eu henwau %(count)s gwaith": "other", + "Mae %(severalUsers)s wedi newid ei enw": "one" + }, "format": "%(matereList)s %(transitionList)s", + "hidden_event": { + "Anfonodd %(oneUser)s %(count)s negeseuon cudd": "zero", + "Anfonodd %(oneUser)s neges gudd": "one", + "Anfonodd %(oneUser)s %(count)s neges gudd": "other" + }, + "hidden_event_multiple": { + "Anfonodd %(severalUsers)s %(count)s negeseuon cudd ": "zero", + "Anfonodd %(severalUsers)s neges gudd": "one", + "Anfonodd %(severalUsers)s %(count)s neges gudd": "other" + }, + "invite_withdrawn": { + "Mae %(oneUser)swedi cael eu gwahoddiadau wedi'i dynnu'n ôl": "zero", + "Mae %(oneUser)swedi cael ei gwahoddiad wedi'i dynnu'n ôl": "one", + "Mae %(oneUser)swedi cael eu gwahoddiad wedi'i dynnu'n ôl %(count)s gwaith": "other" + }, "invite_withdrawn_multiple": { "Cafodd %(severalUsers)s eu gwahoddiadau eu dileu": "one", "Cafodd %(severalUsers)s eu gwahoddiadau eu dileu %(count)s gwaith": "other" }, + "invited": { + "wedi'u gwahodd": "zero", + "wedi'i wahodd": "one", + "wedi'u gwahodd %(count)s gwaith": "other" + }, + "invited_multiple": { + "wedi'u gwahodd": "zero", + "wedi'i wahodd": "one", + "wedi'u gwahodd %(count)s gwaith": "other" + }, "joined": { "Ymunodd %(oneUser)s %(count)s gwaith": "other", "Ymunodd %(oneUser)s": "one" @@ -3618,6 +3750,14 @@ "Ymunodd %(severalUsers)s": "zero", "Ymunodd %(severalUsers)s %(count)s gwaith": "other" }, + "kicked": { + "wedi'u tynnu %(count)s gwaith": "other", + "wedi'u tynnu": "one" + }, + "kicked_multiple": { + "wedi'u tynnu %(count)s gwaith": "other", + "wedi'u tynnu": "one" + }, "left": { "Gadawodd %(oneUser)s": "one", "Gadawodd %(oneUser)s %(count)s gwaith": "other" @@ -3626,6 +3766,30 @@ "Gadawodd %(severalUsers)s": "one", "Gadawodd %(severalUsers)s %(count)s gwaith": "other" }, + "no_change": { + "Dyw %(oneUser)s heb wneud unrhyw newidiadau %(count)s gwaith": "other", + "Dyw %(oneUser)s heb wneud unrhyw newidiadau": "one" + }, + "no_change_multiple": { + "Dyw %(severalUsers)s heb wneud unrhyw newidiadau %(count)s gwaith": "other", + "Dyw %(severalUsers)s heb wneud unrhyw newidiadau": "one" + }, + "pinned_events": { + "Newidiodd %(oneUser)s y negeseuon wedi'u pinio yr ystafell %(count)s gwaith": "other", + "Newidiodd %(oneUser)s y negeseuon wedi'u pinio yr ystafell": "one" + }, + "pinned_events_multiple": { + "Newidiodd %(severalUsers)s y negeseuon wedi'u pinio yr ystafell %(count)s gwaith": "other", + "Newidiodd %(severalUsers)s y negeseuon wedi'u pinio yr ystafell": "one" + }, + "redacted": { + "Tynnodd %(oneUser)s %(count)s neges": "other", + "Tynnodd %(oneUser)s neges": "one" + }, + "redacted_multiple": { + "Tynnodd %(severalUsers)s %(count)s neges": "other", + "Tynnodd %(severalUsers)s neges": "one" + }, "rejected_invite": { "Gwrthododd %(severalUsers)s eu gwahoddiadau": "zero", "Gwrthododd %(oneUser)s ei wahoddiad": "one", @@ -3642,6 +3806,23 @@ "rejoined_multiple": { "Ymunodd a gadawodd %(severalUsers)s": "one", "Ymunodd a gadawodd %(severalUsers)s %(count)s gwaith": "other" + }, + "server_acls": { + "Mae %(oneUser)s wedi newid ACLs y gweinydd %(count)s gwaith": "other", + "Mae %(oneUser)s wedi newid ACLs y gweinydd": "one" + }, + "server_acls_multiple": { + "Mae %(severalUsers)s wedi newid ACLs y gweinydd %(count)s gwaith": "other", + "Mae %(severalUsers)s wedi newid ACLs y gweinydd": "one" + }, + "unbanned": { + "wedi'u dadwahardd %(count)s gwaith": "other", + "wedi'u dadwahardd": "one" + }, + "unbanned_multiple": { + "wedi'u dadwahardd %(count)s gwaith\n ": "zero", + "wedi'i ddadwahardd": "one", + "wedi'u dadwahardd %(count)s gwaith": "other" } }, "thread_info_basic": "O edefyn", @@ -3655,9 +3836,15 @@ }, "undecryptable_tooltip": "Nid oedd modd dadgryptio'r neges hon", "url_preview": { - "close": "Cau rhagolwg" + "close": "Cau rhagolwg", + "show_n_more": { + "Dangos %(count)s rhagolwg arall": "other" + } } }, + "truncated_list_n_more": { + "A %(count)s yn rhagor...": "other" + }, "unsupported_browser": { "description": "Os byddwch yn parhau, efallai na fydd rhai nodweddion yn gweithio ac mae risg y gallech golli data yn y dyfodol. Diweddarwch eich porwr i barhau i ddefnyddio %(brand)s.", "title": "Nid yw %(brand)s yn cefnogi'r porwr hwn" @@ -3680,11 +3867,11 @@ "unavailable": "Dim ar gael" }, "update_room_access_modal": { - "description": "I greu dolen rhannu, mae angen i chi ganiatáu i westeion ymuno â'r ystafell hon. Gall hyn wneud yr ystafell yn llai diogel. Pan fyddwch wedi gorffen gyda'r alwad, gallwch wneud yr ystafell yn breifat eto.", - "dont_change_description": "Fel arall, gallwch gynnal yr alwad mewn ystafell ar wahân.", + "description": "I greu dolen rhannu, gwnewch yr ystafell hon yn un cyhoeddus neu alluogi'r dewis i ddefnyddwyr ofyn i ymuno Mae hyn yn caniatáu i westeion ymuno heb gael eu gwahodd.", + "dont_change_description": "Os nad ydych chi eisiau newid mynediad i'r ystafell hon, gallwch greu ystafell newydd ar gyfer dolen yr alwad.", "no_change": "Dydw i ddim eisiau newid y lefel mynediad.", - "revert_access_description": "(Mae modddychwelyd hwn i'r gwerth blaenorol yng Ngosodiadau'r Ystafell: Diogelwch a Phreifatrwydd / Mynediad )", - "title": "Newid lefel mynediad yr ystafell" + "revert_access_description": "(Mae modddychwelyd hwn i'r gwerth blaenorol yng Ngosodiadau'r Ystafell: Diogelwch a Phreifatrwydd / Mynediad )", + "title": "Caniatáu i westeion ymuno â'r ystafell hon" }, "upload_failed_generic": "Methodd y ffeil '%(fileName)s' â llwytho i fyny.", "upload_failed_size": "Mae'r ffeil '%(fileName)s' yn fwy na chyfyngiad maint llwytho'r gweinydd cartref", @@ -3698,7 +3885,10 @@ "not_image": "Nid yw'r ffeil rydych chi wedi'i dewis yn ffeil delwedd ddilys.", "title": "Llwytho ffeiliau", "title_progress": "Llwytho ffeiliau (%(current)s o %(total)s)", - "upload_all_button": "Llwytho'r cyfan" + "upload_all_button": "Llwytho'r cyfan", + "upload_n_others_button": { + "Llwytho %(count)s ffeil arall": "other" + } }, "user_info": { "admin_tools_section": "Offer Gweinyddol", @@ -3736,6 +3926,13 @@ "kick_space_warning": "Byddan nhw'n dal i allu cael mynediad at beth bynnag nad ydych yn weinyddwr iddo.", "promote_warning": "Fyddwch chi ddim yn gallu dadwneud y newid hwn gan eich bod yn hyrwyddo'r defnyddiwr i gael yr un lefel pŵer â chi'ch hun.", "redact": { + "confirm_button": { + "Tynnu %(count)s neges": "other", + "Tynnu 1 neges": "one" + }, + "confirm_description_1": { + "Rydych chi ar fin tynnu %(count)s neges gan %(user)s. Bydd hyn yn eu tynnu'n barhaol i bawb yn y sgwrs. ​​Ydych chi am barhau?": "other" + }, "confirm_description_2": "Ar gyfer llawer iawn o negeseuon, gallai hyn gymryd peth amser. Peidiwch ag adnewyddu eich cleient yn y cyfamser.", "confirm_keep_state_explainer": "Dad-diciwch a ydych hefyd am ddileu negeseuon system ar y defnyddiwr hwn (e.e. newid aelodaeth, newid proffil…)", "confirm_keep_state_label": "Cadw negeseuon system", @@ -3792,6 +3989,7 @@ "connection_lost": "Mae cysylltedd â'r gweinydd wedi'i golli", "connection_lost_description": "Allwch chi ddim osod galwadau heb gysylltiad â'r gweinydd.", "consulting": "Ymgynghori â %(transferTarget)s. Trosglwyddo i %(transferee)s", + "decline_call": "Gwrthod", "default_device": "Dyfais Rhagosodedig", "dial": "Deial", "dialpad": "Pad Deialu", @@ -3825,6 +4023,10 @@ "msisdn_lookup_failed": "Methu chwilio am y rhif ffôn", "msisdn_lookup_failed_description": "Bu gwall wrth chwilio am y rhif ffôn", "msisdn_transfer_failed": "Methu trosglwyddo galwad", + "n_people_joined": { + "Does %(count)s person wedi ymuno": "zero", + "Mae %(count)s person wedi ymuno": "other" + }, "no_audio_input_description": "Heb ddod o hyd i feicroffon ar eich dyfais. Gwiriwch eich gosodiadau a cheisiwch eto.", "no_audio_input_title": "Heb ganfod meicroffon", "no_media_perms_description": "Mae'n bosibl y bydd angen i chi ganiatáu i %(brand)s gael mynediad i'ch meicroffon/gwegamera â llaw", @@ -3839,6 +4041,7 @@ "show_sidebar_button": "Dangos y bar ochr", "silence": "Distewi galwad", "silenced": "Hysbysiadau wedi'u distewi", + "skip_lobby_toggle_option": "Ymunwch ar unwaith", "start_screenshare": "Dechreuwch rannu'ch sgrin", "stop_screenshare": "Stopiwch rannu'ch sgrin", "too_many_calls": "Gormod o Alwadau", @@ -3960,7 +4163,7 @@ "error_need_to_be_logged_in": "Mae angen i chi fod wedi mewngofnodi.", "error_unable_start_audio_stream_description": "Methu dechrau ffrydio sain.", "error_unable_start_audio_stream_title": "Methu cychwyn llif byw", - "modal_data_warning": "Mae data ar y sgrin hon yn cael ei rannu â %(widgetDomain)s", + "modal_data_warning": "Mae data isod yn cael ei rannu â %(widgetDomain)s", "modal_title_default": "Teclyn Modal", "no_name": "Ap Anhysbys", "open_id_permissions_dialog": { @@ -3979,7 +4182,7 @@ "shared_data_theme": "Eich thema", "shared_data_url": "URL %(brand)s", "shared_data_warning": "Gall defnyddio'r teclyn hwn rannu data gyda %(widgetDomain)s.", - "shared_data_warning_im": "Gall defnyddio'r teclyn hwn rannu data gyda %(widgetDomain)s a'ch rheolwr integreiddio.", + "shared_data_warning_im": "Gall defnyddio'r teclyn hwn rannu data gyda %(widgetDomain)s a'ch rheolwr integreiddio.", "shared_data_widget_id": "ID teclyn", "unencrypted_warning": "Nid yw teclynnau'n defnyddio amgryptio negeseuon.", "unmaximise": "Dad-wneud mwyaf", diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index d362de591a..2da4dd109d 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1,8 +1,8 @@ { "a11y": { - "emoji_picker": "Emoji-Picker", + "emoji_picker": "Emoji-Auswahl", "jump_first_invite": "Zur ersten Einladung springen.", - "message_composer": "Nachrichteneingabe-Feld", + "message_composer": "Texteingabefeld", "n_unread_messages": { "other": "%(count)s ungelesene Nachrichten.", "one": "1 ungelesene Nachricht." @@ -11,28 +11,28 @@ "other": "%(count)s ungelesene Nachrichten einschließlich Erwähnungen.", "one": "1 ungelesene Erwähnung." }, - "recent_rooms": "Kürzlich besuchte Chatrooms", - "room_messsage_not_sent": "Öffnen Sie den Chatroom %(roomName)s mit einer nicht gesendeten Nachricht.", - "room_n_unread_invite": "%(roomName)s Einladung zum Raum öffnen.", + "recent_rooms": "Zuletzt besuchte Chats", + "room_messsage_not_sent": "Öffne den Chat „%(roomName)s” mit einer ungesendeten Nachricht.", + "room_n_unread_invite": "Offene Einladung zum Chat %(roomName)s", "room_n_unread_messages": { - "one": "Raum %(roomName)s öffnen mit 1 ungelesenen Nachricht.", - "other": "Raum %(roomName)s öffnen mit %(count)s ungelesene Nachrichten." + "one": "Chat %(roomName)s öffnen mit 1 ungelesenen Nachricht.", + "other": "Chat %(roomName)s öffnen mit %(count)s ungelesene Nachrichten." }, "room_n_unread_messages_mentions": { - "one": "Öffnen Sie den Raum %(roomName)s mit 1 ungelesenen Erwähnung.", - "other": "Öffnen Sie den Raum %(roomName)s mit %(count)s ungelesenen Nachrichten einschließlich Erwähnungen." + "one": "Öffne den den Chat %(roomName)s mit 1 ungelesenen Erwähnung.", + "other": "Öffne den Chat %(roomName)s mit %(count)s ungelesenen Nachrichten einschließlich Erwähnungen." }, - "room_name": "Raum %(name)s", - "room_status_bar": "Statusleiste des Chatrooms", + "room_name": "Chat %(name)s", + "room_status_bar": "Chat-Statusleiste", "seek_bar_label": "Audio-Suchleiste", "unread_messages": "Ungelesene Nachrichten.", "user_menu": "Benutzermenü" }, - "a11y_jump_first_unread_room": "Springen Sie zum ersten ungelesenen Chatroom.", + "a11y_jump_first_unread_room": "Springe zum ersten ungelesenen Chat", "action": { "accept": "Akzeptieren", "add": "Hinzufügen", - "add_existing_room": "Existierenden Raum hinzufügen", + "add_existing_room": "Vorhandenen Chat hinzufügen", "add_people": "Personen hinzufügen", "apply": "Anwenden", "approve": "Genehmigen", @@ -41,7 +41,7 @@ "call": "Anrufen", "cancel": "Abbrechen", "change": "Ändern", - "clear": "Löschen", + "clear": "Zurücksetzen", "click": "Klick", "click_to_copy": "Klicken um zu kopieren", "close": "Schließen", @@ -52,7 +52,7 @@ "copy": "Kopieren", "copy_link": "Link kopieren", "create": "Erstellen", - "create_a_room": "Raum erstellen", + "create_a_room": "Chat erstellen", "create_account": "Konto erstellen", "decline": "Ablehnen", "decline_and_block": "Ablehnen und blockieren", @@ -69,8 +69,8 @@ "enter_fullscreen": "Vollbild", "exit_fullscreeen": "Vollbild verlassen", "expand": "Ausklappen", - "explore_public_rooms": "Öffentliche Räume erkunden", - "explore_rooms": "Räume erkunden", + "explore_public_rooms": "Öffentliche Chats erkunden", + "explore_rooms": "Chats erkunden", "export": "Exportieren", "forward": "Weiterleiten", "go": "Los", @@ -79,7 +79,7 @@ "hide": "Verstecken", "hide_advanced": "Erweiterte Einstellungen ausblenden", "hold": "Halten", - "ignore": "Blockieren", + "ignore": "Ignorieren", "import": "Importieren", "invite": "Einladen", "invite_to_space": "In Space einladen", @@ -87,14 +87,14 @@ "join": "Betreten", "learn_more": "Mehr erfahren", "leave": "Verlassen", - "leave_room": "Raum verlassen", + "leave_room": "Chat verlassen", "logout": "Abmelden", "manage": "Verwalten", "maximise": "Maximieren", "mention": "Erwähnen", "minimise": "Minimieren", - "new_room": "Neuer Raum", - "new_video_room": "Neuer Videoraum", + "new_room": "Neue Gruppe", + "new_video_room": "Neuer Videochat", "next": "Weiter", "no": "Nein", "ok": "Ok", @@ -114,7 +114,7 @@ "reply": "Antworten", "reply_in_thread": "In Thread antworten", "report_content": "Inhalt melden", - "report_room": "Raum melden", + "report_room": "Chat melden", "resend": "Erneut senden", "reset": "Zurücksetzen", "resume": "Fortsetzen", @@ -133,7 +133,7 @@ "sign_out": "Abmelden", "skip": "Überspringen", "start": "Starte", - "start_chat": "Unterhaltung beginnen", + "start_chat": "Neuer Chat", "start_new_chat": "Neue Direktnachricht", "stop": "Beenden", "submit": "Absenden", @@ -141,8 +141,8 @@ "transfer": "Übertragen", "trust": "Vertrauen", "try_again": "Erneut versuchen", - "unban": "Verbannung aufheben", - "unignore": "Freigeben", + "unban": "Entsperren", + "unignore": "Ignorieren aufheben", "unpin": "Loslösen", "unsubscribe": "Deabonnieren", "update": "Aktualisieren", @@ -244,7 +244,7 @@ "misconfigured_body": "Wende dich an deinen %(brand)s-Admin um deine Konfiguration auf ungültige oder doppelte Einträge zu überprüfen.", "misconfigured_title": "Dein %(brand)s ist falsch konfiguriert", "mobile_create_account_title": "Du bist dabei, auf %(hsName)s ein Konto anzulegen", - "msisdn_field_description": "Andere Personen können dich mit deinen Kontaktdaten in Räume einladen", + "msisdn_field_description": "Andere Nutzer können dich mit deinen Kontaktdaten in Chats einladen", "msisdn_field_label": "Telefon", "msisdn_field_number_invalid": "Diese Telefonummer sieht nicht ganz richtig aus. Bitte überprüfe deine Eingabe und versuche es erneut", "msisdn_field_required_invalid": "Telefonnummer eingeben", @@ -261,37 +261,37 @@ "phone_label": "Telefon", "phone_optional_label": "Telefon (optional)", "qr_code_login": { - "check_code_explainer": "Hierdurch wird überprüft, ob die Verbindung zu Ihrem anderen Gerät sicher ist.", + "check_code_explainer": "Damit prüfst du, ob die Verbindung zu deinem anderen Gerät sicher ist.", "check_code_heading": "Gib die Nummer ein, die am anderen Gerät angezeigt wird", "check_code_input_label": "zweistelliger Code", "check_code_mismatch": "Die Zahlen stimmen nicht überein", "completing_setup": "Schließe Anmeldung deines neuen Gerätes ab", "error_etag_missing": "Ein unerwarteter Fehler ist aufgetreten. Dies kann an einer Browsererweiterung, einem Proxyserver oder einer fehlerhaften Serverkonfiguration liegen.", - "error_expired": "Die Anmeldung ist abgelaufen. Bitte versuchen Sie es erneut.", + "error_expired": "Die Anmeldung ist abgelaufen. Bitte versuche es erneut.", "error_expired_title": "Die Anmeldung wurde nicht rechtzeitig abgeschlossen", - "error_insecure_channel_detected": "Eine sichere Verbindung zum neuen Gerät konnte nicht hergestellt werden. Ihre vorhandenen Geräte sind weiterhin sicher und Sie müssen sich keine Sorgen um sie machen.", + "error_insecure_channel_detected": "Eine sichere Verbindung zum neuen Gerät konnte nicht hergestellt werden. Deine vorhandenen Geräte sind weiterhin sicher und Du musst dir keine Sorgen um sie machen.", "error_insecure_channel_detected_instructions": "Was jetzt?", - "error_insecure_channel_detected_instructions_1": "Versuchen Sie erneut, sich mit einem QR-Code auf dem anderen Gerät anzumelden, falls dies ein Netzwerkproblem war", - "error_insecure_channel_detected_instructions_2": "Falls das gleiche Problem auftritt, probiere Sie es bitte mit einem anderen WLAN-Netzwerk oder verwenden Sie Ihre mobilen Daten anstelle von WLAN", - "error_insecure_channel_detected_instructions_3": "Falls das nicht funktioniert, melden Sie sich bitte manuell an.", + "error_insecure_channel_detected_instructions_1": "Versuche erneut, dich mit einem QR-Code auf dem anderen Gerät anzumelden, falls dies ein Netzwerkproblem war", + "error_insecure_channel_detected_instructions_2": "Falls das gleiche Problem noch einmal auftritt, probiere es bitte mit einem anderen WLAN-Netzwerk oder verwende mobilen Daten anstelle von WLAN", + "error_insecure_channel_detected_instructions_3": "Falls das nicht funktioniert, melde dich bitte manuell an.", "error_insecure_channel_detected_title": "Die Verbindung ist nicht sicher", - "error_other_device_already_signed_in": "Sie brauchen nichts weiter zu tun.", + "error_other_device_already_signed_in": "Du brauchst nichts weiter zu tun.", "error_other_device_already_signed_in_title": "Ihr anderes Gerät ist bereits angemeldet", "error_rate_limited": "Zu viele Versuche in zu kurzer Zeit. Warte ein wenig, bevor du es erneut versuchst.", - "error_unexpected": "Es ist ein unerwarteter Fehler aufgetreten. Ihre Anfrage zum Verbinden des anderen Geräts wurde abgebrochen.", + "error_unexpected": "Es ist ein unerwarteter Fehler aufgetreten. Die Anfrage zum Verbinden mit dem anderen Gerät wurde abgebrochen.", "error_unsupported_protocol": "Dieses Gerät unterstützt die Anmeldung auf einem anderen Gerät mit einem QR-Code nicht.", "error_unsupported_protocol_title": "Anderes Gerät nicht kompatibel", "error_user_cancelled": "Der Anmeldevorgang wurde am anderen Gerät abgebrochen.", "error_user_cancelled_title": "Anmeldungsanfrage abgebrochen", - "error_user_declined": "Sie oder der Kontoanbieter haben die Anmeldeanfrage abgelehnt.", + "error_user_declined": "Du oder der Konto-Anbieter haben die Anmeldeanfrage abgelehnt.", "error_user_declined_title": "Anmeldung abgelehnt", - "follow_remaining_instructions": "Folgen Sie den restlichen Anweisungen.", - "open_element_other_device": "Öffnen Sie %(brand)s auf Ihren anderen Gerät", + "follow_remaining_instructions": "Folge den restlichen Anweisungen", + "open_element_other_device": "Öffne %(brand)s auf deinem anderen Gerät", "point_the_camera": "Scanne den hier angezeigten QR-Code", "scan_code_instruction": "Scanne den QR-Code mit einem weiteren Gerät.", "scan_qr_code": "Anmeldung mit QR-Code", "security_code": "Sicherheitscode", - "security_code_prompt": "Wenn Sie dazu aufgefordert werden, geben Sie den folgenden Code auf Ihrem anderen Gerät ein.", + "security_code_prompt": "Wenn du dazu aufgefordert wirst, gib den folgenden Code auf deinem anderen Gerät ein.", "select_qr_code": "Wähle \"%(scanQRCode)s\"", "unsupported_explainer": "Dein Kontoanbieter unterstützt keine Anmeldung bei einem neuen Gerät per QR-Code.", "unsupported_heading": "QR-Code nicht unterstützt", @@ -306,8 +306,8 @@ "registration_disabled": "Registrierungen wurden auf diesem Heim-Server deaktiviert.", "registration_msisdn_field_required_invalid": "Telefonnummer eingeben (auf diesem Heim-Server erforderlich)", "registration_successful": "Registrierung erfolgreich", - "registration_username_in_use": "Dieser Benutzername wird bereits verwendet. Wählen Sie einen anderen Benutzernamen oder melden Sie sich unten an.", - "registration_username_unable_check": "Es kann nicht überprüft werden, ob der Benutzername bereits vergeben ist. Bitte versuchen Sie es später erneut.", + "registration_username_in_use": "Dieser Nutzername wird bereits verwendet. Wähle einen anderen Nutzernamen oder melde dich unten an, sollte es dein Name sein.", + "registration_username_unable_check": "Es kann nicht überprüft werden, ob der Nutzername bereits vergeben ist. Bitte versuche es später erneut.", "registration_username_validation": "Verwende nur Kleinbuchstaben, Zahlen, Bindestriche und Unterstriche", "reset_password": { "confirm_new_password": "Neues Passwort bestätigen", @@ -374,7 +374,7 @@ "sso_complete_in_browser_dialog_title": "Browser öffnen, um die Anmeldung abzuschließen", "sso_failed_missing_storage": "Wir haben deinen Browser gebeten, sich zu merken, bei welchem Heim-Server du dich anmeldest, aber dein Browser hat dies leider vergessen. Gehe zur Anmeldeseite und versuche es erneut.", "sso_or_username_password": "%(ssoButtons)s oder %(usernamePassword)s", - "sync_footer_subtitle": "Du bist einer Menge Räumen beigetreten, das kann eine Weile dauern", + "sync_footer_subtitle": "Du bist einer Menge Chats beigetreten, das kann eine Weile dauern", "syncing": "Synchronisiere …", "uia": { "code": "Code", @@ -383,9 +383,9 @@ "email_resend_prompt": "Nicht angekommen? Erneut senden", "email_resent": "Verschickt!", "fallback_button": "Authentifizierung beginnen", - "mas_cross_signing_reset_cta": "Gehen Sie zu Ihren Konto", - "mas_cross_signing_reset_description": "Setzen Sie Ihre Identität über Ihren Kontoanbieter zurück. Kommen Sie dann zurück und klicken Sie auf „Wiederholen“.", - "mas_cross_signing_reset_title": "Gehen sie zu ihrem Konto, um ihre Identität zurückzusetzen", + "mas_cross_signing_reset_cta": "Weiter zum Konto", + "mas_cross_signing_reset_description": "Du wirst zu deinem %(serverName)s Konto weitergeleitet, um deine Identität zurückzusetzen. Sobald die Rücksetzung des Kontos abgeschlossen ist, kehre hierher zurück und klicke auf „Wiederholen“.", + "mas_cross_signing_reset_title": "Gehe zum Konto, um deine Identität zurückzusetzen", "msisdn": "Eine Textnachricht wurde an %(msisdn)s gesendet", "msisdn_token_incorrect": "Token fehlerhaft", "msisdn_token_prompt": "Bitte gib den darin enthaltenen Code ein:", @@ -399,24 +399,24 @@ "sso_postauth_title": "Bestätige um fortzufahren", "sso_preauth_body": "Zum Fortfahren, nutze „Single Sign-On“ um deine Identität zu bestätigen.", "sso_title": "Einmalanmeldung zum Fortfahren nutzen", - "terms": "Bitte sieh dir alle Bedingungen dieses Heim-Servers an und akzeptiere sie:", + "terms": "Bitte sieh dir alle Bedingungen dieses Konto-Anbieters an und akzeptiere sie:", "terms_invalid": "Bitte prüfe und akzeptiere alle Richtlinien des Heim-Servers" }, "unsupported_auth": "Dieser Heim-Server verfügt über keines von dieser Anwendung unterstütztes Anmeldeverfahren.", "unsupported_auth_email": "Dieser Heim-Server unterstützt die Anmeldung per E-Mail-Adresse nicht.", "unsupported_auth_msisdn": "Dieser Server unterstützt keine Authentifizierung per Telefonnummer.", "username_field_required_invalid": "Benutzername eingeben", - "username_in_use": "Dieser Benutzername wird bereits verwendet. Bitte wählen Sie einen anderen Benutzernamen.", + "username_in_use": "Dieser Nutzername wird bereits verwendet. Bitte wähle einen anderen.", "verify_email_explainer": "Wir müssen wissen, dass du es auch wirklich bist, bevor wir dein Passwort zurücksetzen. Klicke auf den Link in der E-Mail, die wir gerade an %(email)s gesendet haben", "verify_email_heading": "Verifiziere deine E-Mail, um fortzufahren" }, "bug_reporting": { - "additional_context": "Wenn es mehr Informationen gibt, die uns bei der Auswertung des Problems würden – z. B. was du getan hast, Raum- oder Benutzer-IDs … – gib sie bitte hier an.", + "additional_context": "Wenn es mehr Informationen für die Auswertung des Problems gibt – z. B. was du getan hast, Chat- oder Benutzer-IDs … – gib sie bitte hier an.", "before_submitting": "Bevor du Protokolldateien übermittelst, musst du auf GitHub einen \"Issue\" erstellen um dein Problem zu beschreiben.", "collecting_information": "App-Versionsinformationen werden abgerufen", "collecting_logs": "Protokolle werden abgerufen", "create_new_issue": "Bitte erstelle ein neues Issue auf GitHub damit wir diesen Fehler untersuchen können.", - "description": "Fehlerberichte enthalten Applikationsnutzungsdaten wie Ihren Benutzernamen and Ihre Pseudonyme oder jene Ihrer Chatpartner, die IDs und Namen von Chaträumen, in denen Sie Mitglied sind und Elementen der Benutzeroberfläche mit denen Sie kürzlich interagiert haben. Fehlerberichte enthalten keine Nachrichten.", + "description": "Fehlerberichte enthalten Nutzungsdaten der App, wie den Nutzernamen, die IDs und Namen von Chats, die du besucht hast, die kürzlich verwendeten Bedienelement im Interface und die Namen anderer Nutzer. Fehlerberichte enthalten keine Nachrichten.", "download_logs": "Protokolle herunterladen", "downloading_logs": "Lade Protokolle herunter", "error_empty": "Bitte teile uns mit, was schief lief - oder besser, beschreibe das Problem auf GitHub in einem \"Issue\".", @@ -533,8 +533,8 @@ "one": "%(count)s Mitglied" }, "n_rooms": { - "one": "%(count)s Raum", - "other": "%(count)s Räume" + "one": "%(count)s Chat", + "other": "%(count)s Chats" }, "name": "Name", "no_results": "Keine Ergebnisse", @@ -544,7 +544,7 @@ "offline": "Offline", "on": "An", "options": "Optionen", - "orphan_rooms": "Andere Räume", + "orphan_rooms": "Andere Chats", "password": "Passwort", "people": "Personen", "preferences": "Präferenzen", @@ -552,20 +552,20 @@ "preview_message": "Hey du. Du bist großartig!", "privacy": "Privatsphäre", "private": "Privat", - "private_room": "Privater Raum", + "private_room": "Privater Chat", "private_space": "Privater Space", "profile": "Profil", "public": "Öffentlich", - "public_room": "Öffentlicher Raum", + "public_room": "Öffentlicher Chat", "public_space": "Öffentlicher Space", "qr_code": "QR-Code", "random": "Ohne Thema", "reactions": "Reaktionen", "recommended": "Empfohlen", "report_a_bug": "Einen Fehler melden", - "room": "Raum", - "room_name": "Raumname", - "rooms": "Räume", + "room": "Chat", + "room_name": "Chatname", + "rooms": "Chats", "save": "Speichern", "saved": "Gespeichert", "saving": "Speichere …", @@ -573,10 +573,10 @@ "select_all": "Alle auswählen", "server": "Server", "settings": "Einstellungen", - "setup_secure_messages": "Richte sichere Nachrichten ein", + "setup_secure_messages": "Sichere Nachrichten einrichten", "show_more": "Mehr zeigen", "someone": "Jemand", - "space": "Raum", + "space": "Space", "spaces": "Spaces", "sticker": "Sticker", "stickerpack": "Sticker-Paket", @@ -591,30 +591,29 @@ "unavailable": "Nicht verfügbar", "unencrypted": "Unverschlüsselt", "unmute": "Stummschalten aufheben", - "unnamed_room": "Unbenannter Raum", + "unnamed_room": "Unbenannter Chat", "unnamed_space": "Unbenannter Space", "unverified": "Nicht verifiziert", "updating": "Aktualisieren...", "user": "Benutzer", "user_avatar": "Profilbild", "username": "Benutzername", - "verification_cancelled": "Verifikation abgebrochen", "verified": "Verifiziert", "version": "Version", "video": "Video", - "video_room": "Videoraum", + "video_room": "Videochat", "view_message": "Nachricht anzeigen", "warning": "Warnung" }, "composer": { "autocomplete": { - "@room_description": "Alle im Raum benachrichtigen", + "@room_description": "Alle im Chat benachrichtigen", "command_a11y": "Autovervollständigung aktivieren", "command_description": "Befehle", "emoji_a11y": "Emoji-Auto-Vervollständigung", "notification_a11y": "Benachrichtigung Autovervollständigen", - "notification_description": "Raum-Benachrichtigung", - "room_a11y": "Raum-Auto-Vervollständigung", + "notification_description": "Chat-Benachrichtigung", + "room_a11y": "Chat-Auto-Vervollständigung", "space_a11y": "Spaces automatisch vervollständigen", "user_a11y": "Nutzer-Auto-Vervollständigung", "user_description": "Benutzer" @@ -643,19 +642,20 @@ }, "mode_plain": "Formatierung ausblenden", "mode_rich_text": "Formatierung anzeigen", - "no_perms_notice": "Du hast keine Berechtigung, etwas in diesen Raum zu senden", - "placeholder": "Eine unverschlüsselte Nachricht senden...", + "no_perms_notice": "Du darfst in diesem Chat nichts schreiben", + "placeholder": "Unverschlüsselte Nachricht senden...", "placeholder_encrypted": "Nachricht senden …", "placeholder_reply": "Eine unverschlüsselte Antwort senden…", "placeholder_reply_encrypted": "Antwort senden…", "placeholder_thread": "Antwort auf unverschlüsselten Thread…", "placeholder_thread_encrypted": "Auf Thread antworten…", "poll_button": "Umfrage", - "poll_button_no_perms_description": "Du bist nicht berechtigt, Umfragen in diesem Raum zu beginnen.", + "poll_button_no_perms_description": "Du darfst in diesem Chat keine Umfragen erstellen.", "poll_button_no_perms_title": "Berechtigung benötigt", "replying_title": "Antwortet", - "room_upgraded_link": "Die Konversation wird hier fortgesetzt.", - "room_upgraded_notice": "Dieser Raum wurde ersetzt und ist nicht länger aktiv.", + "room_unencrypted": "Nachrichten in diesem Chat sind nicht Ende-zu-Ende verschlüsselt", + "room_upgraded_link": "Der Chat geht hier weiter.", + "room_upgraded_notice": "Dieser Chat wurde ersetzt und ist nicht länger aktiv.", "send_button_title": "Nachricht senden", "send_button_voice_message": "Sprachnachricht senden", "send_voice_message": "Sprachnachricht senden", @@ -666,45 +666,45 @@ "console_scam_warning": "Wenn dir jemand gesagt hat, dass du hier etwas einfügen sollst, ist die Wahrscheinlichkeit sehr groß, dass du von der Person betrogen wirst!", "console_wait": "Warte!", "create_room": { - "action_create_room": "Raum erstellen", - "action_create_video_room": "Videoraum erstellen", - "encrypted_video_room_warning": "Dies kann später nicht deaktiviert werden. Der Raum wird verschlüsselt sein, nicht aber der eingebettete Anruf.", + "action_create_room": "Chat erstellen", + "action_create_video_room": "Videochat erstellen", + "encrypted_video_room_warning": "Dies kann später nicht deaktiviert werden. Der Chat wird verschlüsselt, nicht aber der eingebettete Anruf.", "encrypted_warning": "Du kannst dies später nicht deaktivieren. Brücken und die meisten Bots werden noch nicht funktionieren.", - "encryption_forced": "Für deinen Server muss die Verschlüsselung in privaten Räumen aktiviert sein.", + "encryption_forced": "Dein Server erfordert die Verschlüsselung in privaten Chats.", "encryption_label": "Ende-zu-Ende-Verschlüsselung aktivieren", - "error_title": "Raumerstellung fehlgeschlagen", + "error_title": "Chaterstellung fehlgeschlagen", "generic_error": "Server ist nicht verfügbar, überlastet oder du bist auf einen Programmfehler gestoßen.", - "join_rule_change_notice": "Du kannst das jederzeit in den Raumeinstellungen ändern.", - "join_rule_invite": "Privater Raum (Einladung erforderlich)", - "join_rule_invite_label": "Nur eingeladene Personen können den Raum finden und betreten.", - "join_rule_knock_label": "Jeder kann Anfragen beizutreten, aber Admins oder Moderatoren müssen dies bestätigen. Du kannst dies später ändern.", - "join_rule_public_label": "Alle können diesen Raum finden und betreten.", - "join_rule_public_parent_space_label": "Finden und Betreten ist allen, nicht nur Mitgliedern von , möglich.", + "join_rule_change_notice": "Du kannst das jederzeit in den Chat Einstellungen ändern.", + "join_rule_invite": "Privater Chat (Einladung erforderlich)", + "join_rule_invite_label": "Nur eingeladene Personen können den Chat finden und ihm beitreten.", + "join_rule_knock_label": "Jeder kann den Beitritt zum Chat erbitten, aber ein Admin oder Moderator muss die Anfrage akzeptieren. Du kannst dies später ändern.", + "join_rule_public_label": "Alle können diesen Chat finden und ihm beitreten.", + "join_rule_public_parent_space_label": "Jeder kann den Chat finden oder ihm beitreten, nicht nur Mitglieder von .", "join_rule_restricted": "Für Space-Mitglieder sichtbar", - "join_rule_restricted_label": "Mitglieder von können diesen Raum finden und betreten.", - "name_validation_required": "Bitte gib einen Namen für den Raum ein", - "room_visibility_label": "Raumsichtbarkeit", - "title_private_room": "Einen privaten Raum erstellen", - "title_public_room": "Öffentlichen Raum erstellen", - "title_video_room": "Videoraum erstellen", + "join_rule_restricted_label": "Mitglieder von können diesen Chat finden und ihm beitreten.", + "name_validation_required": "Bitte gib einen Namen für den Chat ein", + "room_visibility_label": "Chat Sichtbarkeit", + "title_private_room": "Erstelle einen privaten Chat", + "title_public_room": "Erstelle einen öffentlichen Chat", + "title_video_room": "Videochat erstellen", "topic_label": "Thema (optional)", "unfederated": "Betreten nur für Nutzer von %(serverName)s erlauben.", - "unfederated_label_default_off": "Du solltest dies aktivieren, wenn der Raum nur für die Zusammenarbeit mit Benutzern von deinem Heim-Server verwendet werden soll. Dies kann später nicht mehr geändert werden.", - "unfederated_label_default_on": "Du solltest dies deaktivieren, wenn der Raum für die Zusammenarbeit mit Benutzern von anderen Heim-Server verwendet werden soll. Dies kann später nicht mehr geändert werden.", - "unsupported_version": "Der Server unterstützt die angegebene Raumversion nicht." + "unfederated_label_default_off": "Du solltest dies aktivieren, wenn der Chat ausschließlich für die Zusammenarbeit mit Nutzern deines Homeservers verwendet werden soll. Dies kann später nicht mehr geändert werden.", + "unfederated_label_default_on": "Du solltest dies deaktivieren, wenn der Chat für die Zusammenarbeit mit Nutzern von anderen Homeservern verwendet werden soll. Dies kann später nicht mehr geändert werden.", + "unsupported_version": "Der Server unterstützt die angegebene Chat-Version nicht." }, "create_space": { "add_details_prompt": "Gib einige Infos über deinen neuen Space an.", "add_details_prompt_2": "Du kannst diese jederzeit ändern.", - "add_existing_rooms_description": "Wähle Räume oder Konversationen die du hinzufügen willst. Dieser Space ist nur für dich, niemand wird informiert. Du kannst später mehr hinzufügen.", + "add_existing_rooms_description": "Wähle Chats, die du hinzufügen willst. Dieser Space ist nur für dich, niemand wird informiert. Du kannst später mehr hinzufügen.", "add_existing_rooms_heading": "Was willst du organisieren?", "address_label": "Adresse", "address_placeholder": "z. B. mein-space", "creating": "Erstelle …", - "creating_rooms": "Erstelle Räume …", + "creating_rooms": "Erstelle Chats …", "done_action": "Zu meinem Space", - "done_action_first_room": "Zum ersten Raum springen", - "explainer": "Spaces sind eine neue Möglichkeit, Räume und Personen zu gruppieren. Welche Art von Space willst du erstellen? Du kannst dies später ändern.", + "done_action_first_room": "Zum ersten Chat springen", + "explainer": "Spaces sind eine neue Möglichkeit, Chats zu gruppieren. Welche Art von Space willst du erstellen? Du kannst dies später ändern.", "failed_create_initial_rooms": "Fehler beim Initialisieren des Space", "failed_invite_users": "Die folgenden Leute konnten nicht eingeladen werden: %(csvUsers)s", "invite_teammates_by_username": "Mit Benutzername einladen", @@ -714,9 +714,10 @@ "label": "Neuen Space erstellen", "name_required": "Gib den Namen des Spaces ein", "personal_space": "Nur für mich", - "personal_space_description": "Ein privater Space zum Organisieren deiner Räume", + "personal_space_description": "Ein privater Space zum Organisieren deiner Chats", "private_description": "Nur für Eingeladene – optimal für dich selbst oder Teams", "private_heading": "Dein privater Space", + "private_only_heading": "Dein Space", "private_personal_description": "Stelle sicher, dass die richtigen Personen Zugriff auf %(name)s haben", "private_personal_heading": "Für wen ist dieser Space gedacht?", "private_space": "Für mich und meine Kollegen", @@ -724,10 +725,10 @@ "public_description": "Öffne den Space für alle - am besten für Communitys", "public_heading": "Dein öffentlicher Space", "search_public_button": "Öffentliche Spaces suchen", - "setup_rooms_community_description": "Lass uns für jedes einen Raum erstellen.", + "setup_rooms_community_description": "Lass uns für jedes einen Chat erstellen.", "setup_rooms_community_heading": "Welche Themen willst du in %(spaceName)s besprechen?", "setup_rooms_description": "Du kannst später weitere hinzufügen, auch bereits bestehende.", - "setup_rooms_private_description": "Wir werden für jedes einen Raum erstellen.", + "setup_rooms_private_description": "Wir werden für jedes einen Chat erstellen.", "setup_rooms_private_heading": "Welche Projekte bearbeitet euer Team?", "share_description": "Momentan bist nur du hier. Mit anderen Leuten wird es noch viel besser.", "share_heading": "%(name)s teilen", @@ -748,17 +749,17 @@ "twemoji_colr": "Die Schriftart twemoji-colr ist © Mozilla Foundation und wird unter den Bedingungen von Apache 2.0 verwendet." }, "decline_invitation_dialog": { - "confirm": "Sind Sie sicher, dass Sie die Einladung zur Teilnahme an \"%(roomName)s\" ablehnen möchten?", - "ignore_user_help": "Von diesem Benutzer werden Ihnen keine Nachrichten oder Chatroomeinladungen angezeigt.", - "reason_description": "Beschreiben Sie den Grund für die Meldung dieses Chatrooms.", - "report_room_description": "Melden Sie diesen Raum Ihrem Kontoanbieter.", + "confirm": "Möchtest du wirklich die Einladung zu \"%(roomName)s\" ablehnen?", + "ignore_user_help": "Von diesem Nutzer werden keine Nachrichten oder Chateinladungen angezeigt.", + "reason_description": "Beschreibe den Grund für die Meldung dieses Chats.", + "report_room_description": "Melde diesen Chat deinem Konto-Anbieter.", "title": "Einladung ablehnen" }, "desktop_default_device_name": "%(brand)s Desktop: %(platformName)s", "devtools": { "active_widgets": "Aktive Widgets", "category_other": "Sonstiges", - "category_room": "Raum", + "category_room": "Chat", "caution_colon": "Vorsicht:", "client_versions": "Anwendungsversionen", "crypto": { @@ -784,6 +785,7 @@ "cross_signing_status": "Status der Kreuzsignatur", "cross_signing_untrusted": "Ihr Konto hat eine Cross-Signing-Identität im sicheren Speicher, der von dieser Sitzung jedoch noch nicht als vertrauenswürdig eingestuft wird.", "crypto_not_available": "Das kryptografische Modul ist nicht verfügbar", + "device_id": "Geräte-ID", "key_backup_active_version": "Aktive Backup Version:", "key_backup_active_version_none": "Keine", "key_backup_inactive_warning": "Für die Schlüssel dieser Session gibt es kein Backup", @@ -796,6 +798,8 @@ "secret_storage_ready": "bereit", "secret_storage_status": "Geheimer Speicher:", "self_signing_private_key_cached_status": "Selbstsignierender privater Schlüssel:", + "session": "Sitzung", + "session_fingerprint": "Fingerabdruck (Sitzungsschlüssel)", "title": "Ende-zu-Ende Verschlüsselung", "user_signing_private_key_cached_status": "Privater Schlüssel zur Benutzersignatur:" }, @@ -809,8 +813,8 @@ "event_sent": "Ereignis gesendet!", "event_type": "Eventtyp", "explore_account_data": "Kontodaten erkunden", - "explore_room_account_data": "Erkunde Raumkontodaten", - "explore_room_state": "Raumstatus erkunden", + "explore_room_account_data": "Erkunde Chat-Kontodaten", + "explore_room_state": "Chatstatus erkunden", "failed_to_find_widget": "Fehler beim Finden dieses Widgets.", "failed_to_load": "Fehler beim Laden.", "failed_to_save": "Speichern der Einstellungen fehlgeschlagen.", @@ -821,14 +825,15 @@ "low_bandwidth_mode": "Modus für geringe Bandbreite", "low_bandwidth_mode_description": "Benötigt kompatiblen Heim-Server.", "main_timeline": "Hauptverlauf", + "manual_device_verification": "Manuelle Verifizierung des Geräts", "no_receipt_found": "Keine Bestätigung gefunden", "notification_state": "Benachrichtigungsstand ist %(notificationState)s", "notifications_debug": "Debug-Modus für Benachrichtigungen", "number_of_users": "Benutzeranzahl", "original_event_source": "Ursprüngliche Rohdaten", - "room_encrypted": "Raum ist verschlüsselt ✅", - "room_id": "Raum-ID: %(roomId)s", - "room_not_encrypted": "Raum ist nicht verschlüsselt 🚨", + "room_encrypted": "Chat ist verschlüsselt ✅", + "room_id": "Chat-ID: %(roomId)s", + "room_not_encrypted": "Chat ist nicht verschlüsselt 🚨", "room_notifications_dot": "Punkt: ", "room_notifications_highlight": "Höhepunkt: ", "room_notifications_last_event": "Neuestes Ereignis:", @@ -836,21 +841,21 @@ "room_notifications_thread_id": "Thread-ID: ", "room_notifications_total": "Insgesamt: ", "room_notifications_type": "Typ: ", - "room_status": "Raumstatus", + "room_status": "Chatstatus", "room_unread_status_count": { - "one": "Ungelesen Status des ChatRooms: %(status)s, Anzahl: %(count)s", - "other": "Ungelesen-Status im Raum: %(status)s, Anzahl: %(count)s" + "one": "Ungelesen Status des Chats: %(status)s, Anzahl: %(count)s", + "other": "Ungelesen-Status des Chats: %(status)s, Anzahl: %(count)s" }, "save_setting_values": "Einstellungswerte speichern", "see_history": "Verlauf anzeigen", "send_custom_account_data_event": "Sende benutzerdefiniertes Kontodatenereignis", - "send_custom_room_account_data_event": "Sende benutzerdefiniertes Raumdatenereignis", + "send_custom_room_account_data_event": "Sende benutzerdefiniertes Chat Daten Event", "send_custom_state_event": "Benutzerdefiniertes Status-Event senden", "send_custom_timeline_event": "Sende benutzerdefiniertes Ereignis", "server_info": "Server-Info", "server_versions": "Server-Versionen", "settable_global": "Global einstellbar", - "settable_room": "Für den Raum einstellbar", + "settable_room": "Für den Chat einstellbar", "setting_colon": "Einstellung:", "setting_definition": "Definition der Einstellung:", "setting_id": "Einstellungs-ID", @@ -858,6 +863,7 @@ "elementCallUrl": "Element Call URL" }, "settings_explorer": "Einstellungsübersicht", + "show_empty_content_events": "Events mit leerem Inhalt anzeigen", "show_hidden_events": "Versteckte Ereignisse im Verlauf anzeigen", "spaces": { "one": "", @@ -871,18 +877,18 @@ "toolbox": "Werkzeugkasten", "use_at_own_risk": "Diese Benutzeroberfläche prüft nicht auf richtige Datentypen. Benutzung auf eigene Gefahr.", "user_read_up_to": "Der Benutzer hat gelesen bis: ", - "user_read_up_to_ignore_synthetic": "Der Benutzer hat bis (ignoreSynthetic) gelesen: ", + "user_read_up_to_ignore_synthetic": "Der Nutzer hat bis (ignoreSynthetic) gelesen: ", "user_read_up_to_private": "Benutzer las bis (m.read.private): ", - "user_read_up_to_private_ignore_synthetic": "Benutzer las bis (m.read.private;ignoreSynthetic): ", + "user_read_up_to_private_ignore_synthetic": "Der Nutzer hat bis (m.read.private;ignoreSynthetic) gelesen: ", "value": "Wert", "value_colon": "Wert:", - "value_in_this_room": "Wert in diesem Raum", - "value_this_room_colon": "Wert in diesem Raum:", + "value_in_this_room": "Wert in diesem Chat", + "value_this_room_colon": "Wert in diesem Chat:", "values_explicit": "Werte für explizite Stufen", "values_explicit_colon": "Werte für explizite Stufen:", - "values_explicit_room": "Werte für explizite Stufen in diesem Raum", - "values_explicit_this_room_colon": "Werte für explizite Stufen in diesem Raum:", - "view_servers_in_room": "Zeige Server im Raum", + "values_explicit_room": "Werte für explizite Stufen in diesem Chat", + "values_explicit_this_room_colon": "Werte für explizite Stufen in diesem Chat:", + "view_servers_in_room": "Zeige Server im Chat", "view_source_decrypted_event_source": "Entschlüsselte Rohdaten", "view_source_decrypted_event_source_unavailable": "Entschlüsselte Quelle nicht verfügbar", "widget_screenshots": "Bildschirmfotos für unterstützte Widgets" @@ -905,30 +911,31 @@ "emoji_picker": { "cancel_search_label": "Suche abbrechen" }, - "empty_room": "Leerer Raum", - "empty_room_was_name": "Leerer Raum (war %(oldName)s)", + "empty_room": "Leerer Chat", + "empty_room_was_name": "Leerer Chat (war %(oldName)s)", "encryption": { "access_secret_storage_dialog": { - "alternatives": "Wenn Sie einen Sicherheitsschlüssel oder eine Sicherheitsphrase haben, funktioniert das auch.", + "alternatives": "Sicherheitsschlüssel oder Sicherheitsphrase funktionieren auch.", "key_validation_text": { "wrong_security_key": "Der eingegebene Wiederherstellungsschlüssel ist nicht korrekt." }, - "privacy_warning": "Stellen Sie sicher, dass niemand diesen Bildschirm sehen kann!", + "privacy_warning": "Stelle sich, dass niemand diesen Bildschirm sehen kann!", "restoring": "Schlüssel aus der Sicherung wiederherstellen", "security_key_label": "Wiederherstellungsschlüssel", - "security_key_title": "Wiederherstellungsschlüssel" + "security_key_title": "Gib deinen Wiederherstellungsschlüssel ein" }, "bootstrap_title": "Schlüssel werden eingerichtet", "confirm_encryption_setup_body": "Klick die Schaltfläche unten um die Einstellungen der Verschlüsselung zu bestätigen.", "confirm_encryption_setup_title": "Bestätige die Einrichtung der Verschlüsselung", - "cross_signing_room_normal": "Dieser Raum ist Ende-zu-Ende verschlüsselt", - "cross_signing_room_verified": "Alle in diesem Raum sind verifiziert", + "cross_signing_room_normal": "Dieser Chat ist Ende-zu-Ende verschlüsselt", + "cross_signing_room_verified": "Alle in diesem Chat sind verifiziert", "cross_signing_room_warning": "Jemand verwendet eine unbekannte Sitzung", "cross_signing_user_normal": "Du hast diesen Nutzer nicht verifiziert.", "cross_signing_user_verified": "Du hast diesen Nutzer verifiziert. Der Nutzer hat alle seine Sitzungen verifiziert.", "cross_signing_user_warning": "Dieser Benutzer hat nicht alle seine Sitzungen verifiziert.", - "enter_recovery_key": "Geben Sie den Wiederherstellungsschlüssel ein", + "enter_recovery_key": "Gib den Wiederherstellungsschlüssel ein", "event_shield_reason_authenticity_not_guaranteed": "Die Echtheit dieser verschlüsselten Nachricht kann auf diesem Gerät nicht garantiert werden.", + "event_shield_reason_mismatched_sender": "Der Absender des Events passt nicht zum Besitzer des Geräts, das es gesendet hat.", "event_shield_reason_mismatched_sender_key": "Von einer nicht verifizierten Sitzung verschlüsselt", "event_shield_reason_unknown_device": "Durch ein unbekanntes oder gelöschtes Gerät verschlüsselt.", "event_shield_reason_unsigned_device": "Durch ein von Besitzer nicht verifiziertes Gerät verschlüsselt.", @@ -938,7 +945,7 @@ "import_invalid_keyfile": "Keine gültige %(brand)s-Schlüsseldatei", "import_invalid_passphrase": "Authentifizierung fehlgeschlagen: Falsches Passwort?", "key_storage_out_of_sync": "Ihr Schlüsselspeicher ist nicht synchronisiert.", - "key_storage_out_of_sync_description": "Bestätigen Sie Ihren Wiederherstellungsschlüssel, um weiterhin auf Ihren Schlüsselspeicher und den Nachrichtenverlauf zugreifen zu können.", + "key_storage_out_of_sync_description": "Bestätige deinen Wiederherstellungsschlüssel, um weiterhin Zugriff auf den Schlüsselspeicher und den Nachrichtenverlauf zu haben.", "messages_not_secure": { "cause_1": "Dein Heim-Server", "cause_2": "Der Heim-Server der Person, die du verifizierst", @@ -961,9 +968,8 @@ "title": "Wiederherstellungsmethode gelöscht", "warning": "Wenn du die Wiederherstellungsmethode nicht gelöscht hast, kann ein Angreifer versuchen, Zugang zu deinem Konto zu bekommen. Ändere dein Passwort und richte sofort eine neue Wiederherstellungsmethode in den Einstellungen ein." }, - "reset_all_button": "Hast du alle Wiederherstellungsmethoden vergessen? Setze sie hier zurück", "set_up_recovery": "Wiederherstellung einrichten", - "set_up_recovery_toast_description": "Generieren Sie einen Wiederherstellungsschlüssel, damit Sie Ihren verschlüsselten Nachrichtenverlauf wiederherstellen können, falls Sie den Zugriff auf Ihre Geräte verlieren.", + "set_up_recovery_toast_description": "Erzeuge einen Wiederherstellungsschlüssel. Er wird verwendet, um den verschlüsselten Nachrichtenverlauf wiederherzustellen, falls du den Zugriff auf deine Geräte verlierst.", "set_up_toast_title": "Schlüsselsicherung einrichten", "setup_secure_backup": { "explainer": "Um deine Schlüssel nicht zu verlieren, musst du sie vor der Abmeldung sichern." @@ -984,16 +990,17 @@ "after_new_login": { "device_verified": "Gerät verifiziert", "skip_verification": "Verifizierung vorläufig überspringen", - "unable_to_verify": "Gerät konnte nicht verifiziert werden", "verify_this_device": "Dieses Gerät verifizieren" }, - "cancelled": "Du hast die Verifikation abgebrochen.", - "cancelled_self": "Verifizierung am anderen Gerät abgebrochen.", - "cancelled_user": "%(displayName)s hat die Verifikationsanfrage abgelehnt.", + "cancelled_verification": "Entweder ist die Anforderung abgelaufen, wurde abgelehnt oder es liegt eine Fehler bei der Verifizierung vor.", "cancelling": "Abbrechen…", + "cant_confirm": "Bestätigung nicht möglich?", "complete_action": "Verstanden", "complete_description": "Du hast diesen Benutzer erfolgreich verifiziert.", "complete_title": "Verifiziert!", + "confirm_identity_description": "Verifiziere dieses Gerät, um sichere Nachrichten einzurichten", + "confirm_identity_title": "Bestätige deine Identität", + "confirm_the_emojis": "Vergewissere dich, dass die unten stehenden Emojis mit denen auf dem anderen Gerät übereinstimmen.", "error_starting_description": "Der Unterhaltungsbeginn mit dem anderen Benutzer war uns nicht möglich.", "error_starting_title": "Verifizierungbeginn fehlgeschlagen", "explainer": "Sichere Nachrichten mit diesem Benutzer sind Ende-zu-Ende-verschlüsselt und können nicht von Dritten gelesen werden.", @@ -1004,66 +1011,80 @@ "incoming_sas_dialog_waiting": "Warte auf Bestätigung des Gesprächspartners …", "incoming_sas_user_dialog_text_1": "Überprüfe diesen Benutzer, um ihn als vertrauenswürdig zu kennzeichnen. Benutzern zu vertrauen gibt dir zusätzliche Sicherheit bei der Verwendung von Ende-zu-Ende-verschlüsselten Nachrichten.", "incoming_sas_user_dialog_text_2": "Wenn du diesen Benutzer verifizierst werden seine Sitzungen für dich und deine Sitzungen für ihn als vertrauenswürdig markiert.", - "no_key_or_device": "Es sieht so aus, als hätten Sie weder einen Wiederherstellungsschlüssel noch andere Geräte, mit denen Sie Ihre Identität bestätigen können. Dieses Gerät kann nicht auf alte verschlüsselte Nachrichten zugreifen. Um Ihre Identität auf diesem Gerät zu bestätigen, müssen Sie Ihre Bestätigungsschlüssel zurücksetzen.", + "manual": { + "already_verified": "Dieses Gerät ist bereits verifiziert worden", + "already_verified_and_wrong_fingerprint": "Der angegebene Fingerabdruck passt nicht, aber das Gerät ist bereits verifiziert!", + "device_id": "Geräte-ID", + "failure_description": "Fehler beim Verifizieren von „%(deviceId)s“: %(error)s", + "failure_title": "Verifizierung fehlgeschlagen", + "fingerprint": "Fingerabdruck (Sitzungsschlüssel)", + "no_crypto": "Gerät kann nicht verifiziert werden – Verschlüsselung ist nicht aktiviert", + "no_device": "Gerät kann nicht verifiziert werden – Gerät „%(deviceId)s“ wurde nicht gefunden.", + "no_userid": "Gerät kann nicht verifiziert werden – Nutzer-ID wurde nicht gefunden", + "success_description": "Das Gerät (%(deviceId)s) ist jetzt verifiziert", + "success_title": "Verifizierung erfolgreich", + "text": "Gib die Geräte-ID und den Fingerabdruck eines deiner eigenen Geräte zur Verifizierung ein. HINWEIS: Dadurch kann das andere Gerät Nachrichten in deinem Namen senden und empfangen. WENN DICH JEMAND AUFGEFORDERT HAT, HIER ETWAS EINZUFÜGEN, WIRST DU WAHRSCHEINLICH BETROGEN!", + "wrong_fingerprint": "Das Gerät „%(deviceId)s” kann nicht verifiziert werden – der angegebene Fingerabdruck „%(fingerprint)s” stimmt nicht mit dem Fingerabdruck des Geräts „%(fprint)s” überein" + }, "no_support_qr_emoji": "Das Gerät unterstützt weder Verifizieren mittels QR-Code noch Emoji-Verifizierung. %(brand)s benötigt dies jedoch. Bitte verwende eine andere Anwendung.", + "now_you_can": "Jetzt kannst du Nachrichten sicher lesen oder senden, und alle, mit denen du chattest, können diesem Gerät auch vertrauen.", + "once_accepted_can_continue": "Nach der Annahme kannst du mit der Verifizierung fortfahren.", "other_party_cancelled": "Die Gegenstelle hat die Überprüfung abgebrochen.", - "prompt_encrypted": "Verifiziere alle Benutzer in einem Raum um die vollständige Sicherheit zu gewährleisten.", - "prompt_self": "Starte die Verifikation aus der Benachrichtigung erneut.", - "prompt_unencrypted": "Verifiziere alle Benutzer in verschlüsselten Räumen, um die Sicherheit zu garantieren.", - "prompt_user": "Starte die Verifikation aus dem Benutzerprofil erneut.", + "prompt_encrypted": "Verifiziere alle Nutzer in einem Chat um vollständige Sicherheit zu gewährleisten.", + "prompt_unencrypted": "Verifiziere alle Nutzer in verschlüsselten Chats, um die Sicherheit zu garantieren.", "qr_or_sas": "%(qrCode)s oder %(emojiCompare)s", - "qr_or_sas_header": "Verifiziere dieses Gerät mit einer der folgenden Möglichkeiten:", "qr_prompt": "Lese diesen eindeutigen Code ein", - "qr_reciprocate_same_shield_device": "Fast geschafft! Zeigen beide Geräte das selbe Wappen an?", + "qr_reciprocate_check_again_device": "Schau nochmal auf deinem anderen Gerät nach, um die Verifizierung abzuschließen.", + "qr_reciprocate_no": "Nein, ich sehe kein grünes Schild", "qr_reciprocate_same_shield_user": "Fast geschafft! Wird bei %(displayName)s das gleiche Schild angezeigt?", - "request_toast_accept": "Sitzung verifizieren", + "qr_reciprocate_yes": "Ja, ich sehe ein grünes Schild", "request_toast_accept_user": "Benutzer verifizieren", - "request_toast_decline_counter": "Blockiert (%(counter)s)", + "request_toast_decline_counter": "Ignoriere (%(counter)s)", "request_toast_detail": "%(deviceId)s von %(ip)s", - "reset_proceed_prompt": "Mit Zurücksetzen fortfahren", + "request_toast_start_verification": "Verifizierung starten", "sas_caption_self": "Verifiziere dieses Gerät, indem du überprüfst, dass die folgende Zahl auf dem Bildschirm erscheint.", "sas_caption_user": "Verifiziere diesen Nutzer, indem du bestätigst, dass die folgende Nummer auf dessen Bildschirm erscheint.", "sas_description": "Vergleiche eine einmalige Reihe von Emojis, sofern du an keinem Gerät eine Kamera hast", - "sas_emoji_caption_self": "Bestätige, dass die folgenden Emoji auf beiden Geräten in der gleichen Reihenfolge angezeigt werden:", "sas_emoji_caption_user": "Verifiziere diesen Nutzer, indem du bestätigst, dass folgende Emojis auf dessen Bildschirm erscheinen.", "sas_match": "Sie stimmen überein", "sas_no_match": "Sie stimmen nicht überein", "sas_prompt": "Vergleiche einzigartige Emojis", "scan_qr": "Verifizierung durch Scannen eines QR-Codes", "scan_qr_explainer": "Bitte %(displayName)s, deinen Code zu scannen:", - "self_verification_hint": "Akzeptiere die Verifizierungsanfrage am anderen Gerät, um fortzufahren.", "start_button": "Verifizierung starten", - "successful_device": "Du hast %(deviceName)s (%(deviceId)s) erfolgreich verifiziert!", - "successful_own_device": "Du hast dein Gerät erfolgreich verifiziert!", "successful_user": "Du hast %(displayName)s erfolgreich verifiziert!", - "timed_out": "Verifikationsanfrage abgelaufen.", "unsupported_method": "Konnte keine unterstützte Verifikationsmethode finden.", "unverified_session_toast_accept": "Ja, das war ich", "unverified_session_toast_title": "Neue Anmeldung. Warst du das?", - "unverified_sessions_toast_description": "Überprüfe sie, um ein sicheres Konto gewährleisten zu können", + "unverified_sessions_toast_description": "Überprüfe, um dein Konto sicher zu halten", "unverified_sessions_toast_reject": "Später", "unverified_sessions_toast_title": "Du hast nicht verifizierte Sitzungen", - "verification_description": "Verifizieren Sie Ihre Identität, um auf verschlüsselte Nachrichten zuzugreifen und sich gegenüber anderen Benutzern zu verifizieren. Falls Sie einen Handy oder ein anderes mobiles Gerät verwenden, öffnen Sie die App dort and fahren sie mit Ihrer Identifikation fort.", + "use_another_device": "Nimm ein anderes Gerät", + "use_recovery_key": "Wiederherstellungsschlüssel verwenden", + "verification_dialog_title_choose": "Wähle aus, wie du dich verifizieren willst", + "verification_dialog_title_compare_emojis": "Emojis vergleichen", + "verification_dialog_title_confirm_green_shield": "Vergewissern dich, dass auf dem anderen Gerät ein grünes Schild angezeigt wird.", "verification_dialog_title_device": "Anderes Gerät verifizieren", + "verification_dialog_title_failed": "Verifizierung fehlgeschlagen", + "verification_dialog_title_start_on_other_device": "Starte die Verifizierung auf dem anderen Gerät", "verification_dialog_title_user": "Verifizierungsanfrage", + "verification_dialog_title_verified": "Gerät verifiziert", "verification_skip_warning": "Ohne dich zu verifizieren wirst du keinen Zugriff auf alle deine Nachrichten haben und könntest für andere als nicht vertrauenswürdig erscheinen.", "verification_success_with_backup": "Dein neues Gerät ist jetzt verifiziert und hat Zugriff auf deine verschlüsselten Nachrichten und anderen wird es als vertrauenswürdig angezeigt werden.", "verification_success_without_backup": "Dein neues Gerät ist jetzt verifiziert. Anderen wird es als vertrauenswürdig angezeigt werden.", + "verify_by_completing_one_of": "Führe zur Verifizierung einen der folgenden Schritte aus:", "verify_emoji": "Mit Emojis verifizieren", "verify_emoji_prompt": "Durch den Vergleich einzigartiger Emojis verifizieren.", "verify_emoji_prompt_qr": "Wenn du obigen Code nicht erfassen kannst, verifiziere stattdessen durch den Vergleich von Emojis.", "verify_later": "Später verifizieren", - "verify_using_device": "Mit anderem Gerät verifizieren", - "verify_using_key": "Mit Wiederherstellungsschlüssel verifizieren", - "verify_using_key_or_phrase": "Mit Wiederherstellungsschlüssel oder Wiederherstellungsphrase verifizieren", "waiting_for_user_accept": "Warte auf die Annahme von %(displayName)s …", "waiting_other_device": "Warten darauf, dass du das auf deinem anderen Gerät bestätigst…", "waiting_other_device_details": "Warten, dass du auf deinem anderen Gerät %(deviceName)s (%(deviceId)s) verifizierst…", "waiting_other_user": "Warte darauf, dass %(displayName)s bestätigt…" }, "verification_requested_toast_title": "Verifizierung angefragt", - "verified_identity_changed": "%(displayName)s's (%(userId)s) Identität wurde zurückgesetzt. Erfahren Sie mehr ", - "verified_identity_changed_no_displayname": "%(userId)sDie Identität wurde zurückgesetzt. Erfahren Sie mehr ", + "verified_identity_changed": "%(displayName)s's (%(userId)s) kryptografische Identität wurde zurückgesetzt. Erfahre mehr", + "verified_identity_changed_no_displayname": "Die Identität von %(userId)s wurde zurückgesetzt. Erfahre mehr", "verify_toast_description": "Andere Benutzer vertrauen ihr vielleicht nicht", "verify_toast_title": "Sitzung verifizieren", "withdraw_verification_action": "Verifizierung zurückziehen" @@ -1105,6 +1126,7 @@ "tls": "Verbindung zum Heim-Server fehlgeschlagen – bitte überprüfe die Internetverbindung und stelle sicher, dass dem SSL-Zertifikat deines Heimservers vertraut wird und dass Anfragen nicht durch eine Browser-Erweiterung blockiert werden.", "unknown": "Unbekannter Fehler", "unknown_error_code": "Unbekannter Fehlercode", + "update_history_visibility": "Die Sichtbarkeit des Nachrichtenverlaufs konnte nicht geändert werden", "update_power_level": "Ändern der Berechtigungsstufe fehlgeschlagen" }, "error_app_open_in_another_tab": "Wechsle zu einem anderen Tab um mit %(brand)s zu verbinden. Dieser Tab kann jetzt geschlossen werden.", @@ -1112,16 +1134,16 @@ "error_app_opened_in_another_window": "%(brand)s läuft bereit in einem anderen Fenster. Klicke \"%(label)s um %(brand)s hier zu nutzen und beende das andere Fenster.", "error_database_closed_description": { "for_desktop": "Deine Festplatte scheint voll zu sein. Mache Speicherplatz frei und lade erneut.", - "for_web": "Diese Meldung wird erwartet, wenn Sie die Browserdaten gelöscht haben. %(brand)s ist möglicherweise auch in einem anderen Tab geöffnet oder Ihre Festplatte ist voll. Bitte machen Sie etwas Speicherplatz frei und laden Sie die Seite neu." + "for_web": "Diese Meldung wird angezeigt, wenn du die Browserdaten löschst. %(brand)s ist möglicherweise auch in einem anderen Tab geöffnet oder der Speicherplatz ist voll. Bitte mache etwas Speicherplatz frei und lade die Seite neu." }, "error_database_closed_title": "%(brand)s funktioniert nicht mehr", "error_dialog": { "copy_room_link_failed": { - "description": "Der Link zum Raum konnte nicht kopiert werden.", - "title": "Raumlink konnte nicht kopiert werden" + "description": "Der Link zum Chat konnte nicht kopiert werden.", + "title": "Chat-Link konnte nicht kopiert werden" }, "error_loading_user_profile": "Konnte Nutzerprofil nicht laden", - "forget_room_failed": "Das Entfernen des Raums ist fehlgeschlagen %(errCode)s" + "forget_room_failed": "Das Entfernen des Chat ist fehlgeschlagen %(errCode)s" }, "error_user_not_logged_in": "Benutzer ist nicht angemeldet", "event_preview": { @@ -1162,7 +1184,7 @@ "confirm_stop": "Willst du das Exportieren deiner Daten wirklich abbrechen? Falls ja, musst du komplett von neu beginnen.", "creating_html": "Erstelle HTML …", "creating_output": "Erstelle Ausgabe …", - "creator_summary": "%(creatorName)s hat diesen Raum erstellt.", + "creator_summary": "%(creatorName)s hat diesen Chat erstellt.", "current_timeline": "Aktueller Verlauf", "enter_number_between_min_max": "Gib eine Zahl zwischen %(min)s und %(max)s ein", "error_fetching_file": "Fehler beim Laden der Datei", @@ -1228,16 +1250,16 @@ "sent": "Rückmeldung gesendet" }, "file_panel": { - "empty_description": "Hänge Dateien aus der Unterhaltung an oder ziehe sie einfach an eine beliebige Stelle im Raum.", - "empty_heading": "Keine Dateien in diesem Raum", + "empty_description": "Hänge Dateien aus dem Chat an oder ziehe sie per Drag & Drop an eine beliebige Stelle in einem Chat.", + "empty_heading": "Keine Dateien in diesem Chat", "guest_note": "Du musst dich registrieren, um diese Funktionalität nutzen zu können", - "peek_note": "Du musst den Raum betreten, um die verknüpften Dateien sehen zu können" + "peek_note": "Du musst dem Chat beitreten, um seine Dateien sehen zu können" }, "forward": { - "filter_placeholder": "Räume oder Leute suchen", + "filter_placeholder": "Suche nach Gruppen oder Personen", "message_preview_heading": "Nachrichtenvorschau", "no_perms_title": "Du bist dazu nicht berechtigt", - "open_room": "Raum öffnen", + "open_room": "Chat öffnen", "send_label": "Senden", "sending": "Senden", "sent": "Gesendet" @@ -1280,12 +1302,12 @@ "incompatible_browser": { "continue": "Trotzdem fortfahren", "description": "%(brand)s verwendet einige Browser-Funktionen, die von deinem aktuellen Browser nicht unterstützt werden. %(detail)s", - "detail_can_continue": "Wenn Sie fortfahren, funktionieren einige Funktionen möglicherweise nicht mehr und es besteht das Risiko, dass Sie in Zukunft Daten verlieren.", - "detail_no_continue": "Versuchen Sie, diesen Browser zu aktualisieren, wenn Sie nicht die neueste Version verwenden, und versuchen Sie es erneut.", + "detail_can_continue": "Wenn du fortfährst könnten einige Funktionen möglicherweise ausfallen und es besteht das Risiko, in Zukunft Daten zu verlieren.", + "detail_no_continue": "Aktualisiere diesen Browser, wenn es nicht die neueste Version ist, und versuche es erneut.", "learn_more": "Mehr erfahren", "linux": "Linux", "macos": "Mac", - "supported_browsers": "Verwenden Sie Chrome, Firefox, Edge oder Safari, um das beste Erlebnis zu erzielen.", + "supported_browsers": "Verwende Chrome, Firefox, Edge oder Safari für das beste Erlebnis.", "title": "Nicht unterstützter Browser", "use_desktop_heading": "Verwende stattdessen %(brand)s Desktop", "use_mobile_heading": "Stattdessen %(brand)s am Smartphone benutzen", @@ -1298,16 +1320,16 @@ "connecting": "Verbinde mit Integrationsassistent …", "error_connecting": "Der Integrationsassistent ist außer Betrieb oder kann deinen Heim-Server nicht erreichen.", "error_connecting_heading": "Verbindung zum Integrationsassistenten fehlgeschlagen", - "explainer": "Integrationsassistenten erhalten Konfigurationsdaten und können Widgets modifizieren, Raumeinladungen verschicken und in deinem Namen Berechtigungslevel setzen.", + "explainer": "Integrations-Manager erhalten Konfigurationsdaten, können Widgets modifizieren, Chat-Einladungen verschicken und in deinem Namen Berechtigungen setzen.", "manage_title": "Integrationen verwalten", - "toggle_label": "Aktivieren Sie den Integrationsmanager", + "toggle_label": "Aktiviere den Integrations-Manager", "use_im": "Verwende einen Integrations-Server, um Bots, Widgets und Sticker-Pakete zu verwalten.", "use_im_default": "Nutze einen Integrations-Server (%(serverName)s), um Bots, Widgets und Sticker-Pakete zu verwalten." }, "integrations": { "disabled_dialog_description": "Aktiviere „%(manageIntegrations)s“ in den Einstellungen, um dies zu tun.", "disabled_dialog_title": "Integrationen sind deaktiviert", - "impossible_dialog_description": "%(brand)s erlaubt es Ihnen nicht, eine Integrationsverwaltung zu verwenden. Bitte kontaktieren Sie einen Administrator.", + "impossible_dialog_description": "%(brand)s erlaubt es nicht, den Integrations-Manager zu verwenden. Bitte kontaktiere einen Admin.", "impossible_dialog_title": "Integrationen sind nicht erlaubt" }, "invite": { @@ -1320,31 +1342,35 @@ "email_use_is": "Verwende einen Identitäts-Server, um per E-Mail-Adresse einladen zu können. Lege einen in den Einstellungen fest.", "error_already_invited_room": "Die Person wurde bereits eingeladen", "error_already_invited_space": "Die Person wurde bereits eingeladen", - "error_already_joined_room": "Die Person ist bereits im Raum", + "error_already_joined_room": "Die Person ist bereits im Chat", "error_already_joined_space": "Die Person ist bereits im Space", - "error_bad_state": "Gesperrte Benutzer können nicht eingeladen werden.", + "error_bad_state": "Gesperrte Nutzer können nicht eingeladen werden.", "error_dm": "Wir konnten deine Direktnachricht nicht erstellen.", "error_find_room": "Beim Einladen der Nutzer lief etwas schief.", "error_find_user_description": "Folgende Nutzer konnten nicht eingeladen werden, da sie nicht existieren oder ungültig sind: %(csvNames)s", "error_find_user_title": "Folgenden Nutzer konnten nicht gefunden werden", - "error_invite": "Wir konnten diese Personen nicht einladen. Bitte überprüfe sie und versuche es erneut.", - "error_permissions_room": "Du hast keine Berechtigung, Personen in diesen Raum einzuladen.", + "error_invite": "Diese Personen konnten nicht einladen werden. Bitte überprüfe sie und versuche es erneut.", + "error_permissions_room": "Du hast keine Berechtigung, Personen in diesen Chat einzuladen.", "error_permissions_space": "Du hast keine Berechtigung, Personen in diesen Space einzuladen.", "error_profile_undisclosed": "Diese Person existiert möglicherweise nicht", "error_transfer_multiple_target": "Ein Anruf kann nur auf einen einzelnen Nutzer übertragen werden.", - "error_unfederated_room": "Dieser Raum förderiert nicht. Du kannst keine Personen von externen Servern einladen.", + "error_unfederated_room": "Dieser Chat förderiert nicht. Du kannst keine Personen von externen Servern einladen.", "error_unfederated_space": "Dieser Space förderiert nicht. Du kannst keine Personen von externen Servern einladen.", "error_unknown": "Unbekannter Server-Fehler", "error_user_not_found": "Diese Person existiert nicht", - "error_version_unsupported_room": "Die Raumversion wird vom Heim-Server des Benutzers nicht unterstützt.", + "error_version_unsupported_room": "Die Chat-Version wird vom Homeserver des Nutzers nicht unterstützt.", "error_version_unsupported_space": "Die Space-Version wird vom Heim-Server des Benutzers nicht unterstützt.", "failed_generic": "Aktion fehlgeschlagen", "failed_title": "Einladen fehlgeschlagen", "invalid_address": "Nicht erkannte Adresse", - "name_email_mxid_share_room": "Lade jemanden mittels Name, E-Mail-Adresse oder Benutzername (wie ) ein, oder teile diesen Raum.", + "name_email_mxid_share_room": "Lade jemanden mittels Name, E-Mail-Adresse oder Nutzername (wie ) ein, oder teile diesen Chat.", "name_email_mxid_share_space": "Lade Leute mittels Anzeigename, E-Mail-Adresse oder Benutzername (z. B. ) ein oder teile diesen Space.", - "name_mxid_share_room": "Lade jemanden mittels Name oder Benutzername (z. B. ) ein oder teile diesen Raum.", + "name_mxid_share_room": "Lade jemanden mittels Name oder Nutzername (z. B. ) ein oder teile diesen Chat.", "name_mxid_share_space": "Lade Leute mittels Anzeigename oder Benutzername (z. B. ) ein oder teile diesen Space.", + "progress": { + "dont_close": "Schließe die App nicht, bevor der Vorgang abgeschlossen ist.", + "preparing": "Einladungen werden vorbereitet..." + }, "recents_section": "Letzte Unterhaltungen", "room_failed_partial": "Die anderen wurden gesendet, aber die folgenden Leute konnten leider nicht in eingeladen werden", "room_failed_partial_title": "Einige Einladungen konnten nicht versendet werden", @@ -1359,11 +1385,11 @@ "to_space": "In %(spaceName)s einladen", "transfer_dial_pad_tab": "Wähltastatur", "transfer_user_directory_tab": "Benutzerverzeichnis", - "unable_find_profiles_description_default": "Profile für die nachfolgenden Matrix-IDs wurden nicht gefunden – willst du sie dennoch einladen?", + "unable_find_profiles_description_default": "Profile für die folgenden Matrix-IDs wurden nicht gefunden – willst du sie dennoch einladen?", "unable_find_profiles_invite_label_default": "Dennoch einladen", "unable_find_profiles_invite_never_warn_label_default": "Trotzdem einladen und mich nicht mehr warnen", "unable_find_profiles_title": "Eventuell existieren folgende Benutzer nicht", - "unban_first_title": "Benutzer kann nicht eingeladen werden, solange die Sperre nicht aufgehoben worden ist." + "unban_first_title": "Nutzer kann nicht eingeladen werden, solange die Sperre nicht aufgehoben worden ist." }, "inviting_user1_and_user2": "Lade %(user1)s und %(user2)s ein", "inviting_user_and_n_others": { @@ -1371,8 +1397,8 @@ "one": "Lade %(user)s und eine weitere Person ein" }, "items_and_n_others": { - "other": " und %(count)s andere", - "one": " und ein weiteres Raummitglied" + "one": " und ein anderer", + "other": " und %(count)s andere" }, "keyboard": { "activate_button": "Ausgewählten Button aktivieren", @@ -1386,7 +1412,7 @@ "category_autocomplete": "Autovervollständigung", "category_calls": "Anrufe", "category_navigation": "Navigation", - "category_room_list": "Raumliste", + "category_room_list": "Chatliste", "close_dialog_menu": "Dialog oder Kontextmenü schließen", "composer_jump_end": "Zum Ende des Eingabefelds springen", "composer_jump_start": "Zum Anfang des Eingabefelds springen", @@ -1409,12 +1435,12 @@ "home": "Startseite", "jump_first_message": "Zur ersten Nachricht springen", "jump_last_message": "Zur letzten Nachricht springen", - "jump_room_search": "Zur Raumsuche springen", + "jump_room_search": "Springe zur Chat Suche", "jump_to_read_marker": "Zur ältesten ungelesenen Nachricht springen", "keyboard_shortcuts_tab": "Den Einstellungen-Tab öffnen", - "navigate_next_history": "Nächster kürzlich besuchter Raum oder Space", + "navigate_next_history": "Nächster kürzlich besuchter Chat oder Space", "navigate_next_message_edit": "Nächste Nachricht bearbeiten", - "navigate_prev_history": "Vorheriger kürzlich besuchter Raum oder Space", + "navigate_prev_history": "Vorheriger kürzlich besuchter Chat oder Space", "navigate_prev_message_edit": "Vorherige Nachricht bearbeiten", "next_landmark": "Zur nächsten Landmark springen", "next_room": "Nächste Unterhaltung", @@ -1426,11 +1452,12 @@ "prev_landmark": "Zur vorherigen Landmark springen", "prev_room": "Vorherige Unterhaltung", "prev_unread_room": "Vorherige ungelesene Nachricht", - "room_list_collapse_section": "Raumliste einklappen", - "room_list_expand_section": "Raumliste ausklappen", - "room_list_navigate_down": "Nächster Eintrag der Raumliste", - "room_list_navigate_up": "Vorheriger Eintrag der Raumliste", - "room_list_select_room": "Wähle eine Raum aus der Raumliste", + "room_list_collapse_section": "Chatliste einklappen", + "room_list_expand_section": "Chatliste ausklappen", + "room_list_navigate_down": "Nächster Eintrag der Chatliste", + "room_list_navigate_up": "Vorheriger Eintrag der Chatliste", + "room_list_select_room": "Wähle eine Chat aus der Chatliste", + "save": "Speichern", "scroll_down_timeline": "Im Verlauf nach unten springen", "scroll_up_timeline": "Im Verlauf nach oben springen", "search": "Suchen (muss in den Einstellungen aktiviert sein)", @@ -1457,19 +1484,19 @@ "beta_feedback_leave_button": "Du kannst die Beta in den Einstellungen deaktivieren.", "beta_feedback_title": "Rückmeldung zur %(featureName)s-Beta", "beta_section": "Zukünftige Funktionen", - "bridge_state": "Informationen zu Brücken im Raum", + "bridge_state": "Zeige Informationen zu Brücken im Chat Einstellungen", "bridge_state_channel": "Kanal: ", "bridge_state_creator": "Diese Brücke wurde von bereitgestellt.", "bridge_state_manager": "Diese Brücke wird von verwaltet.", - "bridge_state_workspace": "Arbeitsraum: ", + "bridge_state_workspace": "Workspace: ", "click_for_info": "Klicke für mehr Infos", "currently_experimental": "Aktuell experimentell.", "custom_themes": "Selbstdefinierte Designs", - "dynamic_room_predecessors": "Veränderbare Raumvorgänger", - "dynamic_room_predecessors_description": "MSC3946 aktivieren (zur Verknüpfung von Raumarchiven nach der Raumerstellung)", - "element_call_video_rooms": "Element Call-Videoräume", + "dynamic_room_predecessors": "Veränderbare Chat Vorgänger", + "dynamic_room_predecessors_description": "MSC3946 aktivieren (zur Verknüpfung von Chat Archiven nach der Chat Erstellung)", + "element_call_video_rooms": "Element Call-Videochats", "exclude_insecure_devices": "Unsichere Geräte ausschließen beim senden/empfangen von Nachrichten", - "exclude_insecure_devices_description": "Bei Aktivierung dieses Modus werden verschlüsselte Nachrichten nicht mehr mit unverifizierten Geräten geteilt und Nachrichten von unverifizierten Geräten werden als Fehler angezeigt. Beachten Sie, dass bei Aktivierung dieses Modus es nicht möglich ist, mit Benutzern, die keine verifizierten Geräte haben, zu kommunizieren.", + "exclude_insecure_devices_description": "Bei Aktivierung dieser Einstellung werden verschlüsselte Nachrichten nicht mehr mit unverifizierten Geräten geteilt und Nachrichten von unverifizierten Geräten werden als Fehler angezeigt. Beachte, dass es bei Aktivierung dieser Einstellung nicht mehr möglich ist, mit Nutzern zu kommunizieren, die keine verifizierten Geräte haben.", "experimental_description": "Experimentierfreudig? Probiere unsere neuesten, sich in Entwicklung befindlichen Ideen aus. Diese Funktionen sind nicht final; Sie könnten instabil sein, sich verändern oder sogar ganz entfernt werden. Erfahre mehr.", "experimental_section": "Frühe Vorschauen", "extended_profiles_msc_support": "Erfordert die Unterstützung von MSC4133 durch den Server", @@ -1482,7 +1509,7 @@ "group_messaging": "Kommunikation", "group_moderation": "Moderation", "group_profile": "Profil", - "group_rooms": "Räume", + "group_rooms": "Chats", "group_spaces": "Spaces", "group_themes": "Themen", "group_threads": "Themen", @@ -1490,7 +1517,7 @@ "group_voip": "Anrufe", "group_widgets": "Widgets", "hidebold": "Benachrichtigungspunkt ausblenden (nur Zähler zeigen)", - "html_topic": "Zeige die HTML-Darstellung von Raumthemen", + "html_topic": "Zeige die HTML-Darstellung von Chat Themen", "join_beta": "Beta beitreten", "join_beta_reload": "Die Teilnahme an der Beta wird %(brand)s neustarten.", "jump_to_date": "Zu Datum springen ( /jumptodate bzw. Zu Datum springen im Header)", @@ -1499,31 +1526,34 @@ "leave_beta": "Beta verlassen", "leave_beta_reload": "Das Verlassen der Beta wird %(brand)s neustarten.", "location_share_live": "Echtzeit-Standortfreigabe", - "location_share_live_description": "Vorläufige Implementierung: Standorte verbleiben im Raumverlauf.", - "mjolnir": "Neue Methoden, Personen zu blockieren", + "location_share_live_description": "Vorläufige Implementierung: Standorte verbleiben im Nachrichtenverlauf.", + "mjolnir": "Neue Methoden, Personen zu ignorieren", "msc3531_hide_messages_pending_moderation": "Erlaube Moderatoren, noch nicht moderierte Nachrichten auszublenden.", "new_room_list": "Neue Chatroomliste aktivieren", "notification_settings": "Neue Benachrichtigungseinstellungen", "notification_settings_beta_caption": "Einen einfacheren Weg um die Einstellungen für Benachrichtigungen zu ändern vorstellen. Passe Deine %(brand)s so an wie Du willst.", "notification_settings_beta_title": "Benachrichtigungseinstellungen", - "notifications": "Benachrichtigungen in der Kopfleiste des Raums anschalten", + "notifications": "Benachrichtigungen in der Chat-Kopfzeile einschalten", "release_announcement": "Release Ankündigung", "render_reaction_images": "Benutzerdefinierte Bilder in Reaktionen anzeigen", "render_reaction_images_description": "Werden manchmal auch als „benutzerdefinierte Emojis“ bezeichnet.", - "report_to_moderators": "An Raummoderation melden", - "report_to_moderators_description": "In Räumen, die Moderation unterstützen, lässt dich die Schaltfläche „Melden“ missbräuchliche Verwendung an die Raummoderation melden.", + "report_to_moderators": "An Moderatoren melden", + "report_to_moderators_description": "In Chats, die Moderation unterstützen, kannst du mit der Schaltfläche „Melden“ missbräuchliche Verwendung an die Moderatoren melden.", + "share_history_on_invite": "Teile den verschlüsselten Nachrichtenverlauf mit neuen Mitgliedern", + "share_history_on_invite_description": "Wenn du einen Nutzer in einen Chat einlädst, bei dem die die Sichtbarkeit der Historie auf \"geteilt\" eingestellt ist, wird der verschlüsselte Nachrichtenverlauf mit diesem Nutzer geteilt. Du akzeptierst damit auch, einen solchen verschlüsselten Nachrichtenverlauf zu empfangen, wenn du selbst in einen solchen Chat eingeladen wirst.", + "share_history_on_invite_warning": "Diese Funktion ist EXPERIMENTELL und nicht alle Sicherheitsmaßnahmen sind aktiviert. Bitte nicht auf Konten verwenden, die für den Produktions-Betrieb gedacht sind.", "sliding_sync": "Sliding-Sync-Modus", "sliding_sync_description": "In aktiver Entwicklung, kann nicht deaktiviert werden. Derzeit nicht mit Element Call kompatibel.", "sliding_sync_disabled_notice": "Zum Deaktivieren, melde dich ab und erneut an", "sliding_sync_server_no_support": "Dein Server wird hier nicht unterstützt.", "under_active_development": "In aktiver Entwicklung.", - "unrealiable_e2e": "Nicht zuverlässig in verschlüsselten Räumen", - "video_rooms": "Videoräume", + "unrealiable_e2e": "Nicht zuverlässig in verschlüsselten Chats", + "video_rooms": "Videochats", "video_rooms_a_new_way_to_chat": "Eine neue Möglichkeit in %(brand)s über Audio und Video zu kommunizieren.", - "video_rooms_always_on_voip_channels": "Videoräume sind dauerhaft aktive VoIP-Kanäle, die in einem Raum in %(brand)s eingebettet sind.", - "video_rooms_beta": "Videoräume sind eine Betafunktion", - "video_rooms_faq1_answer": "Verwende die „+“-Schaltfläche des Räumebereichs der linken Seitenleiste.", - "video_rooms_faq1_question": "Wie kann ich einen Videoraum erstellen?", + "video_rooms_always_on_voip_channels": "Videochats sind dauerhaft aktive VoIP-Kanäle, die in einem Chat in %(brand)s eingebettet sind.", + "video_rooms_beta": "Videochats sind eine Beta-Funktion", + "video_rooms_faq1_answer": "Verwende die „+“-Schaltfläche des Chat-Bereichs der linken Seitenleiste.", + "video_rooms_faq1_question": "Wie kann ich einen Videochat erstellen?", "video_rooms_faq2_answer": "Ja, der Verlauf wird neben dem Videoanruf angezeigt.", "video_rooms_faq2_question": "Kann ich während Videoanrufen auch Textnachrichten verschicken?", "video_rooms_feedbackSubheading": "Danke, dass Du die Beta ausprobierst. Bitte gehe soweit wie Du kannst ins Detail damit wird genau überprüfen können.", @@ -1532,44 +1562,44 @@ "labs_mjolnir": { "advanced_warning": "⚠ Diese Einstellungen sind für fortgeschrittene Nutzer gedacht.", "ban_reason": "Ignoriert/Blockiert", - "error_adding_ignore": "Fehler beim Blockieren eines Nutzers/Servers", - "error_adding_list_description": "Bitte überprüfe die Raum-ID oder -adresse und versuche es erneut.", + "error_adding_ignore": "Fehler beim Ignorieren eines Nutzers/Servers", + "error_adding_list_description": "Bitte überprüfe die Chat-ID oder -adresse und versuche es erneut.", "error_adding_list_title": "Fehler beim Abonnieren der Liste", - "error_removing_ignore": "Fehler beim Entfernen eines blockierten Benutzers/Servers", - "error_removing_list_description": "Bitte versuche es erneut oder sieh für weitere Hinweise in deine Konsole.", + "error_removing_ignore": "Fehler beim Entfernen eines ignorierten Nutzers/Servers", + "error_removing_list_description": "Bitte versuche es erneut oder beachte weitere Hinweise in der Konsole.", "error_removing_list_title": "Fehler beim Deabonnieren der Liste", - "explainer_1": "Füge hier die Benutzer und Server hinzu, die du blockieren willst. Verwende Sternchen, um %(brand)s alle Zeichen abgleichen zu lassen. So würde @bot:* alle Benutzer mit dem Namen „bot“, auf jedem beliebigen Server, blockieren.", + "explainer_1": "Füge hier die Nutzer und Server hinzu, die du ignorieren willst. Verwende Sternchen, um %(brand)s alle Zeichen abgleichen zu lassen. So würde @bot:* alle Nutzer mit dem Namen „bot“ auf jedem beliebigen Server blockieren.", "explainer_2": "Das Ignorieren von Personen erfolgt über Sperrlisten. Wenn eine Sperrliste abonniert wird, werden die von dieser Liste blockierten Benutzer und Server ausgeblendet.", "lists": "Du abonnierst momentan:", "lists_description_1": "Eine Verbotsliste abonnieren bedeutet ihr beizutreten!", - "lists_description_2": "Wenn dies nicht das ist, was du willst, verwende ein anderes Werkzeug, um Benutzer zu blockieren.", + "lists_description_2": "Wenn dies nicht das ist, was du willst, verwende eine andere Funktion, um Nutzer zu blockieren.", "lists_heading": "Abonnierte Listen", - "lists_new_label": "Raum-ID oder Adresse der Verbotsliste", + "lists_new_label": "Chat-ID oder Adresse der Sperrliste", "no_lists": "Du hast keine Listen abonniert", - "personal_description": "Deine persönliche Sperrliste enthält alle Benutzer/Server, von denen du keine Nachrichten erhalten möchtest. Nachdem du den ersten Benutzer/Server ignoriert hast, wird ein neuer Raum namens „%(myBanList)s“ erstellt – bleibe in diesem Raum, um die Sperrliste zu erhalten.", - "personal_empty": "Du hast niemanden blockiert.", + "personal_description": "Deine persönliche Sperrliste enthält alle Nutzer/Server, von denen du keine Nachrichten erhalten möchtest. Nachdem du den ersten Nutzer/Server ignoriert hast, wird ein neuer Chat namens „%(myBanList)s“ erstellt – bleibe in diesem Chat, um die Sperrliste zu erhalten.", + "personal_empty": "Du hast niemanden ignoriert.", "personal_heading": "Persönliche Sperrliste", - "personal_new_label": "Zu blockierende Server- oder Benutzer-ID", + "personal_new_label": "Zu ignorierende Server- oder Nutzer-ID", "personal_new_placeholder": "z. B. @bot:* oder example.org", "personal_section": "Du ignorierst momentan:", "room_name": "Meine Bannliste", - "room_topic": "Dies ist die Liste von Benutzer und Servern, die du blockiert hast – verlasse diesen Raum nicht!", + "room_topic": "Dies ist die Liste von Nutzern und Servern, die du gesperrt hast – verlasse diesen Chat nicht!", "rules_empty": "Nichts", "rules_server": "Server-Regeln", "rules_title": "Verbotslistenregeln - %(roomName)s", "rules_user": "Nutzerregeln", "something_went_wrong": "Etwas ist schief gelaufen. Bitte versuche es erneut oder sieh für weitere Hinweise in deiner Konsole nach.", - "title": "Blockierte Benutzer", + "title": "Ignorierte Nutzer", "view_rules": "Regeln öffnen" }, "language_dropdown_label": "Sprachauswahl", "leave_room_dialog": { - "last_person_warning": "Du bist die einzige Person im Raum. Sobald du ihn verlässt, wird niemand mehr hineingelangen, auch du nicht.", - "leave_room_question": "Bist du sicher, dass du den Raum „%(roomName)s“ verlassen möchtest?", + "last_person_warning": "Du bist die einzige Person hier. Wenn du gehst, kann in Zukunft niemand mehr eintreten, auch du nicht.", + "leave_room_question": "Bist du sicher, dass du den Chat „%(roomName)s“ verlassen möchtest?", "leave_space_question": "Bist du sicher, dass du den Space „%(spaceName)s“ verlassen möchtest?", - "room_leave_admin_warning": "Sie sind der einzige Administrator in diesem Chatroom. Wenn Sie den Chatroom verlassen, wird niemand in der Lage sein, die Chatroommeinstellungen zu ändern oder andere wichtige Maßnahmen zu ergreifen.", - "room_leave_mod_warning": "Sie sind der einzige Moderator in diesem Chatroom. Wenn Sie den Chatroom verlassen, kann niemand die Raumeinstellungen ändern oder andere wichtige Maßnahmen ergreifen.", - "room_rejoin_warning": "Dieser Raum ist nicht öffentlich. Du wirst ihn nicht ohne erneute Einladung betreten können.", + "room_leave_admin_warning": "Du bist der einzige Admin in diesem Chat. Wenn du den Chat verlässt, wird niemand mehr in der Lage sein, die Chat-Einstellungen zu ändern oder andere wichtige Aktionen durchzuführen.", + "room_leave_mod_warning": "Du bist der einzige Moderator in diesem Chat. Wenn du den Chat verlässt, kann niemand mehr die Chat-Einstellungen ändern oder andere wichtige Aktionen durchführen.", + "room_rejoin_warning": "Dieser Chat ist nicht öffentlich und du kannst ihm ohne Einladung nicht erneut beitreten.", "space_rejoin_warning": "Du wirst diesen privaten Space nur mit einer Einladung wieder betreten können." }, "left_panel": { @@ -1588,7 +1618,7 @@ "click_move_pin": "Klicke, um den Standort zu bewegen", "close_sidebar": "Seitenleiste schließen", "error_fetch_location": "Standort konnte nicht abgerufen werden", - "error_no_perms_description": "Du benötigst die entsprechenden Berechtigungen, um deinen Echtzeit-Standort in diesem Raum freizugeben.", + "error_no_perms_description": "Du benötigst die entsprechenden Berechtigungen, um deinen Echtzeit-Standort in diesem Chat freizugeben.", "error_no_perms_title": "Dir fehlt die Berechtigung, Echtzeit-Standorte freigeben zu dürfen", "error_send_description": "%(brand)s konnte deinen Standort nicht senden. Bitte versuche es später erneut.", "error_send_title": "Wir konnten deinen Standort nicht senden", @@ -1602,7 +1632,7 @@ "failed_unknown": "Beim Abruf deines Standortes ist ein unbekannter Fehler aufgetreten. Bitte versuche es später erneut.", "find_my_location": "Zeige meinen Standort", "live_description": "Echtzeit-Standort von %(displayName)s", - "live_enable_description": "Bitte beachte: Dies ist eine experimentelle Funktion, die eine temporäre Implementierung nutzt. Das bedeutet, dass du deinen Standortverlauf nicht löschen kannst und erfahrene Nutzer ihn sehen können, selbst wenn du deinen Echtzeit-Standort nicht mehr mit diesem Raum teilst.", + "live_enable_description": "Bitte beachte: Dies ist eine experimentelle Funktion, die eine temporäre Implementierung nutzt. Das bedeutet, dass du deinen Standortverlauf nicht löschen kannst und erfahrene Nutzer ihn sehen können, selbst wenn du deinen Echtzeit-Standort nicht mehr mit diesem Chat teilst.", "live_enable_heading": "Echtzeit-Standortfreigabe", "live_location_active": "Du teilst deinen Echtzeit-Standort", "live_location_enabled": "Echtzeit-Standort aktiviert", @@ -1630,12 +1660,13 @@ "one": "%(count)s Mitglied", "other": "%(count)s Mitglieder" }, - "filter_placeholder": "Raummitglieder filtern", + "filter_placeholder": "Chatmitglieder filtern", "invite_button_no_perms_tooltip": "Du bist nicht berechtigt, Benutzer einzuladen", "invited_label": "Eingeladen", + "list_title": "Mitgliederliste", "no_matches": "Keine Treffer" }, - "member_list_back_action_label": "Raummitglieder", + "member_list_back_action_label": "Chatmitglieder", "message_edit_dialog_title": "Nachrichtenänderungen", "migrating_crypto": "Bleib dran. Wir aktualisieren%(brand)s, um die Verschlüsselung schneller und zuverlässiger zu machen.", "mobile_guide": { @@ -1675,20 +1706,20 @@ "mentions_keywords": "Erwähnungen und Schlüsselwörter", "message_didnt_send": "Nachricht nicht gesendet. Klicke für Details.", "mute_description": "Du wirst keine Benachrichtigungen erhalten", - "mute_room": "Raum stummschalten" + "mute_room": "Chat stummschalten" }, "notifier": { "m.key.verification.request": "%(name)s fordert eine Verifizierung an" }, "onboarding": { - "create_room": "Gruppenraum erstellen", - "explore_rooms": "Öffentliche Räume erkunden", + "create_room": "Gruppen Chat erstellen", + "explore_rooms": "Öffentliche Chats erkunden", "has_avatar_label": "Großartig, das wird anderen helfen, dich zu erkennen", "intro_byline": "Besitze deine Unterhaltungen.", "intro_welcome": "Willkommen bei %(appName)s", "no_avatar_label": "Füge ein Bild hinzu, damit andere dich erkennen können.", "send_dm": "Direkt­­nachricht senden", - "welcome_detail": "Nun, lassen Sie uns Ihnen den Einstieg erleichtern", + "welcome_detail": "Los geht’s – wir helfen dir beim Einstieg", "welcome_user": "Willkommen %(name)s" }, "pill": { @@ -1737,6 +1768,7 @@ }, "power_level": { "admin": "Administrator", + "creator": "Eigentümer", "custom": "Benutzerdefiniert (%(level)s)", "custom_level": "Selbstdefiniertes Berechtigungslevel", "default": "Standard", @@ -1745,7 +1777,7 @@ "restricted": "Eingeschränkt" }, "powered_by_matrix": "Betrieben mit Matrix", - "powered_by_matrix_with_logo": "Dezentralisierter, verschlüsselter Chat & Zusammenarbeit unterstützt von $matrixLogo", + "powered_by_matrix_with_logo": "Dezentraler, verschlüsselter Chat & Zusammenarbeit auf Basis von $matrixLogo", "presence": { "away": "Abwesend", "busy": "Beschäftigt", @@ -1772,57 +1804,57 @@ "redact": { "confirm_button": "Entfernen bestätigen", "confirm_description": "Möchtest du dieses Ereignis wirklich entfernen (löschen)?", - "confirm_description_state": "Beachte, dass das Entfernen von Raumänderungen diese rückgängig machen könnte.", + "confirm_description_state": "Beachte, dass das Entfernen von Änderungen im Chat diese rückgängig machen könnte.", "error": "Diese Nachricht kann nicht gelöscht werden. (%(code)s)", "ongoing": "Löschen…", "reason_label": "Grund (optional)" }, "report_content": { - "description": "Wenn du diese Nachricht meldest, wird die eindeutige Ereignis-ID an die Administration deines Heim-Servers übermittelt. Wenn die Nachrichten in diesem Raum verschlüsselt sind, wird deine Heim-Server-Administration nicht in der Lage sein, Nachrichten zu lesen oder Medien einzusehen.", + "description": "Wenn du diese Nachricht meldest, wird die eindeutige Ereignis-ID an den Administrator deines Homeserver übermittelt. Wenn die Nachrichten verschlüsselt sind, kann dein Administrator sie nicht lesen und auch keine Dateien oder Bilder einsehen.", "disagree": "Ablehnen", - "error_create_room_moderation_bot": "Erstellen des Raums mit Moderations-Bot nicht möglich", + "error_create_room_moderation_bot": "Erstellen des Chats mit Moderations-Bot nicht möglich", "hide_messages_from_user": "Prüfe, ob du alle aktuellen und zukünftigen Nachrichten dieses Nutzers verstecken willst.", - "ignore_user": "Benutzer blockieren", + "ignore_user": "Nutzer ignorieren", "illegal_content": "Illegale Inhalte", "missing_reason": "Bitte gib an, weshalb du einen Fehler meldest.", "nature": "Bitte wähle eine Kategorie aus und beschreibe, was die Nachricht missbräuchlich macht.", - "nature_disagreement": "Die Person verbreitet Falschinformation.\nDies wird an die Raummoderation gemeldet.", - "nature_illegal": "Diese Person verhält sich illegal, beispielsweise durch das Veröffentlichen persönlicher Daten oder Gewaltdrohungen.\nDies wird an die Raummoderation gemeldet, welche dies an die Behörden weitergeben kann.", - "nature_nonstandard_admin": "Dieser Raum wurde wegen illegalem oder toxischem Inhalt oder fehlender Moderation an den Administrator von %(homeserver)s gemeldet. ", - "nature_nonstandard_admin_encrypted": "Dieser Raum wurde wegen illegalem oder toxischem Inhalt oder fehlender Moderation an den Administrator von %(homeserver)s gemeldet. Der Administrator wird KEINE verschlüsselten Inhalte in diesem Raum lesen können.", - "nature_other": "Anderer Grund. Bitte beschreibe das Problem.\nDies wird an die Raummoderation gemeldet.", - "nature_spam": "Dieser Benutzer spammt den Raum mit Werbung, Links zu Werbung oder Propaganda.\nDies wird an die Raummoderation gemeldet.", - "nature_toxic": "Dieser Benutzer zeigt toxisches Verhalten, etwa durch Beleidigen anderer Personen, Teilen von Erwachseneninhalten in familienfreundlichen Räumen oder anderweitiges Missachten von Raumregeln.\nDies wird an die Raummoderatoren gemeldet.", + "nature_disagreement": "Dieser Nutzer verbreitet Falschinformation.\nDies wird an die Moderatoren des Chats gemeldet.", + "nature_illegal": "Dieser Nutzer verhält sich illegal, beispielsweise durch das Veröffentlichen persönlicher Daten oder Gewaltdrohungen.\nDies wird an die Moderatoren des Chats gemeldet, welche dies an die Behörden weitergeben können.", + "nature_nonstandard_admin": "Dieser Chat wurde wegen illegalem oder toxischem Inhalt oder fehlender Moderation an den Administrator von %(homeserver)s gemeldet.", + "nature_nonstandard_admin_encrypted": "Dieser Chat wurde wegen illegalem oder toxischem Inhalt oder fehlender Moderation an den Administrator von %(homeserver)s gemeldet. Der Administrator wird KEINE verschlüsselten Inhalte in diesem Chat lesen können.", + "nature_other": "Anderer Grund. Bitte beschreibe das Problem.\nDies wird an die Moderatoren des Chats gemeldet.", + "nature_spam": "Dieser Nutzer spammt den Chat mit Werbung, Links zu Werbung oder Propaganda.\nDies wird an die Moderatoren des Chats gemeldet.", + "nature_toxic": "Dieser Benutzer zeigt toxisches Verhalten, etwa durch Beleidigen anderer Personen, Teilen von Erwachseneninhalten in familienfreundlichen Chat oder anderweitiges Missachten von Regeln.\nDies wird an die Moderatoren des Chats gemeldet.", "other_label": "Sonstiges", "report_content_to_homeserver": "Inhalte an die Administration deines Heim-Servers melden", - "report_entire_room": "Den ganzen Raum melden", + "report_entire_room": "Den ganzen Chat melden", "spam_or_propaganda": "Spam oder Propaganda", "toxic_behaviour": "Toxisches Verhalten" }, "report_room": { - "description": "Melden Sie diesen Raum Ihrem Kontoanbieter. Wenn die Nachrichten verschlüsselt sind, kann Ihr Administrator sie nicht lesen.", - "reason_label": "Beschreiben Sie den Grund" + "description": "Melde diesen Chat deinem Konto-Anbieter. Wenn die Nachrichten verschlüsselt sind, kann dein Administrator sie nicht lesen.", + "reason_label": "Beschreibe den Grund" }, "restore_key_backup_dialog": { "count_of_decryption_failures": "Konnte %(failedCount)s Sitzungen nicht entschlüsseln!", "count_of_successfully_restored_keys": "%(sessionCount)s Schlüssel erfolgreich wiederhergestellt", - "enter_key_description": "Greifen Sie auf Ihren verschlüsselten Nachrichtenverlauf zu und richten Sie sichere Nachrichtensendung ein, indem Sie Ihren Wiederherstellungsschlüssel eingeben.", - "enter_key_title": "Geben Sie den Wiederherstellungsschlüssel ein", + "enter_key_description": "Gib deinen Wiederherstellungsschlüssel ein, um auf den verschlüsselten Nachrichtenverlauf zuzugreifen und sichere Nachrichten einzurichten.", + "enter_key_title": "Gib den Wiederherstellungsschlüssel ein", "enter_phrase_description": "Greife auf deinen verschlüsselten Nachrichtenverlauf zu und richte die sichere Kommunikation ein, indem du deine Sicherheitsphrase eingibst.", "enter_phrase_title": "Sicherheitsphrase eingeben", "incorrect_security_phrase_dialog": "Das Backup konnte mit dieser Sicherheitsphrase nicht entschlüsselt werden: Bitte überprüfe, ob du die richtige eingegeben hast.", "incorrect_security_phrase_title": "Falsche Sicherheitsphrase", "key_backup_warning": "Warnung: Du solltest die Schlüsselsicherung nur auf einem vertrauenswürdigen Gerät einrichten.", "key_fetch_in_progress": "Lade Schlüssel vom Server …", - "key_forgotten_text": "Für den Fall, dass Sie Ihren Wiederherstellungsschlüssel vergessen haben, können Sie ", + "key_forgotten_text": "Solltest du den Wiederherstellungsschlüssel vergessen haben, kannst du ", "key_is_invalid": "Kein gültiger Wiederherstellungsschlüssel", - "key_is_valid": "Das sieht nach einem gültigen Wiederherstellungsschlüssel aus!", + "key_is_valid": "Möglicher Wiederherstellungsschlüssel", "keys_restored_title": "Schlüssel wiederhergestellt", "load_error_content": "Konnte Sicherungsstatus nicht laden", "load_keys_progress": "%(completed)s von %(total)s Schlüsseln wiederhergestellt", "no_backup_error": "Keine Schlüsselsicherung gefunden!", - "phrase_forgotten_text": "Wenn Sie Ihre Sicherheitsphrase vergessen haben, können Sie Ihren Wiederherstellungsschlüssel verwenden oder neue Wiederherstellungsoptionen einrichten ", - "recovery_key_mismatch_description": "Das Backup konnte mit diesem Wiederherstellungsschlüssel nicht entschlüsselt werden: Bitte überprüfen Sie, ob Sie den richtigen Wiederherstellungsschlüssel eingegeben haben.", + "phrase_forgotten_text": "Solltest du deine Sicherheitsphrase vergessen haben, kannst du deinen Wiederherstellungsschlüssel verwenden oder neue Wiederherstellungsoptionen einrichten", + "recovery_key_mismatch_description": "Das Backup konnte mit diesem Wiederherstellungsschlüssel nicht entschlüsselt werden: Bitte überprüfe, ob du den richtigen Wiederherstellungsschlüssel eingegeben hast.", "recovery_key_mismatch_title": "Nicht übereinstimmende Sicherheitsschlüssel", "restore_failed_error": "Konnte Schlüsselsicherung nicht wiederherstellen" }, @@ -1830,12 +1862,12 @@ "add_integrations": "Erweiterungen hinzufügen", "add_topic": "Thema hinzufügen", "extensions_button": "Erweiterungen", - "extensions_empty_description": "Wählen Sie \"%(addIntegrations)s\" um Erweiterungen zu suchen und diesem Chatroom hinzuzufügen", - "extensions_empty_title": "Steigern Sie die Produktivität mit mehr Tools, Widgets und Bots", + "extensions_empty_description": "Wähle \"%(addIntegrations)s\" um Erweiterungen zu suchen und diesem Chat hinzuzufügen", + "extensions_empty_title": "Steigere die Produktivität mit mehr Tools, Widgets und Bots", "files_button": "Dateien", "pinned_messages": { - "empty_description": "Wählen Sie eine Nachricht aus und wählen Sie „%(pinAction)s “, um sie hier einzuschließen.", - "empty_title": "Hefte wichtige Nachrichten an, damit sie leicht gefunden werden können.", + "empty_description": "Wähle „%(pinAction)s“ an einer Nachricht, um sie hier einzufügen.", + "empty_title": "Fixiere wichtige Nachrichten, damit sie leicht gefunden werden können.", "header": { "one": "1 angeheftete Nachricht", "other": "%(count)s angeheftete Nachrichten" @@ -1844,15 +1876,10 @@ "other": "Du kannst nur %(count)s Widgets anheften" }, "menu": "Menü öffnen", - "release_announcement": { - "close": "Ok", - "description": "Alle angepinnten Nachrichten finden Sie hier. Bewegen Sie den Mauszeiger über eine beliebige Nachricht und wählen Sie „Pin“, um die Nachricht hinzuzufügen.", - "title": "Alle neuen angehefteten Nachrichten" - }, "reply_thread": "Auf Nachricht im Thread antworten", "unpin_all": { "button": "Alle Nachrichten loslösen", - "content": "Stellen Sie sicher, dass Sie wirklich alle angehefteten Nachrichten entfernen möchten. Diese Aktion kann nicht rückgängig gemacht werden.", + "content": "Alle fixierten Nachrichten lösen? Diese Aktion kann nicht rückgängig gemacht werden.", "title": "Alle Nachrichten loslösen?" }, "view": "Im Nachrichtenverlauf ansehen" @@ -1860,13 +1887,13 @@ "pinned_messages_button": "Angeheftete Nachrichten", "poll": { "active_heading": "Aktive Umfragen", - "empty_active": "In diesem Raum gibt es keine aktiven Umfragen", + "empty_active": "In diesem Chat gibt es keine aktiven Umfragen", "empty_active_load_more": "Es sind keine aktiven Umfragen verfügbar. Lade weitere Umfragen, um die der vorherigen Monate zu sehen", "empty_active_load_more_n_days": { "one": "Für den vergangenen Tag sind keine aktiven Umfragen verfügbar. Lade weitere Umfragen, um die der vorherigen Monate zu sehen", "other": "Für die vergangenen %(count)s Tage sind keine aktiven Umfragen verfügbar. Lade weitere Umfragen, um die der vorherigen Monate zu sehen" }, - "empty_past": "In diesem Raum gibt es keine abgeschlossenen Umfragen", + "empty_past": "In diesem Chat gibt es keine beendeten Umfragen", "empty_past_load_more": "Es sind keine vergangenen Umfragen verfügbar. Lade weitere Umfragen, um die der vorherigen Monate zu sehen", "empty_past_load_more_n_days": { "one": "Für den vergangenen Tag sind keine beendeten Umfragen verfügbar. Lade weitere Umfragen, um die der vorherigen Monate zu sehen", @@ -1884,11 +1911,12 @@ }, "polls_button": "Umfragen", "room_summary_card": { - "title": "Raum-Info" + "title": "Chat-Info" }, "thread_list": { "context_menu_label": "Thread-Optionen" }, + "title": "Rechte Seitenleiste", "video_room_chat": { "title": "Unterhaltung" } @@ -1906,30 +1934,30 @@ "banned_by": "Du wurdest von %(memberName)s gebannt", "banned_from_room_by": "Du wurdest von %(memberName)s aus %(roomName)s verbannt", "context_menu": { - "copy_link": "Raumlink kopieren", + "copy_link": "Chatlink kopieren", "favourite": "Favorit", - "forget": "Raum vergessen", + "forget": "Chat vergessen", "low_priority": "Niedrige Priorität", "mark_read": "Als gelesen markieren", "mark_unread": "Als ungelesen markieren", "notifications_default": "Standardeinstellung verwenden", - "notifications_mute": "Raum stumm stellen", - "title": "Raumoptionen", + "notifications_mute": "Chat stumm stellen", + "title": "Chatoptionen", "unfavourite": "Favorisiert" }, - "creating_room_text": "Wir erstellen einen Raum mit %(names)s", - "dm_invite_action": "Unterhaltung beginnen", + "creating_room_text": "Chat mit %(names)s wird erstellt", + "dm_invite_action": "Neue Direktnachricht", "dm_invite_subtitle": " möchte mit dir schreiben", "dm_invite_title": "Möchtest du mit %(user)s schreiben?", "drop_file_prompt": "Datei hier loslassen zum hochladen", "edit_topic": "Thema bearbeiten", "error_3pid_invite_email_lookup": "Kann Benutzer nicht via E-Mail-Adresse finden", "error_cancel_knock_title": "Abbrechen gescheitert", - "error_join_403": "Du kannst diesen Raum nur auf Einladung betreten.", - "error_join_404_1": "Du hast versucht einen Raum via Raum-ID, aber ohne Angabe von Servern zu betreten. Raum-IDs sind interne Kennungen und können nicht ohne weitere Informationen zum Betreten von Räumen genutzt werden.", - "error_join_404_2": "Falls du eine Adresse kennst, versuche den Raum mit dieser zu betreten.", - "error_join_404_invite": "Die dich einladende Person hat den Raum verlassen oder ihr Heim-Server ist außer Betrieb.", - "error_join_404_invite_same_hs": "Die Person, die dich eingeladen hat, hat den Raum wieder verlassen.", + "error_join_403": "Du kannst diesem Chat nur auf Einladung beitreten.", + "error_join_404_1": "Du hast versucht einen Chat via Chat-ID, aber ohne Angabe von Servern zu betreten. Chat-IDs sind interne Kennungen und können nicht ohne weitere Informationen zum Beitritt von Chats genutzt werden.", + "error_join_404_2": "Falls du eine Adresse kennst, versuche den Chat mit dieser zu betreten.", + "error_join_404_invite": "Die dich einladende Person hat den Chat verlassen oder ihr Homeserver ist offline.", + "error_join_404_invite_same_hs": "Die Person, die dich eingeladen hat, hat den Chat wieder verlassen.", "error_join_connection": "Es gab einen Fehler beim Betreten.", "error_join_incompatible_version_1": "Verzeihung, dein Heim-Server ist hierfür zu alt.", "error_join_incompatible_version_2": "Bitte setze dich mit der Administration deines Heim-Servers in Verbindung.", @@ -1950,60 +1978,61 @@ }, "face_pile_tooltip_shortcut": "Inklusive %(commaSeparatedMembers)s", "face_pile_tooltip_shortcut_joined": "Mit dir, %(commaSeparatedMembers)s", + "failed_determine_user": "Es kann nicht ermittelt werden, welcher Nutzer ignoriert werden soll, da sich die Mitgliedschaft geändert hat.", "failed_reject_invite": "Ablehnen der Einladung ist fehlgeschlagen", - "forget_room": "Diesen Raum entfernen", + "forget_room": "Diesen Chat entfernen", "forget_space": "Diesen Space vergessen", "header": { "n_people_asking_to_join": { "one": "Möchte beitreten", "other": "%(count)s Personen möchten beitreten" }, - "room_is_public": "Dieser Raum ist öffentlich" + "room_is_public": "Dieser Chat ist öffentlich" }, - "header_avatar_open_settings_label": "Raumeinstellungen öffnen", + "header_avatar_open_settings_label": "Chateinstellungen öffnen", "header_face_pile_tooltip": "Personen", "header_untrusted_label": "Nicht vertrauenswürdig", - "inaccessible": "Dieser Raum oder Space ist im Moment nicht zugänglich.", + "inaccessible": "Dieser Chat oder Space ist im Moment nicht zugänglich.", "inaccessible_name": "Auf %(roomName)s kann momentan nicht zugegriffen werden.", - "inaccessible_subtitle_1": "Versuche es später erneut oder bitte einen Raum- oder Space-Admin um eine Zutrittserlaubnis.", + "inaccessible_subtitle_1": "Versuche es später erneut oder bitte einen Chat- oder Space-Admin um Erlaubnis für Zugriff.", "inaccessible_subtitle_2": "%(errcode)s wurde während des Betretens zurückgegeben. Wenn du denkst, dass diese Meldung nicht korrekt ist, reiche bitte einen Fehlerbericht ein.", "intro": { + "display_topic": "Thema: ", "dm_caption": "Nur ihr beide nehmt an dieser Konversation teil, es sei denn, ihr ladet jemanden ein.", + "edit_topic": "Thema: (bearbeiten)", "enable_encryption_prompt": "Aktiviere Verschlüsselung in den Einstellungen.", - "encrypted_3pid_dm_pending_join": "Sobald alle den Raum betreten hat, könnt ihr euch unterhalten", - "no_avatar_label": "Füge ein Bild hinzu, damit andere deinen Raum besser erkennen können.", + "encrypted_3pid_dm_pending_join": "Sobald alle den Chat betreten hat, könnt ihr euch unterhalten", + "no_avatar_label": "Füge ein Bild hinzu, damit andere deinen Chat besser erkennen können.", "no_topic": "Füge ein Thema hinzu, damit andere wissen, worum es hier geht.", - "private_unencrypted_warning": "Dieser Raum ist nicht verschlüsselt. Oft ist dies aufgrund eines nicht unterstützten Geräts oder Methode wie E-Mail-Einladungen der Fall.", - "room_invite": "Nur in diesen Raum einladen", + "private_unencrypted_warning": "Dieser Chat ist nicht verschlüsselt. Oft ist dies aufgrund eines nicht unterstützten Geräts oder Methode wie E-Mail-Einladungen der Fall.", + "room_invite": "Nur in diesen Chat einladen", "send_message_start_dm": "Schreibe deine erste Nachricht, um zur Unterhaltung einzuladen", "start_of_dm_history": "Dies ist der Beginn deiner Direktnachrichten mit .", "start_of_room": "Dies ist der Beginn von .", - "topic": "Thema: %(topic)s ", - "topic_edit": "Thema: %(topic)s (ändern)", "unencrypted_warning": "Ende-zu-Ende-Verschlüsselung ist deaktiviert", - "user_created": "%(displayName)s hat diesen Raum erstellt.", - "you_created": "Du hast diesen Raum erstellt." + "user_created": "%(displayName)s hat diesen Chat erstellt.", + "you_created": "Du hast diesen Chat erstellt." }, "invite_email_mismatch_suggestion": "Teile diese E-Mail-Adresse in den Einstellungen, um Einladungen direkt in %(brand)s zu erhalten.", "invite_sent_to_email": "Einladung an %(email)s gesendet", "invite_sent_to_email_room": "Diese Einladung zu %(roomName)s wurde an %(email)s gesendet", "invite_subtitle": "Eingeladen von ", - "invite_this_room": "In diesen Raum einladen", + "invite_this_room": "In diesen Chat einladen", "invite_title": "Möchtest du %(roomName)s betreten?", "inviter_unknown": "Unbekannt", "invites_you_text": "Du wirst von eingeladen", "join_button_account": "Registrieren", "join_failed_needs_invite": "Um %(roomName)s zu betrachten, benötigst du eine Einladung", "join_the_discussion": "An Diskussion teilnehmen", - "join_title": "Betrete den Raum, um teilzunehmen", + "join_title": "Betrete den Chat, um teilzunehmen", "join_title_account": "An Unterhaltung mit einem Konto teilnehmen", - "joining": "Betrete …", - "joining_room": "Betrete Raum …", + "joining": "Trete bei …", + "joining_room": "Trete dem Chat bei …", "joining_space": "Betrete Space …", "jump_read_marker": "Zur ersten ungelesenen Nachricht springen.", "jump_to_bottom_button": "Zur neusten Nachricht springen", "jump_to_date": "Zu Datum springen", - "jump_to_date_beginning": "Der Anfang des Raums", + "jump_to_date_beginning": "Der Anfang des Chats", "jump_to_date_prompt": "Wähle eine Datum aus", "kick_reason": "Grund: %(reason)s", "kicked_by": "Du wurdest von %(memberName)s entfernt", @@ -2017,38 +2046,41 @@ "knock_send_action": "Beitrittsanfrage stellen", "knock_sent": "Beitrittsanfrage gestellt", "knock_sent_subtitle": "Deine Beitrittsanfrage wurde noch nicht bearbeitet.", - "knock_subtitle": "Du benötigst eine Beitrittsberechtigung, um den Raum betrachten oder an der Unterhaltung teilnehmen zu können. Du kannst nachstehend eine Beitrittsanfrage stellen.", - "leave_error_title": "Fehler beim Verlassen des Raums", - "leave_server_notices_description": "Du kannst diesen Raum nicht verlassen, da dieser Raum für wichtige Mitteilungen vom Heim-Server verwendet wird.", - "leave_server_notices_title": "Der Raum für Server-Mitteilungen kann nicht verlassen werden", - "leave_unexpected_error": "Unerwarteter Server-Fehler beim Versuch den Raum zu verlassen", + "knock_subtitle": "Du benötigst eine Beitrittsberechtigung, um den Chat betrachten oder an der Unterhaltung teilnehmen zu können. Du kannst nachstehend eine Beitrittsanfrage stellen.", + "leave_error_title": "Fehler beim Verlassen des Chats", + "leave_server_notices_description": "Du kannst diesen Chat nicht verlassen, da dieser Chat für wichtige Mitteilungen vom Homeserver verwendet wird.", + "leave_server_notices_title": "Der Chat für Server-Mitteilungen kann nicht verlassen werden", + "leave_unexpected_error": "Unerwarteter Server-Fehler beim Versuch den Chat zu verlassen", "link_email_to_receive_3pid_invite": "Verbinde diese E-Mail-Adresse in den Einstellungen mit deinem Konto, um die Einladungen direkt in %(brand)s zu erhalten.", "loading_preview": "Lade Vorschau", - "no_peek_join_prompt": "Vorschau von %(roomName)s kann nicht angezeigt werden. Möchtest du den Raum betreten?", + "no_peek_join_prompt": "Vorschau von %(roomName)s kann nicht angezeigt werden. Möchtest du dem Chat beitreten?", "no_peek_no_name_join_prompt": "Es gibt keine Vorschau, dennoch betreten?", "not_found_subtitle": "Bist du sicher am richtigen Ort?", - "not_found_title": "Dieser Raum oder Space existiert nicht.", + "not_found_title": "Dieser Chat oder Space existiert nicht.", "not_found_title_name": "%(roomName)s existiert nicht.", - "peek_join_prompt": "Du erkundest den Raum %(roomName)s. Willst du ihn betreten?", + "peek_join_prompt": "Du erkundest den Chat %(roomName)s. Willst du ihm beitreten?", "pinned_message_badge": "Fixierte Nachrichten", "pinned_message_banner": { "button_close_list": "Liste schließen", "button_view_all": "Alle anzeigen", - "description": "In diesem Raum sind Nachrichten angeheftet. Klicken Sie hier, um sie anzusehen.", - "go_to_message": "Fixierte Nachrichten im Nachrichtenverlauf anzeigen.", + "description": "Fixierte Nachrichten", + "go_to_newest_message": "Schau die fixierte Nachricht im Nachrichtenverlauf an und die neueste fixierte Nachricht hier an.", + "go_to_next_message": "Schau dir die fixierte Nachricht im Nachrichtenverlauf an und die nächst ältere Nachricht hier an", "title": "%(index)s of %(length)s Fixierte Nachrichten" }, "read_topic": "Klicke, um das Thema zu lesen", "rejecting": "Lehne Einladung ab …", "rejoin_button": "Erneut betreten", + "room_content": "Chat-Inhalt", + "room_is_low_priority": "Dieser Chat hat niedrige Priorität", "search": { - "all_rooms_button": "Alle Räume durchsuchen", + "all_rooms_button": "Durchsuche alle Chats", "placeholder": "Nachrichten durchsuchen...", "summary": { "one": "1 Ergebnis für \"\" gefunden", "other": "%(count)s Ergebnisse für \"\" gefunden" }, - "this_room_button": "Diesen Raum durchsuchen" + "this_room_button": "Diesen Chat durchsuchen" }, "status_bar": { "delete_all": "Alle löschen", @@ -2064,15 +2096,15 @@ }, "unknown_status_code_for_timeline_jump": "unbekannter Statuscode", "unread_notifications_predecessor": { - "one": "Du hast %(count)s ungelesene Benachrichtigungen in einer früheren Version dieses Raumes.", - "other": "Du hast %(count)s ungelesene Benachrichtigungen in einer früheren Version dieses Raums." + "one": "Du hast %(count)s ungelesene Benachrichtigungen in einer früheren Version dieses Chats.", + "other": "Du hast %(count)s ungelesene Benachrichtigungen in einer früheren Version dieses Chats." }, - "upgrade_error_description": "Überprüfe nochmal ob dein Server die ausgewählte Raumversion unterstützt und versuche es nochmal.", - "upgrade_error_title": "Fehler bei Raumaktualisierung", - "upgrade_warning_bar": "Die Aktualisierung dieses Raums deaktiviert die aktuelle Instanz des Raums und erstellt einen aktualisierten Raum mit demselben Namen.", - "upgrade_warning_bar_admins": "Nur Raumadministratoren werden diese Nachricht sehen", - "upgrade_warning_bar_unstable": "Dieser Raum läuft mit der Raumversion , welche dieser Heim-Server als instabil markiert hat.", - "upgrade_warning_bar_upgraded": "Dieser Raum wurde bereits aktualisiert.", + "upgrade_error_description": "Überprüfe nochmal ob dein Server die ausgewählte Chat-Version unterstützt und versuche es nochmal.", + "upgrade_error_title": "Fehler bei Aktualisierung der Chat-Version", + "upgrade_warning_bar": "Um diesen Chat zu aktualisieren, muss der aktuelle Chat geschlossen werden und ein neuer Chat mit dem gleichen Namen angelegt werden.", + "upgrade_warning_bar_admins": "Nur Chat Administratoren werden diese Nachricht sehen", + "upgrade_warning_bar_unstable": "Dieser Chat läuft mit der Chat-Version , welche dieser Homeserver als instabil markiert hat.", + "upgrade_warning_bar_upgraded": "Dieser Chat wurde bereits aktualisiert.", "upload": { "uploading_multiple_file": { "one": "%(filename)s und %(count)s weitere Dateien werden hochgeladen", @@ -2080,67 +2112,91 @@ }, "uploading_single_file": "%(filename)s wird hochgeladen" }, - "video_room": "Dieser Raum ist ein Videoraum", - "waiting_for_join_subtitle": "Sobald eingeladene Benutzer %(brand)s beigetreten sind, werdet ihr euch unterhalten können und der Raum wird Ende-zu-Ende-verschlüsselt sein", + "video_room": "Dieser Chat ist ein Videochat", + "waiting_for_join_subtitle": "Sobald eingeladene Nutzer %(brand)s beigetreten sind, werdet ihr euch Ende-zu-Ende-verschlüsselt unterhalten können", "waiting_for_join_title": "Warte darauf, dass Benutzer %(brand)s beitreten" }, "room_list": { - "add_room_label": "Raum hinzufügen", + "add_room_label": "Chat hinzufügen", "add_space_label": "Space hinzufügen", - "breadcrumbs_empty": "Keine kürzlich besuchten Räume", - "breadcrumbs_label": "Kürzlich besuchte Räume", + "breadcrumbs_empty": "Keine kürzlich besuchten Chats", + "breadcrumbs_label": "Kürzlich besuchte Chats", + "collapse_filters": "Filterliste einklappen", "empty": { "no_chats": "Noch keine Chats", - "no_chats_description": "Beginnen Sie, indem Sie jemandem eine Nachricht senden oder einen Raum erstellen", - "no_chats_description_no_room_rights": "Beginnen Sie damit, jemandem eine Nachricht zu senden", - "no_favourites": "Sie haben noch keinen Lieblingschat", - "no_favourites_description": "Sie können einen Chat in den Chat-Einstellungen zu Ihren Favoriten hinzufügen", - "no_invites": "Sie haben keine ungelesenen Einladungen", - "no_mentions": "Sie haben keine ungelesenen Erwähnungen", - "no_people": "Sie haben noch keine direkten Chats", - "no_people_description": "Sie können Filter deaktivieren, um Ihre anderen Chats anzuzeigen", - "no_rooms": "Sie sind noch in keinem Raum", - "no_rooms_description": "Sie können Filter deaktivieren, um Ihre anderen Chats anzuzeigen", - "no_unread": "Glückwunsch! Sie haben keine ungelesenen Nachrichten", + "no_chats_description": "Leg los, indem du jemandem eine Nachricht schickst oder einen Chat erstellst", + "no_chats_description_no_room_rights": "Leg los, indem du jemandem eine Nachricht schickst", + "no_favourites": "Du hast noch keine Chats als Favorit markiert", + "no_favourites_description": "In den Chat Einstellungen kannst du einen Chat als Favorit markieren", + "no_invites": "Du hast keine ungelesenen Einladungen", + "no_lowpriority": "Du hast keine Chats mit niedriger Priorität.", + "no_mentions": "Du hast keine ungelesenen Erwähnungen", + "no_people": "Du hast noch keine Direktnachrichten", + "no_people_description": "Wähle Filter ab, um Chats zu sehen.", + "no_rooms": "Du bist noch in keinem Chat", + "no_rooms_description": "Wähle Filter ab, um Chats zu sehen.", + "no_unread": "Glückwunsch! Du hast keine ungelesenen Nachrichten.", "show_activity": "Alle Aktivitäten ansehen", "show_chats": "Alle Chats anzeigen" }, - "failed_add_tag": "Fehler beim Hinzufügen des \"%(tagName)s\"-Tags an dem Raum", - "failed_remove_tag": "Entfernen der Raum-Kennzeichnung %(tagName)s fehlgeschlagen", + "expand_filters": "Filterliste ausklappen", + "failed_add_tag": "Fehler beim Hinzufügen des \"%(tagName)s\"-Tags an den Chat", + "failed_remove_tag": "Entfernen des Chat-Tags %(tagName)s fehlgeschlagen", "failed_set_dm_tag": "Fehler beim Setzen der Nachrichtenmarkierung", "filters": { "favourite": "Favoriten", "invites": "Einladungen", + "low_priority": "Niedrige Priorität", "mentions": "Erwähnungen", "people": "Personen", - "rooms": "Räume", - "unread": "Ungelesene" + "rooms": "Gruppen", + "unread": "Ungelesen" }, "home_menu_label": "Startseiteneinstellungen", - "join_public_room_label": "Öffentlichen Raum betreten", + "join_public_room_label": "Öffentlichem Chat beitreten", "joining_rooms_status": { - "one": "Betrete %(count)s Raum", - "other": "Betrete %(count)s Räume" + "one": "Trete %(count)s Chat bei", + "other": "Trete %(count)s Chats bei" }, - "list_title": "Raumliste", + "list_title": "Chatliste", "more_options": { - "copy_link": "Raumlink kopieren", + "copy_link": "Chatlink kopieren", "favourited": "Favorisiert", - "leave_room": "Raum verlassen", + "leave_room": "Chat verlassen", "low_priority": "Niedrige Priorität", "mark_read": "Als gelesen markieren", "mark_unread": "Als ungelesen markieren" }, "notification_options": "Benachrichtigungsoptionen", - "open_space_menu": "Menü „Raum öffnen“", - "primary_filters": "Filter für die Raumliste", + "open_space_menu": "Öffne Menü für Spaces", + "primary_filters": "Filter für die Chatliste", "redacting_messages_status": { - "one": "Entferne Nachrichten in %(count)s Raum", - "other": "Entferne Nachrichten in %(count)s Räumen" + "one": "Entferne Nachrichten in %(count)s Chat", + "other": "Entferne Nachrichten in %(count)s Chats" + }, + "release_announcement": { + "done": "Fertig", + "filter": { + "description": "Filter deine Chats mit nur einem Klick. Klappe aus, um mehr Filter zu sehen.", + "title": "Neue Schnellfilter" + }, + "intro": { + "description": "Die Chatliste wurde aktualisiert, um übersichtlicher und nutzerfreundlicher zu sein.", + "title": "Chats hat jetzt ein neues Design!" + }, + "next": "Weiter", + "settings": { + "description": "Um die Vorschau von Nachrichten anzuzeigen oder auszublenden, geh zu „Alle Einstellungen“ > „Einstellungen“ > „Chatliste“.", + "title": "Einige Einstellungen wurden verschoben" + }, + "sort": { + "description": "Ändere die Reihenfolge deiner Chats von „Neueste zuerst“ zu „A-Z“.", + "title": "Sortiere deine Chats" + } }, "room": { "more_options": "Weitere Optionen", - "open_room": "Raum öffnen %(roomName)s" + "open_room": "Öffne Chat %(roomName)s" }, "room_options": "Chatroomoptionen", "show_less": "Weniger anzeigen", @@ -2157,14 +2213,14 @@ "activity": "Aktivität", "atoz": "A–Z" }, - "sort_unread_first": "Räume mit ungelesenen Nachrichten zuerst zeigen", + "sort_unread_first": "Zeige Chats mit ungelesenen Nachrichten zuerst", "space_menu": { "home": "Space-Übersicht", - "space_settings": "Raumeinstellungen" + "space_settings": "Space Einstellungen" }, "space_menu_label": "%(spaceName)s-Menü", "sublist_options": "Optionen anzeigen", - "suggested_rooms_heading": "Vorgeschlagene Räume" + "suggested_rooms_heading": "Vorgeschlagene Chats" }, "room_settings": { "access": { @@ -2172,61 +2228,61 @@ "title": "Zutritt" }, "advanced": { - "error_upgrade_description": "Die Raumaktualisierung konnte nicht fertiggestellt werden", - "error_upgrade_title": "Raumaktualisierung fehlgeschlagen", - "information_section_room": "Rauminformationen", + "error_upgrade_description": "Die Chat-Version konnte nicht aktualisiert werden.", + "error_upgrade_title": "Aktualisierung der Chat-Version fehlgeschlagen", + "information_section_room": "Chatinformationen", "information_section_space": "Information über den Space", - "room_id": "Interne Raum-ID", + "room_id": "Interne Chat-ID", "room_predecessor": "Alte Nachrichten in %(roomName)s anzeigen.", - "room_upgrade_button": "Raum auf die empfohlene Raumversion aktualisieren", - "room_upgrade_warning": "Achtung: Eine Raumaktualisierung wird Raummitglieder nicht automatisch in die neue Raumversion umziehen. In der alten Raumversion wird ein Link zum neuen Raum veröffentlicht ­− Raummitglieder müssen auf diesen klicken, um den neuen Raum zu betreten.", - "room_version": "Raumversion:", - "room_version_section": "Raumversion", + "room_upgrade_button": "Aktualisiere auf die empfohlene Chat-Version", + "room_upgrade_warning": "Achtung: eine Aktualisierung der Chat-Version legt einen neuen Chat an. Die bestehenden Mitglieder werden jedoch nicht automatisch eingeladen. Im aktuellen Chat wird ein Link zum neuen Chat veröffentlicht. Mitglieder können diesem folgen, um dem neuen Chat zu beizutreten.", + "room_version": "Chat-Version:", + "room_version_section": "Chatversion", "space_predecessor": "Alte Version von %(spaceName)s anzeigen.", "space_upgrade_button": "Space auf die empfohlene Version aktualisieren", - "unfederated": "Dieser Raum ist von Personen auf anderen Matrix-Servern nicht betretbar", - "upgrade_button": "Raum auf Version %(version)s aktualisieren", - "upgrade_dialog_description": "Um diesen Raum zu aktualisieren, muss die aktuelle Instanz des Raums geschlossen und an ihrer Stelle ein neuer Raum erstellt werden. Um den Raummitgliedern die bestmögliche Erfahrung zu bieten, werden wir:", - "upgrade_dialog_description_1": "Einen neuen Raum mit demselben Namen, Beschreibung und Profilbild erstellen", - "upgrade_dialog_description_2": "Alle lokalen Raumaliase aktualisieren, damit sie auf den neuen Raum zeigen", - "upgrade_dialog_description_3": "Nutzern verbieten in dem Raum mit der alten Version zu schreiben und eine Nachricht senden, die den Nutzern rät in den neuen Raum zu wechseln", - "upgrade_dialog_description_4": "Zu Beginn des neuen Raumes einen Link zum alten Raum setzen, damit Personen die alten Nachrichten sehen können", - "upgrade_dialog_title": "Raumversion aktualisieren", - "upgrade_dwarning_ialog_title_public": "Öffentlichen Raum aktualisieren", - "upgrade_warning_dialog_description": "Eine Raumaktualisierung ist ein komplexer Vorgang, der üblicherweise empfohlen wird, wenn ein Raum aufgrund von Fehlern, fehlenden Funktionen oder Sicherheitslücken instabil ist.", - "upgrade_warning_dialog_explainer": "Die Aktualisierung wird eine neue Version des Raums erstellen. Die bisherigen Nachrichten verbleiben im archivierten Raum.", - "upgrade_warning_dialog_footer": "Du wirst diesen Raum von zu aktualisieren.", - "upgrade_warning_dialog_invite_label": "Mitglieder automatisch in den neuen Raum einladen", - "upgrade_warning_dialog_report_bug_prompt": "Dies beeinflusst meistens nur, wie der Raum auf dem Server verarbeitet wird. Solltest du Probleme mit %(brand)s haben, erstelle bitte einen Fehlerbericht.", - "upgrade_warning_dialog_report_bug_prompt_link": "Dies beeinflusst meistens nur, wie der Raum auf dem Server verarbeitet wird. Solltest du Probleme mit %(brand)s haben, melde bitte einen Programmfehler.", - "upgrade_warning_dialog_title": "Raum aktualisieren", - "upgrade_warning_dialog_title_private": "Privaten Raum aktualisieren" + "unfederated": "Nutzer von anderen Matrix Homeservern können diesem Chat nicht beitreten", + "upgrade_button": "Chat auf Version %(version)s aktualisieren", + "upgrade_dialog_description": "Um diesen Chat zu aktualisieren, muss der aktuelle Chat geschlossen werden und ein neuer Chat angelegt werden. Um den Mitgliedern den Umstieg zu erleichtern, werden wir:", + "upgrade_dialog_description_1": "Erstelle einen neuen Chat mit demselben Namen, Beschreibung und Avatar", + "upgrade_dialog_description_2": "Alle lokalen Chat-Aliase aktualisieren, damit sie auf den neuen Chat verweisen", + "upgrade_dialog_description_3": "Nutzern verbieten in dem Chat mit der alten Version zu schreiben und eine Nachricht senden, die den Nutzern rät, in den aktualisierten Chat zu wechseln", + "upgrade_dialog_description_4": "Zu Beginn des neuen Chats einen Link zum alten Chat setzen, damit Nutzer die alten Nachrichten sehen können", + "upgrade_dialog_title": "Chat-Version aktualisieren", + "upgrade_dwarning_ialog_title_public": "Öffentlichen Chat aktualisieren", + "upgrade_warning_dialog_description": "Die Aktualisierung der Chat-Version ist ein komplexer Vorgang, der üblicherweise empfohlen wird, wenn ein Chat aufgrund von Fehlern, fehlenden Funktionen oder Sicherheitslücken instabil ist.", + "upgrade_warning_dialog_explainer": "Die Aktualisierung wird eine neue Version des Chats erstellen. Die bisherigen Nachrichten verbleiben in diesem archivierten Chat.", + "upgrade_warning_dialog_footer": "Du wirst diesen Chat von Version zu aktualisieren.", + "upgrade_warning_dialog_invite_label": "Mitglieder automatisch in den neuen Chat einladen", + "upgrade_warning_dialog_report_bug_prompt": "Dies beeinflusst meistens nur, wie der Chat auf dem Server verarbeitet wird. Solltest du Probleme mit %(brand)s haben, erstelle bitte einen Fehlerbericht.", + "upgrade_warning_dialog_report_bug_prompt_link": "Dies beeinflusst meistens nur, wie der Chat auf dem Server verarbeitet wird. Solltest du Probleme mit %(brand)s haben, melde bitte einen Programmfehler.", + "upgrade_warning_dialog_title": "Chat-Version aktualisieren", + "upgrade_warning_dialog_title_private": "Chat-Version des privaten Chats aktualisieren" }, "alias_not_specified": "nicht angegeben", "bridges": { - "description": "Dieser Raum leitet Nachrichten von/an folgende(n) Plattformen weiter. Mehr erfahren.", - "empty": "Dieser Raum leitet keine Nachrichten von/an andere(n) Plattformen weiter. Mehr erfahren.", + "description": "Dieser Chat leitet Nachrichten von/an folgende(n) Plattformen weiter. Mehr erfahren.", + "empty": "Dieser Chat leitet keine Nachrichten von/an andere(n) Plattformen weiter. Mehr erfahren.", "title": "Brücken" }, "delete_avatar_label": "Avatar löschen", "general": { "alias_field_has_domain_invalid": "Fehlender Doppelpunkt vor Server (z. B. :domain.org)", - "alias_field_has_localpart_invalid": "Fehlender Raumname oder Doppelpunkt (z. B. dein-raum:domain.org)", - "alias_field_matches_invalid": "Diese Adresse verweist nicht auf diesen Raum", - "alias_field_placeholder_default": "z. B. mein-raum", + "alias_field_has_localpart_invalid": "Fehlender Chatname oder Doppelpunkt (z. B. dein-chat:domain.org)", + "alias_field_matches_invalid": "Diese Adresse verweist nicht auf diesen Chat", + "alias_field_placeholder_default": "z. B. mein-chat", "alias_field_required_invalid": "Bitte gib eine Adresse an", "alias_field_safe_localpart_invalid": "Einige Zeichen sind nicht erlaubt", "alias_field_taken_invalid": "Diese Adresse hat einen ungültigen Server oder wird bereits verwendet", "alias_field_taken_invalid_domain": "Diese Adresse wird bereits verwendet", "alias_field_taken_valid": "Diese Adresse ist verfügbar", - "alias_heading": "Raumadresse", + "alias_heading": "Chatadresse", "aliases_items_label": "Andere öffentliche Adressen:", "aliases_no_items_label": "Keine anderen öffentlichen Adressen vorhanden. Du kannst weiter unten eine hinzufügen", - "aliases_section": "Raumadressen", - "avatar_field_label": "Raumbild", + "aliases_section": "Chatadressen", + "avatar_field_label": "Chat Avatar", "canonical_alias_field_label": "Primäre Adresse", - "default_url_previews_off": "URL-Vorschau ist für Mitglieder des Raumes standardmäßig deaktiviert.", - "default_url_previews_on": "URL-Vorschau ist für Mitglieder des Raumes standardmäßig aktiviert.", + "default_url_previews_off": "URL-Vorschau ist für Mitglieder des Chats standardmäßig deaktiviert.", + "default_url_previews_on": "URL-Vorschau ist für Mitglieder des Chats standardmäßig aktiviert.", "description_space": "Einstellungen vom Space bearbeiten.", "error_creating_alias_description": "Es gab einen Fehler beim Anlegen der Adresse. Entweder erlaubt es der Server nicht oder es gab ein temporäres Problem.", "error_creating_alias_title": "Fehler beim Anlegen der Adresse", @@ -2236,27 +2292,27 @@ "error_publishing": "Chatroom konnte nicht auf öffentlich gestellt werden", "error_publishing_detail": "Beim Veröffentlichen dieses Chatrooms ist ein Fehler aufgetreten", "error_save_space_settings": "Spaceeinstellungen konnten nicht gespeichert werden.", - "error_updating_alias_description": "Es gab einen Fehler beim Ändern des Raumalias. Entweder erlaubt es der Server nicht oder es gab ein temporäres Problem.", - "error_updating_canonical_alias_description": "Es gab ein Problem beim Aktualisieren der Raum-Hauptadresse. Es kann sein, dass der Server dies verbietet oder ein temporäres Problem aufgetreten ist.", + "error_updating_alias_description": "Es gab einen Fehler beim Ändern der alternativen Adresse des Chat. Entweder erlaubt es der Server nicht oder es gab ein temporäres Problem.", + "error_updating_canonical_alias_description": "Es gab ein Problem beim Aktualisieren der Hauptadresse des Chats. Es kann sein, dass der Server dies verbietet oder ein temporäres Problem aufgetreten ist.", "error_updating_canonical_alias_title": "Fehler beim Aktualisieren der Hauptadresse", "leave_space": "Space verlassen", "local_alias_field_label": "Lokale Adresse", - "local_aliases_explainer_room": "Erstelle Adressen für diesen Raum, damit andere Benutzer den Raum auf deinem Heim-Server (%(localDomain)s) finden können", + "local_aliases_explainer_room": "Erstelle Adressen für diesen Chat, damit andere Nutzer den Chat auf deinem Homeserver (%(localDomain)s) finden können", "local_aliases_explainer_space": "Füge Adressen für diesen Space hinzu, damit andere Leute ihn über deinen Heim-Server (%(localDomain)s) finden können", "local_aliases_section": "Lokale Adressen", - "name_field_label": "Raumname", + "name_field_label": "Chatname", "new_alias_placeholder": "Neue öffentliche Adresse (z. B. #alias:server)", - "no_aliases_room": "Dieser Raum hat keine lokale Adresse", + "no_aliases_room": "Dieser Chat hat keine lokale Adresse", "no_aliases_space": "Dieser Space hat keine lokale Adresse", "other_section": "Sonstiges", - "publish_toggle": "Diesen Raum im Raumverzeichnis von %(domain)s veröffentlichen?", + "publish_toggle": "Diesen Chat im Chat-Verzeichnis von %(domain)s veröffentlichen?", "published_aliases_description": "Damit du die Adresse veröffentlichen kannst, musst du sie zuerst als lokale Adresse hinzufügen.", - "published_aliases_explainer_room": "Veröffentlichte Adressen erlauben jedem, den Raum zu betreten.", + "published_aliases_explainer_room": "Veröffentlichte Adressen erlauben jedem, dem Chat zu beizutreten.", "published_aliases_explainer_space": "Veröffentlichte Adressen erlauben jedem, den Space zu betreten.", "published_aliases_section": "Öffentliche Adresse", "save": "Speichern", - "topic_field_label": "Raumthema", - "url_preview_encryption_warning": "In verschlüsselten Räumen wie diesem ist die Linkvorschau standardmäßig deaktiviert, damit dein Heim-Server (der die Vorschau erzeugt) keine Informationen über Links in diesem Raum erhält.", + "topic_field_label": "Chat-Thema", + "url_preview_encryption_warning": "In verschlüsselten Chats wie diesem ist die Linkvorschau standardmäßig deaktiviert, damit dein Homeserver (der die Vorschau erzeugt) keine Informationen über Links in diesem Chat erhält.", "url_preview_explainer": "Die URL-Vorschau kann Informationen wie den Titel, die Beschreibung sowie ein Vorschaubild der Website enthalten.", "url_previews_section": "URL-Vorschau", "user_url_previews_default_off": "Du hast die URL-Vorschau standardmäßig deaktiviert.", @@ -2278,8 +2334,8 @@ "see_more": "Mehr" }, "permissions": { - "add_privileged_user_description": "Einem oder mehreren Benutzern im Raum mehr Berechtigungen geben", - "add_privileged_user_filter_placeholder": "Benutzer im Raum suchen …", + "add_privileged_user_description": "Erteile einem oder mehreren Nutzern im Chat mehr Berechtigungen", + "add_privileged_user_filter_placeholder": "Suche Mitglieder im Chat...", "add_privileged_user_heading": "Berechtigten Benutzer hinzufügen", "ban": "Benutzer verbannen", "ban_reason": "Grund", @@ -2289,35 +2345,35 @@ "error_changing_pl_reqs_description": "Beim Ändern der Anforderungen für Benutzerrechte ist ein Fehler aufgetreten. Stelle sicher, dass du die nötigen Berechtigungen besitzt und versuche es erneut.", "error_changing_pl_reqs_title": "Fehler beim Ändern der Anforderungen für Benutzerrechte", "error_changing_pl_title": "Fehler beim Ändern der Benutzerrechte", - "error_unbanning": "Aufheben der Verbannung fehlgeschlagen", + "error_unbanning": "Aufheben der Sperre fehlgeschlagen", "events_default": "Nachrichten senden", "invite": "Person einladen", "kick": "Benutzer entfernen", "m.call": "Beginne %(brand)s-Anrufe", "m.call.member": "Trete %(brand)s-Anrufen bei", "m.reaction": "Reaktionen senden", - "m.room.avatar": "Raumbild ändern", + "m.room.avatar": "Ändere den Chat Avatar", "m.room.avatar_space": "Space-Icon ändern", "m.room.canonical_alias": "Hauptadresse ändern", "m.room.canonical_alias_space": "Hauptadresse des Space ändern", - "m.room.encryption": "Raumverschlüsselung aktivieren", + "m.room.encryption": "Chatverschlüsselung aktivieren", "m.room.history_visibility": "Sichtbarkeit des Verlaufs ändern", - "m.room.name": "Raumname ändern", + "m.room.name": "Ändere den Chat Namen", "m.room.name_space": "Name des Space ändern", "m.room.pinned_events": "Angeheftete Nachrichten verwalten", "m.room.power_levels": "Berechtigungen ändern", "m.room.redaction": "Vom mir gesendete Nachrichten löschen", "m.room.server_acl": "Server-ACLs bearbeiten", - "m.room.tombstone": "Raum aktualisieren", + "m.room.tombstone": "Chat-Version aktualisieren", "m.room.topic": "Thema ändern", "m.room.topic_space": "Beschreibung bearbeiten", - "m.space.child": "Räume in diesem Space verwalten", + "m.space.child": "Verwalte Chats in diesem Space", "m.widget": "Widgets bearbeiten", "muted_users_section": "Stummgeschaltete Benutzer", - "no_privileged_users": "Keine Nutzer haben in diesem Raum privilegierte Berechtigungen", + "no_privileged_users": "Keine Nutzer haben in diesem Chat privilegierte Berechtigungen", "notifications.room": "Alle benachrichtigen", "permissions_section": "Berechtigungen", - "permissions_section_description_room": "Wähle Rollen, die benötigt werden, um einige Teile des Raumes zu ändern", + "permissions_section_description_room": "Wähle Rollen, die benötigt werden, um einige Teile des Chat zu ändern", "permissions_section_description_space": "Wähle, von wem folgende Aktionen ausgeführt werden können", "privileged_users_section": "Privilegierte Benutzer", "redact": "Nachrichten von anderen löschen", @@ -2327,44 +2383,48 @@ "users_default": "Standard-Rolle" }, "security": { - "enable_encryption_confirm_description": "Sobald aktiviert, kann die Verschlüsselung für einen Raum nicht mehr deaktiviert werden. Nachrichten in einem verschlüsselten Raum können nur noch von Teilnehmern, aber nicht mehr vom Server gelesen werden. Einige Bots und Brücken werden vielleicht nicht mehr funktionieren. Erfahre mehr über Verschlüsselung.", + "cannot_change_to_private_due_to_missing_history_visiblity_permissions": { + "description": "Du hast keine Berechtigung, die Sichtbarkeit des Nachrichtenverlaufs des Chats zu ändern. Das ist gefährlich, weil es nicht angemeldeten Nutzern ermöglichen könnte, Nachrichten zu lesen.", + "title": "Chat kann nicht \"privat\" gemacht werden" + }, + "enable_encryption_confirm_description": "Die Verschlüsselung für einen Chat kann nicht mehr deaktiviert werden sobald sie aktiv ist. Nachrichten in einem verschlüsselten Chat können nur noch von Mitgliedern, aber nicht mehr vom Server gelesen werden. Einige Bots und Brücken werden vielleicht nicht mehr funktionieren. Erfahre mehr über Verschlüsselung.", "enable_encryption_confirm_title": "Verschlüsselung aktivieren?", - "enable_encryption_public_room_confirm_description_1": "Verschlüsselung ist für öffentliche Räume nicht empfohlen. Jeder kann öffentliche Räume finden und betreten, also kann auch jeder die Nachrichten lesen. Du wirst keine der Vorteile von Verschlüsselung erhalten und kannst sie später auch nicht mehr deaktivieren. Nachrichten in öffentlichen Räumen zu verschlüsseln, wird das empfangen und senden verlangsamen.", - "enable_encryption_public_room_confirm_description_2": "Um dieses Problem zu vermeiden, erstelle einen neuen verschlüsselten Raum für deine Konversation.", - "enable_encryption_public_room_confirm_title": "Dieser Raum ist öffentlich. Willst du die Verschlüsselung wirklich aktivieren?", - "encrypted_room_public_confirm_description_1": "Es ist nicht sinnvoll, verschlüsselte Räume öffentlich zu machen. Das würde bedeuten, dass alle den Raum finden und betreten, also auch Nachrichten lesen könnten. Du erhältst also keinen Vorteil der Verschlüsselung, während sie das Senden und Empfangen von Nachrichten langsamer macht.", - "encrypted_room_public_confirm_description_2": "Erstelle einen neuen Raum für deine Konversation, um diese Probleme zu umgehen.", - "encrypted_room_public_confirm_title": "Willst du diesen verschlüsselten Raum wirklich öffentlich machen?", + "enable_encryption_public_room_confirm_description_1": "Verschlüsselung wird für öffentliche Chats nicht empfohlen. Jeder kann öffentliche Chats finden und ihnen beitreten, also kann auch jeder die Nachrichten lesen. Die Verschlüsselung bringt keine Vorteile und lässt sich später auch nicht mehr deaktivieren. Außerdem verlangsamt die Verschlüsselung das Senden und Empfangen von Nachrichten in öffentlichen Chats.", + "enable_encryption_public_room_confirm_description_2": "Erstelle einen neuen verschlüsselten Chat, um dieses Problem zu beheben.", + "enable_encryption_public_room_confirm_title": "Dieser Chat ist öffentlich. Willst du die Verschlüsselung wirklich aktivieren?", + "encrypted_room_public_confirm_description_1": "Es ist nicht sinnvoll, verschlüsselte Chats öffentlich zu machen. Das würde bedeuten, dass jeder den Chat finden und ihm beitreten kann, also auch Nachrichten lesen kann. Du erhältst also keinen Vorteil von der Verschlüsselung, während sie das Senden und Empfangen von Nachrichten langsamer macht.", + "encrypted_room_public_confirm_description_2": "Erstelle einen neuen Chat, um diese Probleme zu umgehen.", + "encrypted_room_public_confirm_title": "Willst du diesen verschlüsselten Chat wirklich öffentlich machen?", "encryption_forced": "Dein Server erfordert die Deaktivierung der Verschlüsselung.", - "encryption_permanent": "Sobald du die Verschlüsselung aktivierst, kannst du sie nicht mehr deaktivieren.", + "encryption_permanent": "Sobald die Verschlüsselung aktiviert ist, kann sie nicht mehr deaktiviert werden.", "error_join_rule_change_title": "Fehler beim Aktualisieren der Beitrittsregeln", "error_join_rule_change_unknown": "Unbekannter Fehler", - "guest_access_warning": "Personen mit unterstützter Anwendung werden diesen Raum ohne registriertes Konto betreten können.", + "guest_access_warning": "Personen mit unterstützter Anwendung werden diesem Chat ohne registriertes Konto beitreten können.", "history_visibility_invited": "Mitglieder (ab Einladung)", "history_visibility_joined": "Mitglieder (ab Betreten)", "history_visibility_legend": "Wer kann den bisherigen Verlauf lesen?", "history_visibility_shared": "Mitglieder", - "history_visibility_warning": "Änderungen an der Sichtbarkeit des Verlaufs gelten nur für zukünftige Nachrichten. Die Sichtbarkeit des existierenden Verlaufs bleibt unverändert.", + "history_visibility_warning": "Die Sichtbarkeit des existierenden Nachrichtenverlaufs bleibt unverändert.", "history_visibility_world_readable": "Alle", "join_rule_description": "Entscheide, wer %(roomName)s betreten kann.", "join_rule_invite": "Privat (Betreten mit Einladung)", "join_rule_invite_description": "Nur Eingeladene können betreten.", "join_rule_knock": "Beitrittsanfragen", - "join_rule_knock_description": "Personen können den Raum nur betreten, wenn sie Zutritt erhalten.", + "join_rule_knock_description": "Personen können den Chat nur betreten, wenn sie Zutritt erhalten.", "join_rule_public_description": "Sichtbar und zugänglich für jeden.", "join_rule_restricted": "Spacemitglieder", "join_rule_restricted_description": "Das Betreten ist allen in diesen Spaces möglich. Ändere, welche Spaces Zutritt haben.", "join_rule_restricted_description_active_space": "Finden und betreten ist Mitgliedern von erlaubt. Du kannst auch weitere Spaces wählen.", "join_rule_restricted_description_prompt": "Das Betreten ist allen in den gewählten Spaces möglich.", "join_rule_restricted_description_spaces": "Spaces mit Zutritt", - "join_rule_restricted_dialog_description": "Entscheide, welche Spaces auf den Raum zugreifen können. Mitglieder ausgewählter Spaces können betreten.", + "join_rule_restricted_dialog_description": "Entscheide, welche Spaces auf den Chat zugreifen können. Mitglieder der ausgewählten Spaces können beitreten.", "join_rule_restricted_dialog_empty_warning": "Du entfernst alle Spaces. Der Zutritt wird auf den Standard (Privat) zurückgesetzt", "join_rule_restricted_dialog_filter_placeholder": "Spaces durchsuchen", "join_rule_restricted_dialog_heading_known": "Andere dir bekannte Spaces", "join_rule_restricted_dialog_heading_other": "Andere Spaces, die du möglicherweise nicht kennst", - "join_rule_restricted_dialog_heading_room": "Spaces, in denen du Mitglied bist und die diesen Raum enthalten", + "join_rule_restricted_dialog_heading_room": "Spaces, in denen du Mitglied bist und die diesen Chat enthalten", "join_rule_restricted_dialog_heading_space": "Spaces, die diesen Space enthalten und in denen du Mitglied bist", - "join_rule_restricted_dialog_heading_unknown": "Das sind vermutliche solche, in denen andere Raumadministratoren Mitglieder sind.", + "join_rule_restricted_dialog_heading_unknown": "Das sind vermutliche solche, in denen andere Chat Administratoren Mitglieder sind.", "join_rule_restricted_dialog_title": "Spaces wählen", "join_rule_restricted_n_more": { "other": "und %(count)s weitere", @@ -2374,9 +2434,9 @@ "other": "%(count)s Spaces haben Zutritt", "one": "Derzeit hat ein Space Zutritt" }, - "join_rule_restricted_upgrade_description": "Diese Aktualisierung gewährt Mitgliedern der ausgewählten Spaces Zugang zu diesem Raum ohne Einladung.", - "join_rule_restricted_upgrade_warning": "Dieser Raum ist Teil von Spaces von denen du kein Administrator bist. In diesen Räumen wird der alte Raum weiter angezeigt werden, aber Personen werden aufgefordert werden, dem neuen Raum beizutreten.", - "join_rule_upgrade_awaiting_room": "Neuer Raum wird geladen", + "join_rule_restricted_upgrade_description": "Diese Aktualisierung gewährt Mitgliedern der ausgewählten Spaces ohne weitere Einladung Zugang zu diesem Chat.", + "join_rule_restricted_upgrade_warning": "Dieser Chat ist Teil von Spaces von denen du kein Administrator bist. In diesen Spaces wird der alte Chat weiter angezeigt werden, aber Personen werden aufgefordert werden, dem neuen Chat beizutreten.", + "join_rule_upgrade_awaiting_room": "Neuer Chat wird geladen", "join_rule_upgrade_required": "Aktualisierung erforderlich", "join_rule_upgrade_sending_invites": { "one": "Einladung senden …", @@ -2386,14 +2446,15 @@ "one": "Space aktualisieren …", "other": "Spaces aktualisieren … (%(progress)s von %(count)s)" }, - "join_rule_upgrade_upgrading_room": "Raum wird aktualisiert", - "public_without_alias_warning": "Um den Raum zu verlinken, füge bitte eine Adresse hinzu.", - "publish_room": "Diesen Raum im Raumverzeichnis veröffentlichen.", - "publish_space": "Diesen Space im Raumverzeichnis veröffentlichen.", - "strict_encryption": "Senden Sie Nachrichten nur an verifizierte Benutzer.", + "join_rule_upgrade_upgrading_room": "Chat-Version wird aktualisiert", + "join_rule_world_readable_description": "Wenn du änderst, wer dem Chat beitreten darf, ändert sich auch, wer zukünftige Nachrichten sehen kann.", + "public_without_alias_warning": "Um den Chat zu verlinken, füge bitte eine Adresse hinzu.", + "publish_room": "Veröffentliche diesen Chat im Chat Verzeichnis.", + "publish_space": "Veröffentliche diesen Space im Chat Verzeichnis.", + "strict_encryption": "Erlaube Nachrichtenversand nur an verifizierte Nutzer.", "title": "Sicherheit" }, - "title": "Raumeinstellungen - %(roomName)s", + "title": "Chateinstellungen - %(roomName)s", "upload_avatar_label": "Profilbild hochladen", "visibility": { "alias_section": "Adresse", @@ -2411,21 +2472,21 @@ "voip": { "call_type_section": "Anrufart", "enable_element_call_caption": "%(brand)s ist Ende-zu-Ende-verschlüsselt, allerdings noch auf eine geringere Anzahl Benutzer beschränkt.", - "enable_element_call_label": "Verwende %(brand)s als alternative Anrufoption in diesem Raum", + "enable_element_call_label": "Verwende %(brand)s als alternative Anrufoption in diesem Chat", "enable_element_call_no_permissions_tooltip": "Du hast nicht die erforderlichen Berechtigungen, um dies zu ändern." } }, - "room_summary_card_back_action_label": "Rauminformationen", + "room_summary_card_back_action_label": "Chatinformationen", "scalar": { "error_create": "Widget kann nicht erstellt werden.", - "error_membership": "Du bist nicht in diesem Raum.", - "error_missing_room_id": "Fehlende Raum-ID.", + "error_membership": "Du bist nicht in diesem Chat.", + "error_missing_room_id": "Fehlende Chat-ID.", "error_missing_room_id_request": "user_id fehlt in der Anfrage", "error_missing_user_id_request": "user_id fehlt in der Anfrage", "error_permission": "Du hast dafür keine Berechtigung.", "error_power_level_invalid": "Berechtigungslevel muss eine positive ganze Zahl sein.", - "error_room_not_visible": "Raum %(roomId)s ist nicht sichtbar", - "error_room_unknown": "Dieser Raum wurde nicht erkannt.", + "error_room_not_visible": "Chat %(roomId)s ist nicht sichtbar", + "error_room_unknown": "Dieser Chat wurde nicht erkannt.", "error_send_request": "Übertragung der Anfrage fehlgeschlagen.", "failed_read_event": "Lesen der Ereignisse fehlgeschlagen", "failed_send_event": "Übertragung des Ereignisses fehlgeschlagen" @@ -2445,7 +2506,7 @@ "title": "Server reagiert nicht" }, "service_worker_error": { - "description": "%(brand)s benötigt einen Service Worker zum Laden authentifizierter Medien aus Matrix-Inhaltsrepositorys. Dies wird von Ihrem Browser nicht unterstützt, sodass Medien möglicherweise nicht geladen werden können.", + "description": "%(brand)s benötigt einen Service Worker um authentifizierte Medien aus dem Speicher zu laden. Dies wird vom Browser nicht unterstützt, so dass Fehler auftreten können.", "title": "Service Worker konnte nicht geladen werden" }, "seshat": { @@ -2478,8 +2539,8 @@ "dialog_title": "Einstellungen: Konto", "title": "Konto" }, - "all_rooms_home": "Alle Räume auf Startseite anzeigen", - "all_rooms_home_description": "Alle Räume, denen du beigetreten bist, werden auf der Startseite erscheinen.", + "all_rooms_home": "Zeige alle Chats auf der Startseite", + "all_rooms_home_description": "Alle Chats, denen du beigetreten bist, werden auf der Startseite erscheinen.", "always_show_message_timestamps": "Nachrichtenzeitstempel immer anzeigen", "appearance": { "bundled_emoji_font": "Mitgelieferte Emoji-Schriftart verwenden", @@ -2492,17 +2553,17 @@ "custom_theme_add": "Benutzerdefiniertes Design hinzufügen", "custom_theme_downloading": "Benutzerdefiniertes Design wird heruntergeladen...", "custom_theme_error_downloading": "Fehler beim Herunterladen des Designs.", - "custom_theme_help": "Geben Sie die URL eines benutzerdefinierten Designs ein, das Sie anwenden möchten.", + "custom_theme_help": "Gib die URL eines benutzerdefinierten Designs ein, das du anwenden möchten.", "custom_theme_invalid": "Ungültiges Designschema.", "dialog_title": "Einstellungen: Erscheinungsbild", "font_size": "Schriftgröße", "font_size_default": "%(fontSize)s (Standard)", - "high_contrast": "Hochkontrast", + "high_contrast": "Hoher Kontrast", "image_size_default": "Standard", "image_size_large": "Groß", - "layout_bubbles": "Nachrichtenblasen", + "layout_bubbles": "Sprechblasen", "layout_irc": "IRC (Experimentell)", - "match_system_theme": "An Systemdesign anpassen", + "match_system_theme": "An Design des Betriebssystems anpassen", "timeline_image_size": "Bildgröße im Verlauf" }, "automatic_language_detection_syntax_highlight": "Automatische Spracherkennung für die Syntaxhervorhebung", @@ -2513,27 +2574,28 @@ "code_block_line_numbers": "Zeilennummern in Quelltextblöcken", "disable_historical_profile": "Aktuelle Profilbilder und Anzeigenamen im Verlauf anzeigen", "discovery": { - "title": "Wie man Sie findet" + "title": "So findet man dich" }, "emoji_autocomplete": "Emoji-Vorschläge während Eingabe", "enable_markdown": "Markdown aktivieren", "enable_markdown_description": "Beginne Nachrichten mit /plain, um sie ohne Markdown zu senden.", "encryption": { "advanced": { - "breadcrumb_first_description": "Ihre Kontodaten, Kontakte, Einstellungen und Chat-Liste werden gespeichert", + "breadcrumb_first_description": "Deine Kontodaten, Kontakte, Einstellungen und Chatlisten werden gespeichert", "breadcrumb_page": "Verschlüsselung zurücksetzen", - "breadcrumb_second_description": "Sie verlieren jeglichen Nachrichtenverlauf, der nur auf dem Server gespeichert ist", - "breadcrumb_third_description": "Sie müssen alle Ihre vorhandenen Geräte und Kontakte erneut verifizieren", - "breadcrumb_title": "Sind Sie sicher, dass Sie Ihre Identität zurücksetzen möchten?", - "breadcrumb_title_forgot": "Haben Sie Ihren Wiederherstellungsschlüssel vergessen? Sie müssen Ihre Identität zurücksetzen.", - "breadcrumb_title_sync_failed": "Der Schlüsselspeicher konnte nicht synchronisiert werden. Sie müssen Ihre Identität zurücksetzen.", - "breadcrumb_warning": "Tun Sie dies nur, wenn Sie glauben, dass Ihr Konto kompromittiert wurde.", + "breadcrumb_second_description": "Du verlierst den Nachrichtenverlauf, der nur auf dem Server gespeichert ist", + "breadcrumb_third_description": "Du musst alle deine Geräte und Kontakte erneut verifizieren", + "breadcrumb_title": "Möchtest du deine kryptografische Identität wirklich zurücksetzen?", + "breadcrumb_title_cant_confirm": "Du musst deine Identität zurücksetzen.", + "breadcrumb_title_forgot": "Falls du deinen Wiederherstellungsschlüssel vergessen hast, musst du deine Identität zurücksetzen.", + "breadcrumb_title_sync_failed": "Der Schlüsselspeicher konnte nicht synchronisiert werden. Du musst deine kryptografische Identität zurücksetzen.", + "breadcrumb_warning": "Tu dies nur, wenn du befürchtest, dass dein Konto gehackt wurde.", "details_title": "Angaben zur Verschlüsselung", - "do_not_close_warning": "Schließen Sie dieses Fenster nicht, bis der Reset abgeschlossen ist", + "do_not_close_warning": "Schließe dieses Fenster nicht, bis der Reset abgeschlossen ist", "export_keys": "Schlüssel exportieren", "import_keys": "Schlüssel importieren", - "other_people_device_description": "Warnung: Benutzer, die sich nicht explizit bei Ihnen verifiziert haben (z. B. mit Emojis), erhalten Ihre verschlüsselten Nachrichten nicht. Außerdem erhalten nicht verifizierte Geräte von verifizierten Benutzern Ihre verschlüsselten Nachrichten nicht.", - "other_people_device_label": "Senden Sie in verschlüsselten Räumen Nachrichten nur an verifizierte Benutzer", + "other_people_device_description": "Warnung: Nur verifizierte Nutzer erhalten verschlüsselte Nachrichten und ausschließlich auf ihren verifizierten Geräten.", + "other_people_device_label": "In verschlüsselten Chats dürfen Nachrichten nur an verifizierte Nutzer gesendet werden.", "other_people_device_title": "Geräte anderer Personen", "reset_identity": "Kryptografische Identität zurücksetzen", "reset_in_progress": "Der Reset wird ausgeführt", @@ -2542,46 +2604,46 @@ "title": "Advanced" }, "confirm_key_storage_off": "Soll die Speicherung der Schlüssel wirklich deaktiviert sein?", - "confirm_key_storage_off_description": "Wenn Sie sich von all Ihren Geräten abmelden, verlieren Sie Ihren Nachrichtenverlauf und müssen alle Ihre vorhandenen Kontakte erneut überprüfen. Erfahre mehr ", + "confirm_key_storage_off_description": "Wenn du dich von allen Geräten abmeldest, verlierst du deinen Nachrichtenverlauf und musst alle Kontakte erneut verifizieren. Erfahre mehr", "delete_key_storage": { "breadcrumb_page": "Schlüsselspeicher löschen", "confirm": "Schlüsselspeicher löschen", - "description": "Durch das Löschen des Schlüsselspeichers werden Ihre kryptografische Identität und Ihre Nachrichtenschlüssel vom Server entfernt und die folgenden Sicherheitsfunktionen werden deaktiviert:", - "list_first": "Sie werden auf neuen Geräten keinen verschlüsselten Nachrichtenverlauf haben", - "list_second": "Sie verlieren den Zugriff auf Ihre verschlüsselten Nachrichten, wenn Sie von %(brand)s überall abgemeldet sind", - "title": "Möchten Sie den Schlüsselspeicher wirklich ausschalten und löschen?" + "description": "Das Löschen des Schlüsselspeichers entfernt deine kryptografische Identität und deine Nachrichtenschlüssel vom Server. Die folgenden Sicherheitsfunktionen werden deaktiviert:", + "list_first": "Auf neuen Geräten ist kein verschlüsselter Nachrichtenverlauf verfügbar.", + "list_second": "Kein Zugriff auf verschlüsselten Nachrichten, wenn du überall von %(brand)s abgemeldet bist", + "title": "Möchtest du die Speicherung der Schlüssel wirklich deaktivieren und entfernen?" }, "device_not_verified_button": "Dieses Gerät verifizieren", - "device_not_verified_description": "Sie müssen dieses Gerät verifizieren, um Ihre Verschlüsselungseinstellungen einsehen zu können.", + "device_not_verified_description": "Du musst dieses Gerät verifizieren, um deine Verschlüsselungseinstellungen sehen zu können.", "device_not_verified_title": "Gerät nicht verifiziert", "dialog_title": "Einstellungen: Verschlüsselung", "key_storage": { "allow_key_storage": "Schlüsselspeicherung zulassen", - "description": "Speichern Sie Ihre kryptografische Identität und Ihre Nachrichtenschlüssel sicher auf dem Server. Auf diese Weise können Sie Ihren Nachrichtenverlauf auf allen neuen Geräten einsehen. Erfahre mehr ", + "description": "Speichere deine kryptographische Identität und die Nachrichtenschlüssel auf dem Server. Auf diese Weise kannst du deinen Nachrichtenverlauf auf neuen Geräten einsehen. Erfahre mehr", "title": "Schlüsselspeicher" }, "recovery": { - "change_recovery_confirm_button": "Bestätigen Sie den neuen Wiederherstellungsschlüssel", - "change_recovery_confirm_description": "Geben Sie unten Ihren neuen Wiederherstellungsschlüssel ein, um den Vorgang abzuschließen. Ihr alter Wiederherstellungsschlüssel funktioniert nicht mehr.", - "change_recovery_confirm_title": "Geben Sie Ihren neuen Wiederherstellungsschlüssel ein", + "change_recovery_confirm_button": "Bestätige den neuen Wiederherstellungsschlüssel", + "change_recovery_confirm_description": "Gib unten deinen neuen Wiederherstellungsschlüssel ein, um den Vorgang abzuschließen. Dein alter Schlüssel funktioniert nicht mehr.", + "change_recovery_confirm_title": "Gib deinen neuen Wiederherstellungsschlüssel ein", "change_recovery_key": "Wiederherstellungsschlüssel ändern", - "change_recovery_key_description": "Notieren Sie sich diesen neuen Wiederherstellungsschlüssel an einem sicheren Ort. Klicken Sie anschließend auf Weiter, um die Änderung zu bestätigen.", + "change_recovery_key_description": "Speichere diesen neuen Wiederherstellungsschlüssel an einem sicheren Ort. Klicke anschließend auf Weiter, um die Änderung zu bestätigen.", "change_recovery_key_title": "Wiederherstellungsschlüssel ändern?", - "description": "Falls Sie alle Ihre Geräte verloren haben. stellen Sie Ihre kryptografische Identität und Ihren Nachrichtenverlauf mit einem Wiederherstellungsschlüssel wieder her.", + "description": "Solltest du alle Geräte verloren haben, kannst du deine kryptographische Identität und den Nachrichtenverlauf mit einem Wiederherstellungsschlüssel wieder herstellen.", "enter_key_error": "Der eingegebene Wiederherstellungsschlüssel ist nicht korrekt.", - "enter_recovery_key": "Geben Sie den Wiederherstellungsschlüssel ein", + "enter_recovery_key": "Gib den Wiederherstellungsschlüssel ein", "forgot_recovery_key": "Wiederherstellungsschlüssel vergessen?", - "key_storage_warning": "Ihr Schlüsselspeicher ist nicht synchronisiert. Klicken Sie auf die Schaltfläche unten, um das Problem zu beheben.", - "save_key_description": "Teilen Sie dies mit niemandem!", + "key_storage_warning": "Der Schlüsselspeicher ist nicht synchronisiert. Klicke auf die Schaltfläche unten, um das Problem zu beheben.", + "save_key_description": "Teile dies mit niemandem!", "save_key_title": "Wiederherstellungsschlüssel", "set_up_recovery": "Wiederherstellung einrichten", "set_up_recovery_confirm_button": "Einrichtung abschließen", - "set_up_recovery_confirm_description": "Geben Sie den auf dem vorherigen Bildschirm angezeigten Wiederherstellungsschlüssel ein, um die Einrichtung der Wiederherstellung abzuschließen.", - "set_up_recovery_confirm_title": "Geben Sie zur Bestätigung Ihren Wiederherstellungsschlüssel ein", - "set_up_recovery_description": "Ihr Schlüsselspeicher ist durch einen Wiederherstellungsschlüssel geschützt. Wenn Sie nach der Installation einen neuen Wiederherstellungsschlüssel benötigen, können Sie ihn neu erstellen, indem Sie '%(changeRecoveryKeyButton)s' auswählen.", - "set_up_recovery_save_key_description": "Notieren Sie sich diesen Wiederherstellungsschlüssel an einem sicheren Ort, z. B. in einem Passwort-Manager, einer verschlüsselten Notiz oder einem Safe.", - "set_up_recovery_save_key_title": "Bewahren Sie Ihren Wiederherstellungsschlüssel an einem sicheren Ort auf", - "set_up_recovery_secondary_description": "Nachdem Sie auf Weiter geklickt haben, generieren wir einen Wiederherstellungsschlüssel für Sie.", + "set_up_recovery_confirm_description": "Gib den auf dem vorherigen Bildschirm angezeigten Wiederherstellungsschlüssel ein, um die Einrichtung abzuschließen.", + "set_up_recovery_confirm_title": "Gib zur Bestätigung deinen Wiederherstellungsschlüssel ein", + "set_up_recovery_description": "Dein Schlüsselspeicher wird durch einen Wiederherstellungsschlüssel geschützt. Wenn du nach der Einrichtung einen neuen Wiederherstellungsschlüssel benötigst, kannst du durch Auswahl von „%(changeRecoveryKeyButton)s“ einen neuen erzeugen.", + "set_up_recovery_save_key_description": "Bewahre den Wiederherstellungsschlüssel an einer sicheren Stelle auf, wie zum Beispiel in einem Passwort-Manager, in einer verschlüsselten Datei oder in einem Safe.", + "set_up_recovery_save_key_title": "Bewahre den Wiederherstellungsschlüssel an einer sicheren Stelle auf", + "set_up_recovery_secondary_description": "Der Wiederherstellungsschlüssel wird erzeugt, wenn du auf \"Weiter\" klickst.", "title": "Wiederherstellung" }, "title": "Verschlüsselung" @@ -2613,22 +2675,22 @@ "deactivate_confirm_content": "Bestätige, dass du dein Konto deaktivieren möchtest. Wenn du fortfährst, tritt folgendes ein:", "deactivate_confirm_content_1": "Du wirst dein Konto nicht reaktivieren können", "deactivate_confirm_content_2": "Du wirst dich nicht mehr anmelden können", - "deactivate_confirm_content_3": "Niemand wird in der Lage sein, Ihren Benutzernamen (MXID) wiederzuverwenden, Sie eingeschlossen: Der Benutzername wird insgesamt nur einmal vergeben.", + "deactivate_confirm_content_3": "Niemand wird in der Lage sein, deinen Nutzernamen (MXID) wiederzuverwenden, nicht einmal du selbst: Der Nutzername wird insgesamt nur einmal vergeben.", "deactivate_confirm_content_4": "Du wirst alle Unterhaltungen verlassen, in denen du dich befindest", "deactivate_confirm_content_5": "Du wirst vom Identitäts-Server entfernt: Deine Freunde werden nicht mehr in der Lage sein, dich über deine E-Mail-Adresse oder Telefonnummer zu finden", - "deactivate_confirm_content_6": "Deine alten Nachrichten werden weiterhin für Personen sichtbar bleiben, die sie erhalten haben, so wie es bei E-Mails der Fall ist. Möchtest du deine Nachrichten vor Personen verbergen, die Räume in der Zukunft betreten?", + "deactivate_confirm_content_6": "Deine alten Nachrichten werden weiterhin für Personen sichtbar bleiben, die sie erhalten haben, so wie es bei E-Mails der Fall ist. Möchtest du deine Nachrichten vor Personen verbergen, die Chats in der Zukunft betreten?", "deactivate_confirm_continue": "Deaktivierung des Kontos bestätigen", "deactivate_confirm_erase_label": "Meine Nachrichten vor neuen Teilnehmern verstecken", "deactivate_section": "Benutzerkonto deaktivieren", "deactivate_warning": "Die Deaktivierung deines Kontos ist unwiderruflich — sei vorsichtig!", - "discovery_email_empty": "Optionen zum Entdecken anderer Benutzer werden angezeigt, sobald Sie Ihre E-Mail Adresse zu Ihrem Konto hinzugefügt haben,", + "discovery_email_empty": "Sobald du eine E-Mail Adresse hinzufügst werden Optionen zum Entdecken anderer Nutzer angezeigt.", "discovery_email_verification_instructions": "Verifiziere den Link in deinem Posteingang", - "discovery_msisdn_empty": "Optionen zum Entdecken anderer Benutzer werden angezeigt, sobald Sie Ihre Telefonnummer zu Ihrem Konto hinzugefügt haben", + "discovery_msisdn_empty": "Sobald du eine Telefonnummer hinzufügst werden Optionen zum Entdecken anderer Nutzer angezeigt.", "discovery_needs_terms": "Stimme den Nutzungsbedingungen des Identitäts-Servers %(serverName)s zu, um per E-Mail-Adresse oder Telefonnummer auffindbar zu werden.", - "discovery_needs_terms_title": "Lassen Sie sich von anderen finden", + "discovery_needs_terms_title": "Lass dich finden", "display_name": "Anzeigename", "display_name_error": "Anzeigename konnte nicht gesetzt werden", - "email_adding_unsupported_by_hs": "Dieser Homeserver unterstützt das Hinzufügen von E-Mail-Adressen zu Ihrem Konto nicht.", + "email_adding_unsupported_by_hs": "Dieser Homeserver unterstützt das Hinzufügen von E-Mail-Adressen zu deinem Konto nicht.", "email_address_in_use": "Diese E-Mail-Adresse wird bereits verwendet", "email_address_label": "E-Mail-Adresse", "email_not_verified": "Deine E-Mail-Adresse wurde noch nicht verifiziert", @@ -2655,7 +2717,7 @@ "identity_server_not_set": "Kein Identitäts-Server festgelegt", "invalid_phone_number": "Die angegebene Telefonnummer scheint nicht gültig zu sein.", "language_section": "Sprache", - "msisdn_adding_unsupported_by_hs": "Dieser Homeserver unterstützt das Hinzufügen von Telefonnummern zu Ihrem Konto nicht.", + "msisdn_adding_unsupported_by_hs": "Dieser Homeserver unterstützt das Hinzufügen von Telefonnummern zu deinem Konto nicht.", "msisdn_in_use": "Diese Telefonnummer wird bereits verwendet", "msisdn_label": "Telefonnummer", "msisdn_verification_field_label": "Bestätigungscode", @@ -2665,7 +2727,7 @@ "password_change_section": "Passwort des Nutzerkontos ändern...", "password_change_success": "Dein Passwort wurde erfolgreich geändert.", "personal_info": "Persönliche Daten", - "profile_subtitle": "So werden Sie von anderen in der App gesehen", + "profile_subtitle": "So erscheinst du anderen in der App.", "profile_subtitle_oidc": "Ihr Konto wird separat durch einen Identitätsanbieter verwaltet. Einige persönliche Daten können deswegen hier nicht geändert werden.", "remove_email_prompt": "%(email)s entfernen?", "remove_msisdn_prompt": "%(phone)s entfernen?", @@ -2675,9 +2737,12 @@ "username": "Benutzername" }, "inline_url_previews_default": "URL-Vorschau standardmäßig aktivieren", - "inline_url_previews_room": "URL-Vorschau für Raummitglieder", - "inline_url_previews_room_account": "URL-Vorschau für dich in diesem Raum", + "inline_url_previews_room": "URL-Vorschau für Chat Mitglieder", + "inline_url_previews_room_account": "URL-Vorschau für dich in diesem Chat", "insert_trailing_colon_mentions": "Doppelpunkt nach Erwähnungen einfügen", + "invite_controls": { + "default_label": "Nutzern erlauben, dich in Chats einzuladen" + }, "jump_to_bottom_on_send": "Nach Senden einer Nachricht im Verlauf nach unten springen", "key_backup": { "setup_secure_backup": { @@ -2690,35 +2755,35 @@ "enter_phrase_description": "Gib eine nur dir bekannte Sicherheitsphrase ein, die dem Schutz deiner Daten dient. Um die Sicherheit zu gewährleisten, sollte dies nicht dein Kontopasswort sein.", "enter_phrase_title": "Sicherheitsphrase eingeben", "enter_phrase_to_confirm": "Gib dein Kennwort ein zweites Mal zur Bestätigung ein.", - "generate_security_key_description": "Wir generieren einen Wiederherstellungsschlüssel, den Sie an einem sicheren Ort aufbewahren können, z. B. in einem Passwort-Manager oder einem Safe.", - "generate_security_key_title": "Generieren Sie einen Wiederherstellungsschlüssel", + "generate_security_key_description": "Es wird ein Wiederherstellungsschlüssel erzeugt, den du an einer sicheren Stelle aufbewahren solltest, wie zum Beispiel in einem Passwort-Manager oder in einem Safe.", + "generate_security_key_title": "Erzeuge einen Wiederherstellungsschlüssel", "pass_phrase_match_failed": "Das passt nicht.", "pass_phrase_match_success": "Das passt!", - "phrase_strong_enough": "Großartig! Diese Sicherheitsphrase sieht stark genug aus.", + "phrase_strong_enough": "Gut, diese Sicherheitsphrase sieht stark genug aus.", "secret_storage_query_failure": "Status des sicheren Speichers kann nicht gelesen werden", - "security_key_safety_reminder": "Bewahren Sie Ihren Wiederherstellungsschlüssel an einem sicheren Ort auf, z. B. in einem Passwort-Manager oder einem Safe, da er zum Schutz Ihrer verschlüsselten Daten verwendet wird.", + "security_key_safety_reminder": "Bewahre den Wiederherstellungsschlüssel an einer sicheren Stelle auf, wie zum Beispiel in einem Passwort-Manager oder in einem Safe. Er schützt deine verschlüsselten Daten.", "set_phrase_again": "Gehe zurück und setze es erneut.", "settings_reminder": "Du kannst auch in den Einstellungen Sicherungen einrichten und deine Schlüssel verwalten.", "title_confirm_phrase": "Sicherheitsphrase bestätigen", - "title_save_key": "Speichern Sie Ihren Wiederherstellungsschlüssel", + "title_save_key": "Speichere deinen Wiederherstellungsschlüssel", "title_set_phrase": "Sicherheitsphrase setzen", "unable_to_setup": "Sicherer Speicher kann nicht eingerichtet werden", "use_different_passphrase": "Eine andere Passphrase verwenden?", - "use_phrase_only_you_know": "Verwenden Sie eine geheime Phrase, die nur Sie kennen, und speichern Sie optional einen Wiederherstellungsschlüssel, um ihn für Backups zu verwenden." + "use_phrase_only_you_know": "Verwende eine Sicherheitsphrase, die nur dir bekannt ist. Speichere optional einen Wiederherstellungsschlüssel als Backup." } }, "key_export_import": { "confirm_passphrase": "Passphrase bestätigen", "enter_passphrase": "Passphrase eingeben", - "export_description_1": "Dieser Prozess erlaubt es dir, die Schlüssel für die in verschlüsselten Räumen empfangenen Nachrichten in eine lokale Datei zu exportieren. In Zukunft wird es möglich sein, diese Datei in eine andere Matrix-Anwendung zu importieren, sodass diese die Nachrichten ebenfalls entschlüsseln kann.", + "export_description_1": "Dieser Prozess exportiert die Schlüssel für die in verschlüsselten Chats empfangenen Nachrichten in eine lokale Datei. In Zukunft wird es möglich sein, diese Datei in eine andere Matrix-Anwendung zu importieren, sodass diese die Nachrichten ebenfalls entschlüsseln kann.", "export_description_2": "Die exportierte Datei erlaubt Unbefugten, jede Nachricht zu entschlüsseln, sei also vorsichtig und halte sie versteckt. Um dies zu verhindern, empfiehlt es sich eine einzigartige Passphrase unten einzugeben, die nur für das Entschlüsseln der exportierten Datei genutzt wird. Es ist nur möglich, diese Datei mit der selben Passphrase zu importieren.", - "export_title": "Raum-Schlüssel exportieren", + "export_title": "Chat-Schlüssel exportieren", "file_to_import": "Zu importierende Datei", "import_description_1": "Dieser Prozess erlaubt es dir, die zuvor von einer anderen Matrix-Anwendung exportierten Verschlüsselungs-Schlüssel zu importieren. Danach kannst du alle Nachrichten entschlüsseln, die auch bereits auf der anderen Anwendung entschlüsselt werden konnten.", "import_description_2": "Die exportierte Datei ist mit einer Passphrase geschützt. Du kannst die Passphrase hier eingeben, um die Datei zu entschlüsseln.", - "import_title": "Raum-Schlüssel importieren", + "import_title": "Chat-Schlüssel importieren", "phrase_cannot_be_empty": "Passphrase darf nicht leer sein", - "phrase_must_match": "Passphrases müssen übereinstimmen", + "phrase_must_match": "Passphrasen müssen übereinstimmen", "phrase_strong_enough": "Super! Diese Passphrase wirkt stark genug" }, "keyboard": { @@ -2729,30 +2794,31 @@ "dialog_title": "Einstellungen: Labor" }, "labs_mjolnir": { - "dialog_title": "Einstellungen: Blockierte Benutzer" + "dialog_title": "Einstellungen: Ignorierte Nutzer" }, "media_preview": { - "hide_avatars": "Verstecken Sie die Avatare von Chatroom und Einladung", - "hide_media": "Verstecke Sie sich immer", - "media_preview_description": "Ein verstecktes Medium kann immer angezeigt werden, indem Sie darauf tippen", + "hide_avatars": "Blende die Avatare des Chats und des Einladenden aus", + "hide_media": "Immer ausblenden", + "media_preview_description": "Ausgeblendete Medien können immer durch Antippen angezeigt werden", "media_preview_label": "Medien in der Zeitleiste anzeigen", "show_in_private": "In privaten Chatrooms", "show_media": "Immer anzeigen" }, + "not_supported": "Der Konto-Provider hat diese Funktion nicht implementiert.", "notifications": { - "default_setting_description": "Diese Einstellung wird standardmäßig für all deine Räume übernommen.", + "default_setting_description": "Gilt für alle Chats auf allen Geräten.", "default_setting_section": "Ich möchte benachrichtigt werden für (Standardeinstellung)", "desktop_notification_message_preview": "Nachrichtenvorschau in der Desktopbenachrichtigung anzeigen", "dialog_title": "Einstellungen: Benachrichtigungen", "email_description": "E-Mail-Zusammenfassung für verpasste Benachrichtigungen erhalten", "email_section": "E-Mail-Zusammenfassung", "email_select": "Wähle, an welche E-Mail-Adresse die Zusammenfassungen gesendet werden. Verwalte deine E-Mail-Adressen unter .", - "enable_audible_notifications_session": "Benachrichtigungstöne in dieser Sitzung", - "enable_desktop_notifications_session": "Desktopbenachrichtigungen in dieser Sitzung", + "enable_audible_notifications_session": "Akustische Benachrichtigungen für diese Sitzung aktivieren", + "enable_desktop_notifications_session": "Desktop-Benachrichtigungen für diese Sitzung aktivieren", "enable_email_notifications": "E-Mail-Benachrichtigungen für %(email)s aktivieren", - "enable_notifications_account": "Aktiviere Benachrichtigungen für dieses Konto", + "enable_notifications_account": "Benachrichtigungen für dieses Konto aktivieren", "enable_notifications_account_detail": "Ausschalten, um Benachrichtigungen auf all deinen Geräten und Sitzungen zu deaktivieren", - "enable_notifications_device": "Aktiviere Benachrichtigungen für dieses Gerät", + "enable_notifications_device": "Benachrichtigungen für dieses Gerät aktivieren", "error_loading": "Fehler beim Laden der Benachrichtigungseinstellungen.", "error_permissions_denied": "%(brand)s hat keine Berechtigung, Benachrichtigungen zu senden - Bitte überprüfe deine Browsereinstellungen", "error_permissions_missing": "%(brand)s hat keine Berechtigung für das Senden von Benachrichtigungen erhalten - Bitte versuche es erneut", @@ -2760,8 +2826,8 @@ "error_saving_detail": "Beim Speichern der Benachrichtigungseinstellungen ist ein Fehler aufgetreten.", "error_title": "Benachrichtigungen konnten nicht aktiviert werden", "error_updating": "Ein Fehler ist während der Aktualisierung deiner Benachrichtigungseinstellungen aufgetreten. Bitte versuche die Option erneut umzuschalten.", - "invites": "In einen Raum eingeladen", - "keywords": "Zeige einen Hinweis , wenn Schlüsselwörter in einem Raum verwendet werden.", + "invites": "In einen Chat eingeladen", + "keywords": "Zeige einen Hinweis , wenn Schlüsselwörter in einem Chat verwendet werden.", "keywords_prompt": "Schlüsselwörter, Variationen dieser oder Anzeigenamen eingeben", "labs_notice_prompt": "Aktualisierung: Wir haben die Benachrichtigungseinstellungen vereinfacht, damit Optionen schneller zu finden sind. Einige benutzerdefinierte Einstellungen werden hier nicht angezeigt, sind aber dennoch aktiv. Wenn du fortfährst, könnten sich einige Einstellungen ändern. Erfahre mehr", "mentions_keywords": "Erwähnungen und Schlüsselwörter", @@ -2774,13 +2840,13 @@ "notify_mention": "Benachrichtigen, wenn jemand @anzeigename oder %(mxid)s erwähnt", "other_section": "Andere Dinge, an denen du interessiert sein könntest:", "people_mentions_keywords": "Personen, Erwähnungen und Schlüsselwörter", - "play_sound_for_description": "Standardmäßig übernommen für alle Räume auf allen Geräten.", + "play_sound_for_description": "Gilt für alle Chats auf allen Geräten.", "play_sound_for_section": "Spiele einen Ton für", "push_targets": "Benachrichtigungsziele", "quick_actions_mark_all_read": "Alle Nachrichten als gelesen markieren", "quick_actions_reset": "Standardeinstellungen wiederherstellen", "quick_actions_section": "Schnellaktionen", - "room_activity": "Neue Raumaktivitäten, -aktualisierungen und -statusmeldungen", + "room_activity": "Neue Chataktivitäten, -aktualisierungen und -statusmeldungen", "rule_call": "Anrufe", "rule_contains_display_name": "Nachrichten mit meinem Anzeigenamen", "rule_contains_user_name": "Nachrichten mit meinem Benutzernamen", @@ -2791,11 +2857,15 @@ "rule_room_one_to_one": "Direktnachrichten", "rule_roomnotif": "Nachrichten mit @room", "rule_suppress_notices": "Nachrichten von Bots", - "rule_tombstone": "Raumaktualisierungen", + "rule_tombstone": "Wenn die Chat-Version aktualisiert wird", "show_message_desktop_notification": "Nachrichteninhalt in der Desktopbenachrichtigung anzeigen", + "sounds_release_announcement": { + "title": "Wir haben deine Sounds aktualisiert" + }, "voip": "Audio- und Videoanrufe" }, "preferences": { + "Electron.enableContentProtection": "Verhindert Bildschirmaufnahmen durch andere Apps", "Electron.enableHardwareAcceleration": "Hardwarebeschleunigung einschalten (Neustart von %(appName)s notwendig)", "always_show_menu_bar": "Fenstermenüleiste immer anzeigen", "autocomplete_delay": "Verzögerung vor Autovervollständigung (ms)", @@ -2804,6 +2874,7 @@ "composer_heading": "Nachrichteneingabe", "default_timezone": "Browser-Standard (%(timezone)s )", "dialog_title": "Einstellungen: Präferenzen", + "enable_content_protection": "Schutz des Inhalts aktivieren", "enable_hardware_acceleration": "Aktiviere die Hardwarebeschleunigung", "enable_tray_icon": "Fenster beim Schließen in die Symbolleiste minimieren", "keyboard_heading": "Tastenkombinationen", @@ -2813,9 +2884,9 @@ "publish_timezone": "Zeitzone auf öffentlichem Profil anzeigen lassen", "rm_lifetime": "Gültigkeitsdauer der Gelesen-Markierung (ms)", "rm_lifetime_offscreen": "Gültigkeitsdauer der Gelesen-Markierung außerhalb des Bildschirms (ms)", - "room_directory_heading": "Raumverzeichnis", - "room_list_heading": "Raumliste", - "show_avatars_pills": "Profilbilder in Benutzer-, Raum- und Ereigniserwähnungen anzeigen", + "room_directory_heading": "Chat Verzeichnis", + "room_list_heading": "Chatliste", + "show_avatars_pills": "Avatare in Nutzer-, Chat- und Ereigniserwähnungen anzeigen", "show_polls_button": "Zeige Pol button", "surround_text": "Sonderzeichen automatisch vor und hinter Textauswahl setzen", "time_heading": "Zeitanzeige", @@ -2828,26 +2899,26 @@ "bulk_options_accept_all_invites": "Akzeptiere alle %(invitedRooms)s Einladungen", "bulk_options_reject_all_invites": "Alle %(invitedRooms)s Einladungen ablehnen", "bulk_options_section": "Sammeloptionen", - "dehydrated_device_description": "Die Offline-Gerätefunktion ermöglicht es Ihnen, verschlüsselte Nachrichten zu empfangen, auch wenn Sie an keinem Gerät angemeldet sind", + "dehydrated_device_description": "Die Offline Funktion ermöglicht es, verschlüsselte Nachrichten zu empfangen, selbst wenn du an keinem Gerät angemeldet bist", "dehydrated_device_enabled": "Offline-Gerät aktiviert", "dialog_title": "Einstellungen Sicherheit & Datenschutz", - "e2ee_default_disabled_warning": "Deine Server-Administration hat die Ende-zu-Ende-Verschlüsselung für private Räume und Direktnachrichten standardmäßig deaktiviert.", - "enable_message_search": "Nachrichtensuche in verschlüsselten Räumen aktivieren", + "e2ee_default_disabled_warning": "Deine Server Administrator hat die Ende-zu-Ende-Verschlüsselung für private Chats und Direktnachrichten standardmäßig deaktiviert.", + "enable_message_search": "Aktiviere die Nachrichtensuche in verschlüsselten Chats", "encryption_section": "Verschlüsselung", - "ignore_users_empty": "Sie haben keinen Benutzer blockiert.", - "ignore_users_section": "Blockierte Benutzer", + "ignore_users_empty": "Du hast keine Nutzer ignoriert.", + "ignore_users_section": "Ignorierte Nutzer", "key_backup_algorithm": "Algorithmus:", - "message_search_disable_warning": "Wenn deaktiviert, werden Nachrichten von verschlüsselten Räumen nicht in den Ergebnissen auftauchen.", + "message_search_disable_warning": "Wenn deaktiviert, werden Nachrichten von verschlüsselten Chats nicht in den Ergebnissen auftauchen.", "message_search_disabled": "Speichere verschlüsselte Nachrichten lokal, sodass sie deinen Suchergebnissen erscheinen können.", "message_search_enabled": { - "other": "Verschlüsselte Nachrichten sicher lokal zwischenspeichern, um sie in Suchergebnissen finden zu können. Es werden %(size)s benötigt, um die Nachrichten von %(rooms)s Räumen zu speichern.", - "one": "Verschlüsselte Nachrichten sicher lokal zwischenspeichern, um sie in Suchergebnissen finden zu können. Es werden %(size)s benötigt, um die Nachrichten vom Raum %(rooms)s zu speichern." + "one": "Halte verschlüsselte Nachrichten sicher lokal vor, um sie in Suchergebnissen finden zu können. Es werden %(size)s benötigt, um die Nachrichten von %(rooms)s Chat zu speichern.", + "other": "Halte verschlüsselte Nachrichten sicher lokal vor, um sie in Suchergebnissen finden zu können. Es werden %(size)s benötigt, um die Nachrichten von %(rooms)s Chats zu speichern." }, "message_search_failed": "Initialisierung der Nachrichtensuche fehlgeschlagen", "message_search_indexed_messages": "Indizierte Nachrichten:", - "message_search_indexed_rooms": "Indizierte Räume:", + "message_search_indexed_rooms": "Indizierte Chats:", "message_search_indexing": "Indiziere: %(currentRoom)s", - "message_search_indexing_idle": "Derzeit werden keine Nachrichten für Räume indiziert.", + "message_search_indexing_idle": "Derzeit werden keine Nachrichten für Chats indiziert.", "message_search_intro": "%(brand)s verwendet einen sicheren Zwischenspeicher für verschlüsselte Nachrichten, damit sie in den Suchergebnissen angezeigt werden:", "message_search_room_progress": "%(doneRooms)s von %(totalRooms)s", "message_search_section": "Nachrichtensuche", @@ -2884,7 +2955,7 @@ "current_session": "Aktuelle Sitzung", "desktop_session": "Desktop-Sitzung", "details_heading": "Sitzungsdetails", - "device_unverified_description": "Für bestmögliche Sicherheit und Zuverlässigkeit verifiziere diese Sitzung oder melde sie ab.", + "device_unverified_description": "Verifiziere diese Sitzung für bestmögliche Sicherheit und Zuverlässigkeit oder melde dich ab.", "device_unverified_description_current": "Verifiziere deine aktuelle Sitzung für besonders sichere Kommunikation.", "device_verified_description": "Diese Sitzung ist für sichere Kommunikation bereit.", "device_verified_description_current": "Deine aktuelle Sitzung ist für sichere Kommunikation bereit.", @@ -2900,9 +2971,9 @@ "hide_details": "Details ausblenden", "inactive_days": "Seit %(inactiveAgeDays)s+ Tagen inaktiv", "inactive_sessions": "Inaktive Sitzungen", - "inactive_sessions_explainer_1": "Inaktive Sitzungen sind jene, die du schon seit geraumer Zeit nicht mehr verwendet hast, aber nach wie vor Verschlüsselungs-Schlüssel erhalten.", + "inactive_sessions_explainer_1": "Inaktive Sitzungen sind jene, die du schon seit geraumer Zeit nicht mehr verwendet hast, die aber nach wie vor Verschlüsselungs-Schlüssel erhalten.", "inactive_sessions_explainer_2": "Das Entfernen inaktiver Sitzungen verbessert Sicherheit, Leistung und das Erkennen von dubiosen neuen Sitzungen.", - "inactive_sessions_list_description": "Erwäge, dich aus alten (%(inactiveAgeDays)s Tage oder mehr), nicht mehr verwendeten Sitzungen abzumelden.", + "inactive_sessions_list_description": "Du solltest dich aus alten Sitzungen (%(inactiveAgeDays)s Tage oder mehr) abmelden, wenn du sie nicht mehr benötigst.", "ip": "IP-Adresse", "last_activity": "Neueste Aktivität", "manage": "Diese Sitzung verwalten", @@ -2923,16 +2994,16 @@ "rename_form_caption": "Sei dir bitte bewusst, dass Sitzungsnamen auch für Personen, mit denen du kommunizierst, sichtbar sind.", "rename_form_heading": "Sitzung umbenennen", "rename_form_learn_more": "Sitzungen umbenennen", - "rename_form_learn_more_description_1": "Andere Benutzer in Direktnachrichten oder von dir betretenen Räumen können die volle Liste deiner Sitzungen sehen.", + "rename_form_learn_more_description_1": "Andere Nutzer in Direktnachrichten oder Gruppen können die volle Liste deiner Sitzungen sehen.", "rename_form_learn_more_description_2": "Dies gibt ihnen die Gewissheit, dass sie auch wirklich mit dir kommunizieren, allerdings bedeutet es auch, dass sie die Sitzungsnamen sehen können, die du hier eingibst.", "security_recommendations": "Sicherheitsempfehlungen", - "security_recommendations_description": "Verbessere deine Kontosicherheit, indem du diese Empfehlungen beherzigst.", + "security_recommendations_description": "Verbessere mit diesen Empfehlungen deine Kontosicherheit", "session_id": "Sitzungs-ID", "show_details": "Details anzeigen", "sign_in_with_qr": "Neues Gerät verknüpfen", "sign_in_with_qr_button": "QR-Code anzeigen", - "sign_in_with_qr_description": "Sie können dieses Gerät dazu verwenden, um ein neues Gerät per QR-Code anzumelden und verschlüsselte Nachrichtenübermittlung einzurichten.", - "sign_in_with_qr_unsupported": "Wird von Ihrem Kontoanbieter nicht unterstützt", + "sign_in_with_qr_description": "Verwende einen QR-Code, um dich auf einem anderen Gerät anzumelden und sichere Nachrichten einzurichten.", + "sign_in_with_qr_unsupported": "Wird vom Konto-Anbieter nicht unterstützt", "sign_out": "Von dieser Sitzung abmelden", "sign_out_all_other_sessions": "Von allen anderen Sitzungen abmelden (%(otherSessionsCount)s)", "sign_out_confirm_description": { @@ -2947,7 +3018,7 @@ "unknown_session": "Unbekannter Sitzungstyp", "unverified_session": "Nicht verifizierte Sitzung", "unverified_session_explainer_1": "Diese Sitzung unterstützt keine Verschlüsselung und kann deshalb nicht verifiziert werden.", - "unverified_session_explainer_2": "Du wirst dich mit dieser Sitzung nicht an Unterhaltungen in Räumen mit aktivierter Verschlüsselung beteiligen können.", + "unverified_session_explainer_2": "Du wirst dich mit dieser Sitzung nicht an Unterhaltungen in Chats mit aktivierter Verschlüsselung beteiligen können.", "unverified_session_explainer_3": "Aus Sicherheits- und Datenschutzgründen, wird die Nutzung von verschlüsselungsfähigen Matrix-Anwendungen empfohlen.", "unverified_sessions": "Nicht verifizierte Sitzungen", "unverified_sessions_explainer_1": "Nicht verifizierte Sitzungen sind jene, die mit deinen Daten angemeldet, aber nicht quer signiert wurden.", @@ -2963,10 +3034,11 @@ "web_session": "Web-Sitzung" }, "show_avatar_changes": "Profilbildänderungen anzeigen", - "show_breadcrumbs": "Kürzlich besuchte Räume anzeigen", + "show_breadcrumbs": "Kürzlich besuchte Chats anzeigen", "show_chat_effects": "Effekte bei manchen Emojis (z. B. Konfetti)", "show_displayname_changes": "Änderungen von Anzeigenamen", "show_join_leave": "Bei-/Austrittsnachrichten (Einladung/Entfernen/Bann nicht betroffen)", + "show_message_previews": "Nachrichtenvorschau anzeigen", "show_nsfw_content": "NSFW-Inhalte anzeigen", "show_read_receipts": "Lesebestätigungen von anderen Benutzern anzeigen", "show_redaction_placeholder": "Platzhalter für gelöschte Nachrichten", @@ -2975,18 +3047,18 @@ "showbold": "Alle Aktivitäten in der Chatroommliste anzeigen (Ausführungspunkte oder Anzahl ungelesener Nachrichten)", "sidebar": { "dialog_title": "Einstellungen: Seitenleiste", - "metaspaces_favourites_description": "Gruppiere all deine favorisierten Unterhaltungen an einem Ort.", - "metaspaces_home_all_rooms": "Alle Räume anzeigen", - "metaspaces_home_all_rooms_description": "Alle Räume auf der Startseite anzeigen, auch wenn sie Teil eines Space sind.", + "metaspaces_favourites_description": "Sammle alle deinen favorisierten Chats an einem Ort.", + "metaspaces_home_all_rooms": "Alle Chats anzeigen", + "metaspaces_home_all_rooms_description": "Alle Chats auf der Startseite anzeigen, auch wenn sie Teil eines Space sind.", "metaspaces_home_description": "Die Startseite bietet dir einen Überblick über deine Unterhaltungen.", - "metaspaces_orphans": "Räume außerhalb von Spaces", - "metaspaces_orphans_description": "Gruppiere all deine Räume, die nicht Teil eines Spaces sind, an einem Ort.", + "metaspaces_orphans": "Chats außerhalb von Spaces", + "metaspaces_orphans_description": "Gruppiere all deine Chats, die nicht Teil eines Spaces sind, an einem Ort.", "metaspaces_people_description": "Gruppiere all deine Direktnachrichten an einem Ort.", "metaspaces_subsection": "Anzuzeigende Spaces", - "metaspaces_video_rooms": "Videoräume und -konferenzen", - "metaspaces_video_rooms_description": "Gruppiere alle privaten Videoräume und -konferenzen.", - "metaspaces_video_rooms_description_invite_extension": "Sie können Personen außerhalb von Matrix zu Konferenzen einladen.", - "spaces_explainer": "Spaces sind eine Möglichkeit, Räume und Personen zu gruppieren. Neben den Spaces, in denen du dich befindest, kannst du auch einige vorgefertigte verwenden.", + "metaspaces_video_rooms": "Videochats und -konferenzen", + "metaspaces_video_rooms_description": "Gruppiere alle privaten Videochats und -konferenzen.", + "metaspaces_video_rooms_description_invite_extension": "Du kannst in Konferenzen auch Personen außerhalb von Matrix einladen.", + "spaces_explainer": "Spaces sind eine Möglichkeit, Gruppen und Personen zu bündeln. Neben den Spaces, in denen du dich befindest, kannst du auch einige vorgefertigte verwenden.", "title": "Seitenleiste" }, "start_automatically": "Nach Systemstart automatisch starten", @@ -3029,16 +3101,16 @@ "share_call": "Konferenzeinladungslink", "share_call_subtitle": "Link für externe Benutzer, um dem Anruf ohne Matrixkonto beizutreten:", "title_link": "Link teilen", - "title_message": "Raumnachricht teilen", - "title_room": "Raum teilen", + "title_message": "Teile die Nachricht", + "title_room": "Teile den Chat", "title_user": "Teile Benutzer" }, "slash_command": { - "addwidget": "Fügt dem Raum ein individuelles Widget per URL hinzu", + "addwidget": "Fügt dem Chat ein individuelles Widget per URL hinzu", "addwidget_iframe_missing_src": "iFrame hat kein src-Attribut", "addwidget_invalid_protocol": "Bitte gib eine mit https:// oder http:// beginnende Widget-URL an", "addwidget_missing_url": "Bitte gib eine Widget-URL oder einen Einbettungscode an", - "addwidget_no_permissions": "Du darfst in diesem Raum keine Widgets verändern.", + "addwidget_no_permissions": "Du darfst in diesem Chat keine Widgets verändern.", "ban": "Verbannt den Benutzer mit der angegebenen ID", "category_actions": "Aktionen", "category_admin": "Administrator", @@ -3047,89 +3119,91 @@ "category_messages": "Nachrichten", "category_other": "Sonstiges", "command_error": "Fehler im Befehl", - "converttodm": "Wandelt den Raum in eine Direktnachricht um", - "converttoroom": "Wandelt die Direktnachricht in einen Raum um", - "could_not_find_room": "Konnte Raum nicht finden", + "converttodm": "Wandelt die Gruppe in eine Direktnachricht um", + "converttoroom": "Wandelt die Direktnachricht in eine Gruppe um", + "could_not_find_room": "Konnte Chat nicht finden", "deop": "Setzt das Berechtigungslevel beim Benutzer mit der angegebenen ID zurück", "devtools": "Öffnet die Entwicklungswerkzeuge", - "discardsession": "Erzwingt, dass die aktuell ausgehende Gruppensitzung in einem verschlüsseltem Raum verworfen wird", + "discardsession": "Verwirft die aktuell ausgehende Gruppensitzung in einem verschlüsseltem Chat", "error_invalid_rendering_type": "Befehlsfehler: Rendering-Typ kann nicht gefunden werden (%(renderingType)s)", - "error_invalid_room": "Eingabe fehlgeschlagen: Raum (%(roomId)s) nicht auffindbar", + "error_invalid_room": "Eingabe fehlgeschlagen: Chat (%(roomId)s) nicht auffindbar", "error_invalid_runfn": "Befehlsfehler: Slash-Befehl kann nicht verarbeitet werden.", - "error_invalid_user_in_room": "Kann Benutzer in Raum nicht finden", + "error_invalid_user_in_room": "Kann Nutzer im Chat nicht finden", "help": "Zeigt die Liste verfügbarer Befehle mit Verwendungen und Beschreibungen an", "help_dialog_title": "Befehl Hilfe", "holdcall": "Den aktuellen Anruf halten", "html": "Sendet eine Nachricht als HTML, ohne sie als Markdown darzustellen", - "ignore": "Benutzer blockieren und dessen Nachrichten ausblenden", - "ignore_dialog_description": "%(userId)s ist jetzt blockiert", - "ignore_dialog_title": "Benutzer blockiert", - "invite": "Lädt den Benutzer mit der angegebenen ID in den aktuellen Raum ein", + "ignore": "Ignoriert einen Nutzer und blendet dessen Nachrichten aus", + "ignore_dialog_description": "%(userId)s wird ab jetzt ignoriert", + "ignore_dialog_title": "Nutzer ignoriert", + "invite": "Lädt den Nutzer mit der angegebenen ID in den aktuellen Chat ein", "invite_3pid_needs_is_error": "Verwende einen Identitäts-Server, um per E-Mail einladen zu können. Lege einen in den Einstellungen fest.", "invite_3pid_use_default_is_title": "Benutze einen Identitäts-Server", "invite_3pid_use_default_is_title_description": "Benutze einen Identitäts-Server, um andere mittels E-Mail einzuladen. Klicke auf fortfahren, um den Standard-Identitäts-Server (%(defaultIdentityServerName)s) zu benutzen oder ändere ihn in den Einstellungen.", "invite_failed": "Der Benutzer (%(user)s) wurde nicht in %(roomId)s eingeladen, aber das Einladungsprogramm meldete keinen Fehler", - "join": "Tritt dem Raum mit der angegebenen Adresse bei", + "join": "Tritt dem Chat mit der angegebenen Adresse bei", "jumptodate": "Zu einem Zeitpunkt im Verlauf springen", "jumptodate_invalid_input": "Ups! Leider können wir das Datum \"%(inputDate)s\" nicht verstehen. Bitte gib es im Format JJJJ-MM-TT (Jahr-Monat-Tag) ein.", "lenny": "Stellt ( ͡° ͜ʖ ͡°) einer Klartextnachricht voran", + "manual_device_verification_confirm_description": "Dadurch kann ein anderes Gerät Nachrichten in deinem Namen senden und empfangen. WENN JEMAND DIR GESAGT HAT, DU SOLLST HIER ETWAS EINFÜGEN, WIRST DU VERMUTLICH BETROGEN! Bist du sicher, dass du dieses andere Gerät verifizieren möchtest?", + "manual_device_verification_confirm_title": "Vorsicht: manuelle Verifizierung des Geräts", "me": "Als Aktionen anzeigen", "msg": "Sendet diesem Benutzer eine Nachricht", - "myavatar": "Ändert dein Profilbild in allen Räumen", - "myroomavatar": "Ändert dein Profilbild ausschließlich im aktuellen Raum", - "myroomnick": "Ändert den Anzeigenamen ausschließlich für den aktuellen Raum", + "myavatar": "Ändert dein Profilbild in allen Chats", + "myroomavatar": "Ändert dein Profilbild ausschließlich im aktuellen Chat", + "myroomnick": "Ändert den Anzeigenamen ausschließlich für den aktuellen Chat", "nick": "Ändert deinen Anzeigenamen", - "no_active_call": "Kein aktiver Anruf in diesem Raum", + "no_active_call": "Kein aktiver Anruf in diesem Chat", "op": "Berechtigungsstufe einers Benutzers setzen", - "part_unknown_alias": "Nicht erkannte Raumadresse: %(roomAlias)s", + "part_unknown_alias": "Nicht erkannte Chatadresse: %(roomAlias)s", "plain": "Sendet eine Nachricht als Klartext, ohne sie als Markdown darzustellen", "query": "Öffnet eine Unterhaltung mit dieser Person", "query_not_found_phone_number": "Dieser Telefonnummer kann keine Matrix-ID zugeordnet werden", "rageshake": "Einen Fehlerbericht mit der Protokolldatei senden", "rainbow": "Sendet die Nachricht in Regenbogenfarben", "rainbowme": "Zeigt Aktionen in Regenbogenfarben", - "remove": "Entfernt den Benutzer mit der angegebenen ID aus diesem Raum", - "roomavatar": "Ändert das Icon vom Raum", - "roomname": "Setze einen Raumnamen", + "remove": "Entfernt den Nutzer mit der angegebenen ID aus diesem Chat", + "roomavatar": "Ändert den Avatar vom aktuellen Chat", + "roomname": "Setze einen Chatnamen", "server_error": "Server-Fehler", "server_error_detail": "Server ist nicht verfügbar, überlastet oder ein anderer Fehler ist aufgetreten.", "shrug": "Stellt ¯\\_(ツ)_/¯ einer Klartextnachricht voran", "spoiler": "Die gegebene Nachricht als Spoiler senden", "tableflip": "Stellt (╯°□°)╯︵ ┻━┻ einer Klartextnachricht voran", - "topic": "Raumthema anzeigen oder ändern", - "topic_none": "Dieser Raum hat kein Thema.", - "topic_room_error": "Thema des Raums konnte nicht ermittelt werden: Raum kann nicht gefunden werden (%(roomId)s", - "unban": "Entsperrt den Benutzer mit der angegebenen ID", + "topic": "Chat Thema anzeigen oder ändern", + "topic_none": "Dieser Chat hat kein Thema.", + "topic_room_error": "Thema des Chats konnte nicht ermittelt werden: Chat (%(roomId)s kann nicht gefunden werden", + "unban": "Entsperrt den Nutzer mit der angegebenen ID", "unflip": "Stellt ┬──┬ ノ( ゜-゜ノ) einer Klartextnachricht voran", "unholdcall": "Beendet das Halten des Anrufs", - "unignore": "Benutzer freigeben und ihre neuen Nachrichten wieder anzeigen", - "unignore_dialog_description": "%(userId)s wird nicht mehr blockiert", - "unignore_dialog_title": "Benutzer nicht mehr blockiert", + "unignore": "Nutzer wird nicht mehr ignoriert und neuen Nachrichten werden wieder angezeigt", + "unignore_dialog_description": "%(userId)s wird nicht mehr ignoriert", + "unignore_dialog_title": "Nutzer nicht mehr ignoriert", "unknown_command": "Unbekannter Befehl", "unknown_command_button": "Als Nachricht senden", "unknown_command_detail": "Unbekannter Befehl: %(commandText)s", "unknown_command_help": "Du kannst /help benutzen, um alle verfügbaren Befehle aufzulisten. Willst du es stattdessen als Nachricht senden?", "unknown_command_hint": "Hinweis: Beginne deine Nachricht mit //, um sie mit einem Schrägstrich zu beginnen.", - "upgraderoom": "Aktualisiert den Raum auf eine neue Version", + "upgraderoom": "Aktualisiert den Chat auf eine neue Chat-Version", "upgraderoom_permission_error": "Du hast nicht die erforderlichen Berechtigungen, diesen Befehl zu verwenden.", "usage": "Verwendung", - "verify": "Verifiziert Benutzer, Sitzung und öffentlichen Schlüsselpaare", - "view": "Raum mit angegebener Adresse betrachten", + "verify": "Verifiziere eines deiner eigenen Geräte manuell", + "view": "Chat mit angegebener Adresse betrachten", "whois": "Zeigt Informationen über Benutzer" }, - "sliding_sync_legacy_no_longer_supported": "Legacy Sliding Sync wird nicht mehr unterstützt: Bitte melden Sie sich ab und wieder an, um das neue Sliding Sync-Flag zu aktivieren", + "sliding_sync_legacy_no_longer_supported": "Das alte Sliding Sync wird nicht mehr unterstützt: Bitte melde dich ab und wieder an, um das neue Sliding Sync zu aktivieren", "space": { "add_existing_room_space": { - "create": "Willst du einen neuen Raum hinzufügen?", - "create_prompt": "Neuen Raum erstellen", + "create": "Willst du stattdessen einen neuen Chat hinzufügen?", + "create_prompt": "Erstelle einen neuen Chat", "dm_heading": "Direktnachrichten", "error_heading": "Nicht alle Ausgewählten konnten hinzugefügt werden", "progress_text": { - "one": "Raum hinzufügen …", - "other": "Räume hinzufügen … (%(progress)s von %(count)s)" + "one": "Chat hinzufügen …", + "other": "Chats hinzufügen … (%(progress)s von %(count)s)" }, "space_dropdown_label": "Space-Auswahl", - "space_dropdown_title": "Bestehende Räume hinzufügen", + "space_dropdown_title": "Bestehende Chats hinzufügen", "subspace_moved_note": "Das Hinzufügen von Spaces ist umgezogen." }, "add_existing_subspace": { @@ -3140,13 +3214,13 @@ }, "context_menu": { "devtools_open_timeline": "Nachrichtenverlauf anzeigen (Entwicklungswerkzeuge)", - "explore": "Räume erkunden", + "explore": "Erkunde Chats", "home": "Space-Übersicht", - "manage_and_explore": "Räume erkunden und verwalten", + "manage_and_explore": "Erkunde und verwalte Chats", "options": "Space-Optionen" }, - "failed_load_rooms": "Fehler beim Laden der Raumliste.", - "failed_remove_rooms": "Einige Räume konnten nicht entfernt werden. Versuche es bitte später nocheinmal", + "failed_load_rooms": "Fehler beim Laden der Chatliste.", + "failed_remove_rooms": "Einige Chats konnten nicht entfernt werden. Versuche es bitte später noch einmal", "incompatible_server_hierarchy": "Dein Home-Server unterstützt hierarchische Spaces nicht.", "invite": "Personen einladen", "invite_description": "Personen mit E-Mail oder Benutzernamen einladen", @@ -3155,12 +3229,12 @@ "landing_welcome": "Willkommen bei ", "leave_dialog_action": "Space verlassen", "leave_dialog_description": "Du bist dabei, zu verlassen.", - "leave_dialog_only_admin_room_warning": "Du bist der einzige Admin einiger Räume oder Spaces, die du verlassen willst. Dadurch werden diese keine Admins mehr haben.", + "leave_dialog_only_admin_room_warning": "Du bist der einzige Admin einiger Chats oder Spaces, die du verlassen willst. Dadurch werden diese keine Admins mehr haben.", "leave_dialog_only_admin_warning": "Du bist der letzte Admin in diesem Space. Wenn du ihn jetzt verlässt, hat niemand mehr die Kontrolle über ihn.", - "leave_dialog_option_all": "Alle Räume verlassen", - "leave_dialog_option_intro": "Willst du die Räume in diesem Space verlassen?", - "leave_dialog_option_none": "Keine Räume und Subspaces verlassen", - "leave_dialog_option_specific": "Zu verlassende Räume auswählen", + "leave_dialog_option_all": "Verlasse alle Chats", + "leave_dialog_option_intro": "Willst du die Chats in diesem Space verlassen?", + "leave_dialog_option_none": "Keine Chats und Subspaces verlassen", + "leave_dialog_option_specific": "Zu verlassende Chats auswählen", "leave_dialog_public_rejoin_warning": "Das Betreten wird dir ohne erneute Einladung nicht möglich sein.", "leave_dialog_title": "%(spaceName)s verlassen", "mark_suggested": "Als vorgeschlagen markieren", @@ -3169,15 +3243,15 @@ "sections_section": "Anzuzeigende Bereiche", "show_people_in_space": "Gruppiere Unterhaltungen mit Mitgliedern dieses Spaces. Diese Option zu deaktivieren, wird die Unterhaltungen aus %(spaceName)s ausblenden." }, - "room_filter_placeholder": "Räume suchen", + "room_filter_placeholder": "Gruppen suchen", "search_children": "%(spaceName)s durchsuchen", "search_placeholder": "Nach Name und Beschreibung filtern", - "select_room_below": "Wähle vorher einen Raum aus", + "select_room_below": "Wähle vorher einen Chat aus", "share_public": "Teile deinen öffentlichen Space mit der Welt", "suggested": "Vorgeschlagen", - "suggested_tooltip": "Dieser Raum wird vorgeschlagen", + "suggested_tooltip": "Dieser Chat wird vorgeschlagen", "title_when_query_available": "Ergebnisse", - "title_when_query_unavailable": "Räume und Spaces", + "title_when_query_unavailable": "Chats und Spaces", "unmark_suggested": "Als nicht vorgeschlagen markieren", "user_lacks_permission": "Du hast dazu keine Berechtigung" }, @@ -3185,9 +3259,9 @@ "title": "Einstellungen - %(spaceName)s" }, "spaces": { - "error_no_permission_add_room": "Du hast keine Berechtigung, Räume zu diesem Space hinzuzufügen", + "error_no_permission_add_room": "Du hast keine Berechtigung, Chats zu diesem Space hinzuzufügen", "error_no_permission_add_space": "Du hast keine Berechtigung, Spaces zu diesem Space hinzuzufügen", - "error_no_permission_create_room": "Du hast keine Berechtigung, neue Räume in diesem Space zu erstellen", + "error_no_permission_create_room": "Du hast keine Berechtigung, neue Chats in diesem Space zu erstellen", "error_no_permission_invite": "Du hast keine Berechtigung, Personen in diesen Space einzuladen" }, "spotlight": { @@ -3196,26 +3270,26 @@ "network_dropdown_add_dialog_placeholder": "Server-Name", "network_dropdown_add_dialog_title": "Einen Server hinzufügen", "network_dropdown_add_server_option": "Neuen Server hinzufügen …", - "network_dropdown_available_invalid": "Kann diesen Server oder seine Raumliste nicht finden", - "network_dropdown_available_invalid_forbidden": "Du darfst diese Raumliste nicht sehen", + "network_dropdown_available_invalid": "Dieser Server oder seine Chatliste kann nicht gefunden werden", + "network_dropdown_available_invalid_forbidden": "Du darfst diese Chatliste nicht sehen", "network_dropdown_available_valid": "Das sieht gut aus", "network_dropdown_remove_server_adornment": "Server „%(roomServer)s“ entfernen", "network_dropdown_required_invalid": "Gib einen Server-Namen ein", - "network_dropdown_selected_label": "Zeige: Matrix-Räume", - "network_dropdown_selected_label_instance": "%(instance)s Räume zeigen (%(server)s)", + "network_dropdown_selected_label": "Zeige: Matrix-Chats", + "network_dropdown_selected_label_instance": "Zeige %(instance)s Chats auf %(server)s", "network_dropdown_your_server_description": "Dein Server" } }, "spotlight_dialog": { "cant_find_person_helpful_hint": "Falls du nicht findest wen du suchst, send ihnen deinen Einladungslink.", - "cant_find_room_helpful_hint": "Falls du den Raum nicht findest, frag nach einer Einladung oder erstelle einen neuen Raum.", + "cant_find_room_helpful_hint": "Falls du den Chat nicht findest, frag nach einer Einladung oder erstelle einen neuen Chat.", "copy_link_text": "Einladungslink kopieren", "count_of_members": { "one": "%(count)s Mitglied", "other": "%(count)s Mitglieder" }, - "create_new_room_button": "Neuer Raum", - "failed_querying_public_rooms": "Abfrage öffentlicher Räume fehlgeschlagen", + "create_new_room_button": "Starte neuen Chat", + "failed_querying_public_rooms": "Abfrage öffentlicher Chats fehlgeschlagen", "failed_querying_public_spaces": "Abfrage der öffentlichen Spaces fehlgeschlagen", "group_chat_section_title": "Andere Optionen", "heading_with_query": "Nutze \"%(query)s\" zum Suchen", @@ -3223,8 +3297,8 @@ "join_button_text": "%(roomAddress)s betreten", "keyboard_scroll_hint": "Benutze zum Scrollen", "messages_label": "Nachrichten", - "other_rooms_in_space": "Andere Räume in %(spaceName)s", - "public_rooms_label": "Öffentliche Räume", + "other_rooms_in_space": "Andere Chats in %(spaceName)s", + "public_rooms_label": "Öffentliche Chats", "public_spaces_label": "Öffentliche Spaces", "recent_searches_section_title": "Kürzliche Gesucht", "recently_viewed_section_title": "Kürzlich besucht", @@ -3233,7 +3307,7 @@ "result_may_be_hidden_warning": "Einige Ergebnisse können ausgeblendet sein", "search_dialog": "Suchdialog", "spaces_title": "Spaces, in denen du Mitglied bist", - "start_group_chat_button": "Gruppenunterhaltung beginnen" + "start_group_chat_button": "Neue Gruppe" }, "stickers": { "empty": "Keine Sticker-Pakete aktiviert", @@ -3258,18 +3332,18 @@ }, "theme": { "light_high_contrast": "Hell kontrastreich", - "match_system": "An System anpassen" + "match_system": "Systemeinstellung" }, "thread_view_back_action_label": "Zurück zum Thread", "threads": { "all_threads": "Alle Threads", - "all_threads_description": "Alle Threads des Raums anzeigen", + "all_threads_description": "Alle Threads des Chats anzeigen", "count_of_reply": { "one": "%(count)s Antwort", "other": "%(count)s Antworten" }, "empty_description": "Verwende \"%(replyInThread)s\" beim Hovern über eine Nachricht.", - "empty_title": "Threads helfen Ihnen, Ihre Unterhaltungen beim Thema zu halten, and sie sind auch leichter zu verfolgen.", + "empty_title": "Threads helfen, Unterhaltungen beim Thema zu halten und sie leichter zu verfolgen.", "error_start_thread_existing_relation": "Du kannst keinen Thread in einem Thread starten", "mark_all_read": "Alle als gelesen markieren", "my_threads": "Meine Threads", @@ -3279,8 +3353,8 @@ }, "threads_activity_centre": { "header": "Thread-Aktivität", - "no_rooms_with_threads_notifs": "Sie haben noch keine Chatrooms mit Thread-Benachrichtigungen.", - "no_rooms_with_unread_threads": "Sie haben noch keine Chatrooms mit ungelesenen Threads." + "no_rooms_with_threads_notifs": "Es gibt keine Chats mit Thread-Benachrichtigungen.", + "no_rooms_with_unread_threads": "Es gibt keine Chats mit ungelesenen Threads." }, "time": { "about_day_ago": "vor etwa einem Tag", @@ -3322,12 +3396,12 @@ "view_source": "Rohdaten anzeigen" }, "creation_summary_dm": "%(creator)s hat diese Direktnachricht erstellt.", - "creation_summary_room": "%(creator)s hat den Raum erstellt und konfiguriert.", + "creation_summary_room": "%(creator)s hat den Chat erstellt und konfiguriert.", "decryption_failure": { "blocked": "Der Absender hat den Empfang dieser Nachricht blockiert, da Ihr Gerät nicht verifiziert ist.", "historical_event_no_key_backup": "Der historische Nachrichtenverlauf ist auf diesem Gerät nicht verfügbar.", - "historical_event_unverified_device": "Sie müssen dieses Gerät verifizieren, um auf den Nachrichtenverlauf zugreifen zu können", - "historical_event_user_not_joined": "Sie haben keinen Zugriff auf diese Nachricht", + "historical_event_unverified_device": "Für den Zugriff auf den Nachrichtenverlauf musst du dieses Gerät verifizieren", + "historical_event_user_not_joined": "Du hast keinen Zugriff auf diese Nachricht", "sender_identity_previously_verified": "Die verifizierte Identität des Absenders wurde zurückgesetzt", "sender_unsigned_device": "Von einem unsicheren Gerät verschickt.", "unable_to_decrypt": "Entschlüsselung der Nachricht nicht möglich" @@ -3347,14 +3421,15 @@ "error_rendering_message": "Diese Nachricht kann nicht geladen werden", "historical_messages_unavailable": "Du kannst keine älteren Nachrichten lesen", "in_room_name": " in %(room)s", - "io.element.widgets.layout": "%(senderName)s hat das Raumlayout geändert", + "io.element.widgets.layout": "%(senderName)s hat das Layout des Chats geändert", "late_event_separator": "Ursprünglich gesendet %(dateTime)s", "load_error": { "no_permission": "Dir fehlt die Berechtigung, diese alten Nachrichten zu lesen.", "title": "Laden der Verlaufsposition fehlgeschlagen", - "unable_to_find": "Das Laden einer bestimmten Stelle im Verlauf des Raumes zu laden ist gescheitert, da sie nicht gefunden wurde." + "unable_to_find": "Der Sprung an eine bestimmte Stelle im Nachrichtenverlauf dieses Chats ist gescheitert. Die Stelle konnte nicht gefunden werden." }, "m.audio": { + "audio_player": "Audio-Player", "error_downloading_audio": "Fehler beim Herunterladen der Audiodatei", "error_processing_audio": "Fehler beim Verarbeiten der Audionachricht", "error_processing_voice_message": "Fehler beim Verarbeiten der Sprachnachricht", @@ -3421,59 +3496,59 @@ }, "m.poll.start": "%(senderName)s hat eine Umfrage begonnen – %(pollQuestion)s", "m.room.avatar": { - "changed": "%(senderDisplayName)s hat das Raumbild geändert.", - "changed_img": "%(senderDisplayName)s hat das Raumbild zu geändert", - "lightbox_title": "%(senderDisplayName)s hat das Raumbild von %(roomName)s geändert", - "removed": "%(senderDisplayName)s hat das Raumbild entfernt." + "changed": "%(senderDisplayName)s hat den Avatar des Chats geändert.", + "changed_img": "%(senderDisplayName)s hat den Avatar des Chats zu geändert", + "lightbox_title": "%(senderDisplayName)s hat den Avatar des Chats %(roomName)s geändert", + "removed": "%(senderDisplayName)s hat den Avatar des Chats entfernt." }, "m.room.canonical_alias": { "alt_added": { - "one": "%(senderName)s hat die alternative Adresse %(addresses)s für diesen Raum hinzugefügt.", - "other": "%(senderName)s hat die alternative Adresse %(addresses)s für diesen Raum hinzugefügt." + "one": "%(senderName)s hat die alternative Adresse %(addresses)s für diesen Chat hinzugefügt.", + "other": "%(senderName)s hat die alternative Adresse %(addresses)s für diesen Chat hinzugefügt." }, "alt_removed": { - "other": "%(senderName)s hat die alternativen Adressen %(addresses)s für diesen Raum entfernt.", - "one": "%(senderName)s hat die alternative Adresse %(addresses)s für diesen Raum entfernt." + "one": "%(senderName)s hat die alternative Adresse %(addresses)s für diesen Chat entfernt.", + "other": "%(senderName)s hat die alternativen Adressen %(addresses)s für diesen Chat entfernt." }, - "changed": "%(senderName)s hat die Adresse für diesen Raum geändert.", - "changed_alternative": "%(senderName)s hat die alternative Adresse für diesen Raum geändert.", - "changed_main_and_alternative": "%(senderName)s hat die Haupt- und Alternativadressen für diesen Raum geändert.", - "removed": "%(senderName)s hat die Hauptadresse von diesem Raum entfernt.", - "set": "%(senderName)s hat als Hauptadresse des Raums %(address)s festgelegt." + "changed": "%(senderName)s hat die Adresse für diesen Chat geändert.", + "changed_alternative": "%(senderName)s hat die alternative Adresse für diesen Chat geändert.", + "changed_main_and_alternative": "%(senderName)s hat die Haupt- und Alternativadressen für diesen Chat geändert.", + "removed": "%(senderName)s hat die Hauptadresse von diesem Chat entfernt.", + "set": "%(senderName)s hat als Hauptadresse des Chats %(address)s festgelegt." }, "m.room.create": { - "continuation": "Dieser Raum ist eine Fortsetzung einer anderen Konversation.", + "continuation": "Dieser Chat ist eine Fortsetzung einer anderen Unterhaltung.", "see_older_messages": "Klicke hier, um ältere Nachrichten zu sehen.", - "unknown_predecessor": "Konnte die alte Version dieses Raumes nicht finden (Raum-ID: %(roomId)s) und uns wurde „via_servers“ nicht mitgeteilt, um danach zu suchen.", - "unknown_predecessor_guess_server": "Konnte die alte Version dieses Raumes nicht finden (Raum-ID: %(roomId)s) und uns wurde „via_servers“ nicht mitgeteilt, um danach zu suchen. Es ist möglich, dass das Erraten des Servers basierend auf der Raum-ID funktioniert. Wenn du dies probieren möchtest, klicke auf folgenden Link:" + "unknown_predecessor": "Die alte Version dieses Chats (ID: %(roomId)s) kann nicht gefunden werden. Es gibt auch keine „via_servers“ Information für eine Suche.", + "unknown_predecessor_guess_server": "Die alte Version dieses Chats (ID: %(roomId)s) kann nicht gefunden werden. Es gibt auch keine „via_servers“ Information für eine Suche. Möglicherweise kann der Server auf Basis der ID erraten werden. Wenn du dies probieren möchtest, klicke diesen Link:" }, "m.room.encryption": { "disable_attempt": "Versuch, die Verschlüsselung zu deaktivieren, wurde ignoriert", "disabled": "Verschlüsselung nicht aktiviert", - "enabled": "Nachrichten in diesem Raum sind Ende-zu-Ende-verschlüsselt. Wenn Personen beitreten, kannst du sie in ihrem Profil verifizieren, indem du auf deren Profilbild klickst.", + "enabled": "Nachrichten in diesem Chat sind Ende-zu-Ende-verschlüsselt. Wenn Personen beitreten, kannst du sie in ihrem Profil verifizieren, indem du auf deren Profilbild klickst.", "enabled_dm": "Nachrichten hier sind Ende-zu-Ende-verschlüsselt. Verifiziere %(displayName)s in deren Profil – klicke auf deren Profilbild.", "enabled_local": "Nachrichten in dieser Unterhaltung werden Ende-zu-Ende-verschlüsselt.", "parameters_changed": "Einige Verschlüsselungsoptionen wurden geändert.", - "unsupported": "Die von diesem Raum verwendete Verschlüsselung wird nicht unterstützt." + "unsupported": "Die von diesem Chat verwendete Verschlüsselung wird nicht unterstützt." }, "m.room.guest_access": { - "can_join": "%(senderDisplayName)s erlaubte Gäste diesem Raum beizutreten.", - "forbidden": "%(senderDisplayName)s hat Gästen verboten, diesem Raum beizutreten.", + "can_join": "%(senderDisplayName)s hat Gästen erlaubt, diesem Chat beizutreten.", + "forbidden": "%(senderDisplayName)s hat Gästen verboten, diesem Chat beizutreten.", "unknown": "%(senderDisplayName)s änderte den Gastzutritt auf „%(rule)s“" }, "m.room.history_visibility": { - "invited": "%(senderName)s hat den Verlauf für alle Raummitglieder ab ihrer Einladung sichtbar gemacht.", - "joined": "%(senderName)s hat den Verlauf für alle Raummitglieder ab ihrem Betreten sichtbar gemacht.", - "shared": "%(senderName)s hat den zukünftigen Verlauf für alle Raummitglieder sichtbar gemacht.", + "invited": "%(senderName)s hat den künftigen Nachrichtenverlauf für alle neuen Mitglieder ab dem Zeitpunkt ihrer Einladung sichtbar gemacht.", + "joined": "%(senderName)s hat den Nachrichten-Verlauf für alle Mitglieder ab ihrem Beitritt sichtbar gemacht.", + "shared": "%(senderName)s hat den zukünftigen Nachrichtenverlauf für alle Mitglieder des Chats sichtbar gemacht.", "unknown": "%(senderName)s hat den zukünftigen Verlauf für Unbekannte sichtbar gemacht (%(visibility)s).", "world_readable": "%(senderName)s hat den zukünftigen Verlauf für alle sichtbar gemacht." }, "m.room.join_rules": { - "invite": "%(senderDisplayName)s hat den Raum auf eingeladene Benutzer beschränkt.", + "invite": "%(senderDisplayName)s hat den Chat auf eingeladene Nutzer beschränkt.", "knock": "%(senderDisplayName)s hat die Zutrittsregel auf Beitrittsanfragen geändert.", - "public": "%(senderDisplayName)s hat den Raum für jeden, der den Link kennt, öffentlich gemacht.", - "restricted": "%(senderDisplayName)s hat geändert, wer diesen Raum betreten darf.", - "restricted_settings": "%(senderDisplayName)s hat geändert, wer diesen Raum betreten darf. Einstellungen anzeigen.", + "public": "%(senderDisplayName)s hat den Chat für jeden, der den Link kennt, öffentlich gemacht.", + "restricted": "%(senderDisplayName)s hat geändert, wer diesem Chat beitreten darf.", + "restricted_settings": "%(senderDisplayName)s hat geändert, wer diesem Chat beitreten darf. Einstellungen anzeigen.", "unknown": "%(senderDisplayName)s hat die Zutrittsregel auf „%(rule)s“ geändert" }, "m.room.member": { @@ -3485,11 +3560,11 @@ "change_name": "%(oldDisplayName)s hat den Anzeigenamen zu %(displayName)s geändert", "change_name_avatar": "%(oldDisplayName)s hat den Anzeigenamen und das Profilbild geändert", "invite": "%(senderName)s hat %(targetName)s eingeladen", - "join": "%(targetName)s hat den Raum betreten", + "join": "%(targetName)s ist dem Chat beigetreten", "kick": "%(senderName)s hat %(targetName)s entfernt", "kick_reason": "%(senderName)s hat %(targetName)s entfernt: %(reason)s", - "left": "%(targetName)s hat den Raum verlassen", - "left_reason": "%(targetName)s hat den Raum verlassen: %(reason)s", + "left": "%(targetName)s hat den Chat verlassen", + "left_reason": "%(targetName)s hat den Chat verlassen: %(reason)s", "no_change": "%(senderName)s hat keine Änderungen gemacht", "reject_invite": "%(targetName)s hat die Einladung abgelehnt", "reject_invite_reason": "%(targetName)slehnte die Einladung ab: %(reason)s", @@ -3497,14 +3572,14 @@ "remove_name": "%(senderName)s hat den alten Anzeigenamen %(oldDisplayName)s entfernt", "set_avatar": "%(senderName)s hat das Profilbild gesetzt", "set_name": "%(senderName)s hat den Anzeigenamen zu %(displayName)s geändert", - "unban": "%(senderName)s hat die Verbannung von %(targetName)s aufgehoben", + "unban": "%(senderName)s hat die Sperre von %(targetName)s aufgehoben", "withdrew_invite": "%(senderName)s hat die Einladung für %(targetName)s zurückgezogen", "withdrew_invite_reason": "%(senderName)s hat die Einladung für %(targetName)s zurückgezogen: %(reason)s" }, "m.room.name": { - "change": "%(senderDisplayName)s hat den Raumnamen von %(oldRoomName)s zu %(newRoomName)s geändert.", - "remove": "%(senderDisplayName)s hat den Raumnamen entfernt.", - "set": "%(senderDisplayName)s hat den Raumnamen geändert zu %(roomName)s." + "change": "%(senderDisplayName)s hat den Namen des Chats von %(oldRoomName)s zu %(newRoomName)s geändert.", + "remove": "%(senderDisplayName)s hat den Namen des Chats entfernt.", + "set": "%(senderDisplayName)s hat den Namen des Chats zu %(roomName)s geändert ." }, "m.room.pinned_events": { "changed": "%(senderName)s hat die fixierte Nachrichten für diesen Chatroom geändert.", @@ -3519,15 +3594,15 @@ "user_from_to": "%(userId)s von %(fromPowerLevel)s zu %(toPowerLevel)s" }, "m.room.server_acl": { - "all_servers_banned": "🎉 Alle Server sind von der Teilnahme ausgeschlossen! Dieser Raum kann nicht mehr genutzt werden.", - "changed": "%(senderDisplayName)s hat die Server-ACLs für diesen Raum geändert.", - "set": "%(senderDisplayName)s hat die Server-ACLs für diesen Raum gesetzt." + "all_servers_banned": "🎉 Alle Server sind für eine Teilnahme gesperrt! Dieser Chat kann nicht mehr genutzt werden.", + "changed": "%(senderDisplayName)s hat die Server-ACLs für diesen Chat geändert.", + "set": "%(senderDisplayName)s hat die Server-ACLs für diesen Chat gesetzt." }, "m.room.third_party_invite": { "revoked": "%(senderName)s hat die Einladung für %(targetDisplayName)s zurückgezogen.", - "sent": "%(senderName)s hat %(targetDisplayName)s in diesen Raum eingeladen." + "sent": "%(senderName)s hat %(targetDisplayName)s in diesen Chat eingeladen." }, - "m.room.tombstone": "%(senderDisplayName)s hat diesen Raum aktualisiert.", + "m.room.tombstone": "%(senderDisplayName)s hat die Chat-Version aktualisiert.", "m.room.topic": { "changed": "%(senderDisplayName)s hat das Thema geändert in \"%(topic)s\".", "removed": "%(senderDisplayName)shat das Thema entfernt." @@ -3540,7 +3615,7 @@ "m.widget": { "added": "%(senderName)s hat das Widget %(widgetName)s hinzugefügt", "jitsi_ended": "Videokonferenz von %(senderName)s beendet", - "jitsi_join_right_prompt": "An der Konferenz kannst du über die rechte Seitenleiste (Rauminfo) teilnehmen", + "jitsi_join_right_prompt": "An der Konferenz kannst du über die rechte Seitenleiste (Chatinfo) teilnehmen", "jitsi_join_top_prompt": "An Konferenz oberhalb des Verlaufs teilnehmen", "jitsi_started": "Videokonferenz von %(senderName)s gestartet", "jitsi_updated": "Videokonferenz wurde von %(senderName)s aktualisiert", @@ -3552,29 +3627,29 @@ "copy_link_thread": "Link zu Thread kopieren", "expand_reply_chain": "Zitate ausklappen", "label": "Nachrichtenaktionen", - "view_in_room": "Im Raum anzeigen" + "view_in_room": "Im Chat anzeigen" }, "message_timestamp_received_at": "Empfangen am: %(dateTime)s", "message_timestamp_sent_at": "Gesendet am: %(dateTime)s", "mjolnir": { - "changed_rule_glob": "%(senderName)s aktualisierte eine Ausschlussregel von %(oldGlob)s nach %(newGlob)s wegen %(reason)s", - "changed_rule_rooms": "%(senderName)s ändert eine Ausschlussregel für Räume von %(oldGlob)s nach %(newGlob)s, wegen %(reason)s", + "changed_rule_glob": "%(senderName)s hat die Regel für Sperren von %(oldGlob)s auf %(newGlob)s aktualisiert. Grund: %(reason)s", + "changed_rule_rooms": "%(senderName)s hat eine Sperr-Regel für Chats von %(oldGlob)s nach %(newGlob)s wegen %(reason)s geändert", "changed_rule_servers": "%(senderName)s änderte eine Ausschlussregel für Server von %(oldGlob)s nach %(newGlob)s wegen %(reason)s", "changed_rule_users": "%(senderName)s ändert eine Ausschlussregel von %(oldGlob)s nach %(newGlob)s, wegen %(reason)s", "created_rule": "%(senderName)s erstellte eine Ausschlussregel, die aufgrund von %(reason)s %(glob)s entspricht", - "created_rule_rooms": "%(senderName)s erstellt eine Ausschlussregel für Räume, die %(glob)s aufgrund von %(reason)s entspricht", + "created_rule_rooms": "%(senderName)s hat eine Sperr-Regel für Chats erstellt, die %(glob)s aufgrund von %(reason)s entspricht", "created_rule_servers": "%(senderName)s erstellte eine Ausschlussregel für Server, die aufgrund von %(reason)s %(glob)s entsprechen", "created_rule_users": "%(senderName)s hat eine Ausschlussregel für Nutzer erstellt, die aufgrund %(reason)s %(glob)s entsprechen", - "message_hidden": "Du blockierst diesen Benutzer, deshalb werden seine Nachrichten nicht angezeigt. Trotzdem anzeigen.", + "message_hidden": "Du ignorierst diesen Nutzer, so dass dessen Nachrichten verborgen werden. Trotzdem anzeigen.", "removed_rule": "%(senderName)s entfernte die Ausschlussregel, die %(glob)s entspricht", - "removed_rule_rooms": "%(senderName)s entfernte die Ausschlussregel für Räume, die %(glob)s entsprechen", + "removed_rule_rooms": "%(senderName)s hat die Sperr-Regel für Chats entfernt, die %(glob)s entsprechen", "removed_rule_servers": "%(senderName)s entfernte die Ausschlussregel für Server, die %(glob)s entsprechen", "removed_rule_users": "%(senderName)s entfernte die Ausschlussregel für Benutzer, die %(glob)s entsprechen", - "updated_invalid_rule": "%(senderName)s aktualisierte eine ungültige Ausschlussregel", - "updated_rule": "%(senderName)s aktualisierte eine Ausschlussregel, die wegen %(reason)s %(glob)s entspricht", - "updated_rule_rooms": "%(senderName)s aktualisierte die Ausschlussregel für Räume, die aufgrund von %(reason)s %(glob)s entsprechen", - "updated_rule_servers": "%(senderName)s aktualisierte die Ausschlussregel für Server, die aufgrund von %(reason)s %(glob)s entsprechen", - "updated_rule_users": "%(senderName)s aktualisierte die Ausschlussregel für Benutzer, die aufgrund von %(reason)s %(glob)s entsprechen" + "updated_invalid_rule": "%(senderName)s aktualisierte eine ungültige Regel für Sperren", + "updated_rule": "%(senderName)s aktualisierte eine Regel für Sperren, die wegen %(reason)s %(glob)s entspricht", + "updated_rule_rooms": "%(senderName)s aktualisierte die Regel für Sperren für Chats, die aufgrund von %(reason)s %(glob)s entsprechen", + "updated_rule_servers": "%(senderName)s aktualisierte die Regel für Sperren für Server, die aufgrund von %(reason)s %(glob)s entsprechen", + "updated_rule_users": "%(senderName)s aktualisierte die Regel für Sperren für Nutzer, die aufgrund von %(reason)s %(glob)s entsprechen" }, "no_permission_messages_before_invite": "Du kannst keine Nachrichten lesen, die gesendet wurden, bevor du eingeladen wurdest.", "no_permission_messages_before_join": "Du kannst keine Nachrichten lesen, die gesendet wurden, bevor du beigetreten bist.", @@ -3631,8 +3706,8 @@ "one": "%(oneUser)shat den Namen geändert" }, "changed_name_multiple": { - "other": "%(severalUsers)s haben %(count)s-mal ihren Namen geändert", - "one": "%(severalUsers)shaben ihren Namen geändert" + "one": "%(severalUsers)s haben den Namen geändert", + "other": "%(severalUsers)s haben %(count)s-mal den Namen geändert" }, "format": "%(nameList)s %(transitionList)s", "hidden_event": { @@ -3660,20 +3735,20 @@ "one": "wurden eingeladen" }, "joined": { - "other": "%(oneUser)shat den Raum %(count)s-mal betreten", - "one": "%(oneUser)shat den Raum betreten" + "one": "%(oneUser)s ist dem Chat beigetreten", + "other": "%(oneUser)s ist dem Chat %(count)s-mal beigetreten" }, "joined_and_left": { - "other": "%(oneUser)shat den Raum %(count)s-mal betreten und wieder verlassen", - "one": "%(oneUser)shat den Raum betreten und wieder verlassen" + "one": "%(oneUser)s ist dem Chat beigetreten und hat ihn wieder verlassen", + "other": "%(oneUser)s ist dem Chat %(count)s-mal beigetreten und hat ihn wieder verlassen" }, "joined_and_left_multiple": { - "other": "%(severalUsers)shaben %(count)s-mal den Raum betreten und verlassen", - "one": "%(severalUsers)shaben den Raum betreten und wieder verlassen" + "one": "%(severalUsers)s sind dem Chat beigetreten und haben ihn wieder verlassen", + "other": "%(severalUsers)s sind dem Chat %(count)s-mal beigetreten und haben ihn wieder verlassen" }, "joined_multiple": { - "other": "%(severalUsers)shaben den Raum %(count)s-mal betreten", - "one": "%(severalUsers)shaben den Raum betreten" + "one": "%(severalUsers)s sind dem Chat beigetreten", + "other": "%(severalUsers)s sind dem Chat %(count)s-mal beigetreten" }, "kicked": { "other": "wurde %(count)s mal entfernt", @@ -3684,12 +3759,12 @@ "other": "wurden %(count)s mal entfernt" }, "left": { - "other": "%(oneUser)shat den Raum %(count)s-mal verlassen", - "one": "%(oneUser)shat den Raum verlassen" + "one": "%(oneUser)s hat den Chat verlassen", + "other": "%(oneUser)s hat den Chat %(count)s-mal verlassen" }, "left_multiple": { - "other": "%(severalUsers)shaben den Raum %(count)s-mal verlassen", - "one": "%(severalUsers)shaben den Raum verlassen" + "one": "%(severalUsers)s haben den Chat verlassen", + "other": "%(severalUsers)s haben den Chat %(count)s-mal verlassen" }, "no_change": { "other": "%(oneUser)shat %(count)s mal keine Änderung vorgenommen", @@ -3700,12 +3775,12 @@ "other": "%(severalUsers)s haben %(count)s mal nichts geändert" }, "pinned_events": { - "one": "%(oneUser)s hat die angehefteten Nachrichten des Raumes bearbeitet", - "other": "%(oneUser)s hat die angehefteten Nachrichten des Raumes %(count)s-Mal bearbeitet" + "one": "%(oneUser)s hat die fixierten Nachrichten des Chat bearbeitet", + "other": "%(oneUser)s hat die fixierten Nachrichten des Chat %(count)s-Mal bearbeitet" }, "pinned_events_multiple": { - "one": "%(severalUsers)s hat die angehefteten Nachrichten des Raumes bearbeitet", - "other": "%(severalUsers)s haben die angehefteten Nachrichten des Raumes %(count)s-Mal bearbeitet" + "one": "%(severalUsers)s haben die fixierten Nachrichten des Chat bearbeitet", + "other": "%(severalUsers)s haben die fixierten Nachrichten des Chat %(count)s-Mal bearbeitet" }, "redacted": { "one": "%(oneUser)s hat eine Nachricht gelöscht", @@ -3720,16 +3795,16 @@ "one": "%(oneUser)shat die Einladung abgelehnt" }, "rejected_invite_multiple": { - "one": "%(severalUsers)shaben ihre Einladungen abgelehnt", - "other": "%(severalUsers)shaben ihre Einladungen %(count)s-mal abgelehnt" + "one": "%(severalUsers)s haben Einladungen abgelehnt", + "other": "%(severalUsers)s haben %(count)s-mal Einladungen abgelehnt" }, "rejoined": { - "other": "%(oneUser)shat den Raum %(count)s-mal verlassen und wieder betreten", - "one": "%(oneUser)shat den Raum verlassen und wieder betreten" + "one": "%(oneUser)s hat den Chat verlassen und ist ihm wieder beigetreten", + "other": "%(oneUser)s hat den Chat %(count)s-mal verlassen und ist ihm wieder beigetreten" }, "rejoined_multiple": { - "other": "%(severalUsers)shaben den Raum %(count)s-mal verlassen und wieder betreten", - "one": "%(severalUsers)shaben den Raum verlassen und wieder betreten" + "one": "%(severalUsers)s haben den Chat verlassen und sind ihm wieder beigetreten", + "other": "%(severalUsers)s haben den Chat %(count)s-mal verlassen und sind ihm wieder beigetreten" }, "server_acls": { "one": "%(oneUser)s hat die Server-ACLs geändert", @@ -3740,12 +3815,12 @@ "other": "%(severalUsers)s haben die Server-ACLs %(count)s Mal geändert" }, "unbanned": { - "other": "wurde %(count)s-mal entbannt", - "one": "wurde entbannt" + "one": "wurde entsperrt", + "other": "wurde %(count)s-mal entsperrt" }, "unbanned_multiple": { - "other": "wurden %(count)s-mal entbannt", - "one": "wurden entbannt" + "one": "wurden entsperrt", + "other": "wurden %(count)s-mal entsperrt" } }, "thread_info_basic": "Aus einem Thread", @@ -3770,7 +3845,7 @@ "other": "Und %(count)s weitere …" }, "unsupported_browser": { - "description": "Wenn Sie fortfahren, funktionieren einige Funktionen möglicherweise nicht mehr und es besteht das Risiko, dass Sie in Zukunft Daten verlieren. Aktualisieren Sie Ihren Browser, um die Nutzung von %(brand)s fortzusetzen.", + "description": "Wenn du fortfährst könnten einige Funktionen möglicherweise ausfallen und es besteht das Risiko, in Zukunft Daten zu verlieren. Aktualisiere den Browser, um die Nutzung von %(brand)s fortzusetzen.", "title": "%(brand)s unterstützt diesen Browser nicht" }, "unsupported_server_description": "Dieser Server nutzt eine ältere Matrix-Version. Aktualisiere auf Matrix %(version)s, um %(brand)s fehlerfrei nutzen zu können.", @@ -3792,10 +3867,10 @@ }, "update_room_access_modal": { "description": "Um einen Link zum Teilen zu erstellen, mache diesen Chatroom öffentlich oder erlaube Beitrittsanfragen. Auf diese Weise können Gäste beitreten, ohne eingeladen zu werden.", - "dont_change_description": "Andernfalls, wenn Sie den Zugang dieses Raumes nicht anpassen möchten, können sie einen neuen Raum für den Anruflink erstellen.", + "dont_change_description": "Solltest du die Zugangsberechtigung für diesen Chat nicht anpassen wollen, kannst du auch einen neuen Chat für den Anruflink erstellen.", "no_change": "Ich möchte die Zugriffsebene nicht ändern.", - "revert_access_description": "(Dies kann in den Raumeinstellungen auf den vorherigen Wert zurückgesetzt werden: Sicherheit & Datenschutz/Zutritt)", - "title": "Gastbenutzern erlauben, diesem Raum beizutreten" + "revert_access_description": "(Dies kann in den Chateinstellungen auf den vorherigen Wert zurückgesetzt werden: Sicherheit & Datenschutz/Zutritt)", + "title": "Gastnutzern erlauben, diesem Chat beizutreten" }, "upload_failed_generic": "Die Datei „%(fileName)s“ konnte nicht hochgeladen werden.", "upload_failed_size": "Die Datei „%(fileName)s“ überschreitet das Hochladelimit deines Heim-Servers", @@ -3821,9 +3896,9 @@ "ban_button_space": "Bannen", "ban_room_confirm_title": "Aus %(roomName)s verbannen", "ban_space_everything": "Überall sperren, wo ich die Rechte dazu habe", - "ban_space_specific": "Sperre sie in ausgewählten Chatrooms und Spaces", + "ban_space_specific": "Sperre sie in ausgewählten Chats und Spaces", "deactivate_confirm_action": "Konto deaktivieren", - "deactivate_confirm_description": "Beim Deaktivieren wirst du abgemeldet und ein erneutes Anmelden verhindert. Zusätzlich wirst du aus allen Räumen entfernt. Diese Aktion kann nicht rückgängig gemacht werden. Bist du sicher, dass du dieses Konto deaktivieren willst?", + "deactivate_confirm_description": "Das Deaktivieren dieses Nutzers wird zu einer Abmeldung führen ein erneutes Anmelden verhindern. Zusätzlich wird die Mitgliedschaft aus allen Chats entfernt. Diese Aktion kann nicht rückgängig gemacht werden. Bist du sicher, dass du diesen Nutzer deaktivieren willst?", "deactivate_confirm_title": "Konto deaktivieren?", "demote_button": "Zurückstufen", "demote_self_confirm_description_space": "Das Entfernen von Rechten kann nicht rückgängig gemacht werden. Falls sie dir niemand anderer zurückgeben kann, kannst du sie nie wieder erhalten.", @@ -3838,12 +3913,12 @@ "error_mute_user": "Stummschalten des Nutzers fehlgeschlagen", "error_revoke_3pid_invite_description": "Die Einladung konnte nicht zurückgezogen werden. Der Server hat möglicherweise ein vorübergehendes Problem oder du hast nicht ausreichende Berechtigungen, um die Einladung zurückzuziehen.", "error_revoke_3pid_invite_title": "Einladung konnte nicht zurückgezogen werden", - "ignore_button": "Blockieren", + "ignore_button": "Ignorieren", "ignore_confirm_description": "Alle Nachrichten und Einladungen der Person werden verborgen. Bist du sicher, dass du sie ignorieren möchtest?", "ignore_confirm_title": "%(user)s ignorieren", "invited_by": "%(sender)s eingeladen", "jump_to_rr_button": "Zur Lesebestätigung springen", - "kick_button_room": "Aus Raum entfernen", + "kick_button_room": "Aus Chat entfernen", "kick_button_room_name": "Aus %(roomName)s entfernen", "kick_button_space": "Aus Space entfernen", "kick_button_space_everything": "Person aus allen, mir möglichen Bereichen entfernen", @@ -3868,18 +3943,18 @@ }, "redact_button": "Nachrichten entfernen", "revoke_invite": "Einladung zurückziehen", - "room_encrypted": "Nachrichten in diesem Raum sind Ende-zu-Ende verschlüsselt.", - "room_encrypted_detail": "Diese Nachricht ist verschlüsselt. Nur Sie und der Empfänger haben den Schlüssel, um die Nachricht zu entschlüsseln.", - "room_unencrypted": "Nachrichten in diesem Raum sind nicht Ende-zu-Ende verschlüsselt.", - "room_unencrypted_detail": "Nachrichten in verschlüsselten Räumen können nur von dir und vom Empfänger gelesen werden.", + "room_encrypted": "Nachrichten in diesem Chat sind Ende-zu-Ende verschlüsselt.", + "room_encrypted_detail": "Diese Nachricht ist verschlüsselt. Nur du und der Empfänger haben Schlüssel, um die Nachricht zu entschlüsseln.", + "room_unencrypted": "Nachrichten in diesem Chat sind nicht Ende-zu-Ende verschlüsselt.", + "room_unencrypted_detail": "Nachrichten in verschlüsselten Chats können nur von dir und vom Empfänger gelesen werden.", "send_message": "Nachricht senden", "share_button": "Profil teilen", - "unban_button_room": "Sperrung für den Chatroom aufheben", + "unban_button_room": "Sperrung für den Chat aufheben", "unban_button_space": "Sperrung aus Space aufheben", "unban_room_confirm_title": "Sperrung für %(roomName)s aufheben", - "unban_space_everything": "Die Verbannung überall aufheben wo ich die Rechte dazu habe", - "unban_space_specific": "In ausgewählten Chatrooms und Spaces die Sperrung für sie aufheben", - "unban_space_warning": "Die Person wird keinen Zutritt zu Bereichen haben, in denen du nicht administrierst.", + "unban_space_everything": "Entsperre sie überall dort, wo du die Rechte dazu hast", + "unban_space_specific": "Entsperre in ausgewählten Chats und Spaces", + "unban_space_warning": "Die Person wird keinen Zutritt zu Bereichen haben, in denen du nicht Administrator bist.", "unignore_button": "Nicht mehr ignorieren", "verification_unavailable": "Benutzerverifizierung nicht verfügbar", "verify_button": "Nutzer verifizieren", @@ -3906,15 +3981,16 @@ "call_held": "%(peerName)s hält den Anruf", "call_held_resume": "Du hältst den Anruf Fortsetzen", "call_held_switch": "Du hältst den Anruf Wechseln", - "call_toast_unknown_room": "Unbekannter Raum", + "call_toast_unknown_room": "Unbekannter Chat", "camera_disabled": "Deine Kamera ist ausgeschaltet", "camera_enabled": "Deine Kamera ist noch aktiv", "cannot_call_yourself_description": "Du kannst keinen Anruf mit dir selbst starten.", "close_lobby": "Lobby schließen", "connecting": "Verbinden", "connection_lost": "Verbindung zum Server unterbrochen", - "connection_lost_description": "Ohne Verbindung zum Server können Sie keine Anrufe tätigen.", + "connection_lost_description": "Du kannst ohne Verbindung zum Server keine Anrufe tätigen.", "consulting": "%(transferTarget)s wird angefragt. Übertragung zu %(transferee)s", + "decline_call": "Ablehnen", "default_device": "Standardgerät", "dial": "Wählen", "dialpad": "Telefontastatur", @@ -3957,7 +4033,7 @@ "no_media_perms_description": "Gegebenenfalls kann es notwendig sein, dass du %(brand)s manuell den Zugriff auf dein Mikrofon bzw. deine Webcam gewähren musst", "no_media_perms_title": "Keine Medienberechtigungen", "no_permission_conference": "Berechtigung benötigt", - "no_permission_conference_description": "Du hast keine Berechtigung, ein Konferenzgespräch in diesem Raum zu starten", + "no_permission_conference_description": "Du hast keine Berechtigung, einen Konferenz Anruf in diesem Chat zu starten", "on_hold": "%(name)s wird gehalten", "output_devices": "Ausgabegeräte", "screenshare_monitor": "Vollständigen Bildschirm teilen", @@ -3966,6 +4042,7 @@ "show_sidebar_button": "Seitenleiste anzeigen", "silence": "Anruf stummschalten", "silenced": "Benachrichtigungen stummgeschaltet", + "skip_lobby_toggle_option": "Sofort beitreten", "start_screenshare": "Bildschirmfreigabe starten", "stop_screenshare": "Bildschirmfreigabe beenden", "too_many_calls": "Zu viele Anrufe", @@ -4003,73 +4080,73 @@ }, "capability": { "always_on_screen_generic": "Bleib auf deinem Bildschirm während der Ausführung von", - "always_on_screen_viewing_another_room": "Sichtbar bleiben, wenn es ausgeführt und ein anderer Raum angezeigt wird", - "any_room": "Wie oben, nur zusätzlich in allen Räumen denen du beigetreten oder in die du eingeladen wurdest", + "always_on_screen_viewing_another_room": "Sichtbar bleiben, wenn es ausgeführt und ein anderer Chat angezeigt wird", + "any_room": "Wie oben, nur zusätzlich in allen Chats denen du beigetreten oder in die du eingeladen wurdest", "byline_empty_state_key": "mit einem leeren Zustandsschlüssel", "byline_state_key": "mit Zustandsschlüssel %(stateKey)s", "capability": "Die %(capability)s-Fähigkeit", - "change_avatar_active_room": "Den Avatar deines aktiven Raums ändern", - "change_avatar_this_room": "Icon von diesem Raum ändern", - "change_name_active_room": "Den Namen deines aktiven Raums ändern", - "change_name_this_room": "Name von diesem Raum ändern", - "change_topic_active_room": "Das Thema von deinem aktiven Raum ändern", - "change_topic_this_room": "Das Thema von diesem Raum ändern", - "receive_membership_active_room": "Anzeigen, wenn Leute den aktuellen Raum betreten, verlassen oder in ihn eingeladen werden", - "receive_membership_this_room": "Anzeigen, wenn Leute eingeladen werden, den Raum betreten oder verlassen", - "remove_ban_invite_leave_active_room": "Entferne, verbanne oder lade andere in deinen aktiven Raum ein und verlasse den Raum selbst", - "remove_ban_invite_leave_this_room": "Entferne, verbanne oder lade andere in diesen Raum ein und verlasse den Raum selbst", - "see_avatar_change_active_room": "Sehen, wenn das Icon in deinem aktiven Raum geändert wird", - "see_avatar_change_this_room": "Sehen, wenn sich das Icon des Raums ändert", - "see_event_type_sent_active_room": "In deinen aktiven Raum gesendete %(eventType)s-Ereignisse anzeigen", - "see_event_type_sent_this_room": "In diesen Raum gesendete %(eventType)s-Ereignisse anzeigen", - "see_images_sent_active_room": "In deinen aktiven Raum gesendete Bilder anzeigen", - "see_images_sent_this_room": "In diesen Raum gesendete Bilder anzeigen", - "see_messages_sent_active_room": "In deinen aktiven Raum gesendete Nachrichten anzeigen", - "see_messages_sent_this_room": "In diesen Raum gesendete Nachrichten anzeigen", - "see_msgtype_sent_active_room": "Zeige %(msgtype)s Nachrichten, welche in deinen aktiven Raum gesendet worden sind", - "see_msgtype_sent_this_room": "Zeige %(msgtype)s Nachrichten, welche in diesen Raum gesendet worden sind", - "see_name_change_active_room": "Sehen wenn der Name sich in deinem aktiven Raum ändert", - "see_name_change_this_room": "Sehen wenn sich der Name in diesem Raum ändert", - "see_sent_emotes_active_room": "In deinen aktiven Raum gesendete Emojis anzeigen", - "see_sent_emotes_this_room": "In diesen Raum gesendete Emojis anzeigen", - "see_sent_files_active_room": "Allgemeine in deinen aktiven Raum gesendete Dateien anzeigen", - "see_sent_files_this_room": "Allgemeine in diesen Raum gesendete Dateien anzeigen", - "see_sticker_posted_active_room": "Sehen, wenn jemand einen Sticker in deinen aktiven Raum sendet", - "see_sticker_posted_this_room": "Sehe wenn ein Sticker in diesen Raum gesendet wird", - "see_text_messages_sent_active_room": "In deinen aktiven Raum gesendete Textnachrichten anzeigen", - "see_text_messages_sent_this_room": "In diesen Raum gesendete Textnachrichten anzeigen", - "see_topic_change_active_room": "Sehen, wenn sich das Thema im aktuellen Raum ändert", - "see_topic_change_this_room": "Sehen, wenn sich das Thema in diesem Raum ändert", - "see_videos_sent_active_room": "In deinen aktiven Raum gesendete Videos anzeigen", - "see_videos_sent_this_room": "In diesen Raum gesendete Videos anzeigen", - "send_emotes_active_room": "Emojis als du in deinen aktiven Raum senden", - "send_emotes_this_room": "Emojis als du in diesen Raum senden", - "send_event_type_active_room": "Sende %(eventType)s-Ereignisse als du in deinen aktiven Raum", - "send_event_type_this_room": "Sende %(eventType)s-Ereignisse mit deiner Identität in diesen Raum", - "send_files_active_room": "Allgemeine Dateien als du in deinen aktiven Raum senden", - "send_files_this_room": "Allgemeine Dateien als du in diesen Raum senden", - "send_images_active_room": "Sende Bilder in den aktuellen Raum", - "send_images_this_room": "Bilder als du in diesen Raum senden", - "send_messages_active_room": "Eine Nachricht als du in deinen aktiven Raum senden", - "send_messages_this_room": "Nachrichten als du in diesem Raum senden", - "send_msgtype_active_room": "Sende %(msgtype)s Nachrichten als du in deinen aktiven Raum", - "send_msgtype_this_room": "Sende %(msgtype)s Nachrichten als du in diesen Raum", - "send_stickers_active_room": "Sticker in deinen aktiven Raum senden", - "send_stickers_active_room_as_you": "Einen Sticker als du in deinen aktiven Raum senden", - "send_stickers_this_room": "Sticker in diesen Raum senden", - "send_stickers_this_room_as_you": "Einen Sticker in diesen Raum senden", - "send_text_messages_active_room": "Textnachrichten als du in deinen aktiven Raum senden", - "send_text_messages_this_room": "Textnachrichten als du in diesen Raum senden", - "send_videos_active_room": "Videos als du in deinen aktiven Raum senden", - "send_videos_this_room": "Videos als du in diesen Raum senden", + "change_avatar_active_room": "Ändere den Avatar deines aktiven Chats", + "change_avatar_this_room": "Ändere den Avatar dieses Chats", + "change_name_active_room": "Ändere den Namen deines aktiven Chats", + "change_name_this_room": "Ändere den Namen von diesem Chat", + "change_topic_active_room": "Ändere das Thema von deinem aktiven Chat", + "change_topic_this_room": "Ändere das Thema von diesem Chat", + "receive_membership_active_room": "Anzeigen, wenn Nutzer den aktuellen Chat betreten, verlassen oder zu ihm eingeladen werden", + "receive_membership_this_room": "Anzeigen, wenn Nutzer zu diesem Chat eingeladen werden, ihm beitreten oder verlassen", + "remove_ban_invite_leave_active_room": "Entferne, sperre oder lade andere zu deinem aktiven Chat ein und verlasse den Chat selbst", + "remove_ban_invite_leave_this_room": "Entferne, sperre oder lade andere zu diesem Chat ein und verlasse den Chat selbst", + "see_avatar_change_active_room": "Sehen, wenn der Avatar in deinem aktiven Chat geändert wird", + "see_avatar_change_this_room": "Sehen, wenn sich der Avatar des Chats ändert", + "see_event_type_sent_active_room": "In deinen aktiven Chat gesendete %(eventType)s-Ereignisse anzeigen", + "see_event_type_sent_this_room": "In diesen Chat gesendete %(eventType)s-Ereignisse anzeigen", + "see_images_sent_active_room": "Zeige Bilder an, die in deinen aktiven Chat gesendete werden", + "see_images_sent_this_room": "Zeige Bilder an, die in diesen Chat gesendet werden", + "see_messages_sent_active_room": "Zeige Nachrichten an, die in deinen aktiven Chat gesendet werden", + "see_messages_sent_this_room": "Zeige Nachrichten an, die in diesen Chat gesendet werden", + "see_msgtype_sent_active_room": "Zeige %(msgtype)s Nachrichten, die in deinen aktiven Chat gesendet werden", + "see_msgtype_sent_this_room": "Zeige %(msgtype)s Nachrichten, die in diesen Chat gesendet werden", + "see_name_change_active_room": "Zeige, wenn der Name des aktiven Chat sich ändert", + "see_name_change_this_room": "Zeige, wenn der Name sich in diesem Chat ändert", + "see_sent_emotes_active_room": "Zeige Emojis an, die in deinen aktiven Chat gesendet werden", + "see_sent_emotes_this_room": "Zeige Emojis an, die in diesen Chat gesendet werden", + "see_sent_files_active_room": "Zeige allgemeine Dateien an, die in deinen aktiven Chat gesendet werden", + "see_sent_files_this_room": "Zeige allgemeine Dateien an, die in diesen Chat gesendet werden", + "see_sticker_posted_active_room": "Zeige Sticker an, die in deinen aktiven Chat gesendet werden", + "see_sticker_posted_this_room": "Zeige Sticker an, die in diesen Chat gesendet werden", + "see_text_messages_sent_active_room": "Zeige Nachrichten an, die in deinen aktiven Chat gesendet werden", + "see_text_messages_sent_this_room": "Zeige Nachrichten an, die in diesen Chat gesendet werden", + "see_topic_change_active_room": "Zeige das Thema an, wenn es in deinem aktiven Chat geändert wird", + "see_topic_change_this_room": "Zeige das Thema an, wenn es in deinem aktiven Chat geändert wird", + "see_videos_sent_active_room": "Zeige Videos an, wenn sie in deinen aktiven Chat gesendet werden", + "see_videos_sent_this_room": "Zeige Videos an, wenn sie in diesen Chat gesendet werden", + "send_emotes_active_room": "Sende Emojis unter deinem Namen in den aktiven Chat", + "send_emotes_this_room": "Sende Emojis unter deinem Namen in den diesen Chat", + "send_event_type_active_room": "Sende %(eventType)s-Ereignisse unter deinem Namen in deinen aktiven Chat", + "send_event_type_this_room": "Sende %(eventType)s-Ereignisse unter deinem Namen in diesen Chat", + "send_files_active_room": "Sende allgemeine Dateien unter deinem Namen in deinen aktiven Chat", + "send_files_this_room": "Sende allgemeine Dateien unter deinem Namen in diesen Chat", + "send_images_active_room": "Sende Bilder unter deinem Namen in den aktuellen Chat", + "send_images_this_room": "Sende Bilder unter deinem Namen in diesen Chat", + "send_messages_active_room": "Sende Nachrichten unter deinem Namen in deinen aktiven Chat", + "send_messages_this_room": "Sende Nachrichten unter deinem Namen in diesem Chat", + "send_msgtype_active_room": "Sende %(msgtype)s Nachrichten unter deinem Namen in deinen aktiven Chat", + "send_msgtype_this_room": "Sende %(msgtype)s Nachrichten unter deinem Namen in diesen Chat", + "send_stickers_active_room": "Sende Sticker in deinen aktiven Chat", + "send_stickers_active_room_as_you": "Sende Sticker unter deinem Namen in deinen aktiven Chat", + "send_stickers_this_room": "Sende Sticker in diesen Chat", + "send_stickers_this_room_as_you": "Sende Sticker unter deinem Namen in diesen Chat", + "send_text_messages_active_room": "Sende Nachrichten unter deinem Namen in deinen aktiven Chat", + "send_text_messages_this_room": "Sende Nachrichten unter deinem Namen in diesen Chat", + "send_videos_active_room": "Sende Videos unter deinem Namen in deinen aktiven Chat", + "send_videos_this_room": "Sende Videos unter deinem Namen in diesen Chat", "specific_room": "Wie oben, nur zusätzlich in ", - "switch_room": "Ändern, welchen Raum du siehst", - "switch_room_message_user": "Ändere den sichtbaren Raum, Nachricht oder Nutzer" + "switch_room": "Ändere, welchen Chat du siehst", + "switch_room_message_user": "Ändere den sichtbaren Chat, Nachricht oder Nutzer" }, "close_to_view_right_panel": "Widget schließen und in diesem Panel anzeigen", "context_menu": { "delete": "Widget entfernen", - "delete_warning": "Das Löschen des Widgets entfernt es für alle in diesem Raum. Wirklich löschen?", + "delete_warning": "Das Löschen des Widgets entfernt es für alle in diesem Chat. Wirklich löschen?", "move_left": "Nach links schieben", "move_right": "Nach rechts schieben", "remove": "Für alle entfernen", @@ -4102,7 +4179,7 @@ "shared_data_lang": "Deine Sprache", "shared_data_mxid": "Deine Nutzer-ID", "shared_data_name": "Dein Anzeigename", - "shared_data_room_id": "Raum-ID", + "shared_data_room_id": "Chat-ID", "shared_data_theme": "Dein Design", "shared_data_url": "%(brand)s URL", "shared_data_warning": "Wenn du dieses Widget verwendest, können Daten zu %(widgetDomain)s übertragen werden.", @@ -4122,7 +4199,7 @@ "l33t": "Vorhersagbare Ersetzungen wie „@“ anstelle von „a“ helfen nicht besonders", "longerKeyboardPattern": "Nutze ein längeres Tastaturmuster mit mehr Abwechslung", "noNeed": "Kein Bedarf an Symbolen, Zahlen oder Großbuchstaben", - "pwned": "Falls Sie dieses Passwort anderweitig verwenden, sollten Sie es ändern.", + "pwned": "Falls du dieses Passwort anderweitig verwendest, solltest du es ändern.", "recentYears": "Vermeide die letzten Jahre", "repeated": "Vermeide wiederholte Worte und Zeichen", "reverseWords": "Umgedrehte Worte sind nicht schwerer zu erraten", diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index 244fdff842..1c8e2416f9 100644 --- a/src/i18n/strings/el.json +++ b/src/i18n/strings/el.json @@ -523,7 +523,6 @@ "user": "Χρήστης", "user_avatar": "Εικόνα προφίλ", "username": "Όνομα χρήστη", - "verification_cancelled": "Η επαλήθευση ακυρώθηκε", "verified": "Επαληθευμένη", "version": "Έκδοση", "video": "Βίντεο", @@ -811,7 +810,6 @@ "title": "Η Μέθοδος Ανάκτησης Καταργήθηκε", "warning": "Εάν δεν καταργήσατε τη μέθοδο ανάκτησης, ένας εισβολέας μπορεί να προσπαθεί να αποκτήσει πρόσβαση στον λογαριασμό σας. Αλλάξτε τον κωδικό πρόσβασης του λογαριασμού σας και ορίστε μια νέα μέθοδο ανάκτησης αμέσως στις Ρυθμίσεις." }, - "reset_all_button": "Ξεχάσατε ή χάσατε όλες τις μεθόδους ανάκτησης; Επαναφορά όλων", "set_up_toast_title": "Ρυθμίστε το αντίγραφο ασφαλείας", "setup_secure_backup": { "explainer": "Δημιουργήστε αντίγραφα ασφαλείας των κλειδιών σας πριν αποσυνδεθείτε για να μην τα χάσετε." @@ -830,12 +828,8 @@ "after_new_login": { "device_verified": "Η συσκευή επαληθεύτηκε", "skip_verification": "Παράβλεψη επαλήθευσης προς το παρόν", - "unable_to_verify": "Αδυναμία επαλήθευσης αυτής της συσκευής", "verify_this_device": "Επαληθεύστε αυτήν τη συσκευή" }, - "cancelled": "Ακυρώσατε την επαλήθευση.", - "cancelled_self": "Ακυρώσατε την επαλήθευση στην άλλη συσκευή σας.", - "cancelled_user": "%(displayName)s ακύρωσε την επαλύθευση.", "cancelling": "Ακύρωση…", "complete_action": "Κατανοώ", "complete_description": "Επαληθεύσατε με επιτυχία αυτόν τον χρήστη.", @@ -850,45 +844,32 @@ "incoming_sas_dialog_waiting": "Αναμονή επιβεβαίωσης από τον συνεργάτη…", "incoming_sas_user_dialog_text_1": "Επαληθεύστε αυτόν τον χρήστη για να τον επισημάνετε ως αξιόπιστο. Η εμπιστοσύνη των χρηστών σάς προσφέρει επιπλέον ηρεμία όταν χρησιμοποιείτε μηνύματα με κρυπτογράφηση από άκρο σε άκρο.", "incoming_sas_user_dialog_text_2": "Η επαλήθευση αυτού του χρήστη θα επισημάνει τη συνεδρία του ως αξιόπιστη και θα επισημάνει επίσης τη συνεδρία σας ως αξιόπιστη σε αυτόν.", - "no_key_or_device": "Φαίνεται ότι δεν έχετε Κλειδί Ανάκτησης ή άλλες συσκευές με τις οποίες μπορείτε να κάνετε επαλήθευση. Αυτή η συσκευή δεν θα έχει πρόσβαση σε παλιά κρυπτογραφημένα μηνύματα. Για να επαληθεύσετε την ταυτότητά σας σε αυτήν τη συσκευή, θα πρέπει να επαναφέρετε τα κλειδιά επαλήθευσης.", "no_support_qr_emoji": "Η συσκευή που προσπαθείτε να επαληθεύσετε δεν υποστηρίζει τη σάρωση κωδικού QR ή επαλήθευσης emoji, κάτι που υποστηρίζει το %(brand)s. Δοκιμάστε με διαφορετικό πρόγραμμα-πελάτη.", "other_party_cancelled": "Το άλλο μέρος ακύρωσε την επαλήθευση.", "prompt_encrypted": "Επαληθεύστε όλους τους χρήστες σε ένα δωμάτιο για να βεβαιωθείτε ότι είναι ασφαλές.", - "prompt_self": "Ξεκινήστε ξανά την επαλήθευση από την ειδοποίηση.", "prompt_unencrypted": "Σε κρυπτογραφημένα δωμάτια, επαληθεύστε όλους τους χρήστες για να βεβαιωθείτε ότι είναι ασφαλές.", - "prompt_user": "Ξεκινήστε ξανά την επαλήθευση από το προφίλ τους.", "qr_or_sas": "%(qrCode)s ή %(emojiCompare)s", - "qr_or_sas_header": "Επαληθεύστε αυτήν τη συσκευή συμπληρώνοντας ένα από τα παρακάτω:", "qr_prompt": "Σαρώστε αυτόν τον μοναδικό κωδικό", - "qr_reciprocate_same_shield_device": "Σχεδόν έτοιμοι! Εμφανίζεται η ίδια ασπίδα και στην άλλη συσκευή σας;", "qr_reciprocate_same_shield_user": "Σχεδόν έτοιμοι! Εμφανίζεται η ίδια ασπίδα και στον χρήστη %(displayName)s;", - "request_toast_accept": "Επαλήθευση Συνεδρίας", "request_toast_decline_counter": "Παράβλεψη (%(counter)s)", "request_toast_detail": "%(deviceId)s από %(ip)s", - "reset_proceed_prompt": "Προχωρήστε με την επαναφορά", "sas_caption_self": "Επαληθεύστε αυτήν τη συσκευή επιβεβαιώνοντας ότι ο ακόλουθος αριθμός εμφανίζεται στην οθόνη της.", "sas_caption_user": "Επαληθεύστε αυτόν τον χρήστη επιβεβαιώνοντας ότι ο ακόλουθος αριθμός εμφανίζεται στην οθόνη του.", "sas_description": "Συγκρίνετε ένα μοναδικό σύνολο emoji εάν δεν έχετε κάμερα σε καμία από τις δύο συσκευές", - "sas_emoji_caption_self": "Επιβεβαιώστε ότι τα παρακάτω emoji εμφανίζονται και στις δύο συσκευές, με την ίδια σειρά:", "sas_emoji_caption_user": "Επαληθεύστε αυτόν τον χρήστη επιβεβαιώνοντας ότι τα ακόλουθα emoji εμφανίζονται στην οθόνη του.", "sas_match": "Ταιριάζουν", "sas_no_match": "Δεν ταιριάζουν", "sas_prompt": "Συγκρίνετε μοναδικά emoji", "scan_qr": "Επαλήθευση με σάρωση", "scan_qr_explainer": "Ζητήστε από τον χρήστη %(displayName)s να σαρώσει τον κωδικό σας:", - "self_verification_hint": "Για να συνεχίσετε, αποδεχτείτε το αίτημα επαλήθευσης στην άλλη συσκευή σας.", "start_button": "Έναρξη επαλήθευσης", - "successful_device": "Επαληθεύσατε με επιτυχία το %(deviceName)s %(deviceId)s!", - "successful_own_device": "Επαληθεύσατε με επιτυχία τη συσκευή σας!", "successful_user": "Επαληθεύσατε με επιτυχία τον χρήστη %(displayName)s!", - "timed_out": "Η επαλήθευση έληξε.", "unsupported_method": "Δεν είναι δυνατή η εύρεση μιας υποστηριζόμενης μεθόδου επαλήθευσης.", "unverified_session_toast_accept": "Ναι, ήμουν εγώ", "unverified_session_toast_title": "Νέα σύνδεση. Ήσουν εσύ;", "unverified_sessions_toast_description": "Ελέγξτε για να βεβαιωθείτε ότι ο λογαριασμός σας είναι ασφαλής", "unverified_sessions_toast_reject": "Αργότερα", "unverified_sessions_toast_title": "Έχετε μη επαληθευμένες συνεδρίες", - "verification_description": "Επαληθεύστε την ταυτότητά σας για να αποκτήσετε πρόσβαση σε κρυπτογραφημένα μηνύματα και να αποδείξετε την ταυτότητά σας σε άλλους. Εάν χρησιμοποιείτε επίσης κινητή συσκευή, ανοίξτε την εφαρμογή εκεί πριν προχωρήσετε.", "verification_dialog_title_device": "Επαλήθευση άλλης συσκευής", "verification_dialog_title_user": "Αίτημα επαλήθευσης", "verification_skip_warning": "Χωρίς επαλήθευση, δε θα έχετε πρόσβαση σε όλα τα μηνύματά σας και ενδέχεται να φαίνεστε ως αναξιόπιστος στους άλλους.", @@ -898,9 +879,6 @@ "verify_emoji_prompt": "Επαληθεύστε συγκρίνοντας μοναδικά emoji.", "verify_emoji_prompt_qr": "Εάν δεν μπορείτε να σαρώσετε τον παραπάνω κώδικα, επαληθεύστε το συγκρίνοντας μοναδικά emoji.", "verify_later": "Θα επαληθεύσω αργότερα", - "verify_using_device": "Επαλήθευση με άλλη συσκευή", - "verify_using_key": "Επαλήθευση με Κλειδί Ανάκτησης", - "verify_using_key_or_phrase": "Επαλήθευση με Κλειδί ή Φράση Ανάκτησης", "waiting_for_user_accept": "Αναμονή αποδοχής από %(displayName)s…", "waiting_other_device": "Αναμονή για επαλήθευση στην άλλη συσκευή σας…", "waiting_other_device_details": "Αναμονή για επαλήθευση στην άλλη συσκευή σας, %(deviceName)s (%(deviceId)s)…", @@ -1619,8 +1597,6 @@ "room_invite": "Προσκαλέστε μόνο σε αυτό το δωμάτιο", "start_of_dm_history": "Αυτή είναι η αρχή του ιστορικού των άμεσων μηνυμάτων σας με .", "start_of_room": "Αυτή είναι η αρχή του .", - "topic": "Θέμα: %(topic)s ", - "topic_edit": "Θέμα: %(topic)s (επεξεργασία)", "unencrypted_warning": "Η κρυπτογράφηση από άκρο σε άκρο δεν είναι ενεργοποιημένη", "user_created": "%(displayName)s δημιούργησε αυτό το δωμάτιο.", "you_created": "Δημιουργήσατε αυτό το δωμάτιο." @@ -1658,9 +1634,6 @@ "not_found_title": "Αυτό το δωμάτιο ή ο χώρος δεν υπάρχει.", "not_found_title_name": "Το %(roomName)s δεν υπάρχει.", "peek_join_prompt": "Κάνετε προεπισκόπηση στο %(roomName)s. Θέλετε να συμμετάσχετε;", - "pinned_message_banner": { - "go_to_message": "Εμφάνιση καρφιτσωμένου μηνύματος στο χρονολόγιο." - }, "rejoin_button": "Επανασύνδεση", "status_bar": { "delete_all": "Διαγραφή όλων", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 6aa127864c..b4405e2190 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -598,7 +598,6 @@ "user": "User", "user_avatar": "Profile picture", "username": "Username", - "verification_cancelled": "Verification cancelled", "verified": "Verified", "version": "Version", "video": "Video", @@ -654,6 +653,7 @@ "poll_button_no_perms_description": "You do not have permission to start polls in this room.", "poll_button_no_perms_title": "Permission Required", "replying_title": "Replying", + "room_unencrypted": "Messages in this room are not end-to-end encrypted", "room_upgraded_link": "The conversation continues here.", "room_upgraded_notice": "This room has been replaced and is no longer active.", "send_button_title": "Send message", @@ -717,6 +717,7 @@ "personal_space_description": "A private space to organise your rooms", "private_description": "Invite only, best for yourself or teams", "private_heading": "Your private space", + "private_only_heading": "Your space", "private_personal_description": "Make sure the right people have access to %(name)s", "private_personal_heading": "Who are you working with?", "private_space": "Me and my teammates", @@ -967,7 +968,6 @@ "title": "Recovery Method Removed", "warning": "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings." }, - "reset_all_button": "Forgotten or lost all recovery methods? Reset all", "set_up_recovery": "Set up recovery", "set_up_recovery_toast_description": "Generate a recovery key that can be used to restore your encrypted message history in case you lose access to your devices.", "set_up_toast_title": "Set up Secure Backup", @@ -990,16 +990,17 @@ "after_new_login": { "device_verified": "Device verified", "skip_verification": "Skip verification for now", - "unable_to_verify": "Unable to verify this device", "verify_this_device": "Verify this device" }, - "cancelled": "You cancelled verification.", - "cancelled_self": "You cancelled verification on your other device.", - "cancelled_user": "%(displayName)s cancelled verification.", + "cancelled_verification": "Either the request timed out, the request was denied, or there was a verification mismatch.", "cancelling": "Cancelling…", + "cant_confirm": "Can't confirm?", "complete_action": "Got It", "complete_description": "You've successfully verified this user.", "complete_title": "Verified!", + "confirm_identity_description": "Verify this device to set up secure messaging", + "confirm_identity_title": "Confirm your identity", + "confirm_the_emojis": "Confirm that the emojis below match those shown on your other device.", "error_starting_description": "We were unable to start a chat with the other user.", "error_starting_title": "Error starting verification", "explainer": "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.", @@ -1025,58 +1026,57 @@ "text": "Supply the ID and fingerprint of one of your own devices to verify it. NOTE this allows the other device to send and receive messages as you. IF SOMEONE TOLD YOU TO PASTE SOMETHING HERE, IT IS LIKELY YOU ARE BEING SCAMMED!", "wrong_fingerprint": "Unable to verify device '%(deviceId)s' - the supplied fingerprint '%(fingerprint)s' does not match the device fingerprint, '%(fprint)s'" }, - "no_key_or_device": "It looks like you don't have a Recovery Key or any other devices you can verify against. This device will not be able to access old encrypted messages. In order to verify your identity on this device, you'll need to reset your verification keys.", "no_support_qr_emoji": "The device you are trying to verify doesn't support scanning a QR code or emoji verification, which is what %(brand)s supports. Try with a different client.", + "now_you_can": "Now you can read or send messages securely, and anyone you chat with can also trust this device.", + "once_accepted_can_continue": "Once accepted you'll be able to continue with the verification.", "other_party_cancelled": "The other party cancelled the verification.", "prompt_encrypted": "Verify all users in a room to ensure it's secure.", - "prompt_self": "Start verification again from the notification.", "prompt_unencrypted": "In encrypted rooms, verify all users to ensure it's secure.", - "prompt_user": "Start verification again from their profile.", "qr_or_sas": "%(qrCode)s or %(emojiCompare)s", - "qr_or_sas_header": "Verify this device by completing one of the following:", "qr_prompt": "Scan this unique code", - "qr_reciprocate_same_shield_device": "Almost there! Is your other device showing the same shield?", + "qr_reciprocate_check_again_device": "Check again on your other device to finish verification.", + "qr_reciprocate_no": "No, I don't see a green shield", "qr_reciprocate_same_shield_user": "Almost there! Is %(displayName)s showing the same shield?", - "request_toast_accept": "Verify Session", + "qr_reciprocate_yes": "Yes, I see a green shield", "request_toast_accept_user": "Verify User", "request_toast_decline_counter": "Ignore (%(counter)s)", "request_toast_detail": "%(deviceId)s from %(ip)s", - "reset_proceed_prompt": "Proceed with reset", + "request_toast_start_verification": "Start Verification", "sas_caption_self": "Verify this device by confirming the following number appears on its screen.", "sas_caption_user": "Verify this user by confirming the following number appears on their screen.", "sas_description": "Compare a unique set of emoji if you don't have a camera on either device", - "sas_emoji_caption_self": "Confirm the emoji below are displayed on both devices, in the same order:", "sas_emoji_caption_user": "Verify this user by confirming the following emoji appear on their screen.", "sas_match": "They match", "sas_no_match": "They don't match", "sas_prompt": "Compare unique emoji", "scan_qr": "Verify by scanning", "scan_qr_explainer": "Ask %(displayName)s to scan your code:", - "self_verification_hint": "To proceed, please accept the verification request on your other device.", "start_button": "Start Verification", - "successful_device": "You've successfully verified %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "You've successfully verified your device!", "successful_user": "You've successfully verified %(displayName)s!", - "timed_out": "Verification timed out.", "unsupported_method": "Unable to find a supported verification method.", "unverified_session_toast_accept": "Yes, it was me", "unverified_session_toast_title": "New login. Was this you?", "unverified_sessions_toast_description": "Review to ensure your account is safe", "unverified_sessions_toast_reject": "Later", "unverified_sessions_toast_title": "You have unverified sessions", - "verification_description": "Verify your identity to access encrypted messages and prove your identity to others. If you also use a mobile device, please open the app there before you proceed.", + "use_another_device": "Use another device", + "use_recovery_key": "Use recovery key", + "verification_dialog_title_choose": "Choose how to verify", + "verification_dialog_title_compare_emojis": "Compare emojis", + "verification_dialog_title_confirm_green_shield": "Confirm that you see a green shield on your other device", "verification_dialog_title_device": "Verify other device", + "verification_dialog_title_failed": "Verification failed", + "verification_dialog_title_start_on_other_device": "Start verification on the other device", "verification_dialog_title_user": "Verification Request", + "verification_dialog_title_verified": "Device verified", "verification_skip_warning": "Without verifying, you won't have access to all your messages and may appear as untrusted to others.", "verification_success_with_backup": "Your new device is now verified. It has access to your encrypted messages, and other users will see it as trusted.", "verification_success_without_backup": "Your new device is now verified. Other users will see it as trusted.", + "verify_by_completing_one_of": "Verify by completing one of the following:", "verify_emoji": "Verify by emoji", "verify_emoji_prompt": "Verify by comparing unique emoji.", "verify_emoji_prompt_qr": "If you can't scan the code above, verify by comparing unique emoji.", "verify_later": "I'll verify later", - "verify_using_device": "Verify with another device", - "verify_using_key": "Verify with Recovery Key", - "verify_using_key_or_phrase": "Verify with Recovery Key or Phrase", "waiting_for_user_accept": "Waiting for %(displayName)s to accept…", "waiting_other_device": "Waiting for you to verify on your other device…", "waiting_other_device_details": "Waiting for you to verify on your other device, %(deviceName)s (%(deviceId)s)…", @@ -1126,6 +1126,7 @@ "tls": "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.", "unknown": "Unknown error", "unknown_error_code": "unknown error code", + "update_history_visibility": "Failed to change history visibility", "update_power_level": "Failed to change power level" }, "error_app_open_in_another_tab": "Switch to the other tab to connect to %(brand)s. This tab can now be closed.", @@ -1876,11 +1877,6 @@ "other": "You can only pin up to %(count)s widgets" }, "menu": "Open menu", - "release_announcement": { - "close": "Ok", - "description": "Find all pinned messages here. Rollover any message and select “Pin” to add it.", - "title": "All new pinned messages" - }, "reply_thread": "Reply to a thread message", "unpin_all": { "button": "Unpin all messages", @@ -2002,7 +1998,9 @@ "inaccessible_subtitle_1": "Try again later, or ask a room or space admin to check if you have access.", "inaccessible_subtitle_2": "%(errcode)s was returned while trying to access the room or space. If you think you're seeing this message in error, please submit a bug report.", "intro": { + "display_topic": "Topic: ", "dm_caption": "Only the two of you are in this conversation, unless either of you invites anyone to join.", + "edit_topic": "Topic: (edit)", "enable_encryption_prompt": "Enable encryption in settings.", "encrypted_3pid_dm_pending_join": "Once everyone has joined, you’ll be able to chat", "no_avatar_label": "Add a photo, so people can easily spot your room.", @@ -2012,8 +2010,6 @@ "send_message_start_dm": "Send your first message to invite to chat", "start_of_dm_history": "This is the beginning of your direct message history with .", "start_of_room": "This is the start of .", - "topic": "Topic: %(topic)s ", - "topic_edit": "Topic: %(topic)s (edit)", "unencrypted_warning": "End-to-end encryption isn't enabled", "user_created": "%(displayName)s created this room.", "you_created": "You created this room." @@ -2068,8 +2064,9 @@ "pinned_message_banner": { "button_close_list": "Close list", "button_view_all": "View all", - "description": "This room has pinned messages. Click to view them.", - "go_to_message": "View the pinned message in the timeline.", + "description": "Pinned messages", + "go_to_newest_message": "View the pinned message in the timeline and the newest pinned message here", + "go_to_next_message": "View the pinned message in the timeline and the next oldest pinned message here", "title": "%(index)s of %(length)s Pinned messages" }, "read_topic": "Click to read topic", @@ -2130,7 +2127,7 @@ "no_chats": "No chats yet", "no_chats_description": "Get started by messaging someone or by creating a room", "no_chats_description_no_room_rights": "Get started by messaging someone", - "no_favourites": "You don't have favourite chat yet", + "no_favourites": "You don't have favourite chats yet", "no_favourites_description": "You can add a chat to your favourites in the chat settings", "no_invites": "You don't have any unread invites", "no_lowpriority": "You don't have any low priority rooms", @@ -2178,6 +2175,26 @@ "one": "Currently removing messages in %(count)s room", "other": "Currently removing messages in %(count)s rooms" }, + "release_announcement": { + "done": "Done", + "filter": { + "description": "Filter your chats with a single click. Expand to view more filters.", + "title": "New quick filters" + }, + "intro": { + "description": "The chats list has been updated to be more clear and simple to use.", + "title": "Chats has a new look!" + }, + "next": "Next", + "settings": { + "description": "To show or hide message previews, go to All settings > Preferences > Room list", + "title": "Some settings have moved" + }, + "sort": { + "description": "Change the ordering of your chats from most recent to A-Z", + "title": "Sort your chats" + } + }, "room": { "more_options": "More Options", "open_room": "Open room %(roomName)s" @@ -2367,6 +2384,10 @@ "users_default": "Default role" }, "security": { + "cannot_change_to_private_due_to_missing_history_visiblity_permissions": { + "description": "You do not have permissions to alter the history visibility of the room. This is dangerous as it could allow unjoined users to read messages.", + "title": "Cannot make room private" + }, "enable_encryption_confirm_description": "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.", "enable_encryption_confirm_title": "Enable encryption?", "enable_encryption_public_room_confirm_description_1": "It's not recommended to add encryption to public rooms. Anyone can find and join public rooms, so anyone can read messages in them. You'll get none of the benefits of encryption, and you won't be able to turn it off later. Encrypting messages in a public room will make receiving and sending messages slower.", @@ -2384,7 +2405,7 @@ "history_visibility_joined": "Members only (since they joined)", "history_visibility_legend": "Who can read history?", "history_visibility_shared": "Members only (since the point in time of selecting this option)", - "history_visibility_warning": "Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.", + "history_visibility_warning": "The visibility of existing history will not be changed.", "history_visibility_world_readable": "Anyone", "join_rule_description": "Decide who can join %(roomName)s.", "join_rule_invite": "Private (invite only)", @@ -2427,6 +2448,7 @@ "other": "Updating spaces... (%(progress)s out of %(count)s)" }, "join_rule_upgrade_upgrading_room": "Upgrading room", + "join_rule_world_readable_description": "Changing who can join the room will change the visibility of future messages too.", "public_without_alias_warning": "To link to this room, please add an address.", "publish_room": "Make this room visible in the public room directory.", "publish_space": "Make this space visible in the public room directory.", @@ -2565,6 +2587,7 @@ "breadcrumb_second_description": "You will lose any message history that’s stored only on the server", "breadcrumb_third_description": "You will need to verify all your existing devices and contacts again", "breadcrumb_title": "Are you sure you want to reset your identity?", + "breadcrumb_title_cant_confirm": "You need to reset your identity", "breadcrumb_title_forgot": "Forgot your recovery key? You’ll need to reset your identity.", "breadcrumb_title_sync_failed": "Failed to sync key storage. You need to reset your identity.", "breadcrumb_warning": "Only do this if you believe your account has been compromised.", @@ -2641,6 +2664,7 @@ "allow_spellcheck": "Allow spell check", "application_language": "Application language", "application_language_reload_hint": "The app will reload after selecting another language", + "avatar_open_menu": "Open avatar menu", "avatar_remove_progress": "Removing image...", "avatar_save_progress": "Uploading image...", "avatar_upload_error_text": "The file format is not supported or the image is larger than %(size)s.", @@ -2837,6 +2861,10 @@ "rule_suppress_notices": "Messages sent by bot", "rule_tombstone": "When rooms are upgraded", "show_message_desktop_notification": "Show message in desktop notification", + "sounds_release_announcement": { + "description": "Your notification ping and call ringer have been updated—clearer, quicker, and less disruptive", + "title": "We’ve refreshed your sounds" + }, "voip": "Audio and Video calls" }, "preferences": { @@ -3965,6 +3993,7 @@ "connection_lost": "Connectivity to the server has been lost", "connection_lost_description": "You cannot place calls without a connection to the server.", "consulting": "Consulting with %(transferTarget)s. Transfer to %(transferee)s", + "decline_call": "Decline", "default_device": "Default Device", "dial": "Dial", "dialpad": "Dialpad", @@ -4016,6 +4045,7 @@ "show_sidebar_button": "Show sidebar", "silence": "Silence call", "silenced": "Notifications silenced", + "skip_lobby_toggle_option": "Join immediately", "start_screenshare": "Start sharing your screen", "stop_screenshare": "Stop sharing your screen", "too_many_calls": "Too Many Calls", diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 1e2ff5b7ed..16006e0da3 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -436,7 +436,6 @@ "unnamed_space": "Sennoma aro", "user_avatar": "Profilbildo", "username": "Uzantonomo", - "verification_cancelled": "Kontrolo nuliĝis", "view_message": "Montri mesaĝon", "warning": "Averto" }, @@ -633,7 +632,6 @@ "title": "Rehava metodo foriĝis", "warning": "Se vi ne forigis la rehavan metodon, eble atakanto provas aliri vian konton. Vi tuj ŝanĝu la pasvorton de via konto, kaj agordu novan rehavan metodon en la agordoj." }, - "reset_all_button": "Ĉu vi forgesis aŭ perdis ĉiujn manierojn de rehavo? Restarigu ĉion", "set_up_toast_title": "Agordi Sekuran savkopiadon", "setup_secure_backup": { "explainer": "Savkopiu viajn ŝlosilojn antaŭ adiaŭo, por ilin ne perdi." @@ -648,8 +646,6 @@ "unable_to_setup_keys_error": "Ne povas agordi ŝlosilojn", "verification": { "accepting": "Akceptante…", - "cancelled": "Vi nuligis kontrolon.", - "cancelled_user": "%(displayName)s nuligis kontrolon.", "cancelling": "Nuligante…", "complete_action": "Komprenite", "complete_description": "Vi sukcese kontrolis ĉi tiun uzanton.", @@ -663,12 +659,9 @@ "incoming_sas_user_dialog_text_2": "Kontrolo de tiu ĉi uzanto markos ĝian salutaĵon fidata, kaj ankaŭ markos vian salutaĵon fidata por ĝi.", "other_party_cancelled": "La alia kontrolano nuligis la kontrolon.", "prompt_encrypted": "Kontrolu ĉiujn uzantojn en ĉambro por certigi, ke ĝi sekuras.", - "prompt_self": "Rekomencu kontroladon el la sciigo.", - "prompt_user": "Rekomencu kontroladon el ĝia profilo.", "qr_prompt": "Skanu ĉi tiun unikan kodon", "qr_reciprocate_same_shield_user": "Preskaŭ finite! Ĉu %(displayName)s montras la saman ŝildon?", "request_toast_detail": "%(deviceId)s de %(ip)s", - "reset_proceed_prompt": "Procedu por restarigi", "sas_caption_user": "Kontrolu ĉu tiun uzanton per konfirmo, ke la jena numero aperis sur ĝia ekrano.", "sas_description": "Komparu unikan aron de bildsignoj se vi ne havas kameraon sur la alia aparato", "sas_emoji_caption_user": "Kontrolu ĉi tiun uzanton per konfirmo, ke la jenaj bildsignoj aperis sur ĝia ekrano.", @@ -678,17 +671,13 @@ "scan_qr": "Kontroli per skanado", "scan_qr_explainer": "Petu de %(displayName)s skani vian kodon:", "start_button": "Komenci kontrolon", - "successful_device": "Vi sukcese kontrolis %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "Vi sukcese kontrolis vian aparaton!", "successful_user": "Vi sukcese kontrolis uzanton %(displayName)s!", - "timed_out": "Kontrolo atingis tempolimon.", "unsupported_method": "Ne povas trovi subtenatan metodon de kontrolo.", "unverified_session_toast_accept": "Jes, estis mi", "unverified_session_toast_title": "Nova saluto. Ĉu tio estis vi?", "unverified_sessions_toast_description": "Kontrolu por certigi sekurecon de via konto", "unverified_sessions_toast_reject": "Pli poste", "unverified_sessions_toast_title": "Vi havas nekontrolitajn salutaĵojn", - "verification_description": "Kontrolu vian identecon por aliri ĉifritajn mesaĝojn kaj pruvi vian identecon al aliuloj.", "verification_dialog_title_user": "Kontrolpeto", "verification_skip_warning": "Sen kontrolado, vi ne havos aliron al ĉiuj viaj mesaĝoj kaj povas aperi kiel nefidinda al aliaj.", "verification_success_with_backup": "Via nova aparato nun estas kontrolita. Ĝi havas aliron al viaj ĉifritaj mesaĝoj, kaj aliaj vidos ĝin kiel fidinda.", @@ -697,9 +686,6 @@ "verify_emoji_prompt": "Kontrolu per komparo de unikaj bildsignoj.", "verify_emoji_prompt_qr": "Se vi ne povas skani la supran kodon, kontrolu per komparo de unikaj bildsignoj.", "verify_later": "Kontrolu poste", - "verify_using_device": "Kontrolu per alia aparato", - "verify_using_key": "Kontrolu per Sekureca ŝlosilo", - "verify_using_key_or_phrase": "Kontrolu per Sekureca ŝlosilo aŭ frazo", "waiting_for_user_accept": "Atendante akcepton de %(displayName)s…", "waiting_other_user": "Atendas kontrolon de %(displayName)s…" }, @@ -1280,8 +1266,6 @@ "room_invite": "Inviti nur al ĉi tiu ĉambro", "start_of_dm_history": "Jen la komenco de historio de viaj rektaj mesaĝoj kun .", "start_of_room": "Jen la komenco de .", - "topic": "Temo: %(topic)s ", - "topic_edit": "Temo: %(topic)s (redakti)", "unencrypted_warning": "Tutvoja ĉifrado ne estas ŝaltita", "user_created": "%(displayName)s kreis ĉi tiun ĉambron.", "you_created": "Vi kreis ĉi tiun ĉambron." diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index bd4998c1bf..73e0388230 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -503,7 +503,6 @@ "unverified": "Sin verificar", "user_avatar": "Foto de perfil", "username": "Nombre de usuario", - "verification_cancelled": "Verificación cancelada", "verified": "Verificada", "version": "Versión", "video": "Vídeo", @@ -780,7 +779,6 @@ "title": "Método de recuperación eliminado", "warning": "Si no eliminó el método de recuperación, es posible que un atacante esté intentando acceder a su cuenta. Cambie la contraseña de su cuenta y configure un nuevo método de recuperación inmediatamente en Configuración." }, - "reset_all_button": "¿Has olvidado o perdido todos los métodos de recuperación? Restablecer todo", "set_up_toast_title": "Configurar copia de seguridad segura", "setup_secure_backup": { "explainer": "Haz copia de seguridad de tus claves antes de cerrar sesión para evitar perderlas." @@ -799,12 +797,8 @@ "after_new_login": { "device_verified": "Dispositivo verificado", "skip_verification": "Saltar la verificación por ahora", - "unable_to_verify": "No se ha podido verificar el dispositivo", "verify_this_device": "Verificar este dispositivo" }, - "cancelled": "Has cancelado la verificación.", - "cancelled_self": "Has cancelado la verificación en tu otro dispositivo.", - "cancelled_user": "%(displayName)s canceló la verificación.", "cancelling": "Anulando…", "complete_action": "Entendido", "complete_description": "Has verificado correctamente a este usuario.", @@ -819,45 +813,32 @@ "incoming_sas_dialog_waiting": "Esperando a que la otra persona confirme…", "incoming_sas_user_dialog_text_1": "Verifica a este usuario para marcarlo como de confianza. Confiar en usuarios aporta tranquilidad en los mensajes cifrados de extremo a extremo.", "incoming_sas_user_dialog_text_2": "Verificar este usuario marcará su sesión como de confianza, y también marcará tu sesión como de confianza para él.", - "no_key_or_device": "Parece que no tienes una clave de seguridad u otros dispositivos para la verificación. Este dispositivo no podrá acceder los mensajes cifrados antiguos. Para verificar tu identidad en este dispositivo, tendrás que restablecer tus claves de verificación.", "no_support_qr_emoji": "El dispositivo que estás intentando verificar no es compatible con el escaneo de códigos QR o la verificación con emojis, que son las opciones que %(brand)s ofrece. Prueba con otra aplicación distinta.", "other_party_cancelled": "El otro lado canceló la verificación.", "prompt_encrypted": "Verifica a todos los usuarios de una sala para asegurar que es segura.", - "prompt_self": "Inicie la verificación nuevamente a partir de la notificación.", "prompt_unencrypted": "En salas cifradas, verifica a todos los usuarios para asegurarte de que es segura.", - "prompt_user": "Empieza la verificación de nuevo desde su perfil.", "qr_or_sas": "%(qrCode)s o %(emojiCompare)s", - "qr_or_sas_header": "Verifica este dispositivo completando una de las siguientes opciones:", "qr_prompt": "Escanea este código", - "qr_reciprocate_same_shield_device": "¡Ya casi estás! ¿Ves el mismo escudo en el otro dispositivo?", "qr_reciprocate_same_shield_user": "¡Ya casi está! ¿Está %(displayName)s mostrando el mismo escudo?", - "request_toast_accept": "Verificar sesión", "request_toast_decline_counter": "Ignorar (%(counter)s)", "request_toast_detail": "%(deviceId)s desde %(ip)s", - "reset_proceed_prompt": "Continuar y restablecer", "sas_caption_self": "Verifica este dispositivo confirmando que el siguiente número aparece en pantalla.", "sas_caption_user": "Verifica a este usuario confirmando que este número aparece en su pantalla.", "sas_description": "Compara un conjunto de emojis si no tienes cámara en ninguno de los dispositivos", - "sas_emoji_caption_self": "Confirma que los siguientes emojis aparecen en los dos dispositivos y en el mismo orden:", "sas_emoji_caption_user": "Verifica este usuario confirmando que los siguientes emojis aparecen en su pantalla.", "sas_match": "Coinciden", "sas_no_match": "No coinciden", "sas_prompt": "Compara los emojis", "scan_qr": "Verificar mediante escaneo", "scan_qr_explainer": "Pídele a %(displayName)s que escanee tu código:", - "self_verification_hint": "Para continuar, acepta la solicitud de verificación en tu otro dispositivo.", "start_button": "Iniciar verificación", - "successful_device": "Has verificado con éxito %(deviceName)s (%(deviceId)s)", - "successful_own_device": "¡Ha verificado correctamente su dispositivo!", "successful_user": "¡Has verificado con éxito a %(displayName)s!", - "timed_out": "El tiempo máximo para la verificación se ha agotado.", "unsupported_method": "No es posible encontrar un método de verificación soportado.", "unverified_session_toast_accept": "Sí, fui yo", "unverified_session_toast_title": "Nuevo inicio de sesión. ¿Fuiste tú?", "unverified_sessions_toast_description": "Revisa que tu cuenta esté segura", "unverified_sessions_toast_reject": "Más tarde", "unverified_sessions_toast_title": "Tienes sesiones sin verificar", - "verification_description": "Verifica tu identidad para leer tus mensajes cifrados y probar a las demás personas que realmente eres tú.", "verification_dialog_title_device": "Verificar otro dispositivo", "verification_dialog_title_user": "Solicitud de verificación", "verification_skip_warning": "Si decides no verificar, no tendrás acceso a todos tus mensajes y puede que le aparezcas a los demás como «no confiado».", @@ -867,9 +848,6 @@ "verify_emoji_prompt": "Verifica comparando emoji únicos.", "verify_emoji_prompt_qr": "Si no puedes escanear el código de arriba, verifica comparando emoji únicos.", "verify_later": "La verificaré en otro momento", - "verify_using_device": "Verificar con otro dispositivo", - "verify_using_key": "Verificar con una clave de seguridad", - "verify_using_key_or_phrase": "Verificar con una clave o frase de seguridad", "waiting_for_user_accept": "Esperando a que %(displayName)s acepte…", "waiting_other_device": "Esperando a que verifiques en tu otro dispositivo…", "waiting_other_device_details": "Esperando a que verifiques en tu otro dispositivo, %(deviceName)s (%(deviceId)s)…", @@ -1639,8 +1617,6 @@ "send_message_start_dm": "Envía tu primer mensaje para invitar a a la conversación", "start_of_dm_history": "Este es el inicio de tu historial de mensajes directos con .", "start_of_room": "Aquí empieza .", - "topic": "Asunto: %(topic)s ", - "topic_edit": "Asunto: %(topic)s (cambiar)", "unencrypted_warning": "El cifrado de extremo a extremo no está activado", "user_created": "%(displayName)s creó esta sala.", "you_created": "Creaste esta sala." diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 4895d05ebf..936209e140 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -467,7 +467,7 @@ "common": { "access_token": "Pääsuluba", "accessibility": "Ligipääsetavus", - "advanced": "Teave arendajatele", + "advanced": "Lisavõimalused", "all_chats": "Kõik vestlused", "analytics": "Analüütika", "and_n_others": { @@ -598,7 +598,6 @@ "user": "Kasutaja", "user_avatar": "Profiilipilt", "username": "Kasutajanimi", - "verification_cancelled": "Verifitseerimine tühistatud", "verified": "Verifitseeritud", "version": "Versioon", "video": "Video", @@ -654,6 +653,7 @@ "poll_button_no_perms_description": "Sul ei ole õigusi küsitluste korraldamiseks siin jututoas.", "poll_button_no_perms_title": "Vaja on täiendavaid õigusi", "replying_title": "Vastan", + "room_unencrypted": "Selle jututoa sõnumid pole läbivalt krüptitud", "room_upgraded_link": "Vestlus jätkub siin.", "room_upgraded_notice": "See jututuba on asendatud teise jututoaga ning ei ole enam kasutusel.", "send_button_title": "Saada sõnum", @@ -717,6 +717,7 @@ "personal_space_description": "Privaatne kogukonnakeskus jututubade koondamiseks", "private_description": "Liitumine vaid kutse alusel, sobib sulle ja sinu lähematele kaaslastele", "private_heading": "Sinu privaatne kogukonnakeskus", + "private_only_heading": "Sinu kogukond", "private_personal_description": "Palun kontrolli, et vajalikel inimestel oleks ligipääs siia - %(name)s", "private_personal_heading": "Kellega sa koos töötad?", "private_space": "Mina ja minu kaasteelised", @@ -967,7 +968,6 @@ "title": "Taastemeetod on eemaldatud", "warning": "Kui sa ei ole ise taastamise meetodeid eemaldanud, siis võib olla tegemist ründega sinu konto vastu. Palun vaheta koheselt oma kasutajakonto salasõna ning määra seadistustes uus taastemeetod." }, - "reset_all_button": "Unustasid või oled kaotanud kõik võimalused ligipääsu taastamiseks? Lähtesta kõik ühe korraga", "set_up_recovery": "Seadista krüptovõtmete taastamine", "set_up_recovery_toast_description": "Kui peaksid kaotama ligipääsu oma seadmetele, siis siinloodava taastevõtmega saad taastada ligipääsu oma krüptitud sõnumitele.", "set_up_toast_title": "Võta kasutusele turvaline varundus", @@ -990,16 +990,17 @@ "after_new_login": { "device_verified": "Seade on verifitseeritud", "skip_verification": "Jäta verifitseerimine praegu vahele", - "unable_to_verify": "Selle seadme verifitseerimine ei õnnestunud", "verify_this_device": "Verifitseeri see seade" }, - "cancelled": "Sina tühistasid verifitseerimise.", - "cancelled_self": "Sina tühistasid verifitseerimise oma teises seadmes.", - "cancelled_user": "%(displayName)s tühistas verifitseerimise.", + "cancelled_verification": "Kas verifitseerimine aegus, teine osapool keeldus vastamast või tekkis vastuste mittevastavus.", "cancelling": "Tühistan…", + "cant_confirm": "Kas kinnitamine ei õnnestu?", "complete_action": "Selge lugu", "complete_description": "Sa oled edukalt verifitseerinud selle kasutaja.", "complete_title": "Verifitseeritud!", + "confirm_identity_description": "Krüptitud sõnumivahetuse tagamiseks verifitseeri see seade", + "confirm_identity_title": "Kinnita, et see oled sina", + "confirm_the_emojis": "Kinnita, et kõik järgnevalt kuvatud emojid on täpselt samad, mida sa näed oma teises sessioonis.", "error_starting_description": "Meil ei õnnestunud alustada vestlust teise kasutajaga.", "error_starting_title": "Viga verifitseerimise alustamisel", "explainer": "Turvalised sõnumid selle kasutajaga on läbivalt krüptitud ning kolmandad osapooled ei saa neid lugeda.", @@ -1025,58 +1026,57 @@ "text": "Verifitseerimiseks sisesta ühe oma seadme tunnus ja sõrmejälg. Palun arvesta, et see võimaldab muul seadmel saata ja vastu võtta sõnumeid esinedes sinuna. KUI KEEGI PALUS SUL SIIA MIDAGI KOPEERIDA, SIIS ON SEE KAHTLANE JA ILMSELT PROOVITAKSE SIND PETTA!", "wrong_fingerprint": "„%(deviceId)s“ seadme verifitseerimine ei õnnestunud - lisatud sõrmejälg „%(fingerprint)s“ ja seadme sõrmejälg „%(fprint)s“ pole samad" }, - "no_key_or_device": "Tundub, et sul ei ole ei taastevõtit ega muid seadmeid, mida saaksid verifitseerimiseks kasutada. Siin seadmes ei saa lugeda vanu krüptitud sõnumeid. Enda tuvastamiseks selles seadmes pead oma vanad verifitseerimisvõtmed kustutama.", "no_support_qr_emoji": "See seade, mida sa tahad verifitseerida ei toeta QR-koodi ega emoji-põhist verifitseerimist, aga just neid %(brand)s oskab kasutada. Proovi mõne muu Matrix'i kliendiga.", + "now_you_can": "Nüüd saad saata või lugeda sõnumeid turvaliselt ning kõik sinu vestluspartnerid võivad usaldada seda seadet.", + "once_accepted_can_continue": "Kui oled nõustunud, siis saad sa verifitseerimist jätkata.", "other_party_cancelled": "Teine osapool tühistas verifitseerimise.", "prompt_encrypted": "Tagamaks, et jututuba on turvaline, verifitseeri kõik selle kasutajad.", - "prompt_self": "Alusta verifitseerimist uuesti teavitusest.", "prompt_unencrypted": "Krüptitud jututubades turvalisuse tagamiseks verifitseeri kõik kasutajad.", - "prompt_user": "Alusta verifitseerimist uuesti nende profiilist.", "qr_or_sas": "%(qrCode)s või %(emojiCompare)s", - "qr_or_sas_header": "Verifitseeri see seade täites ühe alljärgnevatest:", "qr_prompt": "Skaneeri seda unikaalset koodi", - "qr_reciprocate_same_shield_device": "Peaaegu valmis! Kas sinu teine seade kuvab sama kilpi?", + "qr_reciprocate_check_again_device": "Verifitseerimise lõpuleviimiseks kontrolli uuesti teavet oma teises seadmes.", + "qr_reciprocate_no": "Ei, ma ei näe rohelist kilbi ikooni", "qr_reciprocate_same_shield_user": "Peaaegu valmis! Kas %(displayName)s kuvab sama kilpi?", - "request_toast_accept": "Verifitseeri sessioon", + "qr_reciprocate_yes": "Jah, ma näen rohelist kilbi ikooni", "request_toast_accept_user": "Verifitseeri kasutaja", "request_toast_decline_counter": "Eira (%(counter)s)", "request_toast_detail": "%(deviceId)s ip-aadressil %(ip)s", - "reset_proceed_prompt": "Jätka kustutamisega", + "request_toast_start_verification": "Alusta verifitseerimist", "sas_caption_self": "Verifitseeri see seade tehes kindlaks, et järgnev number kuvatakse tema ekraanil.", "sas_caption_user": "Verifitseeri see kasutaja tehes kindlaks, et järgnev number kuvatakse tema ekraanil.", "sas_description": "Kui sul mõlemas seadmes pole kaamerat, siis võrdle unikaalset emoji'de komplekti", - "sas_emoji_caption_self": "Kontrolli, et allpool näidatud emoji'd on kuvatud mõlemas seadmes samas järjekorras:", "sas_emoji_caption_user": "Verifitseeri see kasutaja tehes kindlaks et järgnev emoji kuvatakse tema ekraanil.", "sas_match": "Nad klapivad", "sas_no_match": "Nad ei klapi", "sas_prompt": "Võrdle unikaalseid emoji'sid", "scan_qr": "Verifitseeri skaneerides", "scan_qr_explainer": "Palu, et %(displayName)s skaneeriks sinu koodi:", - "self_verification_hint": "Jätkamaks palun võta vastu verifitseerimispalve oma teises seadmes.", "start_button": "Alusta verifitseerimist", - "successful_device": "Sa oled edukalt verifitseerinud seadme %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "Sinu seadme verifitseerimine oli edukas!", "successful_user": "Sa oled edukalt verifitseerinud kasutaja %(displayName)s!", - "timed_out": "Verifitseerimine aegus.", "unsupported_method": "Ei suuda leida toetatud verifitseerimismeetodit.", "unverified_session_toast_accept": "Jah, see olin mina", "unverified_session_toast_title": "Uus sisselogimine. Kas see olid sina?", "unverified_sessions_toast_description": "Tagamaks, et su konto on sinu kontrolli all, vaata andmed üle", "unverified_sessions_toast_reject": "Hiljem", "unverified_sessions_toast_title": "Sul on verifitseerimata sessioone", - "verification_description": "Tagamaks ligipääsu oma krüptitud sõnumitele ja tõestamaks oma isikut teistele kasutajatale, verifitseeri end. Kui kasutad mobiilirakendust, siis palun ava see enne jätkamist.", + "use_another_device": "Kasuta mõnda muud seadet", + "use_recovery_key": "Kasuta taastevõtit", + "verification_dialog_title_choose": "Vali verifitseerimise viis", + "verification_dialog_title_compare_emojis": "Võrdle emojisid", + "verification_dialog_title_confirm_green_shield": "Veendu, et näed oma teises seadmes rohelist kilbi ikooni", "verification_dialog_title_device": "Verifitseeri oma teine seade", + "verification_dialog_title_failed": "Verifitseerimine ei õnnestunud", + "verification_dialog_title_start_on_other_device": "Alusta verifitseerimist teises seadmes", "verification_dialog_title_user": "Verifitseerimispäring", + "verification_dialog_title_verified": "Seade on verifitseeritud", "verification_skip_warning": "Ilma verifitseerimiseta sul puudub ligipääs kõikidele oma sõnumitele ning teised ei näe sinu kasutajakontot usaldusväärsena.", "verification_success_with_backup": "Sinu uus seade on nüüd verifitseeritud. Selles seadmes saad lugeda oma krüptitud sõnumeid ja teiste kasutajate jaoks on ta usaldusväärne.", "verification_success_without_backup": "Sinu uus seade on nüüd verifitseeritud. Teiste kasutajate jaoks on ta usaldusväärne.", + "verify_by_completing_one_of": "Verifitseeri, tehes ühe järgmistest toimingutest:", "verify_emoji": "Verifitseeri emoji'de abil", "verify_emoji_prompt": "Verifitseeri unikaalsete emoji'de võrdlemise teel.", "verify_emoji_prompt_qr": "Kui sa ei saa skaneerida eespool kuvatud koodi, siis verifitseeri unikaalsete emoji'de võrdlemise teel.", "verify_later": "Ma verifitseerin hiljem", - "verify_using_device": "Verifitseeri teise seadmega", - "verify_using_key": "Verifitseeri taastevõtmega", - "verify_using_key_or_phrase": "Verifitseeri taastevõtme või -fraasiga", "waiting_for_user_accept": "Ootan, et %(displayName)s nõustuks…", "waiting_other_device": "Ootan, et sa verifitseeriksid oma teises seadmes…", "waiting_other_device_details": "Ootan, et sa verifitseerid oma teises seadmes: %(deviceName)s (%(deviceId)s)…", @@ -1126,6 +1126,7 @@ "tls": "Ei sa ühendust koduserveriga. Palun kontrolli, et sinu koduserveri SSL sertifikaat oleks usaldusväärne ning mõni brauseri lisamoodul ei blokeeri päringuid.", "unknown": "Teadmata viga", "unknown_error_code": "tundmatu veakood", + "update_history_visibility": "Ei õnnestunud muuta ajaloo nähtavust", "update_power_level": "Õiguste muutmine ei õnnestunud" }, "error_app_open_in_another_tab": "%(brand)s'i kasutamiseks ava teine vahekaart. Selle vahekaardi võid kinni panna.", @@ -1366,6 +1367,10 @@ "name_email_mxid_share_space": "Kutsu teist osapoolt tema nime, e-posti aadressi, kasutajanime (nagu ) alusel või jaga seda kogukonnakeskust.", "name_mxid_share_room": "Kutsu kedagi tema nime, kasutajanime (nagu ) alusel või jaga seda jututuba.", "name_mxid_share_space": "Kutsu kedagi tema nime, kasutajanime (nagu ) alusel või jaga seda kogukonnakeskust.", + "progress": { + "dont_close": "Palun ära sulge vaadet enne kui tegevus pole lõppenud.", + "preparing": "Valmistan kutseid ette..." + }, "recents_section": "Hiljutised vestlused", "room_failed_partial": "Teised kasutajad said kutse, kuid allpool toodud kasutajatele ei õnnestunud saata kutset jututuppa", "room_failed_partial_title": "Mõnede kutsete saatmine ei õnnestunud", @@ -1861,7 +1866,7 @@ "extensions_empty_title": "Paranda oma tõhusust lisatarvikute, vidinate, võrgusildade ja robotite lisamise abil", "files_button": "Failid", "pinned_messages": { - "empty_description": "Siia lisamiseks vali sõnumi ning vajuta nuppu „%(pinAction)s“", + "empty_description": "Siia lisamiseks vali sõnum ning vajuta nuppu „%(pinAction)s“", "empty_title": "Et olulisi sõnumeid oleks lihtsam leida, tõsta nad esile", "header": { "one": "1 esiletõstetud sõnum", @@ -1872,11 +1877,6 @@ "other": "Sa saad esile tõsta kuni %(count)s vidinat" }, "menu": "Ava menüü", - "release_announcement": { - "close": "Sobib", - "description": "Leiad kõik esiletõstetud sõnumid siit. Uute sõnumite siia lisamiseks liigu vajaliku sõnumi kohale ja vali „Tõsta esile“.", - "title": "Kõik uued esiletõstetud sõnumid" - }, "reply_thread": "Vasta jutulõngas", "unpin_all": { "button": "Eemalda kõik esiletõstetud sõnumid", @@ -1998,7 +1998,9 @@ "inaccessible_subtitle_1": "Proovi hiljem uuesti või küsi jututoa või kogukonna haldurilt, kas sul on ligipääs olemas.", "inaccessible_subtitle_2": "Astumisel jututuppa või liitumisel kogukonnaga tekkis viga %(errcode)s. Kui sa arvad, et sellise põhjusega viga ei tohiks tekkida, siis palun koosta veateade.", "intro": { + "display_topic": "Teema: ", "dm_caption": "Kuni kumbki teist kolmandaid osapooli liituma ei kutsu, olete siin vestluses vaid teie kahekesi.", + "edit_topic": "Teema: (muuda)", "enable_encryption_prompt": "Võta seadistustes krüptimine kasutusele.", "encrypted_3pid_dm_pending_join": "Te saate vestelda, kui kõik on liitunud", "no_avatar_label": "Selleks, et teised märkaks sinu jututuba lihtsamini, palun lisa üks pilt.", @@ -2008,8 +2010,6 @@ "send_message_start_dm": "Saada oma esimene sõnum kutsudes vestlusesse", "start_of_dm_history": "See on sinu ja kasutaja otsesuhtluse ajaloo algus.", "start_of_room": "See on jututoa algus.", - "topic": "Teema: %(topic)s ", - "topic_edit": "Teema: %(topic)s (muudetud)", "unencrypted_warning": "Läbiv krüptimine pole kasutusel", "user_created": "%(displayName)s lõi selle jututoa.", "you_created": "Sa lõid selle jututoa." @@ -2064,9 +2064,10 @@ "pinned_message_banner": { "button_close_list": "Sulge loend", "button_view_all": "Vaata kõiki", - "description": "Selles jututoas on esiletõstetud sõnumeid. Nende vaatamiseks klõpsi.", - "go_to_message": "Vaata esiletõstetud sõnumit ajajoonel.", - "title": "%(index)s of %(length)s Esiletõstetud sõnumid" + "description": "Esiletõstetud sõnumid", + "go_to_newest_message": "Vaata siin ajajoonel esiletõstetud sõnumit ja viimast esiletõstetud sõnumit", + "go_to_next_message": "Vaata siin ajajoonel esiletõstetud sõnumit ja eelviimast esiletõstetud sõnumit", + "title": "%(index)s / %(length)s esiletõstetud sõnumit" }, "read_topic": "Teema lugemiseks klõpsi", "rejecting": "Hülgan kutset…", @@ -2174,6 +2175,26 @@ "other": "Kustutame sõnumeid %(count)s jututoas", "one": "Kustutame sõnumeid %(count)s jututoas" }, + "release_announcement": { + "done": "Valmis", + "filter": { + "description": "Filtreeri oma vestlusi ühe klõpsuga. Lisafiltrite nägemiseks laienda vaadet.", + "title": "Uued kiirfiltrid" + }, + "intro": { + "description": "Vestluste loend on uuendatud, et see oleks selgem ja hõlpsamini kasutatav.", + "title": "Vestlustel on uus välimus!" + }, + "next": "Edasi", + "settings": { + "description": "Sõnumite eelvaate näitamiseks või peitmiseks ava „Kõik seadistused“ > „Eelistused“ > „Jututubade loend“", + "title": "Mõned seadistused on nüüd uues kohas" + }, + "sort": { + "description": "Vestlusi võid järjestada ajalises või tähestikulises järjekorras", + "title": "Järjesta oma vestlusi" + } + }, "room": { "more_options": "Täiendavad seadistused", "open_room": "Ava jututuba: %(roomName)s" @@ -2363,6 +2384,10 @@ "users_default": "Vaikimisi roll" }, "security": { + "cannot_change_to_private_due_to_missing_history_visiblity_permissions": { + "description": "Sul pole õigusi selle jututoa ajaloo nähtavuse muutmiseks. Kuna võib tekkida olukord, kus ka mitteliitunud kasutajad saavad lugeda sõnumeid, siis on selline tegevus ka ohtlik.", + "title": "Ei õnnestu muuta jututuba privaatseks" + }, "enable_encryption_confirm_description": "Kui kord juba kasutusele võetud, siis krüptimist enam hiljem ära lõpetada ei saa. Krüptitud sõnumeid ei saa lugeda ei vaheapealses veebiliikluses ega serveris ja vaid jututoa liikmed saavad neid lugeda. Krüptimise kasutusele võtmine võib takistada nii robotite kui sõnumisildade tööd. Lisateave krüptimise kohta.", "enable_encryption_confirm_title": "Kas võtame krüptimise kasutusele?", "enable_encryption_public_room_confirm_description_1": "Me ei soovita avalikes jututubades krüptimise kasutamist. Kuna kõik huvilised saavad vabalt leida avalikke jututube ning nendega liituda, siis saavad nad niikuinii ka neis leiduvaid sõnumeid lugeda. Olemuselt puuduvad sellises olukorras krüptimise eelised ning sa ei saa hiljem krüptimist välja lülitada. Avalike jututubade sõnumite krüptimine teeb ka sõnumite saatmise ja vastuvõtmise aeglasemaks.", @@ -2380,7 +2405,7 @@ "history_visibility_joined": "Ainult liikmetele (alates liitumisest)", "history_visibility_legend": "Kes võivad lugeda ajalugu?", "history_visibility_shared": "Ainult liikmetele (alates selle seadistuse kasutuselevõtmisest)", - "history_visibility_warning": "Kui muudad seda, kes saavad selle jututoa ajalugu lugeda, siis kehtib see vaid tulevaste sõnumite kohta. Senise ajaloo nähtavus sellega ei muutu.", + "history_visibility_warning": "Senise ajaloo nähtavus ei muutu.", "history_visibility_world_readable": "Kõik kasutajad", "join_rule_description": "Vali, kes saavad liituda %(roomName)s jututoaga.", "join_rule_invite": "Privaatne jututuba (eeldab kutset)", @@ -2423,6 +2448,7 @@ "other": "Uuendan kogukonnakeskuseid... (%(progress)s / %(count)s)" }, "join_rule_upgrade_upgrading_room": "Uuendan jututoa versiooni", + "join_rule_world_readable_description": "Kui muudad seda, kes võib jututoaga liituda, siis muutub ka tulevaste sõnumite nähtavus.", "public_without_alias_warning": "Sellele jututoale viitamiseks palun lisa talle aadress.", "publish_room": "Tee see jututuba nähtavaks avalikus jututubade kataloogis.", "publish_space": "Tee see kogukond nähtavaks avalikus jututubade kataloogis.", @@ -2561,6 +2587,7 @@ "breadcrumb_second_description": "Sa kaotad ligipääsu sõnumite ajalooole, mis on salvestatud vaid serveris", "breadcrumb_third_description": "Sa pead kõik oma olemasolevad seadmed ja kontaktid uuesti verifitseerima", "breadcrumb_title": "Kas sa oled kindel, et soovid oma krüptoidentiteeti lähtestada?", + "breadcrumb_title_cant_confirm": "Sa pead oma võrguidentiteedi lähtestama", "breadcrumb_title_forgot": "Kas unustasid oma taastevõtme? Pead oma identiteedi lähtestama.", "breadcrumb_title_sync_failed": "Võtmehoidla sünkroniseerimine ei õnnestunud. Sa pead võrguidentiteedi lähtestama.", "breadcrumb_warning": "Tee seda ainult siis, kui arvad, et sinu kasutajakonto võib olla ohustatud kolmandate osapoolet poolt.", @@ -2833,6 +2860,10 @@ "rule_suppress_notices": "Robotite saadetud sõnumid", "rule_tombstone": "Kui jututubasid uuendatakse", "show_message_desktop_notification": "Näita sõnumit töölauakeskkonnale omases teavituses", + "sounds_release_announcement": { + "description": "Sinu teavituste märguanne ja kõnehelin on uuendatud - selgemad, kiiremad ja vähem häirivad", + "title": "Oleme sinu helisid värskendanud" + }, "voip": "Kõned ja videokõned" }, "preferences": { @@ -3085,7 +3116,7 @@ "ban": "Keela ligipääs antud tunnusega kasutajale", "category_actions": "Tegevused", "category_admin": "Peakasutaja", - "category_advanced": "Teave arendajatele", + "category_advanced": "Lisavõimalused", "category_effects": "Vahvad täiendused", "category_messages": "Sõnumid", "category_other": "Muud", @@ -3508,7 +3539,7 @@ "unknown": "%(senderDisplayName)s muutis külaliste ligipääsureeglid alljärgnevaks - %(rule)s" }, "m.room.history_visibility": { - "invited": "%(senderName)s määras, et jututoa tulevane ajalugu on nähtav kõikidele selle liikmetele nende kutsumise hetkest.", + "invited": "%(senderName)s määras, et jututoa ajalugu on nähtav kõikidele selle liikmetele nende kutsumise hetkest.", "joined": "%(senderName)s määras, et jututoa tulevane ajalugu on nähtav kõikidele selle liikmetele nende liitumise hetkest.", "shared": "%(senderName)s määras, et jututoa tulevane ajalugu on nähtav kõikidele selle liikmetele.", "unknown": "%(senderName)s seadistas, et jututoa tulevase ajaloo nähtavuse olek on (%(visibility)s).", @@ -3553,12 +3584,12 @@ "set": "%(senderDisplayName)s muutis jututoa nimeks %(roomName)s." }, "m.room.pinned_events": { - "changed": "%(senderName)s muutis selle jututoa klammerdatud sõnumeid.", - "changed_link": "%(senderName)s muutis selle jututoa klammerdatud sõnumeid.", - "pinned": "%(senderName)s klammerdas siin jututoas ühe sõnumi. Vaata kõiki klammerdatud sõnumeid.", - "pinned_link": "%(senderName)s klammerdas siin jututoas ühe sõnumi. Vaata kõiki klammerdatud sõnumeid.", - "unpinned": "%(senderName)s eemaldas siin jututoas klammerduse ühelt sõnumilt. Vaata kõiki klammerdatud sõnumeid.", - "unpinned_link": "%(senderName)s eemaldas siin jututoas klammerduse ühelt sõnumilt. Vaata kõiki klammerdatud sõnumeid." + "changed": "%(senderName)s muutis selle jututoa esiletõstetud sõnumeid.", + "changed_link": "%(senderName)s muutis selle jututoa esiletõstetud sõnumeid.", + "pinned": "%(senderName)s tõstis siin jututoas ühe sõnumi esile. Vaata kõiki esiletõstetud sõnumeid.", + "pinned_link": "%(senderName)s tõstis siin jututoas ühe sõnumi esile. Vaata kõiki esiletõstetud sõnumeid.", + "unpinned": "%(senderName)s eemaldas siin jututoas esiletõstmise ühelt sõnumilt. Vaata kõiki esiletõstetud sõnumeid.", + "unpinned_link": "%(senderName)s eemaldas siin jututoas esiletõstmise ühelt sõnumilt. Vaata kõiki esiletõstetud sõnumeid." }, "m.room.power_levels": { "changed": "%(senderName)s muutis õiguseid: %(powerLevelDiffText)s.", @@ -3961,6 +3992,7 @@ "connection_lost": "Ühendus sinu serveriga on katkenud", "connection_lost_description": "Kui ühendus sinu serveriga on katkenud, siis sa ei saa helistada.", "consulting": "Suhtlen teise osapoolega %(transferTarget)s. Saadan andmeid kasutajale %(transferee)s", + "decline_call": "Keeldu", "default_device": "Vaikimisi seade", "dial": "Helista", "dialpad": "Numbriklahvistik", @@ -4012,6 +4044,7 @@ "show_sidebar_button": "Näita külgpaani", "silence": "Vaigista kõne", "silenced": "Teavitused on summutatud", + "skip_lobby_toggle_option": "Liitu kohe", "start_screenshare": "Alusta oma seadme ekraani jagamist", "stop_screenshare": "Lõpeta oma seadme ekraani jagamine", "too_many_calls": "Liiga palju kõnesid", diff --git a/src/i18n/strings/fa.json b/src/i18n/strings/fa.json index 17d00edf10..dbfec0590b 100644 --- a/src/i18n/strings/fa.json +++ b/src/i18n/strings/fa.json @@ -418,7 +418,6 @@ "user": "کاربر", "user_avatar": "تصویر پروفایل", "username": "نام کاربری", - "verification_cancelled": "تأیید هویت لغو شد", "video": "ویدئو", "view_message": "مشاهده پیام", "warning": "هشدار" @@ -593,7 +592,6 @@ "title": "روش بازیابی حذف شد", "warning": "اگر متد بازیابی را حذف نکرده‌اید، ممکن است حمله‌کننده‌ای سعی در دسترسی به حساب‌کاربری شما داشته باشد. گذرواژه حساب کاربری خود را تغییر داده و فورا یک روش بازیابی را از بخش تنظیمات خود تنظیم کنید." }, - "reset_all_button": "همه روش‌های بازیابی را فراموش کرده یا از دست داده‌اید؟ بازراه‌اندازی (reset) همه", "set_up_toast_title": "پشتیبان‌گیری امن را انجام دهید", "setup_secure_backup": { "explainer": "پیش از خروج از حساب کاربری، از کلید‌های خود پشتیبان بگیرید تا آن‌ها را از دست ندهید." @@ -608,8 +606,6 @@ "unable_to_setup_keys_error": "تنظیم کلیدها امکان پذیر نیست", "verification": { "accepting": "پذیرش…", - "cancelled": "شما تأیید هویت را لغو کردید.", - "cancelled_user": "%(displayName)s تایید هویت را لغو کرد.", "cancelling": "در حال لغو…", "complete_action": "متوجه شدم", "complete_description": "شما با موفقیت این کاربر را تائید کردید.", @@ -623,8 +619,6 @@ "incoming_sas_user_dialog_text_2": "با تأیید این کاربر ، نشست وی به عنوان مورد اعتماد علامت‌گذاری شده و همچنین نشست شما به عنوان مورد اعتماد برای وی علامت‌گذاری خواهد شد.", "other_party_cancelled": "طرف مقابل فرآیند تائید را لغو کرد.", "prompt_encrypted": "برای اطمینان از امنیت اتاق، هویت همه‌ی کاربران حاضر در اتاق را تأیید کنید.", - "prompt_self": "از اعلان دوباره تأیید را شروع کنید.", - "prompt_user": "دوباره تأیید را از نمایه آنها شروع کنید.", "qr_prompt": "این QR-code منحصر به فرد را اسکن کنید", "qr_reciprocate_same_shield_user": "تقریباً تمام شد! آیا %(displayName)s نیز سپر مشابهی را نشان می‌دهد؟", "request_toast_detail": "%(deviceId)s از %(ip)s", @@ -637,15 +631,11 @@ "scan_qr": "با اسکن تأیید کنید", "scan_qr_explainer": "از %(displayName)s بخواهید که کد شما را اسکن کند:", "start_button": "شروع تایید هویت", - "successful_device": "شما با موفقیت %(deviceName)s (%(deviceId)s) را تأیید کردید!", - "successful_own_device": "شما با موفقیت دستگاه خود را تأیید کردید!", "successful_user": "شما%(displayName)s را با موفقیت تأیید کردید!", - "timed_out": "مهلت تأیید تمام شد.", "unsupported_method": "روش پشتیبانی‌شده‌ای برای تائید پیدا نشد.", "unverified_session_toast_title": "ورود جدید. آیا شما بودید؟", "unverified_sessions_toast_description": "برای کسب اطمینان از امن‌بودن حساب کاربری خود، لطفا بررسی فرمائید", "unverified_sessions_toast_reject": "بعداً", - "verification_description": "با تائید هویت خود به پیام‌های رمزشده دسترسی یافته و هویت خود را به دیگران ثابت می‌کنید.", "verification_dialog_title_user": "درخواست تأیید", "verify_emoji": "تأیید توسط شکلک", "verify_emoji_prompt": "با مقایسه شکلک تأیید کنید.", @@ -1163,8 +1153,6 @@ "room_invite": "فقط به این اتاق دعوت کنید", "start_of_dm_history": "این ابتدای تاریخچه پیام مستقیم شما با است.", "start_of_room": "این شروع است.", - "topic": "موضوع: %(topic)s ", - "topic_edit": "موضوع: %(topic)s (ویرایش)", "user_created": "%(displayName)s این اتاق را ایجاد کرده است.", "you_created": "شما این اتاق را ایجاد کردید." }, diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index aa833c239b..51bb9c7c73 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -562,7 +562,6 @@ "user": "Käyttäjä", "user_avatar": "Profiilikuva", "username": "Käyttäjätunnus", - "verification_cancelled": "Varmennus peruutettu", "verified": "Vahvistettu", "version": "Versio", "video": "Video", @@ -826,7 +825,6 @@ "title": "Palautustapa poistettu", "warning": "Jos et poistanut palautustapaa, hyökkääjä saattaa yrittää käyttää tiliäsi. Vaihda tilisi salasana ja aseta uusi palautustapa asetuksissa välittömästi." }, - "reset_all_button": "Unohtanut tai kadottanut kaikki palautustavat? Nollaa kaikki", "set_up_recovery": "Määritä palautus", "set_up_recovery_toast_description": "Luo palautusavain, jota voit käyttää salatun viestihistorian palauttamiseen, jos menetät pääsyn laitteisiisi.", "set_up_toast_title": "Määritä turvallinen varmuuskopio", @@ -846,11 +844,8 @@ "after_new_login": { "device_verified": "Laite vahvistettu", "skip_verification": "Ohita vahvistus toistaiseksi", - "unable_to_verify": "Tätä laitetta ei voitu vahvistaa", "verify_this_device": "Vahvista tämä laite" }, - "cancelled": "Peruutit varmennuksen.", - "cancelled_user": "%(displayName)s peruutti varmennuksen.", "cancelling": "Peruutetaan…", "complete_action": "Ymmärretty", "complete_description": "Olet varmentanut tämän käyttäjän.", @@ -864,33 +859,23 @@ "incoming_sas_user_dialog_text_2": "Tämän käyttäjän varmentaminen merkitsee hänen istuntonsa luotetuksi, ja myös merkkaa sinun istuntosi luotetuksi hänen laitteissaan.", "other_party_cancelled": "Toinen osapuoli perui varmennuksen.", "prompt_encrypted": "Varmenna kaikki huoneen käyttäjät varmistaaksesi, että se on turvallinen.", - "prompt_self": "Aloita varmennus uudelleen ilmoituksesta.", - "prompt_user": "Aloita varmennus uudelleen hänen profiilista.", "qr_or_sas": "%(qrCode)s tai %(emojiCompare)s", - "qr_or_sas_header": "Vahvista tämä laite suorittamalla yksi seuraavista:", "qr_prompt": "Skannaa tämä uniikki koodi", - "qr_reciprocate_same_shield_device": "Melkein valmista! Näyttääkö toinen laitteesi saman kilven?", "qr_reciprocate_same_shield_user": "Melkein valmista! Näyttääkö %(displayName)s saman kilven?", - "request_toast_accept": "Vahvista istunto", "request_toast_accept_user": "Vahvista käyttäjä", "request_toast_decline_counter": "Sivuuta (%(counter)s)", "request_toast_detail": "%(deviceId)s osoitteesta %(ip)s", "sas_caption_self": "Vahvista tämä laite toteamalla, että seuraava numero näkyy sen näytöllä.", "sas_caption_user": "Varmenna tämä käyttäjä varmistamalla, että seuraava luku ilmestyy hänen ruudulleen.", "sas_description": "Vertaa kokoelmaa uniikkeja emojeja, jos kummassakaan laitteessa ei ole kameraa", - "sas_emoji_caption_self": "Varmista, että alla olevat emojit näkyvät molemmilla laitteilla samassa järjestyksessä:", "sas_emoji_caption_user": "Varmenna tämä käyttäjä varmistamalla, että seuraava emoji ilmestyy hänen ruudulleen.", "sas_match": "Ne täsmäävät", "sas_no_match": "Ne eivät täsmää", "sas_prompt": "Vertaa uniikkia emojia", "scan_qr": "Varmenna skannaamalla", "scan_qr_explainer": "Pyydä käyttäjää %(displayName)s lukemaan koodisi:", - "self_verification_hint": "Jatka hyväksymällä vahvistuspyyntö toisella laitteella.", "start_button": "Aloita varmennus", - "successful_device": "Olet onnistuneesti varmentanut laitteen %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "Olet onnistuneesti varmentanut laitteesi!", "successful_user": "Olet varmentanut käyttäjän %(displayName)s!", - "timed_out": "Varmennuksessa kesti liikaa.", "unsupported_method": "Tuettua varmennustapaa ei löydy.", "unverified_session_toast_accept": "Kyllä, se olin minä", "unverified_session_toast_title": "Uusi sisäänkirjautuminen. Olitko se sinä?", @@ -905,9 +890,6 @@ "verify_emoji_prompt": "Varmenna vertaamalla uniikkia emojia.", "verify_emoji_prompt_qr": "Jos et pysty skannaamaan yläpuolella olevaa koodia, varmenna vertaamalla emojia.", "verify_later": "Vahvistan myöhemmin", - "verify_using_device": "Vahvista toisella laitteella", - "verify_using_key": "Vahvista palautusavaimella", - "verify_using_key_or_phrase": "Vahvista turva-avaimella tai turvalauseella", "waiting_for_user_accept": "Odotetaan, että %(displayName)s hyväksyy…", "waiting_other_device": "Odotetaan vahvistustasi toiselta laitteelta…", "waiting_other_device_details": "Odotetaan vahvistustasi toiselta laitteelta, %(deviceName)s (%(deviceId)s)…", @@ -1582,11 +1564,6 @@ "other": "Voit kiinnittää enintään %(count)s sovelmaa" }, "menu": "Avaa valikko", - "release_announcement": { - "close": "OK", - "description": "Kiinnitetyt viestit löytyvät täältä. Mene minkä tahansa viestin päälle ja valitse \"Kiinnitä\" lisätäksesi viestin tänne.", - "title": "Kiinnitetyt viestit" - }, "unpin_all": { "button": "Poista kaikkien viestien kiinnitys", "title": "Poistetaanko kaikkien viestien kiinnitys?" @@ -1697,8 +1674,6 @@ "send_message_start_dm": "Kutsu keskusteluun kirjoittamalla ensimmäinen viesti", "start_of_dm_history": "Tästä alkaa yksityisviestihistoriasi käyttäjän kanssa.", "start_of_room": "Tästä alkaa .", - "topic": "Aihe: %(topic)s ", - "topic_edit": "Aihe: %(topic)s (muokkaa)", "unencrypted_warning": "Päästä päähän -salaus ei ole käytössä", "user_created": "%(displayName)s loi tämän huoneen.", "you_created": "Loit tämän huoneen." @@ -1749,7 +1724,6 @@ "pinned_message_banner": { "button_view_all": "Näytä kaikki", "description": "Tässä huoneessa on kiinnitettyjä viestejä. Napsauta nähdäksesi ne.", - "go_to_message": "Näytä kiinnitetty viesti aikajanalla.", "title": "%(index)s/%(length)s kiinnitettyä viestiä" }, "read_topic": "Lue aihe napsauttamalla", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index bdaac9dc69..06af8550f0 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -598,7 +598,6 @@ "user": "Utilisateur", "user_avatar": "Image de profil", "username": "Nom d’utilisateur", - "verification_cancelled": "Vérification annulée", "verified": "Vérifiée", "version": "Version", "video": "Vidéo", @@ -654,6 +653,7 @@ "poll_button_no_perms_description": "Vous n’avez pas la permission de démarrer un sondage dans ce salon.", "poll_button_no_perms_title": "Autorisation requise", "replying_title": "Répond", + "room_unencrypted": "Les messages dans ce salon ne sont pas chiffrés de bout en bout", "room_upgraded_link": "La discussion continue ici.", "room_upgraded_notice": "Ce salon a été remplacé et n’est plus actif.", "send_button_title": "Envoyer le message", @@ -717,6 +717,7 @@ "personal_space_description": "Un espace privé pour organiser vos salons", "private_description": "Sur invitation, idéal pour vous-même ou les équipes", "private_heading": "Votre espace privé", + "private_only_heading": "Votre Espace", "private_personal_description": "Assurez-vous que les bonnes personnes aient accès à %(name)s", "private_personal_heading": "Avec qui travaillez-vous ?", "private_space": "Moi et mon équipe", @@ -967,7 +968,6 @@ "title": "Méthode de récupération supprimée", "warning": "Si vous n’avez pas supprimé la méthode de récupération, un attaquant peut être en train d’essayer d’accéder à votre compte. Modifiez le mot de passe de votre compte et configurez une nouvelle méthode de récupération dans les réglages." }, - "reset_all_button": "Vous avez perdu ou oublié tous vos moyens de récupération ? Tout réinitialiser", "set_up_recovery": "Configurer la récupération", "set_up_recovery_toast_description": "Générez une clé de récupération qui peut être utilisée pour restaurer l'historique de vos messages chiffrés au cas où vous perdriez l'accès à vos appareils.", "set_up_toast_title": "Configurer la sauvegarde sécurisée", @@ -990,16 +990,17 @@ "after_new_login": { "device_verified": "Appareil vérifié", "skip_verification": "Ignorer la vérification pour l’instant", - "unable_to_verify": "Impossible de vérifier cet appareil", "verify_this_device": "Vérifier cet appareil" }, - "cancelled": "Vous avez annulé la vérification.", - "cancelled_self": "Vous avez annulé la vérification dans votre autre appareil.", - "cancelled_user": "%(displayName)s a annulé la vérification.", + "cancelled_verification": "Soit la demande a expiré, soit elle a été refusée, soit la vérification ne correspondait pas.", "cancelling": "Annulation…", + "cant_confirm": "Confirmation impossible ?", "complete_action": "Compris", "complete_description": "Vous avez vérifié cet utilisateur avec succès.", "complete_title": "Vérifié !", + "confirm_identity_description": "Vérifier cet appareil pour configurer votre messagerie sécurisée", + "confirm_identity_title": "Confirmez votre identité", + "confirm_the_emojis": "Confirmez que les émojis ci-dessous correspondent à ceux affichés sur votre autre appareil.", "error_starting_description": "Nous n’avons pas pu démarrer une conversation avec l’autre utilisateur.", "error_starting_title": "Erreur en démarrant la vérification", "explainer": "Les messages sécurisés avec cet utilisateur sont chiffrés de bout en bout et ne peuvent être lus par d’autres personnes.", @@ -1025,58 +1026,57 @@ "text": "Fournissez l'identifiant et l'empreinte numétrique de l'un de vos appareils pour le vérifier. REMARQUE : cela permet à l'autre appareil d'envoyer et de recevoir des messages comme vous. SI QUELQU'UN VOUS A DIT DE COLLER QUELQUE CHOSE ICI, IL EST PROBABLE QUE VOUS SOYEZ VICTIME D'UNE ARNAQUE !", "wrong_fingerprint": "Impossible de vérifier l'appareil %(deviceId)s - l'empreinte numérique %(fingerprint)s fournie ne correspond pas à celle de l'appareil %(fprint)s" }, - "no_key_or_device": "Il semblerait que vous ne disposiez pas de clé de récupération ou d’autres appareils pour réalisation la vérification. Cet appareil ne pourra pas accéder aux anciens messages chiffrés. Afin de vérifier votre identité sur cet appareil, vous devrez réinitialiser vos clés de vérifications.", "no_support_qr_emoji": "L’appareil que vous essayez de vérifier ne prend pas en charge les QR codes ou la vérification d’émojis, qui sont les méthodes prises en charge par %(brand)s. Essayez avec un autre client.", + "now_you_can": "Vous pouvez désormais lire ou envoyer des messages en toute sécurité, et toute personne avec qui vous discutez peut également faire confiance à cet appareil.", + "once_accepted_can_continue": "Une fois acceptée, vous pourrez poursuivre la vérification.", "other_party_cancelled": "L’autre personne a annulé la vérification.", "prompt_encrypted": "Vérifiez tous les utilisateurs d’un salon pour vous assurer qu’il est sécurisé.", - "prompt_self": "Recommencer la vérification depuis la notification.", "prompt_unencrypted": "Dans les salons chiffrés, vérifiez tous les utilisateurs pour vous assurer qu’il est sécurisé.", - "prompt_user": "Recommencer la vérification depuis son profil.", "qr_or_sas": "%(qrCode)s ou %(emojiCompare)s", - "qr_or_sas_header": "Vérifiez cet appareil en réalisant une des actions suivantes :", "qr_prompt": "Scannez ce code unique", - "qr_reciprocate_same_shield_device": "On y est presque ! Votre autre appareil affiche-t-il le même bouclier ?", + "qr_reciprocate_check_again_device": "Vérifier à nouveau sur votre autre appareil pour terminer la vérification.", + "qr_reciprocate_no": "Non, je ne vois pas de bouclier vert", "qr_reciprocate_same_shield_user": "On y est presque ! Est-ce que %(displayName)s affiche le même bouclier ?", - "request_toast_accept": "Vérifier la session", + "qr_reciprocate_yes": "Oui, je vois un bouclier vert", "request_toast_accept_user": "Vérifier l'utilisateur", "request_toast_decline_counter": "Ignorer (%(counter)s)", "request_toast_detail": "%(deviceId)s depuis %(ip)s", - "reset_proceed_prompt": "Faire la réinitialisation", + "request_toast_start_verification": "Commencer la vérification", "sas_caption_self": "Vérifiez cet appareil en confirmant que le nombre suivant s’affiche sur son écran.", "sas_caption_user": "Vérifier cet utilisateur en confirmant que le nombre suivant apparaît sur leur écran.", "sas_description": "Comparez une liste unique d’émojis si vous n’avez d’appareil photo sur aucun des deux appareils", - "sas_emoji_caption_self": "Confirmez que les émojis ci-dessous s’affichent sur les deux appareils et dans le même ordre :", "sas_emoji_caption_user": "Vérifier cet utilisateur en confirmant que les émojis suivant apparaissent sur son écran.", "sas_match": "Ils correspondent", "sas_no_match": "Ils ne correspondent pas", "sas_prompt": "Comparez des émojis uniques", "scan_qr": "Vérifier en scannant", "scan_qr_explainer": "Demandez à %(displayName)s de scanner votre code :", - "self_verification_hint": "Pour continuer, veuillez accepter la demande de vérification sur votre autre appareil.", "start_button": "Commencer la vérification", - "successful_device": "Vous avez bien vérifié %(deviceName)s (%(deviceId)s) !", - "successful_own_device": "Vous avez bien vérifié votre appareil !", "successful_user": "Vous avez vérifié %(displayName)s !", - "timed_out": "La vérification a expiré.", "unsupported_method": "Impossible de trouver une méthode de vérification prise en charge.", "unverified_session_toast_accept": "Oui, c’était moi", "unverified_session_toast_title": "Nouvelle connexion. Était-ce vous ?", "unverified_sessions_toast_description": "Vérifiez pour assurer la sécurité de votre compte", "unverified_sessions_toast_reject": "Plus tard", "unverified_sessions_toast_title": "Vous avez des sessions non vérifiées", - "verification_description": "Vérifiez votre identité pour accéder aux messages chiffrés et prouver votre identité aux autres. Si vous utilisez également un appareil mobile, veuillez ouvrir l’application avant de continuer.", + "use_another_device": "Utiliser un autre appareil", + "use_recovery_key": "Utiliser la clé de récupération", + "verification_dialog_title_choose": "Choisissez comment vérifier", + "verification_dialog_title_compare_emojis": "Comparez les émojis", + "verification_dialog_title_confirm_green_shield": "Confirmez que vous voyez un bouclier vert sur votre autre appareil", "verification_dialog_title_device": "Vérifier un autre appareil", + "verification_dialog_title_failed": "Échec de la vérification", + "verification_dialog_title_start_on_other_device": "Démarrer la vérification sur l’autre appareil", "verification_dialog_title_user": "Demande de vérification", + "verification_dialog_title_verified": "Appareil vérifié", "verification_skip_warning": "Sans vérification, vous n’aurez pas accès à tous vos messages et vous n’apparaîtrez pas comme de confiance aux autres.", "verification_success_with_backup": "Votre nouvel appareil est maintenant vérifié. Il a accès à vos messages chiffrés et les autre utilisateurs le verront comme fiable.", "verification_success_without_backup": "Votre nouvel appareil est maintenant vérifié. Les autres utilisateurs le verront comme fiable.", + "verify_by_completing_one_of": "Vérifiez en complétant l'une des actions suivantes :", "verify_emoji": "Vérifier avec des émojis", "verify_emoji_prompt": "Vérifier en comparant des émojis uniques.", "verify_emoji_prompt_qr": "Si vous ne pouvez pas scanner le code ci-dessus, vérifiez en comparant des émojis uniques.", "verify_later": "Je ferai la vérification plus tard", - "verify_using_device": "Vérifier avec un autre appareil", - "verify_using_key": "Vérifier avec la clé de récupération", - "verify_using_key_or_phrase": "Vérifier avec une clé de récupération ou une phrase", "waiting_for_user_accept": "En attente d’acceptation par %(displayName)s…", "waiting_other_device": "En attente de votre vérification sur votre autre appareil…", "waiting_other_device_details": "En attente de votre vérification sur votre autre appareil, %(deviceName)s (%(deviceId)s)…", @@ -1126,6 +1126,7 @@ "tls": "Impossible de se connecter au serveur d’accueil - veuillez vérifier votre connexion, assurez-vous que le certificat SSL de votre serveur d’accueil est un certificat de confiance, et qu’aucune extension du navigateur ne bloque les requêtes.", "unknown": "Erreur inconnue", "unknown_error_code": "code d’erreur inconnu", + "update_history_visibility": "Echec lors de la modification de la visibilité de l'historique", "update_power_level": "Échec du changement de rang" }, "error_app_open_in_another_tab": "Vous pouvez fermer cet onglet déconnecté, et aller à l'autre onglet %(brand)s.", @@ -1366,6 +1367,10 @@ "name_email_mxid_share_space": "Invitez quelqu’un grâce à son nom, adresse e-mail, nom d’utilisateur (tel que ) ou partagez cet espace.", "name_mxid_share_room": "Invitez quelqu’un à partir de son nom, pseudo (comme ) ou partagez ce salon.", "name_mxid_share_space": "Invitez quelqu’un grâce à son nom, nom d’utilisateur (tel que ) ou partagez cet espace.", + "progress": { + "dont_close": "Ne fermez pas l\"application tant que l'opération est en cours", + "preparing": "Préparation des invitations..." + }, "recents_section": "Conversations récentes", "room_failed_partial": "Nous avons envoyé les invitations, mais les personnes ci-dessous n’ont pas pu être invitées à rejoindre ", "room_failed_partial_title": "Certaines invitations n’ont pas pu être envoyées", @@ -1871,11 +1876,6 @@ "other": "Vous ne pouvez épingler que jusqu’à %(count)s widgets" }, "menu": "Ouvrir le menu", - "release_announcement": { - "close": "Ok", - "description": "Retrouvez tous les messages épinglés ici. Survolez n'importe quel message et sélectionnez « Épingler » pour l'ajouter.", - "title": "Tous les nouveaux messages épinglés" - }, "reply_thread": "Répondre à un un message de fil de discussion", "unpin_all": { "button": "Désépingler tous les messages", @@ -1997,7 +1997,9 @@ "inaccessible_subtitle_1": "Réessayez plus tard ou demandez à l’administrateur du salon ou de l’espace si vous y avez accès.", "inaccessible_subtitle_2": "%(errcode)s a été retourné en essayant d’accéder au salon. Si vous pensez que vous ne devriez pas voir ce message, veuillez soumettre un rapport d’anomalie.", "intro": { + "display_topic": "Sujet: ", "dm_caption": "Vous n’êtes que tous les deux dans cette conversation, à moins que l’un de vous invite quelqu’un à vous rejoindre.", + "edit_topic": "Sujet: (modifier )", "enable_encryption_prompt": "Activer le chiffrement dans les paramètres.", "encrypted_3pid_dm_pending_join": "Quand tout le monde sera présent, vous pourrez discuter", "no_avatar_label": "Ajoutez une photo afin que les gens repèrent facilement votre salon.", @@ -2007,8 +2009,6 @@ "send_message_start_dm": "Envoyez votre premier message pour inviter à discuter", "start_of_dm_history": "C’est le début de l’historique de votre conversation privée avec .", "start_of_room": "C’est le début de .", - "topic": "Sujet : %(topic)s ", - "topic_edit": "Sujet : %(topic)s (modifier)", "unencrypted_warning": "Le chiffrement de bout en bout n’est pas activé", "user_created": "%(displayName)s a créé ce salon.", "you_created": "Vous avez créé ce salon." @@ -2063,8 +2063,9 @@ "pinned_message_banner": { "button_close_list": "Fermer la liste", "button_view_all": "Voir tout", - "description": "Ce salon contient des messages épinglés. Cliquez pour les consulter.", - "go_to_message": "Afficher le message épinglé dans la discussion.", + "description": "Messages épinglés", + "go_to_newest_message": "Afficher le message épinglé dans la discussion et le plus récent ici", + "go_to_next_message": "Afficher le message épinglé dans la discussion et le plus ancien suivant ici", "title": "%(index)s de %(length)s messages épinglés" }, "read_topic": "Cliquer pour lire le sujet", @@ -2173,6 +2174,26 @@ "one": "Actuellement en train de supprimer les messages dans %(count)s salon", "other": "Actuellement en train de supprimer les messages dans %(count)s salons" }, + "release_announcement": { + "done": "Terminé", + "filter": { + "description": "Filtrez vos discussions en un clic. Développez pour afficher plus de filtres.", + "title": "Nouveaux filtres" + }, + "intro": { + "description": "La liste des discussions a été mise à jour pour être plus claire et plus facile à utiliser.", + "title": "Les discussions ont une nouvelle apparence !" + }, + "next": "Suivant", + "settings": { + "description": "Pour afficher ou cacher les aperçus des messages, aller dans Tous les paramètres > Préférences > Liste de salons", + "title": "Certains paramètres ont été déplacés" + }, + "sort": { + "description": "Modifiez l'ordre de vos discussions par ordre chronologique ou par alphabétique", + "title": "Triez vos discussions" + } + }, "room": { "more_options": "Plus d’options", "open_room": "Ouvrir salon %(roomName)s" @@ -2362,6 +2383,10 @@ "users_default": "Rôle par défaut" }, "security": { + "cannot_change_to_private_due_to_missing_history_visiblity_permissions": { + "description": "Vous n\"avez pas les autorisations nécessaires pour modifier l\"historique du salon. Ceci est dangereux, car cela pourrait permettre aux utilisateurs non présents de lire les messages.", + "title": "Impossible de rendre le salon privé" + }, "enable_encryption_confirm_description": "Le chiffrement du salon ne peut pas être désactivé après son activation. Les messages d’un salon chiffré ne peuvent pas être vus par le serveur, seulement par les membres du salon. Activer le chiffrement peut empêcher certains robots et certaines passerelles de fonctionner correctement. En savoir plus sur le chiffrement.", "enable_encryption_confirm_title": "Activer le chiffrement ?", "enable_encryption_public_room_confirm_description_1": "Il n'est pas recommandé d’ajouter le chiffrement aux salons publics. Tout le monde peut trouver et rejoindre les salons publics, donc tout le monde peut lire les messages qui s’y trouvent. Vous n’aurez aucun des avantages du chiffrement, et vous ne pourrez pas le désactiver plus tard. Chiffrer les messages dans un salon public ralentira la réception et l’envoi de messages.", @@ -2379,7 +2404,7 @@ "history_visibility_joined": "Seulement les membres (depuis leur arrivée)", "history_visibility_legend": "Qui peut lire l’historique ?", "history_visibility_shared": "Seulement les membres (depuis la sélection de cette option)", - "history_visibility_warning": "Les modifications concernant l'accès à l’historique ne s'appliqueront qu’aux futurs messages de ce salon. La visibilité de l’historique existant ne sera pas modifiée.", + "history_visibility_warning": "La visibilité de l’historique existant ne sera pas modifiée.", "history_visibility_world_readable": "N’importe qui", "join_rule_description": "Choisir qui peut rejoindre %(roomName)s.", "join_rule_invite": "Privé (sur invitation)", @@ -2422,6 +2447,7 @@ "other": "Mise-à-jour des espaces… (%(progress)s sur %(count)s)" }, "join_rule_upgrade_upgrading_room": "Mise-à-jour du salon", + "join_rule_world_readable_description": "Changer qui peut rejoindre la salon modifiera également la visibilité des futurs messages.", "public_without_alias_warning": "Pour créer un lien vers ce salon, ajoutez une adresse.", "publish_room": "Rendez ce salon visible dans l’annuaire des salons publics.", "publish_space": "Rendez cet espace visible dans le répertoires des salons publics.", @@ -2560,6 +2586,7 @@ "breadcrumb_second_description": "Vous perdrez l’historique de vos messages", "breadcrumb_third_description": "Vous devrez vérifier à nouveau tous vos appareils et tous vos contacts", "breadcrumb_title": "Êtes-vous sûr de vouloir réinitialiser votre identité ?", + "breadcrumb_title_cant_confirm": "Vous devez réinitialiser votre identité", "breadcrumb_title_forgot": "Vous avez oublié votre clé de récupération ? Vous devez réinitialiser votre identité.", "breadcrumb_title_sync_failed": "Impossible de synchroniser le stockage des clés. Vous devez réinitialiser votre identité.", "breadcrumb_warning": "Ne faites cela que si vous pensez que votre compte a été compromis.", @@ -2832,6 +2859,10 @@ "rule_suppress_notices": "Messages envoyés par des robots", "rule_tombstone": "Quand les salons sont mis à niveau", "show_message_desktop_notification": "Afficher le message dans les notifications de bureau", + "sounds_release_announcement": { + "description": "Votre ping de notification et votre sonnerie d'appel ont été mis à jour : plus clairs, plus rapides et moins perturbateurs", + "title": "Nous avons rafraîchi vos sons" + }, "voip": "Appels audio et vidéo" }, "preferences": { @@ -3507,7 +3538,7 @@ "unknown": "%(senderDisplayName)s a changé l’accès des visiteurs en %(rule)s" }, "m.room.history_visibility": { - "invited": "%(senderName)s a rendu l’historique visible à tous les membres du salon, depuis le moment où ils ont été invités.", + "invited": "%(senderName)s a changé un paramètre : désormais les nouveaux membres pourront voir l'historique de conversation du salon à partir du moment où ils ont été invités.", "joined": "%(senderName)s a rendu l’historique visible à tous les membres du salon, à partir de leur arrivée.", "shared": "%(senderName)s a rendu l’historique visible à tous les membres du salon.", "unknown": "%(senderName)s a rendu l’historique visible à inconnu (%(visibility)s).", @@ -3960,6 +3991,7 @@ "connection_lost": "La connexion au serveur a été perdue", "connection_lost_description": "Vous ne pouvez pas passer d’appels sans connexion au serveur.", "consulting": "Consultation avec %(transferTarget)s. Transfert à %(transferee)s", + "decline_call": "Refuser", "default_device": "Appareil par défaut", "dial": "Composer", "dialpad": "Pavé numérique", @@ -4011,6 +4043,7 @@ "show_sidebar_button": "Afficher la barre latérale", "silence": "Mettre l’appel en sourdine", "silenced": "Notifications silencieuses", + "skip_lobby_toggle_option": "Rejoignez immédiatement", "start_screenshare": "Commencer à partager mon écran", "stop_screenshare": "Arrêter de partager mon écran", "too_many_calls": "Trop d’appels", diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 36da47f3ce..fda88d4dba 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -462,7 +462,6 @@ "unverified": "Non verificada", "user_avatar": "Imaxe de perfil", "username": "Nome de usuaria", - "verification_cancelled": "Verificación cancelada", "verified": "Verificada", "video": "Vídeo", "video_room": "Sala de vídeo", @@ -708,7 +707,6 @@ "title": "Método de Recuperación eliminado", "warning": "Se non eliminaches o método de recuperación, un atacante podería estar a intentar acceder á túa conta. Cambia inmediatamente o contrasinal da conta e establece un novo método de recuperación nos Axustes." }, - "reset_all_button": "Perdidos ou esquecidos tódolos métodos de recuperación? Restabléceos", "set_up_toast_title": "Configurar Copia de apoio Segura", "setup_secure_backup": { "explainer": "Fai unha copia de apoio das chaves antes de saír para evitar perdelas." @@ -727,12 +725,8 @@ "after_new_login": { "device_verified": "Dispositivo verificado", "skip_verification": "Omitir a verificación por agora", - "unable_to_verify": "Non se puido verificar este dispositivo", "verify_this_device": "Verifica este dispositivo" }, - "cancelled": "Cancelaches a verificación.", - "cancelled_self": "Cancelaches a verificación no teu outro dispositivo.", - "cancelled_user": "%(displayName)s cancelou a verificación.", "cancelling": "Cancelando…", "complete_action": "Vale", "complete_description": "Verificaches esta usuaria.", @@ -744,41 +738,29 @@ "incoming_sas_dialog_title": "Solicitude entrante de verificación", "incoming_sas_user_dialog_text_1": "Verifica esta usuaria para marcala como confiable. Ao confiar nas usuarias proporcionache tranquilidade extra cando usas cifrado de extremo-a-extremo.", "incoming_sas_user_dialog_text_2": "Ao verificar esta usuaria marcarás a súa sesión como confiable, e tamén marcará a túa sesión como confiable para elas.", - "no_key_or_device": "Semella que non tes unha Chave de Seguridade ou outros dispositivos cos que verificar. Este dispositivo non poderá acceder a mensaxes antigas cifradas. Para poder verificar a túa identidade neste dispositivo tes que restablecer as chaves de verificación.", "no_support_qr_emoji": "Este dispositivo que intentas verificar non ten soporte para código QR nin verificación por emoji, que é o que %(brand)s soporta. Inténtao cun cliente diferente.", "other_party_cancelled": "A outra parte cancelou a verificación.", "prompt_encrypted": "Verificar todas as usuarias da sala para asegurar que é segura.", - "prompt_self": "Inicia o proceso de novo desde a notificación.", "prompt_unencrypted": "En salas cifradas, verfica tódalas usuarias para ter certeza de que é segura.", - "prompt_user": "Inicia a verificación outra vez desde o seu perfil.", "qr_or_sas": "%(qrCode)s ou %(emojiCompare)s", - "qr_or_sas_header": "Verifica este dispositivo usando un dos seguintes métodos:", "qr_prompt": "Escanea este código único", - "qr_reciprocate_same_shield_device": "Xa case está! Mostra o teu outro dispositivo o mesmo escudo?", "qr_reciprocate_same_shield_user": "Case feito! ¿está %(displayName)s mostrando as mesmas emoticonas?", "request_toast_detail": "%(deviceId)s desde %(ip)s", - "reset_proceed_prompt": "Procede co restablecemento", "sas_caption_self": "Verifica este dispositivo confirmando que o seguinte número aparece na pantalla.", "sas_caption_user": "Verifica esta usuaria confirmando que o seguinte número aparece na súa pantalla.", "sas_description": "Compara o conxunto único de emoticonas se non tes cámara no outro dispositivo", - "sas_emoji_caption_self": "Confirma que os emoji inferiores se mostran nos dous dispositivos, na mesma orde:", "sas_emoji_caption_user": "Verifica a usuaria confirmando que as emoticonas aparecen na súa pantalla.", "sas_match": "Concordan", "sas_no_match": "Non concordan", "sas_prompt": "Compara os emoji", "scan_qr": "Verificar escaneando", "scan_qr_explainer": "Pídelle a %(displayName)s que escanee o teu código:", - "self_verification_hint": "Para seguir, acepta a solicitude de verificación no teu outro dispositivo.", "start_button": "Comezar a Verificación", - "successful_device": "Verificaches correctamente %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "Verificaches correctamente o teu dispositivo!", "successful_user": "Verificaches correctamente a %(displayName)s!", - "timed_out": "Verificación caducada.", "unsupported_method": "Non se atopa un método de verificación válido.", "unverified_session_toast_title": "Nova sesión. Foches ti?", "unverified_sessions_toast_description": "Revisa para asegurarte de que a túa conta está protexida", "unverified_sessions_toast_reject": "Máis tarde", - "verification_description": "Verifica a túa identidade para acceder a mensaxes cifradas e acreditar a túa identidade ante outras.", "verification_dialog_title_device": "Verificar outro dispositivo", "verification_dialog_title_user": "Solicitude de Verificación", "verification_skip_warning": "Sen verificación non poderás acceder a tódalas túas mensaxes e poderían aparecer como non confiables ante outras persoas.", @@ -788,9 +770,6 @@ "verify_emoji_prompt": "Verficación por comparación de emoticonas.", "verify_emoji_prompt_qr": "Se non podes escanear o código superior, verifica comparando as emoticonas.", "verify_later": "Verificarei máis tarde", - "verify_using_device": "Verifica usando outro dispositivo", - "verify_using_key": "Verificar coa Chave de Seguridade", - "verify_using_key_or_phrase": "Verificar coa Chave ou Frase de Seguridade", "waiting_for_user_accept": "Agardando a que %(displayName)s acepte…", "waiting_other_device": "Agardando a que verifiques no teu outro dispositivo…", "waiting_other_device_details": "Agardando a que verifiques o teu outro dispositivo, %(deviceName)s %(deviceId)s …", @@ -1492,8 +1471,6 @@ "send_message_start_dm": "Envía a túa primeira mensaxe para convidar a ao chat", "start_of_dm_history": "Este é o comezo do teu historial de conversa con .", "start_of_room": "Este é o comezo de .", - "topic": "Asunto: %(topic)s ", - "topic_edit": "Asunto: %(topic)s (editar)", "unencrypted_warning": "Non está activado o cifrado de extremo-a-extremo", "user_created": "%(displayName)s creou esta sala.", "you_created": "Creaches esta sala." diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json index d1607d6f5a..5ba894181d 100644 --- a/src/i18n/strings/he.json +++ b/src/i18n/strings/he.json @@ -422,7 +422,6 @@ "unnamed_room": "חדר ללא שם", "user_avatar": "תמונת פרופיל", "username": "שם משתמש", - "verification_cancelled": "אימות בוטל", "video": "וידאו", "warning": "התראה" }, @@ -617,11 +616,8 @@ "accepting": "מקבל…", "after_new_login": { "device_verified": "המכשיר אומת", - "unable_to_verify": "לא ניתן לאמת את מכשיר זה", "verify_this_device": "אמתו את מכשיר זה" }, - "cancelled": "בטלתם את האימות.", - "cancelled_user": "הצג אימותים מבוטלים %(displayName)s.", "cancelling": "מבטל…", "complete_action": "קבלתי", "complete_description": "המשתמש הזה אומת בהצלחה.", @@ -635,14 +631,10 @@ "incoming_sas_user_dialog_text_2": "אימות משתמש זה יסמן את ההפעלה שלו כאמינה, וגם יסמן את ההפעלה שלכם כאמינה להם.", "other_party_cancelled": "הצד השני ביטל את האימות.", "prompt_encrypted": "אמת את כל המשתמשים בחדר כדי לוודא שהוא מאובטח.", - "prompt_self": "התחל אימות שוב מההודעה.", - "prompt_user": "התחל לאמת שוב מהפרופיל שלהם.", - "qr_or_sas_header": "אמתו מכשיר זה על ידי מילוי אחת מהפעולות הבאות:", "qr_prompt": "סרוק את הקוד הזה", "qr_reciprocate_same_shield_user": "כמעט שם! האם %(displayName)s מציג את אותו מגן?", "sas_caption_user": "אמת את המשתמש הזה בכך שאותו מספר מופיע אצלו במסך.", "sas_description": "השווה קבוצה של סמלים אם אין ברשותכם מצלמה על שום מכשיר", - "sas_emoji_caption_self": "ודא ואשר שהסמלים הבאים מופיעים בשני המכשירים ובאותו הסדר:", "sas_emoji_caption_user": "אמת את המשתמש הזה בכך שסדרת הסמלים מוצגת זהה אצלו במסך.", "sas_match": "הם זהים", "sas_no_match": "הם לא זהים", @@ -650,10 +642,7 @@ "scan_qr": "אמת על ידי סריקה", "scan_qr_explainer": "בקש מ- %(displayName)s לסרוק את הקוד שלכם:", "start_button": "התחל אימות", - "successful_device": "אימתת בהצלחה את %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "אימתת בהצלחה את המכשיר שלך!", "successful_user": "אמתתם בהצלחה את %(displayName)s!", - "timed_out": "תם הזמן הקצוב לאימות.", "unsupported_method": "לא מצליח למצוא שיטות אימות נתמכות.", "unverified_session_toast_title": "כניסה חדשה. האם זה אתם?", "unverified_sessions_toast_description": "בידקו כדי לוודא שהחשבון שלך בטוח", @@ -1228,8 +1217,6 @@ "send_message_start_dm": "שילחו את ההודעה הראשונה שלכם להזמין את לצ'אט", "start_of_dm_history": "זו ההתחלה של היסטוריית ההודעות הישירות שלך עם .", "start_of_room": "זוהי התחלת השיחה בחדר .", - "topic": "נושאים: %(topic)s ", - "topic_edit": "נושאים: %(topic)s (עריכה)", "user_created": "%(displayName)s יצר את החדר הזה.", "you_created": "אתם יצרתם את החדר הזה." }, diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 96b52064cc..cf76d0cdc2 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -134,7 +134,7 @@ "skip": "Kihagyás", "start": "Indítás", "start_chat": "Csevegés indítása", - "start_new_chat": "Új beszélgetés indítása", + "start_new_chat": "Új csevegés indítása", "stop": "Leállítás", "submit": "Elküldés", "subscribe": "Feliratkozás", @@ -596,7 +596,6 @@ "user": "Felhasználó", "user_avatar": "Profilkép", "username": "Felhasználói név", - "verification_cancelled": "Ellenőrzés megszakítva", "verified": "Ellenőrizve", "version": "Verzió", "video": "Videó", @@ -652,6 +651,7 @@ "poll_button_no_perms_description": "Nincs joga szavazást kezdeményezni ebben a szobában.", "poll_button_no_perms_title": "Jogosultság szükséges", "replying_title": "Válasz", + "room_unencrypted": "A szobában lévő üzenetek nincsenek végponttól végpontig titkosítva", "room_upgraded_link": "A beszélgetés itt folytatódik.", "room_upgraded_notice": "Ezt a szobát lecseréltük és nem aktív többé.", "send_button_title": "Üzenet küldése", @@ -715,6 +715,7 @@ "personal_space_description": "Privát tér a szobái csoportosításához", "private_description": "Csak meghívóval, saját célra és csoportok számára ideális", "private_heading": "Saját privát tér", + "private_only_heading": "Saját tér", "private_personal_description": "Ellenőrizze, hogy a megfelelő személyeknek hozzáférése van ehhez: %(name)s", "private_personal_heading": "Kivel dolgozik együtt?", "private_space": "Én és a csoporttársaim", @@ -918,7 +919,7 @@ "privacy_warning": "Győződjön meg arról, hogy senki sem látja ezt a képernyőt!", "restoring": "Kulcsok helyreállítása mentésből", "security_key_label": "Helyreállítási kulcs", - "security_key_title": "Adja meg a helyreállítási kulcsot" + "security_key_title": "Adja meg a helyreállítási kulcsát" }, "bootstrap_title": "Kulcsok beállítása", "confirm_encryption_setup_body": "Az alábbi gomb megnyomásával erősítsd meg, hogy megadod a titkosítási beállításokat.", @@ -964,7 +965,6 @@ "title": "Helyreállítási mód eltávolítva", "warning": "Ha nem Ön távolított el a helyreállítási módot, akkor lehet, hogy egy támadó hozzá akar férni a fiókjához. Azonnal változtassa meg a jelszavát, és állítson be egy helyreállítási módot a Beállításokban." }, - "reset_all_button": "Elfelejtette vagy elveszett minden helyreállítási lehetőség? Minden alaphelyzetbe állítása", "set_up_recovery": "Helyreállítás beállítása", "set_up_recovery_toast_description": "Létrehozhat egy helyreállítási kulcsot, amellyel helyreállíthatja a titkosított üzenetelőzményeit, ha elveszíti a hozzáférést az eszközeihez.", "set_up_toast_title": "Biztonsági mentés beállítása", @@ -987,26 +987,25 @@ "after_new_login": { "device_verified": "Eszköz ellenőrizve", "skip_verification": "Ellenőrzés kihagyása most", - "unable_to_verify": "Ennek az eszköznek az ellenőrzése nem lehetséges", "verify_this_device": "Az eszköz ellenőrzése" }, - "cancelled": "Megszakította az ellenőrzést.", - "cancelled_self": "Az ellenőrzést megszakította a másik eszközön.", - "cancelled_user": "%(displayName)s megszakította az ellenőrzést.", "cancelling": "Megszakítás…", + "cant_confirm": "Nem tudja megerősíteni?", "complete_action": "Megértettem", "complete_description": "Sikeresen ellenőrizte ezt a felhasználót.", "complete_title": "Ellenőrizve!", + "confirm_identity_description": "A biztonságos üzenetkezelés beállításához ellenőrizze ezt az eszközt.", + "confirm_identity_title": "Erősítse meg, hogy Ön az", "error_starting_description": "A beszélgetést a másik felhasználóval nem lehetett elindítani.", "error_starting_title": "Hiba az ellenőrzés indításakor", "explainer": "Az ezzel felhasználóval váltott biztonságos üzenetek végpontok közti titkosítással védettek, és azt harmadik fél nem tudja elolvasni.", "in_person": "A biztonság érdekében ezt végezze el személyesen, vagy használjon megbízható kommunikációs csatornát.", "incoming_sas_device_dialog_text_1": "Eszköz ellenőrzése és beállítás megbízhatóként. Az eszközben való megbízás megnyugtató lehet, ha végpontok közti titkosítást használ.", - "incoming_sas_device_dialog_text_2": "Az eszköz ellenőrzése megbízhatónak fogja jelezni az eszközt és azok a felhasználók, akik téged ellenőriztek, megbíznak majd ebben az eszközödben.", + "incoming_sas_device_dialog_text_2": "Az eszköz ellenőrzése megbízhatónak fogja jelezni az eszközt és azok a felhasználók, akik ellenőrizték, megbíznak majd ebben az eszközében.", "incoming_sas_dialog_title": "Bejövő ellenőrzési kérés", "incoming_sas_dialog_waiting": "Várakozás a partner megerősítésére…", "incoming_sas_user_dialog_text_1": "Ellenőrizze ezt a felhasználót, hogy megbízhatónak jelölje. A felhasználók megbízhatóságának megerősítése további biztonságot nyújt a végpontok közti titkosítással rendelkező üzenetek használatakor.", - "incoming_sas_user_dialog_text_2": "A felhasználó ellenőrzése által az ő munkamenete megbízhatónak lesz jelölve, és a te munkameneted is megbízhatónak lesz jelölve nála.", + "incoming_sas_user_dialog_text_2": "A felhasználó ellenőrzése megbízhatónak jelöli az ő munkamenetét, és az Ön munkamenetét is megbízhatónak lesz jelölve nála.", "manual": { "already_verified": "Ez az eszköz már ellenőrzött", "already_verified_and_wrong_fingerprint": "A megadott ujjlenyomat nem egyezik, de az eszköz már ellenőrizve van!", @@ -1022,47 +1021,37 @@ "text": "Adja meg valamelyik saját eszköze azonosítóját és ujjlenyomatát annak ellenőrzéséhez. MEGJEGYZÉS: ez lehetővé teszi a másik eszköz számára, hogy az Ön nevében küldjön és fogadjon üzeneteket. HA VALAKI AZT MONDTA, HOGY ILLESSZEN BE IDE VALAMIT, VALÓSZÍNŰLEG ÁTVERIK!", "wrong_fingerprint": "Nem sikerült ellenőrizni a(z) „%(deviceId)s” eszközt – a mellékelt „%(fingerprint)s” ujjlenyomat nem egyezik az eszköz ujjlenyomatával: „%(fprint)s”" }, - "no_key_or_device": "Úgy tűnik, hogy nem rendelkezik helyreállítási kulccsal, vagy másik eszközzel, amellyel ellenőrizhetné. Ezzel az eszközzel nem fér majd hozzá a régi titkosított üzenetekhez. Ahhoz, hogy a személyazonosságát ezen az eszközön ellenőrizni lehessen, az ellenőrzési kulcsokat alaphelyzetbe kell állítania.", "no_support_qr_emoji": "Az ellenőrizni kívánt eszköz nem támogatja sem a QR-kód leolvasását, sem az emodzsis ellenőrzést, amelyeket az %(brand)s támogat. Próbálja meg egy másik klienssel.", "other_party_cancelled": "A másik fél megszakította az ellenőrzést.", "prompt_encrypted": "Ellenőrizze a szoba összes tagját, hogy meggyőződjön a biztonságáról.", - "prompt_self": "Ellenőrzés újrakezdése az értesítésből.", "prompt_unencrypted": "A titkosított szobákban ellenőrizze az összes tagot, hogy meggyőződjön a biztonságosságáról.", - "prompt_user": "Indítsa újra az ellenőrzést a profiljából.", "qr_or_sas": "%(qrCode)s vagy %(emojiCompare)s", - "qr_or_sas_header": "Ellenőrizze ezt az eszközt az alábbiak egyikével:", "qr_prompt": "Ennek az egyedi kódnak a beolvasása", - "qr_reciprocate_same_shield_device": "Majdnem kész! A többi eszköze is ugyanazt a pajzsot mutatja?", "qr_reciprocate_same_shield_user": "Majdnem kész! %(displayName)s is ugyanazt a pajzsot mutatja?", - "request_toast_accept": "Munkamenet ellenőrzése", "request_toast_accept_user": "Felhasználó ellenőrzése", "request_toast_decline_counter": "Mellőzés (%(counter)s)", "request_toast_detail": "%(deviceId)s innen: %(ip)s", - "reset_proceed_prompt": "Lecserélés folytatása", "sas_caption_self": "Ellenőrizze ezt az eszközt azzal, hogy megerősíti, hogy a következő szám jelenik meg a képernyőjén.", "sas_caption_user": "Ellenőrizze ezt a felhasználót azzal, hogy megerősíti, hogy a következő szám jelenik meg a képernyőjén.", "sas_description": "Hasonlítsd össze az egyedi emodzsikat ha valamelyik eszközön nincs kamera", - "sas_emoji_caption_self": "Erősítse meg, hogy az alábbi emodzsik mindkét eszközön azonos sorrendben jelentek-e meg:", "sas_emoji_caption_user": "Ellenőrizze ezt a felhasználót azzal, hogy megerősíti, hogy a következő emodzsi jelenik meg a képernyőjén.", "sas_match": "Egyeznek", "sas_no_match": "Nem egyeznek", "sas_prompt": "Egyedi emodzsik összehasonlítása", "scan_qr": "Ellenőrzés kód beolvasással", "scan_qr_explainer": "Kérd meg %(displayName)s felhasználót, hogy olvassa be a kódot:", - "self_verification_hint": "A folytatáshoz fogadja el az ellenőrzés kérést a másik eszközről.", "start_button": "Ellenőrzés elindítása", - "successful_device": "Sikeresen ellenőrizted: %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "Sikeresen ellenőrizted az eszközödet!", "successful_user": "Sikeresen ellenőrizted a felhasználót: %(displayName)s!", - "timed_out": "Az ellenőrzés időtúllépés miatt megszakadt.", "unsupported_method": "Nem található támogatott ellenőrzési eljárás.", "unverified_session_toast_accept": "Igen, én voltam", "unverified_session_toast_title": "Új bejelentkezés. Ön volt az?", "unverified_sessions_toast_description": "Tekintse át, hogy meggyőződjön arról, hogy a fiókja biztonságban van", "unverified_sessions_toast_reject": "Később", "unverified_sessions_toast_title": "Ellenőrizetlen bejelentkezései vannak", - "verification_description": "Ellenőrizze a személyazonosságát, hogy hozzáférjen a titkosított üzeneteihez és másoknak is bizonyítani tudja személyazonosságát.", + "use_another_device": "Másik eszköz használata", + "use_recovery_key": "Helyreállítási kulcs használata", "verification_dialog_title_device": "Másik eszköz ellenőrzése", + "verification_dialog_title_failed": "Az ellenőrzés sikertelen", "verification_dialog_title_user": "Ellenőrzési kérés", "verification_skip_warning": "Az ellenőrzés nélkül nem fér hozzá az összes üzenetéhez és mások számára megbízhatatlannak fog látszani.", "verification_success_with_backup": "Ez az eszköz hitelesítve van. A titkosított üzenetekhez hozzáférése van és más felhasználók megbízhatónak látják.", @@ -1071,9 +1060,6 @@ "verify_emoji_prompt": "Ellenőrzés egyedi emodzsik összehasonlításával.", "verify_emoji_prompt_qr": "Ha nem tudod beolvasni az alábbi kódot, ellenőrizd az egyedi emodzsik összehasonlításával.", "verify_later": "Később ellenőrzöm", - "verify_using_device": "Ellenőrizze egy másik eszközzel", - "verify_using_key": "Ellenőrzés helyreállítási kulccsal", - "verify_using_key_or_phrase": "Ellenőrzés helyreállítási kulccsal vagy jelmondattal", "waiting_for_user_accept": "%(displayName)s felhasználóra várakozás az elfogadáshoz…", "waiting_other_device": "Várakozás a másik eszköztől való ellenőrzésre…", "waiting_other_device_details": "Várakozás a másik eszközről való ellenőrzésre: %(deviceName)s (%(deviceId)s)…", @@ -1123,6 +1109,7 @@ "tls": "Nem lehet kapcsolódni a Matrix-kiszolgálóhoz – ellenőrizze a kapcsolatot, győződjön meg arról, hogy a Matrix-kiszolgáló tanúsítványa hiteles, és hogy a böngészőkiegészítők nem blokkolják a kéréseket.", "unknown": "Ismeretlen hiba", "unknown_error_code": "ismeretlen hibakód", + "update_history_visibility": "A régi üzenetek láthatóságának módosítása nem sikerült", "update_power_level": "A hozzáférési szint megváltoztatása sikertelen" }, "error_app_open_in_another_tab": "Váltson a másik lapra a csatlakozáshoz ide: %(brand)s. Ez a lap most bezárható.", @@ -1358,6 +1345,10 @@ "name_email_mxid_share_space": "Hívjon meg valakit a nevét, e-mail-címét vagy felhasználónevét (például ) megadva, vagy ossza meg ezt a teret.", "name_mxid_share_room": "Hívjon meg valakit a nevét vagy felhasználónevét (például ) megadva, vagy ossza meg ezt a szobát.", "name_mxid_share_space": "Hívjon meg valakit a nevét vagy felhasználónevét (például ) megadva, vagy ossza meg ezt a teret.", + "progress": { + "dont_close": "Ne zárja be az alkalmazást, amíg be nem fejezte.", + "preparing": "Meghívók előkészítése…" + }, "recents_section": "Legújabb beszélgetések", "room_failed_partial": "Az alábbi embereket nem sikerül meghívni ide: , de a többi meghívó elküldve", "room_failed_partial_title": "Néhány meghívót nem sikerült elküldeni", @@ -1602,7 +1593,7 @@ "MapStyleUrlNotReachable": "Ez a Matrix-kiszolgáló nincs megfelelően beállítva a térképek megjelenítéséhez, vagy a beállított térképkiszolgáló nem érhető el.", "WebGLNotEnabled": "A WebGL szükséges a térképek megjelenítéséhez, engedélyezze a böngészőbeállításokban.", "click_drop_pin": "Kattintson a hely megjelöléséhez", - "click_move_pin": "Kattintson a jelölő mozgatásához", + "click_move_pin": "Kattintson a jelölő áthelyezéséhez", "close_sidebar": "Oldalsáv bezárása", "error_fetch_location": "Nem lehet elérni a földrajzi helyzetét", "error_no_perms_description": "Az ebben a szobában történő helymegosztáshoz a megfelelő jogosultságokra van szüksége.", @@ -1850,30 +1841,26 @@ "extensions_empty_title": "Növelje a hatékonyságát több eszközzel, kisalkalmazásokkal és botokkal", "files_button": "Fájlok", "pinned_messages": { - "empty_description": "Válasszon ki egy üzenetet, majd válassza a „%(pinAction)s ”, hogy ide kerüljön.", - "empty_title": "Rögzítse a fontos üzeneteket, hogy könnyen felfedezhetők legyenek", + "empty_description": "Válasszon ki egy üzenetet, majd válassza a „%(pinAction)s” lehetőséget, hogy ide kerüljön.", + "empty_title": "Tűzze ki a fontos üzeneteket, hogy könnyen felfedezhetők legyenek", "header": { - "1 rögzített üzenet": "one", - "%(count)s rögzített üzenet": "other" + "one": "1 kitűzött üzenet", + "other": "%(count)s kitűzött üzenet" }, "limits": { - "Csak %(count)s kisalkalmazást tud kitűzni": "other" + "one": "", + "other": "Legfeljebb %(count)s kisalkalmazást tűzhet ki" }, "menu": "Menü megnyitása", - "release_announcement": { - "close": "OK", - "description": "Itt találja az összes kitűzött üzenetet. Húzza az egérmutatót bármely üzenetre, és válassza a „Kitűz” lehetőséget a hozzáadáshoz.", - "title": "Minden új kitűzött üzenet" - }, "reply_thread": "Válasz egy üzenetszálra", "unpin_all": { - "button": "Az összes üzenet rögzítésének feloldása", - "content": "Győződjön meg róla, hogy valóban el akarja távolítani az összes üzenet rögzítést. Ezt a műveletet nem lehet visszavonni.", - "title": "Feloldja az összes üzenet rögzítését?" + "button": "Az összes üzenet kitűzésének feloldása", + "content": "Győződjön meg róla, hogy valóban el akarja távolítani az összes üzenet kitűzését. Ezt a műveletet nem lehet visszavonni.", + "title": "Feloldja az összes üzenet kitűzését?" }, "view": "Megtekintés az idővonalon" }, - "pinned_messages_button": "Rögzített üzenetek", + "pinned_messages_button": "Kitűzött üzenetek", "poll": { "active_heading": "Aktív szavazások", "empty_active": "Nincsenek aktív szavazások ebben a szobában", @@ -1920,7 +1907,7 @@ "3pid_invite_error_title_room": "A meghívóddal ebbe a szobába: %(roomName)s valami baj történt", "3pid_invite_no_is_subtitle": "Használjon egy azonosítási kiszolgálót a Beállításokban, hogy közvetlenül az %(brand)sben kapja meg a meghívókat.", "banned_by": "%(memberName)s felhasználó kitiltotta", - "banned_from_room_by": "Téged kitiltott %(memberName)s ebből a szobából: %(roomName)s", + "banned_from_room_by": "%(memberName)s kitiltotta ebből a szobából: %(roomName)s", "context_menu": { "copy_link": "Szoba hivatkozásának másolása", "favourite": "Kedvencnek jelölés", @@ -1984,7 +1971,9 @@ "inaccessible_subtitle_1": "Próbálkozzon később vagy kérje meg a szoba vagy tér adminisztrátorát, hogy nézze meg van-e hozzáférése.", "inaccessible_subtitle_2": "A szoba vagy tér elérésekor ez a hibaüzenetet érkezett: %(errcode)s. Ha úgy gondolja, hogy az üzenetet egy hiba miatt látja, nyisson egy hibajegyet.", "intro": { + "display_topic": "Téma: ", "dm_caption": "Csak önök ketten vannak ebben a beszélgetésben, hacsak valamelyikőjük nem hív meg valakit, hogy csatlakozzon.", + "edit_topic": "Téma: (szerkesztés )", "enable_encryption_prompt": "Titkosítás bekapcsolása a beállításokban.", "encrypted_3pid_dm_pending_join": "Amint mindenki belépett lekezdheti a beszélgetést", "no_avatar_label": "Állítson be egy fényképet, hogy az emberek könnyebben felismerjék a szobáját.", @@ -1994,11 +1983,9 @@ "send_message_start_dm": "Küldj egy üzenetet ahhoz, hogy meghívd felhasználót", "start_of_dm_history": "Ez a közvetlen beszélgetés kezdete felhasználóval.", "start_of_room": "Ez a(z) kezdete.", - "topic": "Téma: %(topic)s ", - "topic_edit": "Téma: %(topic)s (szerkesztés)", "unencrypted_warning": "A végpontok közti titkosítás nincs engedélyezve", "user_created": "%(displayName)s készítette ezt a szobát.", - "you_created": "Te készítetted ezt a szobát." + "you_created": "Ön hozta létre ezt a szobát." }, "invite_email_mismatch_suggestion": "Oszd meg a Beállításokban ezt az e-mail címet, hogy közvetlen meghívókat kaphass %(brand)sba.", "invite_sent_to_email": "Ez a meghívó ide lett küldve: %(email)s", @@ -2048,11 +2035,12 @@ "peek_join_prompt": "%(roomName)s szoba előnézetét látod. Belépsz?", "pinned_message_badge": "Kitűzött üzenet", "pinned_message_banner": { - "button_close_list": "A lista bezárása", + "button_close_list": "Lista bezárása", "button_view_all": "Összes megtekintése", - "description": "Ez a szoba rögzített üzeneteket tartalmaz. Kattintson ide a megtekintésükhöz.", - "go_to_message": "Tekintse meg a rögzített üzenetet az idővonalon.", - "title": "%(index)s. / %(length)s rögzített üzenet" + "description": "Kitűzött üzenetek", + "go_to_newest_message": "A kitűzött üzenet megtekintése az idővonalon, a legújabbé pedig itt", + "go_to_next_message": "A kitűzött üzenet megtekintése az idővonalon, a következő legrégebbié pedig itt", + "title": "%(index)s. / %(length)s kitűzött üzenet" }, "read_topic": "Kattintson a téma elolvasásához", "rejecting": "Meghívó elutasítása…", @@ -2156,6 +2144,26 @@ "redacting_messages_status": { "Üzenet törlése %(count)s szobából": "other" }, + "release_announcement": { + "done": "Kész", + "filter": { + "description": "Szűrje a csevegéseit egyetlen kattintással. Bontsa ki a további szűrők megtekintéséhez.", + "title": "Új gyorsszűrők" + }, + "intro": { + "description": "A csevegési lista frissült, hogy áttekinthetőbb és egyszerűbben használható legyen.", + "title": "A csevegések új megjelenést kaptak!" + }, + "next": "Következő", + "settings": { + "description": "Az üzenetelőnézetek megjelenítéséhez vagy elrejtéséhez ugorjon a Minden beállítás > Beállítások > Szobalista menüponthoz.", + "title": "Néhány beállítás áthelyezésre került" + }, + "sort": { + "description": "A csevegések sorrendjének módosítása a legutóbbiról A–Z-re", + "title": "Csevegések rendezése" + } + }, "room": { "more_options": "További lehetőségek", "open_room": "A(z) %(roomName)s szoba megnyitása" @@ -2169,10 +2177,10 @@ "sort": "Rendezés", "sort_by": "Rendezés", "sort_by_activity": "Aktivitás", - "sort_by_alphabet": "A-Z", + "sort_by_alphabet": "A–Z", "sort_type": { "activity": "Tevékenység", - "atoz": "A-Z" + "atoz": "A–Z" }, "sort_unread_first": "Olvasatlan üzeneteket tartalmazó szobák megjelenítése elöl", "space_menu": { @@ -2344,6 +2352,10 @@ "users_default": "Alapértelmezett szerep" }, "security": { + "cannot_change_to_private_due_to_missing_history_visiblity_permissions": { + "description": "Nincs jogosultsága a szoba előzményeinek láthatóságának módosítására. Ez veszélyes, mivel lehetővé teheti a nem csatlakozott felhasználók számára az üzenetek olvasását.", + "title": "A szobát nem lehet priváttá tenni" + }, "enable_encryption_confirm_description": "Ha egyszer engedélyezve lett, a szoba titkosítását nem lehet kikapcsolni. A titkosított szobákban küldött üzenetek a kiszolgáló számára nem, csak a szoba tagjai számára láthatók. A titkosítás bekapcsolása megakadályoz sok botot és hidat a megfelelő működésben. Tudjon meg többet a titkosításról.", "enable_encryption_confirm_title": "Titkosítás engedélyezése?", "enable_encryption_public_room_confirm_description_1": "Nyilvános szobához nem javasolt a titkosítás beállítása.Bárki megtalálhatja és csatlakozhat nyilvános szobákhoz, így bárki elolvashatja az üzeneteket bennük. A titkosítás előnyeit így nem jelentkeznek és később ezt nem lehet kikapcsolni. Nyilvános szobákban a titkosított üzenetek az üzenetküldést és fogadást csak lassítják.", @@ -2361,7 +2373,7 @@ "history_visibility_joined": "Csak tagoknak (amióta csatlakoztak)", "history_visibility_legend": "Ki olvashatja a régi üzeneteket?", "history_visibility_shared": "Csak tagok számára (a beállítás kiválasztásától)", - "history_visibility_warning": "A üzenetek olvashatóságának változtatása csak az új üzenetekre lesz érvényes. A régi üzenetek láthatósága nem fog változni.", + "history_visibility_warning": "A régi üzenetek láthatósága nem fog változni.", "history_visibility_world_readable": "Bárki", "join_rule_description": "Döntse el ki léphet be ide: %(roomName)s.", "join_rule_invite": "Privát (csak meghívóval)", @@ -2403,6 +2415,7 @@ "Terek frissítése… (%(progress)s / %(count)s)": "other" }, "join_rule_upgrade_upgrading_room": "Szoba fejlesztése", + "join_rule_world_readable_description": "A szobába való belépés jogosultságának módosítása a jövőbeli üzenetek láthatóságát is megváltoztatja.", "public_without_alias_warning": "Hogy hivatkozhasson erre a szobára, adjon hozzá egy címet.", "publish_room": "Szoba láthatóvá tétele a nyilvános szobakatalógusban.", "publish_space": "Tér láthatóvá tétele a nyilvános szobakatalógusban.", @@ -2541,6 +2554,7 @@ "breadcrumb_second_description": "Elveszít minden olyan üzenetelőzményt, amely csak a kiszolgálón van tárolva.", "breadcrumb_third_description": "Újra ellenőriznie kell az összes meglévő eszközét és névjegyét", "breadcrumb_title": "Biztos, hogy alaphelyzetbe állítja a személyazonosságát?", + "breadcrumb_title_cant_confirm": "Alaphelyzetbe kell állítania a személyazonosságát", "breadcrumb_title_forgot": "Elfelejtette a helyreállítási kulcsot? Alaphelyzetbe kell állítania a személyazonosságát.", "breadcrumb_title_sync_failed": "A kulcstároló szinkronizálása sikertelen. Alaphelyzetbe kell állítania személyazonosságát.", "breadcrumb_warning": "Csak akkor tegye ezt, ha úgy gondolja, hogy fiókját feltörték.", @@ -2716,11 +2730,11 @@ "phrase_strong_enough": "Nagyszerű! Ez a biztonsági jelmondat elég erősnek tűnik.", "secret_storage_query_failure": "A biztonsági tároló állapotát nem lehet lekérdezni", "security_key_safety_reminder": "A helyreállítási kulcsot tárolja biztonságos helyen, például egy jelszókezelőben vagy egy széfben, mivel ez tartja biztonságban a titkosított adatait.", - "set_phrase_again": "Lépj vissza és állítsd be újra.", + "set_phrase_again": "Lépjen vissza és állítsa be újra.", "settings_reminder": "A biztonsági mentés beállítását és a kulcsok kezelését a Beállításokban is megadhatja.", "title_confirm_phrase": "Biztonsági jelmondat megerősítése", "title_save_key": "Mentse el a helyreállítási kulcsát", - "title_set_phrase": "Biztonsági Jelmondat beállítása", + "title_set_phrase": "Biztonsági jelmondat beállítása", "unable_to_setup": "A biztonsági tárolót nem sikerült beállítani", "use_different_passphrase": "Másik jelmondat használata?", "use_phrase_only_you_know": "Olyan biztonsági jelmondatot használjon, amelyet csak Ön ismer, és esetleg mentsen el egy helyreállítási kulcsot vésztartalékként." @@ -2731,11 +2745,11 @@ "enter_passphrase": "Jelmondat megadása", "export_description_1": "Ezzel a folyamattal kimentheted a titkosított szobák üzeneteihez tartozó kulcsokat egy helyi fájlba. Ez után be tudod tölteni ezt a fájlt egy másik Matrix kliensbe, így az a kliens is vissza tudja fejteni az üzeneteket.", "export_description_2": "Az exportált fájl lehetővé teszi, hogy bárki, aki el tudja olvasni, visszafejtse a titkosított üzeneteket, amelyeket Ön láthat, ezért ügyeljen a biztonságra. Ennek érdekében az alábbiakban adjon meg egy egyedi jelmondatot, amely csak az exportált adatok titkosítására szolgál. Az adatok importálása csak ugyanezen jelszó használatával lesz lehetséges.", - "export_title": "Szoba kulcsok mentése", + "export_title": "Szobakulcsok exportálása", "file_to_import": "Fájl betöltése", - "import_description_1": "Ezzel a folyamattal lehetőséged van betölteni a titkosítási kulcsokat amiket egy másik Matrix kliensből mentettél ki. Ez után minden üzenetet vissza tudsz fejteni amit a másik kliens tudott.", - "import_description_2": "A kimentett fájl jelmondattal van védve. A kibontáshoz add meg a jelmondatot.", - "import_title": "Szoba kulcsok betöltése", + "import_description_1": "Ezzel a folyamattal importálhatja a titkosítási kulcsokat, melyeket egy másik Matrix-kliensből exportált. Ezután minden olyan üzenetet vissza tud fejteni, melyet a másik kliens is tudott.", + "import_description_2": "Az exportált fájl jelmondattal van védve. A kibontásához adja meg a jelmondatot.", + "import_title": "Szobakulcsok importálása", "phrase_cannot_be_empty": "A jelmondat nem lehet üres", "phrase_must_match": "A jelmondatoknak meg kell egyezniük", "phrase_strong_enough": "Nagyszerű! Ez a jelmondat elég erősnek tűnik." @@ -2769,7 +2783,7 @@ "email_select": "Válassza ki, hogy mely e-mail-címekre szeretne összefoglalókat küldeni. Itt kezelje az e-mail-címeit: .", "enable_audible_notifications_session": "Hallható értesítések engedélyezése ehhez a munkamenethez", "enable_desktop_notifications_session": "Asztali értesítések engedélyezése ehhez a munkamenethez", - "enable_email_notifications": "E-mail értesítések engedélyezése ehhez: %(email)s", + "enable_email_notifications": "E-mail-értesítések engedélyezése ehhez: %(email)s", "enable_notifications_account": "Értesítések engedélyezése ehhez a fiókhoz", "enable_notifications_account_detail": "Kapcsolja ki, hogy letiltsa az értesítéseket az összes eszközökén és munkamenetében", "enable_notifications_device": "Értesítések engedélyezése ehhez az eszközhöz", @@ -2792,7 +2806,7 @@ "notify_at_room": "Értesítés, ha valaki megemlíti a @room használatával", "notify_keyword": "Értesítés, ha valaki egy kulcsszót használ", "notify_mention": "Értesítés, ha valaki megemlíti a @megjelenítendő-név vagy %(mxid)s használatával", - "other_section": "Egyéb dolgok, amelyekről úgy gondoljuk, hogy érdekelhetik Önt:", + "other_section": "Egyéb dolgok, amelyekről úgy gondoljuk, hogy érdekelhetik:", "people_mentions_keywords": "Emberek, említések és kulcsszavak", "play_sound_for_description": "Alapértelmezés szerint az összes szobára érvényes, az összes eszközön.", "play_sound_for_section": "Hang lejátszása a következőkhöz", @@ -2904,8 +2918,8 @@ }, "current_session": "Jelenlegi munkamenet", "desktop_session": "Asztali munkamenet", - "details_heading": "Munkamenet információk", - "device_unverified_description": "A jobb biztonság vagy megbízhatóság érdekében ellenőrizze vagy jelentkezzen ki ebből a munkamenetből.", + "details_heading": "Munkamenet-információk", + "device_unverified_description": "A jobb biztonság vagy megbízhatóság érdekében ellenőrizze, vagy jelentkezzen ki ebből a munkamenetből.", "device_unverified_description_current": "Ellenőrizze az aktuális munkamenetet a biztonságos üzenetküldéshez.", "device_verified_description": "Ez a munkamenet beállítva a biztonságos üzenetküldéshez.", "device_verified_description_current": "Az aktuális munkamenet készen áll a biztonságos üzenetküldésre.", @@ -2914,17 +2928,17 @@ "error_set_name": "Nem sikerült beállítani a munkamenet nevét", "filter_all": "Mind", "filter_inactive": "Inaktív", - "filter_inactive_description": "Inaktív %(inactiveAgeDays)s óta vagy annál hosszabb ideje", + "filter_inactive_description": "%(inactiveAgeDays)s napja vagy régebb óta inaktív", "filter_label": "Szűrőeszközök", "filter_unverified_description": "Nem áll készen a biztonságos üzenetküldésre", "filter_verified_description": "Felkészülve a biztonságos üzenetküldésre", "hide_details": "Részletek elrejtése", - "inactive_days": "Utolsó használat %(inactiveAgeDays)s+ napja", - "inactive_sessions": "Nem aktív munkamenetek", - "inactive_sessions_explainer_1": "Az inaktív munkamenet olyan munkamenet amit már régóta nem használ de még mindig megkapják a titkosítási kulcsokat.", + "inactive_days": "Több mint %(inactiveAgeDays)s napja inaktív", + "inactive_sessions": "Inaktív munkamenetek", + "inactive_sessions_explainer_1": "Az inaktív munkamenetek olyan régóta nem használt munkamenetek, melyek még mindig megkapják a titkosítási kulcsokat.", "inactive_sessions_explainer_2": "Az inaktív munkamenetek törlése növeli a biztonságot és a sebességet, valamint egyszerűbbé teszi a gyanús munkamenetek felismerését.", "inactive_sessions_list_description": "Fontolja meg a kijelentkezést a régi munkamenetekből (%(inactiveAgeDays)s napnál régebbi) ha már nem használja azokat.", - "ip": "IP cím", + "ip": "IP-cím", "last_activity": "Utolsó tevékenység", "manage": "Munkamenet kezelése", "mobile_session": "Mobil munkamenet", @@ -2962,17 +2976,17 @@ "Kijelentkezés %(count)s munkamenetből": "other" }, "title": "Munkamenetek", - "unknown_session": "Ismeretlen munkamenet típus", + "unknown_session": "Ismeretlen munkamenettípus", "unverified_session": "Ellenőrizetlen munkamenet", "unverified_session_explainer_1": "Ez a munkamenet nem támogatja a titkosítást, így nem lehet ellenőrizni sem.", - "unverified_session_explainer_2": "Ezzel a munkamenettel olyan szobákban ahol a titkosítás be van kapcsolva nem tud részt venni.", - "unverified_session_explainer_3": "A biztonság és adatbiztonság érdekében javasolt olyan Matrix klienst használni ami támogatja a titkosítást.", - "unverified_sessions": "Meg nem erősített munkamenetek", - "unverified_sessions_explainer_1": "Az ellenőrizetlen munkamenetek olyanok amivel a jelszavával bejelentkeztek de nem lett ellenőrizve.", - "unverified_sessions_explainer_2": "Egészen bizonyosodjon meg arról, hogy ismeri ezeket a munkameneteket mivel elképzelhető, hogy jogosulatlan fiókhasználatot jeleznek.", + "unverified_session_explainer_2": "Ezzel a munkamenettel azokban szobákban nem tud részt venni, ahol a titkosítás be van kapcsolva.", + "unverified_session_explainer_3": "A biztonság és adatvédelem érdekében javasolt olyan Matrix klienst használni, amely támogatja a titkosítást.", + "unverified_sessions": "Nem ellenőrzött munkamenetek", + "unverified_sessions_explainer_1": "A nem ellenőrzött munkamenetek olyanok, amelyek a jelszavával bejelentkeztek, de nem lettek ellenőrizve.", + "unverified_sessions_explainer_2": "Egészen bizonyosodjon meg arról, hogy ismeri ezeket a munkameneteket, mivel elképzelhető, hogy jogosulatlan fiókhasználatot jeleznek.", "unverified_sessions_list_description": "Erősítse meg a munkameneteit a még biztonságosabb csevegéshez vagy jelentkezzen ki ezekből, ha nem ismeri fel vagy már nem használja őket.", "url": "Webcím", - "verified_session": "Munkamenet hitelesítve", + "verified_session": "Ellenőrzött munkamenet", "verified_sessions": "Ellenőrzött munkamenetek", "verified_sessions_explainer_1": "Mindenhol ellenőrzött munkamenetek vannak ahol ezt a fiókot használja a jelmondattal vagy azonosította magát egy másik ellenőrzött munkamenetből.", "verified_sessions_explainer_2": "Ez azt jelenti, hogy a titkosított üzenetek visszafejtéséhez minden kulccsal rendelkezik valamint a többi felhasználó megbízhat ebben a munkamenetben.", @@ -3173,7 +3187,7 @@ "invite_description": "Meghívás e-mail-címmel vagy felhasználónévvel", "invite_link": "Meghívási hivatkozás megosztása", "joining_space": "Belépés", - "landing_welcome": "Üdvözöl a(z) ", + "landing_welcome": "Üdvözli a(z) ", "leave_dialog_action": "Tér elhagyása", "leave_dialog_description": "Éppen el akarja hagyni teret.", "leave_dialog_only_admin_room_warning": "Ön az adminisztrátora néhány szobának vagy térnek amiből ki szeretne lépni. Ha kilép belőlük akkor azok adminisztrátor nélkül maradnak.", @@ -3223,7 +3237,7 @@ "network_dropdown_remove_server_adornment": "Távoli kiszolgáló: „%(roomServer)s”", "network_dropdown_required_invalid": "Adja meg a kiszolgáló nevét", "network_dropdown_selected_label": "Megjelenítés: Matrix szobák", - "network_dropdown_selected_label_instance": "Megjelenítés: %(instance)s szobái (%(server)s)", + "network_dropdown_selected_label_instance": "Megjelenítés: %(instance)s-szobák (%(server)s)", "network_dropdown_your_server_description": "Saját Matrix-kiszolgáló" } }, @@ -3481,7 +3495,7 @@ "unknown": "%(senderDisplayName)s a vendégek hozzáférését erre állította be: %(rule)s" }, "m.room.history_visibility": { - "invited": "%(senderName)s láthatóvá tette a szoba új üzeneteit minden szobatagnak, a meghívásuk idejétől kezdve.", + "invited": "%(senderName)s láthatóvá tette a szoba új üzeneteit minden új szobatagnak, a meghívásuk idejétől kezdve.", "joined": "%(senderName)s láthatóvá tette a szoba új üzeneteit minden szobatagnak, a csatlakozásuk idejétől kezdve.", "shared": "%(senderName)s láthatóvá tette a szoba új üzeneteit minden szobatagnak.", "unknown": "%(senderName)s elérhetővé tette a szoba új üzeneteit az ismeretlenek (%(visibility)s) számára is.", @@ -3718,12 +3732,12 @@ "%(severalUsers)s nem változtattak semmit": "one" }, "pinned_events": { - "%(oneUser)s módosította a szoba kitűzött üzeneteit": "one", - "%(oneUser)s %(count)s alkalommal módosította a szoba kitűzött üzeneteit": "other" + "one": "%(oneUser)s megváltoztatta a szoba kitűzött üzeneteit", + "other": "%(oneUser)s %(count)s alkalommal megváltoztatta a szoba kitűzött üzeneteit" }, "pinned_events_multiple": { - "%(severalUsers)s módosította a szoba kitűzött üzeneteit": "one", - "%(severalUsers)s %(count)s alkalommal módosította a szoba kitűzött üzeneteit": "other" + "one": "%(severalUsers)s megváltoztatta a szoba kitűzött üzeneteit", + "other": "%(severalUsers)s %(count)s alkalommal megváltoztatta a szoba kitűzött üzeneteit" }, "redacted": { "%(oneUser)s üzenetet törölt": "one", @@ -3769,8 +3783,8 @@ "thread_info_basic": "Az üzenetszálból", "typing_indicator": { "more_users": { - "%(names)s és még %(count)s felhasználó gépel…": "other", - "%(names)s és még valaki gépel…": "one" + "one": "%(names)s és még valaki gépel…", + "other": "%(names)s és még %(count)s felhasználó gépel…" }, "one_user": "%(displayName)s gépel…", "two_users": "%(names)s és %(lastPerson)s gépelnek…" @@ -3931,6 +3945,7 @@ "connection_lost": "Megszakadt a kapcsolat a kiszolgálóval", "connection_lost_description": "Nem kezdeményezhet hívást a kiszolgálóval való kapcsolat nélkül.", "consulting": "Egyeztetés vele: %(transferTarget)s. Átadás ide: %(transferee)s", + "decline_call": "Elutasítás", "default_device": "Alapértelmezett eszköz", "dial": "Tárcsázás", "dialpad": "Tárcsázó", @@ -3981,6 +3996,7 @@ "show_sidebar_button": "Oldalsáv megjelenítése", "silence": "Hívás némítása", "silenced": "Értesítések némítva", + "skip_lobby_toggle_option": "Csatlakozás azonnal", "start_screenshare": "Képernyőmegosztás bekapcsolása", "stop_screenshare": "Képernyőmegosztás kikapcsolása", "too_many_calls": "Túl sok hívás", diff --git a/src/i18n/strings/hy.json b/src/i18n/strings/hy.json new file mode 100644 index 0000000000..828ed08a0b --- /dev/null +++ b/src/i18n/strings/hy.json @@ -0,0 +1,4173 @@ +{ + "a11y": { + "emoji_picker": "Էմոջիների ընտրիչ", + "jump_first_invite": "Անցնել առաջին հրավերին:", + "message_composer": "Հաղորդագրություն կազմող", + "n_unread_messages": { + "one": "1 չկարդացված հաղորդագրություն:", + "other": "%(count)s չկարդացված հաղորդագրություններ:" + }, + "n_unread_messages_mentions": { + "one": "1 չկարդացված հիշատակում:", + "other": "%(count)s չկարդացված հաղորդագրություններ, ներառյալ հիշատակումները։" + }, + "recent_rooms": "Վերջին սենյակները", + "room_messsage_not_sent": "Բացել %(roomName)s սենյակը՝ չուղարկված հաղորդագրությամբ", + "room_n_unread_invite": "Բացել %(roomName)s սենյակի հրավերը", + "room_n_unread_messages": { + "one": "Բացել %(roomName)s սենյակը՝ 1 չկարդացած հաղորդագրությամբ", + "other": "Բացել %(roomName)s սենյակը՝ %(count)s չկարդացած հաղորդագրություններով" + }, + "room_n_unread_messages_mentions": { + "one": "Բացել %(roomName)s սենյակը՝ 1 չկարդացած հիշեցմամբ", + "other": "Բացել %(roomName)s սենյակը՝ %(count)s չկարդացած հաղորդագրություններով, ներառյալ հիշեցումները" + }, + "room_name": "Սենյակ %(name)s", + "room_status_bar": "Սենյակի կարգավիճակի գոտի/վահանակ", + "seek_bar_label": "Աուդիո որոնման գոտի", + "unread_messages": "Չկարդացված հաղորդագրություններ։", + "user_menu": "Օգտվողի մենյու" + }, + "a11y_jump_first_unread_room": "Անցնել առաջին չկարդացած սենյակ:", + "action": { + "accept": "Ընդունել", + "add": "Ավելացնել", + "add_existing_room": "Ավելացնել գոյություն ունեցող սենյակ", + "add_people": "Ավելացնել մարդկանց", + "apply": "Կիրառել", + "approve": "Հաստատել", + "ask_to_join": "Խնդրել միանալ", + "back": "Վերադառնալ", + "call": "Զանգահարել", + "cancel": "Չեղարկել", + "change": "Փոփոխություն", + "clear": "Մաքրել", + "click": "Սեղմել", + "click_to_copy": "Սեղմեք՝ պատճենելու համար", + "close": "Փակել", + "collapse": "Կոծկել", + "complete": "Վերջացնել", + "confirm": "Հաստատել", + "continue": "Շարունակել", + "copy": "Պատճենել", + "copy_link": "Պատճենել հղումը", + "create": "Ստեղծել", + "create_a_room": "Ստեղծել սենյակ", + "create_account": "Ստեղծել հաշիվ", + "decline": "Մերժել", + "decline_and_block": "Մերժել և արգելափակել", + "decline_invite": "Մերժել հրավերը", + "delete": "Ջնջել", + "deny": "Մերժել", + "disable": "Անջատել", + "disconnect": "Անջատել", + "dismiss": "Հեռացնել", + "done": "Կատարված է", + "download": "Ներբեռնել", + "edit": "Խմբագրել", + "enable": "Միացնել", + "enter_fullscreen": "Մուտք գործել լիաէկրան ռեժիմ", + "exit_fullscreeen": "Ելք լիաէկրան ռեժիմից", + "expand": "Ընդլայնել", + "explore_public_rooms": "Ուսումնասիրել հասարակական սենյակները", + "explore_rooms": "Փնտրել սենյակներ", + "export": "Արտահանել", + "forward": "Առաջ", + "go": "Գնալ", + "go_back": "Վերադառնալ", + "got_it": "Հասկացա", + "hide": "Թաքցնել", + "hide_advanced": "Թաքցնել ընդլայնվածները", + "hold": "Պահել", + "ignore": "Անտեսել", + "import": "Ներմուծել", + "invite": "Հրավիրել", + "invite_to_space": "Հրավիրել տարածք", + "invites_list": "Հրավիրում է", + "join": "Միանալ", + "learn_more": "Իմանալ ավելին", + "leave": "Հեռանալ", + "leave_room": "Դուրս գալ սենյակից", + "logout": "Ելք", + "manage": "Կառավարել", + "maximise": "Առավելագույնի հասցնել", + "mention": "Նշել", + "minimise": "Նվազագույնի հասցնել", + "new_room": "Նոր սենյակ", + "new_video_room": "Նոր վիդեո սենյակ", + "next": "Հաջորդ", + "no": "Ոչ", + "ok": "Լավ", + "open": "Բաց(ել)", + "open_menu": "Բացել ընտրացանկը", + "pause": "Դադար", + "pin": "Քորոց", + "play": "Միացնել", + "proceed": "Շարունակել", + "quote": "Մեջբերում", + "react": "Արձագանքել", + "refresh": "Թարմացնել", + "register": "Գրանցվել", + "reload": "Վերբեռնել", + "remove": "Հեռացնել", + "rename": "Վերանվանել", + "reply": "Պատասխանել", + "reply_in_thread": "Պատասխանել թեմայում", + "report_content": "Հաղորդել բովանդակության մասին", + "report_room": "Տեղեկացնել/բողոքել սենյակի մասին", + "resend": "Վերաուղարկել", + "reset": "Վերականգնել", + "resume": "Վերսկսել", + "retry": "Կրկին փորձեք", + "review": "Վերանայել", + "revoke": "Չեղարկել", + "save": "Պահպանել", + "search": "Որոնել", + "send_report": "Ուղարկել զեկույցը", + "set_avatar": "Սահմանել պրոֆիլի նկար", + "share": "Կիսվել", + "show": "Ցույց տալ", + "show_advanced": "Ցույց տալ ընդլայնվածները", + "show_all": "Ցույց տալ բոլորը", + "sign_in": "Մուտք գործել", + "sign_out": "Դուրս գալ", + "skip": "Բաց թողնել", + "start": "Սկսել", + "start_chat": "Սկսել զրույցը", + "start_new_chat": "Սկսել նոր զրույց", + "stop": "Դադարեցնել", + "submit": "Հաստատել", + "subscribe": "Բաժանորդագրվել", + "transfer": "Փոխանցում", + "trust": "Վստահություն", + "try_again": "Կրկին փորձել", + "unban": "Ապաալգելափակել", + "unignore": "Չեղարկել անտեսումը", + "unpin": "Ապաամրացնել", + "unsubscribe": "Հրաժարվել բաժանորդագրությունից", + "update": "Թարմացնել", + "upgrade": "Թարմացնել", + "upload": "Վերբեռնել", + "upload_file": "Վերբեռնել ֆայլ", + "verify": "Ստուգել", + "view": "Դիտել", + "view_all": "Դիտել բոլորը", + "view_list": "Դիտել ցուցակը", + "view_message": "Դիտել հաղորդագրությունը", + "view_source": "Դիտել աղբյուրը", + "yes": "Այո", + "yes_dismiss": "Այո, փակել", + "zoom_in": "Մեծացնել", + "zoom_out": "Փոքրացնել" + }, + "analytics": { + "accept_button": "Լավ է", + "bullet_1": "Մենք չենք արձանագրում կամ պրոֆիլավորում հաշվի որևէ տվյալ", + "bullet_2": "Մենք չենք կիսվում տվյալներով երրորդ անձանց հետ", + "consent_migration": "Դուք նախկինում համաձայնություն եք տվել մեզ հետ անանուն օգտագործման տվյալներով կիսվելու համար։ Մենք թարմացնում ենք դրա աշխատանքի սկզբունքը։", + "disable_prompt": "Դուք կարող եք անջատել սա ցանկացած պահի կարգավորումներում", + "enable_prompt": "Օգնեք բարելավել %(analyticsOwner)s", + "learn_more": "Կիսվեք անանուն տվյալներով, որոնք կօգնեն մեզ բացահայտել խնդիրները: Ոչ մի անձնական բան։ Ոչ մի երրորդ կողմ։ Իմանալ ավելին", + "privacy_policy": "Մեր բոլոր պայմանները կարող եք կարդալ այստեղ ", + "pseudonymous_usage_data": "Օգնեք մեզ բացահայտել խնդիրները եւ բարելավել %(analyticsOwner)s՝ կիսվելով անանուն օգտագործման տվյալներով: Հասկանալու համար, թե ինչպես են մարդիկ օգտագործում մի քանի սարքեր, մենք կստեղծենք պատահական նույնացուցիչ, որը կիսվում է ձեր սարքերի կողմից:", + "shared_data_heading": "Հետևյալ տվյալներից ցանկացած մեկը կարող է տարածվել." + }, + "auth": { + "3pid_in_use": "Այդ էլեկտրոնային փոստի հասցեն կամ հեռախոսահամարն արդեն օգտագործվում է։", + "account_clash": "Ձեր նոր հաշիվը (%(newAccountId)s ) գրանցված է, բայց դուք արդեն մուտք եք գործել այլ հաշիվ (%(loggedInUserId)s )։", + "account_clash_previous_account": "Շարունակել նախորդ հաշվով", + "account_deactivated": "Այս հաշիվը ապաակտիվացված է:", + "autodiscovery_generic_failure": "Չհաջողվեց սերվերից ստանալ ավտոմատ հայտնաբերման կարգավորումը", + "autodiscovery_hs_incompatible": "Ձեր սերվերը չափազանց հին է և չի աջակցում պահանջվող API-ի նվազագույն տարբերակը: Խնդրում ենք կապվել ձեր սերվերի սեփականատիրոջ հետ կամ թարմացնել այն:", + "autodiscovery_invalid": "Սերվերի հայտնաբերման անվավեր պատասխան", + "autodiscovery_invalid_hs": "Homeserver-ի URL-ը, կարծես թե, վավեր Matrix homeserver չէ։", + "autodiscovery_invalid_hs_base_url": "Անվավեր base_url m.homeserver-ի համար", + "autodiscovery_invalid_is": "Նույնականացման սերվերի URL-ը, կարծես թե, վավեր նույնականացման սերվեր չէ", + "autodiscovery_invalid_is_base_url": "Անվավեր base_url m.identificty_server-ի համար", + "autodiscovery_invalid_is_response": "Անվավեր նույնականացման սերվերի հայտնաբերման պատասխան", + "autodiscovery_invalid_json": "Չաշխատող JSON", + "autodiscovery_no_well_known": ".well-known JSON ֆայլ չի գտնվել", + "autodiscovery_unexpected_error_hs": "Անսպասելի սխալ՝ homeserver-ի կարգավորումները ստուգելու ժամանակ", + "autodiscovery_unexpected_error_is": "Անսպասելի սխալ՝ ինքնության սերվերի կարգավորումները ստուգելիս", + "captcha_description": "Այս սերվերը ցանկանում է համոզվել, որ դուք ռոբոտ չեք։", + "change_password_action": "Փոխել գաղտնաբառը", + "change_password_confirm_invalid": "Գաղտնաբառերը չեն համընկնում", + "change_password_confirm_label": "Հաստատեք գաղտնաբառը", + "change_password_current_label": "Ընթացիկ գաղտնաբառը", + "change_password_empty": "Գաղտնաբառերը չեն կարող դատարկ լինել", + "change_password_error": "Գաղտնաբառը փոխելիս սխալ առաջացավ. %(error)s", + "change_password_mismatch": "Նոր գաղտնաբառերը չեն համընկնում", + "change_password_new_label": "Նոր գաղտնաբառ", + "check_email_explainer": "Հետևեք %(email)s էլ․փոստի հասցեին ուղարկված հրահանգներին", + "check_email_resend_prompt": "Չե՞ք ստացել այն։", + "check_email_resend_tooltip": "Հաստատման հղման էլ. նամակը վերստին ուղարկվեց։", + "check_email_wrong_email_button": "Կրկին մուտքագրեք էլ․ հասցեն", + "check_email_wrong_email_prompt": "Սխա՞լ էլ․ հասցե է։", + "continue_with_idp": "Շարունակել %(provider)s-ի հետ", + "continue_with_sso": "Շարունակել %(ssoButtons)s-ով", + "country_dropdown": "Երկրի ցանկ", + "create_account_prompt": "Նորեկ եք այստեղ՞։ Ստեղծեք հաշիվ", + "create_account_title": "Ստեղծել հաշիվ", + "email_discovery_text": "Օգտագործեք էլ․ փոստը՝ առկա կոնտակտների կողմից հայտնաբերելի լինելու համար։", + "email_field_label": "Էլ․ փոստ", + "email_field_label_invalid": "Չի համապատասխանում վավեր էլեկտրոնային հասցեին", + "email_field_label_required": "Մուտքագրեք էլ․ հասցե", + "email_help_text": "Ավելացրեք էլ.փոստ, որպեսզի կարողանաք վերականգնել ձեր գաղտնաբառը:", + "email_phone_discovery_text": "Օգտագործեք էլ. փոստ կամ հեռախոս՝ առկա կոնտակտների կողմից հայտնաբերելի լինելու համար։", + "enter_email_explainer": "%(homeserver)s կուղարկի ձեզ հաստատման հղում՝ գաղտնաբառը վերականգնելու համար։", + "enter_email_heading": "Մուտքագրեք ձեր էլ․ հասցեն՝ գաղտնաբառը վերականգնելու համար", + "failed_connect_identity_server": "Անհնար է կապ հաստատել նույնականացման սերվերի հետ", + "failed_connect_identity_server_other": "Կարող եք մուտք գործել, սակայն որոշ գործառույթներ անհասանելի կլինեն մինչև նույնականացման սերվերը կրկին կմիանա ցանցին։ Եթե շարունակեք տեսնել այս նախազգուշացումը, ստուգեք ձեր կարգավորումները կամ կապվեք սերվերի ադմինիստրատորի հետ։", + "failed_connect_identity_server_register": "Կարող եք գրանցվել, սակայն որոշ գործառույթներ անհասանելի կլինեն մինչև նույնականացման սերվերի նորից միացումը առցանց։ Եթե շարունակեք տեսնել այս նախազգուշացումը, ստուգեք ձեր կարգավորումները կամ կապվեք սերվերի ադմինիստրատորի հետ։", + "failed_connect_identity_server_reset_password": "Դուք կարող եք վերականգնել ձեր գաղտնաբառը, սակայն որոշ գործառույթներ անհասանելի կլինեն մինչև նույնականացման սերվերը կրկին միանա ցանցին։ Եթե շարունակեք տեսնել այս նախազգուշացումը, ստուգեք ձեր կարգավորումները կամ կապվեք սերվերի ադմինիստրատորի հետ։", + "failed_homeserver_discovery": "Սերվերի հայտնաբերումը չհաջողվեց", + "failed_query_registration_methods": "Անհնար է հարցում կատարել գրանցման աջակցվող մեթոդների համար:", + "failed_soft_logout_auth": "Վերստին նույնականացումը չհաջողվեց", + "failed_soft_logout_homeserver": "Վերստին նույնականացումը չհաջողվեց՝ սերվերի խնդրի պատճառով", + "forgot_password_email_invalid": "Էլ․ հասցեն, կարծես թե, վավեր չէ։", + "forgot_password_email_required": "Անհրաժեշտ է մուտքագրել ձեր հաշվին կցված էլեկտրոնային փոստի հասցեն։", + "forgot_password_prompt": "Մոռացե՞լ եք գաղտնաբառը։", + "forgot_password_send_email": "Ուղարկել էլ. նամակ", + "identifier_label": "Մուտք գործել", + "incorrect_credentials": "Սխալ օգտանուն և/կամ գաղտնաբառ։", + "incorrect_credentials_detail": "Խնդրում ենք նկատի ունենալ, որ դուք մուտք եք գործում %(hs)s սերվեր, այլ ոչ թե matrix.org։", + "incorrect_password": "Սխալ գաղտնաբառ", + "log_in_new_account": "Մուտք գործել ձեր նոր հաշիվ։", + "logout_dialog": { + "description": "Իսկապե՞ս ուզում եք դուրս գալ:", + "megolm_export": "Ձեռքով արտահանել բանալիները", + "setup_key_backup_title": "Դուք կկորցնեք հասանելիությունը ձեր ծածկագրված հաղորդագրություններին ", + "setup_secure_backup_description_1": "Գաղտնագրված հաղորդագրությունները պաշտպանված են ծայրից ծայր գաղտնագրմամբ: Միայն դուք և ստացող(ներ)ն ունեք այս հաղորդագրությունները կարդալու բանալիները:", + "setup_secure_backup_description_2": "Երբ դուք դուրս գաք, այս բանալիները կջնջվեն այս սարքից, ինչը նշանակում է, որ դուք չեք կարողանա կարդալ գաղտնագրված հաղորդագրությունները, եթե դրանց բանալիները չունեք ձեր մյուս սարքերի վրա կամ դրանք պահուստավորած չեն սերվերում։", + "skip_key_backup": "Ես չեմ ուզում, որ իմ գաղտնագրված հաղորդագրությունները" + }, + "misconfigured_body": "Խնդրեք ձեր %(brand)s ադմինիստրատորին ստուգել ձեր կարգավորումը սխալ կամ կրկնվող գրառումների առկայության համար։", + "misconfigured_title": "Ձեր %(brand)s-ը սխալ է կարգավորված", + "mobile_create_account_title": "Դուք պատրաստվում եք ստեղծել հաշիվ %(hsName)s-ում։", + "msisdn_field_description": "Այլ օգտատերեր կարող են հրավիրել ձեզ սենյակներ՝ օգտագործելով ձեր կոնտակտային տվյալները", + "msisdn_field_label": "Հեռախոս", + "msisdn_field_number_invalid": "Այդ հեռախոսահամարը այնքան էլ ճիշտ տեսք չունի, խնդրում ենք ստուգել և նորից փորձել", + "msisdn_field_required_invalid": "Մուտքագրեք հեռախոսահամար", + "no_hs_url_provided": "Ոչ մի homeserver URL չի տրամադրվել", + "oidc": { + "error_title": "Մենք չկարողացանք մուտքագրել ձեզ", + "generic_auth_error": "Նույնականացման ընթացքում ինչոր սխալ է տեղի ունեցել: Անցեք մուտքի էջ և կրկին փորձեք:", + "missing_or_invalid_stored_state": "Մենք խնդրեցինք զննարկիչին հիշել, թե որ սերվերն եք օգտագործում մուտք գործելու համար, բայց, ցավոք, ձեր զննարկիչը մոռացել է այն։ Անցեք մուտքի էջ և փորձեք կրկին։" + }, + "password_field_keep_going_prompt": "Շարունակեք…", + "password_field_label": "Մուտքագրեք գաղտնաբառը", + "password_field_strong_label": "Գեղեցիկ, ուժեղ գաղտնաբառ!", + "password_field_weak_label": "Գաղտնաբառը թույլատրված է, բայց անվտանգ չէ", + "phone_label": "Հեռախոս", + "phone_optional_label": "Հեռախոս (ըստ ցանկության)", + "qr_code_login": { + "check_code_explainer": "Սա կհաստատի, որ ձեր մյուս սարքի հետ կապն անվտանգ է։", + "check_code_heading": "Մուտքագրեք ձեր մյուս սարքի էկրանին ցուցադրված համարը", + "check_code_input_label": "2-նիշանոց կոդ", + "check_code_mismatch": "Թվերը չեն համընկնում", + "completing_setup": "Ձեր նոր սարքի կարգավորումն ավարտվում է", + "error_etag_missing": "Անսպասելի սխալ տեղի ունեցավ։ Սա կարող է պայմանավորված լինել զննարկիչի ընդլայնմամբ, պրոքսի սերվերով կամ սերվերի սխալ կարգավորմամբ։", + "error_expired": "Մուտք գործելու ժամկետը լրացել է։ Խնդրում ենք կրկին փորձել։", + "error_expired_title": "Մուտք գործելը ժամանակին չի ավարտվել", + "error_insecure_channel_detected": "Չհաջողվեց ստեղծել անվտանգ կապ նոր սարքի հետ։ Ձեր մնացած սարքերը մնում են ապահով, անհանգստանալու անհրաժեշտություն չկա։", + "error_insecure_channel_detected_instructions": "Հիմա ի՞նչ", + "error_insecure_channel_detected_instructions_1": "Կրկին փորձեք մուտք գործել մյուս սարքում QR կոդի միջոցով՝ հավանաբար խնդիրը կապված էր ցանցի հետ։", + "error_insecure_channel_detected_instructions_2": "Եթե կրկին հանդիպեք նույն խնդրին, միացեք ուրիշ Wi-Fi ցանցի կամ Wi-Fi-ի փոխարեն օգտագործեք բջջային ինտերնետ։", + "error_insecure_channel_detected_instructions_3": "Եթե դա չի աշխատում, մուտք գործեք ձեռքով", + "error_insecure_channel_detected_title": "Կապը անվտանգ չէ", + "error_other_device_already_signed_in": "Այլ բան անելու կարիք չկա։", + "error_other_device_already_signed_in_title": "Ձեր մյուս սարքն արդեն մուտք է գործել", + "error_rate_limited": "Կարճ ժամանակում չափազանց շատ փորձեր։ Սպասեք որոշ ժամանակ, նախքան կրկին փորձելը։", + "error_unexpected": "Տեղի է ունեցել անսպասելի սխալ: Ձեր մյուս սարքը կապակցելու հարցումը չեղարկվել է:", + "error_unsupported_protocol": "Այս սարքը չի աջակցում QR կոդով մյուս սարք մուտք գործելը։", + "error_unsupported_protocol_title": "Այլ/մյուս սարքը համատեղելի չէ", + "error_user_cancelled": "Մուտքը չեղարկվել է մյուս սարքի վրա։", + "error_user_cancelled_title": "Մուտք գործելու հարցումը չեղարկվել է", + "error_user_declined": "Դուք կամ հաշվի մատակարարը(պրովայդեր) մերժել է մուտք գործելու հարցումը։", + "error_user_declined_title": "Մուտքը մերժվեց", + "follow_remaining_instructions": "Հետևեք մնացած հրահանգներին", + "open_element_other_device": "Բացեք %(brand)s-ը ձեր մյուս սարքի վրա", + "point_the_camera": "Սկանավորեք այստեղ ցուցադրված QR կոդը", + "scan_code_instruction": "Սկանավորեք QR կոդը մեկ այլ սարքով", + "scan_qr_code": "Մուտք գործեք QR կոդով", + "security_code": "Անվտանգության կոդ", + "security_code_prompt": "Եթե պահանջվի, մուտքագրեք ստորև նշված կոդը ձեր մյուս սարքում։", + "select_qr_code": "Ընտրեք “%(scanQRCode)s”", + "unsupported_explainer": "Ձեր հաշվի մատակարարը չի աջակցում նոր սարքում QR կոդով մուտք գործելուն։", + "unsupported_heading": "QR կոդը չի աջակցվում", + "waiting_for_device": "Սպասում է սարքի մուտքին" + }, + "register_action": "Ստեղծել օգտահաշիվ", + "registration": { + "continue_without_email_description": "Պարզապես զգուշացում, եթե չավելացնեք էլ․ հասցե և մոռանաք ձեր գաղտնաբառը, կարող եք ընդմիշտ կորցնել մուտքը ձեր հաշվին .", + "continue_without_email_field_label": "Էլ․ փոստ (ըստ ցանկության)", + "continue_without_email_title": "Շարունակել առանց էլեկտրոնային փոստի" + }, + "registration_disabled": "Գրանցումը անջատված է այս սերվերի վրա։", + "registration_msisdn_field_required_invalid": "Մուտքագրեք հեռախոսահամարը (պարտադիր է այս սերվերի վրա)", + "registration_successful": "Գրանցումը հաջողվեց", + "registration_username_in_use": "Այդ օգտանունն արդեն ինչ-որ մեկն օգտագործում է։ Փորձեք մեկ այլ անուն, կամ եթե դա դուք եք, մուտք գործեք ստորև։", + "registration_username_unable_check": "Հնարավոր չէ ստուգել, թե արդյոք օգտատիրոջ անունը զբաղված է։ Փորձեք կրկին ավելի ուշ։", + "registration_username_validation": "Օգտագործեք միայն փոքրատառեր, թվեր, գծիկներ և ընդգծման նշաններ", + "reset_password": { + "confirm_new_password": "Հաստատեք նոր գաղտնաբառը", + "devices_logout_success": "Դուք դուրս եք եկել բոլոր սարքերից և այլևս չեք ստանա push ծանուցումներ: Ծանուցումները նորից միացնելու համար կրկին մուտք գործեք յուրաքանչյուր սարքից:", + "other_devices_logout_warning_1": "Ձեր սարքերից դուրս գալը կջնջի դրանց վրա պահված հաղորդագրությունների գաղտնագրված բանալիները, ինչը գաղտնագրված զրույցի պատմությունը կդարձնի անընթեռնելի։", + "other_devices_logout_warning_2": "Եթե ցանկանում եք պահպանել ձեր զրույցի պատմության հասանելիությունը գաղտնագրված սենյակներում, ստեղծեք Key Backup կամ արտահանեք ձեր հաղորդագրության բանալիները ձեր այլ սարքերից մեկից, նախքան շարունակելը:", + "password_not_entered": "Պետք է մուտքագրվի նոր գաղտնաբառ։", + "passwords_mismatch": "Նոր գաղտնաբառերը պետք է համընկնեն միմյանց հետ։", + "rate_limit_error": "Կարճ ժամանակում չափազանց շատ փորձեր։ Սպասեք որոշ ժամանակ, նախքան կրկին փորձելը։", + "rate_limit_error_with_time": "Կարճ ժամանակում չափազանց շատ փորձեր։ Կրկին փորձեք %(timeout)s անց։", + "reset_successful": "Ձեր գաղտնաբառը վերականգնվել է:", + "return_to_login": "Վերադառնալ մուտքի էկրանին", + "sign_out_other_devices": "Դուրս գալ բոլոր սարքերից" + }, + "reset_password_action": "Վերականգնել գաղտնաբառը", + "reset_password_button": "Մոռացել եք գաղտնաբառը", + "reset_password_email_field_description": "Օգտագործեք էլ․ հասցե՝ ձեր հաշիվը վերականգնելու համար", + "reset_password_email_field_required_invalid": "Մուտքագրեք էլ.փոստի հասցեն (պարտադիր է այս սերվերի վրա)", + "reset_password_email_not_associated": "Ձեր էլ. փոստի հասցեն, կարծես թե, կապված չէ տնային սերվերի Matrix ID-ի հետ։", + "reset_password_email_not_found_title": "Այս էլ.փոստի հասցեն չի գտնվել", + "reset_password_title": "Վերականգնել Ձեր գաղտնաբառը", + "server_picker_custom": "Այլ homeserver", + "server_picker_description": "Դուք կարող եք օգտագործել սերվերի հատուկ տարբերակները՝ այլ Matrix սերվերներ մուտք գործելու համար՝ նշելով այլ սերվերի URL-ը: Սա թույլ է տալիս օգտագործել %(brand)s-ը առկա Matrix հաշվի հետ՝ այլ սերվերի վրա։", + "server_picker_description_matrix.org": "Միացեք միլիոնավորներին անվճար ամենամեծ հանրային սերվերում", + "server_picker_dialog_title": "Որոշեք, թե որտեղ է տեղակայված ձեր հաշիվը", + "server_picker_explainer": "Օգտագործեք ձեր նախընտրած Matrix homeserver-ը, եթե ունեք, կամ ստեղծեք/տեղադրեք ձեր սեփականը։", + "server_picker_failed_validate_homeserver": "Հնարավոր չէ վավերացնել սերվերը", + "server_picker_intro": "Այն վայրերը, որտեղ կարող եք տեղակայել ձեր հաշիվը, մենք անվանում ենք «homeservers»՝ գլխավոր սերվերներ։", + "server_picker_invalid_url": "Անվավեր URL", + "server_picker_learn_more": "Գլխավոր սերվերների(homeserver) մասին", + "server_picker_matrix.org": "Matrix.org-ը աշխարհի ամենամեծ հանրային սերվերն է, ուստի այն լավ վայր է շատերի համար։", + "server_picker_required": "Նշե սերվեր", + "server_picker_title": "Մուտք գործեք ձեր գլխավոր սերվեր", + "server_picker_title_default": "Սերվերի ընտրանքներ", + "server_picker_title_registration": "Հյուրընկալող հաշիվը միացված է", + "session_logged_out_description": "Անվտանգության նկատառումներից ելնելով՝ այս սեսիայից դուրս եք եկել։ Խնդրում ենք կրկին մուտք գործել։", + "session_logged_out_title": "Դուրս է եկել", + "set_email": { + "description": "Սա թույլ կտա վերականգնել ձեր գաղտնաբառը եւ ստանալ ծանուցումներ:", + "verification_pending_description": "Խնդրում ենք ստուգել ձեր էլ. փոստը և սեղմել դրա մեջ պարունակվող հղման վրա: Դրանից հետո սեղմեք «Շարունակել»:", + "verification_pending_title": "Հաստատումը սպասվում է" + }, + "set_email_prompt": "Ցանկանո՞ւմ եք սահմանել էլ-փոստի հասցե:", + "sign_in_description": "Օգտագործեք ձեր հաշիվը՝ շարունակելու համար։", + "sign_in_instead": "Փոխարենը մուտք գործել", + "sign_in_instead_prompt": "Արդեն ունե՞ք հաշիվ։ Մուտք գործեք այստեղ", + "sign_in_or_register": "Մուտք գործել կամ ստեղծել հաշիվ", + "sign_in_or_register_description": "Շարունակելու համար օգտագործեք ձեր հաշիվը կամ ստեղծեք նորը։", + "sign_in_prompt": "Ունե՞ք հաշիվ: Մուտք գործեք", + "sign_in_with_sso": "Մուտք գործեք միասնական մուտքի միջոցով", + "signing_in": "Մուտք գործում...", + "soft_logout": { + "clear_data_button": "Մաքրել բոլոր տվյալները", + "clear_data_description": "Այս սեսիայից բոլոր տվյալների մաքրումը մշտական է: Գաղտնագրված հաղորդագրությունները կկորչեն, եթե դրանց բանալիները պահուստավորված չեն:", + "clear_data_title": "Մաքրե՞լ այս սեսիայի բոլոր տվյալները։" + }, + "soft_logout_heading": "Դուք դուրս եք եկել հաշվից", + "soft_logout_intro_password": "Մուտքագրեք ձեր գաղտնաբառը՝ մուտք գործելու և ձեր հաշվին մուտքը վերականգնելու համար։", + "soft_logout_intro_sso": "Մուտք գործեք և վերականգնեք մուտքը ձեր հաշվին:", + "soft_logout_intro_unsupported_auth": "Դուք չեք կարող մուտք գործել ձեր հաշիվ։ Լրացուցիչ տեղեկությունների համար կապվեք ձեր սերվերի ադմինիստրատորի հետ։", + "soft_logout_subheading": "Մաքրել անձնական տվյալները", + "soft_logout_warning": "Զգուշացում. Ձեր անձնական տվյալները (ներառյալ գաղտնագրված բանալիները) դեռևս պահվում են այս սեսիայում: Մաքրեք դրանք, եթե ավարտել եք այս սեսիայի օգտագործումը կամ ցանկանում եք մուտք գործել մեկ այլ հաշիվ:", + "sso": "Single Sign On", + "sso_complete_in_browser_dialog_title": "Մուտք գործեք ձեր զննարկիչ՝ մուտքն ավարտելու համար", + "sso_failed_missing_storage": "Մենք \"խնդրեցինք\" զննարկիչին հիշել, թե որ homeserver-ն եք օգտագործում մուտք գործելու համար, բայց, ցավոք, ձեր զննարկիչը մոռացել է այն։ Անցեք մուտքի էջ և փորձեք կրկին։", + "sso_or_username_password": "%(ssoButtons)s կամ %(usernamePassword)s", + "sync_footer_subtitle": "Եթե դուք միացել եք շատ սենյակների, դա կարող է որոշ ժամանակ պահանջել", + "syncing": "Համաժամեցվում է…", + "uia": { + "code": "Կոդը", + "email": "Ձեր հաշիվը ստեղծելու համար բացեք այն հղումը, որը մենք հենց նոր ուղարկեցինք %(emailAddress)s հասցեին:", + "email_auth_header": "Ստուգեք ձեր էլ. փոստը՝ շարունակելու համար", + "email_resend_prompt": "Չե՞ք ստացել այն։ Վերուղարկել այն", + "email_resent": "Վերաուղարկվել է", + "fallback_button": "Սկսել նույնականացումը", + "mas_cross_signing_reset_cta": "Անցնել հաշվին", + "mas_cross_signing_reset_description": "Դուք պատրաստվում եք անցնել ձեր %(serverName)s հաշիվ՝ ձեր ինքնությունը վերականգնելու համար։ Երբ ավարտեք վերականգնումը ձեր հաշվից, վերադարձեք այստեղ և սեղմեք «Կրկին փորձել»։", + "mas_cross_signing_reset_title": "Մուտք գործեք ձեր հաշիվ՝ ձեր ինքնությունը վերակայելու համար", + "msisdn": "Տեքստային հաղորդագրություն է ուղարկվել հետևյալ հասցեին՝ %(msisdn)s", + "msisdn_token_incorrect": "Թոքենը սխալ է", + "msisdn_token_prompt": "Խնդրում ենք մուտքագրել դրա մեջ պարունակվող կոդը.", + "password_prompt": "Հաստատեք Ձեր ինքնությունը՝ մուտքագրելով Ձեր հաշվի գաղտնաբառը ստորև:", + "recaptcha_missing_params": "Գլխավոր սերվերի(homeserver) կարգավորումներում captcha հանրային բանալին բացակայում է: Խնդրում ենք տեղեկացնել դրա մասին ձեր homeserver ադմինիստրատորին:", + "registration_token_label": "Գրանցման տոկեն", + "registration_token_prompt": "Մուտքագրեք տնային սերվերի ադմինիստրատորի կողմից տրամադրված գրանցման տոկենը։", + "sso_body": "Հաստատեք այս էլ․ հասցեի ավելացումը՝ օգտագործելով Single Sign On-ը՝ ձեր ինքնությունը հաստատելու համար։", + "sso_failed": "Ինչ-որ բան սխալ է գնացել ձեր ինքնությունը հաստատելու հարցում: Չեղարկեք և փորձեք նորից:", + "sso_postauth_body": "Սեղմեք ներքևում գտնվող կոճակը՝ ձեր ինքնությունը հաստատելու համար:", + "sso_postauth_title": "Հաստատեք՝ շարունակելու համար", + "sso_preauth_body": "Շարունակելու համար օգտագործեք Single Sign On-ը՝ ձեր ինքնությունը հաստատելու համար։", + "sso_title": "Շարունակելու համար օգտագործեք Single Sign On-ը(միանգամյա մուտք)", + "terms": "Խնդրում ենք վերանայել և ընդունել այս սերվերի քաղաքականությունը.", + "terms_invalid": "Խնդրում ենք վերանայել եւ ընդունել բոլոր homeserver-ի քաղաքականությունը" + }, + "unsupported_auth": "Այս սերվերը չի առաջարկում մուտքի որևէ հոսք, որոնք աջակցվում են այս ծրագրի կողմից։", + "unsupported_auth_email": "Այս սերվերը չի աջակցում մուտք գործել էլեկտրոնային փոստի հասցեով։", + "unsupported_auth_msisdn": "Այս սերվերը չի աջակցում հեռախոսահամարով նույնականացումը։", + "username_field_required_invalid": "Մուտքագրեք օգտանուն", + "username_in_use": "Այդ օգտանունն արդեն ինչ-որ մեկն օգտագործում է, խնդրում ենք փորձել մեկ ուրիշը։", + "verify_email_explainer": "Մենք պետք է իմանանք, որ դա դուք եք, նախքան ձեր գաղտնաբառը վերականգնելը: Սեղմեք %(email)s-ին մեր ուղարկած էլ. նամակում նշված հղմանը:", + "verify_email_heading": "Ստուգեք ձեր էլ․ հասցեն՝ շարունակելու համար" + }, + "bug_reporting": { + "additional_context": "Եթե լրացուցիչ համատեքստ ​​կա, որը կարող է օգնել խնդրի վերլուծությանը, օրինակ՝ ինչ էիք անում այդ պահին, սենյակների ID-ները, օգտատերերի ID-ները և այլն, խնդրում ենք ներառել այդ տվյալներն այստեղ։", + "before_submitting": "Մենք խորհուրդ ենք տալիս ստեղծել GitHub տոմսակ՝ ձեր զեկույցի վերանայումն ապահովելու համար։", + "collecting_information": "Հավելվածի տարբերակի տեղեկատվության հավաքում", + "collecting_logs": "Գրանցամատյանների(logs) հավաքում", + "create_new_issue": "Խնդրում ենք ստեղծել նոր տոմսակ GitHub-ում, որպեսզի կարողանանք ուսումնասիրել այս սխալը։", + "description": "Վրիպազերծման գրանցամատյանները(debug logs) պարունակում են ծրագրի օգտագործման տվյալներ, ներառյալ ձեր օգտատիրոջ անունը, ձեր այցելած սենյակների ID-ները կամ կեղծանունները, վերջին անգամ օգտագործողի ինտերֆեյսի որ տարրերի հետ եք փոխազդել և այլ օգտատերերի օգտատիրոջ անունները: Դրանք չեն պարունակում որևէ հաղորդագրություններ:", + "download_logs": "Ներբեռնել գրանցամատյանները", + "downloading_logs": "Գրանցամատյանների(logs) ներբեռնում", + "error_empty": "Խնդրում ենք պատմել մեզ, թե ինչ սխալ է տեղի ունեցել կամ, ավելի լավ՝ ստեղծել GitHub տոմսակ, որը նկարագրում է խնդիրը։", + "failed_download_logs": "Չհաջողվեց ներբեռնել վրիպազերծման մատյանները(debug logs)․ ", + "failed_send_logs_causes": { + "disallowed_app": "Ձեր սխալի մասին զեկույցը(bug report) մերժվել է։ Rageshake սերվերը չի աջակցում այս հավելվածին։", + "rejected_generic": "Ձեր սխալի մասին զեկույցը(bug report) մերժվել է։ Rageshake սերվերը մերժեց զեկույցի պարունակությունը` քաղաքականության պատճառով։", + "rejected_recovery_key": "Ձեր սխալի մասին զեկույցը(bug report) մերժվել է անվտանգության նկատառումներից ելնելով, քանի որ այն պարունակում էր վերականգնման բանալի։", + "rejected_version": "Ձեր սխալի մասին զեկույցը(bug report) մերժվել է, քանի որ ձեր հավելվածի տարբերակը չափազանց հին է։", + "server_unknown_error": "Rageshake սերվերը հանդիպեց անհայտ սխալի և չկարողացավ մշակել հաշվետվությունը։", + "unknown_error": "Չհաջողվեց ուղարկել գրանցամատյանները(logs)։" + }, + "github_issue": "GitHub տոմսակ", + "introduction": "Եթե ​​դուք GitHub-ի միջոցով սխալ եք հայտնել, վրիպազերծման գրանցամատյանները(debug logs) կարող են մեզ օգնել գտնել խնդիրը: ", + "log_request": "Ապագայում սա կանխելու համար խնդրում ենք մեզ ուղարկել գրանցամատյաններ(logs):", + "logs_sent": "Գրանցամատյաններն(logs) ուղարկվեցին", + "matrix_security_issue": "Matrix-ի հետ կապված անվտանգության խնդրի մասին հաղորդելու համար, խնդրում ենք կարդալ Matrix.org-ի Անվտանգության բացահայտման քաղաքականությունը:", + "preparing_download": "Պատրաստվում է գրանցամատյանների(logs) ներբեռնում", + "preparing_logs": "Պատրաստվում է տեղեկամատյաններ(logs) ուղարկելուն", + "send_logs": "Ուղարկել տեղեկամատյաններ(logs)", + "submit_debug_logs": "Ուղարկել վրիպազերծման գրանցամատյանները", + "textarea_label": "Նշումներ", + "thank_you": "Շնորհակալություն", + "title": "Սխալների մասին հաղորդում", + "unsupported_browser": "Հիշեցում․ ձեր զննարկիչը չի աջակցվում, ուստի ձեր փորձը կարող է անկանխատեսելի լինել:", + "uploading_logs": "Գրանցամատյանների(logs) վերբեռնում", + "waiting_for_server": "Սպասում ենք սերվերի պատասխանին" + }, + "cannot_invite_without_identity_server": "Հնարավոր չէ օգտատիրոջը էլ. փոստով հրավիրել առանց նույնականացման սերվերի։ Դուք կարող եք միանալ դրան «Կարգավորումներ» բաժնում։", + "cannot_reach_homeserver": "Հնարավոր չէ կապ հաստատել սերվերի հետ", + "cannot_reach_homeserver_detail": "Համոզվեք, որ ունեք կայուն ինտերնետային կապ կամ կապվեք սերվերի ադմինիստրատորի հետ", + "cant_load_page": "Չհաջողվեց բեռնել էջը", + "chat_card_back_action_label": "Վերադառնալ զրույցին", + "chat_effects": { + "confetti_description": "Ուղարկում է տրված հաղորդագրությունը կոնֆետտիով", + "confetti_message": "ուղարկում է կոնֆետտի", + "fireworks_description": "Ուղարկում է տվյալ հաղորդագրությունը հրավառությամբ", + "fireworks_message": "ուղարկում է հրավառություն", + "hearts_description": "Ուղարկում է տրված հաղորդագրությունը սրտերով", + "hearts_message": "ուղարկում է սրտեր", + "rainfall_description": "Ուղարկում է տվյալ հաղորդագրությունը անձրևներով", + "rainfall_message": "ուղարկում է անձրև", + "snowfall_description": "Ուղարկում է տվյալ հաղորդագրությունը ձնաբքի հետ", + "snowfall_message": "ուղարկում է ձյուն", + "spaceinvaders_description": "Ուղարկում է տվյալ հաղորդագրությունը տիեզերական թեմատիկ էֆեկտով", + "spaceinvaders_message": "ուղարկում է space invaders 👾" + }, + "common": { + "access_token": "Մուտքի նշան", + "accessibility": "Մատչելիություն", + "advanced": "Ընդլայնված", + "all_chats": "Բոլոր զրույցները", + "analytics": "Վերլուծություն", + "and_n_others": { + "one": "և մեկ այլ...", + "other": "և %(count)s ուրիշներ..." + }, + "appearance": "Արտաքին տեսք", + "application": "Հավելված", + "are_you_sure": "Վստա՞հ եք։", + "attachment": "Կցորդ", + "authentication": "Վավերացում", + "avatar": "Ավատար", + "beta": "Բետա", + "camera": "Տեսախցիկ", + "cameras": "Տեսախցիկներ", + "cancel": "Չեղարկել", + "capabilities": "Հնարավորություններ", + "copied": "Պատճենված։", + "credits": "Վարկեր", + "dark": "Մութ", + "description": "Նկարագրություն", + "deselect_all": "Ապընտրել բոլորը", + "device": "Սարք", + "edited": "խմբագրված", + "email_address": "Էլ.փոստի հասցե", + "emoji": "Էմոջի", + "encrypted": "Ծածկագրված", + "encryption_enabled": "Գաղտնագրումը միացված է", + "error": "Սխալ", + "faq": "Հաճախ տրվող հարցեր", + "favourites": "Ընտրյալներ", + "feedback": "Հետադարձ կապ", + "filter_results": "Ֆիլտրի արդյունքները", + "forward_message": "Փոխանցել հաղորդագրությունը", + "general": "Ընդհանուր", + "go_to_settings": "Գնալ դեպի Կարգավորումներ", + "guest": "Հյուր", + "help": "Օգնություն", + "historical": "Պատմական", + "home": "Գլխավոր էջ", + "homeserver": "Գլխավոր սպասարկող", + "identity_server": "Նույնականացման սերվեր", + "image": "Պատկեր", + "integration_manager": "Ինտեգրման մենեջեր", + "joined": "Միացված է", + "labs": "Լաբորատորիաներ", + "legal": "Իրավական", + "light": "Լուսավոր", + "loading": "Բեռնվում է...", + "location": "Գտնվելու վայրը", + "low_priority": "Ցածր առաջնահերթություն", + "matrix": "Matrix", + "message": "Հաղորդագրություն", + "message_layout": "Հաղորդագրության դասավորություն", + "message_timestamp_invalid": "Անվավեր ժամանակային դրոշմանիշ", + "microphone": "Խոսափող", + "model": "Մոդել", + "moderation_and_safety": "Վերահսկողություն և անվտանգություն", + "modern": "Ժամանակակից", + "mute": "Անջատել ձայնը", + "n_members": { + "one": "%(count)s անդամ", + "other": "%(count)s անդամներ" + }, + "n_rooms": { + "one": "%(count)s սենյակ", + "other": "%(count)s սենյակներ" + }, + "name": "Անուն", + "no_results": "Ոչ մի արդյունք", + "no_results_found": "Ոչ մի արդյունք չի գտնվել", + "not_trusted": "Անվստահելի", + "off": "Անջատված է", + "offline": "Անցանց", + "on": "Միացված է", + "options": "Տարբերակներ", + "orphan_rooms": "Այլ սենյակներ", + "password": "Գաղտնաբառ", + "people": "Մարդիկ", + "preferences": "Նախապատվություններ", + "presence": "Ներկայություն", + "preview_message": "Բարև քեզ։ Դու լավագույնն ես։", + "privacy": "Գաղտնիություն", + "private": "Մասնավոր", + "private_room": "Մասնավոր սենյակ", + "private_space": "Մասնավոր տարածք", + "profile": "Պրոֆիլ", + "public": "Հանրային", + "public_room": "Հասարակական սենյակ", + "public_space": "Հանրային տարածք", + "qr_code": "QR կոդ", + "random": "Պատահական", + "reactions": "Արձագանքներ", + "recommended": "Առաջարկվող", + "report_a_bug": "Հաղորդել սխալի մասին", + "room": "Սենյակ", + "room_name": "Սենյակի անունը", + "rooms": "Սենյակներ", + "save": "Պահել", + "saved": "Պահված է", + "saving": "Պահպանվում է…", + "secure_backup": "Անվտանգ պահուստավորում", + "select_all": "Ընտրել բոլորը", + "server": "Սերվեր", + "settings": "Կարգավորումներ", + "setup_secure_messages": "Կարգավորել Անվտանգ Հաղորդագրությունները", + "show_more": "Ցույց տալ ավելին", + "someone": "Ինչոր մեկը", + "space": "Տարածք", + "spaces": "Տարածքներ", + "sticker": "Ստիկեր", + "stickerpack": "Ստիկերների փաթեթ", + "success": "Հաջող", + "suggestions": "Առաջարկներ", + "support": "Աջակցություն", + "system_alerts": "Համակարգի ահազանգեր", + "theme": "Թեմա", + "thread": "Թեմա", + "threads": "Թեմաներ", + "timeline": "Ժամանակացույց", + "unavailable": "անհասանելի", + "unencrypted": "Գաղտնագրված չէ", + "unmute": "Միացնել ձայնը", + "unnamed_room": "Անանուն սենյակ", + "unnamed_space": "Անանուն տարածք", + "unverified": "Չստուգված", + "updating": "Արդիացում...", + "user": "Օգտատեր", + "user_avatar": "Պրոֆիլի նկար", + "username": "Օգտանուն", + "verified": "Ստուգված", + "version": "Տարբերակ", + "video": "Տեսանյութ", + "video_room": "Վիդեո սենյակ", + "view_message": "Դիտել հաղորդագրությունը", + "warning": "Զգուշացում" + }, + "composer": { + "autocomplete": { + "@room_description": "Տեղեկացնել ամբողջ սենյակին", + "command_a11y": "Հրամանի ավտոմատ լրացում", + "command_description": "Հրամաններ", + "emoji_a11y": "Էմոջիների ավտոմատ լրացում", + "notification_a11y": "Ծանուցման ավտոմատ լրացում", + "notification_description": "Սենյակի ծանուցում", + "room_a11y": "Սենյակի ավտոմատ լրացում", + "space_a11y": "Տարածքի ավտոմատ լրացում", + "user_a11y": "Օգտատիրոջ ավտոմատ լրացում", + "user_description": "Օգտատերեր" + }, + "close_sticker_picker": "Թաքցնել ստիկերները", + "edit_composer_label": "Խմբագրել հաղորդագրությունը", + "format_bold": "Թավատառ", + "format_code_block": "Կոդի բլոկ", + "format_decrease_indent": "Ներդրման նվազեցում", + "format_increase_indent": "Ներդրման ավելացում", + "format_inline_code": "Կոդ", + "format_insert_link": "Զետեղել հղում", + "format_italic": "Շեղագիր", + "format_italics": "Շեղատառեր", + "format_link": "Հղում", + "format_ordered_list": "Համարակալված ցանկ", + "format_strikethrough": "Վրագծված", + "format_underline": "Ընդգծված", + "format_unordered_list": "Կետավոր ցուցակ", + "formatting_toolbar_label": "Ձևաչափում(ֆորմատավորում)", + "link_modal": { + "link_field_label": "Հղում", + "text_field_label": "Տեքստ", + "title_create": "Ստեղծել հղում", + "title_edit": "Խմբագրել հղումը" + }, + "mode_plain": "Թաքցնել ձևաչափումը", + "mode_rich_text": "Ցուցադրել ձևաչափումը", + "no_perms_notice": "Դուք այս սենյակում գրառում անելու թույլտվություն չունեք", + "placeholder": "Ուղարկել հաղորդագրություն...", + "placeholder_encrypted": "Ուղարկել գաղտնագրված հաղորդագրություն...", + "placeholder_reply": "Ուղարկել պատասխան…", + "placeholder_reply_encrypted": "Ուղարկել գաղտնագրված պատասխան...", + "placeholder_thread": "Պատասխանել թեմային...", + "placeholder_thread_encrypted": "Պատասխանել գաղտնագրված թեմային...", + "poll_button": "Հարցում", + "poll_button_no_perms_description": "Դուք այս սենյակում հարցումներ սկսելու թույլտվություն չունեք։", + "poll_button_no_perms_title": "Անհրաժեշտ է թույլտվություն", + "replying_title": "Պատասխանում", + "room_unencrypted": "Այս սենյակում հաղորդագրությունները ծայրից ծայր գաղտնագրված չեն։", + "room_upgraded_link": "Խոսակցությունը շարունակվում է այստեղ։", + "room_upgraded_notice": "Այս սենյակը փոխարինվել է և այլևս ակտիվ չէ։", + "send_button_title": "Ուղարկել հաղորդագրություն", + "send_button_voice_message": "Ուղարկել ձայնային հաղորդագրություն", + "send_voice_message": "Ուղարկել ձայնային հաղորդագրություն", + "stop_voice_message": "Դադարեցնել ձայնագրումը", + "voice_message_button": "Ձայնային հաղորդագրություն" + }, + "console_dev_note": "Եթե գիտեք, թե ինչ եք անում, Element-ի կոդերը բաց են, անպայման այցելեք մեր GitHub-ի էջը (https://github.com/vector-im/element-web/) և ունեցեք ձեր ներդրումը։", + "console_scam_warning": "Եթե ինչ-որ մեկը ձեզ ասել է այստեղ ինչ-որ բան պատճենել/տեղադրել, մեծ հավանականություն կա, որ ձեզ խաբում են։", + "console_wait": "Սպասե՛ք", + "create_room": { + "action_create_room": "Ստեղծել սենյակ", + "action_create_video_room": "Ստեղծել վիդեո սենյակ", + "encrypted_video_room_warning": "Հետագայում չեք կարող անջատել սա: Սենյակը կծածկագրվի, բայց ներմուծված զանգը՝ ոչ։", + "encrypted_warning": "Հետագայում չեք կարող անջատել սա: Կամուրջները եւ բոտերի մեծ մասը դեռ չեն աշխատի։", + "encryption_forced": "Ձեր սերվերը պահանջում է, որ մասնավոր սենյակներում միացված լինի գաղտնագրումը։", + "encryption_label": "Միացնել ծայրից ծայր գաղտնագրումը", + "error_title": "Սենյակի ստեղծման ձախողում", + "generic_error": "Հնարավոր է՝ սերվերը անհասանելի է, գերծանրաբեռնված է, կամ դուք սխալի եք հանդիպել։", + "join_rule_change_notice": "Դուք կարող եք սա փոխել ցանկացած պահիէ սենյակի կարգավորումներից։", + "join_rule_invite": "Մասնավոր սենյակ (միայն հրավերով)", + "join_rule_invite_label": "Միայն հրավիրված մարդիկ կկարողանան գտնել և միանալ այս սենյակին։", + "join_rule_knock_label": "Յուրաքանչյուր ոք կարող է դիմել միանալու համար, բայց ադմինիստրատորները կամ մոդերատորները պետք է թույլ տան դա։ Դուք կարող եք փոխել սա ավելի ուշ:", + "join_rule_public_label": "Յուրաքանչյուր ոք կկարողանա գտնել և միանալ այս սենյակին։", + "join_rule_public_parent_space_label": "Յուրաքանչյուր ոք կկարողանա գտնել և միանալ այս սենյակին, ոչ միայն -ի անդամները։", + "join_rule_restricted": "Տեսանելի է տարածքի անդամների համար", + "join_rule_restricted_label": "-ում բոլորը կկարողանան գտնել և միանալ այս սենյակին:", + "name_validation_required": "Խնդրում ենք մուտքագրել սենյակի անունը", + "room_visibility_label": "Սենյակի տեսանելիություն", + "title_private_room": "Ստեղծել մասնավոր սենյակ", + "title_public_room": "Ստեղծել հանրային սենյակ", + "title_video_room": "Ստեղծել վիդեո սենյակ", + "topic_label": "Թեմա (ըստ ցանկության)", + "unfederated": "Արգելափակել %(serverName)s-ի անդամ չհանդիսացող ցանկացած անձի միանալը այս սենյակին։", + "unfederated_label_default_off": "Դուք կարող եք միացնել սա, եթե սենյակը օգտագործվելու է միայն ձեր սերվերի ներքին թիմերի հետ համագործակցության համար: Սա հետագայում չի կարող փոխվել:", + "unfederated_label_default_on": "Դուք կարող եք անջատել սա, եթե սենյակը օգտագործվելու է արտաքին թիմերի հետ համագործակցության համար, որոնք ունեն իրենց սեփական սերվերը: Սա հետագայում չի կարող փոխվել:", + "unsupported_version": "Սերվերը չի աջակցում նշված սենյակի տարբերակը։" + }, + "create_space": { + "add_details_prompt": "Ավելացրեք որոշ մանրամասներ, որոնք կօգնեն մարդկանց ճանաչել այն:", + "add_details_prompt_2": "Դուք կարող եք փոխել դրանք ցանկացած պահի:", + "add_existing_rooms_description": "Ընտրեք սենյակներ կամ զրույցներ՝ ավելացնելու համար։ Սա պարզապես ձեզ համար նախատեսված տարածք է, ոչ ոքի սրա մասին չի տեղեկացվի։ Ավելի ուշ կարող եք ավելացնել ավելին։", + "add_existing_rooms_heading": "Ի՞նչ եք ուզում կազմակերպել։", + "address_label": "Հասցե", + "address_placeholder": "օրինակ՝ my-space (իմ տարածքը)", + "creating": "Ստեղծում է…", + "creating_rooms": "Սենյակների ստեղծում...", + "done_action": "Գնալ իմ տարածք", + "done_action_first_room": "Գնալ իմ առաջին սենյակ", + "explainer": "Տարածքները սենյակներն ու մարդկանց խմբավորելու նոր միջոց են: Ինչպիսի՞ տարածք եք ուզում ստեղծել: Կարող եք սա փոխել ավելի ուշ:", + "failed_create_initial_rooms": "Չհաջողվեց ստեղծել նախնական տարածքի սենյակներ", + "failed_invite_users": "Չհաջողվեց հրավիրել հետևյալ օգտատերերին ձեր տարածք․ %(csvUsers)s", + "invite_teammates_by_username": "Հրավիրել օգտատիրոջ անունով", + "invite_teammates_description": "Համոզվեք, որ ճիշտ մարդիկ ունեն մուտքի իրավունք։ Ավելի ուշ կարող եք հրավիրել ավելի շատերին։", + "invite_teammates_heading": "Հրավիրեք ձեր թիմակիցներին", + "inviting_users": "Հրավիրում...", + "label": "Ստեղծել տարածք", + "name_required": "Խնդրում ենք մուտքագրել տարածքի անուն", + "personal_space": "Միայն ես", + "personal_space_description": "Անհատական ​​տարածք՝ ձեր սենյակները կազմակերպելու համար", + "private_description": "Միայն հրավերով, լավագույնը՝ ձեր կամ թիմերի համար", + "private_heading": "Ձեր մասնավոր տարածքը", + "private_personal_description": "Համոզվեք, որ ճիշտ մարդիկ հասանելիություն ունեն %(name)s-ին", + "private_personal_heading": "Ո՞ւմ հետ եք աշխատում:", + "private_space": "Ես և իմ թիմակիցները", + "private_space_description": "Մասնավոր տարածք ձեզ և ձեր թիմակիցների համար", + "public_description": "Բաց տարածք բոլորի համար, լավագույնը՝ համայնքների համար", + "public_heading": "Ձեր հանրային տարածքը", + "search_public_button": "Որոնել հանրային տարածքներ", + "setup_rooms_community_description": "Եկեք նրանցից յուրաքանչյուրի համար սենյակ ստեղծենք։", + "setup_rooms_community_heading": "Ի՞նչ թեմաներ եք ուզում քննարկել %(spaceName)s-ում։", + "setup_rooms_description": "Հետագայում նույնպես կարող եք ավելացնել ավելին, ներառյալ արդեն գոյություն ունեցողները:", + "setup_rooms_private_description": "Մենք նրանցից յուրաքանչյուրի համար սենյակներ կստեղծենք:", + "setup_rooms_private_heading": "Ի՞նչ նախագծերի վրա է աշխատում ձեր թիմը:", + "share_description": "Այս պահին միայն դու ես, ուրիշների հետ ավելի լավ կլինի։", + "share_heading": "Կիսվել %(name)s-ով", + "skip_action": "Առայժմ բաց տողնել", + "subspace_adding": "Ավելացվում է…", + "subspace_beta_notice": "Ավելացրեք տարածք ձեր կառավարվող տարածքին:", + "subspace_dropdown_title": "Ստեղծել տարածք", + "subspace_existing_space_prompt": "Ցանկան՞ում եք դրա փոխարեն ավելացնել գոյություն ունեցող տարածք:", + "subspace_join_rule_invite_description": "Միայն հրավիրված մարդիկ կկարողանան գտնել և միանալ այս տարածքին:", + "subspace_join_rule_invite_only": "Մասնավոր տարածք (միայն հրավերով)", + "subspace_join_rule_label": "Տարածքի տեսանելիություն", + "subspace_join_rule_public_description": "Այս տարածքը կարող է գտնել և միանալ ցանկացած մեկը, ոչ միայն -ի անդամները։", + "subspace_join_rule_restricted_description": "-ում գտնվող ցանկացած մեկը կկարողանա գտնել և միանալ։" + }, + "credits": { + "default_cover_photo": "լռելյայն շապիկի լուսանկարը © Jesús Roncero, օգտագործվում է CC-BY-SA 4.0 լիցենզիայի պայմաններով։", + "twemoji": "Twemoji էմոջի գրաֆիկան © Twitter, Inc և այլ ներդրողներ, օգտագործվում է CC-BY 4.0 լիցենզիայի պայմաններով։", + "twemoji_colr": "twemoji-colr տառատեսակը © Mozilla Foundation, օգտագործվում է Apache 2.0 լիցենզիայի պայմաններով։" + }, + "decline_invitation_dialog": { + "confirm": "Վստա՞հ եք, որ ցանկանում եք մերժել \"%(roomName)s\"-ին միանալու հրավերը", + "ignore_user_help": "Դուք չեք տեսնի որևէ հաղորդագրություն կամ սենյակի հրավեր այս օգտատիրոջից", + "reason_description": "Նկարագրեք սենյակի մասին զեկուցելու(բողոքելու) պատճառը", + "report_room_description": "Զեկուցել այս սենյակի մասին ձեր հաշվի մատակարարին(account provider)", + "title": "Մերժել հրավերը" + }, + "desktop_default_device_name": "%(brand)s Համակարգչային աշխատասեղան(desktop)․ %(platformName)s", + "devtools": { + "active_widgets": "Ակտիվ վիջեթներ", + "category_other": "Այլ", + "category_room": "Սենյակ", + "caution_colon": "Զգուշացում.", + "client_versions": "Ծրագրի տարբերակները", + "crypto": { + "4s_public_key_in_account_data": "հաշվի տվյալներում", + "4s_public_key_not_in_account_data": "չի գտնվել", + "4s_public_key_status": "Գաղտնի պահեստի հանրային բանալի․", + "backup_key_cached": "քեշավորված է տեղային մակարդակում", + "backup_key_cached_status": "Պահուստային բանալին պահված է․", + "backup_key_not_stored": "չի պահպանվել", + "backup_key_stored": "գաղտնի պահեստում", + "backup_key_stored_status": "Պահուստային բանալին պահված է․", + "backup_key_unexpected_type": "անսպասելի տեսակ", + "backup_key_well_formed": "լավ ձևավորված", + "cross_signing": "Խաչաձև ստորագրություն", + "cross_signing_cached": "քեշավորված է տեղային մակարդակում", + "cross_signing_not_ready": "Խաչաձև ստորագրությունը կարգավորված չէ։", + "cross_signing_private_keys_in_storage": "գաղտնի պահեստում", + "cross_signing_private_keys_in_storage_status": "Խաչաձև ստորագրման մասնավոր բանալիներ․", + "cross_signing_private_keys_not_in_storage": "չի գտնվել պահեստում", + "cross_signing_public_keys_on_device": "հիշողության մեջ", + "cross_signing_public_keys_on_device_status": "Խաչաձև ստորագրման հանրային բանալիներ․", + "cross_signing_ready": "Խաչաձև ստորագրությունը պատրաստ է օգտագործման համար։", + "cross_signing_status": "Խաչաձև ստորագրման կարգավիճակ․", + "cross_signing_untrusted": "Ձեր հաշիվն ունի խաչաձև ստորագրման նույնականացում գաղտնի պահեստում, բայց այն դեռևս վստահելի չէ այս սեսիայի կողմից։", + "crypto_not_available": "Կրիպտոգրաֆիկ մոդուլը հասանելի չէ", + "device_id": "Սարքի ID", + "key_backup_active_version": "Ակտիվ պահուստային տարբերակ․", + "key_backup_active_version_none": "Ոչ մեկ", + "key_backup_inactive_warning": "Ձեր բանալիները այս սեսիայից չեն պահուստավորվում։", + "key_backup_latest_version": "Սերվերի վրա պահուստային պատճենի վերջին տարբերակ․", + "key_storage": "Բանալիների պահեստ", + "master_private_key_cached_status": "Գլխավոր մասնավոր բանալի․", + "not_found": "չի գտնվել", + "not_found_locally": "տեղային մակարդակում չի գտնվել", + "secret_storage_not_ready": "պատրաստ չէ", + "secret_storage_ready": "պատրաստ է", + "secret_storage_status": "Գաղտնի պահեստ.", + "self_signing_private_key_cached_status": "Ինքնաստորագրման մասնավոր բանալի․", + "session": "Սեսիա", + "session_fingerprint": "Մատնահետք (սեսիայի բանալի)", + "title": "\"Ծայրից ծայր\" գաղտնագրում", + "user_signing_private_key_cached_status": "Օգտատիրոջ ստորագրման մասնավոր բանալի․" + }, + "developer_mode": "Ծրագրավորողի ռեժիմ", + "developer_tools": "Ծրագրավորողի գործիքներ", + "edit_setting": "Խմբագրել կարգավորումը", + "edit_values": "Խմբագրել արժեքները", + "empty_string": "", + "event_content": "Իրադարձության բովանդակություն", + "event_id": "Իրադարձության ID-ն՝ %(eventId)s", + "event_sent": "Իրադարձությունն ուղարկվել է !", + "event_type": "Իրադարաձության տեսակ", + "explore_account_data": "Ուսումնասիրել հաշվի տվյալները", + "explore_room_account_data": "Ուսումնասիրել սենյակի հաշվի տվյալները", + "explore_room_state": "Ուսումնասիրել սենյակի վիճակը", + "failed_to_find_widget": "Այս վիջեթը գտնելիս սխալ տեղի ունեցավ։", + "failed_to_load": "Չհաջողվեց բեռնել:", + "failed_to_save": "Չհաջողվեց պահպանել կարգավորումները։", + "failed_to_send": "Չհաջողվեց ուղարկել իրադարձությունը։", + "id": "ID՝ ", + "invalid_json": "Կարծես անվավեր JSON է։", + "level": "Մակարդակ", + "low_bandwidth_mode": "Ցածր թողունակության ռեժիմ", + "low_bandwidth_mode_description": "Պահանջում է համատեղելի սերվեր:", + "main_timeline": "Հիմնական ժամանակացույց", + "manual_device_verification": "Սարքի ձեռքով ստուգում", + "no_receipt_found": "Անդորրագիրը չի գտնվել", + "notification_state": "Ծանուցման վիճակը՝ %(notificationState)s", + "notifications_debug": "Ծանուցումների վրիպազերծում", + "number_of_users": "Օգտագործողների քանակը", + "original_event_source": "Իրադարձության սկզբնական աղբյուր", + "room_encrypted": "Սենյակը կոդավորված է ✅", + "room_id": "Սենյակի ID: %(roomId)s", + "room_not_encrypted": "Սենյակը կոդավորված չէ ✅", + "room_notifications_dot": "Կետ. ", + "room_notifications_highlight": "Ընդգծում. ", + "room_notifications_last_event": "Վերջին իրադարձություն.", + "room_notifications_sender": "Ուղարկող՝ ", + "room_notifications_thread_id": "Թեմայի ID՝ ", + "room_notifications_total": "Ընդհանուր՝ ", + "room_notifications_type": "Տեսակ՝ ", + "room_status": "Սենյակի կարգավիճակ", + "room_unread_status_count": { + "one": "Սենյակի չկարդացված կարգավիճակը. %(status)s, քանակ՝ %(count)s ", + "other": "Սենյակի չկարդացված կարգավիճակը. %(status)s, քանակ՝ %(count)s " + }, + "save_setting_values": "Պահպանել կարգավորումների արժեքները", + "see_history": "Տեսնել պատմությունը", + "send_custom_account_data_event": "Ուղարկել հաշվի տվյալների հատուկ իրադարձություն", + "send_custom_room_account_data_event": "Ուղարկել սենյակի հաշվի տվյալների հատուկ իրադարձություն", + "send_custom_state_event": "Ուղարկել հատուկ վիճակի իրադարձություն", + "send_custom_timeline_event": "Ուղարկել հատուկ ժամանակացույցի իրադարձություն", + "server_info": "Սերվերի տեղեկություններ", + "server_versions": "Սերվերի տարբերակները", + "settable_global": "Կարգավորելի է գլոբալ մակարդակում", + "settable_room": "Կարգավորելի է սենյակում", + "setting_colon": "Կարգավորում․", + "setting_definition": "Կարգավորման սահմանում.", + "setting_id": "Կարգավորման ID", + "settings": { + "elementCallUrl": "Element զանգի հղում" + }, + "settings_explorer": "Կարգավորումների հետազոտող", + "show_empty_content_events": "Ցուցադրել դատարկ բովանդակությամբ իրադարձությունները", + "show_hidden_events": "Ցույց տալ թաքնված իրադարձությունները ժամանակացույցում", + "spaces": { + "one": "<տարածք>", + "other": "<%(count)s տարածքներ>" + }, + "state_key": "Վիճակի բանալի", + "thread_root_id": "Թեմայի արմատային ID: %(threadRootId)s", + "threads_timeline": "Թեմաների ժամանակագրություն", + "title": "Ծրագրավորողի գործիքներ", + "toggle_event": "միացնել իրադարձությունը", + "toolbox": "Գործիքակազմ", + "use_at_own_risk": "Այս UI-ը(օգտագործողի ինտերֆեյսը) չի ստուգում արժեքների տեսակները: Օգտագործել ձեր սեփական ռիսկով:", + "user_read_up_to": "Օգտատերը կարդացել է մինչև՝ ", + "user_read_up_to_ignore_synthetic": "Օգտվողը կարդացել է մինչեւ (ignoreSynthetic): ", + "user_read_up_to_private": "Օգտվողը կարդացել է մինչեւ (m.read.private): ", + "user_read_up_to_private_ignore_synthetic": "Օգտվողը կարդացել է մինչեւ (m.read.private; ignoreSynthetic): ", + "value": "Արժեք", + "value_colon": "Արժեք՝", + "value_in_this_room": "Արժեքն այս սենյակում", + "value_this_room_colon": "Արժեքը այս սենյակում՝", + "values_explicit": "Արժեքներ հստակ մակարդակներում", + "values_explicit_colon": "Արժեքները հստակ մակարդակներում՝", + "values_explicit_room": "Արժեքները հստակ մակարդակներում այս սենյակում", + "values_explicit_this_room_colon": "Այս սենյակում հստակ մակարդակների արժեքները՝", + "view_servers_in_room": "Դիտել սենյակում գտնվող սերվերները", + "view_source_decrypted_event_source": "Վերծանված իրադարձության աղբյուր", + "view_source_decrypted_event_source_unavailable": "Վերծանված աղբյուրն անհասանելի է", + "widget_screenshots": "Միացնել վիջեթի screenshot-ը աջակցվող վիջեթների վրա" + }, + "dialog_close_label": "Փակել երկխոսությունը", + "download_completed": "Ներբեռնումն ավարտվեց", + "emoji": { + "categories": "Բաժիններ", + "category_activities": "Գործունեություն", + "category_animals_nature": "Կենդանիներ և բնություն", + "category_flags": "Դրոշներ", + "category_food_drink": "Սնունդ և ըմպելիք", + "category_frequently_used": "Հաճախակի օգտագործվող", + "category_objects": "Առարկաներ", + "category_smileys_people": "Սմայլիկներ և մարդիկ", + "category_symbols": "Նշաններ", + "category_travel_places": "Ճանապարհորդություն և վայրեր", + "quick_reactions": "Արագ արձագանքներ" + }, + "emoji_picker": { + "cancel_search_label": "Չեղարկել որոնումը" + }, + "empty_room": "Դատարկ սենյակ", + "empty_room_was_name": "Դատարկ սենյակ (նախկինում՝ %(oldName)s)", + "encryption": { + "access_secret_storage_dialog": { + "alternatives": "Եթե ​​ունեք անվտանգության բանալի կամ անվտանգության արտահայտություն, սա նույնպես կաշխատի։", + "key_validation_text": { + "wrong_security_key": "Ձեր մուտքագրած վերականգնման բանալին սխալ է։" + }, + "privacy_warning": "Համոզվեք, որ ոչ ոք չի կարող տեսնել այս էկրանը։", + "restoring": "Բանալիների վերականգնում պահուստային պատճենից", + "security_key_label": "Վերականգնման բանալի", + "security_key_title": "Վերականգնման բանալի(Recovery key)" + }, + "bootstrap_title": "Բանալիների կարգավորում", + "confirm_encryption_setup_body": "Սեղմեք ներքեւի կոճակը՝ գաղտնագրումը հաստատելու համար:", + "confirm_encryption_setup_title": "Հաստատել գաղտնագրման կարգավորումը", + "cross_signing_room_normal": "Այս սենյակը ծայրից ծայր գաղտնագրված է", + "cross_signing_room_verified": "Այս սենյակում բոլորը ստուգված են", + "cross_signing_room_warning": "Ինչոր մեկն օգտագործում է անհայտ սեսիա", + "cross_signing_user_normal": "Դուք չեք ստուգել այս օգտատիրոջը:", + "cross_signing_user_verified": "Դուք ստուգել եք այս օգտատիրոջը։ Այս օգտատերը հաստատել է իր բոլոր սեսիաները։", + "cross_signing_user_warning": "Այս օգտատերը չի հաստատել իր բոլոր սեսիաները։", + "enter_recovery_key": "Մուտքագրեք վերականգնման բանալին", + "event_shield_reason_authenticity_not_guaranteed": "Այս գաղտնագրված հաղորդագրության իսկությունը չի կարող երաշխավորվել այս սարքի վրա։", + "event_shield_reason_mismatched_sender": "Միջոցառման ուղարկողը չի համընկնում այն սարքի սեփականատիրոջ հետ, որն այն ուղարկել է։", + "event_shield_reason_mismatched_sender_key": "Գաղտնագրված է չստուգված սեսիայի կողմից", + "event_shield_reason_unknown_device": "Գաղտնագրված է անհայտ կամ ջնջված սարքով:", + "event_shield_reason_unsigned_device": "Գաղտնագրված է սարքի կողմից, որը չի ստուգվել իր սեփականատիրոջ կողմից։", + "event_shield_reason_unverified_identity": "Գաղտնագրված է չստուգված օգտվողի կողմից:", + "export_unsupported": "Ձեր զննարկիչը չի աջակցում գաղտնագրման պահանջվող ընդարձակումները", + "forgot_recovery_key": "Մոռացե՞լ եք վերականգնման բանալին", + "import_invalid_keyfile": "Անվավեր %(brand)s բանալի ֆայլ", + "import_invalid_passphrase": "Նույնականացման ստուգումը ձախողվեց. սխալ գաղտնաբառ՞", + "key_storage_out_of_sync": "Ձեր բանալիների պահեստը համաժամեցված չէ։", + "key_storage_out_of_sync_description": "Հաստատեք ձեր վերականգնման բանալին՝ բանալիների պահոցի և հաղորդագրությունների պատմության հասանելիությունը պահպանելու համար։", + "messages_not_secure": { + "cause_1": "Ձեր սերվերը", + "cause_2": "Գլխավոր երվերը, որին միացված է ձեր կողմից հաստատվող օգտատերը", + "cause_3": "Ձեր կամ մյուս օգտատերերի ինտերնետային կապը", + "cause_4": "Ձեր կամ մյուս օգտատերերի սեսիան", + "heading": "Հետևյալներից մեկը կարող է վտանգվել.", + "title": "Ձեր հաղորդագրություններն անվտանգ չեն" + }, + "new_recovery_method_detected": { + "description_1": "Հայտնաբերվել են անվտանգ հաղորդագրությունների նոր անվտանգության արտահայտություն և բանալի։", + "description_2": "Այս սեսիան գաղտնագրում է պատմությունը՝ օգտագործելով վերականգնման նոր մեթոդը։", + "title": "Նոր վերականգնման մեթոդ", + "warning": "Եթե վերականգնման նոր մեթոդը չեք սահմանել, հարձակվողը կարող է փորձել մուտք գործել ձեր հաշիվ: Անմիջապես փոխեք ձեր հաշվի գաղտնաբառը և կարգավորեք նոր վերականգնման մեթոդը Կարգավորումներում:" + }, + "pinned_identity_changed": "%(displayName)s-ի (%(userId)s ) ինքնությունը վերակայվել է։ Իմանալ ավելին", + "pinned_identity_changed_no_displayname": "%(userId)s-ի ինքնությունը վերակայվել է։ Իմանալ ավելին", + "recovery_method_removed": { + "description_1": "Այս սեսիան հայտնաբերել է, որ ձեր անվտանգության արտահայտությունը և անվտանգ հաղորդագրությունների բանալին հեռացված են եղել։", + "description_2": "Եթե ​​սա պատահաբար եք արել, կարող եք այս սեսիայի համար կարգավորել անվտանգ հաղորդագրություններ, որոնք կվերագաղտնագրեն այս սեսիայի հաղորդագրությունների պատմությունը նոր վերականգնման մեթոդով։", + "title": "Վերականգնման մեթոդը հեռացված է", + "warning": "Եթե դուք չեք հեռացրել վերականգնման մեթոդը, հարձակվողը կարող է փորձել մուտք գործել ձեր հաշիվ: Անմիջապես փոխեք ձեր հաշվի գաղտնաբառը եւ կարգավորեք նոր վերականգնման մեթոդ Կարգավորումներում:" + }, + "set_up_recovery": "Կարգավորել վերականգնումը", + "set_up_recovery_toast_description": "Ստեղծեք վերականգնման բանալի, որը կարող է օգտագործվել ձեր գաղտնագրված հաղորդագրությունների պատմությունը վերականգնելու համար` ձեր սարքերի կորուստի դեպքում։", + "set_up_toast_title": "Կարգավորել անվտանգ պահուստավորում", + "setup_secure_backup": { + "explainer": "Պահուստավորեք ձեր բանալիները նախքան դուրս գալը, որպեսզի չկորցնեք դրանք:" + }, + "turn_on_key_storage": "Միացնել բանալիների պահեստը", + "turn_on_key_storage_description": "Ապահով կերպով պահեք ձեր գաղտնագրական ինքնությունը և հաղորդագրությունների բանալիները սերվերի վրա: Սա թույլ կտա ձեզ դիտել ձեր հաղորդագրությունների պատմությունը ցանկացած նոր սարքի վրա:", + "udd": { + "interactive_verification_button": "Ինտերակտիվորեն ստուգել էմոջիի միջոցով", + "other_ask_verify_text": "Խնդրեք այս օգտատիրոջը ստուգել իր սեսիան կամ ձեռքով ստուգեք այն ստորև։", + "other_new_session_text": "%(name)s(%(userId)s )֊ը մուտք է գործել նոր սեսիա՝ առանց այն հաստատելու։", + "own_ask_verify_text": "Հաստատեք ձեր մյուս սեսիան՝ օգտագործելով ստորև նշված տարբերակներից մեկը։", + "own_new_session_text": "Դուք մուտք եք գործել նոր սեսիա՝ առանց այն ստուգելու։", + "title": "Անվստահելի է" + }, + "unable_to_setup_keys_error": "Հնարավոր չէ կարգավորել բանալիները", + "verification": { + "accepting": "Ընդունվում է…", + "after_new_login": { + "device_verified": "Սարքը ստուգված է", + "skip_verification": "Առայժմ բաց թողնել ստուգումը", + "verify_this_device": "Ստուգել այս սարքը" + }, + "cancelling": "Չեղարկվում է…", + "complete_action": "Հասկացա", + "complete_description": "Դուք հաջողությամբ ստուգել եք այս օգտվողին:", + "complete_title": "Ստուգված է!", + "error_starting_description": "Մեզ չհաջողվեց սկսել զրույցը մյուս օգտատիրոջ հետ։", + "error_starting_title": "Սխալ՝ ստուգումը սկսելիս", + "explainer": "Այս օգտատիրոջ հետ անվտանգ հաղորդագրությունները ծայրից ծայր գաղտնագրված են և չեն կարող կարդացվել երրորդ կողմերի կողմից։", + "in_person": "Անվտանգ լինելու համար սա արեք անձամբ կամ օգտագործեք հաղորդակցման վստահելի միջոց։", + "incoming_sas_device_dialog_text_1": "Ստուգեք այս սարքը՝ այն որպես վստահելի նշելու համար: Այս սարքին վստահելը ձեզ և մյուս օգտատերերին լրացուցիչ մտքի խաղաղություն է տալիս ծայրից ծայր գաղտնագրված հաղորդագրություններ օգտագործելիս։", + "incoming_sas_device_dialog_text_2": "Այս սարքը ստուգելը կնշի այն որպես վստահելի, և օգտատերերը, ովքեր ստուգել են ձեզ հետ, կվստահեն այս սարքին:", + "incoming_sas_dialog_title": "Մուտքային ստուգման հարցում", + "incoming_sas_dialog_waiting": "Սպասում ենք զուգընկերոջ հաստատմանը…", + "incoming_sas_user_dialog_text_1": "Ստուգեք այս օգտատիրոջը՝ նրան որպես վստահելի նշելու համար: Օգտատերերին վստահելը ձեզ լրացուցիչ հանգստություն է տալիս ծայրից ծայր գաղտնագրված հաղորդագրություններ օգտագործելիս։", + "incoming_sas_user_dialog_text_2": "Այս օգտատիրոջ ստուգումը կնշի նրա սեսիան որպես վստահելի, ինչպես նաև կնշի ձեր սեսիան որպես վստահելի նրանց համար։", + "manual": { + "already_verified": "Այս սարքն արդեն ստուգված է", + "already_verified_and_wrong_fingerprint": "Տրված մատնահետքը չի համապատասխանում, բայց սարքը արդեն հաստատված է։", + "device_id": "Սարքի ID", + "failure_description": "Չհաջողվեց ստուգել '%(deviceId)s' սարքը․ %(error)s", + "failure_title": "Հաստատումը ձախողվեց", + "fingerprint": "Մատնահետք (սեսիայի բանալի)", + "no_crypto": "Չհաջողվեց ստուգել սարքը․ գաղտնագրումը միացված չէ", + "no_device": "Չհաջողվեց ստուգել սարքը․ '%(deviceId)s' սարքը չի գտնվել", + "no_userid": "Հնարավոր չէ հաստատել սարքը․ մեր օգտատիրոջ ID-ն չի գտնվել", + "success_description": "Սարքը (%(deviceId)s) այժմ խաչաձև ստորագրված է", + "success_title": "Հաստատումը հաջողվեց", + "text": "Մուտքագրեք ձեր սարքերից մեկի ID-ն և մատնահետքը՝ այն ստուգելու համար։ ՆԿԱՏԻ ՈՒՆԵՑԵՔ, որ սա թույլ է տալիս մյուս սարքին ուղարկել և ստանալ հաղորդագրություններ ձեր անունից։ ԵԹԵ ՈՐԵՎԷ ՄԵԿԸ ՁԵԶ ԱՍԵԼ/ԽՆԴՐԵԼ Է ԱՅՍՏԵՂ ԻՆՉ-ՈՐ ԲԱՆ ՏԵՂԱԴՐԵԼ, ՀԱՎԱՆԱԿԱՆ Է, ՈՐ ՁԵԶ ԽԱԲԵՈՒՄ ԵՆ:", + "wrong_fingerprint": "Հնարավոր չէ հաստատել «%(deviceId)s» սարքը․ տրված մատնահետքը (%(fingerprint)s) տարբեր է սարքի մատնահետքից՝ «%(fprint)s»" + }, + "no_support_qr_emoji": "Սարքը, որը դուք փորձում եք ստուգել, չի աջակցում QR կոդի կամ էմոջիի ստուգման սկանավորումը, ինչը %(brand)s-ն աջակցում է: Փորձեք մեկ այլ հաճախորդի/ծրագրի հետ:", + "other_party_cancelled": "Մյուս կողմը չեղարկել է ստուգումը:", + "prompt_encrypted": "Ստուգել սենյակում գտնվող բոլոր օգտատերերին՝ համոզվելու համար, որ այն անվտանգ է։", + "prompt_unencrypted": "Գաղտնագրված սենյակներում ստուգել բոլոր օգտատերերին՝ համոզվելու համար, որ այն անվտանգ է:։", + "qr_or_sas": "%(qrCode)s կամ %(emojiCompare)s", + "qr_prompt": "Սկանավորեք այս եզակի կոդը", + "qr_reciprocate_same_shield_user": "Գրեթե պատրաստ է։%(displayName)s-ը նույն էկրանն է ցուցադրում՞", + "request_toast_accept_user": "Հաստատել օգտատիրոջը", + "request_toast_decline_counter": "Անտեսել (%(counter)s)", + "request_toast_detail": "%(deviceId)s %(ip)s-ից", + "sas_caption_self": "Ստուգեք այս սարքը՝ հաստատելով, որ հետևյալ համարը երևում է դրա էկրանին։", + "sas_caption_user": "Ստուգեք այս օգտատիրոջը՝ հաստատելով, որ հետևյալ համարը երևում է նրա էկրանին։", + "sas_description": "Համեմատեք էմոջիների եզակի հավաքածու, եթե որևէ սարքի վրա տեսախցիկ չունեք", + "sas_emoji_caption_user": "Ստուգեք այս օգտատիրոջը՝ հաստատելով, որ հետևյալ էմոջիները հայտնվեն նրա էկրանին։", + "sas_match": "Նրանք համապատասխանում են", + "sas_no_match": "Նրանք չեն համապատասխանում", + "sas_prompt": "Համեմատեք եզակի էմոջիները", + "scan_qr": "Ստուգել սկանավորմամբ", + "scan_qr_explainer": "Հարցրեք %(displayName)s-ին սկանավորել ձեր կոդը.", + "start_button": "Սկսել ստուգումը", + "successful_user": "Դուք հաջողությամբ հաստատել եք %(displayName)s !", + "unsupported_method": "Հնարավոր չէ գտնել աջակցվող ստուգման մեթոդ։", + "unverified_session_toast_accept": "Այո, ես էի", + "unverified_session_toast_title": "Նոր մուտք։ Դուք էիք՞", + "unverified_sessions_toast_description": "Վերանայեք՝ համոզվելու համար, որ ձեր հաշիվը անվտանգ է", + "unverified_sessions_toast_reject": "Ավելի ուշ", + "unverified_sessions_toast_title": "Դուք ունեք չհաստատված սեսիաներ", + "verification_dialog_title_device": "Ստուգել այլ սարքը", + "verification_dialog_title_user": "Ստուգման հարցում", + "verification_skip_warning": "Առանց ստուգման, դուք չեք ունենա ձեր բոլոր հաղորդագրություններին հասանելիություն և կարող եք ուրիշներին անվստահելի թվալ։", + "verification_success_with_backup": "Ձեր նոր սարքն այժմ ստուգված է։ Այն հասանելիություն ունի ձեր գաղտնագրված հաղորդագրություններին, և մյուս օգտատերերն այն կտեսնեն որպես վստահելի։", + "verification_success_without_backup": "Ձեր նոր սարքն այժմ ստուգված է։ Մյուս օգտատերերը այն կտեսնեն որպես վստահելի։", + "verify_emoji": "Ստուգել էմոջիի միջոցով", + "verify_emoji_prompt": "Ստուգեք՝ համեմատելով եզակի էմոջիները։", + "verify_emoji_prompt_qr": "Եթե չեք կարողանում սկանավորել վերևում նշված կոդը, ստուգեք՝ համեմատելով եզակի էմոջիները։", + "verify_later": "Ես ավելի ուշ կստուգեմ", + "waiting_for_user_accept": "Սպասում ենք %(displayName)s-ին ընդունելու համար...", + "waiting_other_device": "Սպասում ենք ձեր մյուս սարքի վրա հաստատմանը…", + "waiting_other_device_details": "Սպասում ենք ձեր մյուս սարքի վրա հաստատմանը, %(deviceName)s (%(deviceId)s )…", + "waiting_other_user": "Սպասում ենք %(displayName)s-ին ստուգելու համար..." + }, + "verification_requested_toast_title": "Ստուգումը պահանջվել է", + "verified_identity_changed": "%(displayName)s-ի (%(userId)s) ինքնությունը վերակայվել է։ Իմանալ ավելին", + "verified_identity_changed_no_displayname": "%(userId)s-ի ինքնությունը վերակայվել է։ Իմանալ ավելին", + "verify_toast_description": "Մյուս օգտատերերը կարող են չվստահել դրան", + "verify_toast_title": "Ստուգել այս սեսիան", + "withdraw_verification_action": "Հետ կանչել հաստատումը" + }, + "error": { + "admin_contact": "Տվյալ ծառայությունն օգտագործելու համար խնդրում ենք կապվեք ձեր ծառայության ադմինիստրատորի հետ։", + "admin_contact_short": "Կապվեք ձեր սերվերի ադմինիստրատորի հետ։", + "app_launch_unexpected_error": "Հավելվածի նախապատրաստման ժամանակ անսպասելի սխալ առաջացավ։ Մանրամասների համար դիտեք կոնսոլը։", + "cannot_load_config": "Անհնար է բեռնել կարգավորման ֆայլը։ Խնդրում ենք թարմացնել էջը՝ կրկին փորձելու համար։", + "connection": "Սերվերի հետ կապ հաստատելու խնդիր առաջացավ, խնդրում ենք կրկին փորձել ավելի ուշ։", + "dialog_description_default": "Սխալ է տեղի ունեցել։", + "download_media": "Աղբյուրի մեդիան ներբեռնելը չհաջողվեց, աղբյուրի URL-ը չի գտնվել", + "edit_history_unsupported": "Ձեր սերվերը, կարծես թե, չի աջակցում այս գործառույթը։", + "failed_copy": "Չհաջողվեց պատճենել", + "hs_blocked": "Այս սերվերը արգելափակվել է իր ադմինիստրատորի կողմից։", + "invalid_configuration_mixed_server": "Անվավեր կարգավորում. default_hs_url-ը չի կարող նշվել default_server_name-ի կամ default_server_config-ի հետ միասին։", + "invalid_configuration_no_server": "Անվավեր կարգավորում. լռելյայն սերվեր նշված չէ։", + "invalid_json": "Ձեր Element կոնֆիգուրացիան պարունակում է անվավեր JSON ֆայլ։ Խնդրում ենք շտկել խնդիրը և վերաբեռնել էջը։", + "invalid_json_detail": "Վերլուծիչի հաղորդագրությունը հետևյալն է.%(message)s", + "invalid_json_generic": "Անվավեր JSON", + "mau": "Այս սերվերը հասել է իր ամսական ակտիվ օգտատերերի սահմանաչափին։", + "misconfigured": "Ձեր Element-ը սխալ է կարգավորված", + "mixed_content": "Հնարավոր չէ միանալ գլխավոր սերվերին HTTP-ի միջոցով, երբ ձեր զննարկիչի URL-վահանակում HTTPS-ով URL կա: Կամ օգտագործեք HTTPS, կամ միացրեք անվտանգ չլինող սկրիպտները:", + "non_urgent_echo_failure_toast": "Ձեր սերվերը չի արձագանքում որոշ հարցումներներին։", + "resource_limits": "Այս սերվերը գերազանցել է իր ռեսուրսների սահմանաչափերից մեկը։", + "session_restore": { + "clear_storage_button": "Մաքրել պահեստը և դուրս գալ", + "clear_storage_description": "Դու՞րս գալ և հեռացնե՞լ գաղտնագրման բանալիները", + "description_1": "Ձեր նախորդ սեսիան վերականգնելու փորձի ժամանակ սխալ առաջացավ։", + "description_2": "Եթե նախկինում օգտագործել եք %(brand)s-ի ավելի նոր տարբերակ, ձեր սեսիան կարող է անհամատեղելի լինել այս տարբերակի հետ։ Փակեք այս պատուհանը և վերադարձեք ավելի նոր տարբերակին։", + "description_3": "Ձեր զննարկիչի պահեստը մաքրելը կարող է լուծել խնդիրը, բայց դա ձեզ ավտոմատ կերպով դուրս կհանի հաշվից, և գաղտնագրված զրույցի պատմությունը կդառնա անընթեռնելի։", + "title": "Անհնար է վերականգնել սեսիան" + }, + "something_went_wrong": "Ինչոր բան սխալ գնաց։", + "storage_evicted_description_1": "Սեսիայի որոշ տվյալներ, այդ թվում՝ գաղտնագրված հաղորդագրության բանալիները, բացակայում են: Դա շտկելու համար դուրս եկեք և մուտք գործեք հաշիվ՝ բանալիները վերականգնելով պահուստային պատճենից:", + "storage_evicted_description_2": "Ձեր զննարկիչը, հավանաբար, հեռացրել է այս տվյալները, երբ հանդիպել է սկավառակի տարածքի սուղության։", + "storage_evicted_title": "Սեսիայի տվյալները բացակայում են", + "sync": "Հնարավոր չէ միանալ Homeserver-ին։ Կրկին փորձում ենք…", + "tls": "Հնարավոր չէ միանալ սերվերին. խնդրում ենք ստուգել ձեր կապը, համոզվել, որ ձեր սերվերի SSL վկայականը վստահելի է, և որ զննարկիչի որևէ ընդլայնում չի արգելափակում հարցումները։", + "unknown": "Անհայտ սխալ", + "unknown_error_code": "սխալի անհայտ կոդ", + "update_power_level": "Չհաջողվեց փոխել հզորության մակարդակը" + }, + "error_app_open_in_another_tab": "%(brand)s-ին միանալու համար անցեք մյուս ներդիրին։ Այս ներդիրը այժմ կարող է փակվել։", + "error_app_open_in_another_tab_title": "%(brand)s-ը միացված է մեկ այլ ներդիրում", + "error_app_opened_in_another_window": "%(brand)s-ը բաց է մեկ այլ պատուհանում: Սեղմեք «%(label)s»՝ %(brand)s-ը այստեղ օգտագործելու և մյուս պատուհանը անջատելու համար:", + "error_database_closed_description": { + "for_desktop": "Ձեր սկավառակը կարող է լիքը լինել։ Խնդրում ենք ազատել որոշակի հատված և վերաբեռնել։", + "for_web": "IԵթե մաքրել եք դիտարկման տվյալները, ապա այս հաղորդագրությունը սպասելի է։ %(brand)s-ը կարող է բաց լինել նաև մեկ այլ ներդիրում, կամ ձեր սկավառակը լիքն է։ Խնդրում ենք ազատել որոշ տարածք և վերաբեռնել այն։" + }, + "error_database_closed_title": "%(brand)s-ը դադարել է աշխատել", + "error_dialog": { + "copy_room_link_failed": { + "description": "Հնարավոր չէ պատճենել սենյակի հղումը պահեստային հիշողությունում(clipboard):", + "title": "Հնարավոր չէ պատճենել սենյակի հղումը" + }, + "error_loading_user_profile": "Հնարավոր չէ բեռնել օգտատիրոջ պրոֆիլը", + "forget_room_failed": "Չհաջողվեց մոռանալ %(errCode)s սենյակը" + }, + "error_user_not_logged_in": "Օգտատերը մուտք չի գործել", + "event_preview": { + "m.call.answer": { + "dm": "Զանգն ընթացքի մեջ է", + "user": "%(senderName)s-ը միացավ զանգին", + "you": "Դուք միացել եք զանգին" + }, + "m.call.hangup": { + "user": "%(senderName)s-ն ավարտեց զանգը", + "you": "Դուք ավարտեցիք զանգը" + }, + "m.call.invite": { + "dm_receive": "%(senderName)s-ը զանգահարում է", + "dm_send": "Պատասխանի սպասում", + "user": "%(senderName)s-ն սկսել է զանգ", + "you": "Դուք զանգ եք սկսել" + }, + "m.emote": "* %(senderName)s %(emote)s", + "m.reaction": { + "user": "%(sender)s-ն արձագանքել է %(reaction)s-ով %(message)s հաղորդագրությանը", + "you": "Դուք արձագանքել եք %(reaction)s-ով %(message)s հաղորդագրությանը" + }, + "m.sticker": "%(senderName)s․ %(stickerName)s", + "m.text": "%(senderName)s․ %(message)s", + "prefix": { + "audio": "Աուդիո", + "file": "Ֆայլ", + "image": "Պատկեր", + "poll": "Հարցում.", + "video": "Տեսանյութ" + }, + "preview": "%(prefix)s: %(preview)s" + }, + "export_chat": { + "cancelled": "Արտահանումը չեղարկվել է", + "cancelled_detail": "Արտահանումը հաջողությամբ չեղարկվեց", + "confirm_stop": "Համոզվա՞ծ եք, որ ցանկանում եք դադարեցնել ձեր տվյալների արտահանումը: Եթե դա անեք, կարիք կլնի սկսել նորից:", + "creating_html": "HTML- ի ստեղծում...", + "creating_output": "Արդյունքի ստեղծում...", + "creator_summary": "%(creatorName)s-ը ստեղծել է այս սենյակը:", + "current_timeline": "Ընթացիկ ժամանակացույց", + "enter_number_between_min_max": "Մուտքագրեք թիվ %(min)s-ի և %(max)s-ի միջև", + "error_fetching_file": "Սխալ՝ ֆայլը բեռնելիս", + "export_info": "Սա -ի արտահանման սկիզբն է։ Արտահանվել է -ի կողմից %(exportDate)s-ին.", + "export_successful": "Արտահանումը հաջողվեց։", + "exported_n_events_in_time": { + "one": "Արտահանվել է %(count)s իրադարձություն %(seconds)s վայրկյանում", + "other": "Արտահանվել է %(count)s իրադարձություն %(seconds)s վայրկյանում" + }, + "exporting_your_data": "Ձեր տվյալների արտահանում", + "fetched_n_events": { + "one": "Մինչ այժմ ստացվել է %(count)s իրադարձություն", + "other": "Մինչ այժմ ստացվել են %(count)s իրադարձություններ" + }, + "fetched_n_events_in_time": { + "one": "%(count)s իրադարձությունը ստացվել է %(seconds)s վայրկյանում", + "other": "%(count)s իրադարձությունները ստացվել են %(seconds)s վայրկյանում" + }, + "fetched_n_events_with_total": { + "one": "Բերվել է %(count)s իրադարձություն %(total)s-ից", + "other": "Բերվել է %(count)s իրադարձություն %(total)s-ից" + }, + "fetching_events": "Իրադարձությունների բեռնում...", + "file_attached": "Ֆայլը կցված է", + "format": "Ձևաչափ", + "from_the_beginning": "Սկզբից", + "generating_zip": "ZIP- ի ստեղծում", + "html": "HTML", + "html_title": "Արտահանված տվյալներ", + "include_attachments": "Ներառել հավելվածներ(կից ֆայլեր)", + "json": "JSON", + "media_omitted": "Մեդիան բաց է թողնված", + "media_omitted_file_size": "Մեդիան բաց է թողնվել․ ֆայլի ծավալի սահմանաչափը գերազանցվել է", + "messages": "Հաղորդագրություններ", + "next_page": "Հաղորդագրությունների հաջորդ խումբը", + "num_messages": "Հաղորդագրությունների քանակը", + "num_messages_min_max": "Հաղորդագրությունների քանակը կարող է լինել միայն %(min)s-ի և %(max)s-ի միջև", + "number_of_messages": "Նշեք հաղորդագրությունների քանակը", + "previous_page": "Հաղորդագրությունների նախորդ խումբը", + "processing": "Մշակվում է…", + "processing_event_n": "%(total)s-ից %(number)s իրադարձությունների մշակում", + "select_option": "Ընտրեք ստորև բերված տարբերակներից ՝ զրույցները ձեր ժամանակացույցից արտահանելու համար", + "size_limit": "Չափի սահմանափակում", + "size_limit_min_max": "Չափը կարող է լինել միայն %(min)s ՄԲ-ի և %(max)s ՄԲ-ի միջև", + "size_limit_postfix": "ՄԲ", + "starting_export": "Արտահանումը սկսվում է…", + "successful": "Արտահանումը հաջողվեց", + "successful_detail": "Ձեր արտահանումը հաջողվեց: Այն կարող եք գտնել ձեր Ներբեռնումների թղթապանակում:", + "text": "Պարզ տեքստ", + "title": "Արտահանել զրույց", + "topic": "Թեմա․ %(topic)s", + "unload_confirm": "Իրո՞ք ցանկանում եք դուրս գալ արտահանման ընթացքում:" + }, + "failed_load_async_component": "Անհնար է բեռնել։ Ստուգեք ձեր ցանցային կապը և փորձեք կրկին։", + "feedback": { + "can_contact_label": "Լրացուցիչ հարցերի դեպքում կարող եք կապվել ինձ հետ", + "comment_label": "Մեկնաբանություն", + "existing_issue_link": "Խնդրում ենք նախ վերանայել GitHub-ում առկա սխալները: Համընկնում չկա՞: Սկսեք նորը:", + "may_contact_label": "Կարող եք կապվել ինձ հետ, եթե ցանկանում եք հետևել նորություններին կամ թույլ տալ ինձ փորձարկել առաջիկա գաղափարները։", + "platform_username": "Ձեր հարթակը և օգտատիրոջ անունը կհիշատակվեն, որպեսզի մենք կարողանանք հնարավորինս շատ օգտագործել ձեր կարծիքը։", + "pro_type": "ՄԱՍՆԱԳԵՏԻ ՀՈՐԴՈՐ. Եթե սխալ եք հայտնաբերել, խնդրում ենք ներկայացնել վրիպազերծման գրանցամատյաններ(debug logs), որպեսզի մենք կարողանանք գտնել խնդիրը։", + "send_feedback_action": "Ուղարկել արձագանք(կարծիք հայտնել)", + "sent": "Կարծիքն ուղարկված է։ Շնորհակալություն, մենք գնահատում ենք այն։" + }, + "file_panel": { + "empty_description": "Կցեք ֆայլերը զրույցից կամ պարզապես քաշեք և գցեք դրանք սենյակի ցանկացած վայրում։", + "empty_heading": "Այս սենյակում տեսանելի ֆայլեր չկան", + "guest_note": "Դուք պետք է գրանցվեք՝ այս գործառույթն/ֆունկցիոնալությունն օգտագործելու համար", + "peek_note": "Դուք պետք է միանաք այս սենյակին՝ դրա ֆայլերը դիտելու համար" + }, + "forward": { + "filter_placeholder": "Որոնել սենյակներ կամ մարդկանց", + "message_preview_heading": "Հաղորդագրության նախադիտում", + "no_perms_title": "Դուք դա անելու թույլտվություն չունեք", + "open_room": "Բաց սենյակ", + "send_label": "Ուղարկել", + "sending": "Ուղարկվում է", + "sent": "Ուղարկված է" + }, + "identity_server": { + "change": "Փոխել նույնականացման սերվերը", + "change_prompt": "Անջատվե՞լ նույնականացման սերվերից և փոխարենը միանալ -ին։", + "change_server_prompt": "Եթե ​​չեք ցանկանում օգտագործել -ը՝ ձեր ծանոթ առկա կոնտակտները հայտնաբերելու և նրանց կողմից հայտնաբերելի լինելու համար, ստորև մուտքագրեք մեկ այլ նույնականացման սերվեր։", + "changed": "Ձեր նույնականացման սերվերը փոխվել է", + "checking": "Սերվերի ստուգում", + "description_connected": "Դուք ներկայումս օգտագործում եք -ը՝ ձեր ծանոթ առկա կոնտակտները հայտնաբերելու և նրանց կողմից հայտնաբերելի լինելու համար: Կարող եք փոխել ձեր նույնականացման սերվերը ստորև:", + "description_disconnected": "Դուք ներկայումս չեք օգտագործում նույնականացման սերվեր։ Ձեր ծանոթ առկա կոնտակտները հայտնաբերելու և նրանց կողմից հայտնաբերելի լինելու համար ավելացրեք մեկը ստորև։", + "description_optional": "Նույնականացման սերվերի օգտագործումը պարտադիր չէ: Եթե որոշեք չօգտագործել նույնականացման սերվեր, ձեզ չեն հայտնաբերի այլ օգտատերերը և չեք կարողանա հրավիրել ուրիշներին էլ. փոստով կամ հեռախոսով:", + "disconnect": "Անջատել նույնականացման սերվերը", + "disconnect_anyway": "Ամեն դեպքում անջատել", + "disconnect_offline_warning": "Դուք պետք է հեռացնեք ձեր անձնական տվյալները նույնականացման սերվերից՝ անջատվելուց առաջ։ Ցավոք, նույնականացման սերվերը ներկայումս անջատված է կամ անհասանելի է։", + "disconnect_personal_data_warning_1": "Դուք դեռևս կիսվում եք ձեր անձնական տվյալներով նույնականացման սերվերում", + "disconnect_personal_data_warning_2": "Խորհուրդ ենք տալիս անջատվելուց առաջ հեռացնել ձեր էլեկտրոնային փոստի հասցեները և հեռախոսահամարները նույնականացման սերվերից։", + "disconnect_server": "Անջատվե՞լ նույնականացման սերվերից:", + "disconnect_warning": "Ձեր նույնականացման սերվերից անջատվելը նշանակում է, որ դուք տեսանելի չեք լինի այլ օգտատերերի համար, և դուք չեք կարողանա հրավիրել ուրիշներին էլ.փոստով կամ հեռախոսահամարով։", + "do_not_use": "Չօգտագործել նույնականացման սերվեր", + "error_connection": "Չկարողացավ միանալ նույնականացման սերվերին", + "error_invalid": "Անվավեր նույնականացման սերվեր (կարգավիճակի կոդ՝ %(code)s)", + "error_invalid_or_terms": "Օգտագործման պայմանները չեն ընդունվել, կամ նույնականացման սերվերը անվավեր է։", + "no_terms": "Ձեր ընտրած նույնականացման սերվերը չունի որևէ ծառայության մատուցման պայմաններ։", + "suggestions": "Դուք պետք է.", + "suggestions_1": "ստուգեք ձեր զննարկիչի հավելվածները՝ նույնականացման սերվերը արգելափակող որևէ բանի համար (օրինակ՝ Privacy Badger-ը):", + "suggestions_2": "կապվեք նույնականացման սերվերի ադմինիստրատորների հետ", + "suggestions_3": "սպասեք և փորձեք կրկին՝ ավելի ուշ", + "url": "Նույնականացման սերվեր (%(server)s)", + "url_field_label": "Մուտքագրել նոր նույնականացման սերվեր", + "url_not_https": "Նույնականացման սերվերի URL-ը պետք է լինի HTTPS-ով" + }, + "in_space": "%(spaceName)s տարածքում", + "in_space1_and_space2": "%(space1Name)s և %(space2Name)s տարածքներում", + "in_space_and_n_other_spaces": { + "one": "%(spaceName)s-ում և մեկ այլ տարածքում:", + "other": "%(spaceName)s-ում և %(count)s այլ տարածքններում:" + }, + "incompatible_browser": { + "continue": "Այնուամենայնիվ շարունակել", + "description": "%(brand)sօգտագործում է զննարկիչի որոշ գործառույթներ, որոնք հասանելի չեն ձեր ներկայիս զննարկիչում։%(detail)s", + "detail_can_continue": "Եթե շարունակեք, որոշ ֆունկցիաներ կարող են դադարեցնել աշխատանքը, և գոյություն ունի տվյալների կորուստի ռիսկ։", + "detail_no_continue": "Փորձեք թարմացնել այս զննարկիչը, եթե չեք օգտագործում վերջին տարբերակը, և փորձեք կրկին։", + "learn_more": "Իմանալ ավելին", + "linux": "Լինուքս", + "macos": "Մակ", + "supported_browsers": "Լավագույն փորձի համար օգտագործեք Chrome, Firefox, Edge, կամ Safari։", + "title": "%(brand)s-ն չի աջակցում այս զննարկչին", + "use_desktop_heading": "Օգտագործեք %(brand)s Desktop-ը դրա փոխարեն", + "use_mobile_heading": "Այլընտրանքորեն օգտագործեք %(brand)s բջջայինում", + "use_mobile_heading_after_desktop": "Կամ օգտագործեք մեր բջջային հավելվածը", + "windows_64bit": "Windows (64-bit)", + "windows_arm_64bit": "Windows (ARM 64-bit)" + }, + "info_tooltip_title": "Տեղեկություն", + "integration_manager": { + "connecting": "Միացում ինտեգրման կառավարչին...", + "error_connecting": "Ինտեգրացիայի մենեջերը անջատված է կամ չի կարող միանալ ձեր գլխավոր սերվերին։", + "error_connecting_heading": "Հնարավոր չէ միանալ ինտեգրման կառավարչին", + "explainer": "Ինտեգրացիայի կառավարիչները ստանում են կարգավորման տվյալներ և կարող են փոփոխել վիջեթները, ուղարկել սենյակների հրավերներ և ձեր անունից սահմանել հզորության մակարդակները։", + "manage_title": "Կառավարել ինտեգրումները", + "toggle_label": "Ակտիվացնել ինտեգրացիաների կառավարչի գործառույթը", + "use_im": "Օգտագործեք ինտեգրման մենեջեր՝ բոտերը, վիջեթները և ստիկերների փաթեթները կառավարելու համար։", + "use_im_default": "Օգտագործեք ինտեգրման կառավարիչ (%(serverName)s)՝ բոտերը, վիջեթները և ստիկերների փաթեթները կառավարելու համար։" + }, + "integrations": { + "disabled_dialog_description": "Դա անելու համար կարգավորումներում միացրեք '%(manageIntegrations)s'-ը։", + "disabled_dialog_title": "Ինտեգրումներն անջատված են", + "impossible_dialog_description": "Ձեր %(brand)s-ը թույլ չի տալիս օգտագործել ինտեգրման մենեջեր սա անելու համար։ Խնդրում ենք կապվել ադմինիստրատորի հետ։", + "impossible_dialog_title": "Ինտեգրումները թույլատրված չեն" + }, + "invite": { + "ask_anyway_description": "Անհնար է գտնել ստորեւ թվարկված Matrix ID-ների պրոֆիլները: Ցանկանո՞ւմ եք ամեն դեպքում սկսել անձնական հաղորդագրությունը։", + "ask_anyway_label": "Ամեն դեպքում սկսել անձնական հաղորդագրությունը", + "ask_anyway_never_warn_label": "Ամեն դեպքում սկսել անձնական հաղորդագրություններ ուղարկել և այլևս երբեք մի զգուշացրեք ինձ", + "email_caption": "Հրավիրել էլ.փոստով", + "email_limit_one": "Էլ.փոստով հրավերները կարող են ուղարկվել միայն մեկ առ մեկ", + "email_use_default_is": "Օգտագործեք նույնականացման սերվեր՝ էլ. փոստով հրավիրելու համար։ Օգտագործեք լռելյայնը (%(defaultIdentityServerName)s ) կամ կառավարել Կարգավորումներում .", + "email_use_is": "Օգտագործեք նույնականացման սերվեր՝ էլ. փոստով հրավիրելու համար: Կառավարեք Կարգավորումներում .", + "error_already_invited_room": "Օգտատերը արդեն հրավիրված է սենյակ", + "error_already_invited_space": "Օգտատերը արդեն հրավիրված է տարածք", + "error_already_joined_room": "Օգտատերը արդեն սենյակում է", + "error_already_joined_space": "Օգտատերը արդեն տարածքում է", + "error_bad_state": "Օգտատերը պետք է հանվի արգելափակումից, նախքան նրան հրավիրելը:", + "error_dm": "Մեզ չհաջողվեց ստեղծել ձեր անձնական հաղորդագրությունը։", + "error_find_room": "Օգտատերերին հրավիրելիս ինչ-որ սխալ է տեղի ունեցել։", + "error_find_user_description": "Հետևյալ օգտատերերը կարող են գոյություն չունենալ կամ անվավեր լինել, և չեն կարող հրավիրվել։ %(csvNames)s", + "error_find_user_title": "Հետևյալ օգտատերերին չհաջողվեց գտնել", + "error_invite": "Մենք չկարողացանք հրավիրել այդ օգտատերերին։ Խնդրում ենք նշել այն օգտատերերին, որոնց ցանկանում եք հրավիրել, և կրկին փորձել։", + "error_permissions_room": "Դուք չունեք մարդկանց այս սենյակ հրավիրելու թույլտվություն։", + "error_permissions_space": "Դուք չունեք մարդկանց այս տարածք հրավիրելու թույլտվություն։", + "error_profile_undisclosed": "Օգտվողը կարող է գոյություն ունենալ կամ գոյություն չունենալ", + "error_transfer_multiple_target": "Զանգը կարող է փոխանցվել միայն մեկ օգտատիրոջ:", + "error_unfederated_room": "Այս սենյակը չի կարող միացվել որևէ այլ սենյակի։ Դուք չեք կարող օգտվողներին հրավիրել արտաքին սերվերներից:", + "error_unfederated_space": "Այս տարածքը չի կարող միացվել որևէ այլ տարածքի։ Դուք չեք կարող օգտվողներին հրավիրել արտաքին սերվերներից:", + "error_unknown": "Սերվերի անհայտ սխալ", + "error_user_not_found": "Օգտատերը գոյություն չունի", + "error_version_unsupported_room": "Օգտատիրոջ սերվերը չի աջակցում սենյակի տարբերակը։", + "error_version_unsupported_space": "Օգտատիրոջ սերվերը չի աջակցում տարածքի տարբերակը։", + "failed_generic": "Գործողությունը ձախողվեց", + "failed_title": "Չհաջողվեց հրավիրել", + "invalid_address": "Չճանաչված հասցե", + "name_email_mxid_share_room": "Հրավիրեք ինչոր մեկին իր անունով, էլ.փոստի հասցեով, օգտատիրոջ օգտանունով (օրինակ՝ ) կամ կիսվեք այս սենյակով ։", + "name_email_mxid_share_space": "Հրավիրեք ինչոր մեկին իր անունով, էլ.փոստի հասցեով, օգտատիրոջ օգտանունով (օրինակ՝ ) կամ կիսվեք այս տարածքով ։", + "name_mxid_share_room": "Հրավիրեք ինչոր մեկին իր անունով, օգտատիրոջ օգտանունով (օրինակ՝ ) կամ կիսվեք այս սենյակով ։", + "name_mxid_share_space": "Հրավիրեք ինչոր մեկին իր անունով, օգտատիրոջ օգտանունով (օրինակ՝ ) կամ կիսվեք այս տարածքով։", + "progress": { + "dont_close": "Մի՛ փակեք ծրագիրը մինչեւ ավարտվի:", + "preparing": "Հրավերների պատրաստում..." + }, + "recents_section": "Վերջին զրույցները", + "room_failed_partial": "Մյուսներին ուղարկեցինք, բայց ստորև բերված մարդկանց չհաջողվեց հրավիրել ", + "room_failed_partial_title": "Որոշ հրավերներ չհաջողվեց ուղարկել", + "room_failed_title": "Չհաջողվեց հրավիրել օգտատերերին %(roomName)s", + "send_link_prompt": "Կամ ուղարկեք հրավերի հղումը", + "start_conversation_name_email_mxid_prompt": "Սկսեք զրույց ինչ-որ մեկի հետ, օգտագործելով իր անունը, էլ.փոստի հասցեն կամ օգտատիրոջ անունը (օրինակ՝ )։", + "start_conversation_name_mxid_prompt": "Սկսեք զրույց ինչ-որ մեկի հետ՝ օգտագործելով նրա անունը կամ օգտատիրոջ անունը (օրինակ՝ ):", + "suggestions_disclaimer": "Որոշ առաջարկներ կարող են թաքցված լինել գաղտնիության համար։", + "suggestions_disclaimer_prompt": "Եթե չեք տեսնում, թե ում եք փնտրում, ուղարկեք նրանց ձեր հրավերի հղումը ստորև։", + "suggestions_section": "Վերջին ուղիղ հաղորդագրությունները", + "to_room": "Հրավիրել %(roomName)s", + "to_space": "Հրավիրել %(spaceName)s", + "transfer_dial_pad_tab": "Թվային ստեղնաշար", + "transfer_user_directory_tab": "Օգտատերերի տեղեկատու", + "unable_find_profiles_description_default": "Անհնար է գտնել ստորև թվարկված Matrix ID-ների պրոֆիլները։ Ցանկանո՞ւմ եք այնուամենայնիվ հրավիրել նրանց։", + "unable_find_profiles_invite_label_default": "Հրավիրել ամեն դեպքում", + "unable_find_profiles_invite_never_warn_label_default": "Ամեն դեպքում հրավիրել և այլևս երբեք չզգուշացնել ինձ", + "unable_find_profiles_title": "Հետևյալ օգտատերերը կարող են գոյություն չունենալ", + "unban_first_title": "Օգտատիրոջը չի կարելի հրավիրել, քանի դեռ նրա արգելափակումը չի հանվել" + }, + "inviting_user1_and_user2": "%(user1)s և %(user2)s անձանց հրավիրում", + "inviting_user_and_n_others": { + "one": "Հրավիրում է %(user)s և մեկ այլ", + "other": "Հրավիրում է %(user)s և %(count)s ուրիշներին" + }, + "items_and_n_others": { + "one": " և մեկ այլ", + "other": " և %(count)s մյուսները" + }, + "keyboard": { + "activate_button": "Ակտիվացնել ընտրված կոճակը", + "alt": "Alt", + "autocomplete_cancel": "Չեղարկել ավտոմատ լրացումը", + "autocomplete_force": "Հարկադիր ավարտ", + "autocomplete_navigate_next": "Հաջորդ ավտոմատ լրացման առաջարկը", + "autocomplete_navigate_prev": "Նախորդ ավտոմատ լրացման առաջարկը", + "backspace": "Backspace", + "cancel_reply": "Չեղարկել հաղորդագրությանը պատասխանելը", + "category_autocomplete": "Ավտոմատ լրացում (ինքնալրացում)", + "category_calls": "Զանգեր", + "category_navigation": "Տեղորոշում", + "category_room_list": "Սենյակների ցուցակ", + "close_dialog_menu": "Փակել երկխոսության պատուհանը կամ համատեքստային ցանկը", + "composer_jump_end": "Անցնել խմբագրիչի վերջ", + "composer_jump_start": "Անցնել խմբագրիչի սկիզբ", + "composer_navigate_next_history": "Անցնել հաջորդ հաղորդագրությանը խմբագրիչի պատմության մեջ", + "composer_navigate_prev_history": "Անցնել նախորդ հաղորդագրությանը խմբագրիչի պատմության մեջ", + "composer_new_line": "Նոր տող", + "composer_redo": "Կրկնել խմբագրումը", + "composer_toggle_bold": "Միացնել/անջատել թավատառը", + "composer_toggle_code_block": "Միացնել/անջատել կոդի բլոկը", + "composer_toggle_italics": "Միացնել/անջատել շողատառերը", + "composer_toggle_link": "Միացնել/անջատել հղումը", + "composer_toggle_quote": "Միացնել/անջատել մեջբերումը", + "composer_undo": "Հետարկել խմբագրումը", + "control": "Ctrl", + "dismiss_read_marker_and_jump_bottom": "Փակել ընթերցման նշիչը և անցնել ներքև", + "end": "End", + "enter": "Enter", + "escape": "Esc", + "go_home_view": "Անցնել գլխավոր/հիմնական տեսքին", + "home": "Home", + "jump_first_message": "Անցնել առաջին հաղորդագրությանը", + "jump_last_message": "Անցնել վերջին հաղորդագրությանը", + "jump_room_search": "Անցնել սենյակի որոնմանը", + "jump_to_read_marker": "Անցեք ամենահին չընթերցված հաղորդագրությանը", + "keyboard_shortcuts_tab": "Բացել այս կարգավորումների ներդիրը", + "navigate_next_history": "Վերջերս այցելած հաջորդ սենյակը կամ տարածքը", + "navigate_next_message_edit": "Խմբագրման համար անցեք հաջորդ հաղորդագրությանը", + "navigate_prev_history": "Վերջերս այցելած սենյակ կամ տարածք", + "navigate_prev_message_edit": "Խմբագրման համար անցեք նախորդ հաղորդագրությանը", + "next_landmark": "Անցնել հաջորդ նշանային կետին", + "next_room": "Հաջորդ սենյակը կամ ուղիղ/անձնական հաղորդագրությունը", + "next_unread_room": "Հաջորդ չկարդացված սենյակը կամ ուղիղ/անձնական հաղորդագրությունը", + "number": "[թիվ]", + "open_user_settings": "Բացել օգտատիրոջ կարգավորումները", + "page_down": "Page Down", + "page_up": "Page Up", + "prev_landmark": "Անցնել նախորդ նշանային կետին", + "prev_room": "Նախորդ սենյակը կամ ուղիղ/անձնական հաղորդագրությունը", + "prev_unread_room": "Նախորդ չկարդացված սենյակը կամ ուղիղ/անձնական հաղորդագրությունը", + "room_list_collapse_section": "Ծալել սենյակների ցանկի բաժինը", + "room_list_expand_section": "Ընդարձակել սենյակների ցանկի բաժինը", + "room_list_navigate_down": "Շարժվել ներքև սենյակների ցանկում", + "room_list_navigate_up": "Շարժվել վերև սենյակների ցանկում", + "room_list_select_room": "Ընտրել սենյակ՝ սենյակների ցանկից", + "save": "Պահել", + "scroll_down_timeline": "Ժամանակացույցում ներքև գլորել", + "scroll_up_timeline": "Ժամանակացույցում վերև գլորել", + "search": "Որոնում (պետք է միացված լինի)", + "send_sticker": "Ուղարկել կպչուն պիտակ(ստիկեր)", + "shift": "Shift", + "space": "Բացատ", + "switch_to_space": "Անցնել տարածքին՝ ըստ համարի", + "toggle_hidden_events": "Միացնել/անջատել թաքնված միջոցառման տեսանելիությունը", + "toggle_microphone_mute": "Միացնել/անջատել խոսափողի լռեցումը", + "toggle_right_panel": "Բացել/փակել աջ վահանակը", + "toggle_space_panel": "Բացել/փակել տարածքի վահանակը", + "toggle_top_left_menu": "Բացել/փակել վերևի ձախ մենյուն", + "toggle_webcam_mute": "Միացնել/անջատել վեբ տեսախցիկը", + "upload_file": "Ֆայլի վերբեռնում" + }, + "labs": { + "allow_screen_share_only_mode": "Թույլատրել միայն էկրանի կիսման ռեժիմը", + "ask_to_join": "Միացնել միանալու հարցումը", + "automatic_debug_logs": "Ավտոմատ կերպով ուղարկել կարգաբերման տեղեկամատյանները(debug logs) ցանկացած սխալի վերաբերյալ", + "automatic_debug_logs_decryption": "Ավտոմատ կերպով ուղարկել կարգաբերման տեղեկամատյանները(debug logs) վերծանման սխալների վերաբերյալ", + "automatic_debug_logs_key_backup": "Ավտոմատ կերպով ուղարկել կարգաբերման տեղեկամատյանները(debug logs)՝ բանալիների պահուստավորման չգործելու դեպքում", + "beta_description": "Ի՞նչ է սպասվում %(brand)s-ին հաջորդիվ։ Լաբորատորիաները լավագույն միջոցն են ամեն ինչ վաղ փուլում սկսելու, նոր գործառույթները փորձարկելու և դրանք ձևավորելու համար, նախքան դրանց թողարկումը։", + "beta_feature": "Սա բետա առանձնահատկություն է", + "beta_feedback_leave_button": "Բետա տարբերակից դուրս գալու համար այցելեք ձեր կարգավորումները:", + "beta_feedback_title": "%(featureName)s Բետա հետադարձ կապ", + "beta_section": "Առաջիկա առանձնահատկություններ", + "bridge_state": "Ցույց տալ կամուրջների մասին տեղեկություններ սենյակի կարգավորումներում", + "bridge_state_channel": "Ալիք․ ", + "bridge_state_creator": "Այս կամուրջն ապահովված էր ֊ի կողմից։", + "bridge_state_manager": "Այս կամուրջը կառավարվում է ֊ի կողմից։", + "bridge_state_workspace": "Աշխատանքային տարածք․ ", + "click_for_info": "Սեղմեք լրացուցիչ տեղեկությունների համար", + "currently_experimental": "Ներկայումս փորձնական։", + "custom_themes": "Աջակցեl անհատական ​​​​թեմաների/ոճերի ավելացմանը", + "dynamic_room_predecessors": "Դինամիկ սենյակի նախորդներ", + "dynamic_room_predecessors_description": "Միացնել MSC3946- ը (ուշ ժամանող սենյակների արխիվներին աջակցելու համար)", + "element_call_video_rooms": "Element Call վիդեո սենյակներ", + "exclude_insecure_devices": "Բացառել անապահով սարքերը հաղորդագրություններ ուղարկելիս/ստանալիս ", + "exclude_insecure_devices_description": "Երբ այս ռեժիմը միացված է, գաղտնագրված հաղորդագրությունները չեն կիսվի չվավերացված սարքերի հետ, իսկ չվավերացված սարքերից ստացված հաղորդագրությունները կցուցադրվեն որպես սխալ։ Նկատի ունեցեք, որ այս ռեժիմը միացնելիս, հնարավոր է, չկարողանաք շփվել այն օգտատերերի հետ, ովքեր չեն վավերացրել իրենց սարքերը։", + "experimental_description": "Փորձարկման կարիք ունե՞ք։ Փորձեք մեր վերջին գաղափարները մշակման փուլում։ Այս գործառույթները դեռևս վերջնականապես մշակված չեն. դրանք կարող են անկայուն լինել, կարող են փոխվել կամ ընդհանրապես հանվել։ Իմացեք ավելին։", + "experimental_section": "Վաղ նախադիտումներ", + "extended_profiles_msc_support": "Պահանջում է, որ ձեր սերվերը աջակցի MSC4133-ը", + "feature_disable_call_per_sender_encryption": "Անջատել յուրաքանչյուր ուղարկողի գաղտնագրումը Element զանգի համար", + "feature_wysiwyg_composer_description": "Հաղորդագրության խմբագրիչում օգտագործել \"ձևաչափված տեքստ\" (Rich Text)՝ Markdown-ի փոխարեն", + "group_calls": "Խմբային զանգի նոր փորձ", + "group_developer": "Ծրագրավորող", + "group_encryption": "Գաղտնագրում", + "group_experimental": "Փորձարարական", + "group_messaging": "Նամակագրություն", + "group_moderation": "Մոդերացիա(չափավորում)", + "group_profile": "Պրոֆիլ", + "group_rooms": "Սենյակներ", + "group_spaces": "Տարածքներ", + "group_themes": "Ոճեր", + "group_threads": "Թեմաներ", + "group_ui": "Օգտագործողի միջերես(ինտերֆեյս)", + "group_voip": "Ձայն և վիդեո", + "group_widgets": "Վիջեթներ", + "hidebold": "Թաքցնել ծանուցման կետը (ցուցադրել միայն քանակների նշանները)", + "html_topic": "Ցուցադրել սենյակի թեմաների HTML ներկայացումը", + "join_beta": "Միանալ բետային", + "join_beta_reload": "Բետային միանալը կվերաբեռնի %(brand)s-ը։", + "jump_to_date": "Անցնել ամսաթվին (ավելացնում է /jumptodate և անցնում ամսաթվի վերնագրին)", + "jump_to_date_msc_support": "Պահանջում է, որ ձեր սերվերը աջակցի MSC3030-ը", + "latex_maths": "Հաղորդագրություններում արտապատկերել LaTeX-ով մաթեմատիկական արտահայտությունները", + "leave_beta": "Լքել բետան", + "leave_beta_reload": "Բետայից դուրս գալը կվերաբեռնի %(brand)s-ը։", + "location_share_live": "Իրական ժամանակում գտնվելու վայրի կիսում", + "location_share_live_description": "Ժամանակավոր իրականացում: Տեղերը պահպանվում են սենյակների պատմության մեջ:", + "mjolnir": "Մարդկանց անտեսելու նոր եղանակներ", + "msc3531_hide_messages_pending_moderation": "Թույլատրել մոդերատորներին թաքցնել մոդերացիայի սպասող հաղորդագրությունները։", + "new_room_list": "Ակտիվացնել նոր սենյակների ցուցակը", + "notification_settings": "Նոր ծանուցումների կարգավորումներ", + "notification_settings_beta_caption": "Ներկայացնում ենք ձեր ծանուցումների կարգավորումները փոխելու ավելի պարզ միջոց: Անհատականացրեք ձեր %(brand)s-ն այնպես, ինչպես ցանկանում եք:", + "notification_settings_beta_title": "Ծանուցման կարգավորումներ", + "notifications": "Միացնել ծանուցումների վահանակը սենյակի վերնագրում", + "release_announcement": "Թողարկման հայտարարություն", + "render_reaction_images": "Արձանագրել հատուկ պատկերներ ռեակցիաներում", + "render_reaction_images_description": "Երբեմն կոչվում է “հատուկ էմոջիներ”:", + "report_to_moderators": "Հաղորդել մոդերատորներին", + "report_to_moderators_description": "Սենյակներում, որոնք աջակցում են չափավորումը, “Հաշվետվություն” կոճակը թույլ կտա ձեզ հաղորդել չարաշահումների մասին սենյակների մոդերատորներին:", + "share_history_on_invite": "Կիսվել գաղտնսգրված պատմությամբ նոր անդամների հետ", + "share_history_on_invite_description": "Եթե օգտատիրոջը հրավիրում եք գաղտնագրված սենյակ, որի պատմության հասանելիությունը «կիսված» է, ապա նրա հետ կիսվում է գաղտնագրված պատմությունը, և դուք նույնպես ստանում եք գաղտնագրված պատմություն, երբ հրավիրվում եք նման սենյակ։", + "share_history_on_invite_warning": "Այս գործառույթը ՓՈՐՁԱՐԱՐԱԿԱՆ է, և ոչ բոլոր անվտանգության միջոցառումներն են ներդրված։ Մի՛ միացրեք այն իրական(կարևոր) հաշիվներում։", + "sliding_sync": "Սահող համաժամեցման(Sliding Sync) ռեժիմ", + "sliding_sync_description": "Ակտիվ մշակման փուլում է, չի կարող անջատվել։", + "sliding_sync_disabled_notice": "Անջատելու համար դուրս եկեք և նորից մուտք գործեք", + "sliding_sync_server_no_support": "Ձեր սերվերը չունի աջակցություն", + "under_active_development": "Ակտիվ մշակման փուլում։", + "unrealiable_e2e": "Անհուսալի է գաղտնագրված սենյակներում", + "video_rooms": "Վիդեո սենյակներ", + "video_rooms_a_new_way_to_chat": "Ձայնի և տեսանյութի միջոցով զրուցելու նոր եղանակ %(brand)s-ում:", + "video_rooms_always_on_voip_channels": "Տեսասենյակները միշտ միացված VoIP(ձայնային փոխանցում ինտերնետային արձանագրության միջոցով) ալիքներ են, որոնք ներդրված են %(brand)s-ի սենյակում։", + "video_rooms_beta": "Վիդեո սենյակները բետա առանձնահատկություն են", + "video_rooms_faq1_answer": "Օգտագործեք ձախ վահանակի սենյակի բաժնում գտնվող «+» կոճակը:", + "video_rooms_faq1_question": "Ինչպե՞ս կարող եմ ստեղծել վիդեո սենյակ:", + "video_rooms_faq2_answer": "Այո, զրույցի ժամանակացույցը ցուցադրվում է վիդեոի հետ մեկտեղ:", + "video_rooms_faq2_question": "Կարո՞ղ եմ տեսազանգի հետ մեկտեղ օգտագործել տեքստային զրույց։", + "video_rooms_feedbackSubheading": "Շնորհակալություն բետա տարբերակը փորձելու համար, խնդրում ենք մանրամասնել որքան կարող եք, որպեսզի մենք կարողանանք բարելավել այն:", + "wysiwyg_composer": "Տեքստի կատարելագործված խմբագրիչ" + }, + "labs_mjolnir": { + "advanced_warning": "⚠ Այս կարգավորումները նախատեսված են առաջադեմ օգտատերերի համար։", + "ban_reason": "Անտեսված/Արգելափակված", + "error_adding_ignore": "Սխալ առաջացավ անտեսված օգտատիրոջ/սերվերի ավելացման ժամանակ", + "error_adding_list_description": "Խնդրում ենք ստուգել սենյակի ID-ն կամ հասցեն, և կրկին փորձել:", + "error_adding_list_title": "Սխալ՝ ցուցակին բաժանորդագրվելիս", + "error_removing_ignore": "Սխալ առաջացավ անտեսված օգտատիրոջը/սերվերին հեռացնելիս", + "error_removing_list_description": "Խնդրում ենք կրկին փորձել կամ դիտել ձեր կոնսոլը՝ հուշումներ ստանալու համար։", + "error_removing_list_title": "Սխալ՝ ցուցակից հրաժարվելու ժամանակ", + "explainer_1": "Այստեղ ավելացրեք այն օգտատերերին և սերվերներին, որոնց ցանկանում եք անտեսել: Օգտագործեք աստղանիշներ, որպեսզի %(brand)s-ը համապատասխանի ցանկացած նիշի: Օրինակ՝ @bot:*-ը կանտեսի բոլոր օգտատերերին, որոնք ունեն 'bot' անունը որևէ սերվերի վրա:", + "explainer_2": "Մարդկանց անտեսումը կատարվում է արգելափակման ցուցակների միջոցով, որոնք պարունակում են արգելափակման կանոններ: Արգելափակման ցուցակին բաժանորդագրվելը նշանակում է, որ այդ ցուցակով արգելափակված օգտատերերը/սերվերները կթաքցվեն ձեզանից:", + "lists": "Դուք ներկայումս բաժանորդագրված եք՝", + "lists_description_1": "Արգելափակված ցուցակին բաժանորդագրվելը ձեզ կհանգեցնի դրան միանալուն։", + "lists_description_2": "Եթե ​​սա այն չէ, ինչ դուք ուզում եք, խնդրում ենք օգտագործել այլ գործիք՝ օգտատերերին անտեսելու համար։", + "lists_heading": "Բաժանորդագրված ցուցակներ", + "lists_new_label": "Սենյակի ID-ն կամ արգելափակված ցուցակի հասցեն", + "no_lists": "Դուք բաժանորդագրված չեք որևէ ցուցակի", + "personal_description": "Ձեր անձնական արգելափակվածների ցանկը պարունակում է բոլոր այն օգտատերերին/սերվերներին, որոնցից դուք անձամբ չեք ցանկանում տեսնել հաղորդագրություններ։ Առաջին օգտատիրոջը/սերվերին անտեսելուց հետո, ձեր սենյակների ցանկում կհայտնվի նոր սենյակ՝ '%(myBanList)s անունով․ մնացեք այս սենյակում՝ արգելափակումների ցանկը ուժի մեջ պահելու համար։", + "personal_empty": "Դուք ոչ ոքի չեք անտեսել:", + "personal_heading": "Անձնական արգելքների ցանկ", + "personal_new_label": "Անտեսելու համար սպասարկողի կամ օգտատիրոջ ID", + "personal_new_placeholder": "օրինակ՝ @bot:* կամ example.org", + "personal_section": "Դուք ներկայումս անտեսում եք՝", + "room_name": "Իմ արգելափակումների ցանկը", + "room_topic": "Սա ձեր կողմից արգելափակված օգտատերերի/սերվերների ցանկն է. սենյակից դուրս մի՛ եկեք։", + "rules_empty": "Ոչ ոք", + "rules_server": "Սերվերի կանոններ", + "rules_title": "Արգելափակումների ցանկի կանոններ․ %(roomName)s", + "rules_user": "Օգտագործողի կանոններ", + "something_went_wrong": "Ինչոր բան սխալ է գնացել։ Խնդրում ենք կրկին փորձել կամ դիտել ձեր կոնսոլը՝ հուշումներ ստանալու համար։", + "title": "Անտեսված օգտատերեր", + "view_rules": "Դիտել կանոնները" + }, + "language_dropdown_label": "Լեզվի ցանկ", + "leave_room_dialog": { + "last_person_warning": "Դուք այստեղ միակ մարդն եք։ Եթե դուրս գաք, ապագայում ոչ ոք չի կարողանա միանալ, այդ թվում՝ դուք։", + "leave_room_question": "Վստա՞հ եք, որ ցանկանում եք լքել «%(roomName)s» սենյակը", + "leave_space_question": "Վստա՞հ եք, որ ցանկանում եք լքել «%(spaceName)s» տարածքը", + "room_leave_admin_warning": "Դուք այս սենյակում միակ ադմինիստրատորն եք։ Եթե դուրս գաք, ոչ ոք չի կարողանա փոխել սենյակի կարգավորումները կամ կատարել այլ կարևոր գործողություններ։", + "room_leave_mod_warning": "Դուք այս սենյակի միակ վերահսկողն(մոդերատոր) եք։ Եթե դուրս գաք, ոչ ոք չի կարողանա փոխել սենյակի կարգավորումները կամ կատարել այլ կարևոր գործողություններ։", + "room_rejoin_warning": "Այս սենյակը հանրային չէ։ Դուք չեք կարողանա նորից միանալ առանց հրավերի։", + "space_rejoin_warning": "Այս տարածքը հանրային չէ։ Դուք չեք կարողանա կրկին միանալ առանց հրավերի։" + }, + "left_panel": { + "open_dial_pad": "Բացեք թվերի հավաքման վահանակը" + }, + "lightbox": { + "rotate_left": "Պտտել ձախ", + "rotate_right": "Պտտել աջ", + "title": "Պատկերի տեսք" + }, + "location_sharing": { + "MapStyleUrlNotConfigured": "Այս սերվերը կարգավորված չէ քարտեզները ցուցադրելու համար:", + "MapStyleUrlNotReachable": "Այս սերվերը ճիշտ չէ կարգավորված քարտեզները ցուցադրելու համար, կամ հնարավոր է կարգավորված քարտեզի սերվերն անհասանելի լինի:", + "WebGLNotEnabled": "Քարտեզները ցուցադրելու համար անհրաժեշտ է WebGL(վեբ գրաֆիկայի գրադարան), խնդրում ենք միացնել այն ձեր զննարկիչի կարգավորումներում։", + "click_drop_pin": "Սեղմել՝ քորոցը կորցնելու համար", + "click_move_pin": "Սեղմել՝ քորոցը տեղափոխելու համար", + "close_sidebar": "Փակել կողային վահանակը", + "error_fetch_location": "Չհաջողվեց գտնել գտնվելու վայրը", + "error_no_perms_description": "Դուք պետք է ունենաք թույլտվություններ, որպեսզի կիսեք վայրերն այս սենյակում:", + "error_no_perms_title": "Դուք չունեք գտնվելու վայրեր կիսելու թույլտվություն", + "error_send_description": "%(brand)s-ը չկարողացավ ուղարկել ձեր գտնվելու վայրը: Խնդրում ենք կրկին փորձել ավելի ուշ:", + "error_send_title": "Մենք չկարողացանք ուղարկել ձեր գտնվելու վայրը", + "error_sharing_live_location": "Ձեր կենդանի գտնվելու վայրը կիսելիս սխալ է տեղի ունեցել", + "error_stopping_live_location": "Ձեր կենդանի գտնվելու վայրը դադարեցնելիս սխալ է տեղի ունեցել", + "expand_map": "Ընդլայնել քարտեզը", + "failed_generic": "Չհաջողվեց գտնել ձեր գտնվելու վայրը: Խնդրում ենք կրկին փորձել ավելի ուշ:", + "failed_load_map": "Չնհնար է բեռնել քարտեզը", + "failed_permission": "%(brand)s-ին մերժվեց ձեր գտնվելու վայրը գտնելու թույլտվությունը: Խնդրում ենք թույլատրել գտնվելու վայրի հասանելիությունը ձեր զննարկիչի կարգավորումներում:", + "failed_timeout": "Ձեր գտնվելու վայրի փնտրման ժամանակն ավարտվել է: Խնդրում ենք կրկին փորձել ավելի ուշ:", + "failed_unknown": "Գտնվելու վայրի փնտրման անհայտ սխալ: Խնդրում ենք կրկին փորձել ավելի ուշ:", + "find_my_location": "Գտնել իմ գտնվելու վայրը", + "live_description": "%(displayName)s-ի կենդանի գտնվելու վայրը", + "live_enable_description": "Խնդրում ենք նկատի ունենալ, որ սա լաբորատորիաների առանձնահատկություն է, որն օգտագործում է ժամանակավոր իրականացում: Սա նշանակում է, որ դուք չեք կարողանա ջնջել ձեր գտնվելու վայրի պատմությունը, և առաջադեմ օգտատերերը կկարողանան տեսնել ձեր գտնվելու վայրի պատմությունը նույնիսկ այն բանից հետո, երբ դուք դադարում եք կիսել ձեր կենդանի գտնվելու վայրը այս սենյակի հետ:", + "live_enable_heading": "Ուղիղ գտնվելու վայրի տարածում/կիսում", + "live_location_active": "Դուք կիսում եք ձեր կենդանի գտնվելու վայրը", + "live_location_enabled": "Միացված է կենդանի գտնվելու վայրը", + "live_location_ended": "Ուղիղ գտնվելու վայրն ավարտվեց", + "live_location_error": "Ուղիղ գտնվելու վայրի սխալ", + "live_locations_empty": "Կենդանի վայրեր չկան", + "live_share_button": "Կիսվել %(duration)s տևողությամբ", + "live_toggle_label": "Միացնել կենդանի գտնվելու վայրի տարածումը/կիսումը", + "live_until": "Գործում է մինչև %(expiryTime)s", + "live_update_time": "Թարմացվել է %(humanizedUpdateTime)s", + "loading_live_location": "Ուղիղ գտնվելու վայրը բեռնվում է...", + "location_not_available": "Գտնվելու վայրը հասանելի չէ", + "map_feedback": "Քարտեզի հետադարձ կապ", + "mapbox_logo": "Քարտեզագրման լոգո", + "reset_bearing": "Վերականգնել կրիչը դեպի հյուսիս", + "share_button": "Տարածել գտնվելու վայրը", + "share_type_live": "Իմ կենդանի գտնվելու վայրը", + "share_type_own": "Իմ ներկայիս գտնվելու վայրը", + "share_type_pin": "Կորցնել քորոցը", + "share_type_prompt": "Ո՞ր տեսակի գտնվելու վայրն եք ցանկանում կիսել:", + "toggle_attribution": "Միացնել/անջատել վերագրումը" + }, + "member_list": { + "count": { + "one": "%(count)s անդամ", + "other": "%(count)s անդամներ" + }, + "filter_placeholder": "Որոնել սենյակի անդամներին", + "invite_button_no_perms_tooltip": "Դուք չունեք օգտատերեր հրավիրելու թույլտվություն", + "invited_label": "Հրավիրված", + "list_title": "Անդամների ցանկ", + "no_matches": "Համընկնումներ չկան" + }, + "member_list_back_action_label": "Սենյակի անդամներ", + "message_edit_dialog_title": "Հաղորդագրությունների խմբագրումներ", + "migrating_crypto": "Սպասեք մի փոքր։ Մենք թարմացնում ենք %(brand)s-ը՝ գաղտնագրումն ավելի արագ և հուսալի դարձնելու համար։", + "mobile_guide": { + "toast_accept": "Օգտագործել հավելվածը", + "toast_description": "%(brand)s-ը փորձարարական է բջջային վեբ զննարկիչում: Ավելի լավ փորձի և վերջին հնարավորությունների համար օգտագործեք մեր անվճար ծրագիրը:", + "toast_title": "Օգտագործեք հավելվածը ավելի լավ փորձի համար" + }, + "name_and_id": "%(name)s (%(userId)s)", + "no_more_results": "Այլ արդյունքներ չկան", + "notif_panel": { + "empty_description": "Դուք տեսանելի ծանուցումներ չունեք։", + "empty_heading": "Ամեն ինչ կարդացված է" + }, + "notifications": { + "all_messages": "Բոլոր հաղորդագրությունները", + "all_messages_description": "Ստանալ ծանուցում յուրաքանչյուր հաղորդագրության համար", + "class_global": "Գլոբալ", + "class_other": "Այլ", + "default": "Լռելյայն", + "default_settings": "Համապատասխանեցնել լռելյայն կարգավորումները", + "email_pusher_app_display_name": "Ծանուցումներ էլ.փոստով", + "enable_prompt_toast_description": "Միացնել աշխատասեղանի ծանուցումները", + "enable_prompt_toast_title": "Ծանուցումներ", + "enable_prompt_toast_title_from_message_send": "Բաց մի թողեք պատասխանը", + "error_change_title": "Փոխել ծանուցման կարգավորումները", + "keyword": "Բանալի բառ", + "keyword_new": "Նոր բանալի բառ", + "level_activity": "Գործունեություն", + "level_highlight": "Ընդգծում", + "level_muted": "Խլացված", + "level_none": "Ոչ մի", + "level_notification": "Ծանուցում", + "level_unsent": "Չուղարկված", + "mark_all_read": "Բոլորը նշել որպես կարդացված", + "mentions_and_keywords": "@mentions (հիշատակումներ) և բանալի բառեր", + "mentions_and_keywords_description": "Ստանալ ծանուցում միայն հիշատակումներով և բանալի բառերով, ինչպես սահմանված են ձեր կարգաբերումներում", + "mentions_keywords": "Նշումներ/հիշատակումներ և բանալի բառեր", + "message_didnt_send": "Հաղորդագրությունը չի ուղարկվել: Սեղմեք տեղեկությունների համար:", + "mute_description": "Դուք չեք ստանա ոչ մի ծանուցում", + "mute_room": "\"Խլացնել\" սենյակի ձայնը" + }, + "notifier": { + "m.key.verification.request": "%(name)s-ը պահանջում է ստուգում" + }, + "onboarding": { + "create_room": "Ստեղծել խմբային զրույց", + "explore_rooms": "Ուսումնասիրել հանրային սենյակները", + "has_avatar_label": "Հիանալի է, դա կօգնի մարդկանց իմանալ, որ դա դու ես", + "intro_byline": "Սեփականացրեք/կառավարեք ձեր խոսակցությունները:", + "intro_welcome": "Բարի գալուստ %(appName)s", + "no_avatar_label": "Ավելացրեք լուսանկար, որպեսզի մարդիկ իմանան, որ դա դուք եք:", + "send_dm": "Ուղարկել անմիջական հաղորդագրություն", + "welcome_detail": "Այժմ, եկեք օգնենք ձեզ սկսել", + "welcome_user": "Բարի գալուստ %(name)s" + }, + "pill": { + "permalink_other_room": "Հաղորդագրություն %(room)s-ում", + "permalink_this_room": "Հաղորդագրություն %(user)s-ից" + }, + "poll": { + "create_poll_action": "Ստեղծել Հարցում", + "create_poll_title": "Ստեղծել հարցում", + "disclosed_notes": "Քվեարկողներն արդյունքները տեսնում են քվեարկելուց անմիջապես հետո", + "edit_poll_title": "Խմբագրել հարցումը", + "end_description": "Վստա՞հ եք, որ ցանկանում եք ավարտել այս հարցումը։ Սա կցուցադրի հարցման վերջնական արդյունքները և մարդկանց կզրկի քվեարկելու հնարավորությունից։", + "end_message": "Հարցումն ավարտված է։ Ամենաշատ պատասխանը՝ %(topAnswer)s", + "end_message_no_votes": "Հարցումն ավարտվել է։ Քվեարկություն չի անցկացվել։", + "end_title": "Հարցման ավարտ", + "error_ending_description": "Կներեք, հարցումը չի ավարտվել։ Խնդրում ենք կրկին փորձել։", + "error_ending_title": "Չհաջողվեց ավարտել հարցումը", + "error_voting_description": "Կներեք, ձեր քվեն/ձայնը չի գրանցվել։ Խնդրում ենք կրկին փորձել։", + "error_voting_title": "Քվեարկությունը չի գրանցվել", + "failed_send_poll_description": "Կներեք, ձեր կողմից ստեղծված հարցումը չի հրապարակվել։", + "failed_send_poll_title": "Չհաջողվեց հրապարակել հարցումը", + "notes": "Արդյունքները կհայտնվեն/կհրապարակվեն միայն հարցման ավարտից հետո", + "options_add_button": "Ավելացնել տարբերակ", + "options_heading": "Ստեղծել տարբերակներ", + "options_label": "Տարբերակ %(number)s", + "options_placeholder": "Գրել տարբերակ", + "topic_heading": "Ո՞րն է ձեր հարցման հարցը կամ թեման։", + "topic_label": "Հարց կամ թեմա", + "topic_placeholder": "Գրեք ինչոր բան…", + "total_decryption_errors": "Վերծանման սխալների պատճառով որոշ ձայներ կարող են չհաշվվել", + "total_n_votes": { + "one": "%(count)s ձայն է տվել։ Քվեարկեք՝ արդյունքները տեսնելու համար։", + "other": "%(count)s ձայներ են տվել։ Քվեարկեք՝ արդյունքները տեսնելու համար։" + }, + "total_n_votes_voted": { + "one": "Հիմնված %(count)s ձայնի վրա", + "other": "Հիմնված %(count)s ձայների վրա" + }, + "total_no_votes": "Ձայներ չեն ներկայացվել", + "total_not_ended": "Արդյունքները տեսանելի կլինեն, երբ հարցումն ավարտվի", + "type_closed": "Փակ հարցում", + "type_heading": "Հարցման տեսակը", + "type_open": "Բաց հարցում", + "unable_edit_description": "Ցավոք, ձայները ներկայացնելուց(քվեարկությունն ավարտվելուց) հետո դուք չեք կարող խմբագրել հարցումը:", + "unable_edit_title": "Հարցումը հնարավոր չէ խմբագրել" + }, + "power_level": { + "admin": "Ադմին", + "creator": "Սեփականատեր", + "custom": "Հատուկ (%(level)s)", + "custom_level": "Հատուկ մակարդակ", + "default": "Լռելյայն", + "label": "Էլեկտրաէներգիայի մակարդակը", + "moderator": "Մոդերատոր", + "restricted": "Սահմանափակված" + }, + "powered_by_matrix": "Մշակված Matrix-ի կողմից", + "powered_by_matrix_with_logo": "Ապակենտրոնացված և գաղտնագրված զրույց ու համագործակցություն՝ $matrixLogo-ի աջակցությամբ", + "presence": { + "away": "Տեղում չէ", + "busy": "Զբաղված", + "idle": "Անզբաղ", + "idle_for": "Անզբաղ %(duration)s ժամանակ", + "offline": "Անցանց", + "offline_for": "Անցանց %(duration)s ժամանակ", + "online": "Առցանց", + "online_for": "Առցանց %(duration)s ժամանակ", + "unknown": "Անհայտ", + "unknown_for": "Անհայտ %(duration)s ժամանակ", + "unreachable": "Օգտատիրոջ սերվերը անհասանելի է" + }, + "quick_settings": { + "all_settings": "Բոլոր կարգավորումները", + "metaspace_section": "Ամրացնել կողային վահանակում", + "sidebar_settings": "Լրացուցիչ ընտրանքներ", + "title": "Արագ կարգավորումներ" + }, + "quit_warning": { + "call_in_progress": "Դուք, կարծես, զանգի մեջ եք, վստա՞հ եք, որ ցանկանում եք դուրս գալ։", + "file_upload_in_progress": "Դուք, կարծես թե, ֆայլեր եք վերբեռնում, վստա՞հ եք, որ ցանկանում եք դուրս գալ։" + }, + "redact": { + "confirm_button": "Հաստատեք հեռացումը", + "confirm_description": "Վստա՞հ եք, որ ցանկանում եք հեռացնել (ջնջել) այս միջոցառումը։", + "confirm_description_state": "Նկատի ունեցեք, որ սենյակի նման փոփոխությունները հեռացնելը կարող է չեղարկել փոփոխությունը։", + "error": "Դուք չեք կարող ջնջել այս հաղորդագրությունը։ (%(code)s)", + "ongoing": "Հեռացվում է…", + "reason_label": "Պատճառ (ըստ ցանկության)" + }, + "report_content": { + "description": "Այս հաղորդագրության մասին հաղորդելը կուղարկի դրա եզակի «իրադարձության ID-ն» ձեր գլխավոր սերվերի ադմինիստրատորին: Եթե այս սենյակում հաղորդագրությունները գաղտնագրված են, ձեր գլխավոր սերվերի ադմինիստրատորը չի կարողանա կարդալ հաղորդագրության տեքստը կամ դիտել որևէ ֆայլ կամ պատկեր:", + "disagree": "Համաձայն չեմ", + "error_create_room_moderation_bot": "Հնարավոր չէ ստեղծել սենյակ մոդերատորական բոտի միջոցով", + "hide_messages_from_user": "Նշեք, եթե ցանկանում եք թաքցնել այս օգտատիրոջից ստացված բոլոր ներկա և ապագա հաղորդագրությունները։", + "ignore_user": "Անտեսել օգտատիրոջը", + "illegal_content": "Անօրինական բովանդակություն", + "missing_reason": "Խնդրում ենք նշել, թե ինչու եք հայտնում(բողոքում) այդ մասին:", + "nature": "Խնդրում ենք ընտրել բնույթ և նկարագրել, թե ինչն է այս հաղորդագրությունը դարձնում վիրավորական։", + "nature_disagreement": "Այս օգտատիրոջ գրածը սխալ է։\nՍա կհաղորդվի սենյակի մոդերատորներին։", + "nature_illegal": "Այս օգտատերը ցուցաբերում է անօրինական վարքագիծ, օրինակ ՝ վիրավորում է մարդկանց կամ սպառնում է բռնությամբ։\nԱյս մասին կտեղեկացվի սենյակի մոդերատորներին, ովքեր կարող են տեղեկությունը փոխանցել իրավապահ մարմիններին:", + "nature_nonstandard_admin": "Այս սենյակը նախատեսված է արգելված կամ թունավոր բովանդակություն տեղադրելու համար, կամ մոդերատորները չեն կարողանում վերահսկել անօրինական կամ թունավոր բովանդակությունը։\nԱյս մասին կտեղեկացվի %(homeserver)s-ի ադմինիստրատորներին:", + "nature_nonstandard_admin_encrypted": "Այս սենյակը նախատեսված է արգելված կամ թունավոր բովանդակություն տեղադրելու համար, կամ մոդերատորները չեն կարողանում վերահսկել անօրինական կամ թունավոր բովանդակությունը։\nԱյս մասին կտեղեկացվի %(homeserver)s֊ի ադմինիստրատորներին: Ադմինիստրատորները չեն կարողանա կարդալ այս սենյակի գաղտնագրված բովանդակությունը/հաղորդագրությունները:", + "nature_other": "Որևէ այլ պատճառ։ Խնդրում ենք նկարագրել խնդիրը։\nՍա կհաղորդվի սենյակի մոդերատորներին։", + "nature_spam": "Այս օգտվողը սենյակում ուղարկում է գովազդներ, հղումներ դեպի գովազդ կամ քարոզչություն:\nԱյս մասին կտեղեկացվի սենյակի մոդերատորներին:", + "nature_toxic": "Այս օգտատերը ցուցաբերում է ագրեսիվ(տոքսիկ) վարք, օրինակ՝ վիրավորում է այլ օգտատերերի, ընտանեկան հանգստի սենյակում տեղադրում է միայն մեծահասակների համար նախատեսված նյութեր կամ այլ կերպ խախտում է այդ սենյակի կանոնները:\nԱյս մասին կտեղեկացվի սենյակի մոդերատորներին:", + "other_label": "Այլ", + "report_content_to_homeserver": "Հաղորդել բովանդակությունը ձեր գլխավոր սերվերի(Homeserver) ադմինիստրատորին", + "report_entire_room": "Հաղորդել ամբողջ սենյակի մասին", + "spam_or_propaganda": "Սպամ կամ քարոզչություն", + "toxic_behaviour": "Թունավոր/տոքսիկ/վիրավորական վարքագիծ" + }, + "report_room": { + "description": "Հաղորդե այս սենյակի մասին ձեր հաշվի մատակարարին(account provider)։ Եթե հաղորդագրությունները գաղտնագրված են, ձեր ադմինիստրատորը չի կարողանա կարդալ դրանք։", + "reason_label": "Նկարագրել պատճառը" + }, + "restore_key_backup_dialog": { + "count_of_decryption_failures": "Չհաջողվեց վերծանել %(failedCount)s սեսիա", + "count_of_successfully_restored_keys": "%(sessionCount)s բանալիները հաջողությամբ վերականգնվեցին", + "enter_key_description": "Մուտք գործեք ձեր անվտանգ հաղորդագրությունների պատմություն և կարգավորեք անվտանգ հաղորդագրությունները՝ մուտքագրելով ձեր վերականգնման բանալին։", + "enter_key_title": "Մուտքագրեք վերականգնման բանալին(Recovery Key)", + "enter_phrase_description": "Մուտք գործեք ձեր անվտանգ հաղորդագրությունների պատմություն և կարգավորեք անվտանգ հաղորդագրություններ՝ մուտքագրելով ձեր անվտանգության արտահայտությունը:", + "enter_phrase_title": "Մուտքագրեք անվտանգության արտահայտությունը", + "incorrect_security_phrase_dialog": "Պահուստային պատճենը հնարավոր չէ վերծանել այս անվտանգության արտահայտությամբ. խնդրում ենք ստուգել, որ մուտքագրել եք ճիշտ անվտանգության արտահայտությունը։", + "incorrect_security_phrase_title": "Սխալ անվտանգության արտահայտություն(Security Phrase)", + "key_backup_warning": "Զգուշացում. Դուք պետք է բանալիների պահուստավորումը կարգավորեք միայն վստահելի համակարգչից։", + "key_fetch_in_progress": "Սերվերից բանալիների ստացում…", + "key_forgotten_text": "Եթե մոռացել եք ձեր վերականգնման բանալին, կարող եք ", + "key_is_invalid": "Վերականգնման բանալի(Recovery Key) վավեր չէ", + "key_is_valid": "Սա կարծես վավեր վերականգնման բանալի է։", + "keys_restored_title": "Բանալիները վերականգնված են", + "load_error_content": "Անհնար է բեռնել պահուստավորման կարգավիճակը", + "load_keys_progress": "%(completed)s-ը %(total)s բանալիներից վերականգնվել է", + "no_backup_error": "Պահուստային պատճեն չի գտնվել։", + "phrase_forgotten_text": "Եթե մոռացել եք ձեր անվտանգության արտահայտությունը, կարող եք օգտագործել ձեր վերականգնման բանալին կամ կարգավորել վերականգնման նոր տարբերակներ", + "recovery_key_mismatch_description": "Պահուստային պատճենը հնարավոր չէ վերծանել այս վերականգնման բանալիով. խնդրում ենք ստուգել, որ մուտքագրել եք ճիշտ վերականգնման բանալին։", + "recovery_key_mismatch_title": "Վերականգնման բանալու(Recovery Key) անհամապատասխանություն", + "restore_failed_error": "Անհնար է վերականգնել պահուստային պատճենը" + }, + "right_panel": { + "add_integrations": "Ավելացնել ընդլայնումներ", + "add_topic": "Ավելացնել թեմա", + "extensions_button": "Ընդլայնումներ", + "extensions_empty_description": "Ընտրեք «%(addIntegrations)s»՝ սենյակին ընդլայնումներ ավելացնելու և զննելու համար", + "extensions_empty_title": "Բարձրացրեք արդյունավետությունը ավելի շատ գործիքների, վիջեթների և բոտերի միջոցով", + "files_button": "Ֆայլեր", + "pinned_messages": { + "empty_description": "Սեղմեք հաղորդագրությանը և ընտրեք «%(pinAction)s», որպեսզի այն ներառվի այստեղ։", + "empty_title": "Ամրացրեք(pin) կարևոր հաղորդագրությունները, որպեսզի դրանք հեշտությամբ հայտնաբերվեն", + "header": { + "one": "1 ամրացված հաղորդագրություն", + "other": "%(count)s ամրացված հաղորդագրություններ" + }, + "limits": { + "one": "", + "other": "Դուք կարող եք ամրացնել միայն մինչև%(count)s վիջեթներ" + }, + "menu": "Բացել մենյուն", + "reply_thread": "Պատասխանել թեմատիկ հաղորդագրությանը", + "unpin_all": { + "button": "Ապաամրացնել բոլոր հաղորդագրությունները", + "content": "Համոզվեք, որ իսկապես ուզում եք հեռացնել բոլոր ամրացված հաղորդագրությունները: Այս գործողությունը չի կարող հետարկվել:", + "title": "Ապաամրացնե՞լ բոլոր հաղորդագրությունները։" + }, + "view": "Դիտել ժամանակագրության մեջ" + }, + "pinned_messages_button": "Ամրացված հաղորդագրություններ", + "poll": { + "active_heading": "Ակտիվ հարցումներ", + "empty_active": "Այս սենյակում ակտիվ հարցումներ չկան", + "empty_active_load_more": "Ակտիվ հարցումներ չկան: Բեռնեք ավելի շատ հարցումներ՝ նախորդ ամիսների հարցումները դիտելու համար:", + "empty_active_load_more_n_days": { + "one": "Անցած օրվա համար ակտիվ հարցումներ չկան: Բեռնեք ավելի շատ հարցումներ՝ նախորդ ամիսների հարցումները դիտելու համար:", + "other": "Վերջին %(count)s օրերի համար ակտիվ հարցումներ չկան։ Բեռնեք ավելի շատ հարցումներ՝ նախորդ ամիսների հարցումները դիտելու համար։" + }, + "empty_past": "Այս սենյակում անցյալ հարցումներ չկան", + "empty_past_load_more": "Անցյալ հարցումներ չկան: Բեռնեք ավելի շատ հարցումներ՝ նախորդ ամիսների հարցումները դիտելու համար:", + "empty_past_load_more_n_days": { + "one": "Անցած օրվա համար անցյալ հարցումներ չկան: Բեռնեք ավելի շատ հարցումներ՝ նախորդ ամիսների հարցումները դիտելու համար:", + "other": "Վերջին %(count)s օրերի համար անցյալ հարցումներ չկան։ Բեռնեք ավելի շատ հարցումներ՝ նախորդ ամիսների հարցումները դիտելու համար։" + }, + "final_result": { + "one": "Վերջնական արդյունքը՝ հիմնված %(count)s ձայնի վրա", + "other": "Վերջնական արդյունքը՝ հիմնված %(count)s ձայների վրա" + }, + "load_more": "Բեռնել ավելի շատ հարցումներ", + "loading": "Հարցումների բեռնում", + "past_heading": "Անցյալ հարցումներ", + "view_in_timeline": "Դիտել հարցումը ժամանակացույցում", + "view_poll": "Դիտել հարցումը" + }, + "polls_button": "Հարցումներ", + "room_summary_card": { + "title": "Սենյակի տեղեկություններ" + }, + "thread_list": { + "context_menu_label": "Թեմայի ընտրանքներ" + }, + "title": "Աջ վահանակ", + "video_room_chat": { + "title": "Զրուցարան" + } + }, + "room": { + "3pid_invite_email_not_found_account": "Այս հրավերը ուղարկվել է %(email)s հասցեին, որը կապված չէ ձեր հաշվի հետ", + "3pid_invite_email_not_found_account_room": "%(roomName)s սենյակի հրավերը %(email)s հասցեին է ուղարկվել, որը կապված չէ ձեր հաշվի հետ", + "3pid_invite_error_description": "Ձեր հրավերը վավերացնելու փորձի ժամանակ վերադարձվել է սխալ (%(errcode)s): Դուք կարող եք փորձել այս տեղեկությունը փոխանցել այն մարդուն, ով հրավիրել է ձեզ։", + "3pid_invite_error_invite_action": "Ամեն դեպքում փորձել միանալ", + "3pid_invite_error_invite_subtitle": "Դուք կարող եք միանալ միայն գործող հրավերով։", + "3pid_invite_error_public_subtitle": "Դուք դեռ կարող եք միանալ այստեղ։", + "3pid_invite_error_title": "Ձեր հրավերի հետ կապված ինչոր բան սխալ է եղել։", + "3pid_invite_error_title_room": "%(roomName)s սենյակի ձեր հրավերի հետ կապված ինչոր բան սխալ է գնացել", + "3pid_invite_no_is_subtitle": "Օգտագործեք նույնականացման սերվերը Կարգավորումներում՝ հրավերներ ստանալու համար անմիջապես %(brand)s-ում:", + "banned_by": "Դուք արգելափակվել եք %(memberName)s-ի կողմից", + "banned_from_room_by": "Դուք արգելափակվել եք %(roomName)s-ից %(memberName)s-ի կողմից", + "context_menu": { + "copy_link": "Պատճենել սենյակի հղումը", + "favourite": "Սիրված", + "forget": "Մոռանալ սենյակը", + "low_priority": "Ցածր առաջնահերթություն", + "mark_read": "Նշել որպես կարդացված", + "mark_unread": "Նշել որպես չկարդացված", + "notifications_default": "Համապատասխանում լռելյայն կարգավորումը", + "notifications_mute": "Լռեցնել սենյակը", + "title": "Սենյակի տարբերակներ", + "unfavourite": "Ավելացված է ընտրյալների մեջ" + }, + "creating_room_text": "Մենք ստեղծում ենք սենյակ %(names)s անունով", + "dm_invite_action": "Սկսել զրուցել", + "dm_invite_subtitle": "-ը ցանկանում է զրուցել", + "dm_invite_title": "Ցանկանո՞ւմ եք զրուցել %(user)s-ի հետ:", + "drop_file_prompt": "Ֆայլը գցեք այստեղ՝ վերբեռնելու համար", + "edit_topic": "Խմբագրել թեման", + "error_3pid_invite_email_lookup": "Անհնար է գտնել օգտատիրոջը էլ. փոստով", + "error_cancel_knock_title": "Չհաջողվեց չեղարկել", + "error_join_403": "Այս սենյակ մուտք գործելու համար ձեզ անհրաժեշտ է հրավեր:", + "error_join_404_1": "Դուք փորձել եք միանալ սենյակի ID-ով՝ առանց միանալու սերվերների ցանկ տրամադրելու։ Սենյակի ID-ները ներքին նույնականացուցիչներ են և չեն կարող օգտագործվել սենյակին միանալու համար՝ առանց լրացուցիչ տեղեկությունների։", + "error_join_404_2": "Եթե գիտեք սենյակի հասցեն, փորձեք միանալ դրանով։", + "error_join_404_invite": "Ձեզ հրավիրող անձը արդեն հեռացել է, կամ նրա սերվերը անջատված է։", + "error_join_404_invite_same_hs": "Ձեզ հրավիրած անձն արդեն հեռացել է։", + "error_join_connection": "Միանալու սխալ տեղի ունեցավ։", + "error_join_incompatible_version_1": "Կներեք, ձեր սերվերը չափազանց հին է այստեղ մասնակցելու համար։", + "error_join_incompatible_version_2": "Խնդրում ենք կապվել ձեր սերվերի ադմինիստրատորի հետ։", + "error_join_title": "Չհաջողվեց միանալ", + "error_jump_to_date": "Սերվերը վերադարձրեց %(statusCode)s վիճակի կոդ՝ %(errorCode)s սխալի կոդով", + "error_jump_to_date_connection": "Տվյալ ամսաթիվը գտնելու և դրան անցնելու փորձի ժամանակ ցանցային սխալ տեղի ունեցավ: Հնարավոր է՝ ձեր սերվերը անջատված է, կամ ձեր ինտերնետ կապի հետ կապված ժամանակավոր խնդիր է եղել: Խնդրում ենք կրկին փորձել: Եթե սա շարունակվի, խնդրում ենք կապվել ձեր սերվերի ադմինիստրատորի հետ:", + "error_jump_to_date_details": "Սխալի մանրամասներ", + "error_jump_to_date_not_found": "Մենք չկարողացանք գտնել %(dateString)s-ից առաջ սպասվող իրադարձություն։ Փորձեք ընտրել ավելի վաղ ամսաթիվ։", + "error_jump_to_date_send_logs_prompt": "Խնդրում եմ ներկայացնել վրիպազերծման գրանցամատյանները (debug logs), որպեսզի օգնեք մեզ հետևել խնդրին։", + "error_jump_to_date_title": "Անհնար է գտնել այդ ամսաթվի իրադարձությունը", + "face_pile_summary": { + "one": "%(count)s անձ, ում գիտեք, արդեն միացել է", + "other": "%(count)s մարդիկ, ում գիտեք, արդեն միացել են" + }, + "face_pile_tooltip_label": { + "one": "Դիտել 1 անդամ", + "other": "Դիտել բոլոր %(count)s անդամներին" + }, + "face_pile_tooltip_shortcut": "Ներառյալ %(commaSeparatedMembers)s", + "face_pile_tooltip_shortcut_joined": "Ներառյալ ձեզ, %(commaSeparatedMembers)s", + "failed_determine_user": "Հնարավոր չէ պարզել, թե որ օգտվողին պետք է անտեսել, քանի որ անդամակցության իրադարձությունը փոխվել է։", + "failed_reject_invite": "Հրավերի մերժումը ձախողվեց", + "forget_room": "Մոռանալ այս սենյակը", + "forget_space": "Մոռանալ այս տարածքը", + "header": { + "n_people_asking_to_join": { + "one": "Խնդրում են միանալ", + "other": "%(count)s մարդիկ խնդրում են միանալ" + }, + "room_is_public": "Այս սենյակը հանրային է" + }, + "header_avatar_open_settings_label": "Բացել սենյակի կարգավորումները", + "header_face_pile_tooltip": "Մարդիկ", + "header_untrusted_label": "Անվստահելի", + "inaccessible": "Այս սենյակը կամ տարածքը այս պահին հասանելի չէ։", + "inaccessible_name": "%(roomName)s-ն այս պահին հասանելի չէ։", + "inaccessible_subtitle_1": "Փորձեք կրկին ավելի ուշ կամ խնդրեք սենյակի կամ տարածքի ադմինիստրատորին ստուգել, թե արդյոք դուք ունեք հասանելիություն:", + "inaccessible_subtitle_2": "%(errcode)s-ը վերադարձվել է սենյակ կամ տարածք մուտք գործելու փորձի ժամանակ։ Եթե կարծում եք, որ այս հաղորդագրությունը սխալմամբ եք տեսնում, խնդրում ենք ուղարկել սխալի մասին հաղորդում .", + "intro": { + "dm_caption": "Այս զրույցին մասնակցում եք միայն դուք երկուսով, քանի դեռ ձեզանից որևէ մեկը չհրավիրի ուրիշ մեկին միանալու։", + "enable_encryption_prompt": "Միացրեք կոդավորումը կարգավորումներում։", + "encrypted_3pid_dm_pending_join": "Երբ բոլորը միանան, դուք կկարողանաք զրուցել", + "no_avatar_label": "Ավելացրեք լուսանկար, որպեսզի մարդիկ հեշտությամբ տեսնեն ձեր սենյակը։", + "no_topic": "Ավելացրեք թեմա , որը կօգնի մարդկանց իմանալ, թե ինչի մասին է խոսքը:", + "private_unencrypted_warning": "Ձեր մասնավոր հաղորդագրությունները սովորաբար գաղտնագրված են, բայց այս սենյակը՝ ոչ: Սովորաբար դա պայմանավորված է չաջակցվող սարքով կամ մեթոդով, օրինակ՝ էլ.փոստային հրավերներով։", + "room_invite": "Հրավիրել միայն այս սենյակ", + "send_message_start_dm": "Ուղարկեք Ձեր առաջին հաղորդագրությունը՝ -ին զրույցի հրավիրելու համար", + "start_of_dm_history": "Սա ձեր անհատական հաղորդագրությունների պատմության սկիզբն է ֊ի հետ.", + "start_of_room": "Սա -ի սկիզբն է", + "unencrypted_warning": "Ծայրից ծայր գաղտնագրումը միացված չէ", + "user_created": "%(displayName)s-ն ստեղծել է այս սենյակը։", + "you_created": "Դուք ստեղծեցիք այս սենյակը:" + }, + "invite_email_mismatch_suggestion": "Հրավերներն անմիջապես %(brand)s֊ում ստանալու համար կիսվեք այս էլ․փոստով Կարգավորումներում.", + "invite_sent_to_email": "Այս հրավերը ուղարկվել է %(email)s հասցեին", + "invite_sent_to_email_room": "%(roomName)s սենյակի այս հրավերը %(email)s հասցեին է ուղարկվել", + "invite_subtitle": "Հրավիրված ֊ի կողմից", + "invite_this_room": "Հրավիրել այս սենյակ", + "invite_title": "Ցանկանո՞ւմ եք միանալ %(roomName)s֊ին", + "inviter_unknown": "Անհայտ", + "invites_you_text": "-ը հրավիրում է ձեզ", + "join_button_account": "Գրանցվել", + "join_failed_needs_invite": "%(roomName)s-ը դիտելու համար անհրաժեշտ է հրավեր", + "join_the_discussion": "Միանալ քննարկմանը", + "join_title": "Միացեք սենյակին՝ մասնակցելու համար", + "join_title_account": "Միանալ զրույցին հաշվի միջոցով", + "joining": "Միանում է…", + "joining_room": "Միանում է սենյակին…", + "joining_space": "Միանում է տարածքին…", + "jump_read_marker": "Անցնել առաջին չկարդացված հաղորդագրությանը։", + "jump_to_bottom_button": "Անցնել ամենավերջին հաղորդագրություններին", + "jump_to_date": "Անցնել ամսաթվին", + "jump_to_date_beginning": "Սենյակի սկիզբը", + "jump_to_date_prompt": "Ընտրեք ամսաթիվը, որին պետք է անցնել", + "kick_reason": "Պատճառը՝ %(reason)s", + "kicked_by": "Դուք հեռացվել եք %(memberName)s-ի կողմից", + "kicked_from_room_by": "Դուք հեռացվել եք%(roomName)s-ից՝ %(memberName)s-ի կողմից", + "knock_cancel_action": "Չեղարկել հարցումը", + "knock_denied_subtitle": "Քանի որ ձեզ մերժվել է մուտքը, դուք չեք կարող կրկին միանալ, եթե ձեզ չհրավիրեն խմբի ադմինիստրատորը կամ մոդերատորը։", + "knock_denied_title": "Ձեզ թույլ չեն տվել մուտք գործել", + "knock_message_field_placeholder": "Հաղորդագրություն (ըստ ցանկության)", + "knock_prompt": "Խնդրե՞լ միանալ", + "knock_prompt_name": "Խնդրե՞լ միանալ %(roomName)s֊ին", + "knock_send_action": "Հայցել հասանելիություն", + "knock_sent": "Միանալու հարցումն ուղարկվել է", + "knock_sent_subtitle": "Ձեր միանալու հարցումը սպասման մեջ է։", + "knock_subtitle": "Զրույցը դիտելու կամ դրան մասնակցելու համար ձեզ անհրաժեշտ է այս սենյակ մուտք գործելու թույլտվություն։ Միանալու հարցում կարող եք ուղարկել ստորև։", + "leave_error_title": "Սենյակից դուրս գալու սխալ", + "leave_server_notices_description": "Այս սենյակն օգտագործվում է Homeserver-ից կարևոր հաղորդագրությունների համար, ուստի դուք չեք կարող այն լքել։", + "leave_server_notices_title": "Հնարավոր չէ լքել սերվերի ծանուցումների սենյակը", + "leave_unexpected_error": "Անսպասելի սերվերի սխալ սենյակից դուրս գալու փորձի ժամանակ", + "link_email_to_receive_3pid_invite": "Կապեք այս էլ.փոստը Ձեր հաշվի հետ Կարգավորումներում՝ հրավերներ ստանալու համար անմիջապես %(brand)s֊ում:", + "loading_preview": "Նախադիտումը բեռնվում է", + "no_peek_join_prompt": "%(roomName)s-ը հնարավոր չէ նախադիտել։ Ցանկանո՞ւմ եք միանալ դրան։", + "no_peek_no_name_join_prompt": "Նախադիտում չկա, ուզո՞ւմ եք միանալ։", + "not_found_subtitle": "Վստա՞հ եք, որ ճիշտ տեղում եք:", + "not_found_title": "Այս սենյակը կամ տարածքը գոյություն չունի։", + "not_found_title_name": "%(roomName)s-ը գոյություն չունի։", + "peek_join_prompt": "Դուք նախադիտում եք %(roomName)s-ը. Ուզու՞մ եք միանալ դրան։", + "pinned_message_badge": "Ամրացված հաղորդագրություն", + "pinned_message_banner": { + "button_close_list": "Փակել ցանկը", + "button_view_all": "Դիտել բոլորը", + "description": "Այս սենյակում կան ամրացված հաղորդագրություններ։ Սեղմեք՝ դրանք դիտելու համար։", + "title": "%(index)s-ից %(length)s Ամրացված հաղորդագրություններ" + }, + "read_topic": "Սեղմեք՝ թեման կարդալու համար", + "rejecting": "Հրավերի մերժում…", + "rejoin_button": "Կրկին միանալ", + "room_content": "Սենյակի պարունակությունը", + "room_is_low_priority": "Սա ցածր առաջնահերթության սենյակ է", + "search": { + "all_rooms_button": "Որոնել բոլոր սենյակները", + "placeholder": "Փնտրել հաղորդագրություններ…", + "summary": { + "one": "«»–ի համար կա 1 արդյունք", + "other": "«»–ի համար կա %(count)s արդյունք" + }, + "this_room_button": "Որոնել այս սենյակը" + }, + "status_bar": { + "delete_all": "Ջնջել բոլորը", + "exceeded_resource_limit": "Ձեր հաղորդագրությունը չի ուղարկվել, քանի որ այս սերվերը գերազանցել է ռեսուրսների սահմանաչափը։ Խնդրում ենք կապվեք ձեր ծառայության ադմինիստրատորի հետ ծառայությունից օգտվելը շարունակելու համար։", + "homeserver_blocked": "Ձեր հաղորդագրությունը չի ուղարկվել, քանի որ այս սերվերն արգելափակվել է ադմինիստրատորի կողմից։ Խնդրում ենք կապվեք ձեր ծառայության ադմինիստրատորի հետ ծառայությունից օգտվելը շարունակելու համար։", + "monthly_user_limit_reached": "Ձեր հաղորդագրությունը չի ուղարկվել, քանի որ այս սերվերը հասել է իր ամսական ակտիվ օգտատերերի սահմանաչափին։ Խնդրում ենք կապվեք ձեր ծառայության ադմինիստրատորի հետ ծառայությունից օգտվելը շարունակելու համար։", + "requires_consent_agreement": "Դուք չեք կարող ուղարկել որևէ հաղորդագրություն, քանի դեռ չեք վերանայել և համաձայնվել մեր ընդհանուր դրույթներին ու պայմաններին.", + "retry_all": "Կրկին փորձել բոլորը", + "select_messages_to_retry": "Դուք կարող եք ընտրել բոլորը կամ առանձին հաղորդագրություններ՝ կրկին փորձելու կամ ջնջելու համար", + "server_connectivity_lost_description": "Ուղարկված հաղորդագրությունները կպահպանվեն այնքան ժամանակ, քանի դեռ ձեր կապը չի վերադարձել:", + "server_connectivity_lost_title": "Սերվերի հետ կապը կորել է։", + "some_messages_not_sent": "Ձեր հաղորդագրություններից որոշները չեն ուղարկվել" + }, + "unknown_status_code_for_timeline_jump": "անհայտ կարգավիճակի կոդ", + "unread_notifications_predecessor": { + "one": "Դուք ունեք %(count)s չընթերցված ծանուցում այս սենյակի նախորդ տարբերակում։", + "other": "Դուք ունեք %(count)s չընթերցված ծանուցումներ այս սենյակի նախորդ տարբերակում։" + }, + "upgrade_error_description": "Կրկնակի ստուգեք, որ ձեր սերվերը աջակցում է ընտրված սենյակի տարբերակը և փորձեք կրկին։", + "upgrade_error_title": "Սենյակի թարմացման սխալ", + "upgrade_warning_bar": "Այս սենյակի արդիականացումը կփակի սենյակի ներկայիս օրինակը և կստեղծի արդիականացված սենյակ նույն անունով։", + "upgrade_warning_bar_admins": "Միայն սենյակի ադմինիստրատորները կտեսնեն այս նախազգուշացումը", + "upgrade_warning_bar_unstable": "Այս սենյակում աշխատում է սենյակի տարբերակը, որը այս սերվերը նշել է որպես անկայուն:", + "upgrade_warning_bar_upgraded": "Այս սենյակն արդեն արդիականացվել է։", + "upload": { + "uploading_multiple_file": { + "one": "Բեռնվում է %(filename)s և %(count)s այլ ֆայլ", + "other": "Բեռնվում է %(filename)s և %(count)s այլ ֆայլեր" + }, + "uploading_single_file": "Բեռնվում է %(filename)s-ը" + }, + "video_room": "Սենյակը նախատեսված է վիդեո կապի համար", + "waiting_for_join_subtitle": "Երբ հրավիրված օգտատերերը միանան %(brand)s-ին, դուք կկարողանաք զրուցել և սենյակը կլինի ծայրից ծայր գաղտնագրված", + "waiting_for_join_title": "Սպասում ենք %(brand)s-ին օգտատերերի միանալուն" + }, + "room_list": { + "add_room_label": "Ավելացնել սենյակ", + "add_space_label": "Ավելացնել տարածք", + "breadcrumbs_empty": "Վերջերս այցելած սենյակներ չկան", + "breadcrumbs_label": "Վերջերս այցելած սենյակներ", + "collapse_filters": "Ծալել ֆիլտրերի ցանկը", + "empty": { + "no_chats": "Դեռևս զրույցներ չկան", + "no_chats_description": "Սկսեք՝ ուղարկելով հաղորդագրություն ինչ-որ մեկին կամ ստեղծելով սենյակ", + "no_chats_description_no_room_rights": "Սկսեք՝ հաղորդագրություն ուղարկելով ինչ-որ մեկին։", + "no_favourites": "Դուք դեռ չունեք սիրելի զրույց", + "no_favourites_description": "Զրույցը նախընտրածների մեջ ավելացնելու համար օգտագործեք զրույցի կարգավորումները։", + "no_invites": "Դուք չունեք չկարդացված հրավերներ", + "no_lowpriority": "Դուք ցածր առաջնահերթության սենյակներ չունեք", + "no_mentions": "Դուք չունեք չկարդացված հիշատակումներ", + "no_people": "Դուք դեռ ոչ մեկի հետ անհատական զրույց չունեք", + "no_people_description": "Դուք կարող եք անջատել ֆիլտրերը՝ ձեր մյուս զրույցները տեսնելու համար", + "no_rooms": "Դուք դեռ որևէ սենյակում չեք գտնվում", + "no_rooms_description": "Դուք կարող եք անջատել ֆիլտրերը՝ ձեր մյուս զրույցները տեսնելու համար", + "no_unread": "Շնորհավորանքներ։ Դուք չունեք չկարդացված հաղորդագրություններ։", + "show_activity": "Տեսնել ամբողջ ակտիվությունը", + "show_chats": "Ցուցադրել բոլոր զրույցները" + }, + "expand_filters": "Ընդարձակել ֆիլտրերի ցանկը", + "failed_add_tag": "Չհաջողվեց %(tagName)s պիտակը(tag) ավելացնել սենյակին", + "failed_remove_tag": "Չհաջողվեց հեռացնել %(tagName)s պիտակը(tag) սենյակից", + "failed_set_dm_tag": "Չհաջողվեց սահմանել ուղիղ հաղորդագրության պիտակը(tag)", + "filters": { + "favourite": "Ընտրյալներ", + "invites": "Հրավերներ", + "low_priority": "Ցածր առաջնահերթություն", + "mentions": "Հիշատակումներ", + "people": "Մարդիկ", + "rooms": "Սենյակներ", + "unread": "Չկարդացվածներ" + }, + "home_menu_label": "Գլխավոր էջի ընտրանքներ", + "join_public_room_label": "Միանալ հանրային սենյակին", + "joining_rooms_status": { + "one": "Ներկայումս միանում է %(count)s սենյակին", + "other": "Ներկայումս միանում է %(count)s սենյակներին" + }, + "list_title": "Սենյակների ցանկ", + "more_options": { + "copy_link": "Պատճենել սենյակի հղումը", + "favourited": "Ավելացված է ընտրյալների մեջ", + "leave_room": "Լքել սենյակը", + "low_priority": "Ցածր առաջնահերթություն", + "mark_read": "Նշել որպես կարդացված", + "mark_unread": "Նշել որպես չկարդացված" + }, + "notification_options": "Ծանուցման ընտրանքներ", + "open_space_menu": "Բացել տարածքների մենյուն", + "primary_filters": "Սենյակների ցանկի ֆիլտրեր", + "redacting_messages_status": { + "one": "Ներկայումս ջնջվում են %(count)s սենյակում", + "other": "Ներկայումս ջնջվում են %(count)s սենյակներում" + }, + "room": { + "more_options": "Լրացուցիչ ընտրանքներ", + "open_room": "Բացել %(roomName)s սենյակը" + }, + "room_options": "Սենյակի պարամետրեր", + "show_less": "Ցուցադրել ավելի քիչ", + "show_n_more": { + "one": "Ցուցադրել ևս %(count)s", + "other": "Ցուցադրել ևս %(count)s" + }, + "show_previews": "Ցուցադրել հաղորդագրությունների նախադիտումները", + "sort": "Տեսակավորել", + "sort_by": "Տեսակավորել ըստ", + "sort_by_activity": "Գործունեություն", + "sort_by_alphabet": "Ա—Ֆ", + "sort_type": { + "activity": "Գործունեություն", + "atoz": "Ա–Ֆ" + }, + "sort_unread_first": "Սկզբում ցուցադրել չկարդացված հաղորդագրություններով սենյակները", + "space_menu": { + "home": "Տարածքի գլխավոր էջ", + "space_settings": "Տարածքի կարգավորումներ" + }, + "space_menu_label": "%(spaceName)s-ի մենյուն", + "sublist_options": "Ցուցակի ընտրանքներ", + "suggested_rooms_heading": "Խորհուդ տրվող սենյակներ" + }, + "room_settings": { + "access": { + "description_space": "Որոշել, թե ով կարող է դիտել և միանալ %(spaceName)s-ին:", + "title": "Մուտք/հասանելիություն" + }, + "advanced": { + "error_upgrade_description": "Սենյակի թարմացումը/արդիականացումը հնարավոր չէր ավարտել", + "error_upgrade_title": "Չհաջողվեց թարմացնել սենյակը", + "information_section_room": "Սենյակի մասին տեղեկատվություն", + "information_section_space": "Տարածքի մասին տեղեկատվություն", + "room_id": "Ներքին սենյակի ID", + "room_predecessor": "Դիտել հին հաղորդագրությունները %(roomName)s֊ում։", + "room_upgrade_button": "Թարմացրեք այս սենյակը սենյակի առաջարկվող տարբերակով", + "room_upgrade_warning": "Զգուշացում․ սենյակի թարմացումը չի հանգեցնի սենյակի անդամների ավտոմատ տեղափոխմանը սենյակի նոր տարբերակին։ Մենք նոր սենյակի հղումը կտեղադրենք սենյակի հին տարբերակում. սենյակի անդամները պետք է սեղմեն այս հղման վրա՝ նոր սենյակին միանալու համար։", + "room_version": "Սենյակի տարբերակ․", + "room_version_section": "Սենյակի տարբերակ", + "space_predecessor": "Դիտել %(spaceName)s-ի ավելի հին տարբերակը", + "space_upgrade_button": "Թարմացրեք այս տարածքը սենյակի առաջարկվող տարբերակով", + "unfederated": "Այս սենյակը հասանելի չէ հեռակա Matrix սերվերների կողմից", + "upgrade_button": "Թարմացնել այս սենյակը մինչև %(version)s տարբերակը", + "upgrade_dialog_description": "Այս սենյակի թարմացումը/արդիականացումը պահանջում է սենյակի ներկայիս օրինակի փակումը և դրա տեղում նոր սենյակի ստեղծումը։ Սենյակի անդամներին լավագույն հնարավոր փորձառություն տրամադրելու համար մենք կանենք հետևյալը՝", + "upgrade_dialog_description_1": "Ստեղծել նոր սենյակ՝ նույն անունով, նկարագրությամբ և ավատարով", + "upgrade_dialog_description_2": "Թարմացնել ցանկացած տեղական սենյակի կեղծանուն՝ նոր սենյակին մատնանշելու համար", + "upgrade_dialog_description_3": "Կանխել օգտատերերի խոսելը սենյակի հին տարբերակում և տեղադրել հաղորդագրություն՝ խորհուրդ տալով օգտատերերին տեղափոխվել նոր սենյակ։", + "upgrade_dialog_description_4": "Նոր սենյակի սկզբում տեղադրեք հղում դեպի հին սենյակ, որպեսզի մարդիկ կարողանան տեսնել հին հաղորդագրությունները", + "upgrade_dialog_title": "Թարմացնել սենյակի տարբերակը", + "upgrade_dwarning_ialog_title_public": "Թարմացնել/արդիականացնել հանրային սենյակը", + "upgrade_warning_dialog_description": "Սենյակի արդիականացումը լրացուցիչ գործողություն է և սովորաբար խորհուրդ է տրվում, երբ սենյակը անկայուն է սխալների, բացակայող գործառույթների կամ անվտանգության խոցելիությունների պատճառով։", + "upgrade_warning_dialog_explainer": "Խնդրում ենք նկատի ունենալ, որ արդիականացումը կստեղծի սենյակի նոր տարբերակ։ Բոլոր ընթացիկ հաղորդագրությունները կմնան այս արխիվացված սենյակում։", + "upgrade_warning_dialog_footer": "Դուք կարդիականացնեք այս սենյակը -ից -ի։", + "upgrade_warning_dialog_invite_label": "Ավտոմատ կերպով այս սենյակի անդամներին հրավիրել նոր սենյակ", + "upgrade_warning_dialog_report_bug_prompt": "Սա սովորաբար ազդում է միայն այն բանի վրա, թե ինչպես է սենյակը մշակվում սերվերի վրա։ Եթե ​​խնդիրներ ունեք ձեր %(brand)s-ի հետ, խնդրում ենք հաղորդել սխալի մասին։", + "upgrade_warning_dialog_report_bug_prompt_link": "Սա սովորաբար ազդում է միայն այն բանի վրա, թե ինչպես է սենյակը մշակվում սերվերի վրա։ Եթե ​​խնդիրներ ունեք ձեր %(brand)s-ի հետ, խնդրում ենք հաղորդել սխալի մասին:", + "upgrade_warning_dialog_title": "Թարմացնել/արդիականացնել սենյակը", + "upgrade_warning_dialog_title_private": "Թարմացնել մասնավոր սենյակը" + }, + "alias_not_specified": "նշված չէ", + "bridges": { + "description": "Այս սենյակը կամուրջ է հանդիսանում հետևյալ հարթակների հետ հաղորդագրությունների համար։ Իմանալ ավելին։", + "empty": "Այս սենյակը որևէ հարթակի հետ հաղորդագրություններ չի կապում։ Իմանալ ավելին։", + "title": "Կամուրջներ" + }, + "delete_avatar_label": "Ջնջել ավատարը", + "general": { + "alias_field_has_domain_invalid": "Դոմենի բաժանարարը բացակայում է, օրինակ. (:domain.org)", + "alias_field_has_localpart_invalid": "Սենյակի անունը կամ բաժանիչը բացակայում է, օրինակ. (my-room:domain.org)", + "alias_field_matches_invalid": "Այս հասցեն չի մատնանշում այս սենյակին", + "alias_field_placeholder_default": "օրինակ՝ իմ-սենյակը", + "alias_field_required_invalid": "Խնդրում ենք տրամադրել հասցե", + "alias_field_safe_localpart_invalid": "Որոշ նիշեր թույլատրված չեն", + "alias_field_taken_invalid": "Այս հասցեն ուներ անվավեր սերվեր կամ արդեն օգտագործվում է", + "alias_field_taken_invalid_domain": "Այս հասցեն արդեն օգտագործվում է", + "alias_field_taken_valid": "Այս հասցեն հասանելի է օգտագործման համար", + "alias_heading": "Սենյակի հասցե", + "aliases_items_label": "Այլ հրապարակված հասցեներ.", + "aliases_no_items_label": "Այլ հրապարակված հասցեներ դեռ չկան, ավելացրեք մեկը ստորև", + "aliases_section": "Սենյակի հասցեներ", + "avatar_field_label": "Սենյակի ավատար", + "canonical_alias_field_label": "Հիմնական հասցե", + "default_url_previews_off": "URL նախադիտումները լռելյայն անջատված են այս սենյակի մասնակիցների համար:", + "default_url_previews_on": "URL- ի նախադիտումները միացված են լռելյայն այս սենյակի մասնակիցների համար:", + "description_space": "Խմբագրել ձեր տարածքին վերաբերող կարգավորումները:", + "error_creating_alias_description": "Այդ հասցեն ստեղծելիս սխալ տեղի ունեցավ։ Հնարավոր է՝ սերվերը թույլ չի տվել դա, կամ ժամանակավոր խափանում է տեղի ունեցել։", + "error_creating_alias_title": "Հասցեի ստեղծման սխալ", + "error_deleting_alias_description": "Այդ հասցեն հեռացնելիս սխալ տեղի ունեցավ։ Հնարավոր է՝ այն այլևս գոյություն չունի, կամ ժամանակավոր սխալ է տեղի ունեցել։", + "error_deleting_alias_description_forbidden": "Դուք չունեք հասցեն ջնջելու թույլտվություն։", + "error_deleting_alias_title": "Հասցեն հեռացնելիս սխալ առաջացավ։", + "error_publishing": "Հնարավոր չէ հրապարակել սենյակը", + "error_publishing_detail": "Այս սենյակը հրապարակելիս սխալ տեղի ունեցավ", + "error_save_space_settings": "Չհաջողվեց պահպանել տարածքի կարգավորումները։", + "error_updating_alias_description": "Սենյակի այլընտրանքային հասցեները թարմացնելու սխալ է տեղի ունեցել: Հնարավոր է՝ սերվերը թույլ չի տվել դա, կամ ժամանակավոր խափանում է տեղի ունեցել։", + "error_updating_canonical_alias_description": "Սենյակի հիմնական հասցեն թարմացնելու սխալ է եղել: Հնարավոր է՝ սերվերը թույլ չի տվել դա, կամ ժամանակավոր խափանում է տեղի ունեցել։", + "error_updating_canonical_alias_title": "Հիմնական հասցեի թարմացման սխալ", + "leave_space": "Լքել տարածքը", + "local_alias_field_label": "Լոկալ հասցե", + "local_aliases_explainer_room": "Սահմանեք հասցեներ այս սենյակի համար, որպեսզի օգտատերերը կարողանան գտնել այս սենյակը ձեր homeserver-ի միջոցով (%(localDomain)s)", + "local_aliases_explainer_space": "Սահմանեք հասցեներ այս տարածքի համար, որպեսզի օգտատերերը կարողանան գտնել այս տարածքը ձեր homeserver-ի միջոցով (%(localDomain)s)", + "local_aliases_section": "Լոկալ հասցեներ", + "name_field_label": "Սենյակի անուն", + "new_alias_placeholder": "Նոր հրապարակված հասցե (օրինակ ՝ #alias:server)", + "no_aliases_room": "Այս սենյակը չունի լոկալ հասցեներ", + "no_aliases_space": "Այս տարածքը չունի լոկալ հասցեներ", + "other_section": "Այլ", + "publish_toggle": "Հրապարակեք այս սենյակը հանրության համար %(domain)s-ի սենյակների տեղեկատուում:", + "published_aliases_description": "Հասցե հրապարակելու համար նախ այն պետք է սահմանվի որպես լոկալ հասցե:", + "published_aliases_explainer_room": "Հրապարակված հասցեները կարող են օգտագործվել ցանկացած մեկի կողմից ցանկացած սերվերում՝ ձեր սենյակին միանալու համար։", + "published_aliases_explainer_space": "Հրապարակված հասցեները կարող են օգտագործվել ցանկացած մեկի կողմից ցանկացած սերվերում` ձեր տարածքին միանալու համար:", + "published_aliases_section": "Հրապարակված հասցեներ", + "save": "Պահպանել փոփոխությունները", + "topic_field_label": "Սենյակի թեմա", + "url_preview_encryption_warning": "Գաղտնագրված սենյակներում, ինչպես այս մեկը, URL նախադիտումները անջատվում են լռելյայն `ապահովելու համար, որ ձեր homeserver-ը (որտեղ առաջանում են նախադիտումները) չկարողանա տեղեկություններ հավաքել այս սենյակում տեսած հղումների մասին:", + "url_preview_explainer": "Երբ ինչոր մեկը URL է դնում իր հաղորդագրության մեջ, URL- ի նախադիտումը կարող է ցուցադրվել` այդ հղման մասին լրացուցիչ տեղեկություններ տալու համար, ինչպիսիք են վերնագիրը, նկարագրությունը և կայքէջից պատկերը:", + "url_previews_section": "URL- ի նախադիտումներ", + "user_url_previews_default_off": "Դուք լռելյայն անջատել եք URL- ի նախադիտումները:", + "user_url_previews_default_on": "Դուք լռելյայն միացրել եք URL- ի նախադիտումները:" + }, + "notifications": { + "browse_button": "Զննել", + "custom_sound_prompt": "Սահմանել նոր անհատական ձայն", + "notification_sound": "Ծանուցման ձայն", + "settings_link": "Ստացեք ծանուցումներ, ինչպես սահմանված է ձեր կարգավորումներում", + "sounds_section": "Ձայներ", + "upload_sound_label": "Վերբեռնել անհատական ձայն", + "uploaded_sound": "Վերբեռնված ձայն" + }, + "people": { + "knock_empty": "Ոչ մի խնդրանք", + "knock_section": "Միանալու խնդրանք", + "see_less": "Տեսնել ավելի քիչ", + "see_more": "Տեսնել ավելին" + }, + "permissions": { + "add_privileged_user_description": "Այս սենյակում մեկ կամ մի քանի օգտատերերին տալ ավելի շատ արտոնություններ", + "add_privileged_user_filter_placeholder": "Որոնել օգտատերերին այս սենյակում...", + "add_privileged_user_heading": "Ավելացնել արտոնյալ օգտատերեր", + "ban": "Արգելափակել օգտվողներին", + "ban_reason": "Պատճառ", + "banned_by": "Արգելափակված է %(displayName)s֊ի կողմից", + "banned_users_section": "Արգելափակված օգտատերեր", + "error_changing_pl_description": "Սխալ է տեղի ունեցել օգտատիրոջ հզորության մակարդակը փոխելիս։ Համոզվեք, որ ունեք բավարար թույլտվություններ և փորձեք կրկին։", + "error_changing_pl_reqs_description": "Սենյակի հզորության մակարդակի պահանջները փոխելիս սխալ է տեղի ունեցել։ Համոզվեք, որ ունեք բավարար թույլտվություններ և փորձեք կրկին։", + "error_changing_pl_reqs_title": "Սխալ առաջացավ հզորության մակարդակի պահանջը փոխելիս", + "error_changing_pl_title": "Սխալ առաջացավ հզորության մակարդակը փոխելիս։", + "error_unbanning": "Չհաջողվեց ապաարգելափակել", + "events_default": "Ուղարկել հաղորդագրությունները", + "invite": "Հրավիրել օգտվողներին", + "kick": "Հեռացնել օգտվողներին", + "m.call": "Սկսել %(brand)s զանգեր", + "m.call.member": "Միանալ %(brand)s զանգերին", + "m.reaction": "Ուղարկել արձագանքներ", + "m.room.avatar": "Փոխեք սենյակի ավատարը", + "m.room.avatar_space": "Փոխեք տարածության ավատարը", + "m.room.canonical_alias": "Փոխեք սենյակի հիմնական հասցեն", + "m.room.canonical_alias_space": "Փոխեք տարածության հիմնական հասցեն", + "m.room.encryption": "Միացնել սենյակի կոդավորումը", + "m.room.history_visibility": "Փոխել պատմության տեսանելիությունը", + "m.room.name": "Փոխել սենյակի անունը", + "m.room.name_space": "Փոխել տարածության անունը", + "m.room.pinned_events": "Կառավարել ամրացված իրադարձությունները", + "m.room.power_levels": "Փոխել թույլտվությունները", + "m.room.redaction": "Ջնջել իմ կողմից ուղարկված հաղորդագրությունները", + "m.room.server_acl": "Փոխել սերվերի ACL-ները(մուտքի վերահսկման ցուցակներ)", + "m.room.tombstone": "Թարմացնել սենյակը", + "m.room.topic": "Փոխել թեման", + "m.room.topic_space": "Փոխել նկարագրությունը", + "m.space.child": "Կառավարեք սենյակները այս տարածքում", + "m.widget": "Փոփոխել վիջեթները", + "muted_users_section": "Անջատված օգտատերեր", + "no_privileged_users": "Այս սենյակում ոչ մի օգտատեր չունի հատուկ արտոնություններ", + "notifications.room": "Տեղեկացնել բոլորին", + "permissions_section": "Թույլտվություններ", + "permissions_section_description_room": "Ընտրել սենյակի տարբեր մասերը փոխելու համար անհրաժեշտ դերերը", + "permissions_section_description_space": "Ընտրել տարածքի տարբեր մասերը փոխելու համար անհրաժեշտ դերերը", + "privileged_users_section": "Արտոնյալ օգտատերեր", + "redact": "Հեռացրեք ուրիշների կողմից ուղարկված հաղորդագրությունները", + "send_event_type": "Ուղարկել %(eventType)s իրադարձություններ", + "state_default": "Փոխել կարգավորումները", + "title": "Դերեր և թույլտվություններ", + "users_default": "Լռելյայն դեր" + }, + "security": { + "enable_encryption_confirm_description": "Սենյակի գաղտնագրումը միացնելուց հետո՝ չի կարող անջատվել: Գաղտնագրված սենյակում ուղարկված հաղորդագրությունները չեն կարող տեսանելի լինել սերվերի կողմից, միայն սենյակի մասնակիցների կողմից։ Գաղտնագրումը միացնելը կարող է կանխել բազմաթիվ բոտերի և կամուրջների ճիշտ աշխատանքը: Իմանալ ավելին գաղտնագրման մասին:", + "enable_encryption_confirm_title": "Միացնե՞լ գաղտնագրումը", + "enable_encryption_public_room_confirm_description_1": "Խորհուրդ չի տրվում ավելացնել գաղտնագրում հանրային սենյակներում: Յուրաքանչյուր ոք կարող է գտնել և միանալ հանրային սենյակներին, այնպես որ ցանկացած մեկը կարող է կարդալ այդտեղի հաղորդագրությունները. Դուք չեք ստանա գաղտնագրման ոչ մի առավելություն, և հետագայում չեք կարողանա այն անջատել: Հաղորդագրությունների գաղտնագրումը հասարակական սենյակում կդարձնի հաղորդագրությունների ստացումն ու ուղարկումն ավելի դանդաղ:", + "enable_encryption_public_room_confirm_description_2": "Այս հարցերից խուսափելու համար ստեղծեք նոր գաղտնագրված սենյակ՝ ձեր նախատեսած զրույցների համար։", + "enable_encryption_public_room_confirm_title": "Համոզվա՞ծ եք, որ ցանկանում եք ավելացնել գաղտնագրում այս հանրային սենյակում:", + "encrypted_room_public_confirm_description_1": "Խորհուրդ չի տրվում գաղտնագրված սենյակները հանրայնացնել: Դա կնշանակի, որ ցանկացած մեկը կարող է գտնել և միանալ սենյակին, այնպես որ ցանկացած մեկը կարող է կարդալ հաղորդագրությունները. Դուք չեք ստանա գաղտնագրման առավելություններից ոչ մեկը: Հասարակական սենյակում հաղորդագրությունների գաղտնագրումը հաղորդագրությունների ստացումը և ուղարկումը կդարձնի ավելի դանդաղ:", + "encrypted_room_public_confirm_description_2": "Այս խնդիրներից խուսափելու համար ստեղծեք նոր հանրային սենյակ՝ ձեր նախատեսած զրույցների համար։", + "encrypted_room_public_confirm_title": "Համոզվա՞ծ եք, որ ցանկանում եք հանրայնացնել այս գաղտնագրված սենյակը:", + "encryption_forced": "Ձեր սերվերը պահանջում է անջատել գաղտնագրումը։", + "encryption_permanent": "Միացնելուց հետո՝ գաղտնագրումը չի կարող անջատվել:", + "error_join_rule_change_title": "Չհաջողվեց թարմացնել միացման կանոնները", + "error_join_rule_change_unknown": "Անհայտ ձախողում", + "guest_access_warning": "Աջակցվող ծրագրեր ունեցող մարդիկ կկարողանան միանալ սենյակին՝ առանց գրանցված հաշիվ ունենալու:", + "history_visibility_invited": "Միայն անդամներ (քանի որ նրանք հրավիրված էին)", + "history_visibility_joined": "Միայն անդամներ (քանի որ նրանք միացել էին)", + "history_visibility_legend": "Ո՞վ կարող է կարդալ պատմությունը:", + "history_visibility_shared": "Միայն անդամներ (այս տարբերակն ընտրելու պահից ի վեր)", + "history_visibility_warning": "Պատմությունը կարդալու իրավունք ունեցողների փոփոխությունները կկիրառվեն միայն այս սենյակի ապագա հաղորդագրություններին։ Գոյություն ունեցող պատմության տեսանելիությունը չի փոխվի։", + "history_visibility_world_readable": "Յուրաքանչյուր ոք", + "join_rule_description": "Որոշեք, թե ով կարող է միանալ %(roomName)s֊ին։", + "join_rule_invite": "Մասնավոր (միայն հրավերով)", + "join_rule_invite_description": "Միայն հրավիրված անձինք կարող են միանալ:", + "join_rule_knock": "Խնդրել միանալ", + "join_rule_knock_description": "Մարդիկ չեն կարող միանալ, եթե մուտք չտրվի:", + "join_rule_public_description": "Յուրաքանչյուր ոք կարող է գտնել և միանալ:", + "join_rule_restricted": "Տարածքի անդամներ", + "join_rule_restricted_description": "Յուրաքանչյուր ոք տարածքում կարող է գտնել և միանալ: Խմբագրել, թե որ տարածքները կարող են մուտք գործել այստեղ:", + "join_rule_restricted_description_active_space": "Յուրաքանչյուր ոք -ում կարող է գտնել և միանալ: Դուք կարող եք ընտրել նաև այլ տարածքներ:", + "join_rule_restricted_description_prompt": "Յուրաքանչյուր ոք տարածքում կարող է գտնել և միանալ: Դուք կարող եք ընտրել բազմաթիվ տարածքներ:", + "join_rule_restricted_description_spaces": "Մուտք ունեցող տարածքներ", + "join_rule_restricted_dialog_description": "Որոշել, թե որ տարածքները կարող են մուտք գործել այս սենյակ: Եթե ընտրված է տարածք, դրա անդամները կարող են գտնել և միանալ -ին:", + "join_rule_restricted_dialog_empty_warning": "Դուք հեռացնում եք բոլոր տարածքները: Մուտքը լռելյայն կլինի միայն հրավերով", + "join_rule_restricted_dialog_filter_placeholder": "Որոնել տարածքներ", + "join_rule_restricted_dialog_heading_known": "Այլ տարածքներ, որոնք դուք գիտեք", + "join_rule_restricted_dialog_heading_other": "Այլ տարածքներ կամ սենյակներ, որոնք դուք կարող եք չիմանալ", + "join_rule_restricted_dialog_heading_room": "Ձեր իմացած տարածքները, որոնք պարունակում են այս սենյակը", + "join_rule_restricted_dialog_heading_space": "Ձեր իմացած տարածքները, որոնք պարունակում են այս տարածքը", + "join_rule_restricted_dialog_heading_unknown": "Սրանք, ամենայն հավանականությամբ, նրանք են, որոնց մասնակցում են նաև սենյակի այլ ադմինիստրատորներ։", + "join_rule_restricted_dialog_title": "Ընտրել տարածքներ", + "join_rule_restricted_n_more": { + "one": "և %(count)s ավելին", + "other": "և %(count)s ավելին" + }, + "join_rule_restricted_summary": { + "one": "Ներկայումս տարածքը հասանելի է", + "other": "Ներկայումս %(count)s տարածքները հասանելի են" + }, + "join_rule_restricted_upgrade_description": "Այս թարմացումը թույլ կտա ընտրված տարածքների անդամներին մուտք ունենալ այս սենյակ առանց հրավերի.", + "join_rule_restricted_upgrade_warning": "Այս սենյակը գտնվում է որոշ տարածքներում, որտեղ դուք ադմինիստրատոր չեք: Այդ տարածքներում դեռ կցուցադրվի հին սենյակը, բայց մարդկանց հուշում կտրվի միանալ նորին։", + "join_rule_upgrade_awaiting_room": "Բեռնվում է նոր սենյակ", + "join_rule_upgrade_required": "Պահանջվում է թարմացում", + "join_rule_upgrade_sending_invites": { + "one": "Հրավերի ուղարկում...", + "other": "Հրավերների ուղարկում... (%(count)s-ից %(progress)s)" + }, + "join_rule_upgrade_updating_spaces": { + "one": "Տարածքի թարմացում...", + "other": "Տարածքների թարմացում... (%(count)s-ից %(progress)s)" + }, + "join_rule_upgrade_upgrading_room": "Սենյակի թարմացում", + "public_without_alias_warning": "Խնդրում ենք ավելացնել հասցե այս սենյակին հղելու համար:", + "publish_room": "Դարձնել այս սենյակը տեսանելի հանրային սենյակների գրացուցակում:", + "publish_space": "Դարձնել այս տարածքը տեսանելի հանրային սենյակների գրացուցակում:", + "strict_encryption": "Ուղարկեք հաղորդագրություններ միայն ստուգված օգտատերերին:", + "title": "Անվտանգություն և գաղտնիություն" + }, + "title": "Սենյակի կարգավորումներ՝ %(roomName)s", + "upload_avatar_label": "Վերբեռնել ավատար", + "visibility": { + "alias_section": "Հասցե", + "error_failed_save": "Չհաջողվեց թարմացնել այս տարածքի տեսանելիությունը", + "error_update_guest_access": "Այս տարածքի հյուրերի հասանելիությունը թարմացնել չհաջողվեց", + "error_update_history_visibility": "Չհաջողվեց թարմացնել այս տարածքի պատմության տեսանելիությունը", + "guest_access_explainer": "Հյուրերը կարող են միանալ տարածքին առանց հաշիվ ունենալու:", + "guest_access_explainer_public_space": "Սա կարող է օգտակար լինել հանրային տարածքների համար:", + "guest_access_label": "Միացնել հյուրերի մուտքը", + "history_visibility_anyone_space": "Տարածքի նախադիտում", + "history_visibility_anyone_space_description": "Թույլատրել մարդկանց նախադիտել ձեր տարածքը՝ նախքան նրանք միանալը:", + "history_visibility_anyone_space_recommendation": "Խորհուրդ է տրվում հանրային տարածքների համար:", + "title": "Տեսանելիություն" + }, + "voip": { + "call_type_section": "Զանգի տեսակ", + "enable_element_call_caption": "%(brand)s-ը ծայրից ծայր գաղտնագրված է, բայց ներկայումս սահմանափակված է ավելի փոքր թվով օգտատերերով։", + "enable_element_call_label": "Միացրեք %(brand)s-ը որպես լրացուցիչ զանգի տարբերակ այս սենյակում", + "enable_element_call_no_permissions_tooltip": "Դուք չունեք բավարար թույլտվություններ սա փոխելու համար:" + } + }, + "room_summary_card_back_action_label": "Սենյակի մասին", + "scalar": { + "error_create": "Անհնար է ստեղծել Widget:", + "error_membership": "Դուք այս սենյակում չեք։", + "error_missing_room_id": "Սենյակի ID- ն բացակայում է:", + "error_missing_room_id_request": "Հարցման մեջ բացակայում է room_id-ն", + "error_missing_user_id_request": "Հարցման մեջ բացակայում է user_id-ն", + "error_permission": "Դուք այս սենյակում դա անելու թույլտվություն չունեք։", + "error_power_level_invalid": "Էլեկտրաէներգիայի մակարդակը պետք է լինի դրական ամբողջ թիվ:", + "error_room_not_visible": "%(roomId)s սենակը տեսանելի չէ", + "error_room_unknown": "Այս սենյակը ճանաչված չէ:", + "error_send_request": "Հարցումը չհաջողվեց ուղարկել։", + "failed_read_event": "Չհաջողվեց կարդալ իրադարձությունները", + "failed_send_event": "Չհաջողվեց ուղարկել իրադարձությունը" + }, + "server_offline": { + "description": "Ձեր սերվերը չի արձագանքում ձեր որոշ հարցումներին: Ստորև բերված են ամենահավանական պատճառներից մի քանիսը:", + "description_1": "Սերվերը (%(serverName)s) շատ երկար ժամանակ չպատասխանեց:", + "description_2": "Ձեր firewall-ը կամ հակավիրուսային ծրագիրը արգելափակում է հարցումը։", + "description_3": "Զննարկչի ընդլայնումը կանխում է հարցումը։", + "description_4": "Սերվերը անցանց/անջատված է:", + "description_5": "Սերվերը մերժել է ձեր հարցումը։", + "description_6": "Ձեր տարածքում ինտերնետին միանալու խնդիրներ կան։", + "description_7": "Սերվերի հետ կապվելու փորձի ժամանակ կապի սխալ տեղի ունեցավ։", + "description_8": "Սերվերը կարգավորված չէ խնդիրը ցույց տալու համար (CORS):", + "empty_timeline": "Ամեն ինչ կարդացված է։", + "recent_changes_heading": "Վերջին փոփոխությունները, որոնք դեռևս չեն ստացվել", + "title": "Սերվերը չի արձագանքում" + }, + "service_worker_error": { + "description": "%(brand)s-ը Matrix-ի պահոցներից մեդիա բեռնելու համար օգտագործում է service worker։ Ձեր զննարկիչը դա չի աջակցում, ուստի մեդիան կարող է չբեռնվել։", + "title": "Չհաջողվեց բեռնել ծառայության գործընթացը։" + }, + "seshat": { + "error_initialising": "Հաղորդագրությունների որոնման նախնականացումը ձախողվեց, ստուգեք ձեր կարգավորումները՝ լրացուցիչ տեղեկությունների համար", + "reset_button": "Վերականգնել իրադարձությունների պահեստը", + "reset_description": "Դուք, ամենայն հավանականությամբ, չեք ցանկանա վերականգնել իրադարձությունների ինդեքսի պահեստը", + "reset_explainer": "Եթե դուք դա անում եք, խնդրում ենք նկատի ունենալ, որ ձեր հաղորդագրություններից ոչ մեկը չի ջնջվի, բայց որոնման որակը կարող է մի քանի վայրկյան վատթարանալ, մինչև ինդեքսը նորից ստեղծվի", + "reset_title": "Վերականգնե՞լ իրադարձությունների պահեստը", + "warning_kind_files": "%(brand)s-ի այս տարբերակը չի աջակցում որոշ գաղտնագրված ֆայլերի դիտմանը։", + "warning_kind_files_app": "Օգտագործեք Համակարգչային հավելվածը՝ բոլոր գաղտնագրված ֆայլերը տեսնելու համար", + "warning_kind_search": "%(brand)s-ի այս տարբերակը չի աջակցում գաղտնագրված հաղորդագրությունների որոնումը", + "warning_kind_search_app": "Օգտագործեք Համակարգչային հավելվածը՝ գաղտնագրվաժ հաղորդագրությունները որոնելու համար" + }, + "setting": { + "help_about": { + "access_token_detail": "Ձեր մուտքի տոկենը լիարժեք մուտք է տալիս ձեր հաշվին։ Մի կիսվեք դրանով որևէ մեկի հետ։", + "brand_version": "%(brand)s-ի տարբերակը՝", + "clear_cache_reload": "Մաքրել քեշը(գաղտնարանը) և վերաբեռնել", + "crypto_version": "Գաղտնագրման(կրիպտո) տարբերակ՝", + "dialog_title": "Կարգավորումներ․ Օգնություն և Մեր մասին", + "help_link": "%(brand)s-ի օգտագործման հետ կապված օգնության համար սեղմեք այստեղ։", + "homeserver": "Գլխավոր սերվերը %(homeserverUrl)s -ն է", + "identity_server": "Նույնականացման սերվերը %(identityServerUrl)s-ն է", + "title": "Օգնություն և Մեր մասին", + "versions": "Տարբերակներ" + } + }, + "settings": { + "account": { + "dialog_title": "Կարգավորումներ․ Հաշվի տվյալներ", + "title": "Հաշիվ" + }, + "all_rooms_home": "Ցույց տալ բոլոր սենյակները Գլխավոր էջում", + "all_rooms_home_description": "Բոլոր սենյակները, որոնցում դուք գտնվում եք, կհայտնվեն Գլխավոր էջում:", + "always_show_message_timestamps": "Միշտ ցուցադրել հաղորդագրությունների ժամանակային նշագրերը", + "appearance": { + "bundled_emoji_font": "Օգտագործեք ներկառուցված էմոջիի տառատեսակը", + "compact_layout": "Ցուցադրել կրճատ տեսքով տեքստ ու հաղորդագրություններ", + "compact_layout_description": "Այս ֆունկցիան հասանելի է միայն դիզայնի ժամանակակից տարբերակի ընտրության դեպքում", + "custom_font": "Օգտագործել համակարգային տառատեսակը", + "custom_font_description": "Սահմանել ձեր համակարգում տեղադրված տառատեսակի անունը և %(brand)s-ը կփորձի օգտագործել այն։", + "custom_font_name": "Համակարգային տառատեսակի անվանում", + "custom_font_size": "Օգտագործել հատուկ չափս", + "custom_theme_add": "Ավելացնել անհատական գունային ոճ", + "custom_theme_downloading": "Անհատական գունային ոճի ներբեռնում…", + "custom_theme_error_downloading": "Տեսաձեւի ներբեռնման սխալ", + "custom_theme_help": "Մուտքագրեք այն գունային ոճի URL-ը, որը ցանկանում եք կիրառել։", + "custom_theme_invalid": "Տեսաձևի անվավեր սխեմա։", + "dialog_title": "Կարգավորումներ․ Արտաքին տեսք", + "font_size": "Տառատեսակի չափը", + "font_size_default": "%(fontSize)s (լռելյայն)", + "high_contrast": "Հակադրության բարձր ռեժիմ", + "image_size_default": "Լռելյայն", + "image_size_large": "Մեծ", + "layout_bubbles": "Հաղորդագրությունների պղպջակներ", + "layout_irc": "Ինտերնետային զրույց (փորձարարական)", + "match_system_theme": "Համապատասխանեցնել համակարգի թեմաի հետ", + "timeline_image_size": "Պատկերի չափը ժամանակացույցում" + }, + "automatic_language_detection_syntax_highlight": "Միացնել լեզվի ավտոմատ հայտնաբերումը շարահյուսության ընդգծման համար", + "autoplay_gifs": "GIF-ների ավտոմատ նվագարկում", + "autoplay_videos": "Վիդեոների ավտոմատ նվագարկում", + "big_emoji": "Միացնել զրուցարանում մեծ էմոջիները", + "code_block_expand_default": "Լռելյայնորեն ընդլայնել կոդի բլոկները", + "code_block_line_numbers": "Ցուցադրել տողերի համարները կոդի բլոկներում", + "disable_historical_profile": "Ցույց տալ ընթացիկ պրոֆիլի նկարը և անունը՝ օգտվողների համար հաղորդագրությունների պատմության մեջ", + "discovery": { + "title": "Ինչպես գտնել քեզ" + }, + "emoji_autocomplete": "Միացնել էմոջիների առաջարկները տեքստ գրելու ժամանակ", + "enable_markdown": "Միացնել Markdown", + "enable_markdown_description": "Սկսեք հաղորդագրությունները /հասարակ տեքստ -ով՝ առանց նշման ուղարկելու համար:", + "encryption": { + "advanced": { + "breadcrumb_first_description": "Ձեր հաշվի տվյալները, կոնտակտները, նախընտրությունները և զրույցների ցանկը կպահպանվեն", + "breadcrumb_page": "Վերակայել գաղտնագրումը", + "breadcrumb_second_description": "Դուք կկորցնեք ցանկացած հաղորդագրության պատմություն, որը պահված է միայն սերվերի վրա", + "breadcrumb_third_description": "Դուք պետք է կրկին հաստատեք ձեր բոլոր առկա սարքերը և կոնտակտները", + "breadcrumb_title": "Վստա՞հ եք, որ ուզում եք վերակայել(reset) ձեր ինքնությունը։", + "breadcrumb_title_forgot": "Մոռացե՞լ եք վերականգնման բանալին։ Դուք պետք է վերակայեք ձեր ինքնությունը։", + "breadcrumb_title_sync_failed": "Բանալիների պահոցը համաժամեցումը ձախողվեց։ Դուք պետք է վերակայեք ձեր ինքնությունը։", + "breadcrumb_warning": "Սա արեք միայն այն դեպքում, եթե կարծում եք, որ ձեր հաշիվը վտանգված է։", + "details_title": "Գաղտնագրման մանրամասներ", + "do_not_close_warning": "Մի՛ փակեք այս պատուհանը, մինչև վերակայումը չավարտվի", + "export_keys": "Արտահանել բանալիները", + "import_keys": "Ներմուծել բանալիները", + "other_people_device_description": "Զգուշացում․ օգտատերերը, որոնք բացահայտ չեն հաստատել ձեզ հետ (օր.՝ էմոջիով), չեն ստանա ձեր գաղտնագրված հաղորդագրությունները։ Բացի այդ, հաստատված օգտատերերի չհաստատված սարքերը նույնպես չեն ստանա ձեր գաղտնագրված հաղորդագրությունները։", + "other_people_device_label": "Գաղտնագրված սենյակներում ուղարկեք հաղորդագրություններ միայն հաստատված օգտատերերին։", + "other_people_device_title": "Այլ մարդկանց սարքերը", + "reset_identity": "Վերակայել կրիպտոգրաֆիկ ինքնությունը", + "reset_in_progress": "Վերակայումը ընթացքի մեջ է...", + "session_id": "Սեսիայի ID․", + "session_key": "Սեսիայի բանալի․", + "title": "Հավելյալ" + }, + "confirm_key_storage_off": "Վստա՞հ եք, որ ուզում եք բանալիների պահեստը անջատված պահել։", + "confirm_key_storage_off_description": "Եթե դուրս գաք բոլոր սարքերից, կկորցնեք ձեր հաղորդագրությունների պատմությունը և ստիպված կլինեք կրկին հաստատել ձեր բոլոր գոյություն ունեցող կոնտակտները։ Իմանալ ավելին", + "delete_key_storage": { + "breadcrumb_page": "Ջնջել բանալիների պահոցը", + "confirm": "Ջնջել բանալիների պահոցը", + "description": "Բանալիների պահոցը ջնջելը կհեռացնի ձեր կրիպտոգրաֆիկ ինքնությունը և հաղորդագրությունների բանալիները սերվերից և կանջատի հետևյալ անվտանգության գործառույթները՝", + "list_first": "Նոր սարքերի վրա դուք չեք ունենա գաղտնագրված հաղորդագրությունների պատմություն", + "list_second": "Եթե դուրս գաք %(brand)s-ից բոլոր տեղերում, դուք կկորցնեք հասանելիությունը ձեր գաղտնագրված հաղորդագրություններին։", + "title": "Վստա՞հ եք, որ ուզում եք անջատել բանալիների պահեստը և ջնջել այն։" + }, + "device_not_verified_button": "Հաստատել այս սարքը", + "device_not_verified_description": "Դուք պետք է վավերացնեք այս սարքը, որպեսզի դիտեք ձեր գաղտնագրման կարգավորումները։", + "device_not_verified_title": "Սարքը հաստատված չէ", + "dialog_title": "Կարգավորումներ․ Գաղտնագրում", + "key_storage": { + "allow_key_storage": "Թույլատրել բանալիների պահոցը", + "description": "Անվտանգ կերպով պահեք ձեր կրիպտոգրաֆիկ ինքնությունը և հաղորդագրությունների բանալիները սերվերի վրա։ Սա թույլ կտա դիտել ձեր հաղորդագրությունների պատմությունը ցանկացած նոր սարքի վրա։ Իմանալ ավելին", + "title": "Բանալիների պահեստ" + }, + "recovery": { + "change_recovery_confirm_button": "Հաստատեք նոր վերականգնման բանալին", + "change_recovery_confirm_description": "Ավարտելու համար ստորև մուտքագրեք ձեր նոր վերականգնման բանալին: Ձեր հինը այլևս չի աշխատի:", + "change_recovery_confirm_title": "Մուտքագրեք ձեր նոր վերականգնման բանալին", + "change_recovery_key": "Փոխել վերականգնման բանալին", + "change_recovery_key_description": "Գրեք այս նոր վերականգնման բանալին որևէ անվտանգ տեղում: Այնուհետև սեղմեք «Շարունակել»՝ փոփոխությունը հաստատելու համար:", + "change_recovery_key_title": "Փոխե՞լ վերականգնման բանալին", + "description": "Վերականգնեք ձեր գաղտնագրված ինքնությունը և հաղորդագրությունների պատմությունը վերականգնման բանալիով՝ սարքերի հասանելիության բացակայության դեպքում։", + "enter_key_error": "Մուտքագրված վերականգնման բանալին սխալ է։", + "enter_recovery_key": "Մուտքագրեք վերականգնման բանալին", + "forgot_recovery_key": "Մոռացե՞լ եք վերականգնման բանալին", + "key_storage_warning": "Ձեր բանալիների պահոցը համաժամեցված չէ։ Սխալը շտկելու համար սեղմեք ստորև ներկայացված որևէ կոճակ։", + "save_key_description": "Մի՛ կիսվեք սրանով որևէ մեկի հետ։", + "save_key_title": "Վերականգնման բանալի", + "set_up_recovery": "Կարգավորեք վերականգնումը", + "set_up_recovery_confirm_button": "Ավարտեք կարգավորումը", + "set_up_recovery_confirm_description": "Ներմուծեք նախորդ էկրանում ցուցադրված վերականգնման բանալին՝ վերականգնումը ավարտելու համար։", + "set_up_recovery_confirm_title": "Մուտքագրեք ձեր վերականգնման բանալին՝ հաստատելու համար։", + "set_up_recovery_description": "Ձեր բանալիների պահոցը պաշտպանված է վերականգնման բանալիով։ Եթե կարգավորումից հետո նոր վերականգնման բանալի է անհրաժեշտ, կարող եք այն ստեղծել կրկին՝ ընտրելով «%(changeRecoveryKeyButton)s»։", + "set_up_recovery_save_key_description": "Գրեք այս վերականգնման բանալին որևէ անվտանգ տեղում, օրինակ՝ գաղտնաբառերի կառավարիչում, գաղտնագրված նշումներում կամ ֆիզիկական սեյֆում։", + "set_up_recovery_save_key_title": "Պահպանեք ձեր վերականգնման բանալին որևէ անվտանգ տեղում", + "set_up_recovery_secondary_description": "«Շարունակել» կոճակը սեղմելուց հետո մենք ձեզ համար կստեղծենք վերականգնման բանալի։", + "title": "Վերականգնում" + }, + "title": "Գաղտնագրում" + }, + "general": { + "account_management_section": "Հաշվի կառավարում", + "account_section": "Հաշիվ", + "add_email_dialog_title": "Ավելացնել էլ․ հասցե", + "add_email_failed_verification": "Էլեկտրոնային հասցեն չհաջողվեց ստուգել. համոզվեք, որ սեղմել եք էլ. նամակում առկա հղման վրա։", + "add_email_instructions": "Մենք ձեզ էլ. նամակ ենք ուղարկել՝ ձեր հասցեն հաստատելու համար: Խնդրում ենք հետևել այնտեղ տրված հրահանգներին, ապա սեղմել ստորև նշված կոճակը:", + "add_msisdn_confirm_body": "Սեղմեք ստորև նշված կոճակը ՝ այս հեռախոսահամարի ավելացումը հաստատելու համար:", + "add_msisdn_confirm_button": "Հաստատեք հեռախոսահամարի ավելացումը", + "add_msisdn_confirm_sso_button": "Հաստատեք այս հեռախոսահամարի ավելացումը՝ օգտագործելով Single Sign On ՝ ձեր ինքնությունը ապացուցելու համար:", + "add_msisdn_dialog_title": "Ավելացնել հեռախոսահամար", + "add_msisdn_instructions": "SMS հաղորդագրություն է ուղարկվել +%(msisdn)s համարին։ Խնդրում ենք մուտքագրել դրանում պարունակվող հաստատման կոդը։", + "add_msisdn_misconfigured": "Ավելացնել / կապել գործառույթը(MSISDN-ի հետ) սխալ է կարգավորված", + "allow_spellcheck": "Թույլատրել ուղղագրության ստուգումը", + "application_language": "Ծրագրի լեզուն", + "application_language_reload_hint": "Հավելվածը կվերաբեռնվի մեկ այլ լեզու ընտրելուց հետո", + "avatar_remove_progress": "Պատկերը հեռացվում է...", + "avatar_save_progress": "Պատկերի վերբեռնում...", + "avatar_upload_error_text": "Ֆայլի ձևաչափը չի աջակցվում, կամ պատկերը %(size)s-ից ավելի մեծ է։", + "avatar_upload_error_text_generic": "Ֆայլի ձևաչափը կարող է չաջակցվել։", + "avatar_upload_error_title": "Ավատարի պատկերը չհաջողվեց վերբեռնել", + "confirm_adding_email_body": "Սեղմեք ներքեւի կոճակը՝ այս էլ-փոստի հասցեն ավելացնելու համար։", + "confirm_adding_email_title": "Հաստատեք էլ․ հասցեի ավելացումը", + "deactivate_confirm_body": "Համոզվա՞ծ եք, որ ցանկանում եք ապաակտիվացնել ձեր հաշիվը: Սա անդարձելի է:", + "deactivate_confirm_body_sso": "Հաստատեք ձեր հաշվի ապաակտիվացումը՝ օգտագործելով Single Sign On ՝ ձեր ինքնությունը հաստատելու համար:", + "deactivate_confirm_content": "Հաստատեք, որ ցանկանում եք ապաակտիվացնել ձեր հաշիվը: Եթե շարունակեք.", + "deactivate_confirm_content_1": "Դուք չեք կարողանա վերաակտիվացնել ձեր հաշիվը", + "deactivate_confirm_content_2": "Դուք այլևս չեք կարողանա մուտք գործել", + "deactivate_confirm_content_3": "Ոչ ոք չի կարողանա վերաօգտագործել Ձեր օգտվողի անունը (MXID), ներառյալ ձեզ. այս օգտանունն անհասանելի կմնա", + "deactivate_confirm_content_4": "Դուք կհեռանաք բոլոր սենյակներից և ուղիղ հաղորդագրություններից, որտեղ գտնվում եք։", + "deactivate_confirm_content_5": "Դուք կհեռացվեք նույնականացման սերվերից. ձեր ընկերները այլևս չեն կարողանա գտնել ձեզ ձեր էլ. փոստի հասցեով կամ հեռախոսահամարով։", + "deactivate_confirm_content_6": "Ձեր հին հաղորդագրությունները դեռ տեսանելի կլինեն այն մարդկանց համար, ովքեր ստացել են դրանք, ճիշտ այնպես, ինչպես նամակները, որոնք դուք ուղարկել եք անցյալում: Ցանկանում եք թաքցնել ձեզ ուղարկված հաղորդագրությունները այն մարդկանցից, ովքեր ապագայում միանում են սենյակներին:", + "deactivate_confirm_continue": "Հաստատել հաշվի ապաակտիվացումը", + "deactivate_confirm_erase_label": "Թաքցնել իմ հաղորդագրությունները նոր միացողներից", + "deactivate_section": "Ապաակտիվացրեք հաշիվը", + "deactivate_warning": "Ձեր հաշիվն ապաակտիվացնելը մշտական գործողություն է. Ուշադիր եղեք:", + "discovery_email_empty": "Հայտնաբերման տարբերակները կհայտնվեն էլեկտրոնային նամակ ավելացնելուց հետո:", + "discovery_email_verification_instructions": "Հաստատեք հղումը ձեր նամակների մուտքի արկղում", + "discovery_msisdn_empty": "Հայտնաբերման տարբերակները կհայտնվեն հեռախոսահամար ավելացնելուց հետո:", + "discovery_needs_terms": "Համաձայնեք ինքնության սերվերի (%(serverName)s) Ծառայությունների մատուցման պայմաններին՝ թույլ տալու ինքներդ ձեզ հայտնաբերել էլեկտրոնային փոստի հասցեով կամ հեռախոսահամարով:", + "discovery_needs_terms_title": "Թող մարդիկ գտնեն ձեզ", + "display_name": "Ցուցադրման անուն", + "display_name_error": "Հնարավոր չէ սահմանել ցուցադրման անուն", + "email_adding_unsupported_by_hs": "Այս homeserver-ը չի աջակցում ձեր հաշվի հետ էլ.փոստի հասցեներ ավելացնելուն։", + "email_address_in_use": "Այս էլ-փոստի հասցեն արդեն օգտագործվում է", + "email_address_label": "Էլ.փոստի հասցե", + "email_not_verified": "Ձեր էլ-փոստի հասցեն դեռ չի ստուգվել", + "email_verification_instructions": "Սեղմեք ստացված էլ. նամակում առկա հղումը՝ հաստատելու համար, ապա կրկին սեղմեք «Շարունակել»։", + "emails_heading": "Էլ.փոստի հասցեներ", + "error_add_email": "Անհնար է ավելացնել էլ․ հասցեներ", + "error_deactivate_communication": "Սերվերի հետ կապ հաստատելու խնդիր առաջացավ։ Խնդրում ենք կրկին փորձել։", + "error_deactivate_invalid_auth": "Սերվերը չի վերադարձրել վավեր նույնականացման տեղեկատվություն:", + "error_deactivate_no_auth": "Սերվերը որևէ նույնականացում չէր պահանջում", + "error_email_verification": "Անհնար է ստուգել էլ-փոստի հասցեն:", + "error_invalid_email": "Անվավեր էլ․ հասցե", + "error_invalid_email_detail": "Սա կարծես վավեր էլփոստի հասցե չէ", + "error_msisdn_verification": "Անհնար է ստուգել հեռախոսահամարը:", + "error_password_change_403": "Չհաջողվեց փոխել գաղտնաբառը։ Ձեր գաղտնաբառը ճի՞շտ է։", + "error_password_change_http": "%(errorMessage)s (HTTP կարգավիճակ՝ %(httpStatus)s)", + "error_password_change_title": "Գաղտնաբառի փոփոխման սխալ", + "error_password_change_unknown": "Գաղտնաբառի փոփոխման անհայտ սխալ (%(stringifiedError)s)", + "error_remove_3pid": "Անհնար է հեռացնել կոնտակտային տվյալները", + "error_revoke_email_discovery": "Անհնար է չեղարկել էլ-փոստի հասցեի համօգտագործումը", + "error_revoke_msisdn_discovery": "Անհնար է չեղարկել հեռախոսահամարի համօգտագործումը", + "error_share_email_discovery": "Անհնար է համօգտագործել էլ-փոստի հասցեն", + "error_share_msisdn_discovery": "Անհնար է համօգտագործել հեռախոսահամարը", + "identity_server_no_token": "Ինքնության հասանելիության նշան չի գտնվել", + "identity_server_not_set": "Նույնականացման սերվերը կարգավորված չէ", + "invalid_phone_number": "Նշված հեռախոսահամարը, կարծես թե, վավեր չէ։", + "language_section": "Լեզու", + "msisdn_adding_unsupported_by_hs": "Այս homeserver-ը չի աջակցում ձեր հաշվին հեռախոսահամարներ ավելացնելը։", + "msisdn_in_use": "Այս հեռախոսահամարն արդեն օգտագործվում է", + "msisdn_label": "Հեռախոսահամար", + "msisdn_verification_field_label": "Ստուգման կոդ", + "msisdn_verification_instructions": "Խնդրում ենք մուտքագրել տեքստով ուղարկված ստուգման կոդը:", + "msisdns_heading": "Հեռախոսահամարներ", + "oidc_manage_button": "Կառավարել հաշիվը", + "password_change_section": "Սահմանեք նոր հաշվի գաղտնաբառ...", + "password_change_success": "Ձեր գաղտնաբառը հաջողությամբ փոխվել է:", + "personal_info": "Անձնական տեղեկություն", + "profile_subtitle": "Ահա թե ինչպես եք դուք երևում մյուսներին հավելվածում։", + "profile_subtitle_oidc": "Ձեր հաշիվը առանձին կառավարվում է նույնականացման մատակարարի կողմից, ուստի ձեր անձնական տվյալների մի մասը չի կարող փոխվել այստեղ։", + "remove_email_prompt": "Հեռացնել %(email)s-ը ?", + "remove_msisdn_prompt": "Հեռացնել %(phone)s-ը ?", + "spell_check_locale_placeholder": "Ընտրեք տեղանք", + "unable_to_load_emails": "Անհնար է բեռնել էլ․փոստի հասցեները", + "unable_to_load_msisdns": "Հեռախոսահամարները չհաջողվեց բեռնել", + "username": "Օգտանուն" + }, + "inline_url_previews_default": "Լռելյայն միացնել URL- ի ներդիրային նախադիտումները", + "inline_url_previews_room": "Միացնել URL-ների նախադիտումները լռելյայնորեն այս սենյակի մասնակիցների համար", + "inline_url_previews_room_account": "Միացնել URL-ների նախադիտումները այս սենյակի համար (ազդում է միայն ձեզ վրա)", + "insert_trailing_colon_mentions": "Հաղորդագրության սկզբում գտնվող օգտատիրոջ հիշատակումից հետո ավելացնել երկկետ", + "invite_controls": { + "default_label": "Թույլատրել օգտատերերին հրավիրել ձեզ սենյակներ" + }, + "jump_to_bottom_on_send": "Հաղորդագրություն ուղարկելիս անցնել ժամանակագրության ներքևի մաս", + "key_backup": { + "setup_secure_backup": { + "backup_setup_success_description": "Ձեր բանալիներն այժմ պահուստավորվում են այս սարքից։", + "backup_setup_success_title": "Անվտանգ պահուստավորումը հաջողվեց", + "cancel_warning": "Եթե հիմա չեղարկեք, կկորցնեք գաղտնագրված հաղորդագրությունները և տվյալները, եթե կորցնեք ձեր մուտքանուններին հասանելիությունը։", + "confirm_security_phrase": "Հաստատեք Ձեր անվտանգության արտահայտությունը", + "description": "Պաշտպանեք կոդավորված հաղորդագրությունների և տվյալների հասանելիության կորստի դեմ՝ կրկնօրինակելով ձեր սերվերի գաղտնագրման բանալիները:", + "download_or_copy": "%(downloadButton)s կամ %(copyButton)s", + "enter_phrase_description": "Մուտքագրեք անվտանգության արտահայտություն, որը միայն դուք գիտեք, քանի որ այն օգտագործվում է ձեր տվյալները պաշտպանելու համար: Անվտանգ լինելու համար չպետք է կրկին օգտագործեք ձեր հաշվի գաղտնաբառը:", + "enter_phrase_title": "Մուտքագրել անվտանգության արտահայտությունը", + "enter_phrase_to_confirm": "Մուտքագրեք Ձեր անվտանգության արտահայտությունը երկրորդ անգամ՝ այն հաստատելու համար:", + "generate_security_key_description": "Մենք կստեղծենք վերականգնման բանալի, որը դուք կարող եք պահել անվտանգ տեղում, օրինակ՝ գաղտնաբառերի կառավարիչում կամ սեյֆում։", + "generate_security_key_title": "Ստեղծել Recovery Key(վերականգնման բանալի)", + "pass_phrase_match_failed": "Դա չի համընկնում։", + "pass_phrase_match_success": "Դա համապատասխանում է!", + "phrase_strong_enough": "Հրաշալի! Այս անվտանգության արտահայտությունը բավականաչափ ուժեղ է երևում։", + "secret_storage_query_failure": "Հնարավոր չէ հարցնել գաղտնի պահեստի կարգավիճակը", + "security_key_safety_reminder": "Պահեք ձեր վերականգնման բանալին ինչոր անվտանգ վայրում, ինչպիսիք են գաղտնաբառերի կառավարիչը կամ սեյֆը, քանի որ այն օգտագործվում է ձեր գաղտնագրված տվյալները պաշտպանելու համար:", + "set_phrase_again": "Վերադառնալ այն նորից կարգավորելու համար։", + "settings_reminder": "Կարող եք նաև կարգավորել անվտանգ պահուստավորումը և կառավարել ձեր բանալիները Կարգավորումներում։", + "title_confirm_phrase": "Հաստատեք անվտանգության արտահայտությունը", + "title_save_key": "Պահպանեք ձեր Recovery Key-ն (վերականգնման բանալին)", + "title_set_phrase": "Սահմանել անվտանգության արտահայտություն", + "unable_to_setup": "Հնարավոր չէ կարգավորել գաղտնի պահեստը", + "use_different_passphrase": "Օգտագործե՞լ այլ գաղտնաբառ։", + "use_phrase_only_you_know": "Օգտագործեք գաղտնի արտահայտություն, որը միայն դուք գիտեք, և ըստ ցանկության պահպանեք վերականգնման բանալին՝ կրկնօրինակման համար օգտագործելու համար:" + } + }, + "key_export_import": { + "confirm_passphrase": "Հաստատեք գաղտնաբառը", + "enter_passphrase": "Մուտքագրեք գաղտնաբառ", + "export_description_1": "Այս գործընթացը թույլ է տալիս արտահանել գաղտնագրված սենյակներում ստացված հաղորդագրությունների բանալիները տեղային ֆայլի մեջ։ Այնուհետև դուք կկարողանաք ապագայում ներմուծել ֆայլը մեկ այլ Matrix հաճախորդի մեջ, որպեսզի այդ հաճախորդը նույնպես կարողանա վերծանել այդ հաղորդագրությունները։", + "export_description_2": "Արտահանված ֆայլը թույլ կտա այն կարդացող ցանկացած անձի վերծանել այն գաղտնագրված հաղորդագրությունները, որոնք դուք տեսնում եք, ուստի պետք է զգուշորեն պահեք այն։ Դրան օգնելու համար ներքևում պետք է մուտքագրեք եզակի գաղտնաբառ, որը կօգտագործվի միայն արտահանված տվյալները գաղտնագրելու համար։ Տվյալները հնարավոր կլինի ներմուծել միայն նույն գաղտնաբառը օգտագործելով։", + "export_title": "Արտահանել սենյակի բանալիները", + "file_to_import": "Ներմուծվող ֆայլ", + "import_description_1": "Այս գործընթացը թույլ է տալիս ներմուծել գաղտնագրման բանալիներ, որոնք նախկինում արտահանել էիք Matrix-ի մեկ այլ հաճախորդից։ Այնուհետև դուք կկարողանաք վերծանել ցանկացած հաղորդագրություն, որը կարողացել էր վերծանել մյուս հաճախորդը։", + "import_description_2": "Արտահանման ֆայլը պաշտպանված կլինի գաղտնաբառով: Ֆայլը վերծանելու համար դուք պետք է մուտքագրեք գաղտնաբառն այստեղ:", + "import_title": "Սենյակի բանալիների ներմուծում", + "phrase_cannot_be_empty": "Գաղտնաբառը չպետք է դատարկ լինի", + "phrase_must_match": "Գաղտնաբառերը պետք է համընկնեն", + "phrase_strong_enough": "Հրաշալի! Այս գաղտնաբառը բավականին ուժեղ է" + }, + "keyboard": { + "dialog_title": "Կարգավորումներ․ Ստեղնաշար", + "title": "Ստեղնաշար" + }, + "labs": { + "dialog_title": "Կարգավորումներ․ Լաբորատորիաներ" + }, + "labs_mjolnir": { + "dialog_title": "Կարգավորումներ․ Անտեսված օգտատերեր" + }, + "media_preview": { + "hide_avatars": "Թաքցնել սենյակի և հրավեր ուղարկողի պրոֆիլային նկարները", + "hide_media": "Միշտ թաքցնել", + "media_preview_description": "Թաքնված մեդիան(նկար, տեսանյութ և այլն) միշտ կարող է ցուցադրվել՝ դրա վրա սեղմելով", + "media_preview_label": "Ցուցադրել մեդիան ժամանակագրության մեջ", + "show_in_private": "Մասնավոր սենյակներում", + "show_media": "Միշտ ցուցադրել" + }, + "not_supported": "Ձեր սերվերը չի իրականացնում այս գործառույթը։", + "notifications": { + "default_setting_description": "Այս կարգավորումը լռելյայնորեն կկիրառվի ձեր բոլոր սենյակների համար։", + "default_setting_section": "Ես ուզում եմ ծանուցում ստանալ (Լռելյայն կարգավորում)", + "desktop_notification_message_preview": "Ցուցադրել հաղորդագրության նախադիտումը աշխատասեղանի ծանուցման մեջ", + "dialog_title": "Կարգավորումներ․ Ծանուցումներ", + "email_description": "Ստացեք բաց թողնված ծանուցումների ամփոփագիր էլ.փոստով", + "email_section": "Էլ․փոստի նամակի ամփոփում", + "email_select": "Ընտրեք, թե որ էլ.հասցեներին եք ուզում ուղարկել ամփոփագրերը: Կառավարեք ձեր էլ. նամակները բաժնում:", + "enable_audible_notifications_session": "Միացնել լսելի ծանուցումները այս սեսիայի համար", + "enable_desktop_notifications_session": "Միացնել աշխատասեղանի ծանուցումները այս սեսիայի համար", + "enable_email_notifications": "Միացնել էլ-փոստային ծանուցումները %(email)s-ի համար", + "enable_notifications_account": "Միացնել ծանուցումները այս հաշվի համար", + "enable_notifications_account_detail": "Անջատել՝ ձեր բոլոր սարքերի եւ նիստերի ծանուցումները անջատելու համար", + "enable_notifications_device": "Միացնել ծանուցումները այս սարքի համար", + "error_loading": "Ձեր ծանուցումների կարգավորումները բեռնելիս սխալ տեղի ունեցավ։", + "error_permissions_denied": "%(brand)s-ը Ձեզ ծանուցումներ ուղարկելու թույլտվություն չունի. խնդրում ենք ստուգել ձեր զննարկիչի կարգավորումները", + "error_permissions_missing": "%(brand)s-ին ծանուցումներ ուղարկելու թույլտվություն չի տրվել. Խնդրում ենք կրկին փորձել", + "error_saving": "Սխալ առաջացավ ծանուցումների նախընտրությունները պահպանելիս։", + "error_saving_detail": "Ձեր ծանուցման նախապատվությունները պահպանելիս սխալ է տեղի ունեցել:", + "error_title": "Անհնար է միացնել ծանուցումները", + "error_updating": "Ձեր ծանուցման նախապատվությունները թարմացնելիս սխալ է տեղի ունեցել: Խնդրում ենք փորձեք կրկին միացնել ձեր տարբերակը:", + "invites": "Հրավիրվել է սենյակ", + "keywords": "Ցուցադրել նշանը, երբ սենյակում օգտագործվում են բանալի բառեր։", + "keywords_prompt": "Մուտքագրեք բանալի բառեր այստեղ կամ օգտագործեք ուղղագրության տարբերակների կամ մականունների համար", + "labs_notice_prompt": "Թարմացում՝ Մենք պարզեցրել ենք ծանուցումների կարգավորումները՝ տարբերակները ավելի հեշտ գտնելու համար: Անցյալում ընտրված որոշ հատուկ կարգավորումներ այստեղ չեն ցուցադրվում, բայց դրանք դեռևս ակտիվ են: Եթե շարունակեք, ձեր որոշ կարգավորումներ կարող են փոխվել: Իմանալ ավելին", + "mentions_keywords": "Հիշատակումներ և բանալի բառեր", + "mentions_keywords_only": "Միայն հիշատակումներ և բանալի բառեր", + "messages_containing_keywords": "Բանալի բառեր պարունակող հաղորդագրություններ", + "noisy": "Աղմկոտ", + "notices": "Բոտերի կողմից ուղարկված հաղորդագրություններ", + "notify_at_room": "Ծանուցել, երբ ինչ-որ մեկը հիշատակի @room-ի օգտագործումը", + "notify_keyword": "Ծանուցել, երբ ինչ-որ մեկը օգտագործում է բանալի բառ", + "notify_mention": "Ծանուցել, երբ ինչ-որ մեկը հիշատակում է @displayname կամ %(mxid)s", + "other_section": "Այլ բաներ, որոնք, մեր կարծիքով, կարող են ձեզ հետաքրքրել.", + "people_mentions_keywords": "Մարդիկ, հիշատակումներ և բանալի բառեր", + "play_sound_for_description": "Կիրառվում է լռելյայնորեն բոլոր սարքերի բոլոր սենյակների համար։", + "play_sound_for_section": "Նվագարկել ձայն", + "push_targets": "Ծանուցման թիրախներ", + "quick_actions_mark_all_read": "Նշել բոլոր հաղորդագրությունները որպես կարդացված", + "quick_actions_reset": "Վերականգնել լռելյայն կարգավորումները", + "quick_actions_section": "Արագ գործողություններ", + "room_activity": "Տեղի են ունենում սենյակի նոր ակտիվություններ, թարմացումներ և կարգավիճակի հաղորդագրություններ", + "rule_call": "Զանգի հրավեր", + "rule_contains_display_name": "Իմ անունը(display name) պարունակող հաղորդագրություններ", + "rule_contains_user_name": "Հաղորդագրություններ, որոնք պարունակում են իմ օգտանունը", + "rule_encrypted": "Գաղտնագրված հաղորդագրություններ խմբային զրույցներում", + "rule_encrypted_room_one_to_one": "Գաղտնագրված հաղորդագրություններն անհատական զրույցներում", + "rule_invite_for_me": "Երբ ինձ հրավիրում են սենյակ", + "rule_message": "Հաղորդագրություններ խմբային զրույցներում", + "rule_room_one_to_one": "Հաղորդագրություններ անհատական զրույցներում", + "rule_roomnotif": "@room պարունակող հաղորդագրություններ", + "rule_suppress_notices": "Բոտի կողմից ուղարկված հաղորդագրություններ", + "rule_tombstone": "Երբ սենյակները թարմացվում են", + "show_message_desktop_notification": "Ցույց տալ հաղորդագրությունը աշխատասեղանի ծանուցման մեջ", + "voip": "Աուդիո և վիդեո զանգեր" + }, + "preferences": { + "Electron.enableContentProtection": "Կանխել պատուհանի պարունակության \"բռնագրումը\" այլ ծրագրերի կողմից", + "Electron.enableHardwareAcceleration": "Միացնել ապարատային արագացումը (վերագործարկում՝ %(appName)s֊ը ուժի մեջ մտնելու համար)", + "always_show_menu_bar": "Միշտ ցուցադրել պատուհանի ընտրացանկի վահանակը", + "autocomplete_delay": "Ավտոմատ լրացման ուշացում (միլիվրկ)", + "code_blocks_heading": "Կոդի բլոկներ", + "compact_modern": "Օգտագործել ավելի կոմպակտ “Ժամանակակից” դասավորություն", + "composer_heading": "Կազմող", + "default_timezone": "Զննարկչի նախնական կարգավորում (%(timezone)s)", + "dialog_title": "Կարգավորումներ․ Նախընտրություններ", + "enable_content_protection": "Միացնել բովանդակության պաշտպանությունը", + "enable_hardware_acceleration": "Միացնել ապարատային արագացումը", + "enable_tray_icon": "Ցույցադրել սկուտեղի պատկերակը և փակելիս նվազագույնի հասցնել դրա պատուհանը", + "keyboard_heading": "Ստեղնաշարի դյուրանցումներ", + "keyboard_view_shortcuts_button": "Բոլոր ստեղնաշարի դյուրանցումները դիտելու համար՝ սեղմեք այստեղ .", + "media_heading": "Պատկերներ, GIF-եր և տեսանյութեր", + "presence_description": "Կիսվել ձեր գործունեությամբ և կարգավիճակով ուրիշների հետ։", + "publish_timezone": "Հրապարակել ժամային գոտին հանրային պրոֆիլում", + "rm_lifetime": "Կարդացված նշիչի կյանքի տևողությունը (մվ)", + "rm_lifetime_offscreen": "Կարդալու նշիչի էկրանից-դուրս կյանքի տևողությունը (մվ)", + "room_directory_heading": "Սենյակների գրացուցակ", + "room_list_heading": "Սենյակների ցանկ", + "show_avatars_pills": "Ցույց տալ ավատարները օգտվողի, սենյակի եւ իրադարձությունների հիշատակումներում", + "show_polls_button": "Ցույց տալ հարցումների կոճակը", + "surround_text": "Հատուկ նիշերի մուտքագրման ժամանակ շրջապատել ընտրված տեքստը", + "time_heading": "Ժամանակի ցուցադրում", + "user_timezone": "Սահմանել ժամային գոտի" + }, + "prompt_invite": "Հուշել՝ նախքան պոտենցիալ անվավեր matrix ID-ներին հրավերներ ուղարկելը", + "replace_plain_emoji": "Ավտոմատ կերպով փոխարինել պարզ տեքստով էմոջիները", + "security": { + "analytics_description": "Կիսվել անանուն տվյալներով՝ խնդիրները բացահայտելու համար։ Ոչինչ անձնական։ Ոչ մի երրորդ կողմ։", + "bulk_options_accept_all_invites": "Ընդունել բոլոր %(invitedRooms)s հրավերները", + "bulk_options_reject_all_invites": "Մերժել բոլոր %(invitedRooms)s հրավերները", + "bulk_options_section": "Զանգվածային ընտրանքներ", + "dehydrated_device_description": "Օֆլայն սարքի հնարավորությունը թույլ է տալիս ստանալ գաղտնագրված հաղորդագրություններ, նույնիսկ երբ որևէ սարքում մուտք գործած չեք։", + "dehydrated_device_enabled": "Օֆլայն սարքը միացված է", + "dialog_title": "Կարգավորումներ․ Անվտանգություն և գաղտնիություն", + "e2ee_default_disabled_warning": "Ձեր սերվերի ադմինիստրատորը լռելյայնորեն անջատել է ծայրից ծայր գաղտնագրումը մասնավոր սենյակներիև անհատական հաղորդագրությունների համար։", + "enable_message_search": "Թույլատրել հաղորդագրությունների որոնումը գաղտնագրված սենյակներում", + "encryption_section": "Գաղտնագրում", + "ignore_users_empty": "Դուք համակարգի անտեսված օգտագործողներ չունեք:", + "ignore_users_section": "Անտեսված օգտատերեր", + "key_backup_algorithm": "Ալգորիթմ՝", + "message_search_disable_warning": "Եթե անջատված է, գաղտնագրված սենյակներից հաղորդագրությունները չեն հայտնվի որոնման արդյունքներում:", + "message_search_disabled": "Անվտանգ կերպով տեղայնորեն քեշավորեք գաղտնագրված հաղորդագրություններ , որպեսզի դրանք հայտնվեն որոնման արդյունքներում:", + "message_search_enabled": { + "one": "Գաղտնագրված հաղորդագրությունները տեղայնորեն պահել ապահով քեշում, որպեսզի դրանք հայտնվեն որոնման արդյունքներում, օգտագործելով %(size)s՝ %(rooms)s սենյակի հաղորդագրությունները պահելու համար", + "other": "Գաղտնագրված հաղորդագրությունները տեղայնորեն պահել ապահով քեշում, որպեսզի դրանք հայտնվեն որոնման արդյունքներում, օգտագործելով %(size)s՝ %(rooms)s սենյակների հաղորդագրությունները պահելու համար\n" + }, + "message_search_failed": "Հաղորդագրության որոնման սկզբնավորումը ձախողվեց", + "message_search_indexed_messages": "Ինդեքսավորված հաղորդագրություններ՝", + "message_search_indexed_rooms": "Ինդեքսավորված սենյակներ՝", + "message_search_indexing": "Ներկայումս ինդեքսավորվում է՝ %(currentRoom)s", + "message_search_indexing_idle": "Ներկայումս չի ինդեքսավորվում որեւէ սենյակի հաղորդագրությունները:", + "message_search_intro": "%(brand)s-ն անվտանգ կերպով տեղայնորեն քեշավորում է գաղտնագրված հաղորդագրությունները, որպեսզի դրանք հայտնվեն որոնման արդյունքներում։", + "message_search_room_progress": "%(totalRooms)s-ից %(doneRooms)s", + "message_search_section": "Հաղորդագրությունների որոնում", + "message_search_sleep_time": "Որքան արագ պետք է ներբեռնվեն հաղորդագրությունները:", + "message_search_space_used": "Օգտագործված տարածք՝", + "message_search_unsupported": "%(brand)s-ում բացակայում են որոշ բաղադրիչներ, որոնք անհրաժեշտ են գաղտնագրված հաղորդագրությունները տեղայնորեն անվտանգ քեշավորելու համար։ Եթե ցանկանում եք փորձարկել այս հնարավորությունը, կառուցեք անհատական %(brand)s Desktop՝ ավելացված որոնման բաղադրիչներով։", + "message_search_unsupported_web": "Վեբ զննարկչում աշխատելիս %(brand)s-ը չի կարող գաղտնագրված հաղորդագրությունները տեղայնորեն ապահով քեշավորել։ Որպեսզի գաղտնագրված հաղորդագրությունները հայտնվեն որոնման արդյունքներում, օգտագործեք %(brand)s Desktop։", + "record_session_details": "Նշել հաճախորդի(ծրագրի} անունը, տարբերակը և URL-ը՝ սեսիայի կառավարիչում դրանք ավելի հեշտ ճանաչելու համար", + "send_analytics": "Ուղարկել վերլուծական տվյալներ", + "strict_encryption": "Ուղարկել հաղորդագրություններ միայն հաստատված օգտատերերին" + }, + "send_read_receipts": "Ուղարկել ընթերցման ստացականներ", + "send_read_receipts_unsupported": "Ձեր սերվերը չի աջակցում ընթերցման ստացականների ուղարկման անջատումը։", + "send_typing_notifications": "Ուղարկել տեքստ գրելու ծանուցումներ", + "sessions": { + "best_security_note": "Լավագույն անվտանգության համար ստուգեք ձեր սեսիաները և դուրս եկեք ցանկացած սեսիայից, որը այլևս չեք ճանաչում կամ չեք օգտագործում։", + "browser": "Զննարկիչ", + "confirm_sign_out": { + "one": "Հաստատեք այս սարքից դուրս գալը", + "other": "Հաստատեք այս սարքերից դուրս գալը" + }, + "confirm_sign_out_body": { + "one": "Սեղմեք ստորև նշված կոճակը ՝ այս սարքից դուրս գալը հաստատելու համար:", + "other": "Սեղմեք ստորև նշված կոճակը ՝ այս սարքերից դուրս գալը հաստատելու համար:" + }, + "confirm_sign_out_continue": { + "one": "Ելք սարքից", + "other": "Ելք սարքերից" + }, + "confirm_sign_out_sso": { + "one": "Հաստատեք այս սարքից դուրս գալը՝ օգտագործելով Single Sign On-ը՝ ձեր ինքնությունը հաստատելու համար։", + "other": "Հաստատեք այս սարքերից դուրս գալը՝ օգտագործելով Single Sign On-ը՝ ձեր ինքնությունը հաստատելու համար։" + }, + "current_session": "Ընթացիկ սեսիա", + "desktop_session": "Համակարգչային սեսիան", + "details_heading": "Սեսիայի մանրամասները", + "device_unverified_description": "Լավագույն անվտանգության և հուսալիության համար հաստատեք կամ դուրս եկեք այս սեսիայից։", + "device_unverified_description_current": "Հաստատեք ձեր ընթացիկ սեսիան՝ հաղորդագրությունների անվտանգությունն ապահովելու համար։", + "device_verified_description": "Այս սեսիան պատրաստ է անվտանգ հաղորդագրությունների համար։", + "device_verified_description_current": "Ձեր ընթացիկ սեսիան պատրաստ է անվտանգ հաղորդագրությունների համար։", + "dialog_title": "Կարգավորումներ․ Սեսիաներ", + "error_pusher_state": "Չհաջողվեց սահմանել pusher-ի վիճակը", + "error_set_name": "Չհաջողվեց սահմանել սեսիայի անունը", + "filter_all": "Բոլորը", + "filter_inactive": "Ոչ ակտիվ", + "filter_inactive_description": "Անգործուն է %(inactiveAgeDays)s օրեր կամ ավելի երկար", + "filter_label": "Ֆիլտրել սարքեր", + "filter_unverified_description": "Պատրաստ չէ անվտանգ հաղորդագրություններ ուղարկելու համար", + "filter_verified_description": "Պատրաստ է անվտանգ հաղորդագրությունների ուղարկման համար", + "hide_details": "Թաքցնել մանրամասները", + "inactive_days": "Անգործուն է %(inactiveAgeDays)s + օրեր", + "inactive_sessions": "Անգործուն սեսիաներ", + "inactive_sessions_explainer_1": "Անգործուն սեսիաները այն սեսիաներն են, որոնք դուք որոշ ժամանակ չեք օգտագործել, բայց դրանք շարունակում են ստանալ գաղտնագրման բանալիներ։", + "inactive_sessions_explainer_2": "Անգործուն սեսիաների հեռացումը բարելավում է անվտանգությունն ու արդյունավետությունը, ինչպես նաև հեշտացնում է նոր սեսիայի կասկածելիության հայտնաբերումը։", + "inactive_sessions_list_description": "Դիտարկեք հին սեսիաներից դուրս գալը (%(inactiveAgeDays)s օր կամ ավելի), որոնք այլևս չեք օգտագործում։", + "ip": "IP հասցե", + "last_activity": "Վերջին ակտիվությունը", + "manage": "Կառավարել այս սեսիան", + "mobile_session": "Բջջային սեսիա", + "n_sessions_selected": { + "one": "%(count)s ընտրված սեսիա", + "other": "%(count)s ընտրված սեսիաներ" + }, + "no_inactive_sessions": "Անգործուն սեսիաներ չեն գտնվել։", + "no_sessions": "Սեսիաներ չեն գտնվել։", + "no_unverified_sessions": "Չստուգված սեսիաներ չեն գտնվել:", + "no_verified_sessions": "Հաստատված սեսիաներ չեն գտնվել։", + "os": "Օպերացիոն համակարգ", + "other_sessions_heading": "Այլ սեսիաներ", + "push_heading": "Push ծանուցումներ", + "push_subheading": "Ստանալ push ծանուցումներ այս սեսիայում։", + "push_toggle": "Այս սեսիայի ընթացքում միացնել/անջատել push ծանուցումները։", + "rename_form_caption": "Խնդրում ենք հաշվի առնել, որ սեսիաների անունները տեսանելի են նաև այն մարդկանց համար, ում հետ շփվում եք։", + "rename_form_heading": "Վերանվանել սեսիան", + "rename_form_learn_more": "Սեսիաների վերանվանում", + "rename_form_learn_more_description_1": "Ձեր միացած ուղիղ հաղորդագրություններում և սենյակներում գտնվող մյուս օգտատերերը կարող են դիտել ձեր սեսիաների ամբողջական ցանկը։", + "rename_form_learn_more_description_2": "Սա նրանց վստահություն է տալիս, որ նրանք իսկապես խոսում են ձեզ հետ, բայց նաև նշանակում է, որ նրանք կարող են տեսնել այստեղ մուտքագրված սեսիայի անվանումը։", + "security_recommendations": "Անվտանգության խորհուրդներ", + "security_recommendations_description": "Բարելավեք ձեր հաշվի անվտանգությունը՝ հետևելով այս խորհուրդներին։", + "session_id": "Սեսիայի ID", + "show_details": "Ցուցադրել մանրամասները", + "sign_in_with_qr": "Կապել նոր սարք", + "sign_in_with_qr_button": "Ցուցադրել QR կոդը", + "sign_in_with_qr_description": "Օգտագործեք QR կոդ՝ մեկ այլ սարք մուտք գործելու և անվտանգ հաղորդագրություններ կարգավորելու համար։", + "sign_in_with_qr_unsupported": "Չի աջակցվում ձեր հաշվի մատակարարի կողմից", + "sign_out": "Դուրս գալ այս սեսիայից", + "sign_out_all_other_sessions": "Դուրս գալ մյուս բոլոր սեսիաներից (%(otherSessionsCount)s )", + "sign_out_confirm_description": { + "one": "Համոզվա՞ծ եք, որ ցանկանում եք դուրս գալ %(count)s սեսիայից:", + "other": "Համոզվա՞ծ եք, որ ցանկանում եք դուրս գալ %(count)s սեսիաներից:" + }, + "sign_out_n_sessions": { + "one": "Դուրս գալ %(count)s սեսիայից", + "other": "Դուրս գալ %(count)s սեսիաներից" + }, + "title": "Սեսիաներ", + "unknown_session": "Անհայտ սեսիայի տեսակ", + "unverified_session": "Չհաստատված սեսիա", + "unverified_session_explainer_1": "Այս սեսիան չի աջակցում գաղտնագրումը և, հետևաբար, չի կարող ստուգվել։", + "unverified_session_explainer_2": "Այս սեսիան օգտագործելիս դուք չեք կարողանա մասնակցել այն սենյակներին, որտեղ գաղտնագրումը միացված է։", + "unverified_session_explainer_3": "Լավագույն անվտանգության և գաղտնիության համար խորհուրդ է տրվում օգտագործել Matrix հաճախորդներ, որոնք աջակցում են գաղտնագրում:", + "unverified_sessions": "Չհաստատված սեսիաներ", + "unverified_sessions_explainer_1": "Չհաստատված սեսիաները այն սեսիաներն են, որոնցում մուտք եք գործել ձեր մուտքային տվյալներով, բայց խաչաձև հաստատում չեն անցել։", + "unverified_sessions_explainer_2": "Դուք պետք է հատկապես համոզվեք, որ ճանաչում եք այս սեսիաները, քանի որ դրանք կարող են ներկայացնել ձեր հաշվի անթույլատրելի օգտագործումը։", + "unverified_sessions_list_description": "Ստուգեք ձեր սեսիաները՝ ավելի անվտանգ հաղորդագրությունների փոխանակման համար, կամ դուրս եկեք այն սեսիաներից, որոնք այլևս չեք ճանաչում կամ չեք օգտագործում։", + "url": "URL", + "verified_session": "Հաստատված սեսիա", + "verified_sessions": "Հաստատված սեսիաներ", + "verified_sessions_explainer_1": "Ստուգված սեսիաները գտնվում են ցանկացած վայրում, որտեղ դուք օգտագործում եք այս հաշիվը՝ ձեր անցաբառը մուտքագրելուց կամ ձեր ինքնությունը հաստատելուց հետո։", + "verified_sessions_explainer_2": "Սա նշանակում է, որ դուք ունեք բոլոր բանալիները, որոնք անհրաժեշտ են ձեր գաղտնագրված հաղորդագրությունները բացելու և այլ օգտվողներին հաստատելու համար, որ վստահում եք այս սեսիայում:", + "verified_sessions_list_description": "Լավագույն անվտանգության համար դուրս եկեք ցանկացած սեսիայից, որը այլևս չեք ճանաչում կամ չեք օգտագործում։", + "verify_session": "Հաստատել սեսիան", + "web_session": "Վեբ սեսիա" + }, + "show_avatar_changes": "Ցույց տալ պրոֆիլի նկարի փոփոխությունները", + "show_breadcrumbs": "Ցուցադրել վերջերս դիտված սենյակների դյուրանցումները սենյակների ցանկի վերևում", + "show_chat_effects": "Ցույց տալ զրույցի էֆեկտները (անիմացիաներ, օրինակ ՝ կոնֆետտի ստանալիս)", + "show_displayname_changes": "Ցույց տալ ցուցադրման անվան փոփոխությունները", + "show_join_leave": "Ցույց տալ միանալ/լքել հաղորդագրությունները (հրավերները/հեռացումները/արգելքները կմնան անփոփոխ)", + "show_message_previews": "Ցուցադրել հաղորդագրությունների նախադիտումները", + "show_nsfw_content": "Ցույց տալ NSFW բովանդակությունը", + "show_read_receipts": "Ցուցադրել այլ օգտատերերի կողմից ուղարկված ընթերցման ստացականները", + "show_redaction_placeholder": "Ցուցադրել տեղապահ` հեռացված հաղորդագրությունների համար", + "show_stickers_button": "Ցույց տալ ստիկերների կոճակը", + "show_typing_notifications": "Ցուցադրել տեքստ գրելու ծանուցումները", + "showbold": "Ցուցադրել բոլոր գործողությունները սենյակների ցանկում (կետեր կամ չկարդացված հաղորդագրությունների քանակ)", + "sidebar": { + "dialog_title": "Կարգավորումներ․ Կողային վահանակ", + "metaspaces_favourites_description": "Խմբավորել ձեր բոլոր սիրելի սենյակներն ու մարդկանց մեկ տեղում։", + "metaspaces_home_all_rooms": "Ցուցադրել բոլոր սենյակները", + "metaspaces_home_all_rooms_description": "Ցուցադրել ձեր բոլոր սենյակները Գլխավոր էջում, նույնիսկ եթե դրանք գտնվում են որևէ տարածքում։", + "metaspaces_home_description": "Գլխավոր էջը օգտակար է ամեն ինչի մասին ընդհանուր պատկերացում կազմելու համար։", + "metaspaces_orphans": "Տարածքից դուրս սենյակներ", + "metaspaces_orphans_description": "Խմբավորել ձեր բոլոր սենյակները, որոնք տարածքի մաս չեն կազմում, մեկ տեղում։", + "metaspaces_people_description": "Խմբավորել ձեր բոլոր մարդկանց մեկ տեղում։", + "metaspaces_subsection": "Ցուցադրվող տարածքներ", + "metaspaces_video_rooms": "Տեսազանգի սենյակներ և համաժողովներ(կոնֆերանսներ)", + "metaspaces_video_rooms_description": "Խմբավորել բոլոր մասնավոր տեսազանգի սենյակներն ու համաժողովները(կոնֆերանսները)։", + "metaspaces_video_rooms_description_invite_extension": "Համաժողովներում(կոնֆերանսներում) դուք կարող եք հրավիրել Matrix-ից դուրս գտնվող մարդկանց։", + "spaces_explainer": "Տարածքները սենյակներն ու մարդկանց խմբավորելու միջոցներ են: Ձեր գտնվելու վայրերից բացի, կարող եք օգտագործել նաև նախապես կառուցված տարածքներ:", + "title": "Կողային վահանակ" + }, + "start_automatically": "Ավտոմատ մեկնարկ համակարգի մուտք գործելուց հետո", + "tac_only_notifications": "Միայն ցուցադրել ծանուցումները թեմայի գործունեության կենտրոնում", + "use_12_hour_format": "Ցուցադրել ժամանակային նշանները 12 ժամյա ձևաչափով (օրինակ՝ 2:30pm)", + "use_command_enter_send_message": "Հաղորդագրություն ուղարկելու համար օգտագործեք Command + Enter", + "use_command_f_search": "Ժամանակացույցը որոնելու համար օգտագործեք Command + F", + "use_control_enter_send_message": "Հաղորդագրություն ուղարկելու համար օգտագործեք Ctrl + Enter", + "use_control_f_search": "Ժամանակացույցը որոնելու համար օգտագործեք Control + F", + "voip": { + "allow_p2p": "Թույլատրել Peer-to-Peer կապը 1:1 զանգերի համար", + "allow_p2p_description": "Երբ միացված է, մյուս կողմը կարող է տեսնել ձեր IP հասցեն", + "audio_input_empty": "Խոսափողեր չեն հայտնաբերվել", + "audio_output": "Աուդիո ելք", + "audio_output_empty": "Աուդիո ելքեր չեն հայտնաբերվել", + "auto_gain_control": "Ավտոմատ ուժեղացման կառավարում", + "connection_section": "Միացում", + "dialog_title": "Կարգավորումներ․ Ձայն և վիդեո", + "echo_cancellation": "Արձագանքի չեղարկում", + "enable_fallback_ice_server": "Թույլատրել հետադարձ զանգի օժանդակ սերվեր () %(server)s", + "enable_fallback_ice_server_description": "Գործում է միայն այն դեպքում, եթե ձեր սերվերը չի առաջարկում այն։ Ձեր IP հասցեն կփոխանցվի զանգի ընթացքում։", + "mirror_local_feed": "Լոկալ տեսանյութերի հոսքի անդրադարձում", + "missing_permissions_prompt": "Մեդիա թույլտվությունները բացակայում են, սեղմեք ներքևի կոճակը՝ հարցման համար:", + "noise_suppression": "Աղմուկի ճնշում", + "request_permissions": "Մեդիա թույլտվությունների հարցում", + "title": "Ձայն եւ վիդեո", + "video_input_empty": "Վեբ-տեսախցիկներ չեն հայտնաբերվել", + "video_section": "Վիդեո կարգավորումներ", + "voice_agc": "Ավտոմատ կերպով կարգավորել խոսափողի ձայնը", + "voice_processing": "Ձայնի մշակում", + "voice_section": "Ձայնային կարգավորումներ" + }, + "warn_quit": "Զգուշացում՝ հեռանալուց առաջ", + "warning": "ԶԳՈՒՇԱՑՈՒՄ: " + }, + "share": { + "link_copied": "Հղումը պատճենվեց", + "permalink_message": "Հղում դեպի ընտրված հաղորդագրությունը", + "permalink_most_recent": "Հղում դեպի ամենավերջին գրառումը/հաղորդագրությունը", + "share_call": "Ժողովի հրավերի հղում", + "share_call_subtitle": "Հղում արտաքին օգտատերերի համար՝ matrix հաշվի բացակայության դեպքում զանգին միանալու համար.", + "title_link": "Կիսվել հղումով", + "title_message": "Կիսվել սենյակի հաղորդագրությամբ", + "title_room": "Կիսվել սենյակով", + "title_user": "Կիսվել օգտատիրոջ հետ" + }, + "slash_command": { + "addwidget": "Սենյակում ավելացնում է հատուկ վիջեթ՝ ըստ URL-ի", + "addwidget_iframe_missing_src": "iframe-ը src ատրիբուտ չունի", + "addwidget_invalid_protocol": "Խնդրում ենք տրամադրել վիջեթի https:// կամ http:// URL-ը", + "addwidget_missing_url": "Խնդրում ենք տրամադրել վիջեթի URL-ը կամ ներդրման կոդը", + "addwidget_no_permissions": "Դուք չեք կարող փոփոխել վիջեթները այս սենյակում։", + "ban": "Արգելափակում է տրված ID-ով օգտատիրոջը", + "category_actions": "Գործողություններ", + "category_admin": "Ադմին", + "category_advanced": "Ընդլայնված", + "category_effects": "Էֆեկտներ", + "category_messages": "Հաղորդագրություններ", + "category_other": "Այլ", + "command_error": "Հրամանի սխալ", + "converttodm": "Սենյակը վերածում է DM-ի(անհատական զրույցի)", + "converttoroom": "Փոխակերպում է DM-ը (անձնական զրույցը)՝ սենյակի", + "could_not_find_room": "Չհաջողվեց գտնել սենյակ", + "deop": "Տրված ID-ով օգտատիրոջից հանում է օպերատորի իրավունքները", + "devtools": "Բացում է Ծրագրավորողի գործիքների պատուհանը", + "discardsession": "Ստիպում է ջնջել գաղտնագրված սենյակում գտնվող ընթացիկ արտագնա խմբային սեսիան։", + "error_invalid_rendering_type": "Հրամանի սխալ. Չի կարելի գտնել մատուցման տեսակը (%(renderingType)s)", + "error_invalid_room": "Հրամանը ձախողվեց. Հնարավոր չէ գտնել (%(roomId)s ) սենյակը", + "error_invalid_runfn": "Հրամանի սխալ. անհնար է մշակել slash հրամանը։", + "error_invalid_user_in_room": "Չհաջողվեց գտնել օգտատիրոջը սենյակում", + "help": "Ցուցադրում է հրամանների ցանկը՝ օգտագործման և նկարագրությունների հետ միասին", + "help_dialog_title": "Հրամանի օգնություն", + "holdcall": "Ընթացիկ սենյակում զանգը դնում է սպասման ռեժիմի վրա", + "html": "Ուղարկում է հաղորդագրություն որպես html ՝ առանց մեկնաբանելու այն որպես նշագրված", + "ignore": "Անտեսում է օգտվողին ՝ թաքցնելով նրա հաղորդագրությունները ձեզանից", + "ignore_dialog_description": "Դուք հիմա անտեսում եք %(userId)s-ին", + "ignore_dialog_title": "Անտեսված օգտատեր", + "invite": "Հրավիրում է տվյալ ID ունեցող օգտատիրոջը ընթացիկ սենյակ", + "invite_3pid_needs_is_error": "Օգտագործեք նույնականացման սերվեր՝ էլ. փոստով հրավիրելու համար: Կառավարեք այն կարգավորումներում:", + "invite_3pid_use_default_is_title": "Օգտագործեք նույնականացման սերվեր", + "invite_3pid_use_default_is_title_description": "Օգտագործեք նույնականացման սերվեր՝ էլ. փոստով հրավիրելու համար: Սեղմեք շարունակել՝ լռելյայն նույնականացման սերվերն (%(defaultIdentityServerName)s ) օգտագործելու համար կամ Կարգավորումներում կառավարելու համար։", + "invite_failed": "(%(user)s ) օգտատերը հրավեր չստացավ %(roomId)s սենյակին, բայց հրավիրողի ծրագիրը սխալ չի տվել", + "join": "Միանում է տրված հասցեով սենյակին", + "jumptodate": "Անցնել ժամանակացույցում տրված ամսաթվին", + "jumptodate_invalid_input": "Մենք չկարողացանք հասկանալ տվյալ ամսաթիվը (%(inputDate)s): Փորձեք օգտագործել YYYY-MM-DD ձևաչափը:", + "lenny": "Պարզ տեքստային հաղորդագրության սկզբից ավելացնում է ( ͡° ͜ʖ ͡°) նշանները", + "manual_device_verification_confirm_description": "Սա թույլ կտա մեկ այլ սարքի ուղարկել և ստանալ հաղորդագրություններ ձեր անունից։ ԵԹԵ ԻՆՉ-ՈՐԸ ՁԵԶ ԱՍԵԼ/ԽՆԴՐԵԼ Է ԱՅՍՏԵՂ ԻՆՉ-ՈՐ ԲԱՆ ՏԵՂԱԴՐԵԼ, ՀԱՎԱՆԱԿԱՆ Է, ՈՐ ՁԵԶ ԽԱԲԵՈՒՄ ԵՆ։ Վստա՞հ եք, որ ուզում եք ստուգել/հաստատել այս մյուս սարքը։", + "manual_device_verification_confirm_title": "Զգուշացում. սարքի ձեռքով ստուգում", + "me": "Ցուցադրում է գործողություն", + "msg": "Ուղարկում է հաղորդագրություն տվյալ օգտվողին", + "myavatar": "Փոխում է ձեր պրոֆիլի նկարը բոլոր սենյակներում", + "myroomavatar": "Փոխում է ձեր պրոֆիլի նկարը միայն այս ընթացիկ սենյակում", + "myroomnick": "Փոխում է ձեր ցուցադրման մականունը միայն ընթացիկ սենյակում", + "nick": "Փոխում է ձեր ցուցադրման մականունը", + "no_active_call": "Այս սենյակում ակտիվ զանգ չկա", + "op": "Սահմանեք օգտատիրոջ հզորության մակարդակը", + "part_unknown_alias": "Չճանաչված սենյակի հասցե. %(roomAlias)s", + "plain": "Ուղարկում է հաղորդագրություն որպես պարզ տեքստ ՝ առանց մեկնաբանելու այն որպես նշանգրված", + "query": "Բացում է տվյալ օգտատիրոջ հետ զրույցը", + "query_not_found_phone_number": "Հեռախոսահամարի համար Matrix ID- ն չի գտնվել", + "rageshake": "Ուղարկել սխալի մասին հաշվետվություն", + "rainbow": "Ուղարկում է տրված հաղորդագրությունը՝ ծիածանի պես գունավորված", + "rainbowme": "Ուղարկում է տվյալ զգացմունքի նշանը՝ ծիածանի պես գունավորված", + "remove": "Հեռացնում է տվյալ id ունեցող օգտվողին այս սենյակից", + "roomavatar": "Փոխում է ընթացիկ սենյակի ավատարը", + "roomname": "Սահմանում է սենյակի անունը", + "server_error": "Սերվերի սխալ", + "server_error_detail": "Սերվերը անհասանելի է, ծանրաբեռնված է կամ ինչոր այլ խնդիր է առաջացել։", + "shrug": "Պարզ տեքստային հաղորդագրության սկզբից ավելացնում է ¯\\_(ツ)_/¯ նշանները", + "spoiler": "Ուղարկում է տվյալ հաղորդագրությունը որպես սպոյլեր", + "tableflip": "Պարզ տեքստային հաղորդագրության սկզբից ավելացնում է (╯°□°)╯︵ ┻━┻ նշանները", + "topic": "Ստանում կամ սահմանում է սենյակի թեման", + "topic_none": "Այս սենյակը թեմա չունի։", + "topic_room_error": "Չհաջողվեց ստանալ սենյակի թեման. Չհաջողվեց գտնել սենյակը ՝ (%(roomId)s", + "unban": "Ապաարգելափակում է տրված ID-ով օգտատիրոջը", + "unflip": "Պարզ տեքստային հաղորդագրության սկզբից ավելացնում է ┬──┬ ノ( ゜-゜ノ) նշանները", + "unholdcall": "Ընթացիկ սենյակում զանգը հանում է սպասման ռեժիմից", + "unignore": "Դադարեցնում է օգտատիրոջ անտեսումը՝ ցուցադրելով նրա հաղորդագրությունները հետագայի համար", + "unignore_dialog_description": "Դուք այլևս չեք անտեսում %(userId)s-ին", + "unignore_dialog_title": "Ապաանտեսված օգտատեր", + "unknown_command": "Անհայտ հրաման", + "unknown_command_button": "Ուղարկել որպես հաղորդագրություն", + "unknown_command_detail": "Չճանաչված հրաման. %(commandText)s", + "unknown_command_help": "Դուք կարող եք օգտագործել /օգնությունթխ` հասանելի հրամանների ցուցակը ցույց տալու համար։ Արդյո՞ք դուք ուզում էիք սա ուղարկել որպես հաղորդագրություն։", + "unknown_command_hint": "Հուշում. սկսեք ձեր հաղորդագրությունը //-ով՝ թեք գծիկով սկսելու համար։", + "upgraderoom": "Սենյակը թարմացնում է նոր տարբերակով", + "upgraderoom_permission_error": "Դուք չունեք այս հրամանն օգտագործելու համար անհրաժեշտ թույլտվությունները։", + "usage": "Օգտագործում", + "verify": "Ձեռքով ստուգել ձեր սեփական սարքերից մեկը", + "view": "Դիտել նշված հասցեով սենյակը", + "whois": "Ցուցադրում է տեղեկատվություն օգտատիրոջ մասին" + }, + "sliding_sync_legacy_no_longer_supported": "Հնագույն \"սահող համաժամեցումը\"(sliding sync) այլևս չի աջակցվում. խնդրում ենք դուրս գալ և նորից մուտք գործել՝ նոր sliding sync-ի դրոշը միացնելու համար։", + "space": { + "add_existing_room_space": { + "create": "Ցանկան՞ում եք փոխարենն ավելացնել նոր սենյակ:", + "create_prompt": "Ստեղծել նոր սենյակ", + "dm_heading": "Անհատական(առանձին) հաղորդագրություններ", + "error_heading": "Ոչ բոլոր ընտրվածներն են ավելացվել", + "progress_text": { + "one": "Սենյակի ավելացում...", + "other": "Սենյակների ավելացում... (%(progress)s՝ %(count)s-ից)" + }, + "space_dropdown_label": "Տարածքի ընտրություն", + "space_dropdown_title": "Ավելացնել գոյություն ունեցող սենյակներ", + "subspace_moved_note": "Տարածքների ավելացումը տեղափոխվել է:" + }, + "add_existing_subspace": { + "create_button": "Ստեղծել նոր տարածք", + "create_prompt": "Ցանկան՞ում եք փոխարենն ավելացնել նոր տարածք:", + "filter_placeholder": "Որոնել տարածքներ", + "space_dropdown_title": "Ավելացնել գոյություն ունեցող տարածք" + }, + "context_menu": { + "devtools_open_timeline": "Տեսնել սենյակի ժամանակացույցը (devtools)", + "explore": "Փնտրել սենյակներ", + "home": "Տարածքի հիմնական էջ", + "manage_and_explore": "Կառավարել և ուսումնասիրել սենյակները", + "options": "Տարածքի ընտրանքներ" + }, + "failed_load_rooms": "Չհաջողվեց բեռնել սենյակների ցանկը:", + "failed_remove_rooms": "Որոշ սենյակներ չհաջողվեց հեռացնել: Փորձեք նորից ավելի ուշ։", + "incompatible_server_hierarchy": "Ձեր սերվերը չի աջակցում տարածքների հիերարխիաների ցուցադրումը:", + "invite": "Հրավիրել մարդկանց", + "invite_description": "Հրավիրել էլ.փոստով կամ օգտատիրոջ անունով", + "invite_link": "Կիսվել հրավիրման հղումով", + "joining_space": "Միացում", + "landing_welcome": "Բարի գալուստ ", + "leave_dialog_action": "Լքել տարածքը", + "leave_dialog_description": "Դուք պատրաստվում եք լքել ֊ը։", + "leave_dialog_only_admin_room_warning": "Դուք որոշ սենյակների կամ տարածքների միակ ադմինիստրատորն եք, որոնցից ցանկանում եք հեռանալ: Հեռացումը նրանց կթողնի առանց ադմինիստրատորների:", + "leave_dialog_only_admin_warning": "Դուք այս տարածքի միակ ադմինիստրատորն եք: Այն լքելը կնշանակի, որ ոչ ոք վերահսկողություն չի ունենա դրա վրա:", + "leave_dialog_option_all": "Լքել բոլոր սենյակները", + "leave_dialog_option_intro": "Կցանկանայի՞ք լքել այս տարածքի սենյակները:", + "leave_dialog_option_none": "Չլքել ոչ մի սենյակ", + "leave_dialog_option_specific": "Լքել որոշ սենյակներ", + "leave_dialog_public_rejoin_warning": "Դուք չեք կարողանա կրկին միանալ, եթե ձեզ նորից չհրավիրեն:", + "leave_dialog_title": "Լքել %(spaceName)s-ը", + "mark_suggested": "Նշել որպես առաջարկվող", + "no_search_result_hint": "Հնարավոր է, որ ցանկանաք փորձել այլ որոնում, կամ ստուգել տառասխալների առկայությունը:", + "preferences": { + "sections_section": "Ցուցադրելու բաժիններ", + "show_people_in_space": "Սա խմբավորում է ձեր զրույցները այս տարածքի անդամների հետ: Սա անջատելը կթաքցնի այդ զրույցները ձեր %(spaceName)s-ի տեսադաշտից:" + }, + "room_filter_placeholder": "Սենյակների որոնում", + "search_children": "Որոնել %(spaceName)s", + "search_placeholder": "Որոնել անուններ և նկարագրություններ", + "select_room_below": "Նախ ներքևում ընտրեք որևէ սենյակ", + "share_public": "Կիսվեք ձեր հանրային տարածքով", + "suggested": "Խորհուրդ տրվող", + "suggested_tooltip": "Այս սենյակը առաջարկվում է որպես լավ սենյակ միանալու համար", + "title_when_query_available": "Արդյունքներ", + "title_when_query_unavailable": "Սենյակներ և տարածքներ", + "unmark_suggested": "Նշել որպես չառաջարկվող", + "user_lacks_permission": "Դուք թույլտվություն չունեք" + }, + "space_settings": { + "title": "Կարգավորումներ - %(spaceName)s" + }, + "spaces": { + "error_no_permission_add_room": "Դուք չունեք այս տարածքում սենյակներ ավելացնելու թույլտվություններ", + "error_no_permission_add_space": "Դուք չունեք այս տարածքում տարածքներ ավելացնելու թույլտվություններ", + "error_no_permission_create_room": "Դուք այս տարածքում նոր սենյակներ ստեղծելու թույլտվություն չունեք", + "error_no_permission_invite": "Դուք չունեք այս տարածք մարդկանց հրավիրելու թույլտվություններ" + }, + "spotlight": { + "public_rooms": { + "network_dropdown_add_dialog_description": "Մուտքագրեք այն նոր սերվերի անունը, որը ցանկանում եք ուսումնասիրել։", + "network_dropdown_add_dialog_placeholder": "Սերվերի անունը", + "network_dropdown_add_dialog_title": "Ավելացնել նոր սերվեր", + "network_dropdown_add_server_option": "Ավելացնել նոր սերվեր…", + "network_dropdown_available_invalid": "Հնարավոր չէ գտնել այս սերվերը կամ դրա սենյակների ցանկը", + "network_dropdown_available_invalid_forbidden": "Դուք չունեք այս սերվերի սենյակների ցանկը դիտելու թույլտվություն", + "network_dropdown_available_valid": "Լավ է", + "network_dropdown_remove_server_adornment": "Հեռացնել «%(roomServer)s» սերվերը", + "network_dropdown_required_invalid": "Մուտքագրեք սերվերի անունը", + "network_dropdown_selected_label": "Ցուցադրել՝ Matrix սենյակներ", + "network_dropdown_selected_label_instance": "Ցուցադրել՝ %(instance)s սենյակներ (%(server)s )", + "network_dropdown_your_server_description": "Ձեր սերվերը" + } + }, + "spotlight_dialog": { + "cant_find_person_helpful_hint": "Եթե չեք տեսնում նրան, ում փնտրում եք, ուղարկեք նրան ձեր հրավերի հղումը:", + "cant_find_room_helpful_hint": "Եթե չեք կարողանում գտնել այն սենյակը, որը փնտրում եք, խնդրեք հրավիրել ձեզ կամ ստեղծել նոր սենյակ:", + "copy_link_text": "Պատճենել հրավերի հղումը", + "count_of_members": { + "one": "%(count)s անդամ", + "other": "%(count)s անդամներ" + }, + "create_new_room_button": "Ստեղծել նոր սենյակ", + "failed_querying_public_rooms": "Հանրային սենյակների հարցումը չհաջողվեց", + "failed_querying_public_spaces": "Հանրային տարածքների հարցումը չհաջողվեց", + "group_chat_section_title": "Այլ տարբերակներ/ընտրանքներ", + "heading_with_query": "Օգտագործեք «%(query)s»՝ փնտրելու համար", + "heading_without_query": "Փնտրել", + "join_button_text": "Միանալ %(roomAddress)s-ին", + "keyboard_scroll_hint": "Ոլորելու համար օգտագործեք ", + "messages_label": "Հաղորդագրություններ", + "other_rooms_in_space": "Այլ սենյակներ %(spaceName)s-ում", + "public_rooms_label": "Հանրային սենյակներ", + "public_spaces_label": "Հանրային տարածքներ", + "recent_searches_section_title": "Վերջին որոնումները", + "recently_viewed_section_title": "Վերջերս դիտված", + "remove_filter": "Հեռացնել %(filter)s-ի որոնման ֆիլտրը", + "result_may_be_hidden_privacy_warning": "Որոշ արդյունքներ կարող են թաքնված լինել գաղտնիության նպատակներով", + "result_may_be_hidden_warning": "Որոշ արդյունքներ կարող են թաքնված լինել", + "search_dialog": "Որոնման պատուհան", + "spaces_title": "Տարածքներ, որտեղ դուք գտնվում եք", + "start_group_chat_button": "Սկսել խմբային զրույց" + }, + "stickers": { + "empty": "Դուք ներկայումս չունեք որևէ միացված ստիկերների փաթեթ", + "empty_add_prompt": "Ավելացնել մի քանիսը հիմա" + }, + "terms": { + "column_document": "Փաստաթուղթ", + "column_service": "Ծառայություն", + "column_summary": "Ամփոփում", + "identity_server_no_terms_description_1": "Այս գործողությունը պահանջում է մուտք գործել ինքնության լռելյայն սերվեր՝ էլ․փոստի հասցեն կամ հեռախոսահամարը վավերացնելու համար, սակայն սերվերը չունի ծառայությունների մատուցման պայմաններ:", + "identity_server_no_terms_description_2": "Շարունակեք միայն այն դեպքում, եթե վստահում եք սերվերի սեփականատիրոջը։", + "identity_server_no_terms_title": "Նույնականացման սերվերը ծառայության պայմաններ չունի", + "inline_intro_text": "Շարունակելու համար ընդունեք -ը.", + "integration_manager": "Օգտագործեք բոտեր, կամուրջներ, վիջեթներ և պիտակների փաթեթներ", + "intro": "Շարունակելու համար դուք պետք է ընդունեք այս ծառայության պայմանները:", + "summary_identity_server_1": "Գտնել ուրիշներին հեռախոսով կամ էլ.փոստով", + "summary_identity_server_2": "Գտնվել հեռախոսով կամ էլ.փոստով", + "tac_button": "Վերանայեք ընդհանուր դրույթները և պայմանները", + "tac_description": "%(homeserverDomain)s սերվերի օգտագործումը շարունակելու համար դուք պետք է վերանայեք և համաձայնեք մեր դրույթներին և պայմաններին:", + "tac_title": "Ընդհանուր դրույթներ և պայմաններ", + "tos": "Ծառայությունների մատուցման պայմաններ" + }, + "theme": { + "light_high_contrast": "Լույսի բարձր հակադրություն", + "match_system": "Համակարգին համապատասխան" + }, + "thread_view_back_action_label": "Վերադառնալ թեմային", + "threads": { + "all_threads": "Բոլոր թեմաները/հոսքերը", + "all_threads_description": "Ցուցադրում է ընթացիկ սենյակի բոլոր թեմաները/հոսքերը", + "count_of_reply": { + "one": "%(count)s պատասխան", + "other": "%(count)s պատասխաններ" + }, + "empty_description": "Օգտագործեք «%(replyInThread)s» երբ կուրսորը պահում եք հաղորդագրության վրա։", + "empty_title": "Թեմաները օգնում են պահել ձեր խոսակցությունները թեմային համապատասխան և հեշտ հետևելի։", + "error_start_thread_existing_relation": "Հնարավոր չէ գոյություն ունեցող կապով իրադարձությունից ստեղծել «թեմա»/«հոսք»", + "mark_all_read": "Բոլորը նշել որպես կարդացված", + "my_threads": "Իմ թեմաները", + "my_threads_description": "Ցուցադրում է բոլոր թեմաները, որոնց դուք մասնակցել եք", + "open_thread": "Բացել թեման", + "show_thread_filter": "Ցուցադրել՝" + }, + "threads_activity_centre": { + "header": "Թեմաների ակտիվություն", + "no_rooms_with_threads_notifs": "Դուք դեռ չունեք սենյակներ թեմատիկ ծանուցումներով։", + "no_rooms_with_unread_threads": "Դուք դեռ չունեք սենյակներ, որտեղ կան չկարդացած թեմաներ։" + }, + "time": { + "about_day_ago": "մոտ մեկ օր առաջ", + "about_hour_ago": "մոտ մեկ ժամ առաջ", + "about_minute_ago": "մոտ մեկ րոպե առաջ", + "date_at_time": "%(date)s ժամը %(time)s", + "few_seconds_ago": "մի քանի վայրկյան առաջ", + "hours_minutes_seconds_left": "Մնաց %(hours)sժ %(minutes)sր %(seconds)sվ", + "in_about_day": "մոտ մեկ օր անց", + "in_about_hour": "մոտ մեկ ժամ անց", + "in_about_minute": "մոտ մեկ րոպե անց", + "in_few_seconds": "մի քանի վայրկյան անց", + "in_n_days": "%(num)s օր անց", + "in_n_hours": "%(num)s ժամ անց", + "in_n_minutes": "%(num)s րոպեներ անց", + "left": "%(timeRemaining)s մնաց", + "minutes_seconds_left": "Մնաց %(minutes)sր %(seconds)sվ", + "n_days_ago": "%(num)s օր առաջ", + "n_hours_ago": "%(num)s ժամ առաջ", + "n_minutes_ago": "%(num)s րոպե առաջ", + "seconds_left": "Մնաց %(seconds)sվ", + "short_days": "%(value)sօր", + "short_days_hours_minutes_seconds": "%(days)sօր %(hours)sժ %(minutes)sր %(seconds)sվ", + "short_hours": "%(value)sժ", + "short_hours_minutes_seconds": "%(hours)sժ %(minutes)sր %(seconds)sվ", + "short_minutes": "%(value)sր", + "short_minutes_seconds": "%(minutes)sր %(seconds)sվ", + "short_seconds": "%(value)sվ" + }, + "timeline": { + "context_menu": { + "collapse_reply_thread": "Ծալել պատասխանի թեման", + "external_url": "Աղբյուրի URL", + "open_in_osm": "Բացել OpenStreetMap-ում", + "report": "Բողոք", + "resent_unsent_reactions": "Կրկին ուղարկել %(unsentCount)s արձագանք(ներ)", + "show_url_preview": "Ցուցադրել նախադիտումը", + "view_related_event": "Դիտել կապակցված իրադարձությունը", + "view_source": "Դիտել աղբյուրը" + }, + "creation_summary_dm": "%(creator)s-ն ստեղծեց այս DM-ը (անձնական հաղորդագրություններ)։", + "creation_summary_room": "%(creator)s-ն ստեղծել և կարգավորել է սենյակը։", + "decryption_failure": { + "blocked": "Ուղարկողը արգելափակել է այս հաղորդագրությունն ստանալու հնարավորությունը, քանի որ ձեր սարքը հաստատված չէ։", + "historical_event_no_key_backup": "Պատմական հաղորդագրությունները հասանելի չեն այս սարքի վրա", + "historical_event_unverified_device": "Դուք պետք է հաստատեք այս սարքը՝ պատմական հաղորդագրությունների հասանելիության համար", + "historical_event_user_not_joined": "Դուք հասանելիություն չունեք այս հաղորդագրություններին", + "sender_identity_previously_verified": "Ուղարկողի վավերացված ինքնությունը վերակայվել է։", + "sender_unsigned_device": "Ուղարկվել է անապահով սարքից։", + "unable_to_decrypt": "Հնարավոր չէ վերծանել հաղորդագրությունը" + }, + "disambiguated_profile": "%(displayName)s(%(matrixId)s)", + "download_action_decrypting": "Վերծանում", + "download_action_downloading": "Ներբեռնում", + "download_failed": "Չհաջողվեց ներբեռնել", + "download_failed_description": "Այս ֆայլը ներբեռնելիս սխալ տեղի ունեցավ", + "e2e_state": "\"Ծայրից ծայր\" գաղտնագրման կարգավիճակը", + "edits": { + "tooltip_label": "Խմբագրվել է %(date)s-ին։ Սեղմեք՝ փոփոխությունները դիտելու համար։", + "tooltip_sub": "Սեղմեք՝ փոփոխությունները դիտելու համար", + "tooltip_title": "Խմբագրվել է %(date)s-ին" + }, + "error_no_renderer": "Անհնար է ցուցադրել այս իրադարձությունը", + "error_rendering_message": "Հնարավոր չէ բեռնել այս հաղորդագրությունը", + "historical_messages_unavailable": "Դուք չեք կարող տեսնել նախորդ/հին հաղորդագրությունները", + "in_room_name": " %(room)s սենյակում", + "io.element.widgets.layout": "%(senderName)s-ը թարմացրել է սենյակի դասավորությունը", + "late_event_separator": "Սկզբնապես ուղարկված %(dateTime)s-ին", + "load_error": { + "no_permission": "Փորձեցնք բեռնել այս սենյակի ժամանակացույցի որոշակի կետ, բայց դուք թույլտվություն չունեք դիտելու տվյալ հաղորդագրությունը։", + "title": "Ժամանակացույցի դիրքը չհաջողվեց բեռնել", + "unable_to_find": "Փորձեցինք բեռնել այս սենյակի ժամանակագրության որոշակի կետ, բայց չկարողացանք գտնել այն։" + }, + "m.audio": { + "audio_player": "Աուդիո նվագարկիչ", + "error_downloading_audio": "Աուդիո ներբեռնման սխալ", + "error_processing_audio": "Ձայնային հաղորդագրության մշակման սխալ", + "error_processing_voice_message": "Ձայնային հաղորդագրության մշակման սխալ", + "unnamed_audio": "Անանուն աուդիո" + }, + "m.beacon_info": { + "view_live_location": "Դիտել կենդանի գտնվելու վայրը" + }, + "m.call": { + "video_call_ended": "Տեսազանգն ավարտվեց", + "video_call_started": "Տեսազանգը սկսվեց %(roomName)s֊ում:", + "video_call_started_text": "%(name)s-ը սկսել է տեսազանգ", + "video_call_started_unsupported": "Տեսազանգը սկսվեց %(roomName)s֊ում․ (չի աջակցվում այս զննարկչի կողմից)" + }, + "m.call.hangup": { + "dm": "Զանգն ավարտվել է" + }, + "m.call.invite": { + "answered_elsewhere": "Պատասխանել է այլ տեղ", + "call_back_prompt": "Հետզանգահարել", + "declined": "Զանգը մերժվեց", + "failed_connect_media": "Հնարավոր չէ միացնել մեդիան", + "failed_connection": "Կապը ձախողվեց", + "failed_opponent_media": "Նրանց սարքը չկարողացավ միացնել տեսախցիկը կամ խոսափողը", + "missed_call": "Բաց թողնված զանգ", + "no_answer": "Պատասխան չկա", + "unknown_error": "Անհայտ սխալ տեղի ունեցավ", + "unknown_failure": "Անհայտ ձախողում. %(reason)s", + "unknown_state": "Զանգը անհայտ վիճակում է։", + "video_call": "%(senderName)s-ը տեղադրել է տեսազանգ:", + "video_call_unsupported": "%(senderName)s-ը տեղադրել է տեսազանգ. (չի աջակցվում այս զննարկիչի կողմից)", + "voice_call": "%(senderName)s-ը տեղադրել է ձայնային զանգ:", + "voice_call_unsupported": "%(senderName)s-ը տեղադրել է ձայնային զանգ․ (չի աջակցվում այս զննարկիչի կողմից)" + }, + "m.file": { + "error_decrypting": "Կցորդի վերծանման սխալ", + "error_invalid": "Անվավեր ֆայլ" + }, + "m.image": { + "error": "Սխալի պատճառով նկարը չի կարող ցուցադրվել", + "error_decrypting": "Նկարի վերծանման սխալ", + "error_downloading": "Նկարի ներբեռնման սխալ", + "sent": "%(senderDisplayName)s-ն նկար է ուղարկել:", + "show_image": "Ցուցադրել նկարը" + }, + "m.key.verification.request": { + "user_wants_to_verify": "%(name)s-ը ցանկանում է ստուգել", + "you_started": "Դուք ուղարկել եք ստուգման հարցում" + }, + "m.location": { + "full": "%(senderName)s-ը կիսվել է իր գտնվելու վայրով", + "location": "Կիսվել է գտնվելու վայրով՝ ", + "self_location": "Կիսվել են իրենց գտնվելու վայրով՝ " + }, + "m.poll": { + "count_of_votes": { + "one": "%(count)s ձայն", + "other": "%(count)s ձայներ" + } + }, + "m.poll.end": { + "ended": "Ավարտվեց հարցումը", + "sender_ended": "%(senderName)s-ն ավարտել է հարցումը" + }, + "m.poll.start": "%(senderName)s-ը սկսել է հարցում՝ %(pollQuestion)s", + "m.room.avatar": { + "changed": "%(senderDisplayName)s-ը փոխել է սենյակի ավատարը:", + "changed_img": "%(senderDisplayName)s-ը փոխել է սենյակի ավատարը -ով", + "lightbox_title": "%(senderDisplayName)s-ը փոխել է %(roomName)s֊ի ավատարը", + "removed": "%(senderDisplayName)s-ը հեռացրեց սենյակի ավատարը:" + }, + "m.room.canonical_alias": { + "alt_added": { + "one": "%(senderName)s-ն ավելացրել է %(addresses)s այլընտրանքային հասցեն այս սենյակի համար։", + "other": "%(senderName)s-ն ավելացրել է %(addresses)s այլընտրանքային հասցեներն այս սենյակի համար։" + }, + "alt_removed": { + "one": "%(senderName)s-ը հեռացրել է %(addresses)s այլընտրանքային հասցեն այս սենյակի համար։", + "other": "%(senderName)s-ը հեռացրել է %(addresses)s այլընտրանքային հասցեներն այս սենյակի համար։" + }, + "changed": "%(senderName)s-ը փոխել է այս սենյակի հասցեները:", + "changed_alternative": "%(senderName)s-ը փոխել է այս սենյակի այլընտրանքային հասցեները:", + "changed_main_and_alternative": "%(senderName)s-ը փոխել է այս սենյակի հիմնական և այլընտրանքային հասցեները:", + "removed": "%(senderName)s-ը հեռացրել է այս սենյակի հիմնական հասցեն:", + "set": "%(senderName)s-ը սահմանել է այս սենյակի հիմնական հասցեն՝ %(address)s:" + }, + "m.room.create": { + "continuation": "Այս սենյակը մեկ այլ զրույցի շարունակությունն է։", + "see_older_messages": "Սեղմեք այստեղ՝ ավելի հին հաղորդագրությունները տեսնելու համար։", + "unknown_predecessor": "Հնարավոր չէ գտնել այս սենյակի հին տարբերակը (սենյակի ID՝ %(roomId)s ), և մեզ չի տրամադրվել «via_servers»՝ այն փնտրելու համար։", + "unknown_predecessor_guess_server": "Հնարավոր չէ գտնել այս սենյակի հին տարբերակը (սենյակի ID՝ %(roomId)s ), և մեզ չի տրամադրվել «via_servers»՝ այն որոնելու համար։ Հնարավոր է, որ սենյակի ID-ից սերվերը գուշակելը կստացվի։ Եթե ուզում եք փորձել, սեղմեք այս հղման վրա։" + }, + "m.room.encryption": { + "disable_attempt": "Գաղտնագրումն անջատելու անտեսված փորձ", + "disabled": "Գաղտնագրումը միացված չէ", + "enabled": "Այս սենյակում հաղորդագրությունները ծայրից ծայր գաղտնագրված են։ Երբ մարդիկ միանում են, դուք կարող եք հաստատել նրանց իրենց էջում՝ պարզապես սեղմելով նրանց էջի նկարի վրա։", + "enabled_dm": "Այստեղ հաղորդագրությունները ծայրից ծայր գաղտնագրված են: Ստուգեք %(displayName)s-ին իր պրոֆիլում․ սեղմեք նրա պրոֆիլի նկարին:", + "enabled_local": "Այս զրույցի հաղորդագրությունները կլինեն ծայրից ծայր գաղտնագրված։", + "parameters_changed": "Որոշ գաղտնագրման պարամետրեր փոխվել են:", + "unsupported": "Այս սենյակի կողմից օգտագործվող գաղտնագրումը չի աջակցվում։" + }, + "m.room.guest_access": { + "can_join": "%(senderDisplayName)s-ը թույլ է տվել հյուրերին միանալ սենյակին:", + "forbidden": "%(senderDisplayName)s-ը կանխել է հյուրերին միանալ սենյակին:", + "unknown": "%(senderDisplayName)s-ը փոխել է հյուրի մուտքի թույլտվությունը %(rule)s-ով" + }, + "m.room.history_visibility": { + "invited": "%(senderName)s-ը ապագա սենյակի պատմությունը տեսանելի է դարձրել սենյակի բոլոր անդամների համար՝ սկսած նրանց հրավիրելու պահից։", + "joined": "%(senderName)s-ը սենյակի ապագա պատմությունը տեսանելի է դարձրել սենյակի բոլոր անդամների համար՝ սկսած նրանց միանալու պահից։", + "shared": "%(senderName)s-ը սենյակի ապագա պատմությունը տեսանելի է դարձրել սենյակի բոլոր անդամների համար։", + "unknown": "%(senderName)s-ը ապագա սենյակի պատմությունը տեսանելի դարձրեց անհայտ անձանց (%(visibility)s):", + "world_readable": "%(senderName)s-ը սենյակի ապագա պատմությունը տեսանելի է դարձրել բոլորի համար։" + }, + "m.room.join_rules": { + "invite": "%(senderDisplayName)s-ը սենյակի մուտքը դարձրեց միայն հրավերով։", + "knock": "%(senderDisplayName)s-ը փոխել է միանալու կանոնը՝ միանալ խնդրելու եղանակով:", + "public": "%(senderDisplayName)s-ը սենյակը հանրայնացրել է այն մարդկանց համար, ովքեր ունեն սենյակի հղումը:", + "restricted": "%(senderDisplayName)s-ը փոխել է կարգը, թե ով կարող է միանալ այս սենյակին:", + "restricted_settings": "%(senderDisplayName)s-ը փոխել է կարգը, թե ով կարող է միանալ այս սենյակին: Դիտել կարգավորումները։", + "unknown": "%(senderDisplayName)s-ը փոխել է միացման կանոնը %(rule)s֊ով։" + }, + "m.room.member": { + "accepted_3pid_invite": "%(targetName)s-ն ընդունել է հրավերը․ %(displayName)s", + "accepted_invite": "%(targetName)s-ն ընդունել է հրավերը", + "ban": "%(senderName)s֊ը արգելափակել է %(targetName)s-ին․", + "ban_reason": "%(senderName)s֊ը արգելափակել է %(targetName)s-ին․ %(reason)s", + "change_avatar": "%(senderName)s-ը փոխել է իր պրոֆիլի նկարը", + "change_name": "%(oldDisplayName)s-ը փոխել է իր ցուցադրման անունը %(displayName)s-նով", + "change_name_avatar": "%(oldDisplayName)s-ը փոխել է իր ցուցադրման անունը և պրոֆիլի նկարը", + "invite": "%(senderName)s-ը հրավիրվել է %(targetName)s-ին", + "join": "%(targetName)s-ը միացել է սենյակին", + "kick": "%(senderName)s-ը հեռացրել է %(targetName)s-ին", + "kick_reason": "%(senderName)s-ը հեռացրել է %(targetName)s-ին․ %(reason)s", + "left": "%(targetName)s-ը լքել է սենյակը", + "left_reason": "%(targetName)s-ը լքեց սենյակը. (%(reason)s", + "no_change": "%(senderName)s-ը փոփոխություն չի կատարել", + "reject_invite": "%(targetName)s-ը մերժել է հրավերը", + "reject_invite_reason": "%(targetName)s-ի կողմից հրավերը մերժվել է․ %(reason)s։", + "remove_avatar": "%(senderName)s-ը հեռացրել են իր պրոֆիլի նկարը", + "remove_name": "%(senderName)s-ը հեռացրել է իր ցուցադրման անունը․ (%(oldDisplayName)s)", + "set_avatar": "%(senderName)s-ը սահմանել է պրոֆիլի նկար", + "set_name": "%(senderName)s-ը սահմանել է իր ցուցադրման անունը %(displayName)s֊ն", + "unban": "%(senderName)s-ն ապաարգելափակել է %(targetName)s-ին", + "withdrew_invite": "%(senderName)s-ը հետ վերցրեց %(targetName)s-ի հրավերը", + "withdrew_invite_reason": "%(senderName)s-ը հետ վերցրեց %(targetName)s-ի հրավերը. %(reason)s" + }, + "m.room.name": { + "change": "%(senderDisplayName)s-ը փոխել է սենյակի անունը՝ %(oldRoomName)s-ից %(newRoomName)s-ն.", + "remove": "%(senderDisplayName)s-ը հեռացրել է սենյակի անունը:", + "set": "%(senderDisplayName)s-ը փոխել է սենյակի անունը %(roomName)s-ն:" + }, + "m.room.pinned_events": { + "changed": "%(senderName)s-ը փոխել է սենյակի համար ամրացված հաղորդագրությունները:", + "changed_link": "%(senderName)s-ը փոխել է սենյակի համար ամրացված հաղորդագրությունը։", + "pinned": "%(senderName)s-ն ամրացրել է հաղորդագրություն այս սենյակում։ Տեսնել բոլոր ամրացված հաղորդագրությունները։", + "pinned_link": "%(senderName)s-ն ամրացրել է հաղորդագրությունը այս սենյակում։ Տեսնել բոլոր ամրացված հաղորդագրությունները․", + "unpinned": "%(senderName)s-ն ապաամրացրել է հաղորդագրություն այս սենյակից։ Տեսնել բոլոր ամրացված հաղորդագրությունները։", + "unpinned_link": "%(senderName)s-ն ապաամրացրել է հաղորդագրություն այս սենյակից։ Տեսնել բոլոր ամրացված հաղորդագրությունները։" + }, + "m.room.power_levels": { + "changed": "%(senderName)s-ը փոխել է %(powerLevelDiffText)s֊ի հզորության մակարդակը։", + "user_from_to": "%(userId)s-ը %(fromPowerLevel)s-ից %(toPowerLevel)s" + }, + "m.room.server_acl": { + "all_servers_banned": "🎉 Բոլոր սերվերներին արգելված է մասնակցել: Այս սենյակը այլեւս չի կարող օգտագործվել:", + "changed": "%(senderDisplayName)s-ը փոխել է սերվերի ACL-ները(մուտքի վերահսկման ցուցակներ) այս սենյակի համար:", + "set": "%(senderDisplayName)s-ը սանհմանեց սերվերի ACL-ները(մուտքի վերահսկման ցուցակներ) այս սենյակի համար:" + }, + "m.room.third_party_invite": { + "revoked": "%(senderName)s-ը չեղյալ է համարել %(targetDisplayName)s-ի սենյակին միանալու հրավերը:", + "sent": "%(senderName)s-ը հրավեր է ուղարկել %(targetDisplayName)s-ին՝ սենյակին միանալու համար։" + }, + "m.room.tombstone": "%(senderDisplayName)s-ը թարմացրել է այս սենյակը:", + "m.room.topic": { + "changed": "%(senderDisplayName)s-ը թարմացրեց թեման՝ \"%(topic)s\"։", + "removed": "%(senderDisplayName)s-ը հեռացրեց թեման։" + }, + "m.sticker": "%(senderDisplayName)s-ը ուղարկել է ստիկեր:", + "m.video": { + "error_decrypting": "Տեսանյութի վերծանման սխալ", + "show_video": "Ցուցադրել տեսանյութը" + }, + "m.widget": { + "added": "%(widgetName)s վիջեթն ավելացվել է %(senderName)s-ի կողմից", + "jitsi_ended": "Տեսակոնֆերանսն ավարտվել է %(senderName)s-ի կողմից", + "jitsi_join_right_prompt": "Միացեք կոնֆերանսին՝ աջ կողմում գտնվող սենյակի տեղեկատվական քարտից", + "jitsi_join_top_prompt": "Միացեք կոնֆերանսին այս սենյակի վերևի մասում", + "jitsi_started": "Տեսակոնֆերանսը սկսվել է %(senderName)s֊ի կողմից", + "jitsi_updated": "Տեսակոնֆերանսը թարմացվել է %(senderName)s-ի կողմից", + "modified": "%(widgetName)s վիջեթը փոփոխվել է %(senderName)s-ի կողմից", + "removed": "%(widgetName)s վիջեթը հեռացվել է %(senderName)s-ի կողմից" + }, + "mab": { + "collapse_reply_chain": "Ծալել մեջբերումները", + "copy_link_thread": "Պատճենել հղումը թեմայում", + "expand_reply_chain": "Ընդարձակել մեջբերումները", + "label": "Հաղորդագրության գործողություններ", + "view_in_room": "Դիտել սենյակում" + }, + "message_timestamp_received_at": "Ստացվել է՝ %(dateTime)s-ին", + "message_timestamp_sent_at": "Ուղարկվել է՝ %(dateTime)s֊ին", + "mjolnir": { + "changed_rule_glob": "%(senderName)s թարմացրեց արգելքի կանոնը, որը նախկինում համապատասխանում էր %(oldGlob)s-ին, այժմ՝ %(newGlob)s-ին՝ %(reason)s պատճառով։", + "changed_rule_rooms": "%(senderName)s փոխեց կանոնը, որը արգելափակում էր %(oldGlob)s համապատասխանող սենյակները, այժմ այն գործում է %(newGlob)s համապատասխանողների համար՝ %(reason)s պատճառով։", + "changed_rule_servers": "%(senderName)s փոխեց կանոնը, որը արգելափակում էր %(oldGlob)s համապատասխանող սերվերները, այժմ այն գործում է %(newGlob)s համապատասխանողների համար՝ %(reason)s պատճառով։", + "changed_rule_users": "%(senderName)s փոխեց կանոնը, որը արգելափակում էր %(oldGlob)s համապատասխանող օգտատերերին, այժմ այն գործում է %(newGlob)s համապատասխանողների համար՝ %(reason)s պատճառով։", + "created_rule": "%(senderName)s-ը ստեղծեց %(glob)s–ին համապատասխանող արգելքի կանոն՝ %(reason)s պատճառով", + "created_rule_rooms": "%(senderName)s-ը ստեղծեց %(glob)s–ին համապատասխանող սենյակները արգելող կանոն՝ %(reason)s պատճառով", + "created_rule_servers": "%(senderName)s-ը ստեղծեց %(glob)s–ին համապատասխանող սերվերները արգելող կանոն՝ %(reason)s պատճառով", + "created_rule_users": "%(senderName)s-ը ստեղծեց %(glob)s–ին համապատասխանող օգտատերերին արգելող կանոն՝ %(reason)s պատճառով", + "message_hidden": "Դուք անտեսել եք այս օգտատիրոջը, ուստի նրա հաղորդագրությունը թաքցված է։ Ամեն դեպքում ցույց տալ։", + "removed_rule": "%(senderName)s-ը հեռացրել է %(glob)s-ին համապատասխանող արգելքի կանոնը", + "removed_rule_rooms": "%(senderName)s-ը հեռացրեց %(glob)s-ին համապատասխանող սենյակներն արգելող կանոնը", + "removed_rule_servers": "%(senderName)s-ը հեռացրեց %(glob)s-ին համապատասխանող սերվերներն արգելող կանոնը", + "removed_rule_users": "%(senderName)s-ը հեռացրեց %(glob)s-ին համապատասխանող օգտատերերին արգելող կանոնը", + "updated_invalid_rule": "%(senderName)s-ը թարմացրել է անվավեր արգելքի կանոնը", + "updated_rule": "%(senderName)s-ը թարմացրեց %(glob)s–ին համապատասխանող արգելքի կանոնը՝ %(reason)s պատճառով", + "updated_rule_rooms": "%(senderName)s-ը թարմացրեց այն կանոնը, որը արգելում է %(glob)s–ին համապատասխանող սենյակները՝ %(reason)s պատճառով", + "updated_rule_servers": "%(senderName)s-ը թարմացրեց այն կանոնը, որը արգելում է %(glob)s–ին համապատասխանող սերվերները՝ %(reason)s պատճառով", + "updated_rule_users": "%(senderName)s-ը թարմացրեց այն կանոնը, որը արգելում է %(glob)s–ին համապատասխանող օգտատերերին՝ %(reason)s պատճառով" + }, + "no_permission_messages_before_invite": "Դուք թույլտվություն չունեք դիտելու այն հաղորդագրությունները, որոնք ուղարկված են եղել ձեր հրավերն ստանալուց առաջ։", + "no_permission_messages_before_join": "Դուք թույլտվություն չունեք դիտելու այն հաղորդագրությունները, որոնք ուղարկված են եղել ձեր միանալուց առաջ։", + "pending_moderation": "Հաղորդագրությունը սպասում է մոդերացիայի", + "pending_moderation_reason": "Մոդերացիայի սպասող հաղորդագրություն․ %(reason)s", + "reactions": { + "add_reaction_prompt": "Ավելացնել արձագանք", + "custom_reaction_fallback_label": "Հատուկ արձագանք", + "label": "%(reactors)s-ն արձագանքեց %(content)s-ով", + "tooltip_caption": "արձագանքեց %(shortName)s-ով" + }, + "read_receipt_title": { + "one": "Տեսել է %(count)s մարդ", + "other": "Տեսել է %(count)s մարդիկ" + }, + "read_receipts_label": "Կարդալ անդորրագրերը", + "redacted": { + "tooltip": "Հաղորդագրությունը ջնջվել է %(date)s" + }, + "redaction": "Հաղորդագրությունը ջնջվել է %(name)s-ի կողմից", + "reply": { + "error_loading": "Անհնար է բեռնել պատասխանված իրադարձությունը, այն կա՛մ գոյություն չունի, կա՛մ դուք չունեք այն դիտելու թույլտվություն:", + "in_reply_to": "Ի պատասխան", + "in_reply_to_for_export": "Ի պատասխան այս հաղորդագրությանը " + }, + "scalar_starter_link": { + "dialog_description": "Դուք շուտով կտեղափոխվեք երրորդ կողմի կայք, որպեսզի կարողանաք վավերացնել ձեր հաշիվը՝ %(integrationsUrl)s-ով օգտագործելու համար: Ցանկանո՞ւմ եք շարունակել:", + "dialog_title": "Ավելացնել ինտեգրում" + }, + "self_redaction": "Հաղորդագրությունը ջնջված է", + "send_state_encrypting": "Ձեր հաղորդագրության գաղտնագրում...", + "send_state_failed": "Չհաջողվեց ուղարկել", + "send_state_sending": "Ձեր հաղորդագրությունն ուղարկվում է…", + "send_state_sent": "Ձեր հաղորդագրությունն ուղարկվեց", + "summary": { + "banned": { + "one": "արգելվել է", + "other": "արգելվել է %(count)s անգամ" + }, + "banned_multiple": { + "one": "արգելվել են", + "other": "արգելվել են %(count)s անգամ" + }, + "changed_avatar": { + "one": "%(oneUser)s փոխելէ իր պրոֆիլի նկարը", + "other": "%(oneUser)s փոխել իր պրոֆիլի նկարը %(count)s անգամ" + }, + "changed_avatar_multiple": { + "one": "%(severalUsers)s փոխել են իրենց պրոֆիլի նկարը", + "other": "%(severalUsers)s փոխել են իրենց պրոֆիլի նկարը %(count)s անգամ" + }, + "changed_name": { + "one": "%(oneUser)s փոխել է իր անունը", + "other": "%(oneUser)s փոխել է իր անունը %(count)s անգամ" + }, + "changed_name_multiple": { + "one": "%(severalUsers)s փոխել են իրենց անունը", + "other": "%(severalUsers)s փոխել են իրենց անուն %(count)s անգամ" + }, + "format": "%(nameList)s %(transitionList)s", + "hidden_event": { + "one": "%(oneUser)s ուղարկել է թաքնված հաղորդագրություն", + "other": "%(oneUser)s ուղարկել է %(count)s թաքնված հաղորդագրություններ" + }, + "hidden_event_multiple": { + "one": "%(severalUsers)s ուղարկել են թաքնված հաղորդագրություն", + "other": "%(severalUsers)s ուղարկել են %(count)s թաքնված հաղորդագրություններ" + }, + "invite_withdrawn": { + "one": "%(oneUser)s հրավերը հետ է կանչել", + "other": "%(oneUser)s հրավերը հետ է կանչվել %(count)s անգամ" + }, + "invite_withdrawn_multiple": { + "one": "%(severalUsers)s հրավերները հետ են կանչվել", + "other": "%(severalUsers)s հրավերները հետ են կանչվել %(count)s անգամ" + }, + "invited": { + "one": "հրավիրվել էր", + "other": "հրավիրվել էր %(count)s անգամ" + }, + "invited_multiple": { + "one": "հրավիրվել են", + "other": "հրավիրվել են %(count)s անգամ" + }, + "joined": { + "one": "%(oneUser)s միացավ", + "other": "%(oneUser)s միացավ %(count)s անգամ" + }, + "joined_and_left": { + "one": "%(oneUser)s միացավ և լքեց", + "other": "%(oneUser)s միացավ և լքեց %(count)s անգամ" + }, + "joined_and_left_multiple": { + "one": "%(severalUsers)s միացած և լքած", + "other": "%(severalUsers)s միացած և լքած %(count)s անգամ" + }, + "joined_multiple": { + "one": "%(severalUsers)s միացած", + "other": "%(severalUsers)s միացած %(count)s անգամ" + }, + "kicked": { + "one": "հեռացվել է", + "other": "հեռացվել է %(count)s անգամ" + }, + "kicked_multiple": { + "one": "հեռացվել են", + "other": "հեռացվել են %(count)s անգամ" + }, + "left": { + "one": "%(oneUser)s լքեց", + "other": "%(oneUser)s լքեց %(count)s անգամ" + }, + "left_multiple": { + "one": "%(severalUsers)s լքած", + "other": "%(severalUsers)s լքած %(count)s անգամ" + }, + "no_change": { + "one": "%(oneUser)s փոփոխություններ չի կատարել", + "other": "%(oneUser)s փոփոխություններ չի կատարել %(count)s անգամ" + }, + "no_change_multiple": { + "one": "%(severalUsers)s փոփոխություններ չեն կատարել", + "other": "%(severalUsers)s փոփոխություններ չեն կատարել %(count)s անգամ" + }, + "pinned_events": { + "one": "%(oneUser)s փոխել է սենյակի համար ամրացված հաղորդագրությունները", + "other": "%(oneUser)s փոխել է սենյակի համար ամրացված հաղորդագրությունները %(count)s անգամ" + }, + "pinned_events_multiple": { + "one": "%(severalUsers)s փոխել են սենյակի համար ամրացված հաղորդագրությունները", + "other": "%(severalUsers)s փոխել են սենյակի համար ամրացված հաղորդագրությունները %(count)s անգամ" + }, + "redacted": { + "one": "%(oneUser)s հեռացրել է հաղորդագրություն", + "other": "%(oneUser)s հեռացրել է %(count)s հաղորդագրություններ" + }, + "redacted_multiple": { + "one": "%(severalUsers)s հեռացրել են հաղորդագրություն", + "other": "%(severalUsers)s հեռացրել են %(count)s հաղորդագրություններ" + }, + "rejected_invite": { + "one": "%(oneUser)s մերժել է իր հրավերը", + "other": "%(oneUser)s մերժել է իր հրավերը %(count)s անգամ" + }, + "rejected_invite_multiple": { + "one": "%(severalUsers)s մերժել են իրենց հրավերները", + "other": "%(severalUsers)s մերժել են իրենց հրավերների %(count)s անգամ" + }, + "rejoined": { + "one": "%(oneUser)s լքեց և նորից միացավ", + "other": "%(oneUser)s լքեց և նորից միացավ %(count)s անգամ" + }, + "rejoined_multiple": { + "one": "%(severalUsers)s լքած և նորից միացած", + "other": "%(severalUsers)s լքած և նորից միացած %(count)s անգամ" + }, + "server_acls": { + "one": "%(oneUser)s-ը փոխել է սերվերի ACL-ները(մուտքի վերահսկման ցուցակներ)", + "other": "%(oneUser)s-ը փոխել է սերվերի ACL-ները(մուտքի վերահսկման ցուցակներ) %(count)s անգամ" + }, + "server_acls_multiple": { + "one": "%(severalUsers)s-ը փոխել են սերվերի ACL-ները(մուտքի վերահսկման ցուցակներ)", + "other": "%(severalUsers)s-ը փոխել են սերվերի ACL-ները(մուտքի վերահսկման ցուցակներ) %(count)s անգամ" + }, + "unbanned": { + "one": "ապաարգելվել է", + "other": "ապաարգելվել է %(count)s անգամ" + }, + "unbanned_multiple": { + "one": "ապաարգելվել են", + "other": "ապաարգելվել են %(count)s անգամ" + } + }, + "thread_info_basic": "Թեմաից", + "typing_indicator": { + "more_users": { + "one": "%(names)s-ը և մեկ ուրիշը գրում են ...", + "other": "%(names)s-ը և %(count)s այլ օգտատերեր գրում են ․․․" + }, + "one_user": "%(displayName)s-ը գրում է ...", + "two_users": "%(names)s-ը և %(lastPerson)s-ը գրում են ․․․" + }, + "undecryptable_tooltip": "Անհնար է վերծանել այս հաղորդագրությունը", + "url_preview": { + "close": "Փակել նախադիտումը", + "show_n_more": { + "one": "Ցույց տալ %(count)s այլ նախադիտում", + "other": "Ցույց տալ %(count)s այլ նախադիտումներ" + } + } + }, + "truncated_list_n_more": { + "one": "", + "other": "Եվ ևս %(հաշվարկ)s..." + }, + "unsupported_browser": { + "description": "Եթե շարունակեք, որոշ հնարավորություններ կարող են դադարեցնել աշխատանքը, և գոյություն ունի տվյալների կորուստի ռիսկ։ Թարմացրեք ձեր զննարկիչը, որպեսզի շարունակեք օգտագործել %(brand)s-ը։", + "title": "Այս զննարկիչը չի աջակցվում %(brand)s-ի կողմից" + }, + "unsupported_server_description": "Այս սերվերը օգտագործում է Matrix-ի ավելի հին տարբերակը: Թարմացրեք Matrix %(version)s տարբերակով՝ %(brand)s-ն առանց սխալների օգտագործելու համար:", + "unsupported_server_title": "Ձեր սերվերը չի աջակցվում", + "update": { + "changelog": "Փոփոխությունների մատյան", + "check_action": "Ստուգել նոր տարբերակի առկայությունը", + "checking": "Թարմացման ստուգում...", + "downloading": "Թարմացումը ներբեռնվում է…", + "error_encountered": "Սխալ է առաջացել (%(errorDetail)s):", + "error_unable_load_commit": "Անհնար է բեռնել հանձնման մանրամասները. %(msg)s", + "new_version_available": "Նոր տարբերակը հասանելի է: Թարմացնել հիմա։", + "no_update": "Թարմացում հասանելի չէ:", + "release_notes_toast_title": "Ինչ է նոր", + "see_changes_button": "Ի՞նչ նոր բան կա:", + "toast_description": "%(brand)s-ի նոր տարբերակը հասանելի է", + "toast_title": "Թարմացնել %(brand)s-ը", + "unavailable": "Անհասանելի" + }, + "update_room_access_modal": { + "description": "Կիսման հղում ստեղծելու համար դարձրեք այս սենյակը հանրային կամ ակտիվացրեք այն տարբերակը, որը թույլ է տալիս օգտատերերին խնդրել միանալ։ Սա հնարավորություն է տալիս հյուրերին միանալ առանց հրավերի։", + "dont_change_description": "Եթե չեք ցանկանում փոխել այս սենյակի հասանելիությունը, կարող եք ստեղծել նոր սենյակ զանգի հղման համար։", + "no_change": "Ես չեմ ցանկանում փոխել հասանելիության աստիճանը։", + "revert_access_description": "(Սա կարող է վերադարձվել նախորդ արժեքին սենյակի կարգավորումներում․ Անվտանգություն և գաղտնիություն / Մուտք)", + "title": "Թույլատրել հյուր օգտատերերին միանալ այս սենյակին" + }, + "upload_failed_generic": "“%(fileName)s' ֆայլը չի հաջողվել վերբեռնել:", + "upload_failed_size": "“%(fileName)s” ֆայլը գերազանցում է այս սերվերում վերբեռնումների համար նախատեսված ծավալը", + "upload_failed_title": "Վերբեռնումը ձախողվեց", + "upload_file": { + "cancel_all_button": "Չեղարկել բոլորը", + "error_file_too_large": "Այս ֆայլը չափազանց մեծ է ներբեռնելու համար: Ֆայլի չափի սահմանը %(limit)s է, բայց այս ֆայլը %(sizeOfThisFile)s է:", + "error_files_too_large": "Այս ֆայլերը չափազանց մեծ են վերբեռնելու համար։ Ֆայլի չափի սահմանաչափը %(limit)s է։", + "error_some_files_too_large": "Որոշ ֆայլեր չափազանց մեծ են վերբեռնման համար։ Ֆայլի չափի սահմանաչափը %(limit)s է։", + "error_title": "Վերբեռնման սխալ", + "not_image": "Ձեր ընտրած ֆայլը վավեր պատկերի ֆայլ չէ։", + "title": "Ֆայլերի վերբեռնում", + "title_progress": "Բեռնել ֆայլերը (%(current)s-ը %(total)s-ից)", + "upload_all_button": "Բեռնել բոլորը", + "upload_n_others_button": { + "one": "Բեռնել %(count)s այլ ֆայլ", + "other": "Բեռնել %(count)s այլ ֆայլեր" + } + }, + "user_info": { + "admin_tools_section": "Ադմինիստրատորի գործիքներ", + "ban_button_room": "Արգելափակել սենյակից", + "ban_button_space": "Արգելափակել տարածքից", + "ban_room_confirm_title": "Արգելափակել %(roomName)s֊ից", + "ban_space_everything": "Արգելափակել նրանց ամեն ինչից, ինչից կարող եմ", + "ban_space_specific": "Արգելափակել նրանց որոշակի բաներից, որոնք ես կարող եմ անել", + "deactivate_confirm_action": "Ապաակտիվացնել օգտատիրոջը", + "deactivate_confirm_description": "Այս օգտատիրոջ ապաակտիվացումը կհանգեցնի համակարգից նրա դուրս գալուն և թույլ չի տա նրան նորից մուտք գործել։ Բացի այդ, նա կլքի բոլոր սենյակները, որտեղ գտնվում է։ Այս գործողությունը չի կարող հետադարձվել։ Վստա՞հ եք, որ ցանկանում եք ապաակտիվացնել այս օգտատիրոջը։", + "deactivate_confirm_title": "Ապաակտիվացնե՞լ օգտատիրոջը", + "demote_button": "Նվազեցնել պաշտոնը", + "demote_self_confirm_description_space": "Դուք չեք կարողանա չեղարկել այս փոփոխությունը, քանի որ դուք իջեցնում եք ձեր կարգավիճակը։ Եթե դուք տարածքում վերջին արտոնյալ օգտատերն եք, ապա անհնար կլինի վերականգնել արտոնությունները։", + "demote_self_confirm_room": "Դուք չեք կարողանա չեղարկել այս փոփոխությունը, քանի որ դուք իջեցնում եք ձեր կարգավիճակը։ Եթե դուք սենյակի վերջին արտոնյալ օգտատերն եք, ապա անհնար կլինի վերականգնել արտոնությունները։", + "demote_self_confirm_title": "Ինքներդ ձեզ պաշտոնից ցածրացնե՞լ", + "disinvite_button_room": "Հրավերը հանել սենյակից", + "disinvite_button_room_name": "Հրավերը հանել %(roomName)s-ից", + "disinvite_button_space": "Հրավերը հանել տարածքից", + "error_ban_user": "Չհաջողվեց արգելափակել օգտատիրոջը", + "error_deactivate": "Չհաջողվեց ապաակտիվացնել օգտատիրոջը", + "error_kicking_user": "Չհաջողվեց հեռացնել օգտատիրոջը", + "error_mute_user": "Չհաջողվեց լռեցնել օգտատիրոջը", + "error_revoke_3pid_invite_description": "Հնարավոր չէ չեղարկել հրավերը: Հնարավոր է՝ սերվերը ժամանակավոր խնդիր ունի, կամ դուք բավարար թույլտվություններ չունեք հրավերը չեղարկելու համար:", + "error_revoke_3pid_invite_title": "Չհաջողվեց չեղարկել հրավերը", + "ignore_button": "Անտեսել", + "ignore_confirm_description": "Այս օգտատիրոջ բոլոր հաղորդագրությունները և հրավերները կթաքցվեն։ Վստա՞հ եք, որ ցանկանում եք անտեսել դրանք։", + "ignore_confirm_title": "Անտեսել %(user)s֊ին", + "invited_by": "Հրավիրված է %(sender)s֊ի կողմից", + "jump_to_rr_button": "Անցնել «բաղադրատոմսերի» ընթերցմանը", + "kick_button_room": "Հեռացնել սենյակից", + "kick_button_room_name": "Հեռացնել %(roomName)s-ից", + "kick_button_space": "Հեռացնել տարածքից", + "kick_button_space_everything": "Հեռացնել դրանք ամեն ինչից, ինչից կարող եմ", + "kick_space_specific": "Հեռացնել դրանք որոշակի բաներից, որոնք ես կարող եմ", + "kick_space_warning": "Նրանք դեռ կկարողանան մուտք գործել/դիմել այն ամենին, որի ադմինիստրատորը դուք չեք։", + "promote_warning": "Դուք չեք կարողանա հետարկել այս փոփոխությունը, քանի որ դուք օգտատիրոջը նույն հզորության մակարդակն եք առաջարկում, ինչ ձերը։", + "redact": { + "confirm_button": { + "one": "Հեռացնել 1 հաղորդագրություն", + "other": "Հեռացնել %(count)s հաղորդագրություններ" + }, + "confirm_description_1": { + "one": "Դուք պատրաստվում եք հեռացնել %(count)s հաղորդագրություն՝ ուղարկված %(user)s-ի կողմից։ Սա ընդմիշտ կհեռացնի դրանք զրույցի բոլոր մասնակիցների համար։ Ցանկանո՞ւմ եք շարունակել։", + "other": "Դուք պատրաստվում եք հեռացնել %(count)s հաղորդագրություն՝ ուղարկված %(user)s-ի կողմից։ Սա ընդմիշտ կհեռացնի դրանք զրույցի բոլոր մասնակիցների համար։ Ցանկանո՞ւմ եք շարունակել։" + }, + "confirm_description_2": "Մեծ քանակությամբ հաղորդագրությունների դեպքում սա կարող է որոշ ժամանակ պահանջել: Խնդրում ենք մինչ այդ չթարմացնել ձեր ծրագրի էջը:", + "confirm_keep_state_explainer": "Հանեք նշումը, եթե ցանկանում եք նաև հեռացնել այս օգտատիրոջ համակարգային հաղորդագրությունները (օրինակ՝ անդամակցության փոփոխություն, պրոֆիլի փոփոխություն…):", + "confirm_keep_state_label": "Պահպանել համակարգի հաղորդագրությունները", + "confirm_title": "Հեռացնել %(user)s֊ի կողմից վերջերս ուղարկված հաղորդագրությունները", + "no_recent_messages_description": "Փորձեք ոլորել ժամանակացույցը դեպի վեր՝ տեսնելու, թե արդյոք կան ավելի վաղ գրառումներ:", + "no_recent_messages_title": "%(user)s-ի կողմից վերջերս ուղարկված հաղորդագրություններ չեն գտնվել" + }, + "redact_button": "Ջնջել հաղորդագրությունները", + "revoke_invite": "Հրավերի չեղարկում", + "room_encrypted": "Այս սենյակում հաղորդագրությունները ծայրից ծայր գաղտնագրված են։", + "room_encrypted_detail": "Ձեր հաղորդագրությունները պաշտպանված են, և միայն դուք և ստացողը ունեք դրանք բացելու եզակի բանալիներ։", + "room_unencrypted": "Այս սենյակում հաղորդագրությունները ծայրից ծայր գաղտնագրված չեն։", + "room_unencrypted_detail": "Գաղտնագրված սենյակներում ձեր հաղորդագրությունները պաշտպանված են, և միայն դուք և ստացողն ունեք դրանք բացելու եզակի բանալիներ։", + "send_message": "Ուղարկել հաղորդագրություն", + "share_button": "Կիսվել պրոֆիլով", + "unban_button_room": "Ապաարգելափակել սենյակից", + "unban_button_space": "Ապաարգելափակել տարածքից", + "unban_room_confirm_title": "Ապարագելափակել %(roomName)s֊ից", + "unban_space_everything": "Ապաարգելափակել նրանց ամեն ինչից, ինչից կարող եմ", + "unban_space_specific": "Ապաարգելափակել նրանց որոշակի բաներից, որոնք ես կարող եմ անել", + "unban_space_warning": "Նրանք չեն կարողանա մուտք գործել/դիմել այն ամենին, որի ադմինիստրատորը դուք չեք։", + "unignore_button": "Դադարեցնել անտեսումը", + "verification_unavailable": "Օգտատիրոջ ստուգումը հասանելի չէ", + "verify_button": "Հաստատել օգտատիրոջը", + "verify_explainer": "Լրացուցիչ անվտանգության համար հաստատեք այս օգտատիրոջը՝ ստուգելով միանգամյա կոդը ձեր երկու սարքերի վրա։" + }, + "user_menu": { + "link_new_device": "Կապել նոր սարք", + "settings": "Բոլոր կարգավորումները", + "switch_theme_dark": "Անցնել մութ ռեժիմի", + "switch_theme_light": "Անցնել լուսավոր ռեժիմի" + }, + "voip": { + "already_in_call": "Արդեն զանգի մեջ է", + "already_in_call_person": "Դուք արդեն զանգի մեջ եք այս անձի հետ։", + "answered_elsewhere": "Պատասխանել է այլ տեղ", + "answered_elsewhere_description": "Զանգին պատասխանվել է մեկ այլ սարքից։", + "call_failed": "Զանգը ձախողվեց", + "call_failed_description": "Զանգը չհաջողվեց հաստատել", + "call_failed_media": "Զանգը ձախողվեց, քանի որ անհնար էր դիմել վեբտեսախցիկին կամ խոսափողին: Ստուգեք, որ.", + "call_failed_media_applications": "Ոչ մի այլ ծրագիր չի օգտագործում վեբ-տեսախցիկը", + "call_failed_media_connected": "Խոսափողը եւ վեբ-տեսախցիկը միացված են և ճիշտ կարգավորված", + "call_failed_media_permissions": "Վեբ-տեսախցիկի օգտագործման թույլտվությունը տրված է", + "call_failed_microphone": "Զանգը ձախողվեց, քանի որ անհնար էր դիմել խոսափողին: Ստուգեք, որ խոսափողը միացված է և ճիշտ կարգավորված:", + "call_held": "%(peerName)s-ը զանգը պահեց", + "call_held_resume": "Դուք զանգը պահեցիք Վերսկսել", + "call_held_switch": "Դուք զանգը պահեցիք Փոխել", + "call_toast_unknown_room": "Անհայտ սենյակ", + "camera_disabled": "Ձեր տեսախցիկն անջատված է", + "camera_enabled": "Ձեր տեսախցիկը դեռ միացված է", + "cannot_call_yourself_description": "Դուք չեք կարող զանգահարել ինքներդ ձեզ։", + "close_lobby": "Փակել նախասրահը", + "connecting": "Միանում է", + "connection_lost": "Սերվերի հետ կապը կորել է", + "connection_lost_description": "Դուք չեք կարող զանգեր կատարել առանց սերվերի հետ կապի։", + "consulting": "Խորհրդատվություն %(transferTarget)s-ի հետ։ Փոխանցում է %(transferee)s-ին ", + "default_device": "Լռելյայն սարք", + "dial": "Զանգահարել", + "dialpad": "Թվաշար", + "disable_camera": "Անջատել տեսախցիկը", + "disable_microphone": "Խլացնել խոսափողը", + "disabled_no_perms_start_video_call": "Դուք չունեք տեսազանգեր սկսելու թույլտվություն", + "disabled_no_perms_start_voice_call": "Դուք չունեք ձայնային զանգեր սկսելու թույլտվություն", + "disabled_ongoing_call": "Շարունակական զանգ", + "element_call": "Element զանգ", + "enable_camera": "Միացնել տեսախցիկը", + "enable_microphone": "Ապախլացնել խոսափողը", + "expand": "Վերադառնալ զանգին", + "get_call_link": "Կիսվել զանգի հղումով", + "hangup": "Կանգ առնել", + "hide_sidebar_button": "Թաքցնել կողային վահանակը", + "input_devices": "Մուտքագրման սարքեր", + "jitsi_call": "Jitsi կոնֆերանս(ժողով)", + "join_button_tooltip_call_full": "Ներեցեք, այս զանգը ներկայումս լրացված է", + "legacy_call": "Հնացած զանգ", + "maximise": "Լրացնել էկրանը", + "maximise_call": "Զանգը առավելագույնի հասցնել", + "metaspace_video_rooms": { + "conference_room_section": "Համաժողովներ" + }, + "minimise_call": "Զանգը նվազագույնի հասցնել", + "misconfigured_server": "Զանգը ձախողվեց սխալ կարգավորված սերվերի պատճառով", + "misconfigured_server_description": "Խնդրում ենք խնդրել ձեր սերվերի ադմինիստրատորին (%(homeserverDomain)s )՝ TURN սերվերը կարգավորելու համար, որպեսզի զանգերը հուսալիորեն աշխատեն։", + "misconfigured_server_fallback": "Այլապես, դուք կարող եք փորձել օգտագործել հանրային սերվեր՝ , սակայն սա այնքան էլ հուսալի չի լինի, և այն կկիսվի ձեր IP հասցեով այդ սերվերի հետ։ Դուք կարող եք նաև կառավարել սա Կարգավորումներում։", + "misconfigured_server_fallback_accept": "Փորձել օգտագործել %(server)s-ը", + "more_button": "Ավելին", + "msisdn_lookup_failed": "Հեռախոսահամարը հնարավոր չէ գտնել", + "msisdn_lookup_failed_description": "Հեռախոսահամարը որոնելիս սխալ առաջացավ", + "msisdn_transfer_failed": "Զանգը հնարավոր չէ փոխանցել", + "n_people_joined": { + "one": "%(count)s անձ միացել է", + "other": "%(count)s մարդիկ միացել են" + }, + "no_audio_input_description": "Ձեր սարքում խոսափող չգտանք: Խնդրում ենք ստուգել ձեր պարամետրերը և կրկին փորձեք:", + "no_audio_input_title": "Խոսափող չի գտնվել", + "no_media_perms_description": "Հնարավոր է՝ անհրաժեշտ լինի %(brand)s-ին ձեռքով թույլտվություն տալ ձեր խոսափողին/տեսախցիկին դիմելու համար", + "no_media_perms_title": "Մեդիա թույլտվություններ չկան", + "no_permission_conference": "Պահանջվում է թույլտվություն", + "no_permission_conference_description": "Դուք չունեք այս սենյակում կոնֆերանս զանգ սկսելու թույլտվություն", + "on_hold": "%(name)s-ը սպասման մեջ է", + "output_devices": "Ելքային սարքեր", + "screenshare_monitor": "Կիսվել ամբողջ էկրանով", + "screenshare_title": "Կիսվել բովանդակությամբ", + "screenshare_window": "Ծրագրի պատուհան", + "show_sidebar_button": "Ցուցադրել կողային վահանակը", + "silence": "Զանգի լռեցում", + "silenced": "Ծանուցումները լռեցված են", + "start_screenshare": "Սկսել կիսել ձեր էկրանը", + "stop_screenshare": "Ընդհատել էկրանի կիսումը", + "too_many_calls": "Չափազանց շատ զանգեր", + "too_many_calls_description": "Դուք հասել եք միաժամանակյա զանգերի առավելագույն քանակին։", + "transfer_consult_first_label": "Նախ խորհրդակցեք", + "transfer_failed": "Փոխանցումը ձախողվեց", + "transfer_failed_description": "Զանգը չհաջողվեց փոխանցել", + "unable_to_access_audio_input_description": "Մենք չկարողացանք դիմել ձեր խոսափողին: Ստուգեք ձեր զննարկիչի կարգավորումները և կրկին փորձեք:", + "unable_to_access_audio_input_title": "Անհնար է դիմել ձեր խոսափողին", + "unable_to_access_media": "Անհնար է դիմել վեբ-տեսախցիկին / խոսափողին", + "unable_to_access_microphone": "Անհնար է դիմել խոսափողին", + "unknown_caller": "Անհայտ զանգահարող", + "unknown_person": "անհայտ անձ", + "unsilence": "Ձայնը միացնել", + "unsupported": "Զանգերը չեն աջակցվում", + "unsupported_browser": "Դուք չեք կարող զանգեր կատարել այս զննարկիչում:", + "user_busy": "Օգտատերը զբաղված է", + "user_busy_description": "Ձեր զանգահարած օգտատերը զբաղված է։", + "user_is_presenting": "%(sharerName)s-ը ներկայացնում է", + "video_call": "Տեսազանգ", + "video_call_started": "Տեսազանգը սկսվեց", + "video_call_using": "Տեսազանգ՝ օգտագործելով՝", + "voice_call": "Ձայնային զանգ", + "you_are_presenting": "Դուք ներկայացնում եք" + }, + "web_default_device_name": "%(appName)s: %(browserName)s %(osName)s-ի վրա", + "welcome_to_element": "Բարի գալուստ Element", + "widget": { + "added_by": "Վիջեթը ավելացվել է", + "capabilities_dialog": { + "content_starting_text": "Այս վիջեթը կցանկանար՝", + "decline_all_permission": "Մերժել բոլորը", + "remember_Selection": "Հիշեք իմ ընտրությունը այս վիջեթի համար", + "title": "Հաստատել վիջեթի թույլտվությունները" + }, + "capability": { + "always_on_screen_generic": "Մնալ էկրանին աշխատելու ընթացքում", + "always_on_screen_viewing_another_room": "Մնալ էկրանին այլ սենյակ դիտելիս", + "any_room": "Վերը նշվածը, բայց ցանկացած սենյակում, որտեղ դուք միացած եք կամ հրավիրված եք, նույնպես", + "byline_empty_state_key": "վիճակի դատարկ բանալիով", + "byline_state_key": "%(stateKey)s վիճակի բանալիով", + "capability": "%(capability)s հնարավորություն", + "change_avatar_active_room": "Փոխել ձեր ակտիվ սենյակի ավատարը", + "change_avatar_this_room": "Փոխել այս սենյակի ավատարը", + "change_name_active_room": "Փոխել ձեր ակտիվ սենյակի անունը", + "change_name_this_room": "Փոխել այս սենյակի անունը", + "change_topic_active_room": "Փոխեք ձեր ակտիվ սենյակի թեման", + "change_topic_this_room": "Փոխեք այս սենյակի թեման", + "receive_membership_active_room": "Տեսնել, թե երբ են մարդիկ միանում, դուրս գալիս կամ հրավիրվում ձեր ակտիվ սենյակ", + "receive_membership_this_room": "Տեսնել, թե երբ են մարդիկ միանում, դուրս գալիս կամ հրավիրվում այս սենյակ", + "remove_ban_invite_leave_active_room": "Հեռացնել, արգելափակել կամ հրավիրել մարդկանց ձեր ակտիվ սենյակ, և ստիպել ձեզ հեռանալ", + "remove_ban_invite_leave_this_room": "Հեռացնել, արգելափակել կամ հրավիրել մարդկանց այս սենյակ, և ստիպել ձեզ դուրս գալ", + "see_avatar_change_active_room": "Տեսնել, թե երբ է ձեր ակտիվ սենյակում ավատարը փոխվում", + "see_avatar_change_this_room": "Տեսնել, թե երբ է այս սենյակում ավատարը փոխվում", + "see_event_type_sent_active_room": "Տեսնել %(eventType)s իրադարձությունները՝ տեղադրված ձեր ակտիվ սենյակում", + "see_event_type_sent_this_room": "Տեսնել %(eventType)s իրադարձությունները՝ տեղադրված այս սենյակում", + "see_images_sent_active_room": "Տեսնել ձեր ակտիվ սենյակում տեղադրված պատկերները", + "see_images_sent_this_room": "Տեսնել այս սենյակում տեղադրված պատկերները", + "see_messages_sent_active_room": "Դիտել ձեր ակտիվ սենյակում տեղադրված հաղորդագրությունները", + "see_messages_sent_this_room": "Տեսնել այս սենյակում ուղարկված հաղորդագրությունները", + "see_msgtype_sent_active_room": "Տեսնել %(msgtype)s հաղորդագրությունները՝ տեղադրված ձեր ակտիվ սենյակում", + "see_msgtype_sent_this_room": "Տեսնել %(msgtype)s հաղորդագրությունները՝ տեղադրված այս սենյակում", + "see_name_change_active_room": "Տեսնել, թե երբ է անունը փոխվում ձեր ակտիվ սենյակում", + "see_name_change_this_room": "Տեսնել, թե երբ է այս սենյակի անունը փոխվում", + "see_sent_emotes_active_room": "Տեսնել ձեր ակտիվ սենյակում տեղադրված էմոցիաները", + "see_sent_emotes_this_room": "Տեսնել այս սենյակում տեղադրված էմոցիաները", + "see_sent_files_active_room": "Տեսնել ձեր ակտիվ սենյակում տեղադրված ընդհանուր ֆայլերը", + "see_sent_files_this_room": "Տեսնել այս սենյակում տեղադրված ընդհանուր ֆայլերը", + "see_sticker_posted_active_room": "Տեսնել, երբ որևէ մեկը կպչուն պիտակ է տեղադրում ձեր ակտիվ սենյակում", + "see_sticker_posted_this_room": "Տեսնել, թե երբ է այս սենյակում կպչուն պիտակ փակցվում", + "see_text_messages_sent_active_room": "Դիտել ձեր ակտիվ սենյակում ուղարկված տեքստային հաղորդագրությունները", + "see_text_messages_sent_this_room": "Դիտել այս սենյակում ուղարկված տեքստային հաղորդագրությունները", + "see_topic_change_active_room": "Տեսնել, թե երբ է ձեր ակտիվ սենյակի թեման փոխվում", + "see_topic_change_this_room": "Տեսնել, թե երբ է այս սենյակում թեման փոխվում", + "see_videos_sent_active_room": "Տեսնել ձեր ակտիվ սենյակում տեղադրված տեսանյութերը", + "see_videos_sent_this_room": "Տեսնել այս սենյակում տեղադրված տեսանյութերը", + "send_emotes_active_room": "Ուղարկել էմոցիաներ ձեր անունից ձեր ակտիվ սենյակում", + "send_emotes_this_room": "Ուղարկել էմոցիաներ ձեր անունից այս սենյակում", + "send_event_type_active_room": "Ուղարկել %(eventType)s իրադարձություններ ձեր անունից ձեր ակտիվ սենյակում", + "send_event_type_this_room": "Ուղարկել %(eventType)s իրադարձություններ ձեր անունից այս սենյակում", + "send_files_active_room": "Ուղարկել ընդհանուր ֆայլեր ձեր անունից ձեր ակտիվ սենյակում", + "send_files_this_room": "Ուղարկել ընդհանուր ֆայլեր ձեր անունից այս սենյակում", + "send_images_active_room": "Ուղարկել պատկերներ ձեր անունից ձեր ակտիվ սենյակում", + "send_images_this_room": "Ուղարկել պատկերներ ձեր անունից այս սենյակում", + "send_messages_active_room": "Ուղարկել հաղորդագրություններ ձեր անունից ձեր ակտիվ սենյակում", + "send_messages_this_room": "Ուղարկել հաղորդագրություններ ձեր անունից այս սենյակում", + "send_msgtype_active_room": "Ուղարկել %(msgtype)s հաղորդագրություններ ձեր անունից ձեր ակտիվ սենյակում", + "send_msgtype_this_room": "Ուղարկել %(msgtype)s հաղորդագրություններ ձեր անունից այս սենյակում", + "send_stickers_active_room": "Ուղարկեք ստիկերներ ձեր ակտիվ սենյակ", + "send_stickers_active_room_as_you": "Ուղարկել ստիկերներ ձեր անունից ձեր ակտիվ սենյակում", + "send_stickers_this_room": "Ուղարկեք կպչուն պիտակներ այս սենյակ", + "send_stickers_this_room_as_you": "Ուղարկել ստիկերներ ձեր անունից այս սենյակում", + "send_text_messages_active_room": "Ուղարկել տեքստային հաղորդագրություններ ձեր անունից ձեր ակտիվ սենյակում", + "send_text_messages_this_room": "Ուղարկել տեքստային հաղորդագրություններ ձեր անունից այս սենյակում", + "send_videos_active_room": "Ուղարկել տեսանյութեր ձեր անունից ձեր ակտիվ սենյակում", + "send_videos_this_room": "Ուղարկել տեսանյութեր ձեր անունից այս սենյակում", + "specific_room": "Վերը նշվածը, բայց նաև -ում", + "switch_room": "Փոխեք այն սենյակը, որը դիտում եք", + "switch_room_message_user": "Փոխեք, թե որ սենյակը, հաղորդագրությունը կամ օգտատիրոջն եք դիտում" + }, + "close_to_view_right_panel": "Փակել այս վիջեթը՝ այն այս վահանակում դիտելու համար", + "context_menu": { + "delete": "Ջնջել վիջեթը", + "delete_warning": "Վիջեթը ջնջելիս այն կհեռացվի այս սենյակի բոլոր օգտատերերի համար։ Վստա՞հ եք, որ ուզում եք ջնջել այս վիջեթը։", + "move_left": "Տեղափոխել ձախ", + "move_right": "Տեղափոխել աջ", + "remove": "Հեռացնել բոլորի համար", + "revoke": "Չեղարկել թույլտվությունները", + "screenshot": "Նկարահանել", + "start_audio_stream": "Սկսել աուդիո հեռարձակում" + }, + "cookie_warning": "Այս վիջեթը կարող է օգտագործել cookie-ներ։", + "error_hangup_description": "Դուք անջատվել եք զանգից։ (Սխալ՝ %(message)s )", + "error_hangup_title": "Կապը կորավ", + "error_loading": "Վիջեթի բեռնման սխալ", + "error_mixed_content": "Սխալ. խառնված բովանդակություն", + "error_need_invite_permission": "Դուք պետք է կարողանաք հրավիրել օգտատերերին դա անելու համար։", + "error_need_kick_permission": "Դա անելու համար դուք պետք է կարողանաք հեռացնել օգտատերերին", + "error_need_to_be_logged_in": "Դուք պետք է մուտք գործեք։", + "error_unable_start_audio_stream_description": "Անհնար է սկսել աուդիո հոսքային հեռարձակումը։", + "error_unable_start_audio_stream_title": "Չհաջողվեց սկսել ուղիղ հեռարձակումը", + "modal_data_warning": "Ստորև բերված տվյալները կիսվում են %(widgetDomain)s-ի հետ", + "modal_title_default": "Մոդալային վիջեթ", + "no_name": "Անհայտ հավելված", + "open_id_permissions_dialog": { + "remember_selection": "Հիշել սա", + "starting_text": "Վիջեթը կհաստատի ձեր օգտատիրոջ ID-ն, բայց չի կարողանա կատարել գործողություններ ձեզ համար․", + "title": "Թույլատրել այս վիջեթին ստուգել ձեր ինքնությունը" + }, + "popout": "Բացվող պատուհանի վիջեթ", + "set_room_layout": "Սահմանել դասավորություն բոլորի համար", + "shared_data_avatar": "Ձեր պրոֆիլի նկարի URL-ը", + "shared_data_device_id": "Ձեր սարքի ID-ն", + "shared_data_lang": "Ձեր լեզուն", + "shared_data_mxid": "Ձեր օգտատիրոջ ID-ն", + "shared_data_name": "Ձեր ցուցադրվող անունը", + "shared_data_room_id": "Սենյակի ID", + "shared_data_theme": "Ձեր թեման", + "shared_data_url": "%(brand)s URL", + "shared_data_warning": "Այս վիջեթի օգտագործումը կարող է տվյալներ կիսել %(widgetDomain)s-ի հետ։", + "shared_data_warning_im": "Այս վիջեթի օգտագործումը կարող է տվյալներ կիսել %(widgetDomain)s-ի և ձեր ինտեգրման մենեջերի հետ։", + "shared_data_widget_id": "Վիջեթի ID", + "unencrypted_warning": "Վիջեթները չեն օգտագործում հաղորդագրությունների գաղտնագրում։", + "unmaximise": "Առավելագույնի չհասցնել", + "unpin_to_view_right_panel": "Հանել այս վիջեթը՝ այն այս վահանակում դիտելու համար" + }, + "zxcvbn": { + "suggestions": { + "allUppercase": "Բոլոր մեծատառերը գրեթե նույնքան հեշտ է կռահել, որքան բոլոր փոքրատառերը", + "anotherWord": "Ավելացրեք մեկ այլ բառ, կամ երկու: Ավելի լավ է օգտագործել հազվադեպ բառեր:", + "associatedYears": "Խուսափեք տարիներից, որոնք կապված են ձեզ հետ", + "capitalization": "Մեծատառերով գրելը շատ չի օգնում", + "dates": "Խուսափեք ամսաթվերից և տարիներից, որոնք կապված են ձեզ հետ", + "l33t": "Կանխատեսելի փոխարինումները, ինչպիսիք են “@” -ը “a” -ի փոխարեն, շատ չեն օգնում", + "longerKeyboardPattern": "Օգտագործեք ավելի խճճված երկար ստեղների կաղապար", + "noNeed": "Նշանների, թվանշանների կամ մեծատառերի կարիք չկա", + "pwned": "Եթե դուք օգտագործում եք այս գաղտնաբառը այլ վայրում, ապա պետք է փոխեք այն:", + "recentYears": "Խուսափեք վերջին տարիներից", + "repeated": "Խուսափեք կրկնվող բառերից և նիշերից", + "reverseWords": "Հակադարձ բառերը շատ դժվար չէ կռահել", + "sequences": "Խուսափեք հաջորդականություններից", + "useWords": "Օգտագործեք մի քանի բառ, խուսափեք ընդհանուր արտահայտություններից" + }, + "warnings": { + "common": "Սա շատ տարածված գաղտնաբառ է", + "commonNames": "Ընդհանուր անուններն ու ազգանունները հեշտ է կռահել", + "dates": "Ամսաթվերը հաճախ հեշտ կռահելի են:", + "extendedRepeat": "“abcabcabc”-ի նման կրկնությունները միայն մի փոքր են դժվար կռահելի, քան “abc”-ն", + "keyPattern": "Կարճ ստեղնային օրինաչափությունները հեշտ կռահելի են:", + "namesByThemselves": "Անուններն ու ազգանուններն ինքնին հեշտ է կռահել", + "pwned": "Ձեր գաղտնաբառը բացահայտվել է ինտերնետում տվյալների խախտման պատճառով:", + "recentYears": "Վերջին տարիները հեշտ կռահելի են:", + "sequences": "ABC-ի կամ 6543-ի նման հաջորդականությունները հեշտ կռահելի են", + "similarToCommon": "Սա նման է սովորաբար օգտագործվող գաղտնաբառերին", + "simpleRepeat": "“Աաա” -ի նման կրկնությունները հեշտ կռահելի են", + "straightRow": "Ստեղների շարունակական շարքը հեշտ կռահելի է:", + "topHundred": "Սա top-100 ամենատարածված գաղտնաբառերն են", + "topTen": "Սա top-10 ամենատարածված գաղտնաբառերն են", + "userInputs": "Չպետք է լինեն անձնական կամ էջի հետ կապված տվյալներ:", + "wordByItself": "Բառն ինքնին հեշտ է կռահել" + } + } +} diff --git a/src/i18n/strings/id.json b/src/i18n/strings/id.json index f5f2637986..d8f0ac227b 100644 --- a/src/i18n/strings/id.json +++ b/src/i18n/strings/id.json @@ -596,7 +596,6 @@ "user": "Pengguna", "user_avatar": "Gambar profil", "username": "Nama Pengguna", - "verification_cancelled": "Verifikasi dibatalkan", "verified": "Terverifikasi", "version": "Versi", "video": "Video", @@ -917,6 +916,7 @@ }, "privacy_warning": "Pastikan tidak ada yang bisa melihat layar ini!", "restoring": "Memulihkan kunci-kunci dari cadangan", + "security_key_label": "Kunci pemulihan", "security_key_title": "Konfirmasi kunci pemulihan Anda" }, "bootstrap_title": "Menyiapkan kunci", @@ -963,7 +963,6 @@ "title": "Metode Pemulihan Dihapus", "warning": "Jika Anda tidak menghapus metode pemulihan, sebuah penyerang mungkin mencoba mengakses akun Anda. Ubah kata sandi akun Anda dan segera tetapkan metode pemulihan baru di Pengaturan." }, - "reset_all_button": "Lupa atau kehilangan semua metode pemulihan? Atur ulang semuanya", "set_up_recovery": "Siapkan pemulihan", "set_up_recovery_toast_description": "Buat kunci pemulihan yang dapat digunakan untuk memulihkan riwayat pesan terenkripsi jika Anda kehilangan akses ke perangkat Anda.", "set_up_toast_title": "Siapkan Cadangan Aman", @@ -986,12 +985,8 @@ "after_new_login": { "device_verified": "Perangkat telah diverifikasi", "skip_verification": "Lewatkan verifikasi untuk sementara", - "unable_to_verify": "Tidak dapat memverifikasi perangkat ini", "verify_this_device": "Verifikasi perangkat ini" }, - "cancelled": "Anda membatalkan verifikasi.", - "cancelled_self": "Anda membatalkan verifikasi di perangkat Anda yang lain.", - "cancelled_user": "%(displayName)s membatalkan verifikasi.", "cancelling": "Membatalkan…", "complete_action": "Mengerti", "complete_description": "Anda berhasil memverifikasi pengguna ini.", @@ -1021,46 +1016,33 @@ "text": "Berikan ID dan sidik jari salah satu perangkat Anda untuk memverifikasinya. PERHATIKAN bahwa ini memungkinkan perangkat lain untuk mengirim dan menerima pesan seperti Anda. JIKA SESEORANG MEMINTA ANDA UNTUK MENEMPELKAN SESUATU DI SINI, KEMUNGKINAN ANDA SEDANG DITIPU!", "wrong_fingerprint": "Tidak dapat memverifikasi perangkat '%(deviceId)s' - sidik jari yang disediakan '%(fingerprint)s' tidak cocok dengan sidik jari perangkat, '%(fprint)s'" }, - "no_key_or_device": "Sepertinya Anda tidak memiliki Kunci Pemulihan atau perangkat lain yang dapat Anda verifikasi. Perangkat ini tidak akan dapat mengakses pesan terenkripsi lama. Untuk memverifikasi identitas Anda di perangkat ini, Anda harus mengatur ulang kunci verifikasi Anda.", "no_support_qr_emoji": "Perangkat yang Anda sedang verifikasi tidak mendukung pemindaian kode QR atau verifikasi emoji, yang didukung oleh %(brand)s. Coba menggunakan klien yang lain.", "other_party_cancelled": "Pengguna yang lain membatalkan proses verifikasi ini.", "prompt_encrypted": "Verifikasi semua pengguna di sebuah ruangan untuk memastikan keamanannya.", - "prompt_self": "Mulai memverifikasi lagi dari notifikasinya.", "prompt_unencrypted": "Di ruangan terenkripsi, verifikasi semua pengguna untuk memastikan keamanannya.", - "prompt_user": "Mulai memverifikasi lagi dari profilnya.", "qr_or_sas": "%(qrCode)s atau %(emojiCompare)s", - "qr_or_sas_header": "Verifikasi perangkat ini dengan menyelesaikan salah satu di bawah:", "qr_prompt": "Pindai kode unik ini", - "qr_reciprocate_same_shield_device": "Hampir selesai! Apakah perangkat lain Anda menampilkan perisai yang sama?", "qr_reciprocate_same_shield_user": "Hampir selesai! Apakah %(displayName)s menampilkan perisai yang sama?", - "request_toast_accept": "Verifikasi Sesi", "request_toast_accept_user": "Verifikasi Pengguna", "request_toast_decline_counter": "Abaikan (%(counter)s)", "request_toast_detail": "%(deviceId)s dari %(ip)s", - "reset_proceed_prompt": "Lanjutkan dengan mengatur ulang", "sas_caption_self": "Verifikasi perangkat ini dengan mengkonfirmasi nomor berikut ini yang ditampilkan di layarnya.", "sas_caption_user": "Verifikasi pengguna ini dengan mengkonfirmasi nomor berikut yang ditampilkan.", "sas_description": "Bandingkan emoji jika Anda tidak memiliki sebuah kamera di kedua perangkat", - "sas_emoji_caption_self": "Konfirmasi emoji di bawah yang ditampilkan di kedua perangkat, dalam urutan yang sama:", "sas_emoji_caption_user": "Verifikasi pengguna ini dengan mengkonfirmasi emoji berikut yang ditampilkan.", "sas_match": "Mereka cocok", "sas_no_match": "Mereka tidak cocok", "sas_prompt": "Bandingkan emoji unik", "scan_qr": "Verifikasi dengan memindai", "scan_qr_explainer": "Tanyakan %(displayName)s untuk memindai kode Anda:", - "self_verification_hint": "Untuk melanjutkan, mohon terima permintaan verifikasi di perangkat Anda yang lain.", "start_button": "Mulai Verifikasi", - "successful_device": "Anda berhasil memverifikasi %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "Anda berhasil memverifikasi perangkat Anda!", "successful_user": "Anda berhasil memverifikasi %(displayName)s!", - "timed_out": "Waktu habis untuk memverifikasi.", "unsupported_method": "Tidak dapat menemukan metode verifikasi yang didukung.", "unverified_session_toast_accept": "Ya, itu saya", "unverified_session_toast_title": "Login baru. Apakah itu Anda?", "unverified_sessions_toast_description": "Periksa untuk memastikan akun Anda aman", "unverified_sessions_toast_reject": "Nanti", "unverified_sessions_toast_title": "Anda memiliki sesi yang belum diverifikasi", - "verification_description": "Verifikasi identitas Anda untuk mengakses pesan terenkripsi dan membuktikan identitas Anda kepada orang lain. Jika Anda juga menggunakan ponsel, harap buka aplikasi di sana sebelum melanjutkan.", "verification_dialog_title_device": "Verifikasi perangkat lain", "verification_dialog_title_user": "Permintaan Verifikasi", "verification_skip_warning": "Tanpa memverifikasi, Anda tidak akan memiliki akses ke semua pesan Anda dan tampak tidak dipercayai kepada lainnya.", @@ -1070,9 +1052,6 @@ "verify_emoji_prompt": "Verifikasi dengan membandingkan emoji unik.", "verify_emoji_prompt_qr": "Jika Anda tidak dapat memindai kode di atas, verifikasi dengan membandingkan emoji yang unik.", "verify_later": "Saya verifikasi nanti", - "verify_using_device": "Verifikasi dengan perangkat lain", - "verify_using_key": "Verifikasi dengan Kunci Keamanan", - "verify_using_key_or_phrase": "Verifikasi dengan Kunci atau Frasa Keamanan", "waiting_for_user_accept": "Menunggu untuk %(displayName)s untuk menerima…", "waiting_other_device": "Menunggu Anda untuk verifikasi di perangkat Anda yang lain…", "waiting_other_device_details": "Menunggu Anda untuk memverifikasi perangkat Anda yang lain, %(deviceName)s (%(deviceId)s)…", @@ -1362,6 +1341,10 @@ "name_email_mxid_share_space": "Undang seseorang menggunakan namanya, alamat email, nama pengguna (seperti ) atau bagikan space ini.", "name_mxid_share_room": "Undang seseorang menggunakan namanya, nama pengguna (seperti ) atau bagikan ruangan ini.", "name_mxid_share_space": "Undang seseorang menggunakan namanya, nama pengguna (seperti ) atau bagikan space ini.", + "progress": { + "dont_close": "Jangan tutup aplikasi sampai selesai.", + "preparing": "Menyiapkan undangan..." + }, "recents_section": "Obrolan Terkini", "room_failed_partial": "Kami telah mengirim yang lainnya, tetapi orang berikut ini tidak dapat diundang ke ", "room_failed_partial_title": "Beberapa undangan tidak dapat dikirim", @@ -1758,6 +1741,7 @@ }, "power_level": { "admin": "Admin", + "creator": "Pemilik", "custom": "Kustom (%(level)s)", "custom_level": "Tingkat kustom", "default": "Bawaan", @@ -1864,11 +1848,6 @@ "other": "Anda hanya dapat memasang pin sampai %(count)s widget" }, "menu": "Buka menu", - "release_announcement": { - "close": "Oke", - "description": "Temukan semua pesan yang disematkan di sini. Arahkan pesan apa pun dan pilih “Sematkan” untuk menambahkannya.", - "title": "Semua pesan baru yang disematkan" - }, "reply_thread": "Balas ke pesan dalam utas", "unpin_all": { "button": "Lepas sematan semua pesan", @@ -1909,6 +1888,7 @@ "thread_list": { "context_menu_label": "Opsi utasan" }, + "title": "Panel kanan", "video_room_chat": { "title": "Obrolan" } @@ -1998,8 +1978,6 @@ "send_message_start_dm": "Kirim pesan pertama Anda untuk mengundang ke obrolan", "start_of_dm_history": "Ini adalah awal dari pesan langsung Anda dengan .", "start_of_room": "Ini adalah awal dari .", - "topic": "Topik: %(topic)s ", - "topic_edit": "Topik %(topic)s (edit)", "unencrypted_warning": "Enkripsi ujung ke ujung tidak diaktifkan", "user_created": "%(displayName)s membuat ruangan ini.", "you_created": "Anda membuat ruangan ini." @@ -2055,7 +2033,6 @@ "button_close_list": "Tutup daftar", "button_view_all": "Lihat semua", "description": "Ruangan ini memiliki pesan yang disematkan. Klik untuk melihatnya.", - "go_to_message": "Lihat pesan yang disematkan di lini masa.", "title": "%(index)s dari %(length)s Pesan yang disematkan" }, "read_topic": "Klik untuk membaca topik", @@ -3389,6 +3366,7 @@ "unable_to_find": "Mencoba memuat titik spesifik di lini masa ruangan ini, tetapi tidak dapat menemukannya." }, "m.audio": { + "audio_player": "Pemutar audio", "error_downloading_audio": "Terjadi kesalahan mengunduh audio", "error_processing_audio": "Terjadi kesalahan mengolah pesan suara", "error_processing_voice_message": "Terjadi kesalahan mengolah pesan suara", diff --git a/src/i18n/strings/is.json b/src/i18n/strings/is.json index 689a5a4683..dfd36768c9 100644 --- a/src/i18n/strings/is.json +++ b/src/i18n/strings/is.json @@ -467,7 +467,6 @@ "unverified": "Óstaðfest", "user_avatar": "Notandamynd", "username": "Notandanafn", - "verification_cancelled": "Hætt við sannprófun", "verified": "Staðfest", "version": "Útgáfa", "video": "Myndskeið", @@ -701,7 +700,6 @@ "recovery_method_removed": { "title": "Endurheimtuaðferð fjarlægð" }, - "reset_all_button": "Gleymdirðu eða týndir öllum aðferðum til endurheimtu? Endurstilla allt", "set_up_toast_title": "Setja upp varið öryggisafrit", "setup_secure_backup": { "explainer": "Taktu öryggisafrit af dulritunarlyklunum áður en þú skráir þig út svo þeir tapist ekki." @@ -719,12 +717,8 @@ "after_new_login": { "device_verified": "Tæki er sannreynt", "skip_verification": "Sleppa sannvottun í bili", - "unable_to_verify": "Tókst ekki að sannreyna þetta tæki", "verify_this_device": "Sannreyna þetta tæki" }, - "cancelled": "Þú hættir við sannvottun.", - "cancelled_self": "Þú hættir við sannvottun á hinu tækinu þínu.", - "cancelled_user": "%(displayName)s hætti við sannvottun.", "cancelling": "Hætti við…", "complete_action": "Náði því", "complete_description": "Þér hefur tekist að sannreyna þennan notanda.", @@ -734,20 +728,14 @@ "incoming_sas_dialog_title": "Innkomin beiðni um sannvottun", "other_party_cancelled": "Hinn aðilinn hætti við sannvottunina.", "prompt_encrypted": "Sannreyndu alla notendur á spjallrás til að tryggja að hún sé örugg.", - "prompt_self": "Hefja sannvottun aftur úr tilkynningunni.", "prompt_unencrypted": "Í dulrituðum spjallrásum skaltu sannreyna alla notendur til að tryggja að hún sé örugg.", - "prompt_user": "Hefja sannvottun aftur úr notandasniði viðkomandi.", "qr_or_sas": "%(qrCode)s eða %(emojiCompare)s", - "qr_or_sas_header": "Sannreyndu þetta tæki með því að ljúka einu af eftirtöldu:", "qr_prompt": "Skanna þennan einstaka kóða", - "qr_reciprocate_same_shield_device": "Næstum því búið! Sýnir hitt tækið þitt sama skjöldinn?", "qr_reciprocate_same_shield_user": "Næstum því búið! Sýnir %(displayName)s sama skjöldinn?", "request_toast_detail": "%(deviceId)s frá %(ip)s", - "reset_proceed_prompt": "Halda áfram með endurstillingu", "sas_caption_self": "Sannreyndu þetta tæki með því að staðfesta eftirfarandi númer sem birtist á skjá þess.", "sas_caption_user": "Sannreyndu þennan notanda með því að staðfesta eftirfarandi númer sem birtist á skjánum hans.", "sas_description": "Berðu saman einstakar táknmyndir ef ekki er myndavél á tækjunum", - "sas_emoji_caption_self": "Staðfestu að táknmyndirnar hér fyrir neðan séu birtar á báðum tækjunum og í sömu röð:", "sas_emoji_caption_user": "Sannreyndu þennan notanda með því að staðfesta eftirfarandi táknmynd sem birtist á skjánum hans.", "sas_match": "Þau samsvara", "sas_no_match": "Þau samsvara ekki", @@ -755,10 +743,7 @@ "scan_qr": "Sannprófa með skönnun", "scan_qr_explainer": "Biddu %(displayName)s um að skanna kóðann þinn:", "start_button": "Hefja sannvottun", - "successful_device": "Þér hefur tekist að sannreyna %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "Þér hefur tekist að sannreyna tækið þitt!", "successful_user": "Þér hefur tekist að sannreyna %(displayName)s!", - "timed_out": "Sannvottun rann út á tíma.", "unsupported_method": "Fann ekki neina studda sannvottunaraðferð.", "unverified_session_toast_title": "Ný innskráning. Varst þetta þú?", "unverified_sessions_toast_description": "Yfirfarðu þetta til að tryggja að aðgangurinn þinn sé öruggur", @@ -770,9 +755,6 @@ "verify_emoji_prompt": "Sannprófaðu með því að bera saman einstakar táknmyndir.", "verify_emoji_prompt_qr": "Ef þú getur ekki skannað kóðann hér fyrir ofan, skaltu sannprófa með því að bera saman einstakar táknmyndir.", "verify_later": "Ég mun sannreyna síðar", - "verify_using_device": "Sannreyna með öðru tæki", - "verify_using_key": "Sannreyna með öryggislykli", - "verify_using_key_or_phrase": "Sannreyna með öryggisfrasa", "waiting_for_user_accept": "Bíð eftir að %(displayName)s samþykki…", "waiting_other_device": "Bíð eftir að þú staðfestir á hinu tækinu…", "waiting_other_device_details": "Bíð eftir að þú staðfestir á hinu tækinu, %(deviceName)s (%(deviceId)s)…", @@ -1442,8 +1424,6 @@ "send_message_start_dm": "Sendu fyrstu skilaboðin þín til að bjóða að spjalla", "start_of_dm_history": "Þetta er upphaf ferils beinna skilaboða með .", "start_of_room": "Þetta er upphafið á .", - "topic": "Umfjöllunarefni: %(topic)s ", - "topic_edit": "Umfjöllunarefni: %(topic)s (edit)", "unencrypted_warning": "Enda-í-enda dulritun er ekki virkjuð", "user_created": "%(displayName)s bjó til þessa spjallrás.", "you_created": "Þú bjóst til þessa spjallrás." diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 5871ff9eb3..cb879b33c6 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -531,7 +531,6 @@ "user": "Utente", "user_avatar": "Immagine del profilo", "username": "Nome utente", - "verification_cancelled": "Verifica annullata", "verified": "Verificato", "version": "Versione", "video": "Video", @@ -836,7 +835,6 @@ "title": "Metodo di ripristino rimosso", "warning": "Se non hai rimosso il metodo di ripristino, è possibile che un aggressore stia cercando di accedere al tuo account. Cambia la password del tuo account e imposta immediatamente un nuovo metodo di recupero nelle impostazioni." }, - "reset_all_button": "Hai dimenticato o perso tutti i metodi di recupero? Reimposta tutto", "set_up_toast_title": "Imposta il Backup Sicuro", "setup_secure_backup": { "explainer": "Fai una copia delle tue chiavi prima di disconnetterti per evitare di perderle." @@ -855,12 +853,8 @@ "after_new_login": { "device_verified": "Dispositivo verificato", "skip_verification": "Salta la verifica per adesso", - "unable_to_verify": "Impossibile verificare questo dispositivo", "verify_this_device": "Verifica questo dispositivo" }, - "cancelled": "Hai annullato la verifica.", - "cancelled_self": "Hai annullato la verifica nell'altro dispositivo.", - "cancelled_user": "%(displayName)s ha annullato la verifica.", "cancelling": "Annullamento…", "complete_action": "Capito", "complete_description": "Hai verificato correttamente l'utente.", @@ -875,45 +869,32 @@ "incoming_sas_dialog_waiting": "In attesa che il partner confermi…", "incoming_sas_user_dialog_text_1": "Verifica questo utente per contrassegnarlo come affidabile. La fiducia degli utenti offre una maggiore tranquillità quando si utilizzano messaggi cifrati end-to-end.", "incoming_sas_user_dialog_text_2": "La verifica di questo utente contrassegnerà come fidata la sua sessione a te e viceversa.", - "no_key_or_device": "Pare che tu non abbia una chiave di sicurezza o altri dispositivi con cui poterti verificare. Questo dispositivo non potrà accedere ai vecchi messaggi cifrati. Per potere verificare la tua ideintità su questo dispositivo, dovrai reimpostare le chiavi di verifica.", "no_support_qr_emoji": "Il dispositivo che stai cercando di verificare non supporta la scansione di un codice QR o la verifica emoji, che sono supportate da %(brand)s. Prova con un client diverso.", "other_party_cancelled": "L'altra parte ha annullato la verifica.", "prompt_encrypted": "Verifica tutti gli utenti in una stanza per confermare che sia sicura.", - "prompt_self": "Inizia di nuovo la verifica dalla notifica.", "prompt_unencrypted": "Nelle stanze cifrate, verifica tutti gli utenti per confermare che siano sicure.", - "prompt_user": "Inizia di nuovo la verifica dal suo profilo.", "qr_or_sas": "%(qrCode)s o %(emojiCompare)s", - "qr_or_sas_header": "Verifica questo dispositivo completando una delle seguenti cose:", "qr_prompt": "Scansiona questo codice univoco", - "qr_reciprocate_same_shield_device": "Quasi fatto! L'altro dispositivo sta mostrando lo stesso scudo?", "qr_reciprocate_same_shield_user": "Quasi fatto! %(displayName)s sta mostrando lo stesso scudo?", - "request_toast_accept": "Verifica sessione", "request_toast_decline_counter": "Ignora (%(counter)s)", "request_toast_detail": "%(deviceId)s da %(ip)s", - "reset_proceed_prompt": "Procedi con la reimpostazione", "sas_caption_self": "Verifica questo dispositivo confermando che il seguente numero appare sul suo schermo.", "sas_caption_user": "Verifica questo utente confermando che il seguente numero appare sul suo schermo.", "sas_description": "Confrontate un set di emoji univoci se non avete una fotocamera sui dispositivi", - "sas_emoji_caption_self": "Conferma che gli emoji sottostanti sono mostrati in entrambi i dispositivi, nello stesso ordine:", "sas_emoji_caption_user": "Verifica questo utente confermando che la seguente emoji appare sul suo schermo.", "sas_match": "Corrispondono", "sas_no_match": "Non corrispondono", "sas_prompt": "Confronta emoji univoci", "scan_qr": "Verifica con la scansione", "scan_qr_explainer": "Chiedi a %(displayName)s di scansionare il tuo codice:", - "self_verification_hint": "Per continuare, accetta la richiesta di verifica nell'altro tuo dispositivo.", "start_button": "Inizia la verifica", - "successful_device": "Hai verificato %(deviceName)s (%(deviceId)s) correttamente!", - "successful_own_device": "Hai verificato correttamente il tuo dispositivo!", "successful_user": "Hai verificato correttamente %(displayName)s!", - "timed_out": "Verifica scaduta.", "unsupported_method": "Impossibile trovare un metodo di verifica supportato.", "unverified_session_toast_accept": "Sì, ero io", "unverified_session_toast_title": "Nuovo accesso. Eri tu?", "unverified_sessions_toast_description": "Controlla per assicurarti che l'account sia sicuro", "unverified_sessions_toast_reject": "Più tardi", "unverified_sessions_toast_title": "Hai sessioni non verificate", - "verification_description": "Verifica la tua identità per accedere ai messaggi cifrati e provare agli altri che sei tu.", "verification_dialog_title_device": "Verifica altro dispositivo", "verification_dialog_title_user": "Richiesta verifica", "verification_skip_warning": "Senza la verifica, non avrai accesso a tutti i tuoi messaggi e potresti apparire agli altri come non fidato.", @@ -923,9 +904,6 @@ "verify_emoji_prompt": "Verifica confrontando emoji specifici.", "verify_emoji_prompt_qr": "Se non riesci a scansionare il codice sopra, verifica confrontando emoji specifiche.", "verify_later": "Verificherò dopo", - "verify_using_device": "Verifica con un altro dispositivo", - "verify_using_key": "Verifica con chiave di sicurezza", - "verify_using_key_or_phrase": "Verifica con chiave di sicurezza o frase", "waiting_for_user_accept": "In attesa che %(displayName)s accetti…", "waiting_other_device": "In attesa della verifica nel tuo altro dispositivo…", "waiting_other_device_details": "In attesa della verifica nel tuo altro dispositivo, %(deviceName)s (%(deviceId)s)…", @@ -1775,8 +1753,6 @@ "send_message_start_dm": "Invia il primo messaggio per invitare a parlare", "start_of_dm_history": "Questo è l'inizio della tua cronologia di messaggi diretti con .", "start_of_room": "Questo è l'inizio di .", - "topic": "Argomento: %(topic)s ", - "topic_edit": "Argomento: %(topic)s (modifica)", "unencrypted_warning": "La crittografia end-to-end non è attiva", "user_created": "%(displayName)s ha creato questa stanza.", "you_created": "Hai creato questa stanza." diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index a6d1db2e65..fa5150619b 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -509,7 +509,6 @@ "unverified": "未認証", "user_avatar": "プロフィール画像", "username": "ユーザー名", - "verification_cancelled": "認証のキャンセル", "verified": "認証済", "version": "バージョン", "video": "動画", @@ -792,7 +791,6 @@ "title": "復元方法を削除しました", "warning": "復元方法を削除しなかった場合、攻撃者があなたのアカウントにアクセスしようとしている可能性があります。設定画面でアカウントのパスワードを至急変更し、新しい復元方法を設定してください。" }, - "reset_all_button": "復元方法を全て失ってしまいましたか?リセットできます", "set_up_toast_title": "セキュアバックアップを設定", "setup_secure_backup": { "explainer": "鍵を失くさないよう、サインアウトする前にバックアップしてください。" @@ -811,12 +809,8 @@ "after_new_login": { "device_verified": "端末が認証されました", "skip_verification": "認証をスキップ", - "unable_to_verify": "この端末を認証できません", "verify_this_device": "この端末を認証" }, - "cancelled": "認証をキャンセルしました。", - "cancelled_self": "他の端末で認証がキャンセルされました。", - "cancelled_user": "%(displayName)sが認証をキャンセルしました。", "cancelling": "キャンセルしています…", "complete_action": "了解", "complete_description": "このユーザーを認証しました。", @@ -831,42 +825,30 @@ "incoming_sas_dialog_waiting": "相手の承認を待機しています…", "incoming_sas_user_dialog_text_1": "このユーザーを認証すると、信頼済として表示します。ユーザーを信頼すると、より一層安心してエンドツーエンド暗号化を使用することができます。", "incoming_sas_user_dialog_text_2": "このユーザーを認証すると、相手のセッションと自分のセッションを信頼済として表示します。", - "no_key_or_device": "セキュリティーキーもしくは認証可能な端末が設定されていません。この端末では、以前暗号化されたメッセージにアクセスすることができません。この端末で本人確認を行うには、認証用の鍵を再設定する必要があります。", "no_support_qr_emoji": "認証しようとしている端末は、QRコードのスキャンや絵文字による認証をサポートしていませんが、%(brand)sではサポートされています。異なるクライアントで試してください。", "other_party_cancelled": "相手が認証をキャンセルしました。", "prompt_encrypted": "ルームの全てのユーザーを認証すると、ルームが安全であることを確認できます。", - "prompt_self": "通知から再度認証を開始してください。", "prompt_unencrypted": "暗号化されたルームでは、安全確認のために全てのユーザーを認証しましょう。", - "prompt_user": "プロフィールから再度認証を開始してください。", "qr_or_sas": "%(qrCode)sまたは%(emojiCompare)s", - "qr_or_sas_header": "以下のいずれかでこの端末を認証してください:", "qr_prompt": "ユニークなコードをスキャン", - "qr_reciprocate_same_shield_device": "あと少しです! あなたの他の端末は同じ盾マークを表示していますか?", "qr_reciprocate_same_shield_user": "あと少しです!%(displayName)sは同じ盾マークを表示していますか?", "request_toast_detail": "%(ip)sの%(deviceId)s", - "reset_proceed_prompt": "リセットする", "sas_caption_self": "この端末を認証するには、画面に以下の数字が表示されていることを確認してください。", "sas_caption_user": "このユーザーを認証するには、相手の画面に以下の数字が表示されていることを確認してください。", "sas_description": "両方の端末でQRコードをキャプチャできない場合、絵文字の比較を選んでください", - "sas_emoji_caption_self": "以下の絵文字が、両方の端末で、同じ順番で表示されているかどうか確認してください:", "sas_emoji_caption_user": "このユーザーを認証するには、相手の画面に以下の絵文字が表示されていることを確認してください。", "sas_match": "一致しています", "sas_no_match": "一致していません", "sas_prompt": "絵文字の並びを比較", "scan_qr": "QRコードスキャンで認証", "scan_qr_explainer": "%(displayName)sにQRコードをスキャンするよう問い合わせてください:", - "self_verification_hint": "続行するには、他の端末で認証リクエストを承認してください。", "start_button": "認証を開始", - "successful_device": "%(deviceName)s(%(deviceId)s)は正常に認証されました!", - "successful_own_device": "この端末は正常に認証されました!", "successful_user": "%(displayName)sは正常に認証されました!", - "timed_out": "認証がタイムアウトしました。", "unsupported_method": "サポートしている認証方法が見つかりません。", "unverified_session_toast_title": "新しいログインです。ログインしましたか?", "unverified_sessions_toast_description": "アカウントが安全かどうか確認してください", "unverified_sessions_toast_reject": "後で", "unverified_sessions_toast_title": "未認証のセッションがあります", - "verification_description": "暗号化されたメッセージにアクセスするには、本人確認が必要です。", "verification_dialog_title_device": "他の端末を認証", "verification_dialog_title_user": "認証の要求", "verification_skip_warning": "認証を行わないと、あなたの全てのメッセージにアクセスできず、他のユーザーに信頼済として表示されない可能性があります。", @@ -876,9 +858,6 @@ "verify_emoji_prompt": "絵文字の並びを比較して認証。", "verify_emoji_prompt_qr": "上記のコードをスキャンできない場合は、絵文字による確認を行ってください。", "verify_later": "後で認証", - "verify_using_device": "別の端末で認証", - "verify_using_key": "セキュリティーキーで認証", - "verify_using_key_or_phrase": "セキュリティーキーあるいはセキュリティーフレーズで認証", "waiting_for_user_accept": "%(displayName)sによる承認を待機しています…", "waiting_other_device": "他の端末での認証を待機しています…", "waiting_other_device_details": "端末 %(deviceName)s(%(deviceId)s)での認証を待機しています…", @@ -1618,8 +1597,6 @@ "send_message_start_dm": "最初のメッセージを送信すると、を会話に招待", "start_of_dm_history": "ここがあなたとのダイレクトメッセージの履歴の先頭です。", "start_of_room": "ここがの先頭です。", - "topic": "トピック:%(topic)s ", - "topic_edit": "トピック:%(topic)s(編集)", "unencrypted_warning": "エンドツーエンド暗号化が有効になっていません", "user_created": "%(displayName)sがこのルームを作成しました。", "you_created": "このルームを作成しました。" diff --git a/src/i18n/strings/ka.json b/src/i18n/strings/ka.json index 0ccceb9b2f..9d8eec81d4 100644 --- a/src/i18n/strings/ka.json +++ b/src/i18n/strings/ka.json @@ -492,7 +492,6 @@ "user": "მომხმარებელი:", "user_avatar": "პროფილის სურათი", "username": "მომხმარებლის სახელი", - "verification_cancelled": "დადასტურება გაუქმდა", "verified": "დამოწმებულია", "version": "ვერსია", "video": "ვიდეო", @@ -700,7 +699,6 @@ "title": "აღდგენის მეთოდი ამოღებულია", "warning": "თუ თქვენ არ წაშალეთ აღდგენის მეთოდი, შესაძლოა თავდამსხმელი ცდილობდეს თქვენს ანგარიშზე წვდომას. შეცვალეთ თქვენი ანგარიშის პაროლი და დააყენეთ აღდგენის ახალი მეთოდი დაუყოვნებლივ პარამეტრებში." }, - "reset_all_button": "დაგავიწყდათ თუ დაკარგეთ აღდგენის ყველა მეთოდი? გადატვირთეთ ყველა", "set_up_toast_title": "დააყენეთ უსაფრთხო სარეზერვო ასლი", "setup_secure_backup": { "explainer": "შექმენით თქვენი გასაღებების სარეზერვო ასლები გასვლამდე, რათა არ დაკარგოთ ისინი." @@ -719,12 +717,8 @@ "after_new_login": { "device_verified": "მოწყობილობა დადასტურებულია", "skip_verification": "ამ დროისთვის გამოტოვეთ დადასტურება", - "unable_to_verify": "ამ მოწყობილობის დადასტურება შეუძლებელია", "verify_this_device": "დაადასტურეთ ეს მოწყობილობა" }, - "cancelled": "თქვენ გააუქმეთ დადასტურება.", - "cancelled_self": "თქვენ გააუქმეთ დადასტურება თქვენს სხვა მოწყობილობაზე.", - "cancelled_user": "%(displayName)sგაუქმებული გადამოწმება.", "cancelling": "მიმდინარეობს გაუქმება…", "complete_action": "Გავიგე", "complete_description": "თქვენ წარმატებით დაადასტურეთ ეს მომხმარებელი.", @@ -739,45 +733,32 @@ "incoming_sas_dialog_waiting": "ელოდება პარტნიორის დადასტურებას…", "incoming_sas_user_dialog_text_1": "დაადასტურეთ ეს მომხმარებელი, რათა მონიშნოთ ისინი სანდოდ. მომხმარებელთა ნდობა გაძლევთ დამატებით სიმშვიდეს, როდესაც იყენებთ ბოლომდე დაშიფრული შეტყობინებების გამოყენებას.", "incoming_sas_user_dialog_text_2": "ამ მომხმარებლის დადასტურება მონიშნავს მის სესიას სანდოდ და ასევე მონიშნავს თქვენს სესიას, როგორც მისთვის სანდო.", - "no_key_or_device": "როგორც ჩანს, არ გაქვთ უსაფრთხოების გასაღები ან სხვა მოწყობილობები, რომლებზეც შეგიძლიათ დაადასტუროთ. ეს მოწყობილობა ვერ შეძლებს ძველ დაშიფრულ შეტყობინებებზე წვდომას. იმისათვის, რომ დაადასტუროთ თქვენი ვინაობა ამ მოწყობილობაზე, დაგჭირდებათ თქვენი დამადასტურებელი გასაღებების გადატვირთვა.", "no_support_qr_emoji": "მოწყობილობა, რომლის გადამოწმებას ცდილობთ, არ უჭერს მხარს QR კოდის ან emoji-ის დადასტურებას, რაც არის%(brand)s მხარს უჭერს. სცადეთ სხვა კლიენტთან.", "other_party_cancelled": "მეორე მხარემ გააუქმა გადამოწმება.", "prompt_encrypted": "დაადასტურეთ ოთახის ყველა მომხმარებელი, რომ დარწმუნდეთ, რომ ის უსაფრთხოა.", - "prompt_self": "ხელახლა დაიწყეთ გადამოწმება შეტყობინებებიდან.", "prompt_unencrypted": "დაშიფრულ ოთახებში გადაამოწმეთ ყველა მომხმარებელი, რომ დარწმუნდეთ, რომ ის უსაფრთხოა.", - "prompt_user": "ხელახლა დაიწყეთ დადასტურება მათი პროფილიდან.", "qr_or_sas": "%(qrCode)sან%(emojiCompare)s", - "qr_or_sas_header": "გადაამოწმეთ ეს მოწყობილობა შემდეგიდან ერთ-ერთის შესრულებით:", "qr_prompt": "დაასკანირეთ ეს უნიკალური კოდი", - "qr_reciprocate_same_shield_device": "თითქმის იქ! თქვენი სხვა მოწყობილობა აჩვენებს იმავე ფარს?", "qr_reciprocate_same_shield_user": "თითქმის იქ! არის%(displayName)s იგივე ფარს აჩვენებს?", - "request_toast_accept": "სესიის გადამოწმება", "request_toast_decline_counter": "იგნორირება (%(counter)s )", "request_toast_detail": "%(deviceId)sსაწყისი%(ip)s", - "reset_proceed_prompt": "გააგრძელეთ გადატვირთვა", "sas_caption_self": "დაადასტურეთ ეს მოწყობილობა და დაადასტურეთ, რომ შემდეგი ნომერი გამოჩნდება მის ეკრანზე.", "sas_caption_user": "დაადასტურეთ ეს მომხმარებელი და დაადასტურეთ, რომ შემდეგი ნომერი გამოჩნდება მის ეკრანზე.", "sas_description": "შეადარეთ emoji-ების უნიკალური ნაკრები, თუ არცერთ მოწყობილობაზე არ გაქვთ კამერა", - "sas_emoji_caption_self": "დაადასტურეთ, რომ ქვემოთ მოცემული emoji ნაჩვენებია ორივე მოწყობილობაზე, იმავე თანმიმდევრობით:", "sas_emoji_caption_user": "დაადასტურეთ ეს მომხმარებელი და დაადასტურეთ, რომ შემდეგი emoji გამოჩნდება მის ეკრანზე.", "sas_match": "ისინი ემთხვევა", "sas_no_match": "ისინი არ ემთხვევა", "sas_prompt": "შეადარეთ უნიკალური emoji", "scan_qr": "გადაამოწმეთ სკანირებით", "scan_qr_explainer": "იკითხე%(displayName)s თქვენი კოდის სკანირებისთვის:", - "self_verification_hint": "გასაგრძელებლად გთხოვთ დაეთანხმოთ დადასტურების მოთხოვნას თქვენს სხვა მოწყობილობაზე.", "start_button": "დაიწყეთ გადამოწმება", - "successful_device": "თქვენ წარმატებით დაადასტურეთ%(deviceName)s (%(deviceId)s )!", - "successful_own_device": "თქვენ წარმატებით დაადასტურეთ თქვენი მოწყობილობა!", "successful_user": "თქვენ წარმატებით დაადასტურეთ%(displayName)s !", - "timed_out": "დადასტურების დრო ამოიწურა.", "unsupported_method": "დადასტურების მხარდაჭერილი მეთოდის პოვნა შეუძლებელია.", "unverified_session_toast_accept": "დიახ, მე ვიყავი", "unverified_session_toast_title": "ახალი შესვლა. ეს შენ იყავი?", "unverified_sessions_toast_description": "გადახედეთ, რათა დარწმუნდეთ, რომ თქვენი ანგარიში უსაფრთხოა", "unverified_sessions_toast_reject": "მოგვიანებით", "unverified_sessions_toast_title": "თქვენ გაქვთ დაუდასტურებელი სესიები", - "verification_description": "დაადასტურეთ თქვენი ვინაობა დაშიფრულ შეტყობინებებზე წვდომისთვის და სხვებისთვის თქვენი ვინაობის დასამტკიცებლად. თუ თქვენ ასევე იყენებთ მობილურ მოწყობილობას, გთხოვთ, გახსენით აპი იქ, სანამ გააგრძელებთ.", "verification_dialog_title_device": "გადაამოწმეთ სხვა მოწყობილობა", "verification_dialog_title_user": "გადამოწმების მოთხოვნა", "verification_skip_warning": "დადასტურების გარეშე, თქვენ არ გექნებათ წვდომა თქვენს ყველა შეტყობინებაზე და შეიძლება სხვებისთვის არასანდო გამოჩნდეთ.", @@ -787,9 +768,6 @@ "verify_emoji_prompt": "გადაამოწმეთ უნიკალური emoji-ების შედარებით.", "verify_emoji_prompt_qr": "თუ ზემოთ მოცემულ კოდს ვერ სკანირებთ, გადაამოწმეთ უნიკალური emoji-ების შედარებით.", "verify_later": "მოგვიანებით გადავამოწმებ", - "verify_using_device": "გადაამოწმეთ სხვა მოწყობილობით", - "verify_using_key": "გადაამოწმეთ უსაფრთხოების გასაღებით", - "verify_using_key_or_phrase": "გადაამოწმეთ უსაფრთხოების გასაღებით ან ფრაზით", "waiting_for_user_accept": "ელოდება%(displayName)s მიღება…", "waiting_other_device": "ელოდება თქვენ გადამოწმებას თქვენს სხვა მოწყობილობაზე…", "waiting_other_device_details": "გელოდებათ გადამოწმებას თქვენს სხვა მოწყობილობაზე,%(deviceName)s (%(deviceId)s )…", @@ -1286,8 +1264,6 @@ "send_message_start_dm": "გაგზავნეთ თქვენი პირველი შეტყობინება მოსაწვევად სასაუბროდ", "start_of_dm_history": "ეს არის თქვენი პირდაპირი შეტყობინებების ისტორიის დასაწყისი .", "start_of_room": "ეს არის დასაწყისი .", - "topic": "თემა: %(topic)s", - "topic_edit": "თემა:%(topic)s ( რედაქტირება )", "unencrypted_warning": "ბოლოდან ბოლომდე დაშიფვრა არ არის ჩართული", "user_created": "%(displayName)sშექმნა ეს ოთახი.", "you_created": "თქვენ შექმენით ეს ოთახი." diff --git a/src/i18n/strings/lo.json b/src/i18n/strings/lo.json index cca8039f20..3e4bd9321a 100644 --- a/src/i18n/strings/lo.json +++ b/src/i18n/strings/lo.json @@ -462,7 +462,6 @@ "unnamed_space": "ພື້ນທີ່ບໍ່ລະບຸຊື່", "user_avatar": "ຮູບໂປຣໄຟລ໌", "username": "ຊື່ຜູ້ໃຊ້", - "verification_cancelled": "ຍົກເລີກການຢັ້ງຢືນແລ້ວ", "video": "ວິດີໂອ", "video_room": "ຫ້ອງວີດີໂອ", "view_message": "ເບິ່ງຂໍ້ຄວາມ", @@ -700,7 +699,6 @@ "title": "ວິທີລົບຂະບວນການກູ້ຄືນ", "warning": "ຖ້າທ່ານບໍ່ໄດ້ລືບຂະບວນການກູ້ຄືນ, ຜູ້ໂຈມຕີອາດຈະພະຍາຍາມເຂົ້າເຖິງບັນຊີຂອງທ່ານ. ປ່ຽນລະຫັດຜ່ານບັນຊີຂອງທ່ານ ແລະ ກຳນົດຂະບວນການກູ້ຄືນໃໝ່ທັນທີໃນການຕັ້ງຄ່າ." }, - "reset_all_button": "ລືມ ຫຼື ສູນເສຍວິທີການກູ້ຄືນທັງຫມົດ? ຕັ້ງຄ່າຄືນໃໝ່ທັງໝົດ", "set_up_toast_title": "ຕັ້ງຄ່າການສໍາຮອງຂໍ້ມູນທີ່ປອດໄພ", "setup_secure_backup": { "explainer": "ສຳຮອງຂໍ້ມູນກະແຈຂອງທ່ານກ່ອນທີ່ຈະອອກຈາກລະບົບເພື່ອຫຼີກເວັ້ນການສູນເສຍຂໍ້ມູນ." @@ -718,12 +716,8 @@ "after_new_login": { "device_verified": "ຢັ້ງຢືນອຸປະກອນແລ້ວ", "skip_verification": "ຂ້າມການຢັ້ງຢືນດຽວນີ້", - "unable_to_verify": "ບໍ່ສາມາດຢັ້ງຢືນອຸປະກອນນີ້ໄດ້", "verify_this_device": "ຢັ້ງຢືນອຸປະກອນນີ້" }, - "cancelled": "ທ່ານໄດ້ຍົກເລີກການຢັ້ງຢືນແລ້ວ.", - "cancelled_self": "ທ່ານໄດ້ຍົກເລີກການຢັ້ງຢືນໃນອຸປະກອນອື່ນຂອງທ່ານ.", - "cancelled_user": "%(displayName)s ຍົກເລີກການຢັ້ງຢືນ.", "cancelling": "ກຳລັງຍົກເລີກ…", "complete_action": "ເຂົ້າໃຈແລ້ວ", "complete_description": "ທ່ານໄດ້ຢັ້ງຢືນຜູ້ໃຊ້ນີ້ສຳເລັດແລ້ວ.", @@ -735,40 +729,28 @@ "incoming_sas_dialog_title": "ການຮ້ອງຂໍການຢັ້ງຢືນຂາເຂົ້າ", "incoming_sas_user_dialog_text_1": "ຢັ້ງຢືນຜູ້ໃຊ້ນີ້ເພື່ອສ້າງເຄື່ອງທີ່ເຊື່ອຖືໄດ້. ຜູ້ໃຊ້ທີ່ເຊື່ອຖືໄດ້ ເຮັດໃຫ້ທ່ານອຸ່ນໃຈຂື້ນເມື່ຶຶອເຂົ້າລະຫັດຂໍ້ຄວາມແຕ່ຕົ້ນທາງເຖິງປາຍທາງ.", "incoming_sas_user_dialog_text_2": "ການຢືນຢັນຜູ້ໃຊ້ນີ້ຈະເປັນເຄື່ອງໝາຍໃນລະບົບຂອງເຂົາເຈົ້າໜ້າເຊື່ອຖືໄດ້ ແລະ ເປັນເຄື່ອງໝາຍເຖິງລະບົບຂອງທ່ານ ເປັນທີ່ເຊື່ອຖືໄດ້ຕໍ່ກັບເຂົາເຈົ້າ.", - "no_key_or_device": "ເບິ່ງຄືວ່າທ່ານບໍ່ມີກະແຈຄວາມປອດໄພ ຫຼື ອຸປະກອນອື່ນໆທີ່ທ່ານສາມາດຢືນຢັນໄດ້. ອຸປະກອນນີ້ຈະບໍ່ສາມາດເຂົ້າເຖິງຂໍ້ຄວາມທີ່ເຂົ້າລະຫັດເກົ່າໄດ້. ເພື່ອຢືນຢັນຕົວຕົນຂອງທ່ານໃນອຸປະກອນນີ້, ທ່ານຈຳເປັນຕ້ອງຕັ້ງລະຫັດຢືນຢັນຂອງທ່ານ.", "no_support_qr_emoji": "ອຸປະກອນທີ່ທ່ານພະຍາຍາມກວດສອບບໍ່ຮອງຮັບການສະແກນລະຫັດ QR ຫຼື ການຢັ້ງຢືນ emoji, ຊຶ່ງເປັນສິ່ງທີ່%(brand)sສະຫນັບສະຫນູນ. ລອງໃຊ້ກັບລູກຄ້າອື່ນ.", "other_party_cancelled": "ອີກຝ່າຍໄດ້ຍົກເລີກການຢັ້ງຢືນ.", "prompt_encrypted": "ຢັ້ງຢືນຜູ້ໃຊ້ທັງໝົດຢູ່ໃນຫ້ອງເພື່ອຮັບປະກັນວ່າມີຄວາມປອດໄພ.", - "prompt_self": "ເລີ່ມການຢັ້ງຢືນອີກຄັ້ງຈາກການແຈ້ງເຕືອນ.", "prompt_unencrypted": "ໃນຫ້ອງທີ່ເຂົ້າລະຫັດໄວ້, ໃຫ້ກວດສອບຜູ້ໃຊ້ທັງໝົດເພື່ອຮັບປະກັນວ່າປອດໄພ.", - "prompt_user": "ເລີ່ມການຢັ້ງຢືນອີກຄັ້ງຈາກໂປຣໄຟລ໌ຂອງເຂົາເຈົ້າ.", - "qr_or_sas_header": "ຢັ້ງຢືນອຸປະກອນນີ້ໂດຍການເຮັດສິ່ງໃດໜຶ່ງຕໍ່ໄປນີ້:", "qr_prompt": "ສະແກນລະຫັດສະເພາະນີ້", - "qr_reciprocate_same_shield_device": "ເກືອບສຳເລັດແລ້ວ! ອຸປະກອນອື່ນຂອງທ່ານສະແດງການປ້ອງກັນຄືກັນບໍ?", "qr_reciprocate_same_shield_user": "ໃກ້ສຳເລັດແລ້ວ! %(displayName)s ສະແດງການປ້ອງກັນແບບດຽວກັນບໍ?", "request_toast_detail": "%(deviceId)s ຈາກ %(ip)s", - "reset_proceed_prompt": "ດຳເນີນການຕັ້ງຄ່າໃໝ່", "sas_caption_self": "ຢືນຢັນອຸປະກອນນີ້ໂດຍການຢືນຢັນຕົວເລກຕໍ່ໄປນີ້ໃຫ້ປາກົດຢູ່ໃນຫນ້າຈໍຂອງມັນ.", "sas_caption_user": "ຢືນຢັນຜູ້ໃຊ້ນີ້ໂດຍການຢືນຢັນຕົວເລກຕໍ່ໄປນີ້ໃຫ້ປາກົດຢູ່ໃນຫນ້າຈໍຂອງເຂົາເຈົ້າ.", "sas_description": "ປຽບທຽບຊຸດ emoji ທີ່ເປັນເອກະລັກຖ້າຫາກທ່ານບໍ່ມີກ້ອງຖ່າຍຮູບຢູ່ໃນອຸປະກອນໃດໜຶ່ງ", - "sas_emoji_caption_self": "ຢືນຢັນວ່າ emoji ຂ້າງລຸ່ມນີ້ແມ່ນສະແດງຢູ່ໃນອຸປະກອນທັງສອງ, ໃນລໍາດັບດຽວກັນ:", "sas_emoji_caption_user": "ຢືນຢັນຜູ້ໃຊ້ນີ້ໂດຍການຢືນຢັນemoji ຕໍ່ໄປນີ້ປາກົດຢູ່ໃນຫນ້າຈໍຂອງເຂົາເຈົ້າ.", "sas_match": "ກົງກັນ", "sas_no_match": "ບໍ່ກົງກັນ", "sas_prompt": "ປຽບທຽບ emoji ທີ່ເປັນເອກະລັກ", "scan_qr": "ຢືນຢັນໂດຍການສະແກນ", "scan_qr_explainer": "ໃຫ້ %(displayName)s ສະແກນລະຫັດຂອງທ່ານ:", - "self_verification_hint": "ເພື່ອດຳເນີນການຕໍ່, ກະລຸນາຍອມຮັບຄຳຮ້ອງຂໍການຢັ້ງຢືນໃນອຸປະກອນອື່ນຂອງທ່ານ.", "start_button": "ເລີ່ມການຢັ້ງຢືນ", - "successful_device": "ທ່ານໄດ້ຢືນຢັນສຳເລັດແລ້ວ %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "ທ່ານໄດ້ຢັ້ງຢືນອຸປະກອນຂອງທ່ານສຳເລັດແລ້ວ!", "successful_user": "ທ່ານໄດ້ຢືນຢັນສຳເລັດແລ້ວ %(displayName)s!", - "timed_out": "ການຢັ້ງຢືນໝົດເວລາ.", "unsupported_method": "ບໍ່ສາມາດຊອກຫາວິທີການຢັ້ງຢືນທີ່ຮອງຮັບໄດ້.", "unverified_session_toast_title": "ເຂົ້າສູ່ລະບົບໃໝ່. ນີ້ແມ່ນທ່ານບໍ?", "unverified_sessions_toast_description": "ກວດສອບໃຫ້ແນ່ໃຈວ່າບັນຊີຂອງທ່ານປອດໄພ", "unverified_sessions_toast_reject": "ຕໍ່ມາ", - "verification_description": "ຢືນຢັນຕົວຕົນຂອງທ່ານເພື່ອເຂົ້າເຖິງຂໍ້ຄວາມທີ່ເຂົ້າລະຫັດໄວ້ ແລະ ພິສູດຕົວຕົນຂອງທ່ານໃຫ້ກັບຜູ້ອື່ນ.", "verification_dialog_title_device": "ຢືນຢັນອຸປະກອນອື່ນ", "verification_dialog_title_user": "ການຮ້ອງຂໍການຢັ້ງຢືນ", "verification_skip_warning": "ໂດຍບໍ່ມີການຢັ້ງຢືນ, ທ່ານຈະບໍ່ສາມາດເຂົ້າເຖິງຂໍ້ຄວາມທັງຫມົດຂອງທ່ານ ແລະ ອາດຈະປາກົດວ່າບໍ່ຫນ້າເຊື່ອຖື.", @@ -778,9 +760,6 @@ "verify_emoji_prompt": "ຢັ້ງຢືນໂດຍການປຽບທຽບ emoji ທີ່ເປັນເອກະລັກ.", "verify_emoji_prompt_qr": "ຖ້າທ່ານບໍ່ສາມາດສະແກນລະຫັດຂ້າງເທິງໄດ້, ໃຫ້ກວດສອບໂດຍການປຽບທຽບອີໂມຈິທີ່ເປັນເອກະລັກ.", "verify_later": "ຂ້ອຍຈະກວດສອບພາຍຫຼັງ", - "verify_using_device": "ຢັ້ງຢືນດ້ວຍອຸປະກອນອື່ນ", - "verify_using_key": "ຢືນຢັນດ້ວຍກະແຈຄວາມປອດໄພ", - "verify_using_key_or_phrase": "ຢືນຢັນດ້ວຍກະແຈຄວາມປອດໄພ ຫຼືປະໂຫຍກ", "waiting_for_user_accept": "ກຳລັງລໍຖ້າ %(displayName)s ຍອມຮັບ…", "waiting_other_device": "ກຳລັງລໍຖ້າໃຫ້ທ່ານຢັ້ງຢືນໃນອຸປະກອນອື່ນຂອງທ່ານ…", "waiting_other_device_details": "ກຳລັງລໍຖ້າໃຫ້ທ່ານກວດສອບໃນອຸປະກອນອື່ນຂອງທ່ານ, %(deviceName)s (%(deviceId)s)…", @@ -1460,8 +1439,6 @@ "room_invite": "ເຊີນເຂົ້າຫ້ອງນີ້ເທົ່ານັ້ນ", "start_of_dm_history": "ຈຸດເລີ່ມຕົ້ນຂອງປະຫວັດຂໍ້ຄວາມໂດຍກົງຂອງທ່ານກັບ .", "start_of_room": "ນີ້ແມ່ນຈຸດເລີ່ມຕົ້ນຂອງ .", - "topic": "ຫົວຂໍ້: %(topic)s ", - "topic_edit": "ຫົວຂໍ້: %(topic)s (ແກ້ໄຂ)", "unencrypted_warning": "ບໍ່ໄດ້ເປີດໃຊ້ການເຂົ້າລະຫັດແບບຕົ້ນທາງຮອດປາຍທາງ", "user_created": "%(displayName)s ສ້າງຫ້ອງນີ້.", "you_created": "ທ່ານສ້າງຫ້ອງນີ້." diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json index 6d222a52ee..e2417cf7df 100644 --- a/src/i18n/strings/lt.json +++ b/src/i18n/strings/lt.json @@ -382,7 +382,6 @@ "unverified": "Nepatvirtinta", "user_avatar": "Profilio paveikslėlis", "username": "Vartotojo vardas", - "verification_cancelled": "Patvirtinimas atšauktas", "verified": "Patvirtinta", "video": "Vaizdo įrašas", "video_room": "Vaizdo kambarys", @@ -535,7 +534,6 @@ "title": "Atgavimo Metodas Pašalintas", "warning": "Jei jūs nepašalinote paskyros atgavimo metodo, gali būti, kad užpuolikas bando patekti į jūsų paskyrą. Nedelsiant nustatymuose pakeiskite savo paskyros slaptažodį ir nustatykite naują atgavimo metodą." }, - "reset_all_button": "Pamiršote arba praradote visus atkūrimo metodus? Iš naujo nustatyti viską", "set_up_toast_title": "Nustatyti Saugią Atsarginę Kopiją", "setup_secure_backup": { "explainer": "Prieš atsijungdami sukurkite atsarginę savo raktų kopiją, kad išvengtumėte jų praradimo." @@ -550,9 +548,6 @@ "unable_to_setup_keys_error": "Nepavyksta nustatyti raktų", "verification": { "accepting": "Priimama…", - "cancelled": "Jūs atšaukėte patvirtinimą.", - "cancelled_self": "Atšaukėte patvirtinimą kitame įrenginyje.", - "cancelled_user": "%(displayName)s atšaukė patvirtinimą.", "cancelling": "Atšaukiama…", "complete_action": "Supratau", "complete_description": "Jūs sėkmingai patvirtinote šį vartotoją.", @@ -567,31 +562,22 @@ "no_support_qr_emoji": "Įrenginys, kurį bandote patvirtinti, nepalaiko QR kodo nuskaitymo arba jaustukų patikrinimo, kurį palaiko %(brand)s. Pabandykite naudoti kitą klientą.", "other_party_cancelled": "Kita šalis atšaukė patvirtinimą.", "prompt_encrypted": "Patvirtinkite visus vartotojus kambaryje, kad užtikrintumėte jo saugumą.", - "prompt_self": "Pradėkite patvirtinimą iš naujo pranešime.", "prompt_unencrypted": "Užšifruotuose kambariuose patvirtinkite visus naudotojus, kad įsitikintumėte, jog jie yra saugūs.", - "prompt_user": "Pradėkite patvirtinimą iš naujo jų profilyje.", "qr_or_sas": "%(qrCode)s arba %(emojiCompare)s", - "qr_or_sas_header": "Patvirtinkite šį įrenginį atlikdami vieną iš toliau nurodytų veiksmų:", "qr_prompt": "Nuskaitykite šį unikalų kodą", - "qr_reciprocate_same_shield_device": "Jau beveik! Ar kitas jūsų įrenginys rodo tą patį skydą?", "qr_reciprocate_same_shield_user": "Beveik atlikta! Ar %(displayName)s rodo tokį patį skydą?", "request_toast_detail": "%(deviceId)s iš %(ip)s", "sas_caption_self": "Patvirtinkite šį prietaisą patvirtindami, kad jo ekrane rodomas šis numeris.", "sas_caption_user": "Patvirtinkite šį vartotoją, įsitikindami, kad jo ekrane rodomas toliau esantis skaičius.", "sas_description": "Palyginkite unikalų jaustukų rinkinį, jei neturite fotoaparato nei viename įrenginyje", - "sas_emoji_caption_self": "Patvirtinkite, kad toliau pateikti jaustukai rodomi abiejuose prietaisuose ta pačia tvarka:", "sas_emoji_caption_user": "Patvirtinkite šį vartotoją, įsitikindami, kad jo ekrane rodomas toliau esantis jaustukas.", "sas_match": "Jie sutampa", "sas_no_match": "Jie nesutampa", "sas_prompt": "Palyginkite unikalius jaustukus", "scan_qr": "Patvirtinti nuskaitant", "scan_qr_explainer": "Paprašykite %(displayName)s nuskaityti jūsų kodą:", - "self_verification_hint": "Jei norite tęsti, priimkite patvirtinimo prašymą kitame savo įrenginyje.", "start_button": "Pradėti patvirtinimą", - "successful_device": "Jūs sėkmingai patvirtinote %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "Jūs sėkmingai patvirtinote savo įrenginį!", "successful_user": "Jūs sėkmingai patvirtinote %(displayName)s!", - "timed_out": "Pasibaigė laikas patikrinimui.", "unsupported_method": "Nepavyko rasti palaikomo patvirtinimo metodo.", "unverified_session_toast_title": "Naujas prisijungimas. Ar tai jūs?", "unverified_sessions_toast_description": "Peržiūrėkite, ar jūsų paskyra yra saugi", @@ -1051,8 +1037,6 @@ "send_message_start_dm": "Siųskite pirmąją žinutę kad pakviestumėte į pokalbį", "start_of_dm_history": "Tai yra jūsų tiesioginių žinučių su istorijos pradžia.", "start_of_room": "Tai yra pradžia.", - "topic": "Tema: %(topic)s ", - "topic_edit": "Tema: %(topic)s (redaguoti)", "unencrypted_warning": "Visapusis šifravimas nėra įjungtas", "user_created": "%(displayName)s sukūrė šį kambarį.", "you_created": "Jūs sukūrėte šį kambarį." diff --git a/src/i18n/strings/lv.json b/src/i18n/strings/lv.json index 778a87176e..ee4d1ace47 100644 --- a/src/i18n/strings/lv.json +++ b/src/i18n/strings/lv.json @@ -568,7 +568,6 @@ "user": "Lietotājs", "user_avatar": "Profila attēls", "username": "Lietotājvārds", - "verification_cancelled": "Apliecināšana atcelta", "verified": "Verificēts", "version": "Versija", "video": "Video", @@ -875,7 +874,6 @@ "title": "Atkopšanas metode noņemta", "warning": "Ja nenoņēmi atkopšanas veidu, var būt, ka uzbrucējs mēģina piekļūt Tavam kontam. Nekavējoties jānomaina sava konta parole un jāiestata jauns atkopšanas veids." }, - "reset_all_button": "Aizmirsāt vai pazaudējāt visas atkopšanās iespējas? Atiestatiet visu", "set_up_toast_title": "Iestatīt drošu rezerves dublēšanu", "setup_secure_backup": { "explainer": "Pirms izrakstīšanās iestatiet atslēgu dublēšanu, lai izvairītos no tās pazaudēšanas." @@ -894,12 +892,8 @@ "after_new_login": { "device_verified": "Ierīce ir verificēta", "skip_verification": "Pagaidām izlaist verifikāciju", - "unable_to_verify": "Neizdevās verificēt šo ierīci", "verify_this_device": "Verificēt šo ierīci" }, - "cancelled": "Tu atcēli apliecināšanu.", - "cancelled_self": "Jūs atcēlāt verifikāciju citā savā ierīcē.", - "cancelled_user": "%(displayName)s atcēla apliecināšanu.", "cancelling": "Atcelšana...", "complete_action": "Sapratu", "complete_description": "Tu esi veiksmīgi apliecinājis šo lietotāju.", @@ -914,46 +908,33 @@ "incoming_sas_dialog_waiting": "Gaida partnera apstiprinājumu…", "incoming_sas_user_dialog_text_1": "Apliecināt šo lietotāju, lai atzīmētu to kā uzticamu. Uzticēšanās lietotājiem sniedz papildu mieru, kad tiek izmantotas pilnīgi šifrētas ziņas.", "incoming_sas_user_dialog_text_2": "Šī lietotāja apliecināšana atzīmēs viņa sesiju kā uzticamu, kā arī atzīmēs šo sesiju kā viņam uzticamu.", - "no_key_or_device": "Izskatās, ka Tev nav drošības atslēgas vai citu ierīču, kurās varētu veikt apliecināšanu. Šajā ierīcē nebūs iespējams piekļūt vecām šifrētajām ziņām. Lai šajā ierīcē apliecinātu savu identitāti, būs nepieciešams atiestatīt savas apliecināšanas atslēgas.", "no_support_qr_emoji": "Ierīce, kuru mēģini apliecināt, nenodrošina kvadrātkoda nolasīšanu vai emocijzīmju apliecināšanu, ko nodrošina %(brand)s. Jāmēģina ar citu klientu.", "other_party_cancelled": "Otra puse atcēla apliecināšanu.", "prompt_encrypted": "Apliecināt visus istabā esošos lietotājus, lai nodrošinātu tās drošību.", - "prompt_self": "Apliecināšana jāuzsāk vēlreiz no paziņojuma.", "prompt_unencrypted": "Šifrētās apliecināt visus lietotājus, lai nodrošinātu, ka tās ir drošas.", - "prompt_user": "Apliecināšana jāuzsāk vēlreiz no viņu profila.", "qr_or_sas": "%(qrCode)s vai %(emojiCompare)s", - "qr_or_sas_header": "Verificējiet šo ierīci, veicot vienu no šīm darbībām:", "qr_prompt": "Noskenējiet šo unikālo kodu", - "qr_reciprocate_same_shield_device": "Gandrīz esam galā! Vai cita jūsu ierīce rāda tādu pašu vairogu?", "qr_reciprocate_same_shield_user": "Gandrīz galā! Vai %(displayName)s tiek parādīts tas pats vairogs?", - "request_toast_accept": "Apliecināt sesiju", "request_toast_accept_user": "Apliecināt lietotāju", "request_toast_decline_counter": "Neņemt vērā (%(counter)s)", "request_toast_detail": "%(deviceId)s no %(ip)s", - "reset_proceed_prompt": "Turpināt atiestatīšanu", "sas_caption_self": "Apliecināt šo ierīci, apstiprinot, ka ekrānā parādās šis skaitlis.", "sas_caption_user": "Apliecināt šo lietotāju, apstiprinot, ka zemāk esošais numurs pārādās lietotāja ekrānā.", "sas_description": "Salīdziniet unikālu emocijzīmju kopu, ja nevienai ierīcei nav kameras", - "sas_emoji_caption_self": "Apstiprināt, ka zemāk esošās emocijzīmes air attēlotas abās ierīcēs tādā pašā secībā:", "sas_emoji_caption_user": "Apliecināt šo lietotāju, apstiprinot, ka zemāk esošās emocijzīmes pārādās lietotāja ekrānā.", "sas_match": "Tās sakrīt", "sas_no_match": "Tās nesakrīt", "sas_prompt": "Jāsalīdzina vienreizējās emocijzīmes", "scan_qr": "Apliecināt ar nolasīšanu", "scan_qr_explainer": "Jāvaicā %(displayName)s nolasīt šo kodu:", - "self_verification_hint": "Lai turpinātu, lūgums apstiprināt apliecinājuma pieprasījumu otrā ierīcē.", "start_button": "Uzsākt apliecināšanu", - "successful_device": "Ir veiksmīgi apliecināta %(deviceName)s (%(deviceId)s).", - "successful_own_device": "Ierīce ir veiksmīgi apliecināta.", "successful_user": "Ir veiksmīgi apliecināts %(displayName)s!", - "timed_out": "Verifikācijai iestājās noilgums.", "unsupported_method": "Neizdevās atrast atbalstītu verifikācijas metodi.", "unverified_session_toast_accept": "Jā, tas biju es", "unverified_session_toast_title": "Jauna pieteikšanās. Vai tas biji Tu?", "unverified_sessions_toast_description": "Pārskatīt, lai nodrošinātu, ka konts ir drosībā.", "unverified_sessions_toast_reject": "Vēlāk", "unverified_sessions_toast_title": "Tev ir neapliecinātas sesijas", - "verification_description": "Verificējiet savu identitāti, lai piekļūtu šifrētām ziņām un pierādītu savu identitāti citiem.", "verification_dialog_title_device": "Apliecināt otru ierīci", "verification_dialog_title_user": "Apliecināšanas pieprasījums", "verification_skip_warning": "Neveicot verifikāciju, jums nebūs piekļuves visām savām ziņām, kā arī ierīce var tikt parādīta citiem kā neuzticama.", @@ -963,9 +944,6 @@ "verify_emoji_prompt": "Apliecināt ar vienreizēju emocijzīmu salīdzināšanu.", "verify_emoji_prompt_qr": "Ja nevar nolasīt augstāk esošo kodu, var apliecināt ar vienreizēju emocijzīmju salīdzināšanu.", "verify_later": "Es verificēšu vēlāk", - "verify_using_device": "Verificēt ar citu ierīci", - "verify_using_key": "Verificēt ar drošības atslēgu", - "verify_using_key_or_phrase": "Verificēt, izmantojot drošības atslēgu vai frāzi", "waiting_for_user_accept": "Gaida, kamēr %(displayName)s apstiprinās…", "waiting_other_device": "Gaida, kamēr jūs verificēsiet citā savā ierīcē...", "waiting_other_device_details": "Gaida, kamēr jūs verificēsiet citā ierīcē - %(deviceName)s (%(deviceId)s)…", @@ -1705,8 +1683,6 @@ "send_message_start_dm": "Nosūtiet savu pirmo ziņu, lai uzaicinātu uz tērzēšanu", "start_of_dm_history": "Šis ir sākums tiešās sarakstes vēsturei ar .", "start_of_room": "Šis ir istabas pats sākums.", - "topic": "Temats: %(topic)s ", - "topic_edit": "Temats: %(topic)s (redigēt)", "unencrypted_warning": "Pilnīga šifrēšana nav iespējota", "user_created": "%(displayName)s izveidoja šo istabu.", "you_created": "Tu izveidoji šo istabu." diff --git a/src/i18n/strings/mg_MG.json b/src/i18n/strings/mg_MG.json index 861d8a76c8..6b330d447f 100644 --- a/src/i18n/strings/mg_MG.json +++ b/src/i18n/strings/mg_MG.json @@ -528,7 +528,6 @@ "user": "Mpampiasa", "user_avatar": "Sary mpamantarana ", "username": "Anarany mpampiasa", - "verification_cancelled": "Manafoana ny fanamarinana", "verified": "Fanamariana", "version": "Dikan-teny", "video": "Ainamanjery", @@ -832,7 +831,6 @@ "title": "Nesorina ny fomba fanarenana", "warning": "Raha tsy nesorinao ny fomba fanarenana, dia mety hanandrana hiditra aminy kaontinao ny mpanafika. Hanova ny tenimiafiny kaontinao ary mametraha fomba fanarenana vaovao avy hatrany ao amin'ny fanitsiana." }, - "reset_all_button": "Adino na very ny fomba fanarenana rehetra? Avereno daholo", "set_up_toast_title": "Hanitsy angona voaharo", "setup_secure_backup": { "explainer": "Amboary ny fanalahidinao alohany hivoahana mba tsy ho very." @@ -851,12 +849,8 @@ "after_new_login": { "device_verified": "Voamarina ny fitaovana", "skip_verification": "Alefaso ny fanamarinana amin'izao fotoana izao", - "unable_to_verify": "Tsy afaka manamarina ity fitaovana ity", "verify_this_device": "Hamarino ity fitaovana ity" }, - "cancelled": "Nofoananao ny fanamarinana.", - "cancelled_self": "Nofoananao ny fanamarinana tamin'ny fitaovanao hafa.", - "cancelled_user": "%(displayName)snofoanana ny fanamarinana.", "cancelling": "Manafoana…", "complete_action": "Azoko", "complete_description": "Ianao voamariko soa aman-tsara ity mpampiasa ity.", @@ -871,45 +865,32 @@ "incoming_sas_dialog_waiting": "Miandry ny mpiara-miasa hanamarina…", "incoming_sas_user_dialog_text_1": "Hamarino ity mpampiasa ity mba hanamarihana azy ireo ho azo itokisana. Ny fahatokisana ny mpampiasa dia manome anao fiadanan-tsaina fanampiny rehefa mampiasa hafatra voarakotra amin'ny farany.", "incoming_sas_user_dialog_text_2": "Ny fanamarinana ity mpampiasa ity dia hanamarika ny fotoam-pivorian'izy ireo ho atokisana, ary hanamarika ihany koa ny fotoam-pivorianao ho atokisana azy ireo.", - "no_key_or_device": "Toa tsy manana fanalahidiny ianao na fitaovana hafa azonao hamarinina. Ity fitaovana ity dia tsy ho afaka miditra aminy hafatra efa misy miafina. Mba hanamarinana ny mombamomba anao amin'ity fitaovana ity dia mila averinao ny fanalahidiny fanamarinanao.", "no_support_qr_emoji": "Ny fitaovana ezahinao hohamarinina dia tsy mahazaka ny scan kaody QR na fanamarinana emoji, izany hoe%(brand)s ny manohana. Andramo miaraka aminy mpanjifa hafa.", "other_party_cancelled": "Nanafoana ny fanamarinana ny ankilany.", "prompt_encrypted": "Hamarino ny mpampiasa rehetra ao amin'ny efitrano iray mba hahazoana antoka fa azo antoka izany.", - "prompt_self": "Atombohy indray ny fanamarinana avy amin'ny fampahafantarana.", "prompt_unencrypted": "Ao amin'ny efitrano misy miafina, hamarino ny mpampiasa rehetra mba hahazoana antoka fa azo antoka.", - "prompt_user": "Atombohy indray ny fanamarinana avy amin'ny mombamomba azy.", "qr_or_sas": "%(qrCode)sna%(emojiCompare)s", - "qr_or_sas_header": "Hamarino ity fitaovana ity aminy fanatanterahana ny iray amin'ireto manaraka ireto:", "qr_prompt": "Tilio ity kaody tokana ity", - "qr_reciprocate_same_shield_device": "Saika any! Mampiseho ampinga mitovy ve ny fitaovanao hafa?", "qr_reciprocate_same_shield_user": "Saika any! dia%(displayName)s mampiseho ampinga mitovy?", - "request_toast_accept": "Hamarino ny fizorana", "request_toast_decline_counter": "Tsy miraharaha (%(counter)s )", "request_toast_detail": " avy amin'ny ", - "reset_proceed_prompt": "Ankany amin'ny famerenana ny rehetra aminy laoniny", "sas_caption_self": "Hamarino ity fitaovana ity amin'ny fanamafisana ity isa manaraka ity dia miseho eo aminy efijery.", "sas_caption_user": "Hamarino ity mpampiasa ity aminy fanamafisana ity isa manaraka ity dia miseho eo amin'ny efijery.", "sas_description": "Ampitahao ny andiana emoji tokana raha tsy manana fakan-tsary amin'ny fitaovana roa ianao", - "sas_emoji_caption_self": "Hamafiso fa aseho amin'ny fitaovana roa ny emoji etsy ambany, amin'ny filaharana mitovy:", "sas_emoji_caption_user": "Hamarino ity mpampiasa ity amin'ny fanamafisana ity emoji manaraka ity dia miseho eo amin'ny efijery.", "sas_match": "Mifanaraka izy ireo", "sas_no_match": "Tsy mifanentana izy ireo", "sas_prompt": "Ampitahao ny emoji tokana", "scan_qr": "Hamarino amin'ny fitiliana", "scan_qr_explainer": "Anontanio%(displayName)s hijerena ny kaodinao:", - "self_verification_hint": "Mba hanohizana dia ekeo azafady ny fangatahana fanamarinana amin'ny fitaovanao hafa.", "start_button": "Atombohy ny fanamarinana", - "successful_device": "Vitanao ny nanamarina%(deviceName)s (%(deviceId)s )!", - "successful_own_device": "Nahomby ianao nanamarina ny fitaovanao!", "successful_user": "Ianao efa voamariko antsakany sy andavany%(displayName)s!", - "timed_out": "Tapitra ny fotoana fanamarinana.", "unsupported_method": "Tsy nahita fomba fanamarinana tohana.", "unverified_session_toast_accept": "Eny, izaho io", "unverified_session_toast_title": "Fidirana vaovao. Ianao ve ity?", "unverified_sessions_toast_description": "Avereno jerena mba hahazoana antoka fa azo antoka ny kaontinao", "unverified_sessions_toast_reject": "Taty aoriana", "unverified_sessions_toast_title": "Manana fivoriana tsy voamarina ianao", - "verification_description": "Hamarino ny maha-izy anao mba hidirana aminy hafatra miafina ary porofoy amin'ny hafa ny mombamomba anao.", "verification_dialog_title_device": "Hamarino ny fitaovana hafa", "verification_dialog_title_user": "Fangatahana fanamarinana", "verification_skip_warning": "Raha tsy misy fanamarinana dia tsy afaka miditra aminy hafatrao rehetra ianao ary mety hiseho ho tsy atokisana amin'ny hafa.", @@ -919,9 +900,6 @@ "verify_emoji_prompt": "Hamarino amin'ny fampitahana emoji tokana.", "verify_emoji_prompt_qr": "Raha tsy azonao atao ny mijery ny kaody etsy ambony dia hamarino amin'ny fampitahana emoji tokana.", "verify_later": "Hamariniko avy eo", - "verify_using_device": "Hamarino amin'ny fitaovana hafa", - "verify_using_key": "Hamarino aminy fanalahidiny voaharo", - "verify_using_key_or_phrase": "Hamarino amin'ny fanalahidy na rakin-tsoratra voaharo", "waiting_for_user_accept": "Miandry%(displayName)s manaiky…", "waiting_other_device": "Miandry anao hanamarina amin'ny fitaovanao hafa…", "waiting_other_device_details": "Miandry anao hanamarina amin'ny fitaovanao hafa,%(deviceName)s (%(deviceId)s )…", @@ -1759,8 +1737,6 @@ "send_message_start_dm": "Alefaso ny hafatrao voalohany hanasana hifampiresaka", "start_of_dm_history": "Ity no fiandohan'ny tantarany hafatra mivantana nataonao .", "start_of_room": "Izany no fiandohan'ny .", - "topic": "Lohahevitra:%(les sujets", - "topic_edit": "Lohahevitra:%(topic)s ( Ovay )", "unencrypted_warning": "Tsy azo atao ny mandefa ny kaody faran'ny farany", "user_created": "%(displayName)snamorona ity efitrano ity.", "you_created": "Ianao no namorona ity efitrano ity." diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json index 3e6f395715..4cc7144a45 100644 --- a/src/i18n/strings/nb_NO.json +++ b/src/i18n/strings/nb_NO.json @@ -598,7 +598,6 @@ "user": "Bruker", "user_avatar": "Profilbilde", "username": "Brukernavn", - "verification_cancelled": "Verifiseringen ble avbrutt", "verified": "Verifisert", "version": "Versjon", "video": "Video", @@ -654,6 +653,7 @@ "poll_button_no_perms_description": "Du har ikke tillatelse til å starte avstemninger i dette rommet.", "poll_button_no_perms_title": "Tillatelse kreves", "replying_title": "Svarer på", + "room_unencrypted": "Meldinger i dette rommet er ikke ende-til-ende krypterte", "room_upgraded_link": "Samtalen fortsetter her.", "room_upgraded_notice": "Dette rommet har blitt erstattet og er ikke lenger aktivt.", "send_button_title": "Send melding", @@ -967,7 +967,6 @@ "title": "Gjenopprettingsmetode fjernet", "warning": "Hvis det ikke var deg som fjernet gjenopprettingsmetoden, kan det være en hacker som prøver å få tilgang til kontoen din. Bytt passordet for kontoen din og angi en ny gjenopprettingsmetode øyeblikkelig i Innstillinger." }, - "reset_all_button": "Glemt eller mistet alle gjenopprettingsmetoder? Tilbakestill alt", "set_up_recovery": "Sett opp gjenoppretting", "set_up_recovery_toast_description": "Generer en gjenopprettingsnøkkel som kan brukes til å gjenopprette den krypterte meldingshistorikken i tilfelle du mister tilgangen til enhetene dine.", "set_up_toast_title": "Sett opp sikker sikkerhetskopiering", @@ -990,12 +989,8 @@ "after_new_login": { "device_verified": "Enhet verifisert", "skip_verification": "Hopp over verifisering for nå", - "unable_to_verify": "Kan ikke verifisere denne enheten", "verify_this_device": "Verifiser denne enheten" }, - "cancelled": "Du avbrøt verifiseringen.", - "cancelled_self": "Du avbrøt verifikasjonen på din andre enheten.", - "cancelled_user": "%(displayName)s avbrøt verifikasjonen.", "cancelling": "Avbryter …", "complete_action": "Skjønner", "complete_description": "Du har vellykket verifisert denne brukeren.", @@ -1025,46 +1020,33 @@ "text": "Oppgi ID-en og fingeravtrykket til en av dine egne enheter for å verifisere det. MERK at dette lar den andre enheten sende og motta meldinger som deg. HVIS NOEN HAR FORTALT DEG BARE Å LIME INN NOE HER, ER DET SANNSYNLIGVIS AT DU BLIR SVINDLET!", "wrong_fingerprint": "Kan ikke verifisere enheten %(deviceId)s '- det medfølgende fingeravtrykket'%(fingerprint)s «samsvarer ikke med enhetens fingeravtrykk»%(fprint)s '" }, - "no_key_or_device": "Det ser ut til at du ikke har en gjenopprettingsnøkkel eller andre enheter du kan verifisere mot. Denne enheten vil ikke kunne få tilgang til gamle krypterte meldinger. For å bekrefte identiteten din på denne enheten, må du tilbakestille verifiseringsnøklene dine.", "no_support_qr_emoji": "Enheten du prøver å bekrefte støtter ikke skanning av en QR-kode eller emoji-verifikasjon, som er det som %(brand)s støtter. Prøv med en annen klient.", "other_party_cancelled": "Den andre parten kansellerte verifiseringen.", "prompt_encrypted": "Bekreft alle brukere i et rom for å sikre at det er sikkert.", - "prompt_self": "Start verfisering igjen fra varselet.", "prompt_unencrypted": "Bekreft alle brukere i krypterte rom for å sikre at det er sikkert.", - "prompt_user": "Start bekreftelsen igjen fra profilen deres.", "qr_or_sas": "%(qrCode)s eller %(emojiCompare)s", - "qr_or_sas_header": "Verifiser denne enheten ved å fullføre ett av følgende:", "qr_prompt": "Skann denne unike koden", - "qr_reciprocate_same_shield_device": "Nesten der! Viser den andre enheten det samme skjoldet?", "qr_reciprocate_same_shield_user": "Nesten der! Viser %(displayName)s det samme skjoldet?", - "request_toast_accept": "Verifiser sesjonen", "request_toast_accept_user": "Verifiser bruker", "request_toast_decline_counter": "Ignorer (%(counter)s)", "request_toast_detail": "%(deviceId)s fra %(ip)s", - "reset_proceed_prompt": "Fortsett med tilbakestilling", "sas_caption_self": "Bekreft denne enheten ved å bekrefte at følgende nummer vises på skjermen.", "sas_caption_user": "Bekreft denne brukeren ved å bekrefte at følgende nummer vises på skjermen.", "sas_description": "Sammenlign et unikt sett med emojier hvis du ikke har et kamera på noen av enhetene", - "sas_emoji_caption_self": "Bekreft at emojiene nedenfor vises på begge enhetene, i samme rekkefølge:", "sas_emoji_caption_user": "Bekreft denne brukeren ved å bekrefte at følgende emoji vises på skjermen.", "sas_match": "De samsvarer", "sas_no_match": "De samsvarer ikke", "sas_prompt": "Sammenlign unike emojier", "scan_qr": "Verifiser med skanning", "scan_qr_explainer": "Be %(displayName)s om å skanne koden:", - "self_verification_hint": "For å fortsette, godta bekreftelsesforespørselen på den andre enheten din.", "start_button": "Begynn verifisering", - "successful_device": "Du har vellykket verifisert %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "Du har vellykket verifisert enheten din!", "successful_user": "Du har vellykket verifisert %(displayName)s!", - "timed_out": "Bekreftelsen ble tidsavbrutt.", "unsupported_method": "Kan ikke finne en støttet bekreftelsesmetode.", "unverified_session_toast_accept": "Ja, det var meg", "unverified_session_toast_title": "En ny pålogging. Var det deg?", "unverified_sessions_toast_description": "Se gjennom for å sikre at kontoen din er trygg", "unverified_sessions_toast_reject": "Senere", "unverified_sessions_toast_title": "Du har ubekreftede økter", - "verification_description": "Bekreft identiteten din for å få tilgang til krypterte meldinger og bevise identiteten din for andre.", "verification_dialog_title_device": "Bekreft annen enhet", "verification_dialog_title_user": "Verifiseringsforespørsel", "verification_skip_warning": "Uten verifisering vil du ikke ha tilgang til alle meldingene dine, og du kan fremstå som upålitelig for andre.", @@ -1074,9 +1056,6 @@ "verify_emoji_prompt": "Bekreft ved å sammenligne unike emoji.", "verify_emoji_prompt_qr": "Hvis du ikke kan skanne koden ovenfor, bekreft ved å sammenligne unike emoji.", "verify_later": "Jeg bekrefter senere", - "verify_using_device": "Bekreft med en annen enhet", - "verify_using_key": "Bekreft med gjenopprettingsnøkkel", - "verify_using_key_or_phrase": "Bekreft med gjenopprettingsnøkkel eller -frase", "waiting_for_user_accept": "Venter på at %(displayName)s skal akseptere …", "waiting_other_device": "Venter på at du skal bekrefte på den andre enheten din...", "waiting_other_device_details": "Venter på at du skal bekrefte på den andre enheten din, %(deviceName)s (%(deviceId)s)...", @@ -1366,6 +1345,10 @@ "name_email_mxid_share_space": "Inviter noen ved å bruke navn, e-postadresse, brukernavn (lik ) eller del dette området.", "name_mxid_share_room": "Inviter noen ved å bruke navnet, brukernavnet (som ) eller del dette rommet.", "name_mxid_share_space": "Inviter noen ved å bruke navnet sitt, brukernavnet (lik ) eller dele dette området.", + "progress": { + "dont_close": "Ikke lukk appen før den er ferdig.", + "preparing": "Forbereder invitasjoner..." + }, "recents_section": "Nylige samtaler", "room_failed_partial": "Vi sendte de andre, men folkene nedenfor kunne ikke inviteres til ", "room_failed_partial_title": "Noen invitasjoner kunne ikke sendes", @@ -1872,11 +1855,6 @@ "other": "Du kan bare feste opptil %(count)s widgets" }, "menu": "Åpne meny", - "release_announcement": { - "close": "Ok", - "description": "Her finner du alle festede meldinger. Hold musepekeren over en melding og velg \"Fest\" for å legge den til.", - "title": "Alle nye festede meldinger" - }, "reply_thread": "Svar på en trådmelding ", "unpin_all": { "button": "Løsne alle meldinger", @@ -2008,8 +1986,6 @@ "send_message_start_dm": "Send din første melding for å invitere til chat", "start_of_dm_history": "Dette er begynnelsen på direktemeldingshistorikken din med .", "start_of_room": "Dette er starten på .", - "topic": "Emne: %(topic)s ", - "topic_edit": "Emne: %(topic)s (rediger)", "unencrypted_warning": "Ende-til-ende-kryptering er ikke aktivert", "user_created": "%(displayName)s opprettet dette rommet.", "you_created": "Du opprettet dette rommet." @@ -2064,8 +2040,9 @@ "pinned_message_banner": { "button_close_list": "Lukk liste", "button_view_all": "Vis alle", - "description": "Dette rommet har festede meldinger. Klikk for å se dem.", - "go_to_message": "Vis den festede meldingen i tidslinjen.", + "description": "Festede meldinger", + "go_to_newest_message": "Se den festede meldingen i tidslinjen og den nyeste festede meldingen her", + "go_to_next_message": "Se den festede meldingen i tidslinjen og den nest eldste festede meldingen her", "title": "%(index)s av %(length)s festede meldinger" }, "read_topic": "Klikk for å lese emnet", @@ -2174,6 +2151,18 @@ "one": "Fjerner for øyeblikket meldinger i %(count)s rom", "other": "Fjerner for øyeblikket meldinger i %(count)s rom" }, + "release_announcement": { + "done": "Ferdig", + "filter": { + "description": "Filtrer chattene dine med ett enkelt klikk. Utvid for å se flere filtre.", + "title": "Nye hurtigfiltre" + }, + "intro": { + "description": "Chat-listen er oppdatert for å være mer oversiktlig og enkel å bruke.", + "title": "Chatten har fått et nytt utseende!" + }, + "next": "Neste" + }, "room": { "more_options": "Flere alternativer", "open_room": "Åpne rom %(roomName)s" diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index fdab0d7ea9..fd673d7d7c 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -490,7 +490,6 @@ "user": "Gebruiker", "user_avatar": "Profielfoto", "username": "Inlognaam", - "verification_cancelled": "Verificatie geannuleerd", "verified": "Geverifieerd", "version": "Versie", "video": "Video", @@ -731,7 +730,6 @@ "title": "Herstelmethode verwijderd", "warning": "Als je de herstelmethode niet hebt verwijderd, is het mogelijk dat er een aanvaller toegang tot jouw account probeert te verkrijgen. Wijzig onmiddellijk je wachtwoord en stel bij instellingen een nieuwe herstelmethode in." }, - "reset_all_button": "Alles vergeten en alle herstelmethoden verloren? Alles opnieuw instellen", "set_up_toast_title": "Beveiligde back-up instellen", "setup_secure_backup": { "explainer": "Maak een back-up van je sleutels voordat je jezelf afmeldt om ze niet te verliezen." @@ -750,12 +748,8 @@ "after_new_login": { "device_verified": "Apparaat geverifieerd", "skip_verification": "Verificatie voorlopig overslaan", - "unable_to_verify": "Kan dit apparaat niet verifiëren", "verify_this_device": "Verifieer dit apparaat" }, - "cancelled": "Je hebt de verificatie geannuleerd.", - "cancelled_self": "Je hebt de verificatie geannuleerd op het andere apparaat.", - "cancelled_user": "%(displayName)s heeft de verificatie geannuleerd.", "cancelling": "Bezig met annuleren…", "complete_action": "Ik snap het", "complete_description": "Je hebt deze persoon geverifieerd.", @@ -767,40 +761,28 @@ "incoming_sas_dialog_title": "Inkomend verificatieverzoek", "incoming_sas_user_dialog_text_1": "Verifieer deze persoon om als vertrouwd te markeren. Personen vertrouwen geeft je extra zekerheid bij het gebruik van eind-tot-eind-versleutelde berichten.", "incoming_sas_user_dialog_text_2": "Deze persoon verifiëren zal de sessie als vertrouwd markeren voor jullie beide.", - "no_key_or_device": "Het lijkt erop dat je geen veiligheidssleutel hebt of andere apparaten waarmee je kunt verifiëren. Dit apparaat heeft geen toegang tot oude versleutelde berichten. Om je identiteit op dit apparaat te verifiëren, moet je jouw verificatiesleutels opnieuw instellen.", "no_support_qr_emoji": "Het apparaat dat je probeert te verifiëren ondersteund niet de door %(brand)s ondersteunde methodes: scannen van een QR-code of emoji verificatie. Probeer het met een andere app.", "other_party_cancelled": "De tegenpartij heeft de verificatie geannuleerd.", "prompt_encrypted": "Controleer alle personen in een kamer om er zeker van te zijn dat het veilig is.", - "prompt_self": "Verificatie opnieuw beginnen vanuit de melding.", "prompt_unencrypted": "Controleer alle personen in versleutelde kamers om er zeker van te zijn dat het veilig is.", - "prompt_user": "Begin verificatie opnieuw vanaf hun profiel.", "qr_or_sas": "%(qrCode)s of %(emojiCompare)s", - "qr_or_sas_header": "Verifieer dit apparaat door een van onderstaande methodes af te ronden:", "qr_prompt": "Scan deze unieke code", - "qr_reciprocate_same_shield_device": "Je bent er bijna! Toont het andere apparaat hetzelfde schild?", "qr_reciprocate_same_shield_user": "Bijna klaar! Toont %(displayName)s hetzelfde schild?", "request_toast_detail": "%(deviceId)s van %(ip)s", - "reset_proceed_prompt": "Met reset doorgaan", "sas_caption_self": "Verifieer dit apparaat door te bevestigen dat het volgende nummer zichtbaar is op het scherm.", "sas_caption_user": "Verifieer deze persoon door te bevestigen dat hun scherm het volgende getal toont.", "sas_description": "Vergelijk een unieke lijst met emoji als geen van beide apparaten een camera heeft", - "sas_emoji_caption_self": "Bevestig dat de onderstaande emoji zichtbaar zijn op beide apparaten en in dezelfde volgorde:", "sas_emoji_caption_user": "Verifieer deze persoon door te bevestigen dat hun scherm de volgende emoji toont.", "sas_match": "Ze komen overeen", "sas_no_match": "Ze komen niet overeen", "sas_prompt": "Vergelijk unieke emoji", "scan_qr": "Verifiëren met scan", "scan_qr_explainer": "Vraag %(displayName)s om jouw code te scannen:", - "self_verification_hint": "Om door te gaan, accepteer het verificatie verzoek op je andere apparaat.", "start_button": "Verificatie beginnen", - "successful_device": "Je hebt %(deviceName)s (%(deviceId)s) geverifieerd!", - "successful_own_device": "Je hebt je apparaat geverifieerd!", "successful_user": "Je hebt %(displayName)s geverifieerd!", - "timed_out": "Verificatie verlopen.", "unsupported_method": "Kan geen ondersteunde verificatiemethode vinden.", "unverified_session_toast_title": "Nieuwe login gevonden. Was jij dat?", "unverified_sessions_toast_description": "Controleer ze zodat jouw account veilig is", - "verification_description": "Verifeer je identiteit om toegang te krijgen tot je versleutelde berichten en om je identiteit te bewijzen voor anderen.", "verification_dialog_title_device": "Verifieer ander apparaat", "verification_dialog_title_user": "Verificatieverzoek", "verification_skip_warning": "Zonder verifiëren heb je geen toegang tot al je berichten en kan je als onvertrouwd aangemerkt staan bij anderen.", @@ -810,9 +792,6 @@ "verify_emoji_prompt": "Verifieer door unieke emoji te vergelijken.", "verify_emoji_prompt_qr": "Als je bovenstaande code niet kan scannen, verifieer dan door unieke emoji te vergelijken.", "verify_later": "Ik verifieer het later", - "verify_using_device": "Verifieer met andere apparaat", - "verify_using_key": "Verifieer met veiligheidssleutel", - "verify_using_key_or_phrase": "Verifieer met veiligheidssleutel of -wachtwoord", "waiting_for_user_accept": "Wachten tot %(displayName)s aanvaardt…", "waiting_other_device": "Wachten op je verificatie op het andere apparaat…", "waiting_other_device_details": "Wachten op je verificatie op het andere apparaat, %(deviceName)s (%(deviceId)s)…", @@ -1503,8 +1482,6 @@ "send_message_start_dm": "Stuur je eerste bericht om uit te nodigen om te chatten", "start_of_dm_history": "Dit is het begin van je direct gesprek met .", "start_of_room": "Dit is het begin van .", - "topic": "Onderwerp: %(topic)s ", - "topic_edit": "Onderwerp: %(topic)s (bewerken)", "unencrypted_warning": "Eind-tot-eind-versleuteling is uitgeschakeld", "user_created": "%(displayName)s heeft deze kamer aangemaakt.", "you_created": "Jij hebt deze kamer gemaakt." diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index b773bf8524..f3bbdd2cf2 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -602,7 +602,6 @@ "user": "Użytkownik", "user_avatar": "Obraz profilowy", "username": "Nazwa użytkownika", - "verification_cancelled": "Weryfikacja anulowana", "verified": "Zweryfikowane", "version": "Wersja", "video": "Wideo", @@ -972,7 +971,6 @@ "title": "Usunięto metodę odzyskiwania", "warning": "Jeśli nie usunąłeś metody odzyskiwania, atakujący może próbować dostać się na Twoje konto. Zmień hasło konta i natychmiast ustaw nową metodę odzyskiwania w Ustawieniach." }, - "reset_all_button": "Zapomniałeś lub straciłeś wszystkie opcje odzyskiwania? Resetuj wszystko", "set_up_recovery": "Skonfiguruj przywracanie", "set_up_recovery_toast_description": "Wygeneruj klucz przywracania, którego można użyć do przywrócenia zaszyfrowanej historii wiadomości w przypadku utraty dostępu do swoich urządzeń.", "set_up_toast_title": "Skonfiguruj bezpieczną kopię zapasową", @@ -995,12 +993,8 @@ "after_new_login": { "device_verified": "Urządzenie zweryfikowane", "skip_verification": "Pomiń weryfikację na razie", - "unable_to_verify": "Nie można zweryfikować tego urządzenia", "verify_this_device": "Zweryfikuj to urządzenie" }, - "cancelled": "Anulowałeś weryfikację.", - "cancelled_self": "Anulowałeś weryfikację na swoim drugim urządzeniu.", - "cancelled_user": "%(displayName)s anulował weryfikację.", "cancelling": "Anulowanie…", "complete_action": "Zrobione", "complete_description": "Pomyślnie zweryfikowałeś tego użytkownika.", @@ -1030,46 +1024,33 @@ "text": "Podaj ID i odcisk palca jednego ze swoich urządzeń, aby zweryfikować. UWAGA umożliwi to drugiemu urządzeniu wysyłanie i odbieranie wiadomości w Twoim imieniu. JEŚLI KTOŚ POWIEDZIAŁ CI, ŻEBYŚ COŚ TU WKLEIŁ, PRAWDOPODOBNIE JESTEŚ OSZUKIWANY!", "wrong_fingerprint": "Nie można zweryfikować urządzenia '%(deviceId)s' - podany odcisk palca '%(fingerprint)s' nie pasuje do odcisku palca na urządzeniu, '%(fprint)s'" }, - "no_key_or_device": "Wygląda na to, że nie masz klucza przywracania ani żadnych innych urządzeń, które mogłyby zweryfikować Twoją tożsamość. To urządzenie nie będzie mogło odczytać wcześniej zaszyfrowanych wiadomości. Aby zweryfikować swoją tożsamość na tym urządzeniu, musisz zresetować klucze weryfikacyjne.", "no_support_qr_emoji": "Urządzenie, które próbujesz zweryfikować nie wspiera skanowania kodu QR lub weryfikacji emoji, czyli tego co obsługuje %(brand)s. Spróbuj użyć innego klienta.", "other_party_cancelled": "Druga strona anulowała weryfikację.", "prompt_encrypted": "Zweryfikuj wszystkich użytkowników w pokoju, aby upewnić się, że jest bezpieczny.", - "prompt_self": "Rozpocznij weryfikację ponownie z powiadomienia.", "prompt_unencrypted": "W pokojach szyfrowanych, zweryfikuj wszystkich użytkowników, aby upewnić się, że są bezpieczne.", - "prompt_user": "Rozpocznij weryfikację ponownie z ich profilu.", "qr_or_sas": "%(qrCode)s lub %(emojiCompare)s", - "qr_or_sas_header": "Zweryfikuj to urządzenie wykonując jedno z następujących:", "qr_prompt": "Zeskanuj ten unikatowy kod", - "qr_reciprocate_same_shield_device": "Prawie gotowe! Czy drugie urządzenie pokazuje tę samą tarczę?", "qr_reciprocate_same_shield_user": "Prawie gotowe! Czy %(displayName)s pokazuje tę samą tarczę?", - "request_toast_accept": "Zweryfikuj sesję", "request_toast_accept_user": "Zweryfikuj użytkownika", "request_toast_decline_counter": "Ignoruj (%(counter)s)", "request_toast_detail": "%(deviceId)s z %(ip)s", - "reset_proceed_prompt": "Zresetuj", "sas_caption_self": "Zweryfikuj to urządzenie, upewniając się że poniższy numer wyświetlony jest na jego ekranie.", "sas_caption_user": "Sprawdź tego użytkownika potwierdzając, że następujące liczby pojawiają się na ekranie rozmówcy.", "sas_description": "Porównaj unikatowy zestaw emoji, jeżeli nie masz aparatu na którymś z urządzeń", - "sas_emoji_caption_self": "Potwierdź że poniższe emotikony są wyświetlane na obu urządzeniach, w tej samej kolejności:", "sas_emoji_caption_user": "Sprawdź tego użytkownika potwierdzając, że następujące emotikony pojawiają się na ekranie rozmówcy.", "sas_match": "Pasują do siebie", "sas_no_match": "Nie pasują do siebie", "sas_prompt": "Porównaj unikatowe emoji", "scan_qr": "Zweryfikuj przez skanowanie", "scan_qr_explainer": "Poproś %(displayName)s, aby zeskanował Twój kod:", - "self_verification_hint": "Aby kontynuować, akceptuj żądanie weryfikacji na swoim drugim urządzeniu.", "start_button": "Rozpocznij weryfikację", - "successful_device": "Pomyślnie zweryfikowałeś %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "Pomyślnie zweryfikowano Twoje urządzenie!", "successful_user": "Pomyślnie zweryfikowałeś %(displayName)s!", - "timed_out": "Upłynął czas oczekiwania weryfikacji.", "unsupported_method": "Nie można znaleźć wspieranej metody weryfikacji.", "unverified_session_toast_accept": "Tak, to byłem ja", "unverified_session_toast_title": "Nowe logowanie. Czy to byłeś Ty?", "unverified_sessions_toast_description": "Sprawdź, by upewnić się że Twoje konto jest bezpieczne", "unverified_sessions_toast_reject": "Później", "unverified_sessions_toast_title": "Masz niezweryfikowane sesje", - "verification_description": "Zweryfikuj swoją tożsamość, aby uzyskać dostęp do wiadomości szyfrowanych i potwierdzić swoją tożsamość innym. Jeśli korzystasz z urządzenia mobilnego, otwórz na nim aplikację.", "verification_dialog_title_device": "Zweryfikuj drugie urządzenie", "verification_dialog_title_user": "Żądanie weryfikacji", "verification_skip_warning": "Bez weryfikacji, nie będziesz posiadać dostępu do wszystkich swoich wiadomości, a inni będą Cię widzieć jako niezaufanego.", @@ -1079,9 +1060,6 @@ "verify_emoji_prompt": "Zweryfikuj, porównując unikalne emotikony.", "verify_emoji_prompt_qr": "Jeśli nie jesteś w stanie skanować kodu powyżej, zweryfikuj porównując emoji.", "verify_later": "Zweryfikuję później", - "verify_using_device": "Zweryfikuj innym urządzeniem", - "verify_using_key": "Zweryfikuj kluczem przywracania", - "verify_using_key_or_phrase": "Zweryfikuj kluczem przywracania lub frazą", "waiting_for_user_accept": "Oczekiwanie na akceptację przez %(displayName)s…", "waiting_other_device": "Oczekiwanie na zweryfikowanie przez ciebie twojego innego urządzenia…", "waiting_other_device_details": "Oczekiwanie na zweryfikowanie przez ciebie twojego innego urządzenia, %(deviceName)s (%(deviceId)s)…", @@ -1880,11 +1858,6 @@ "other": "Możesz przypiąć do %(count)s widżetów" }, "menu": "Otwórz menu", - "release_announcement": { - "close": "Ok", - "description": "Wszystkie przypięte wiadomości są tutaj. Najedź na dowolną wiadomość i wybierz „Przypnij”, aby dodać.", - "title": "Wszystkie nowe przypięte wiadomości" - }, "reply_thread": "Odpowiedz na wiadomość w wątku", "unpin_all": { "button": "Odepnij wszystkie wiadomości", @@ -2016,8 +1989,6 @@ "send_message_start_dm": "Wyślij pierwszą wiadomość, aby zaprosić do rozmowy", "start_of_dm_history": "Oto początek Twojej historii wiadomości prywatnych z .", "start_of_room": "Oto początek .", - "topic": "Temat: %(topic)s ", - "topic_edit": "Temat: %(topic)s (edytuj)", "unencrypted_warning": "Szyfrowanie end-to-end nie jest włączone", "user_created": "%(displayName)s utworzył ten pokój.", "you_created": "Utworzyłeś ten pokój." @@ -2073,7 +2044,6 @@ "button_close_list": "Zamknij listę", "button_view_all": "Pokaż wszystkie", "description": "Ten pokój ma przypięte wiadomości. Kliknij, aby je wyświetlić.", - "go_to_message": "Wyświetl przypiętą wiadomość na osi czasu.", "title": "%(index)s z %(length)s przypiętych wiadomości" }, "read_topic": "Kliknij, aby przeczytać temat", diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index 468170f945..219abebe18 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -582,7 +582,6 @@ "user": "Utilizador", "user_avatar": "Foto do perfil", "username": "Nome de utilizador", - "verification_cancelled": "Verificação cancelada", "verified": "Verificado", "version": "Versão", "video": "Vídeo", @@ -932,7 +931,6 @@ "title": "Método de recuperação Removido", "warning": "Se não tiveres removido o método de recuperação, um atacante pode estar a tentar aceder à tua conta. Altera a palavra-passe da tua conta e define imediatamente um novo método de recuperação nas Definições." }, - "reset_all_button": "Esqueceste-te ou perdeste todos os métodos de recuperação? Repor tudo", "set_up_recovery": "Configurar a recuperação", "set_up_recovery_toast_description": "Gera uma chave de recuperação que pode ser utilizada para restaurar o teu histórico de mensagens encriptadas, caso percas o acesso aos teus dispositivos.", "set_up_toast_title": "Configura uma cópia de segurança segura", @@ -953,12 +951,8 @@ "after_new_login": { "device_verified": "Dispositivo verificado", "skip_verification": "Ignora a verificação por enquanto", - "unable_to_verify": "Não é possível verificar este dispositivo", "verify_this_device": "Verifica este dispositivo" }, - "cancelled": "Cancelaste a verificação.", - "cancelled_self": "Cancelaste a verificação no teu outro dispositivo.", - "cancelled_user": "%(displayName)sverificação cancelada.", "cancelling": "A cancelar…", "complete_action": "Entendi", "complete_description": "Verificaste este utilizador com sucesso.", @@ -973,46 +967,33 @@ "incoming_sas_dialog_waiting": "Aguarda a confirmação do parceiro...", "incoming_sas_user_dialog_text_1": "Verifica este utilizador para o marcar como fiável. A confiança nos utilizadores dá-te uma tranquilidade extra quando utilizas mensagens encriptadas de ponta a ponta.", "incoming_sas_user_dialog_text_2": "A verificação deste utilizador marcará a sua sessão como sendo de confiança e também marcará a tua sessão como sendo de confiança para ele.", - "no_key_or_device": "Parece que não tens uma chave de recuperação ou qualquer outro dispositivo com o qual possas fazer a verificação. Este dispositivo não poderá aceder a mensagens encriptadas antigas. Para verificares a tua identidade neste dispositivo, terás de repor as tuas chaves de verificação.", "no_support_qr_emoji": "O dispositivo que estás a tentar verificar não suporta a leitura de um código QR nem a verificação de emoji, os dois métodos suportados pela %(brand)s. Tenta com um cliente diferente.", "other_party_cancelled": "A outra parte cancelou a verificação.", "prompt_encrypted": "Verifica todos os utilizadores de uma sala para garantir a sua segurança.", - "prompt_self": "Inicia novamente a verificação a partir da notificação.", "prompt_unencrypted": "Em salas encriptadas, verifica todos os utilizadores para garantir a segurança.", - "prompt_user": "Recomeça a verificação a partir do perfil.", "qr_or_sas": "%(qrCode)s ou %(emojiCompare)s", - "qr_or_sas_header": "Verifica este dispositivo completando uma das seguintes opções:", "qr_prompt": "Lê este código único", - "qr_reciprocate_same_shield_device": "Estás quase lá! O teu outro dispositivo está a mostrar o mesmo escudo?", "qr_reciprocate_same_shield_user": "Estás quase lá! O %(displayName)s tem o mesmo escudo?", - "request_toast_accept": "Verifica a sessão", "request_toast_accept_user": "Verificar utilizador", "request_toast_decline_counter": "Ignora (%(counter)s)", "request_toast_detail": "%(deviceId)s de %(ip)s", - "reset_proceed_prompt": "Procede à reposição", "sas_caption_self": "Verifica este dispositivo, confirmando que o número seguinte aparece no ecrã.", "sas_caption_user": "Verifica este utilizador, confirmando que o seguinte número aparece no ecrã deles.", "sas_description": "Compara um conjunto único de emojis se não tiveres uma câmara em nenhum dos dispositivos", - "sas_emoji_caption_self": "Confirma se os emojis abaixo são apresentados em ambos os dispositivos, pela mesma ordem:", "sas_emoji_caption_user": "Verifica este utilizador confirmando que o seguinte emoji aparece no seu ecrã.", "sas_match": "Correspondem", "sas_no_match": "Não correspondem", "sas_prompt": "Compara emojis únicos", "scan_qr": "Verifica através da leitura de um código", "scan_qr_explainer": "Pede a %(displayName)s para ler o teu código:", - "self_verification_hint": "Para continuar, aceita o pedido de verificação no teu outro dispositivo.", "start_button": "Iniciar Verificação", - "successful_device": "Verificaste com sucesso %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "Verificaste o teu dispositivo com sucesso!", "successful_user": "Verificaste com sucesso %(displayName)s!", - "timed_out": "A verificação expirou.", "unsupported_method": "Não foi possível encontrar um método de verificação compatível.", "unverified_session_toast_accept": "Sim, fui eu", "unverified_session_toast_title": "Novo login. Foste tu?", "unverified_sessions_toast_description": "Revê para garantir que a tua conta está segura", "unverified_sessions_toast_reject": "Mais tarde", "unverified_sessions_toast_title": "Tens sessões não verificadas", - "verification_description": "Verifica a tua identidade para acederes a mensagens encriptadas e provares a tua identidade a outros.", "verification_dialog_title_device": "Verifica o outro dispositivo", "verification_dialog_title_user": "Pedido de verificação", "verification_skip_warning": "Sem a verificação, não terás acesso a todas as tuas mensagens e poderás parecer pouco fiável aos olhos dos outros.", @@ -1022,9 +1003,6 @@ "verify_emoji_prompt": "Verifica comparando o emoji único.", "verify_emoji_prompt_qr": "Se não conseguires ler o código acima, verifica-o comparando emojis.", "verify_later": "Verificarei mais tarde", - "verify_using_device": "Verifica com outro dispositivo", - "verify_using_key": "Verifica com a chave de recuperação", - "verify_using_key_or_phrase": "Verifica com a chave ou frase de recuperação", "waiting_for_user_accept": "À espera de %(displayName)s para aceitar...", "waiting_other_device": "À espera que verifiques no teu outro dispositivo...", "waiting_other_device_details": "À espera que verifiques no teu outro dispositivo, %(deviceName)s (%(deviceId)s)...", @@ -1808,11 +1786,6 @@ "other": "Só podes fixar até %(count)s widgets" }, "menu": "Abrir o menu", - "release_announcement": { - "close": "Ok", - "description": "Encontra todas as mensagens fixadas aqui. Passa o cursor sobre qualquer mensagem e seleciona \"Fixar\" para a adicionar.", - "title": "Todas as novas mensagens afixadas" - }, "reply_thread": "Responde a uma mensagem do tópico", "unpin_all": { "button": "Desafixa todas as mensagens", @@ -1942,8 +1915,6 @@ "send_message_start_dm": "Envia a tua primeira mensagem para convidar para conversar", "start_of_dm_history": "Este é o início do teu histórico de mensagens directas com .", "start_of_room": "Este é o início de .", - "topic": "Tópico: %(topic)s", - "topic_edit": "Tópico: %(topic)s (edita)", "unencrypted_warning": "A encriptação de ponta a ponta não está ativada", "user_created": "%(displayName)s criou esta sala.", "you_created": "Tu criaste esta sala." @@ -1999,7 +1970,6 @@ "button_close_list": "Fechar lista", "button_view_all": "Ver tudo", "description": "Esta sala tem mensagens afixadas. Clica para as veres.", - "go_to_message": "Visualiza a mensagem fixada na linha do tempo.", "title": "%(index)s de %(length)s Mensagens fixadas" }, "read_topic": "Clica para ler o tópico", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 91f5fcff5f..09e025bd31 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -598,7 +598,6 @@ "user": "Usuário", "user_avatar": "Foto de perfil", "username": "Nome de usuário", - "verification_cancelled": "Confirmação cancelada", "verified": "Verificado", "version": "Versão", "video": "Vídeo", @@ -654,6 +653,7 @@ "poll_button_no_perms_description": "Você não tem permissão para iniciar enquetes nesta sala.", "poll_button_no_perms_title": "Permissão necessária", "replying_title": "Em resposta a", + "room_unencrypted": "As mensagens nesta sala não estão criptografadas de ponta a ponta.", "room_upgraded_link": "A conversa continua aqui.", "room_upgraded_notice": "Esta sala foi substituída e não está mais ativa.", "send_button_title": "Enviar mensagem", @@ -717,6 +717,7 @@ "personal_space_description": "Um espaço privado para organizar suas salas", "private_description": "Somente para convidados, melhor para você ou para equipes", "private_heading": "O seu espaço privado", + "private_only_heading": "Seu espaço", "private_personal_description": "Certifique-se de que as pessoas certas tenham acesso a %(name)s", "private_personal_heading": "Com quem você está trabalhando?", "private_space": "Eu e meus colegas de equipe", @@ -967,7 +968,6 @@ "title": "Opção de recuperação removida", "warning": "Se você não excluiu a opção de recuperação, um invasor pode estar tentando acessar sua conta. Altere a senha da sua conta e defina imediatamente uma nova opção de recuperação nas Configurações." }, - "reset_all_button": "Esqueceu ou perdeu todos os métodos de recuperação? Redefinir tudo", "set_up_recovery": "Configurar a recuperação", "set_up_recovery_toast_description": "Gere uma chave de recuperação que possa ser usada para restaurar seu histórico de mensagens criptografadas caso você perca o acesso aos seus dispositivos.", "set_up_toast_title": "Configurar o backup online", @@ -990,16 +990,15 @@ "after_new_login": { "device_verified": "Dispositivo verificado", "skip_verification": "Ignorar a verificação por enquanto", - "unable_to_verify": "Não foi possível verificar este dispositivo", "verify_this_device": "Verifique este dispositivo" }, - "cancelled": "Você cancelou a confirmação.", - "cancelled_self": "Você cancelou a verificação em seu outro dispositivo.", - "cancelled_user": "%(displayName)s cancelou a confirmação.", "cancelling": "Cancelando…", + "cant_confirm": "Não consegue confirmar?", "complete_action": "Ok, entendi", "complete_description": "Você confirmou este usuário com sucesso.", "complete_title": "Confirmado!", + "confirm_identity_description": "Verifique este dispositivo para configurar as mensagens seguras", + "confirm_identity_title": "Confirme sua identidade", "error_starting_description": "Não foi possível iniciar um bate-papo com o outro usuário.", "error_starting_title": "Erro ao iniciar a verificação", "explainer": "As mensagens com este usuário estão protegidas com a criptografia de ponta a ponta e não podem ser lidas por terceiros.", @@ -1025,46 +1024,35 @@ "text": "Forneça o ID e a impressão digital de um de seus próprios dispositivos para verificá-lo. OBSERVE que isso permite que o outro dispositivo envie e receba mensagens como você. SE ALGUÉM LHE DISSE PARA COLAR ALGO AQUI, É PROVÁVEL QUE VOCÊ ESTEJA SENDO ENGANADO!", "wrong_fingerprint": "Não é possível verificar o dispositivo '%(deviceId)s' - a impressão digital fornecida '%(fingerprint)s' não corresponde à impressão digital do dispositivo, '%(fprint)s'" }, - "no_key_or_device": "Parece que você não tem uma chave de segurança ou qualquer outro dispositivo que possa ser verificado. Este dispositivo não poderá acessar mensagens criptografadas antigas. Para verificar sua identidade neste dispositivo, você precisará redefinir suas chaves de verificação.", "no_support_qr_emoji": "O dispositivo que você está tentando verificar não suporta a leitura de um código QR ou verificação de emoji, que é o que %(brand)s suporta. Tente com um cliente diferente.", "other_party_cancelled": "Seu contato cancelou a confirmação.", "prompt_encrypted": "Verifique todos os usuários em uma sala para se certificar de que ela está segura.", - "prompt_self": "Iniciar a confirmação novamente, após a notificação.", "prompt_unencrypted": "Em salas criptografadas, verifique todos os usuários para garantir a segurança.", - "prompt_user": "Iniciar a confirmação novamente, a partir do perfil deste usuário.", "qr_or_sas": "%(qrCode)s ou %(emojiCompare)s", - "qr_or_sas_header": "Verifique este dispositivo concluindo um dos seguintes procedimentos:", "qr_prompt": "Escaneie este código único", - "qr_reciprocate_same_shield_device": "Quase lá! O seu outro dispositivo está mostrando o mesmo escudo?", "qr_reciprocate_same_shield_user": "Quase lá! Este escudo também aparece para %(displayName)s?", - "request_toast_accept": "Verificar sessão", "request_toast_accept_user": "Verificar usuário", "request_toast_decline_counter": "Ignorar (%(counter)s)", "request_toast_detail": "%(deviceId)s de %(ip)s", - "reset_proceed_prompt": "Prosseguir com a reposição", "sas_caption_self": "Verifique este dispositivo confirmando que o seguinte número aparece em sua tela.", "sas_caption_user": "Confirme este usuário, comparando os números a seguir que serão exibidos na sua e na tela dele.", "sas_description": "Compare um conjunto único de emojis se você não tem uma câmera em nenhum dos dois aparelhos", - "sas_emoji_caption_self": "Confirme se os emojis abaixo são exibidos em ambos os dispositivos, na mesma ordem:", "sas_emoji_caption_user": "Confirme este usuário confirmando os emojis a seguir exibidos na tela dele.", "sas_match": "São coincidentes", "sas_no_match": "Elas não são correspondentes", "sas_prompt": "Comparar emojis únicos", "scan_qr": "Confirmar através de QR Code", "scan_qr_explainer": "Peça para %(displayName)s escanear o seu código:", - "self_verification_hint": "Para continuar, aceite a solicitação de verificação em seu outro dispositivo.", "start_button": "Iniciar confirmação", - "successful_device": "Você confirmou %(deviceName)s (%(deviceId)s) com êxito!", - "successful_own_device": "Você confirmou o seu aparelho com êxito!", "successful_user": "Você confirmou %(displayName)s com sucesso!", - "timed_out": "O tempo de confirmação se esgotou.", "unsupported_method": "Nenhuma opção de confirmação é suportada.", "unverified_session_toast_accept": "Sim, fui eu", "unverified_session_toast_title": "Novo login. Foi você?", "unverified_sessions_toast_description": "Revise para assegurar que sua conta está segura", "unverified_sessions_toast_reject": "Mais tarde", "unverified_sessions_toast_title": "Você tem sessões não verificadas", - "verification_description": "Verifique sua identidade para acessar mensagens criptografadas e provar sua identidade para outras pessoas.", + "use_another_device": "Usar outro dispositivo", + "use_recovery_key": "Usar chave de recuperação", "verification_dialog_title_device": "Verifique outro dispositivo", "verification_dialog_title_user": "Solicitação de confirmação", "verification_skip_warning": "Sem verificar, você não terá acesso a todas as suas mensagens e poderá aparecer como não confiável para outras pessoas.", @@ -1074,9 +1062,6 @@ "verify_emoji_prompt": "Confirmar comparando emojis únicos.", "verify_emoji_prompt_qr": "Se você não consegue escanear o código acima, confirme comparando emojis únicos.", "verify_later": "Vou verificar mais tarde", - "verify_using_device": "Verifique com outro dispositivo", - "verify_using_key": "Verifique com a chave de segurança", - "verify_using_key_or_phrase": "Verificar com chave de segurança ou frase", "waiting_for_user_accept": "Aguardando %(displayName)s aceitar…", "waiting_other_device": "Aguardando sua verificação em seu outro dispositivo…", "waiting_other_device_details": "Esperando que você verifique em seu outro dispositivo, %(deviceName)s (%(deviceId)s)...", @@ -1126,6 +1111,7 @@ "tls": "Não foi possível conectar ao Servidor de Base. Por favor, confira sua conectividade à internet, garanta que o certificado SSL do Servidor de Base é confiável, e que uma extensão do navegador não esteja bloqueando as requisições de rede.", "unknown": "Erro desconhecido", "unknown_error_code": "código de erro desconhecido", + "update_history_visibility": "Falha ao alterar a visibilidade do histórico", "update_power_level": "Não foi possível alterar o nível de permissão" }, "error_app_open_in_another_tab": "Mude para a outra guia para se conectar em %(brand)s. Essa guia agora pode ser fechada.", @@ -1366,6 +1352,10 @@ "name_email_mxid_share_space": "Convide alguém a partir do nome, endereço de e-mail, nome de usuário (como ) ou compartilhe este espaço.", "name_mxid_share_room": "Convide alguém a partir do nome ou nome de usuário (por exemplo: ) ou compartilhe esta sala.", "name_mxid_share_space": "Convide alguém a partir do nome, nome de usuário (como ) ou compartilhe este espaço.", + "progress": { + "dont_close": "Não feche o aplicativo até terminar.", + "preparing": "Preparando convites..." + }, "recents_section": "Conversas recentes", "room_failed_partial": "Nós enviamos aos outros, mas as pessoas abaixo não puderam ser convidadas para ", "room_failed_partial_title": "Alguns convites não puderam ser enviados", @@ -1871,11 +1861,6 @@ "other": "Você pode fixar até %(count)s widgets" }, "menu": "Abrir menu", - "release_announcement": { - "close": "OK", - "description": "Encontre todas as mensagens fixadas aqui. Passe o mouse sobre qualquer mensagem e selecione “Fixar” para adicioná-la.", - "title": "Todas as novas mensagens fixadas" - }, "reply_thread": "Responder a uma mensagem de discussão", "unpin_all": { "button": "Desfixar todas as mensagens", @@ -1916,6 +1901,7 @@ "thread_list": { "context_menu_label": "Opções de tópico" }, + "title": "Painel direito", "video_room_chat": { "title": "Bate-papo" } @@ -1996,7 +1982,9 @@ "inaccessible_subtitle_1": "Tente novamente mais tarde ou peça a um administrador de sala ou espaço para verificar se você tem acesso.", "inaccessible_subtitle_2": "%(errcode)s foi retornado ao tentar acessar a sala ou o espaço. Se você acha que está vendo essa mensagem por engano, envie uma comunicação de bug.", "intro": { + "display_topic": "Tópico ", "dm_caption": "Apenas vocês dois estão nesta conversa, a menos que algum de vocês convide mais alguém.", + "edit_topic": "Tópico: ( editar )", "enable_encryption_prompt": "Ative a criptografia nas configurações.", "encrypted_3pid_dm_pending_join": "Depois que todos entrarem, você poderá conversar", "no_avatar_label": "Adicione uma imagem para que as pessoas possam identificar facilmente sua sala.", @@ -2006,8 +1994,6 @@ "send_message_start_dm": "Envie sua primeira mensagem para convidar para conversar", "start_of_dm_history": "Este é o início do seu histórico da conversa com .", "start_of_room": "Este é o início de .", - "topic": "Descrição: %(topic)s ", - "topic_edit": "Descrição: %(topic)s (editar)", "unencrypted_warning": "Criptografia de ponta-a-ponta não está habilitada", "user_created": "%(displayName)s criou esta sala.", "you_created": "Você criou esta sala." @@ -2062,8 +2048,9 @@ "pinned_message_banner": { "button_close_list": "Fechar lista", "button_view_all": "Ver tudo", - "description": "Esta sala tem mensagens fixadas. Clique para visualizá-las.", - "go_to_message": "Veja a mensagem fixada no histórico.", + "description": "Mensagens fixadas", + "go_to_newest_message": "Veja a mensagem fixada na linha do tempo e a mensagem mais recente fixada aqui.", + "go_to_next_message": "Veja a mensagem fixada na linha do tempo e a mensagem mais antiga fixada aqui.", "title": "%(index)s de %(length)s mensagens fixadas" }, "read_topic": "Clique para ler o tópico", @@ -2172,6 +2159,26 @@ "one": "Atualmente removendo mensagens em %(count)s sala", "other": "Atualmente removendo mensagens em %(count)s salas" }, + "release_announcement": { + "done": "OK", + "filter": { + "description": "Filtre seus chats com um único clique. Expanda para ver mais filtros.", + "title": "Novos filtros rápidos" + }, + "intro": { + "description": "A lista de bate-papos foi atualizada pra ficar mais clara e fácil de usar.", + "title": "O Chats tem um novo visual!" + }, + "next": "Próximo", + "settings": { + "description": "Pra mostrar ou esconder as pré-visualizações das mensagens, vai em Todas as configurações > Preferências > Lista de salas", + "title": "Algumas configurações foram movidas" + }, + "sort": { + "description": "Mude a ordem das suas conversas de mais recente para A-Z.", + "title": "Classifique seus bate-papos" + } + }, "room": { "more_options": "Mais opções", "open_room": "Abrir sala %(roomName)s" @@ -2361,6 +2368,10 @@ "users_default": "Cargo padrão" }, "security": { + "cannot_change_to_private_due_to_missing_history_visiblity_permissions": { + "description": "Você não tem permissão para alterar a visibilidade do histórico da sala. Isso é perigoso, pois pode permitir que usuários que não participam da sala leiam as mensagens.", + "title": "Não dá pra tornar a sala privada" + }, "enable_encryption_confirm_description": "Uma vez ativada, a criptografia da sala não poderá ser desativada. Mensagens enviadas em uma sala criptografada não podem ser lidas pelo servidor, apenas pelos participantes da sala. Ativar a criptografia poderá impedir que vários bots e integrações funcionem corretamente. Saiba mais sobre criptografia.", "enable_encryption_confirm_title": "Ativar criptografia?", "enable_encryption_public_room_confirm_description_1": "Não é recomendado adicionar criptografia a salas públicas. Qualquer pessoa pode encontrar e ingressar em salas públicas, para que qualquer pessoa possa ler as mensagens nelas contidas. Você não obterá nenhum dos benefícios da criptografia e não poderá desativá-la mais tarde. Criptografar mensagens em uma sala pública tornará o recebimento e o envio de mensagens mais lento.", @@ -2378,7 +2389,7 @@ "history_visibility_joined": "Apenas participantes (desde que entraram na sala)", "history_visibility_legend": "Quem pode ler o histórico da sala?", "history_visibility_shared": "Apenas participantes (a partir do momento em que esta opção for selecionada)", - "history_visibility_warning": "Alterações em quem pode ler o histórico de conversas aplica-se apenas para mensagens futuras nesta sala. A visibilidade do histórico existente não será alterada.", + "history_visibility_warning": "A visibilidade do histórico existente não será alterada.", "history_visibility_world_readable": "Qualquer pessoa", "join_rule_description": "Decida quem pode entrar em %(roomName)s.", "join_rule_invite": "Privado (convite apenas)", @@ -2421,6 +2432,7 @@ "other": "Atualizando espaços... (%(progress)s de %(count)s)" }, "join_rule_upgrade_upgrading_room": "Atualizando sala", + "join_rule_world_readable_description": "Mudar quem pode entrar na sala também vai mudar a visibilidade das mensagens futuras.", "public_without_alias_warning": "Para criar um link para esta sala, antes adicione um endereço.", "publish_room": "Torne esta sala visível no diretório de salas públicas.", "publish_space": "Torne este espaço visível no diretório de salas públicas.", @@ -2559,6 +2571,7 @@ "breadcrumb_second_description": "Você perderá qualquer histórico de mensagens armazenado somente no servidor", "breadcrumb_third_description": "Você precisará verificar todos os seus dispositivos e contatos existentes novamente.", "breadcrumb_title": "Tem certeza de que deseja redefinir sua identidade?", + "breadcrumb_title_cant_confirm": "Você precisa redefinir sua identidade", "breadcrumb_title_forgot": "Esqueceu sua chave de recuperação? Você precisará redefinir sua identidade.", "breadcrumb_title_sync_failed": "Falha ao sincronizar o armazenamento de chaves. Você precisa redefinir sua identidade.", "breadcrumb_warning": "Faça isso somente se você acreditar que sua conta foi comprometida.", @@ -3752,8 +3765,8 @@ "other": "%(severalUsers)salterado o mensagens fixadas para a sala %(count)s vezes" }, "redacted": { - "one": "%(oneUser)sremoveu uma mensagem", - "other": "%(oneUser)sremoveu %(count)s mensagens" + "one": "%(oneUser)s removeu uma mensagem", + "other": "%(oneUser)s removeu %(count)s mensagens" }, "redacted_multiple": { "one": "%(severalUsers)s removeu uma mensagem", @@ -3959,6 +3972,7 @@ "connection_lost": "A conectividade com o servidor foi perdida", "connection_lost_description": "Você não pode fazer chamadas sem uma conexão com o servidor.", "consulting": "Consultar com %(transferTarget)s. Tranferir para %(transferee)s", + "decline_call": "Recusar", "default_device": "Aparelho padrão", "dial": "Discar", "dialpad": "Teclado de discagem", @@ -4010,6 +4024,7 @@ "show_sidebar_button": "Exibir a barra lateral", "silence": "Silenciar chamado", "silenced": "Notificações silenciadas", + "skip_lobby_toggle_option": "Junte-se imediatamente", "start_screenshare": "Começar a compartilhar sua tela", "stop_screenshare": "Parar de compartilhar sua tela", "too_many_calls": "Muitas chamadas", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 84fe0068eb..d8bfde4fc9 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -601,7 +601,6 @@ "user": "Пользователь", "user_avatar": "Аватар", "username": "Имя пользователя", - "verification_cancelled": "Подтверждение отменено", "verified": "Заверено", "version": "Версия", "video": "Видео", @@ -969,7 +968,6 @@ "title": "Метод восстановления удален", "warning": "Если вы не убрали метод восстановления, злоумышленник может получить доступ к вашей учётной записи. Смените пароль учётной записи и сразу задайте новый способ восстановления в настройках." }, - "reset_all_button": "Забыли или потеряли все варианты восстановления? Сбросить всё", "set_up_recovery": "Настроить восстановление", "set_up_recovery_toast_description": "Создайте ключ восстановления, который можно использовать для восстановления зашифрованной истории сообщений в случае потери доступа к своим устройствам.", "set_up_toast_title": "Настроить безопасное резервное копирование", @@ -992,12 +990,8 @@ "after_new_login": { "device_verified": "Сеанс заверен", "skip_verification": "Пока пропустить проверку", - "unable_to_verify": "Невозможно заверить этот сеанс", "verify_this_device": "Заверьте этот сеанс" }, - "cancelled": "Вы отменили подтверждение.", - "cancelled_self": "Вы отменили проверку на другом устройстве.", - "cancelled_user": "%(displayName)s отменил(а) подтверждение.", "cancelling": "Отмена…", "complete_action": "Понятно", "complete_description": "Вы успешно подтвердили этого пользователя.", @@ -1026,46 +1020,33 @@ "success_title": "Проверка прошла успешно", "text": "Предоставьте идентификатор и отпечаток пальца одного из ваших устройств, чтобы подтвердить это. ПРИМЕЧАНИЕ. Это позволяет другому устройству отправлять и получать сообщения так же, как и вы. ЕСЛИ КТО-ТО СКАЗАЛ ВАМ ЧТО-ТО ВСТАВИТЬ СЮДА, СКОРЕЕ ВСЕГО, ВАС ОБМАНУЛИ!" }, - "no_key_or_device": "Похоже, у вас нет Ключа Восстановления, или других сеансов, с которыми вы могли бы свериться. В этом сеансе вы не сможете получить доступ к старым зашифрованным сообщениям. Чтобы подтвердить свою личность в этом сеансе, вам нужно будет сбросить свои ключи шифрования.", "no_support_qr_emoji": "Устройство, которое вы пытаетесь проверить, не поддерживает сканирование QR-кода или проверку смайликов, которые поддерживает %(brand)s. Попробуйте использовать другой клиент.", "other_party_cancelled": "Другая сторона отменила проверку.", "prompt_encrypted": "Подтвердите всех пользователей в комнате, чтобы обеспечить безопасность.", - "prompt_self": "Начните подтверждение заново с уведомления.", "prompt_unencrypted": "В зашифрованных комнатах, проверьте всех пользователей, чтобы убедиться в их безопасности.", - "prompt_user": "Начните подтверждение заново в профиле пользователя.", "qr_or_sas": "%(qrCode)s или %(emojiCompare)s", - "qr_or_sas_header": "Заверьте этот сеанс, выполнив одно из следующих действий:", "qr_prompt": "Отсканируйте этот уникальный код", - "qr_reciprocate_same_shield_device": "Почти готово! На другом устройстве отображается такой же щит?", "qr_reciprocate_same_shield_user": "Почти готово! Отображает ли %(displayName)s такой же щит?", - "request_toast_accept": "Проверка сеанса", "request_toast_accept_user": "Подтвердить пользователя", "request_toast_decline_counter": "Игнорировать (%(counter)s)", "request_toast_detail": "%(deviceId)s с %(ip)s", - "reset_proceed_prompt": "Выполнить сброс", "sas_caption_self": "Проверьте это устройство, убедившись, что на его экране отображается следующее число.", "sas_caption_user": "Подтвердите пользователя, убедившись, что на его экране отображается следующее число.", "sas_description": "Сравните уникальный набор смайликов, если у вас нет камеры ни на одном из устройств", - "sas_emoji_caption_self": "Убедитесь, что приведённые ниже смайлики отображаются в обоих сеансах в одинаковом порядке:", "sas_emoji_caption_user": "Проверьте собеседника, убедившись, что на его экране отображаются следующие символы (смайлы).", "sas_match": "Они совпадают", "sas_no_match": "Они не совпадают", "sas_prompt": "Сравнитe уникальныe смайлики", "scan_qr": "Подтверждение сканированием", "scan_qr_explainer": "Попросите %(displayName)s отсканировать ваш код:", - "self_verification_hint": "Чтобы продолжить, пожалуйста, примите запрос на сверку в другом сеансе.", "start_button": "Начать проверку", - "successful_device": "Вы успешно подтвердили %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "Вы успешно подтвердили это устройство!", "successful_user": "Вы успешно подтвердили %(displayName)s!", - "timed_out": "Таймаут подтверждения.", "unsupported_method": "Невозможно определить поддерживаемый метод верификации.", "unverified_session_toast_accept": "Да, это я", "unverified_session_toast_title": "Новый вход в вашу учётную запись. Это были Вы?", "unverified_sessions_toast_description": "Проверьте, чтобы убедиться, что ваша учётная запись в безопасности", "unverified_sessions_toast_reject": "Позже", "unverified_sessions_toast_title": "У вас есть незаверенные сеансы", - "verification_description": "Подтвердите свою личность, чтобы получить доступ к зашифрованным сообщениям и подтвердить свою личность другим. Если вы также используете мобильное устройство, откройте приложение там, прежде чем продолжить.", "verification_dialog_title_device": "Проверить другое устройство", "verification_dialog_title_user": "Запрос на сверку", "verification_skip_warning": "Без проверки вы не сможете получить доступ ко всем своим сообщениям и можете показаться другим людям недоверенным.", @@ -1075,9 +1056,6 @@ "verify_emoji_prompt": "Подтверждение сравнением уникальных смайлов.", "verify_emoji_prompt_qr": "Если вы не можете отсканировать код выше, попробуйте сравнить уникальные смайлы.", "verify_later": "Я заверю позже", - "verify_using_device": "Сверить с другим сеансом", - "verify_using_key": "Подтвердить Ключом Восстановления", - "verify_using_key_or_phrase": "Проверка с помощью Ключа или Фразы Восстановления", "waiting_for_user_accept": "Ожидание принятия от %(displayName)s…", "waiting_other_device": "Ожидает проверки на другом устройстве…", "waiting_other_device_details": "Ожидает проверки на другом устройстве, %(deviceName)s (%(deviceId)s)…", @@ -1868,11 +1846,6 @@ "other": "Вы можете закрепить не более %(count)s виджетов" }, "menu": "Открыть меню", - "release_announcement": { - "close": "Ок", - "description": "Все прикрепленные сообщения можно найти здесь. Наведите курсор на любое сообщение и нажмите «Закрепить», чтобы добавить его.", - "title": "Все новые закрепленные сообщения" - }, "reply_thread": "Ответ на сообщение в обсуждениях", "unpin_all": { "button": "Открепить все сообщения", @@ -2007,8 +1980,6 @@ "send_message_start_dm": "Отправьте свое первое сообщение, чтобы пригласить в чат", "start_of_dm_history": "Это начало вашей беседы с .", "start_of_room": "Это начало .", - "topic": "Тема: %(topic)s ", - "topic_edit": "Тема: %(topic)s (изменить)", "unencrypted_warning": "Сквозное шифрование не включено", "user_created": "%(displayName)s создал(а) эту комнату.", "you_created": "Вы создали эту комнату." @@ -2064,7 +2035,6 @@ "button_close_list": "Закрыть список", "button_view_all": "Посмотреть все", "description": "В этой комнате есть закрепленные сообщения. Нажмите, чтобы просмотреть их.", - "go_to_message": "Показать прикрепленное сообщение на временной шкале.", "title": "%(index)s из %(length)s Закрепленные сообщения" }, "read_topic": "Нажмите, чтобы увидеть тему", diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index 4ebb7bfda4..985a7396b6 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -605,7 +605,6 @@ "user": "Používateľ", "user_avatar": "Obrázok v profile", "username": "Meno používateľa", - "verification_cancelled": "Overovanie zrušené", "verified": "Overený", "version": "Verzia", "video": "Video", @@ -661,6 +660,7 @@ "poll_button_no_perms_description": "Nemáte povolenie spúšťať ankety v tejto miestnosti.", "poll_button_no_perms_title": "Vyžaduje sa povolenie", "replying_title": "Odpoveď", + "room_unencrypted": "Správy v tejto miestnosti nie sú end-to-end šifrované", "room_upgraded_link": "Konverzácia pokračuje tu.", "room_upgraded_notice": "Táto miestnosť bola nahradená a nie je viac aktívna.", "send_button_title": "Odoslať správu", @@ -976,7 +976,6 @@ "title": "Odstránený spôsob obnovenia", "warning": "Ak ste neodstránili spôsob obnovenia vy, je možné, že útočník sa pokúša dostať k vášmu účtu. Radšej si ihneď zmeňte vaše heslo a nastavte si nový spôsob obnovenia v Nastaveniach." }, - "reset_all_button": "Zabudli ste alebo ste stratili všetky metódy obnovy? Resetovať všetko", "set_up_recovery": "Nastaviť obnovenie", "set_up_recovery_toast_description": "Vytvorte kľúč na obnovenie, ktorý môžete použiť na obnovenie histórie šifrovaných správ v prípade straty prístupu k zariadeniam.", "set_up_toast_title": "Nastaviť bezpečné zálohovanie", @@ -999,12 +998,8 @@ "after_new_login": { "device_verified": "Zariadenie overené", "skip_verification": "Vynechať zatiaľ overovanie", - "unable_to_verify": "Nie je možné overiť toto zariadenie", "verify_this_device": "Overiť toto zariadenie" }, - "cancelled": "Zrušili ste overenie.", - "cancelled_self": "Zrušili ste overovanie na vašom druhom zariadení.", - "cancelled_user": "%(displayName)s zrušil/a overenie.", "cancelling": "Rušenie…", "complete_action": "Rozumiem", "complete_description": "Úspešne ste overili tohoto používateľa.", @@ -1034,46 +1029,33 @@ "text": "Na overenie zadajte ID a odtlačok jedného z vašich vlastných zariadení. POZNÁMKA: toto umožňuje druhému zariadeniu odosielať a prijímať správy ako vy. AK VÁM NIEKTO POVEDAL, ABY STE SEM NIEČO VLOŽILI, JE PRAVDEPODOBNÉ, ŽE IDE O PODVOD!", "wrong_fingerprint": "Nie je možné overiť zariadenie '%(deviceId)s' - dodaný odtlačok prsta '%(fingerprint)s' sa nezhoduje s odtlačkom prsta zariadenia, '%(fprint)s'" }, - "no_key_or_device": "Vyzerá to, že nemáte kľúč na obnovenie ani žiadne iné zariadenie, pomocou ktorého by ste to mohli overiť. Toto zariadenie nebude mať prístup k starým zašifrovaným správam. Ak chcete overiť svoju totožnosť na tomto zariadení, budete musieť obnoviť svoje overovacie kľúče.", "no_support_qr_emoji": "Zariadenie, ktoré sa snažíte overiť, nepodporuje overenie skenovaním QR kódu ani overenie pomocou emotikonov, ktoré podporuje aplikácia %(brand)s. Skúste použiť iného klienta.", "other_party_cancelled": "Proti strana zrušila overovanie.", "prompt_encrypted": "Overte všetkých používateľov v miestnosti, aby ste sa uistili, že je zabezpečená.", - "prompt_self": "Znova spustiť overovanie z oznámenia.", "prompt_unencrypted": "V šifrovaných miestnostiach overte všetkých používateľov, aby ste zaistili ich bezpečnosť.", - "prompt_user": "Znova začnite overovanie z ich profilu.", "qr_or_sas": "%(qrCode)s alebo %(emojiCompare)s", - "qr_or_sas_header": "Overte toto zariadenie dokončením jednej z nasledujúcich možností:", "qr_prompt": "Naskenujte tento jedinečný kód", - "qr_reciprocate_same_shield_device": "Už je to takmer hotové! Zobrazuje vaše druhé zariadenie rovnaký štít?", "qr_reciprocate_same_shield_user": "Už je to takmer hotové! Zobrazuje sa %(displayName)s rovnaký štít?", - "request_toast_accept": "Overiť reláciu", "request_toast_accept_user": "Overiť používateľa", "request_toast_decline_counter": "Ignorovať (%(counter)s)", "request_toast_detail": "%(deviceId)s z %(ip)s", - "reset_proceed_prompt": "Pokračovať v obnovení", "sas_caption_self": "Overte toto zariadenie potvrdením, že sa na jeho obrazovke zobrazí nasledujúce číslo.", "sas_caption_user": "Overte tohoto používateľa tým, že zistíte, či sa na jeho obrazovke objaví nasledujúce číslo.", "sas_description": "Pokiaľ nemáte na svojich zariadeniach kameru, porovnajte jedinečnú kombináciu emotikonov", - "sas_emoji_caption_self": "Potvrďte, že nasledujúce emotikony sú zobrazené na oboch zariadeniach v rovnakom poradí:", "sas_emoji_caption_user": "Overte tohto používateľa potvrdením, že sa na jeho obrazovke zobrazujú nasledujúce emotikony.", "sas_match": "Zhodujú sa", "sas_no_match": "Nezhodujú sa", "sas_prompt": "Porovnajte jedinečnú kombináciu emotikonov", "scan_qr": "Overte naskenovaním", "scan_qr_explainer": "Požiadajte %(displayName)s, aby naskenoval váš kód:", - "self_verification_hint": "Ak chcete pokračovať, prijmite žiadosť o overenie na vašom druhom zariadení.", "start_button": "Spustiť overovanie", - "successful_device": "Úspešne ste overili %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "Úspešne ste overili svoje zariadenie!", "successful_user": "Úspešne ste overili %(displayName)s!", - "timed_out": "Čas overovania vypršal.", "unsupported_method": "Nie je možné nájsť podporovanú metódu overenia.", "unverified_session_toast_accept": "Áno, bol som to ja", "unverified_session_toast_title": "Nové prihlásenie. Boli ste to vy?", "unverified_sessions_toast_description": "Skontrolujte, či je vaše konto bezpečné", "unverified_sessions_toast_reject": "Neskôr", "unverified_sessions_toast_title": "Máte neoverené relácie", - "verification_description": "Overte svoju totožnosť, aby ste mali prístup k zašifrovaným správam a potvrdili svoju totožnosť ostatným. Ak používate aj mobilné zariadenie, otvorte aplikáciu predtým, ako budete pokračovať.", "verification_dialog_title_device": "Overenie iného zariadenia", "verification_dialog_title_user": "Žiadosť o overenie", "verification_skip_warning": "Bez overenia nebudete mať prístup ku všetkým svojim správam a pre ostatných sa môžete javiť ako nedôveryhodní.", @@ -1083,9 +1065,6 @@ "verify_emoji_prompt": "Overenie porovnaním jedinečnej kombinácie emotikonov.", "verify_emoji_prompt_qr": "Ak sa vám nepodarí naskenovať uvedený kód, overte pomocou porovnania jedinečných emotikonov.", "verify_later": "Overím to neskôr", - "verify_using_device": "Overiť pomocou iného zariadenia", - "verify_using_key": "Overiť pomocou kľúča na obnovenie", - "verify_using_key_or_phrase": "Overiť pomocou kľúča na obnovenie alebo frázy", "waiting_for_user_accept": "Čaká sa, kým to %(displayName)s prijme…", "waiting_other_device": "Čaká sa na overenie na vašom druhom zariadení…", "waiting_other_device_details": "Čaká sa na overenie na vašom druhom zariadení, %(deviceName)s (%(deviceId)s)…", @@ -1380,6 +1359,10 @@ "name_email_mxid_share_space": "Pozvite niekoho pomocou jeho mena, e-mailovej adresy, používateľského mena (napríklad ) alebo zdieľajte tento priestor.", "name_mxid_share_room": "Pozvite niekoho pomocou jeho mena, používateľského mena (napríklad ) alebo zdieľate túto miestnosť.", "name_mxid_share_space": "Pozvite niekoho pomocou jeho mena, používateľského mena (napríklad ) alebo zdieľajte tento priestor.", + "progress": { + "dont_close": "Nezatvárajte aplikáciu, kým nie je proces dokončený.", + "preparing": "Príprava pozvánok..." + }, "recents_section": "Nedávne konverzácie", "room_failed_partial": "Ostatným sme pozvánky poslali, ale nižšie uvedené osoby nemohli byť pozvané do ", "room_failed_partial_title": "Niektoré pozvánky nebolo možné odoslať", @@ -1782,6 +1765,7 @@ }, "power_level": { "admin": "Správca", + "creator": "Vlastník", "custom": "Vlastný (%(level)s)", "custom_level": "Vlastná úroveň", "default": "Predvolené", @@ -1892,11 +1876,6 @@ "other": "Môžete pripnúť iba %(count)s widgetov" }, "menu": "Otvoriť ponuku", - "release_announcement": { - "close": "Ok", - "description": "Všetky pripnuté správy nájdete tu. Prejdite na ľubovoľnú správu a výberom možnosti \"Pripnúť\" ju pridajte.", - "title": "Všetky nové pripnuté správy" - }, "reply_thread": "Odpoveď na vlákno správy", "unpin_all": { "button": "Zrušiť pripnutie všetkých správ", @@ -1940,6 +1919,7 @@ "thread_list": { "context_menu_label": "Možnosti vlákna" }, + "title": "Pravý panel", "video_room_chat": { "title": "Konverzácia" } @@ -2033,8 +2013,6 @@ "send_message_start_dm": "Odošlite svoju prvú správu a pozvite do konverzácie", "start_of_dm_history": "Toto je začiatok histórie vašich priamych správ s používateľom .", "start_of_room": "Toto je začiatok miestnosti .", - "topic": "Téma: %(topic)s ", - "topic_edit": "Téma: %(topic)s (upraviť)", "unencrypted_warning": "End-to-end šifrovanie nie je zapnuté", "user_created": "%(displayName)s vytvoril túto miestnosť.", "you_created": "Túto miestnosť ste vytvorili vy." @@ -2090,7 +2068,6 @@ "button_close_list": "Zatvoriť zoznam", "button_view_all": "Zobraziť všetko", "description": "Táto miestnosť má pripnuté správy. Kliknutím ich zobrazíte.", - "go_to_message": "Zobraziť pripnuté správy na časovej osi.", "title": "%(index)s z %(length)s pripnutých správ" }, "read_topic": "Kliknutím si prečítate tému", @@ -3549,7 +3526,7 @@ "unknown": "%(senderDisplayName)s zmenil prístup hostí na %(rule)s" }, "m.room.history_visibility": { - "invited": "%(senderName)s sprístupnil budúcu históriu miestnosti pre všetkých členov, od kedy boli pozvaní.", + "invited": "%(senderName)s sprístupnil budúcu históriu miestnosti pre nových členov, od kedy boli pozvaní.", "joined": "%(senderName)s sprístupnil budúcu históriu miestnosti pre všetkých členov, od kedy vstúpili.", "shared": "%(senderName)s sprístupnil budúcu históriu miestnosti pre všetkých členov.", "unknown": "%(senderName)s sprístupnil budúcu históriu miestnosti neznámym (%(visibility)s).", diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 1d8e754612..47ae1adb59 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -504,7 +504,6 @@ "user": "Përdorues", "user_avatar": "Foto profili", "username": "Emër përdoruesi", - "verification_cancelled": "Verifikimi u anulua", "verified": "I verifikuar", "video_room": "Dhomë me video", "view_message": "Shihni mesazh", @@ -794,7 +793,6 @@ "title": "U hoq Metodë Rimarrje", "warning": "Nëse metodën e re të rimarrjeve s’e keni hequr ju, dikush mund të jetë duke u rrekur të hyjë në llogarinë tuaj. Ndryshoni menjëherë fjalëkalimin e llogarisë tuaj, te Rregullimet, dhe caktoni një metodë të re rimarrjesh." }, - "reset_all_button": "Harruat, ose humbët krejt metodat e rimarrjes? Riujdisini të gjitha", "set_up_toast_title": "Ujdisni Kopjeruajtje të Sigurt", "setup_secure_backup": { "explainer": "Kopjeruajini kyçet tuaj, përpara se të dilni, që të shmangni humbjen e tyre." @@ -813,12 +811,8 @@ "after_new_login": { "device_verified": "Pajisja u verifikua", "skip_verification": "Anashkaloje verifikimin hëpërhë", - "unable_to_verify": "S’arrihet të verifikohet kjo pajisje", "verify_this_device": "Verifikoni këtë pajisje" }, - "cancelled": "Anuluat verifikimin.", - "cancelled_self": "E anuluat verifikimin në pajisjen tuaj tjetër.", - "cancelled_user": "%(displayName)s anuloi verifikimin.", "cancelling": "Po anulohet…", "complete_action": "E Mora Vesh", "complete_description": "E verifikuat me sukses këtë përdorues.", @@ -833,45 +827,32 @@ "incoming_sas_dialog_waiting": "Po pritet ripohimi nga partneri…", "incoming_sas_user_dialog_text_1": "Verifikojeni këtë përdorues që t’i vihet shenjë si i besuar. Përdoruesit e besuar ju më tepër siguri kur përdorni mesazhe të fshehtëzuar skaj-më-skaj.", "incoming_sas_user_dialog_text_2": "Verifikimi i këtij përdoruesi do t’i vërë shenjë sesionit të tij si të besuar dhe sesionit tuaj si të besuar për ta.", - "no_key_or_device": "Duket sikur s’keni Kyç Sigurie ose ndonjë pajisje tjetër nga e cila mund të bëni verifikimin. Kjo pajisje s’do të jetë në gjendje të hyjë te mesazhe të dikurshëm të fshehtëzuar. Që të mund të verifikohet identiteti juaj në këtë pajisje, ju duhet të riujdisni kyçet tuaj të verifikimit.", "no_support_qr_emoji": "Pajisja që po provoni të verifikoni nuk mbulon skanim të një kodi QR, apo verifikim me emoji, çka janë ato që mbulohen prej %(brand)s. Provoni me një klient tjetër.", "other_party_cancelled": "Pala tjetër e anuloi verifikimin.", "prompt_encrypted": "Verifiko krejt përdoruesit në dhomë, për të garantuar se është e sigurt.", - "prompt_self": "Rifillo verifikimin prej njoftimit.", "prompt_unencrypted": "Në dhoma të fshehtëzuara, verifikoni krejt përdoruesit për të garantuar se është e sigurt.", - "prompt_user": "Rifillo verifikimin prej profilit të tyre.", "qr_or_sas": "%(qrCode)s ose %(emojiCompare)s", - "qr_or_sas_header": "Verifikoni këtë pajisje duke plotësuar një nga sa vijon:", "qr_prompt": "Skanoni këtë kod unik", - "qr_reciprocate_same_shield_device": "Thuajse mbaruam! A po shfaq pajisja juaj të njëjtën mburojë?", "qr_reciprocate_same_shield_user": "Thuaje mbërritëm! A shfaq %(displayName)s të njëjtën mburojë?", - "request_toast_accept": "Verifiko Sesion", "request_toast_decline_counter": "Shpërfill (%(counter)s)", "request_toast_detail": "%(deviceId)s prej %(ip)s", - "reset_proceed_prompt": "Vazhdo me rikthimin te parazgjedhjet", "sas_caption_self": "Verifikoni këtë pajisje duke ripohuar se numri vijues shfaqet në ekranin e saj.", "sas_caption_user": "Verifikojeni këtë përdorues duke ripohuar shfaqjen e numrit vijues në skenën e tyre.", "sas_description": "Krahasoni një grup unik emoji-sh, nëse s’keni kamera në njërën nga pajisjet", - "sas_emoji_caption_self": "Ripohoni se emoji-t më poshtë shfaqen në të dyja pajisjet, sipas të njëjtës radhë:", "sas_emoji_caption_user": "Verifikojeni këtë përdorues duke ripohuar shfaqjen e emoji-t vijues në skenën e tyre.", "sas_match": "Përputhen", "sas_no_match": "S’përputhen", "sas_prompt": "Krahasoni emoji unik", "scan_qr": "Verifikoje me skanim", "scan_qr_explainer": "Kërkojini %(displayName)s të skanojë kodin tuaj:", - "self_verification_hint": "Që të vazhdoni më tej, ju lutemi, pranoni në pajisjen tuaj tjetër kërkesën për verifikim.", "start_button": "Fillo Verifikimin", - "successful_device": "Keni verifikuar me sukses %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "E verifikuat me sukses pajisjen tuaj!", "successful_user": "E verifikuat me sukses %(displayName)s!", - "timed_out": "Verifikimit i mbaroi koha.", "unsupported_method": "S’arrihet të gjendet metodë verifikimi e mbuluar.", "unverified_session_toast_accept": "Po, unë qeshë", "unverified_session_toast_title": "Hyrje e re. Ju qetë?", "unverified_sessions_toast_description": "Shqyrtojeni për t’u siguruar se llogaria është e parrezik", "unverified_sessions_toast_reject": "Më vonë", "unverified_sessions_toast_title": "Keni sesioni të paverifikuar", - "verification_description": "Verifikoni identitetin tuaj që të hyhet në mesazhe të fshehtëzuar dhe t’u provoni të tjerëve identitetin tuaj.", "verification_dialog_title_device": "Verifikoni pajisje tjetër", "verification_dialog_title_user": "Kërkesë Verifikimi", "verification_skip_warning": "Pa e verifikuar, s’do të mund të hyni te krejt mesazhet tuaja dhe mund të dukeni jo i besueshëm për të tjerët.", @@ -881,9 +862,6 @@ "verify_emoji_prompt": "Verifikoje duke krahasuar emoji unik.", "verify_emoji_prompt_qr": "Nëse s’e skanoni dot kodin më sipër, verifikojeni duke krahasuar emoji unik.", "verify_later": "Do ta verifikoj më vonë", - "verify_using_device": "Verifikojeni me pajisje tjetër", - "verify_using_key": "Verifikoje me Kyç Sigurie", - "verify_using_key_or_phrase": "Verifikojeni me Kyç ose Frazë Sigurie", "waiting_for_user_accept": "Po pritet për %(displayName)s të pranojë…", "waiting_other_device": "Po pritet që ju të verifikoni në pajisjen tuaj tjetër…", "waiting_other_device_details": "Po pritet që ju të verifikoni në pajisjen tuaj tjetër, %(deviceName)s (%(deviceId)s)…", @@ -1663,8 +1641,6 @@ "send_message_start_dm": "Dërgoni mesazhin tuaj të parë për të ftuar në fjalosje ", "start_of_dm_history": "Ky është fillimi i historikut të mesazheve tuaja të drejtpërdrejta me .", "start_of_room": "Ky është fillimi i .", - "topic": "Temë: %(topic)s ", - "topic_edit": "Temë: %(topic)s (përpunojeni)", "unencrypted_warning": "Fshehtëzimi skaj-më-skaj s’është i aktivizuar", "user_created": "%(displayName)s krijoi këtë dhomë.", "you_created": "Krijuat këtë dhomë." diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 6f0871b751..f8ca960df8 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -598,7 +598,6 @@ "user": "Användare", "user_avatar": "Profilbild", "username": "Användarnamn", - "verification_cancelled": "Verifiering avbruten", "verified": "Verifierad", "version": "Version", "video": "Video", @@ -967,7 +966,6 @@ "title": "Återställningsmetod borttagen", "warning": "Om du inte tog bort återställningsmetoden kan en angripare försöka komma åt ditt konto. Byt ditt kontolösenord och ställ in en ny återställningsmetod omedelbart i inställningarna." }, - "reset_all_button": "Glömt eller förlorat alla återställningsalternativ? Återställ allt", "set_up_recovery": "Ställ in återställning", "set_up_recovery_toast_description": "Generera en återställningsnyckel som kan användas för att återställa din krypterade meddelandehistorik om du förlorar åtkomst till dina enheter.", "set_up_toast_title": "Ställ in säker säkerhetskopiering", @@ -990,12 +988,8 @@ "after_new_login": { "device_verified": "Enhet verifierad", "skip_verification": "Hoppa över verifiering för tillfället", - "unable_to_verify": "Kunde inte verifiera den här enheten", "verify_this_device": "Verifiera den här enheten" }, - "cancelled": "Du avbröt verifiering.", - "cancelled_self": "Du avbröt verifiering på din andra enhet.", - "cancelled_user": "%(displayName)s avbröt verifiering.", "cancelling": "Avbryter…", "complete_action": "Uppfattat", "complete_description": "Du har verifierat den här användaren.", @@ -1025,46 +1019,33 @@ "text": "Ange ID och fingeravtryck för en av dina egna enheter för att verifiera den. OBSERVERA att detta gör att den andra enheten kan skicka och ta emot meddelanden som om den vore du. OM NÅGON HAR BETT DIG ATT KLISTRA IN NÅGOT HÄR ÄR DET TROLIGT ATT DU BLIR LURAD!", "wrong_fingerprint": "Kunde inte verifiera enheten '%(deviceId)s' - det angivna fingeravtrycket '%(fingerprint)s' stämmer inte överens med enhetens fingeravtryck, '%(fprint)s'" }, - "no_key_or_device": "Det ser ut som att du inte har någon säkerhetsnyckel eller några andra enheter du kan verifiera mot. Den här enheten kommer inte kunna komma åt gamla krypterad meddelanden. För att verifiera din identitet på den här enheten så behöver du återställa dina verifieringsnycklar.", "no_support_qr_emoji": "Enheten du försöker verifiera stöder inte att skanna en QR-kod eller verifiera med emoji, vilket är var %(brand)s stöder. Pröva en annan klient.", "other_party_cancelled": "Den andra parten avbröt verifieringen.", "prompt_encrypted": "Verifiera alla användare i ett rum för att försäkra att det är säkert.", - "prompt_self": "Starta verifiering igen från aviseringen.", "prompt_unencrypted": "I krypterade rum, verifiera alla användare för att försäkra att det är säkert.", - "prompt_user": "Starta verifiering igen från deras profil.", "qr_or_sas": "%(qrCode)s eller %(emojiCompare)s", - "qr_or_sas_header": "Verifiera den här enheten genom att slutföra ett av följande:", "qr_prompt": "Skanna den här unika koden", - "qr_reciprocate_same_shield_device": "Nästan klar! Visar din andra enhet samma sköld?", "qr_reciprocate_same_shield_user": "Nästan klar! Visar %(displayName)s samma sköld?", - "request_toast_accept": "Verifiera session", "request_toast_accept_user": "Verifiera användare", "request_toast_decline_counter": "Ignorera (%(counter)s)", "request_toast_detail": "%(deviceId)s från %(ip)s", - "reset_proceed_prompt": "Fortsätt återställning", "sas_caption_self": "Verifiera den här enheten genom att bekräfta att det följande numret visas på dess skärm.", "sas_caption_user": "Verifiera den här användaren genom att bekräfta att följande nummer visas på deras skärm.", "sas_description": "Jämför en unik uppsättning emojier om du inte har en kamera på någon av enheterna", - "sas_emoji_caption_self": "Bekräfta att emojierna nedan visas på båda enheterna i samma ordning:", "sas_emoji_caption_user": "Verifiera den här användaren genom att bekräfta att följande emojier visas på deras skärm.", "sas_match": "De matchar", "sas_no_match": "De matchar inte", "sas_prompt": "Jämför unika emojier", "scan_qr": "Verifiera med skanning", "scan_qr_explainer": "Be %(displayName)s att skanna din kod:", - "self_verification_hint": "För att fortsätta, acceptera verifieringsförfrågan på din andra enhet.", "start_button": "Starta verifiering", - "successful_device": "Du har verifierat %(deviceName)s (%(deviceId)s) framgångsrikt!", - "successful_own_device": "Du har verifierat din enhet framgångsrikt!", "successful_user": "Du har verifierat %(displayName)s framgångsrikt!", - "timed_out": "Verifieringen löpte ut.", "unsupported_method": "Kunde inte hitta en verifieringsmetod som stöds.", "unverified_session_toast_accept": "Ja, det var jag", "unverified_session_toast_title": "Ny inloggning. Var det du?", "unverified_sessions_toast_description": "Granska för att försäkra dig om att ditt konto är säkert", "unverified_sessions_toast_reject": "Senare", "unverified_sessions_toast_title": "Du har overifierade sessioner", - "verification_description": "Verifiera din identitet för att komma åt krypterade meddelanden och bevisa din identitet för andra.", "verification_dialog_title_device": "Verifiera annan enhet", "verification_dialog_title_user": "Verifikationsförfrågan", "verification_skip_warning": "Om du inte verifierar så kommer du inte komma åt alla dina meddelanden och visas kanske som ej betrodd för andra.", @@ -1074,9 +1055,6 @@ "verify_emoji_prompt": "Verifiera genom att jämföra unika emojier.", "verify_emoji_prompt_qr": "Om du inte kan skanna koden ovan, verifiera genom att jämföra unika emojier.", "verify_later": "Jag verifierar senare", - "verify_using_device": "Verifiera med annan enhet", - "verify_using_key": "Verifiera med säkerhetsnyckel", - "verify_using_key_or_phrase": "Verifiera med säkerhetsnyckel eller -fras", "waiting_for_user_accept": "Väntar på att %(displayName)s ska acceptera…", "waiting_other_device": "Väntar på att du ska verifiera på din andra enhet…", "waiting_other_device_details": "Väntar på att du ska verifiera på din andra enhet, %(deviceName)s (%(deviceId)s)…", @@ -1366,6 +1344,10 @@ "name_email_mxid_share_space": "Bjud in någon med deras namn, e-postadress eller användarnamn (som ), eller dela det här rummet.", "name_mxid_share_room": "Bjud in någon med deras namn eller användarnamn (som ) eller dela det här rummet.", "name_mxid_share_space": "Bjud in någon med deras namn eller användarnamn (som ), eller dela det här utrymmet.", + "progress": { + "dont_close": "Stäng inte appen förrän det är klart.", + "preparing": "Förbereder inbjudningar …" + }, "recents_section": "Senaste konversationerna", "room_failed_partial": "Vi skickade de andra, men personerna nedan kunde inte bjudas in till ", "room_failed_partial_title": "Vissa inbjudningar kunde inte skickas", @@ -1763,6 +1745,7 @@ }, "power_level": { "admin": "Administratör", + "creator": "Ägare", "custom": "Anpassad (%(level)s)", "custom_level": "Anpassad nivå", "default": "Standard", @@ -1870,11 +1853,6 @@ "other": "Du kan bara fästa upp till %(count)s widgets" }, "menu": "Öppna menyn", - "release_announcement": { - "close": "OK", - "description": "Du hittar alla fästa meddelanden här. För muspekaren över ett meddelande och välj \"Fäst\" för att lägga till det.", - "title": "Alla nya fästa meddelanden" - }, "reply_thread": "Svara på ett trådmeddelande ", "unpin_all": { "button": "Lossa alla meddelanden", @@ -1915,6 +1893,7 @@ "thread_list": { "context_menu_label": "Trådalternativ" }, + "title": "Högerpanel", "video_room_chat": { "title": "Chatt" } @@ -2005,8 +1984,6 @@ "send_message_start_dm": "Skicka ditt första meddelande för att bjuda in att chatta", "start_of_dm_history": "Det här är början på din direktmeddelandehistorik med .", "start_of_room": "Det här är början på .", - "topic": "Ämne: %(topic)s ", - "topic_edit": "Ämne: %(topic)s (redigera)", "unencrypted_warning": "Totalsträckskryptering är inte aktiverat", "user_created": "%(displayName)s skapade det här rummet.", "you_created": "Du skapade det här rummet." @@ -2062,7 +2039,6 @@ "button_close_list": "Stäng listan", "button_view_all": "Visa alla", "description": "Det här rummet har fästa meddelanden. Klicka för att se dem.", - "go_to_message": "Visa det fästa meddelandet på tidslinjen.", "title": "%(index)s av %(length)s fästa meddelanden" }, "read_topic": "Klicka för att läsa ämne", diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 51072600c9..90fdb2e7a2 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -580,7 +580,6 @@ "user": "Kullanıcı", "user_avatar": "Profil resmi", "username": "Kullanıcı Adı", - "verification_cancelled": "Doğrulama iptal edildi", "verified": "Doğrulanmış", "version": "Versiyon", "video": "Video", @@ -930,7 +929,6 @@ "title": "Kurtarma Yöntemi Kaldırıldı", "warning": "Kurtarma yöntemini kaldırmadıysanız, bir saldırgan hesabınıza erişmeye çalışıyor olabilir. Hesap parolanızı değiştirin ve Ayarlar'da hemen yeni bir kurtarma yöntemi belirleyin." }, - "reset_all_button": "Tüm kurtarma yöntemlerini unuttunuz veya kaybettiniz mi? Tümünü sıfırla", "set_up_recovery": "Kurtarmayı ayarlayın", "set_up_recovery_toast_description": "Cihazlarınıza erişiminizi kaybetmeniz durumunda şifrelenmiş mesaj geçmişinizi geri yüklemek için kullanılabilecek bir kurtarma anahtarı oluşturun.", "set_up_toast_title": "Güvenli Yedekleme kur", @@ -951,12 +949,8 @@ "after_new_login": { "device_verified": "Cihaz doğrulandı", "skip_verification": "Şimdilik doğrulamayı atla", - "unable_to_verify": "Bu cihaz doğrulanamıyor", "verify_this_device": "Bu cihazı doğrulayın" }, - "cancelled": "Doğrulamayı iptal ettiniz.", - "cancelled_self": "Diğer cihazınızda doğrulamayı iptal ettiniz.", - "cancelled_user": "%(displayName)s doğrulamayı iptal etti.", "cancelling": "İptal ediliyor…", "complete_action": "Anlaşıldı", "complete_description": "Bu kullanıcıyı başarılı şekilde doğruladınız.", @@ -971,46 +965,33 @@ "incoming_sas_dialog_waiting": "Ortağın onaylaması bekleniyor…", "incoming_sas_user_dialog_text_1": "Güvenilir olarak işaretlemek için bu kullanıcıyı doğrulayın. Kullanıcılara güvenmek, uçtan uca şifrelenmiş mesajları kullanırken içinizin daha rahat olmasını sağlar.", "incoming_sas_user_dialog_text_2": "Bu kullanıcıyı doğrulamak, oturumlarını güvenilir olarak işaretleyecek ve ayrıca oturumunuzu onlar için güvenilir olarak işaretleyecektir.", - "no_key_or_device": "Görünüşe göre bir Güvenlik Anahtarınız veya doğrulama yapabileceğiniz başka bir cihazınız yok. Bu cihaz eski şifrelenmiş mesajlara erişemeyecek. Bu cihazda kimliğinizi doğrulamak için doğrulama anahtarlarınızı sıfırlamanız gerekir.", "no_support_qr_emoji": "Doğrulamaya çalıştığınız cihaz, %(brand)s tarafından desteklenen bir QR kodu taramayı veya emoji doğrulamasını desteklemiyor. Farklı bir istemciyle deneyin.", "other_party_cancelled": "Diğer taraf onaylamayı reddetti.", "prompt_encrypted": "Güvenli olduğuna emin olmak için odadaki tüm kullanıcıları onaylayın.", - "prompt_self": "Doğrulamayı bildirimden tekrar başlatın.", "prompt_unencrypted": "Şifrelenmiş odalarda, güvenli olduğundan emin olmak için tüm kullanıcıları doğrulayın.", - "prompt_user": "Doğrulamayı profillerinden tekrar başlatın.", "qr_or_sas": "%(qrCode)s veya %(emojiCompare)s", - "qr_or_sas_header": "Aşağıdakilerden birini tamamlayarak bu cihazı doğrulayın:", "qr_prompt": "Bu benzersiz kodu tarayın", - "qr_reciprocate_same_shield_device": "Az kaldı! Diğer cihazınız da aynı kalkanı gösteriyor mu?", "qr_reciprocate_same_shield_user": "Az kaldı! %(displayName)s aynı kalkanı mı gösteriyor?", - "request_toast_accept": "Oturumu Doğrula", "request_toast_accept_user": "Kullanıcıyı Doğrula", "request_toast_decline_counter": "Yoksay (%(counter)s)", "request_toast_detail": "%(ip)s 'den %(deviceId)s", - "reset_proceed_prompt": "Sıfırlama işlemine devam et", "sas_caption_self": "Ekranda aşağıdaki numaranın göründüğünü onaylayarak bu cihazı doğrulayın.", "sas_caption_user": "Aşağıdaki numaranın ekranlarında göründüğünü onaylayarak bu kullanıcıyı doğrulayın.", "sas_description": "Her iki cihazda da kamera yoksa benzersiz bir emoji setini karşılaştırın", - "sas_emoji_caption_self": "Aşağıdaki emojilerin her iki cihazda da aynı sırada görüntülendiğini onaylayın:", "sas_emoji_caption_user": "Aşağıdaki emojinin ekranlarında göründüğünü onaylayarak bu kullanıcıyı doğrulayın.", "sas_match": "Eşleşiyorlar", "sas_no_match": "Eşleşmiyorlar", "sas_prompt": "Benzersiz emoji karşılaştır", "scan_qr": "Taramayla doğrula", "scan_qr_explainer": "%(displayName)s den kodunuzu taramasını isteyin:", - "self_verification_hint": "Devam etmek için lütfen diğer cihazınızda doğrulama isteğini kabul edin.", "start_button": "Doğrulamayı Başlat", - "successful_device": "%(deviceName)s (%(deviceId)s) başarıyla doğruladınız!", - "successful_own_device": "Cihazınızı başarıyla doğruladınız!", "successful_user": "%(displayName)s başarıyla doğruladınız!", - "timed_out": "Doğrulama zaman aşımına uğradı.", "unsupported_method": "Desteklenen doğrulama yöntemi bulunamadı.", "unverified_session_toast_accept": "Evet, bendim.", "unverified_session_toast_title": "Yeni giriş. Bu siz miydiniz?", "unverified_sessions_toast_description": "Hesabınızın güvende olduğundan emin olmak için inceleyin", "unverified_sessions_toast_reject": "Sonra", "unverified_sessions_toast_title": "Doğrulanmamış oturumlarınız var", - "verification_description": "Şifreli mesajlara erişmek ve kimliğinizi başkalarına kanıtlamak için kimliğinizi doğrulayın. Ayrıca bir mobil cihaz kullanıyorsanız, devam etmeden önce lütfen mobilden uygulamayı açın.", "verification_dialog_title_device": "Diğer cihazı doğrulayın", "verification_dialog_title_user": "Doğrulama Talebi", "verification_skip_warning": "Doğrulama yapmazsanız, tüm mesajlarınıza erişemezsiniz ve başkalarına güvenilmez görünebilirsiniz.", @@ -1020,9 +1001,6 @@ "verify_emoji_prompt": "Eşsiz emoji eşleştirme ile doğrulama.", "verify_emoji_prompt_qr": "Yukarıdaki kodu tarayamıyorsanız benzersiz emojiyi karşılaştırarak doğrulayın.", "verify_later": "Daha sonra doğrulayacağım", - "verify_using_device": "Başka bir cihazla doğrula", - "verify_using_key": "Güvenlik Anahtarı ile Doğrula", - "verify_using_key_or_phrase": "Güvenlik Anahtarı veya İfadesiyle Doğrula", "waiting_for_user_accept": "%(displayName)s kullanıcısın onaylaması için bekleniliyor…", "waiting_other_device": "Diğer cihazınızda doğrulamanız bekleniyor...", "waiting_other_device_details": "Diğer cihazınızdan doğrulama beklenior, %(deviceName)s (%(deviceId)s)...", @@ -1806,11 +1784,6 @@ "other": "En fazla %(count)s widget'ı sabitleyebilirsiniz" }, "menu": "Menüyü aç", - "release_announcement": { - "close": "Tamam", - "description": "Sabitlenmiş tüm mesajları burada bulabilirsiniz. Herhangi bir mesajın üzerine gelin ve eklemek için \"Sabitle\"yi seçin.", - "title": "Tüm yeni sabitlenmiş mesajlar" - }, "reply_thread": "Mesaj dizisinde yanıtla", "unpin_all": { "button": "Tüm mesajların sabitlemesini kaldır", @@ -1940,8 +1913,6 @@ "send_message_start_dm": " adlı kişiyi sohbete davet etmek için ilk mesajınızı gönderin", "start_of_dm_history": "Bu ile olan direkt mesaj geçmişinizin başlangıcıdır.", "start_of_room": "Bu odasının başlangıcıdır.", - "topic": "Konu: %(topic)s ", - "topic_edit": "Konu: %(topic)s (düzenle)", "unencrypted_warning": "Uçtan uca şifreleme etkin değil", "user_created": "%(displayName)s bu odayı oluşturdu.", "you_created": "Bu odayı oluşturdunuz." @@ -1997,7 +1968,6 @@ "button_close_list": "Listeyi kapat", "button_view_all": "Tümünü görüntüle", "description": "Bu odada sabitlenmiş mesajlar var. Görüntülemek için tıklayın.", - "go_to_message": "Sabitlenmiş mesajı zaman çizelgesinde görüntüle.", "title": "%(index)s / %(length)s Sabitlenmiş mesajlar" }, "read_topic": "Başlığı okumak için tıklayın", diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index f147b33585..3a3d3f4843 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -600,7 +600,6 @@ "user": "Користувач", "user_avatar": "Зображення профілю", "username": "Ім'я користувача", - "verification_cancelled": "Звірка скасована", "verified": "Звірений", "version": "Версія", "video": "Відео", @@ -656,6 +655,7 @@ "poll_button_no_perms_description": "Ви не маєте дозволу створювати опитування в цій кімнаті.", "poll_button_no_perms_title": "Потрібен дозвіл", "replying_title": "Відповідання", + "room_unencrypted": "Повідомлення у цій кімнаті не захищено наскрізним шифруванням.", "room_upgraded_link": "Розмова триває тут.", "room_upgraded_notice": "Ця кімната була замінена і не є активною.", "send_button_title": "Надіслати повідомлення", @@ -970,7 +970,6 @@ "title": "Відновлювальний засіб було видалено", "warning": "Якщо ви не видаляли способу відновлення, ймовірно хтось намагається зламати ваш обліковий запис. Негайно змініть пароль до свого облікового запису й встановіть новий спосіб відновлення в налаштуваннях." }, - "reset_all_button": "Забули чи втратили всі способи відновлення? Скинути все", "set_up_recovery": "Налаштування відновлення", "set_up_recovery_toast_description": "Згенеруйте ключ відновлення, який можна використовувати для відновлення історії зашифрованих повідомлень у разі втрати доступу до своїх пристроїв.", "set_up_toast_title": "Налаштувати захищене резервне копіювання", @@ -993,12 +992,8 @@ "after_new_login": { "device_verified": "Пристрій звірено", "skip_verification": "На разі пропустити звірку", - "unable_to_verify": "Не вдалося звірити цей пристрій", "verify_this_device": "Звірити цей пристрій" }, - "cancelled": "Ви скасували звірку.", - "cancelled_self": "Ви скасували звірення на іншому пристрої.", - "cancelled_user": "%(displayName)s скасовує звірку.", "cancelling": "Скасування…", "complete_action": "Зрозуміло", "complete_description": "Ви успішно звірили цього користувача.", @@ -1028,46 +1023,33 @@ "text": "Надайте ID і цифровий відбиток одного з ваших пристроїв, щоб верифікувати його. ЗАУВАЖТЕ, це дозволяє іншому пристрою надсилати та отримувати повідомлення від вашого імені. ЯКЩО ХТОСЬ СКАЗАВ ВАМ ВСТАВИТИ ЩОСЬ СЮДИ, ШВИДШЕ ЗА ВСЕ, ВАС ОБМАНЮЮТЬ!", "wrong_fingerprint": "Не вдалося верифікувати пристрій '%(deviceId)s' - наданий цифровий відбиток '%(fingerprint)s' не збігається з відбитком пристрою, '%(fprint)s'" }, - "no_key_or_device": "Схоже, у вас немає ключа відновлення або будь-яких інших пристроїв, за допомогою яких ви можете виконати верифікацію. Цей пристрій не зможе отримати доступ до старих зашифрованих повідомлень. Щоб підтвердити свою ідентичність на цьому пристрої, вам потрібно буде скинути ключі верифікації.", "no_support_qr_emoji": "Пристрій, який ви намагаєтесь звірити, не підтримує сканування QR-коду або звірення за допомогою емоджі, що є підтримувані %(brand)s. Спробуйте використати інший клієнт.", "other_party_cancelled": "Друга сторона скасувала звірення.", "prompt_encrypted": "Звірте всіх користувачів у кімнаті, щоб забезпечити її захищеність.", - "prompt_self": "Почніть звірку заново зі сповіщення.", "prompt_unencrypted": "У зашифрованих кімнатах, звіряйте всіх користувачів, щоб спілкуватися було безпечно.", - "prompt_user": "Почніть звірку заново з їхнього профілю.", "qr_or_sas": "%(qrCode)s з %(emojiCompare)s", - "qr_or_sas_header": "Звірте цей пристрій одним із запропонованих способів:", "qr_prompt": "Скануйте цей унікальний код", - "qr_reciprocate_same_shield_device": "Майже готово! Чи показує інший пристрій такий самий щит?", "qr_reciprocate_same_shield_user": "Майже готово! Ваш %(displayName)s показує той самий щит?", - "request_toast_accept": "Звірити сеанс", "request_toast_accept_user": "Підтвердити користувача", "request_toast_decline_counter": "Ігнорувати (%(counter)s)", "request_toast_detail": "%(deviceId)s з %(ip)s", - "reset_proceed_prompt": "Продовжити скидання", "sas_caption_self": "Звірте цей пристрій, підтвердивши, що на екрані з'явилося це число.", "sas_caption_user": "Звірте справжність цього користувача, підтвердивши, що на екрані з'явилося таке число.", "sas_description": "Порівняйте унікальний набір емодзі якщо жоден ваш пристрій не має камери", - "sas_emoji_caption_self": "Переконайтеся, що наведені внизу емоджі показано на обох пристроях в однаковому порядку:", "sas_emoji_caption_user": "Звірте цього користувача підтвердженням того, що наступні емодзі з'являються на його екрані.", "sas_match": "Вони збігаються", "sas_no_match": "Вони не збігаються", "sas_prompt": "Порівняйте унікальні емодзі", "scan_qr": "Звірити скануванням", "scan_qr_explainer": "Попросіть %(displayName)s відсканувати ваш код:", - "self_verification_hint": "Щоб продовжити, прийміть запит підтвердження на вашому іншому пристрої.", "start_button": "Почати перевірку", - "successful_device": "Ви успішно звірили %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "Ви успішно звірили свій пристрій!", "successful_user": "Ви успішно звірили %(displayName)s!", - "timed_out": "Термін дії звірки завершився.", "unsupported_method": "Не вдалося знайти підтримуваний спосіб звірки.", "unverified_session_toast_accept": "Так, це я", "unverified_session_toast_title": "Новий вхід. Це були ви?", "unverified_sessions_toast_description": "Перевірте, щоб переконатися, що ваш обліковий запис у безпеці", "unverified_sessions_toast_reject": "Пізніше", "unverified_sessions_toast_title": "У вас є неперевірені сеанси", - "verification_description": "Верифікуйте свою особистість, щоб отримати доступ до зашифрованих повідомлень і довести свою справжність іншим. Якщо ви також використовуєте мобільний пристрій, відкрийте застосунок на ньому, перш ніж продовжити.", "verification_dialog_title_device": "Звірити інший пристрій", "verification_dialog_title_user": "Запит підтвердження", "verification_skip_warning": "До звірки ви матимете доступ не до всіх своїх повідомлень, а в інших ви можете позначатися недовіреними.", @@ -1077,9 +1059,6 @@ "verify_emoji_prompt": "Звірити порівнянням унікальних емодзі.", "verify_emoji_prompt_qr": "Якщо ви не можете сканувати зазначений код, звірте порівнянням унікальних емодзі.", "verify_later": "Звірю пізніше", - "verify_using_device": "Звірити за допомогою іншого пристрою", - "verify_using_key": "Верифікувати за допомогою ключа відновлення", - "verify_using_key_or_phrase": "Верифікувати за допомогою фрази або ключа відновлення", "waiting_for_user_accept": "Очікування згоди %(displayName)s…", "waiting_other_device": "Очікування вашої звірки на іншому пристрої…", "waiting_other_device_details": "Очікування вашої звірки на іншому пристрої, %(deviceName)s (%(deviceId)s)…", @@ -1369,6 +1348,10 @@ "name_email_mxid_share_space": "Запросіть когось за іменем, е-поштою, користувацьким іменем (вигляду ) чи поділіться цим простором.", "name_mxid_share_room": "Запросіть когось за іменем, користувацьким іменем (вигляду ) чи поділіться цією кімнатою.", "name_mxid_share_space": "Запросіть когось за іменем, користувацьким іменем (вигляду ) чи поділіться цим простором.", + "progress": { + "dont_close": "Не закривайте застосунок, доки не завершите.", + "preparing": "Приготування запрошень..." + }, "recents_section": "Недавні бесіди", "room_failed_partial": "Ми надіслали іншим, але вказаних людей, не вдалося запросити до ", "room_failed_partial_title": "Деякі запрошення неможливо надіслати", @@ -1876,11 +1859,6 @@ "other": "Закріпити можна до %(count)s віджетів" }, "menu": "Відкрити меню", - "release_announcement": { - "close": "Ok", - "description": "Усі закріплені повідомлення можна знайти тут. Наведіть курсор на будь-яке повідомлення і виберіть «Закріпити», щоб додати його.", - "title": "Усі нові закріплені повідомлення" - }, "reply_thread": "Відповісти в гілці повідомлення", "unpin_all": { "button": "Відкріпити всі повідомлення", @@ -2003,7 +1981,9 @@ "inaccessible_subtitle_1": "Повторіть спробу пізніше, або запитайте у кімнати або простору перевірку, чи маєте ви доступ.", "inaccessible_subtitle_2": "Під час спроби отримати доступ до кімнати або простору було повернено помилку %(errcode)s. Якщо ви думаєте, що ви бачите це повідомлення помилково, будь ласка, надішліть звіт про помилку.", "intro": { + "display_topic": "Тема: ", "dm_caption": "У цій розмові вас лише двоє, поки хтось із вас не запросить іще когось приєднатися.", + "edit_topic": "Тема: (змінити)", "enable_encryption_prompt": "Ввімкніть шифрування в налаштуваннях.", "encrypted_3pid_dm_pending_join": "Коли хтось приєднається, ви зможете спілкуватись", "no_avatar_label": "Додайте фото, щоб люди легко вирізняли вашу кімнату.", @@ -2013,8 +1993,6 @@ "send_message_start_dm": "Надішліть своє перше повідомлення, щоб запросити до бесіди", "start_of_dm_history": "Це початок історії вашого особистого спілкування з .", "start_of_room": "Це початок .", - "topic": "Тема: %(topic)s ", - "topic_edit": "Тема: %(topic)s (змінити)", "unencrypted_warning": "Наскрізне шифрування не ввімкнене", "user_created": "%(displayName)s створює цю кімнату.", "you_created": "Ви створили кімнату." @@ -2069,8 +2047,9 @@ "pinned_message_banner": { "button_close_list": "Закрити список", "button_view_all": "Подивитись все", - "description": "У цій кімнаті є закріплені повідомлення. Натисніть, щоб переглянути їх.", - "go_to_message": "Переглянути закріплене повідомлення у стрічці часу.", + "description": "Закріплені повідомлення", + "go_to_newest_message": "Перегляньте закріплене повідомлення у стрічці та найновіше закріплене повідомлення тут", + "go_to_next_message": "Перегляньте закріплене повідомлення у стрічці та наступне найдавніше закріплене повідомлення тут", "title": "%(index)s з %(length)s закріплених повідомлень" }, "read_topic": "Натисніть, щоб побачити тему", @@ -2180,6 +2159,26 @@ "one": "Триває видалення повідомлень в %(count)s кімнаті", "other": "Триває видалення повідомлень у %(count)s кімнатах" }, + "release_announcement": { + "done": "Готово", + "filter": { + "description": "Фільтруйте свої бесіди одним натиском. Розгорніть, щоб переглянути більше фільтрів.", + "title": "Нові швидкі фільтри" + }, + "intro": { + "description": "Список бесід оновлено, щоб користування ним стало зрозумілішим та простішим.", + "title": "Бесіди мають новий вигляд!" + }, + "next": "Далі", + "settings": { + "description": "Щоб переглянути або сховати попередній перегляд повідомлень, перейдіть до Усі налаштування > Параметри > Список кімнат", + "title": "Деякі налаштування переміщено" + }, + "sort": { + "description": "Змініть порядок бесід від найновіших до А-Я", + "title": "Впорядковуйте свої бесіди" + } + }, "room": { "more_options": "Інші опції", "open_room": "Відкрити кімнату %(roomName)s" @@ -3514,7 +3513,7 @@ "unknown": "%(senderDisplayName)s змінює гостьовий доступ на \"%(rule)s\"" }, "m.room.history_visibility": { - "invited": "%(senderName)s робить майбутню історію кімнати видимою для всіх учасників з моменту, коли вони приєдналися.", + "invited": "%(senderName)s робить майбутню історію кімнати видимою для всіх учасників від часу їхнього приєднання.", "joined": "%(senderName)s робить майбутню історію кімнати видимою для всіх учасників від часу їхнього приєднання.", "shared": "%(senderName)s робить майбутню історію видимою для всіх учасників кімнати.", "unknown": "%(senderName)s робить майбутню історію видимою для невідомого значення (%(visibility)s).", diff --git a/src/i18n/strings/vi.json b/src/i18n/strings/vi.json index 3dcdb06550..fb59d359c3 100644 --- a/src/i18n/strings/vi.json +++ b/src/i18n/strings/vi.json @@ -1,6 +1,8 @@ { "a11y": { + "emoji_picker": "Trình chọn biểu tượng cảm xúc", "jump_first_invite": "Chuyển đến lời mời đầu tiên.", + "message_composer": "Trình soạn tin nhắn", "n_unread_messages": { "one": "1 tin chưa đọc.", "other": "%(count)s tin nhắn chưa đọc." @@ -145,6 +147,7 @@ "enable_prompt": "Giúp cải thiện %(analyticsOwner)s", "learn_more": "Chia sẻ dữ liệu ẩn danh giúp chúng tôi xác định các sự cố. Không có thông tin cá nhân. Không có bên thứ ba. Tìm hiểu thêm", "privacy_policy": "Bạn có thể đọc tất cả các điều khoản của chúng tôi ở đây", + "pseudonymous_usage_data": "Giúp chúng tôi xác định các vấn đề và cải thiện%(analyticsOwner)s bằng cách chia sẻ dữ liệu sử dụng ẩn danh. Để hiểu cách mọi người sử dụng nhiều thiết bị, chúng tôi sẽ tạo một mã định danh ngẫu nhiên, được chia sẻ bởi các thiết bị của bạn.", "shared_data_heading": "Bất kỳ dữ liệu nào sau đây đều có thể được chia sẻ:" }, "auth": { @@ -383,6 +386,7 @@ "beta": "Thử nghiệm", "camera": "Máy ảnh", "cameras": "Máy quay", + "capabilities": "Khả năng", "copied": "Đã sao chép!", "credits": "Ghi công", "dark": "Tối", @@ -490,7 +494,6 @@ "user": "Người dùng", "user_avatar": "Ảnh đại diện", "username": "Tên đăng nhập", - "verification_cancelled": "Đã hủy xác thực", "verified": "Đã xác thực", "version": "Phiên bản", "video": "Truyền hình", @@ -640,6 +643,7 @@ "developer_mode": "Chế độ nhà phát triển", "developer_tools": "Những công cụ phát triển", "edit_setting": "Chỉnh sửa cài đặt", + "edit_values": "Chỉnh sửa giá trị", "empty_string": "", "event_content": "Nội dung sự kiện", "event_id": "Định danh (ID) sự kiện: %(eventId)s", @@ -649,19 +653,36 @@ "explore_room_account_data": "Xem thông tin tài khoản trong phòng", "explore_room_state": "Xem trạng thái phòng", "failed_to_find_widget": "Đã xảy ra lỗi khi tìm tiện ích widget này.", + "failed_to_load": "Không tải được.", + "failed_to_save": "Lưu cài đặt thất bại", "failed_to_send": "Không thể gửi sự kiện!", + "id": "ID: ", "invalid_json": "Không giống mã JSON hợp lệ.", "level": "Cấp độ", "low_bandwidth_mode": "Chế độ băng thông thấp", "low_bandwidth_mode_description": "Cần máy chủ nhà tương thích.", + "main_timeline": "Dòng thời gian chính", + "no_receipt_found": "Không tìm thấy biên lai", + "notification_state": "Trạng thái thông báo là %(notificationState)s ", "notifications_debug": "Gỡ lỗi thông báo", "number_of_users": "Số người dùng", "original_event_source": "Nguồn sự kiện ban đầu", "room_encrypted": "Phòng được mã hóa ✅", "room_id": "Định danh phòng: %(roomId)s", "room_not_encrypted": "Phòng không được mã hóa 🚨", + "room_notifications_dot": "Dấu chấm: ", + "room_notifications_highlight": "Nổi bật: ", + "room_notifications_last_event": "Sự kiện cuối:", + "room_notifications_sender": "Người gửi: ", + "room_notifications_thread_id": "ID luồng: ", + "room_notifications_total": "Tổng: ", + "room_notifications_type": "Loại: ", "room_status": "Trạng thái phòng", + "room_unread_status_count": { + "other": "Trạng thái phòng chưa đọc: %(status)s, số lượng: %(count)s" + }, "save_setting_values": "Lưu các giá trị cài đặt", + "see_history": "Xem lịch sử", "send_custom_account_data_event": "Gửi sự kiện tài khoản tùy chỉnh", "send_custom_room_account_data_event": "Gửi sự kiện tài khoản tùy chỉnh trong phòng", "send_custom_state_event": "Gửi sự kiện trạng thái tùy chỉnh", @@ -676,10 +697,16 @@ "settings_explorer": "Xem cài đặt", "show_hidden_events": "Hiện các sự kiện ẩn trong dòng thời gian", "state_key": "Chìa khóa trạng thái", + "thread_root_id": "ID luồng gốc: %(threadRootId)s", + "threads_timeline": "Dòng thời gian luồng", "title": "Công cụ phát triển", "toggle_event": "chuyển đổi sự kiện", "toolbox": "Hộp công cụ", "use_at_own_risk": "Giao diện người dùng này KHÔNG kiểm tra các loại giá trị. Sử dụng và hãy biết nguy cơ.", + "user_read_up_to": "Người dùng đọc lên tới: ", + "user_read_up_to_ignore_synthetic": "Người dùng đọc đến (ignoreSynthetic): ", + "user_read_up_to_private": "Người dùng đọc lên tới (m.read.private): ", + "user_read_up_to_private_ignore_synthetic": "Người dùng đọc lên tới (m.read.private; IgnoreSynthetic): ", "value": "Giá trị", "value_colon": "Giá trị:", "value_in_this_room": "Giá trị trong phòng này", @@ -755,7 +782,6 @@ "title": "Phương thức Khôi phục đã bị xóa", "warning": "Nếu bạn không xóa phương pháp khôi phục, kẻ tấn công có thể đang cố truy cập vào tài khoản của bạn. Thay đổi mật khẩu tài khoản của bạn và đặt phương pháp khôi phục mới ngay lập tức trong Cài đặt." }, - "reset_all_button": "Quên hoặc mất tất cả các phương pháp khôi phục? Đặt lại tất cả Reset all", "set_up_toast_title": "Thiết lập Sao lưu Bảo mật", "setup_secure_backup": { "explainer": "Sao lưu chìa khóa của bạn trước khi đăng xuất để tránh mất chúng." @@ -774,12 +800,8 @@ "after_new_login": { "device_verified": "Thiết bị được xác thực", "skip_verification": "Bỏ qua xác thực ngay bây giờ", - "unable_to_verify": "Không thể xác thực thiết bị này", "verify_this_device": "Xác thực thiết bị này" }, - "cancelled": "Bạn đã hủy xác thực.", - "cancelled_self": "Bạn đã hủy xác thực trên thiết bị khác của bạn.", - "cancelled_user": "%(displayName)s đã hủy xác thực.", "cancelling": "Đang hủy…", "complete_action": "Hiểu rồi", "complete_description": "Bạn đã xác thực thành công người dùng này.", @@ -794,45 +816,32 @@ "incoming_sas_dialog_waiting": "Đang đợi bên kia xác nhận…", "incoming_sas_user_dialog_text_1": "Xác thực người dùng này để đánh dấu họ là đáng tin cậy. Người dùng đáng tin cậy giúp bạn yên tâm hơn khi sử dụng các tin nhắn được mã hóa end-to-end.", "incoming_sas_user_dialog_text_2": "Việc xác thực người dùng này sẽ đánh dấu phiên của họ là đáng tin cậy và cũng đánh dấu phiên của bạn là đáng tin cậy đối với họ.", - "no_key_or_device": "Có vẻ như bạn không có Khóa Bảo mật hoặc bất kỳ thiết bị nào bạn có thể xác thực. Thiết bị này sẽ không thể truy cập vào các tin nhắn mã hóa cũ. Để xác minh danh tính của bạn trên thiết bị này, bạn sẽ cần đặt lại các khóa xác thực của mình.", "no_support_qr_emoji": "Thiết bị bạn đang cố xác thực không hỗ trợ quét mã QR hoặc xác minh biểu tượng cảm xúc, đó là những gì %(brand)s hỗ trợ. Hãy thử với một thiết bị đầu cuối khác.", "other_party_cancelled": "Người kia đã hủy xác thực.", "prompt_encrypted": "Xác thực tất cả người dùng trong một phòng để đảm bảo phòng đó an toàn.", - "prompt_self": "Bắt đầu xác thực lại từ thông báo.", "prompt_unencrypted": "Trong các phòng mã hóa, xác thực tất cả người dùng để đảm bảo an toàn.", - "prompt_user": "Bắt đầu xác thực lại từ hồ sơ của họ.", "qr_or_sas": "%(qrCode)s hay %(emojiCompare)s", - "qr_or_sas_header": "Xác thực thiết bị này bằng việc hoàn tất một trong các điều sau:", "qr_prompt": "Quét mã duy nhất này", - "qr_reciprocate_same_shield_device": "Sắp xong rồi! Có phải thiết bị khác của bạn hiển thị cùng một lá chắn không?", "qr_reciprocate_same_shield_user": "Sắp xong rồi! %(displayName)s có hiển thị cùng một lá chắn không?", - "request_toast_accept": "Xác thực phiên", "request_toast_decline_counter": "Ẩn (%(counter)s)", "request_toast_detail": "%(deviceId)s từ %(ip)s", - "reset_proceed_prompt": "Tiến hành đặt lại", "sas_caption_self": "Xác thực thiết bị này bằng việc xác nhận số sau đây xuất hiện trên màn hình của nó.", "sas_caption_user": "Xác thực người dùng này bằng cách xác nhận số xuất hiện trên màn hình của họ.", "sas_description": "So sánh một bộ biểu tượng cảm xúc độc đáo nếu bạn không có camera trên một trong hai thiết bị", - "sas_emoji_caption_self": "Xác nhận biểu tượng cảm xúc bên dưới được hiển thị trên cả hai thiết bị, theo cùng một thứ tự:", "sas_emoji_caption_user": "Xác thực người dùng này bằng cách xác nhận biểu tượng cảm xúc sau xuất hiện trên màn hình của họ.", "sas_match": "Chúng phù hợp", "sas_no_match": "Chúng không phù hợp", "sas_prompt": "So sánh biểu tượng cảm xúc độc đáo", "scan_qr": "Xác thực bằng cách quét", "scan_qr_explainer": "Yêu cầu %(displayName)s quét mã của bạn:", - "self_verification_hint": "Để tiến hành, vui lòng chấp nhận yêu cầu xác thực trên thiết bị khác của bạn.", "start_button": "Bắt đầu xác thực", - "successful_device": "Bạn đã xác minh thành công %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "Bạn đã xác minh thành công thiết bị của mình!", "successful_user": "Bạn đã xác thực thành công %(displayName)s!", - "timed_out": "Đã hết thời gian xác thực.", "unsupported_method": "Không thấy phương pháp xác thực nào được hỗ trợ.", "unverified_session_toast_accept": "Đó là tôi", "unverified_session_toast_title": "Đăng nhập mới. Đây có phải là bạn không?", "unverified_sessions_toast_description": "Xem lại để đảm bảo tài khoản của bạn an toàn", "unverified_sessions_toast_reject": "Để sau", "unverified_sessions_toast_title": "Bạn có các phiên chưa được xác thực", - "verification_description": "Xác thực danh tính của bạn để truy cập các tin nhắn được mã hóa và chứng minh danh tính của bạn với người khác.", "verification_dialog_title_device": "Xác thực thiết bị khác", "verification_dialog_title_user": "Yêu cầu xác thực", "verification_skip_warning": "Nếu không xác thực, bạn sẽ không thể truy cập vào tất cả tin nhắn của bạn và có thể hiển thị là không đáng tin cậy với những người khác.", @@ -842,9 +851,6 @@ "verify_emoji_prompt": "Xác thực bằng cách so sánh biểu tượng cảm xúc độc đáo.", "verify_emoji_prompt_qr": "Nếu bạn không thể quét mã ở trên, hãy xác thực bằng cách so sánh biểu tượng cảm xúc duy nhất.", "verify_later": "Tôi sẽ xác thực sau", - "verify_using_device": "Xác thực bằng thiết bị khác", - "verify_using_key": "Xác thực bằng Khóa Bảo mật", - "verify_using_key_or_phrase": "Xác thực bằng Khóa hoặc Chuỗi Bảo mật", "waiting_for_user_accept": "Đang chờ %(displayName)s chấp nhận…", "waiting_other_device": "Đang chờ bạn xác thực trên thiết bị khác của bạn…", "waiting_other_device_details": "Đang chờ bạn xác thực trên thiết bị khác của bạn, %(deviceName)s (%(deviceId)s)…", @@ -919,10 +925,13 @@ "user": "%(senderName)s đã bắt đầu một cuộc gọi", "you": "Bạn bắt đầu một cuộc gọi" }, + "m.emote": "* %(senderName)s %(emote)s", "m.reaction": { "user": "%(sender)s phản ứng %(reaction)s với %(message)s", "you": "Bạn phản ứng %(reaction)s với %(message)s" - } + }, + "m.sticker": "%(senderName)s: %(stickerName)s", + "m.text": "%(senderName)s: %(message)s" }, "export_chat": { "cancelled": "Đã hủy trích xuất", @@ -958,6 +967,7 @@ "format": "Định dạng", "from_the_beginning": "Ngày từ đầu", "generating_zip": "Tạo ZIP", + "html": "HTML", "html_title": "Dữ liệu được trích xuất", "include_attachments": "Bao gồm các đính kèm", "json": "JSON", @@ -1576,8 +1586,6 @@ "send_message_start_dm": "Gửi tin nhắn đầu tiên để mời vào cuộc trò chuyện", "start_of_dm_history": "Đây là phần bắt đầu của lịch sử tin nhắn trực tiếp của bạn với .", "start_of_room": "Đây là phần bắt đầu của .", - "topic": "Chủ đề: %(topic)s ", - "topic_edit": "Chủ đề: %(topic)s (edit)", "unencrypted_warning": "Mã hóa đầu-cuối chưa được bật", "user_created": "%(displayName)s đã tạo phòng này.", "you_created": "Bạn đã tạo phòng này." @@ -2024,7 +2032,9 @@ "deactivate_confirm_content_3": "Không ai có thể dùng lại tên người dùng của bạn (MXID), kể cả bạn: tên người dùng này sẽ trở thành không có sẵn", "deactivate_confirm_content_4": "Bạn sẽ rời tất cả phòng và tin nhắn trực tiếp mà bạn đã tham gia", "deactivate_confirm_content_5": "Bạn sẽ bị xóa khỏi máy chủ định danh: bạn bè của bạn sẽ không tìm thấy bạn bằng địa chỉ thư điện tử hay số điện thoại", + "deactivate_confirm_content_6": "Tin nhắn cũ của bạn vẫn sẽ hiển thị với những người đã nhận được chúng, giống như email bạn đã gửi trước đây. Bạn có muốn ẩn tin nhắn đã gửi của mình khỏi những người tham gia phòng trong tương lai không?", "deactivate_confirm_continue": "Xác nhận việc hủy kích hoạt tài khoản", + "deactivate_confirm_erase_label": "Ẩn tin nhắn của tôi với những người tham gia sau", "deactivate_section": "Hủy kích hoạt Tài khoản", "deactivate_warning": "Vô hiệu hóa tài khoản của bạn là vĩnh viễn — hãy cẩn trọng!", "discovery_email_empty": "Tùy chọn khám phá sẽ xuất hiện khi nào bạn đã thêm địa chỉ thư điện tử.", @@ -2115,6 +2125,9 @@ }, "notifications": { "default_setting_description": "Cài đặt này sẽ được áp dụng theo mặc định cho các tất cả các phòng của bạn.", + "email_description": "Nhận email tóm tắt các thông báo bị bỏ lỡ", + "email_section": "Tóm tắt email", + "email_select": "Chọn email bạn muốn gửi tóm tắt đến. Quản lý email của bạn trong .", "enable_audible_notifications_session": "Bật thông báo âm thanh cho phiên này", "enable_desktop_notifications_session": "Bật thông báo trên màn hình cho phiên này", "enable_email_notifications": "Bật thông báo qua thư điện tử cho %(email)s", @@ -2605,9 +2618,13 @@ "n_hours_ago": "%(num)s giờ trước", "n_minutes_ago": "%(num)s phút trước", "seconds_left": "Còn %(seconds)s giây", + "short_days": "%(value)sngày", "short_days_hours_minutes_seconds": "%(days)s ngày %(hours)s giờ %(minutes)s phút %(seconds)s giây", + "short_hours": "%(value)sgiờ", "short_hours_minutes_seconds": "%(hours)s giờ %(minutes)s phút %(seconds)s giây", - "short_minutes_seconds": "%(minutes)s phút %(seconds)s giây" + "short_minutes": "%(value)sphút", + "short_minutes_seconds": "%(minutes)s phút %(seconds)s giây", + "short_seconds": "%(value)sgiây" }, "timeline": { "context_menu": { @@ -2884,6 +2901,9 @@ "one": "đã bị cấm", "other": "đã bị cấm %(count)s lần" }, + "changed_avatar": { + "other": "%(oneUser)sđã thay đổi ảnh đại diện của họ%(count)s lần" + }, "changed_name": { "one": "%(oneUser)s đã thay đổi tên của họ", "other": "%(oneUser)s đã thay đổi tên của họ %(count)s lần" @@ -2892,6 +2912,7 @@ "one": "%(severalUsers)s đã thay đổi tên của họ", "other": "%(severalUsers)s đã thay đổi tên của họ %(count)s lần" }, + "format": "%(nameList)s%(transitionList)s", "hidden_event": { "other": "%(oneUser)sgửi %(count)s tin nhắn ẩn", "one": "%(oneUser)sgửi một tin nhắn ẩn" diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 1c0298d9f4..fa7b8bd074 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -506,7 +506,6 @@ "user": "用户", "user_avatar": "头像", "username": "用户名", - "verification_cancelled": "验证已取消", "verified": "已验证", "version": "版本", "video": "视频", @@ -765,7 +764,6 @@ "title": "恢复方式已移除", "warning": "如果你没有移除此恢复方式,可能有攻击者正试图侵入你的账户。请立即更改你的账户密码并在设置中设定一个新的恢复方式。" }, - "reset_all_button": "忘记或丢失了所有恢复方式?全部重置", "set_up_toast_title": "设置安全备份", "setup_secure_backup": { "explainer": "在登出之前请备份密钥以免丢失。" @@ -784,12 +782,8 @@ "after_new_login": { "device_verified": "设备已验证", "skip_verification": "暂时跳过验证", - "unable_to_verify": "无法验证此设备", "verify_this_device": "验证此设备" }, - "cancelled": "你取消了验证。", - "cancelled_self": "你在其他设备上取消了验证。", - "cancelled_user": "%(displayName)s 取消了验证。", "cancelling": "正在取消……", "complete_action": "收到", "complete_description": "你已成功验证此用户。", @@ -801,42 +795,30 @@ "incoming_sas_dialog_title": "收到验证请求", "incoming_sas_user_dialog_text_1": "验证此用户并将其标记为已信任。在收发端到端加密消息时,信任用户可让你更加放心。", "incoming_sas_user_dialog_text_2": "验证此用户会将其会话标记为已信任,与此同时,你的会话也会被此用户标记为已信任。", - "no_key_or_device": "看起来你没有安全密钥或者任何其他可以验证的设备。 此设备将无法访问旧的加密消息。为了在这个设备上验证你的身份,你需要重置你的验证密钥。", "no_support_qr_emoji": "你正在尝试验证的设备不支持扫码QR码或表情符号验证,这是%(brand)s所支持的。用不同的客户端试试。", "other_party_cancelled": "另一方取消了验证。", "prompt_encrypted": "验证房间中所有用户以确保其安全。", - "prompt_self": "请从提示重新开始验证。", "prompt_unencrypted": "在加密房间中,验证所有用户以确保其安全。", - "prompt_user": "请从对方资料重新开始验证。", "qr_or_sas": "%(qrCode)s或%(emojiCompare)s", - "qr_or_sas_header": "完成以下操作之一来验证此设备:", "qr_prompt": "扫描此唯一代码", - "qr_reciprocate_same_shield_device": "快完成了!你的其他设备显示相同盾牌吗?", "qr_reciprocate_same_shield_user": "快完成了!%(displayName)s 显示了同样的盾牌吗?", "request_toast_detail": "来自 %(ip)s 的 %(deviceId)s", - "reset_proceed_prompt": "进行重置", "sas_caption_self": "确认屏幕上出现以下数字,以验证设备。", "sas_caption_user": "通过在其屏幕上显示以下数字来验证此用户。", "sas_description": "若你在两个设备上都没有相机,比较唯一一组表情符号", - "sas_emoji_caption_self": "确认下面的表情符号在两个设备上以相同顺序显示:", "sas_emoji_caption_user": "通过在其屏幕上显示以下表情符号来验证此用户。", "sas_match": "它们匹配", "sas_no_match": "它们不匹配", "sas_prompt": "比较唯一表情符号", "scan_qr": "扫码验证", "scan_qr_explainer": "请 %(displayName)s 扫描你的代码:", - "self_verification_hint": "要继续进行,请接受你另一设备上的验证请求。", "start_button": "开始验证", - "successful_device": "你成功验证了 %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "你成功验证了你的设备!", "successful_user": "你成功验证了 %(displayName)s!", - "timed_out": "验证超时。", "unsupported_method": "无法找到支持的验证方法。", "unverified_session_toast_title": "现在登录。请问是你本人吗?", "unverified_sessions_toast_description": "检查以确保你的账户是安全的", "unverified_sessions_toast_reject": "稍后再说", "unverified_sessions_toast_title": "你有未验证的会话", - "verification_description": "验证你的身份来获取已加密的消息并向其他人证明你的身份。", "verification_dialog_title_device": "验证其他设备", "verification_dialog_title_user": "验证请求", "verification_skip_warning": "如果不进行验证,您将无法访问您的所有消息,并且在其他人看来可能不受信任。", @@ -846,9 +828,6 @@ "verify_emoji_prompt": "通过比较唯一的表情符号来验证。", "verify_emoji_prompt_qr": "如果你不能扫描以上代码,请通过比较唯一的表情符号来验证。", "verify_later": "我稍后进行验证", - "verify_using_device": "使用其他设备进行验证", - "verify_using_key": "使用安全密钥进行验证", - "verify_using_key_or_phrase": "使用安全密钥或短语进行验证", "waiting_for_user_accept": "正在等待%(displayName)s接受……", "waiting_other_device": "正等待你在其它设备上验证……", "waiting_other_device_details": "正等待你在其它设备上验证,%(deviceName)s(%(deviceId)s)……", @@ -1593,8 +1572,6 @@ "send_message_start_dm": "发送你的第一条消息邀请来聊天", "start_of_dm_history": "这是你与的私聊历史的开端。", "start_of_room": "这里是 的开始。", - "topic": "话题:%(topic)s ", - "topic_edit": "话题:%(topic)s(编辑)", "unencrypted_warning": "未启用端到端加密", "user_created": "%(displayName)s 创建了此房间。", "you_created": "你创建了此房间。" diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 1232457c63..2a08f3fb41 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -522,7 +522,6 @@ "user": "使用者", "user_avatar": "大頭照", "username": "使用者名稱", - "verification_cancelled": "驗證已取消", "verified": "已驗證", "version": "版本", "video": "影片", @@ -823,7 +822,6 @@ "title": "已移除復原方法", "warning": "如果您沒有移除復原方法,攻擊者可能會試圖存取您的帳號。請立刻在設定中變更您帳號的密碼並設定新的復原方式。" }, - "reset_all_button": "忘記或遺失了所有復原方法?重設全部", "set_up_toast_title": "設定安全備份", "setup_secure_backup": { "explainer": "請在登出前備份您的金鑰,以免遺失。" @@ -842,12 +840,8 @@ "after_new_login": { "device_verified": "裝置已驗證", "skip_verification": "暫時略過驗證", - "unable_to_verify": "無法驗證此裝置", "verify_this_device": "驗證此裝置" }, - "cancelled": "您取消了驗證。", - "cancelled_self": "您在其他裝置上取消了驗證。", - "cancelled_user": "%(displayName)s 取消驗證。", "cancelling": "正在取消…", "complete_action": "了解", "complete_description": "您已經成功驗證此使用者。", @@ -862,45 +856,32 @@ "incoming_sas_dialog_waiting": "正在等待夥伴確認…", "incoming_sas_user_dialog_text_1": "驗證此工作階段,並標記為可受信任。由您將工作階段標記為可受信任後,可讓聊天夥伴傳送端到端加密訊息時能更加放心。", "incoming_sas_user_dialog_text_2": "驗證此使用者將會把他們的工作階段標記為受信任,並同時為他們標記您的工作階段為可信任。", - "no_key_or_device": "您似乎沒有安全金鑰或其他可以驗證的裝置。此裝置將無法存取舊的加密訊息。為了在此裝置上驗證您的身分,您必須重設您的驗證金鑰。", "no_support_qr_emoji": "您正在嘗試驗證的裝置不支援掃描 QR Code 或表情符號驗證,這是 %(brand)s 所支援的。請嘗試使用其他客戶端。", "other_party_cancelled": "另一方取消了驗證。", "prompt_encrypted": "請驗證聊天室中的所有使用者來確保安全。", - "prompt_self": "從通知再次開始驗證。", "prompt_unencrypted": "在加密的聊天適中,驗證所有使用者以確保其安全。", - "prompt_user": "從他們的個人簡介再次開始驗證。", "qr_or_sas": "%(qrCode)s 或 %(emojiCompare)s", - "qr_or_sas_header": "透過完成以下的任何一個操作來驗證此裝置:", "qr_prompt": "掃描此獨特的條碼", - "qr_reciprocate_same_shield_device": "快好了!您的其他裝置是否顯示了相同的盾牌?", "qr_reciprocate_same_shield_user": "差不多了!%(displayName)s 是否顯示相同的盾牌?", - "request_toast_accept": "驗證工作階段", "request_toast_decline_counter": "忽略(%(counter)s)", "request_toast_detail": "從 %(ip)s 來的 %(deviceId)s", - "reset_proceed_prompt": "繼續重設", "sas_caption_self": "透過確認螢幕上顯示的以下數字來驗證裝置。", "sas_caption_user": "透過確認對方畫面上顯示的下列數字來確認使用者。", "sas_description": "如果兩個裝置上都沒有相機的話,就比較一組獨特的表情符號", - "sas_emoji_caption_self": "確認以下的表情符號以相同的順序顯示在兩台裝置上:", "sas_emoji_caption_user": "透過確認對方畫面上顯示的下列表情符號來確認使用者。", "sas_match": "它們相符", "sas_no_match": "它們不相符", "sas_prompt": "比較獨特的表情符號", "scan_qr": "透過掃描來驗證", "scan_qr_explainer": "要求 %(displayName)s 掃描您的條碼:", - "self_verification_hint": "要繼續,請在您的其他裝置上接受驗證請求。", "start_button": "開始驗證", - "successful_device": "您已成功驗證了 %(deviceName)s (%(deviceId)s)!", - "successful_own_device": "您已成功驗證您的裝置!", "successful_user": "您已成功驗證 %(displayName)s!", - "timed_out": "驗證逾時。", "unsupported_method": "找不到支援的驗證方式。", "unverified_session_toast_accept": "是的,是我", "unverified_session_toast_title": "新登入。這是您嗎?", "unverified_sessions_toast_description": "請確認您的帳號安全", "unverified_sessions_toast_reject": "稍後", "unverified_sessions_toast_title": "您有未驗證的工作階段", - "verification_description": "驗證您的身分來存取已加密的訊息並對其他人證明您的身分。", "verification_dialog_title_device": "驗證其他裝置", "verification_dialog_title_user": "驗證請求", "verification_skip_warning": "如果不進行驗證,您將無法存取您的所有訊息,且可能會被其他人視為不信任。", @@ -910,9 +891,6 @@ "verify_emoji_prompt": "透過比對獨特的表情符號來進行驗證。", "verify_emoji_prompt_qr": "如果您無法掃描上面的條碼,請透過比較獨特的表情符號驗證。", "verify_later": "我稍後驗證", - "verify_using_device": "用另一台裝置驗證", - "verify_using_key": "使用安全金鑰進行驗證", - "verify_using_key_or_phrase": "使用安全金鑰或密語進行驗證", "waiting_for_user_accept": "正在等待 %(displayName)s 接受…", "waiting_other_device": "正在等待您在其他裝置上驗證…", "waiting_other_device_details": "正在等待您在其他裝置上驗證,%(deviceName)s (%(deviceId)s)…", @@ -1726,8 +1704,6 @@ "send_message_start_dm": "傳送您的第一則訊息以邀請 來聊天", "start_of_dm_history": "這是您與 私人訊息紀錄的開頭。", "start_of_room": "這是 的開頭。", - "topic": "主題:%(topic)s ", - "topic_edit": "主題:%(topic)s(編輯)", "unencrypted_warning": "端對端加密未啟用", "user_created": "%(displayName)s 建立了此聊天室。", "you_created": "您建立了此聊天室。" diff --git a/src/integrations/IntegrationManagers.ts b/src/integrations/IntegrationManagers.ts index 6d8ab69ccc..7c2fc48adc 100644 --- a/src/integrations/IntegrationManagers.ts +++ b/src/integrations/IntegrationManagers.ts @@ -13,7 +13,7 @@ import SdkConfig from "../SdkConfig"; import Modal from "../Modal"; import { IntegrationManagerInstance, Kind } from "./IntegrationManagerInstance"; import IntegrationsImpossibleDialog from "../components/views/dialogs/IntegrationsImpossibleDialog"; -import IntegrationsDisabledDialog from "../components/views/dialogs/IntegrationsDisabledDialog"; +import { IntegrationsDisabledDialog } from "../components/views/dialogs/IntegrationsDisabledDialog"; import WidgetUtils from "../utils/WidgetUtils"; import { MatrixClientPeg } from "../MatrixClientPeg"; diff --git a/src/models/Call.ts b/src/models/Call.ts index df22abc9bd..356aef1f3b 100644 --- a/src/models/Call.ts +++ b/src/models/Call.ts @@ -23,14 +23,12 @@ import { type IWidgetApiRequest, type ClientWidgetApi, type IWidgetData } from " import { type MatrixRTCSession, MatrixRTCSessionEvent, - type CallMembership, MatrixRTCSessionManagerEvents, } from "matrix-js-sdk/src/matrixrtc"; import type EventEmitter from "events"; import type { IApp } from "../stores/WidgetStore"; import SettingsStore from "../settings/SettingsStore"; -import MediaDeviceHandler, { MediaDeviceKindEnum } from "../MediaDeviceHandler"; import { timeout } from "../utils/promise"; import WidgetUtils from "../utils/WidgetUtils"; import { WidgetType } from "../widgets/WidgetType"; @@ -40,13 +38,11 @@ import { WidgetMessagingStore, WidgetMessagingStoreEvent } from "../stores/widge import ActiveWidgetStore, { ActiveWidgetStoreEvent } from "../stores/ActiveWidgetStore"; import { getCurrentLanguage } from "../languageHandler"; import { Anonymity, PosthogAnalytics } from "../PosthogAnalytics"; -import { UPDATE_EVENT } from "../stores/AsyncStore"; import { isVideoRoom } from "../utils/video-rooms"; import { FontWatcher } from "../settings/watchers/FontWatcher"; import { type JitsiCallMemberContent, JitsiCallMemberEventType } from "../call-types"; import SdkConfig from "../SdkConfig.ts"; -import RoomListStore from "../stores/room-list/RoomListStore.ts"; -import { DefaultTagID } from "../stores/room-list/models.ts"; +import DMRoomMap from "../utils/DMRoomMap.ts"; const TIMEOUT_MS = 16000; @@ -193,18 +189,6 @@ export abstract class Call extends TypedEventEmitter; - /** - * Contacts the widget to connect to the call or prompt the user to connect to the call. - * @param {MediaDeviceInfo | null} audioInput The audio input to use, or - * null to start muted. - * @param {MediaDeviceInfo | null} audioInput The video input to use, or - * null to start muted. - */ - protected abstract performConnection( - audioInput: MediaDeviceInfo | null, - videoInput: MediaDeviceInfo | null, - ): Promise; - /** * Contacts the widget to disconnect from the call. */ @@ -212,28 +196,10 @@ export abstract class Call extends TypedEventEmitter { - const { [MediaDeviceKindEnum.AudioInput]: audioInputs, [MediaDeviceKindEnum.VideoInput]: videoInputs } = - (await MediaDeviceHandler.getDevices())!; - - let audioInput: MediaDeviceInfo | null = null; - if (!MediaDeviceHandler.startWithAudioMuted) { - const deviceId = MediaDeviceHandler.getAudioInput(); - audioInput = audioInputs.find((d) => d.deviceId === deviceId) ?? audioInputs[0] ?? null; - } - let videoInput: MediaDeviceInfo | null = null; - if (!MediaDeviceHandler.startWithVideoMuted) { - const deviceId = MediaDeviceHandler.getVideoInput(); - videoInput = videoInputs.find((d) => d.deviceId === deviceId) ?? videoInputs[0] ?? null; - } - + public async start(_params?: WidgetGenerationParameters): Promise { const messagingStore = WidgetMessagingStore.instance; this.messaging = messagingStore.getMessagingForUid(this.widgetUid) ?? null; if (!this.messaging) { @@ -254,13 +220,23 @@ export abstract class Call extends TypedEventEmitter { - // Ensure that the messaging doesn't get stopped while we're waiting for responses - const dontStopMessaging = new Promise((resolve, reject) => { - const messagingStore = WidgetMessagingStore.instance; - - const listener = (uid: string): void => { - if (uid === this.widgetUid) { - cleanup(); - reject(new Error("Messaging stopped")); - } - }; - const done = (): void => { - cleanup(); - resolve(); - }; - const cleanup = (): void => { - messagingStore.off(WidgetMessagingStoreEvent.StopMessaging, listener); - this.off(CallEvent.ConnectionState, done); - }; - - messagingStore.on(WidgetMessagingStoreEvent.StopMessaging, listener); - this.on(CallEvent.ConnectionState, done); - }); - - // Empirically, it's possible for Jitsi Meet to crash instantly at startup, - // sending a hangup event that races with the rest of this method, so we need - // to add the hangup listener now rather than later + public async start(): Promise { + await super.start(); + this.messaging!.on(`action:${ElementWidgetActions.JoinCall}`, this.onJoin); this.messaging!.on(`action:${ElementWidgetActions.HangupCall}`, this.onHangup); - - // Actually perform the join - const response = waitForEvent( - this.messaging!, - `action:${ElementWidgetActions.JoinCall}`, - (ev: CustomEvent) => { - ev.preventDefault(); - this.messaging!.transport.reply(ev.detail, {}); // ack - return true; - }, - ); - const request = this.messaging!.transport.send(ElementWidgetActions.JoinCall, { - audioInput: audioInput?.label ?? null, - videoInput: videoInput?.label ?? null, - }); - try { - await Promise.race([Promise.all([request, response]), dontStopMessaging]); - } catch (e) { - // If it timed out, clean up our advance preparations - this.messaging!.off(`action:${ElementWidgetActions.HangupCall}`, this.onHangup); - - if (this.messaging!.transport.ready) { - // The messaging still exists, which means Jitsi might still be going in the background - this.messaging!.transport.send(ElementWidgetActions.HangupCall, { force: true }); - } - - throw new Error(`Failed to join call in room ${this.roomId}: ${e}`); - } - ActiveWidgetStore.instance.on(ActiveWidgetStoreEvent.Dock, this.onDock); ActiveWidgetStore.instance.on(ActiveWidgetStoreEvent.Undock, this.onUndock); } @@ -549,18 +460,17 @@ export class JitsiCall extends Call { } } - public setDisconnected(): void { - // During tests this.messaging can be undefined - this.messaging?.off(`action:${ElementWidgetActions.HangupCall}`, this.onHangup); + public close(): void { + this.messaging!.off(`action:${ElementWidgetActions.JoinCall}`, this.onJoin); + this.messaging!.off(`action:${ElementWidgetActions.HangupCall}`, this.onHangup); ActiveWidgetStore.instance.off(ActiveWidgetStoreEvent.Dock, this.onDock); ActiveWidgetStore.instance.off(ActiveWidgetStoreEvent.Undock, this.onUndock); - - super.setDisconnected(); + super.close(); } public destroy(): void { this.room.off(RoomStateEvent.Update, this.onRoomState); - this.on(CallEvent.ConnectionState, this.onConnectionState); + this.off(CallEvent.ConnectionState, this.onConnectionState); if (this.participantsExpirationTimer !== null) { clearTimeout(this.participantsExpirationTimer); this.participantsExpirationTimer = null; @@ -612,30 +522,42 @@ export class JitsiCall extends Call { await this.messaging!.transport.send(ElementWidgetActions.SpotlightLayout, {}); }; + private readonly onJoin = (ev: CustomEvent): void => { + ev.preventDefault(); + this.messaging!.transport.reply(ev.detail, {}); // ack + this.setConnected(); + }; + private readonly onHangup = async (ev: CustomEvent): Promise => { // If we're already in the middle of a client-initiated disconnection, // ignore the event if (this.connectionState === ConnectionState.Disconnecting) return; ev.preventDefault(); - - // In case this hangup is caused by Jitsi Meet crashing at startup, - // wait for the connection event in order to avoid racing - if (this.connectionState === ConnectionState.Disconnected) { - await waitForEvent(this, CallEvent.ConnectionState); - } - this.messaging!.transport.reply(ev.detail, {}); // ack this.setDisconnected(); - this.close(); - // In video rooms we immediately want to restart the call after hangup - // The lobby will be shown again and it connects to all signals from Jitsi. - if (isVideoRoom(this.room)) { - this.start(); - } + if (!isVideoRoom(this.room)) this.close(); }; } +export enum ElementCallIntent { + StartCall = "start_call", + JoinExisting = "join_existing", + StartCallDM = "start_call_dm", + JoinExistingDM = "join_existing_dm", +} + +/** + * Parameters to be passed during widget creation. + * These parameters are hints only, and may not be accepted by the implementation. + */ +export interface WidgetGenerationParameters { + /** + * Skip showing the lobby screen of a call. + */ + skipLobby?: boolean; +} + /** * A group call using MSC3401 and Element Call as a backend. * (somewhat cheekily named) @@ -654,21 +576,112 @@ export class ElementCall extends Call { this.checkDestroy(); } - private static generateWidgetUrl(client: MatrixClient, roomId: string): URL { - const baseUrl = window.location.href; - let url = new URL("./widgets/element-call/index.html#", baseUrl); // this strips hash fragment from baseUrl + public widgetGenerationParameters: WidgetGenerationParameters = {}; - const elementCallUrl = SettingsStore.getValue("Developer.elementCallUrl"); - if (elementCallUrl) url = new URL(elementCallUrl); + /** + * Calculate the correct intent (and associated parameters) for an Element Call room. Paarameters + * will be applied to the `params` instance. + * + * @param params Existing URL parameters + * @param client The current client. + * @param roomId The room ID for the call. + */ + private static appendRoomParams(params: URLSearchParams, client: MatrixClient, roomId: string): void { + const room = client.getRoom(roomId); + if (!room) { + // If the room isn't known, or the room is a video room then skip setting an intent. + return; + } else if (isVideoRoom(room)) { + // Video rooms already exist, so just treat as if we're joining a group call. + params.append("intent", ElementCallIntent.JoinExisting); + // Video rooms should always return to lobby. + params.append("returnToLobby", "true"); + // Never skip the lobby, we always want to give the caller a chance to explicitly join. + params.append("skipLobby", "false"); + // Never preload, as per below warning. + params.append("preload", "false"); + return; + } + const isDM = !!DMRoomMap.shared().getUserIdForRoomId(room.roomId); + const oldestCallMember = client.matrixRTC.getRoomSession(room).getOldestMembership(); + const hasCallStarted = !!oldestCallMember && oldestCallMember.sender !== client.getSafeUserId(); + // XXX: @element-hq/element-call-embedded <= 0.15.0 sets the wrong parameter for + // preload by default so we override here. This can be removed when that package + // is released and upgraded. + if (isDM) { + if (hasCallStarted) { + params.append("intent", ElementCallIntent.JoinExistingDM); + params.append("preload", "false"); + } else { + params.append("intent", ElementCallIntent.StartCallDM); + params.append("preload", "false"); + } + } else { + if (hasCallStarted) { + params.append("intent", ElementCallIntent.JoinExisting); + params.append("preload", "false"); + } else { + params.append("intent", ElementCallIntent.StartCall); + params.append("preload", "false"); + } + } + } + + /** + * Calculate the correct analytics parameters for an Element Call room. Paarameters + * will be applied to the `params` instance. + * + * @param params Existing URL parameters + * @param client The current client. + */ + private static appendAnalyticsParams(params: URLSearchParams, client: MatrixClient): void { + const posthogConfig = SdkConfig.get("posthog"); + if (!posthogConfig || PosthogAnalytics.instance.getAnonymity() === Anonymity.Disabled) { + return; + } + + const accountAnalyticsData = client.getAccountData(PosthogAnalytics.ANALYTICS_EVENT_TYPE)?.getContent(); + // The analyticsID is passed directly to element call (EC) since this codepath is only for EC and no other widget. + // We really don't want the same analyticID's for the EC and EW posthog instances (Data on posthog should be limited/anonymized as much as possible). + // This is prohibited in EC where a hashed version of the analyticsID is used for the actual posthog identification. + // We can pass the raw EW analyticsID here since we need to trust EC with not sending sensitive data to posthog (EC has access to more sensible data than the analyticsID e.g. the username) + const analyticsID: string = accountAnalyticsData?.pseudonymousAnalyticsOptIn ? accountAnalyticsData?.id : ""; + + params.append("analyticsID", analyticsID); // Legacy, deprecated in favour of posthogUserId + params.append("posthogUserId", analyticsID); + params.append("posthogApiHost", posthogConfig.api_host); + params.append("posthogApiKey", posthogConfig.project_api_key); + + // We gate passing sentry behind analytics consent as EC shares data automatically without user-consent, + // unlike EW where data is shared upon an intentional user action (rageshake). + const sentryConfig = SdkConfig.get("sentry"); + if (sentryConfig) { + params.append("sentryDsn", sentryConfig.dsn); + params.append("sentryEnvironment", sentryConfig.environment ?? ""); + } + } + + /** + * Generate the correct Element Call widget URL for creating or joining a call in this room. + * Unless `Developer.elementCallUrl` is set, the widget will use the embedded Element Call package. + * + * @param client + * @param roomId + * @param opts + * @returns + */ + private static generateWidgetUrl(client: MatrixClient, roomId: string, opts: WidgetGenerationParameters = {}): URL { + const elementCallUrlOverride = SettingsStore.getValue("Developer.elementCallUrl"); + const url = elementCallUrlOverride + ? new URL(elementCallUrlOverride) + : // this strips hash fragment from baseUrl + new URL("./widgets/element-call/index.html#", window.location.href); // Splice together the Element Call URL for this call + // Parameters can be found in https://github.com/element-hq/element-call/blob/livekit/src/UrlParams.ts. const params = new URLSearchParams({ - confineToRoom: "true", // Only show the call interface for the configured room // Template variables are used, so that this can be configured using the widget data. - skipLobby: "$skipLobby", // Skip the lobby in case we show a lobby component of our own. - returnToLobby: "$returnToLobby", // Returns to the lobby (instead of blank screen) when the call ends. (For video rooms) perParticipantE2EE: "$perParticipantE2EE", - header: "none", // Hide the header since our room header is enough userId: client.getUserId()!, deviceId: client.getDeviceId()!, roomId: roomId, @@ -678,12 +691,8 @@ export class ElementCall extends Call { theme: "$org.matrix.msc2873.client_theme", }); - const room = client.getRoom(roomId); - if (room !== null && !isVideoRoom(room)) { - params.append( - "sendNotificationType", - RoomListStore.instance.getTagsForRoom(room).includes(DefaultTagID.DM) ? "ring" : "notification", - ); + if (typeof opts.skipLobby === "boolean") { + params.set("skipLobby", opts.skipLobby.toString()); } const rageshakeSubmitUrl = SdkConfig.get("bug_report_endpoint_url"); @@ -691,34 +700,10 @@ export class ElementCall extends Call { params.append("rageshakeSubmitUrl", rageshakeSubmitUrl); } - const posthogConfig = SdkConfig.get("posthog"); - if (posthogConfig && PosthogAnalytics.instance.getAnonymity() !== Anonymity.Disabled) { - const accountAnalyticsData = client.getAccountData(PosthogAnalytics.ANALYTICS_EVENT_TYPE)?.getContent(); - // The analyticsID is passed directly to element call (EC) since this codepath is only for EC and no other widget. - // We really don't want the same analyticID's for the EC and EW posthog instances (Data on posthog should be limited/anonymized as much as possible). - // This is prohibited in EC where a hashed version of the analyticsID is used for the actual posthog identification. - // We can pass the raw EW analyticsID here since we need to trust EC with not sending sensitive data to posthog (EC has access to more sensible data than the analyticsID e.g. the username) - const analyticsID: string = accountAnalyticsData?.pseudonymousAnalyticsOptIn - ? accountAnalyticsData?.id - : ""; - - params.append("analyticsID", analyticsID); // Legacy, deprecated in favour of posthogUserId - params.append("posthogUserId", analyticsID); - params.append("posthogApiHost", posthogConfig.api_host); - params.append("posthogApiKey", posthogConfig.project_api_key); - - // We gate passing sentry behind analytics consent as EC shares data automatically without user-consent, - // unlike EW where data is shared upon an intentional user action (rageshake). - const sentryConfig = SdkConfig.get("sentry"); - if (sentryConfig) { - params.append("sentryDsn", sentryConfig.dsn); - params.append("sentryEnvironment", sentryConfig.environment ?? ""); - } - } - if (SettingsStore.getValue("fallbackICEServerAllowed")) { params.append("allowIceFallback", "true"); } + if (SettingsStore.getValue("feature_allow_screen_share_only_mode")) { params.append("allowVoipWithNoMedia", "true"); } @@ -735,6 +720,8 @@ export class ElementCall extends Call { }) .forEach((font) => params.append("font", font)); } + this.appendAnalyticsParams(params, client); + this.appendRoomParams(params, client, roomId); const replacedUrl = params.toString().replace(/%24/g, "$"); url.hash = `#?${replacedUrl}`; @@ -742,34 +729,19 @@ export class ElementCall extends Call { } // Creates a new widget if there isn't any widget of typ Call in this room. - // Defaults for creating a new widget are: skipLobby = false - // When there is already a widget the current widget configuration will be used or can be overwritten - // by passing the according parameters (skipLobby). - private static createOrGetCallWidget( - roomId: string, - client: MatrixClient, - skipLobby: boolean | undefined, - returnToLobby: boolean | undefined, - ): IApp { + private static createOrGetCallWidget(roomId: string, client: MatrixClient): IApp { const ecWidget = WidgetStore.instance.getApps(roomId).find((app) => WidgetType.CALL.matches(app.type)); if (ecWidget) { // Always update the widget data because even if the widget is already created, // we might have settings changes that update the widget. - const overwrites: IWidgetData = {}; - if (skipLobby !== undefined) { - overwrites.skipLobby = skipLobby; - } - if (returnToLobby !== undefined) { - overwrites.returnToLobby = returnToLobby; - } - ecWidget.data = ElementCall.getWidgetData(client, roomId, ecWidget?.data ?? {}, overwrites); + ecWidget.data = ElementCall.getWidgetData(client, roomId, ecWidget?.data ?? {}, {}); return ecWidget; } // To use Element Call without touching room state, we create a virtual // widget (one that doesn't have a corresponding state event) const url = ElementCall.generateWidgetUrl(client, roomId); - const createdWidget = WidgetStore.instance.addVirtualWidget( + return WidgetStore.instance.addVirtualWidget( { id: secureRandomString(24), // So that it's globally unique creatorUserId: client.getUserId()!, @@ -777,20 +749,10 @@ export class ElementCall extends Call { type: WidgetType.CALL.preferred, url: url.toString(), waitForIframeLoad: false, - data: ElementCall.getWidgetData( - client, - roomId, - {}, - { - skipLobby: skipLobby ?? false, - returnToLobby: returnToLobby ?? false, - }, - ), + data: ElementCall.getWidgetData(client, roomId, {}, {}), }, roomId, ); - WidgetStore.instance.emit(UPDATE_EVENT, null); - return createdWidget; } private static getWidgetData( @@ -844,70 +806,57 @@ export class ElementCall extends Call { // - or this is a call room. Then we also always want to show a call. if (hasEcWidget || session.memberships.length !== 0 || room.isCallRoom()) { // create a widget for the case we are joining a running call and don't have on yet. - const availableOrCreatedWidget = ElementCall.createOrGetCallWidget( - room.roomId, - room.client, - undefined, - isVideoRoom(room), - ); + const availableOrCreatedWidget = ElementCall.createOrGetCallWidget(room.roomId, room.client); return new ElementCall(session, availableOrCreatedWidget, room.client); } return null; } - public static create(room: Room, skipLobby = false): void { - ElementCall.createOrGetCallWidget(room.roomId, room.client, skipLobby, isVideoRoom(room)); + public static create(room: Room): void { + ElementCall.createOrGetCallWidget(room.roomId, room.client); } - protected async performConnection( - audioInput: MediaDeviceInfo | null, - videoInput: MediaDeviceInfo | null, - ): Promise { + public async start(widgetGenerationParameters: WidgetGenerationParameters): Promise { + // Some parameters may only be set once the user has chosen to interact with the call, regenerate the URL + // at this point in case any of the parameters have changed. + this.widgetGenerationParameters = { ...this.widgetGenerationParameters, ...widgetGenerationParameters }; + this.widget.url = ElementCall.generateWidgetUrl( + this.client, + this.roomId, + this.widgetGenerationParameters, + ).toString(); + await super.start(); + this.messaging!.on(`action:${ElementWidgetActions.JoinCall}`, this.onJoin); this.messaging!.on(`action:${ElementWidgetActions.HangupCall}`, this.onHangup); - this.messaging!.once(`action:${ElementWidgetActions.Close}`, this.onClose); + this.messaging!.on(`action:${ElementWidgetActions.Close}`, this.onClose); this.messaging!.on(`action:${ElementWidgetActions.DeviceMute}`, this.onDeviceMute); - - // TODO: Watch for a widget action telling us that the join button was clicked, rather than - // relying on the MatrixRTC session state, to set the state to connecting - const session = this.client.matrixRTC.getActiveRoomSession(this.room); - if (session) { - await waitForEvent( - session, - MatrixRTCSessionEvent.MembershipsChanged, - (_, newMemberships: CallMembership[]) => - newMemberships.some((m) => m.sender === this.client.getUserId()), - false, // allow user to wait as long as they want (no timeout) - ); - } else { - await waitForEvent( - this.client.matrixRTC, - MatrixRTCSessionManagerEvents.SessionStarted, - (roomId: string, session: MatrixRTCSession) => - this.session.callId === session.callId && roomId === this.roomId, - false, // allow user to wait as long as they want (no timeout) - ); - } } protected async performDisconnection(): Promise { + const response = waitForEvent( + this.messaging!, + `action:${ElementWidgetActions.HangupCall}`, + (ev: CustomEvent) => { + ev.preventDefault(); + this.messaging!.transport.reply(ev.detail, {}); // ack + return true; + }, + ); + const request = this.messaging!.transport.send(ElementWidgetActions.HangupCall, {}); try { - await this.messaging!.transport.send(ElementWidgetActions.HangupCall, {}); - await waitForEvent( - this.session, - MatrixRTCSessionEvent.MembershipsChanged, - (_, newMemberships: CallMembership[]) => - !newMemberships.some((m) => m.sender === this.client.getUserId()), - ); + await Promise.all([request, response]); } catch (e) { throw new Error(`Failed to hangup call in room ${this.roomId}: ${e}`); } } - public setDisconnected(): void { + public close(): void { + this.messaging!.off(`action:${ElementWidgetActions.JoinCall}`, this.onJoin); this.messaging!.off(`action:${ElementWidgetActions.HangupCall}`, this.onHangup); + this.messaging!.off(`action:${ElementWidgetActions.Close}`, this.onClose); this.messaging!.off(`action:${ElementWidgetActions.DeviceMute}`, this.onDeviceMute); - super.setDisconnected(); + super.close(); } public destroy(): void { @@ -954,22 +903,27 @@ export class ElementCall extends Call { this.messaging!.transport.reply(ev.detail, {}); // ack }; + private readonly onJoin = (ev: CustomEvent): void => { + ev.preventDefault(); + this.messaging!.transport.reply(ev.detail, {}); // ack + this.setConnected(); + }; + private readonly onHangup = async (ev: CustomEvent): Promise => { + // If we're already in the middle of a client-initiated disconnection, + // ignore the event + if (this.connectionState === ConnectionState.Disconnecting) return; + ev.preventDefault(); this.messaging!.transport.reply(ev.detail, {}); // ack this.setDisconnected(); - // In video rooms we immediately want to reconnect after hangup - // This starts the lobby again and connects to all signals from EC. - if (isVideoRoom(this.room)) { - this.start(); - } }; private readonly onClose = async (ev: CustomEvent): Promise => { ev.preventDefault(); this.messaging!.transport.reply(ev.detail, {}); // ack - // User is done with the call; tell the UI to close it - this.close(); + this.setDisconnected(); // Just in case the widget forgot to emit a hangup action (maybe it's in an error state) + this.close(); // User is done with the call; tell the UI to close it }; public clean(): Promise { diff --git a/src/models/LocalRoom.ts b/src/models/LocalRoom.ts index a8e2c255b2..960c7f634c 100644 --- a/src/models/LocalRoom.ts +++ b/src/models/LocalRoom.ts @@ -6,7 +6,14 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { type MatrixClient, Room, PendingEventOrdering } from "matrix-js-sdk/src/matrix"; +import { + type MatrixClient, + Room, + PendingEventOrdering, + MatrixEvent, + Direction, + EventType, +} from "matrix-js-sdk/src/matrix"; import { type Member } from "../utils/direct-messages"; @@ -50,4 +57,20 @@ export class LocalRoom extends Room { public get isError(): boolean { return this.state === LocalRoomState.ERROR; } + + /** + * Check if encryption is enabled in this room. + * True if the room has any encryption state event + */ + public isEncryptionEnabled(): boolean { + const roomState = this.getLiveTimeline().getState(Direction.Forward); + if (!roomState) return false; + + const stateEvents = roomState.getStateEvents(EventType.RoomEncryption); + if (stateEvents.length === 0) return false; + + // if there is an encryption state event, it is encrypted. + // Regardless of the content/algorithm, we assume it is encrypted. + return stateEvents[0] instanceof MatrixEvent; + } } diff --git a/src/modules/Navigation.ts b/src/modules/Navigation.ts index 466cacff5d..0e7724727d 100644 --- a/src/modules/Navigation.ts +++ b/src/modules/Navigation.ts @@ -9,33 +9,31 @@ import { type NavigationApi as INavigationApi } from "@element-hq/element-web-mo import { navigateToPermalink } from "../utils/permalinks/navigator.ts"; import { parsePermalink } from "../utils/permalinks/Permalinks.ts"; -import { getCachedRoomIDForAlias } from "../RoomAliasCache.ts"; -import { MatrixClientPeg } from "../MatrixClientPeg.ts"; import dispatcher from "../dispatcher/dispatcher.ts"; import { Action } from "../dispatcher/actions.ts"; -import SettingsStore from "../settings/SettingsStore.ts"; +import type { ViewRoomPayload } from "../dispatcher/payloads/ViewRoomPayload.ts"; export class NavigationApi implements INavigationApi { public async toMatrixToLink(link: string, join = false): Promise { navigateToPermalink(link); const parts = parsePermalink(link); - if (parts?.roomIdOrAlias && join) { - let roomId: string | undefined = parts.roomIdOrAlias; - if (roomId.startsWith("#")) { - roomId = getCachedRoomIDForAlias(parts.roomIdOrAlias); - if (!roomId) { - // alias resolution failed - const result = await MatrixClientPeg.safeGet().getRoomIdForAlias(parts.roomIdOrAlias); - roomId = result.room_id; - } - } - - if (roomId) { - dispatcher.dispatch({ - action: Action.JoinRoom, - canAskToJoin: SettingsStore.getValue("feature_ask_to_join"), - roomId, + if (parts?.roomIdOrAlias) { + if (parts.roomIdOrAlias.startsWith("#")) { + dispatcher.dispatch({ + action: Action.ViewRoom, + room_alias: parts.roomIdOrAlias, + via_servers: parts.viaServers ?? undefined, + auto_join: join, + metricsTrigger: undefined, + }); + } else { + dispatcher.dispatch({ + action: Action.ViewRoom, + room_id: parts.roomIdOrAlias, + via_servers: parts.viaServers ?? undefined, + auto_join: join, + metricsTrigger: undefined, }); } } diff --git a/src/modules/ProxiedModuleApi.ts b/src/modules/ProxiedModuleApi.ts index b14b2c0c0c..86db1a9e35 100644 --- a/src/modules/ProxiedModuleApi.ts +++ b/src/modules/ProxiedModuleApi.ts @@ -28,13 +28,12 @@ import dispatcher from "../dispatcher/dispatcher"; import { navigateToPermalink } from "../utils/permalinks/navigator"; import { parsePermalink } from "../utils/permalinks/Permalinks"; import { MatrixClientPeg } from "../MatrixClientPeg"; -import { getCachedRoomIDForAlias } from "../RoomAliasCache"; import { Action } from "../dispatcher/actions"; import { type OverwriteLoginPayload } from "../dispatcher/payloads/OverwriteLoginPayload"; import { type ActionPayload } from "../dispatcher/payloads"; -import SettingsStore from "../settings/SettingsStore"; import WidgetStore, { type IApp } from "../stores/WidgetStore"; import { type Container, WidgetLayoutStore } from "../stores/widgets/WidgetLayoutStore"; +import type { ViewRoomPayload } from "../dispatcher/payloads/ViewRoomPayload.ts"; /** * Glue between the `ModuleApi` interface and the react-sdk. Anticipates one instance @@ -183,28 +182,22 @@ export class ProxiedModuleApi implements ModuleApi { navigateToPermalink(uri); const parts = parsePermalink(uri); - if (parts?.roomIdOrAlias && andJoin) { - let roomId: string | undefined = parts.roomIdOrAlias; - let servers = parts.viaServers; - if (roomId.startsWith("#")) { - roomId = getCachedRoomIDForAlias(parts.roomIdOrAlias); - if (!roomId) { - // alias resolution failed - const result = await MatrixClientPeg.safeGet().getRoomIdForAlias(parts.roomIdOrAlias); - roomId = result.room_id; - if (!servers) servers = result.servers; // use provided servers first, if available - } - } - dispatcher.dispatch({ - action: Action.ViewRoom, - room_id: roomId, - via_servers: servers, - }); - - if (andJoin) { - dispatcher.dispatch({ - action: Action.JoinRoom, - canAskToJoin: SettingsStore.getValue("feature_ask_to_join"), + if (parts?.roomIdOrAlias) { + if (parts.roomIdOrAlias.startsWith("#")) { + dispatcher.dispatch({ + action: Action.ViewRoom, + room_alias: parts.roomIdOrAlias, + via_servers: parts.viaServers ?? undefined, + auto_join: andJoin ?? false, + metricsTrigger: undefined, + }); + } else { + dispatcher.dispatch({ + action: Action.ViewRoom, + room_id: parts.roomIdOrAlias, + via_servers: parts.viaServers ?? undefined, + auto_join: andJoin ?? false, + metricsTrigger: undefined, }); } } diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx index 3adb29a23e..dfb869c31c 100644 --- a/src/settings/Settings.tsx +++ b/src/settings/Settings.tsx @@ -8,7 +8,7 @@ Please see LICENSE files in the repository root for full details. */ import React, { type ReactNode } from "react"; -import { UNSTABLE_MSC4133_EXTENDED_PROFILES } from "matrix-js-sdk/src/matrix"; +import { STABLE_MSC4133_EXTENDED_PROFILES, UNSTABLE_MSC4133_EXTENDED_PROFILES } from "matrix-js-sdk/src/matrix"; import { type MediaPreviewConfig } from "../@types/media_preview.ts"; // Import i18n.tsx instead of languageHandler to avoid circular deps @@ -690,7 +690,7 @@ export const SETTINGS: Settings = { displayName: _td("labs|new_room_list"), description: _td("labs|under_active_development"), isFeature: true, - default: false, + default: true, controller: new ReloadOnChangeController(), }, /** @@ -844,7 +844,7 @@ export const SETTINGS: Settings = { controller: new ServerSupportUnstableFeatureController( "userTimezonePublish", defaultWatchManager, - [[UNSTABLE_MSC4133_EXTENDED_PROFILES]], + [[UNSTABLE_MSC4133_EXTENDED_PROFILES], [STABLE_MSC4133_EXTENDED_PROFILES]], undefined, _td("labs|extended_profiles_msc_support"), ), @@ -1425,6 +1425,14 @@ export const SETTINGS: Settings = { supportedLevels: LEVELS_UI_FEATURE, default: true, }, + [UIFeature.AllowCreatingPublicSpaces]: { + supportedLevels: LEVELS_UI_FEATURE, + default: true, + }, + [UIFeature.AllowCreatingPublicRooms]: { + supportedLevels: LEVELS_UI_FEATURE, + default: true, + }, // Electron-specific settings, they are stored by Electron and set/read over an IPC. // We store them over there are they are necessary to know before the renderer process launches. diff --git a/src/settings/SettingsStore.ts b/src/settings/SettingsStore.ts index bce943ab7a..c6a739f1c8 100644 --- a/src/settings/SettingsStore.ts +++ b/src/settings/SettingsStore.ts @@ -340,7 +340,7 @@ export default class SettingsStore { } /** - * Retrieves the reason a setting is disabled if one is assigned. + * Retrieves the internationalised reason a setting is disabled if one is assigned. * If a setting is not disabled, or no reason is given by the `SettingController`, * this will return undefined. * @param {string} settingName The setting to look up. diff --git a/src/settings/UIFeature.ts b/src/settings/UIFeature.ts index 4aef725d4a..12b0c7c089 100644 --- a/src/settings/UIFeature.ts +++ b/src/settings/UIFeature.ts @@ -25,6 +25,8 @@ export const enum UIFeature { RoomHistorySettings = "UIFeature.roomHistorySettings", TimelineEnableRelativeDates = "UIFeature.timelineEnableRelativeDates", BulkUnverifiedSessionsReminder = "UIFeature.BulkUnverifiedSessionsReminder", + AllowCreatingPublicRooms = "UIFeature.allowCreatingPublicRooms", + AllowCreatingPublicSpaces = "UIFeature.allowCreatingPublicSpaces", } export enum UIComponent { diff --git a/src/settings/controllers/ServerSupportUnstableFeatureController.ts b/src/settings/controllers/ServerSupportUnstableFeatureController.ts index 1b6bf9cfff..058fdaae08 100644 --- a/src/settings/controllers/ServerSupportUnstableFeatureController.ts +++ b/src/settings/controllers/ServerSupportUnstableFeatureController.ts @@ -11,6 +11,7 @@ import MatrixClientBackedController from "./MatrixClientBackedController"; import { type WatchManager } from "../WatchManager"; import SettingsStore from "../SettingsStore"; import { type SettingKey } from "../Settings.tsx"; +import { _t, type TranslationKey } from "../../languageHandler.tsx"; /** * Disables a given setting if the server unstable feature it requires is not supported @@ -33,7 +34,7 @@ export default class ServerSupportUnstableFeatureController extends MatrixClient private readonly watchers: WatchManager, private readonly unstableFeatureGroups: string[][], private readonly stableVersion?: string, - private readonly disabledMessage?: string, + private readonly disabledMessage?: TranslationKey, private readonly forcedValue: any = false, ) { super(); @@ -96,7 +97,7 @@ export default class ServerSupportUnstableFeatureController extends MatrixClient public get settingDisabled(): boolean | string { if (this.disabled) { - return this.disabledMessage ?? true; + return this.disabledMessage ? _t(this.disabledMessage) : true; } return false; } diff --git a/src/shared-components/audio/AudioPlayerView/__snapshots__/AudioPlayerView.test.tsx.snap b/src/shared-components/audio/AudioPlayerView/__snapshots__/AudioPlayerView.test.tsx.snap index fc8cc20a17..790ab16870 100644 --- a/src/shared-components/audio/AudioPlayerView/__snapshots__/AudioPlayerView.test.tsx.snap +++ b/src/shared-components/audio/AudioPlayerView/__snapshots__/AudioPlayerView.test.tsx.snap @@ -20,7 +20,7 @@ exports[`AudioPlayerView renders the audio player in default state 1`] = ` data-kind="primary" role="button" style="--cpd-icon-button-size: 32px;" - tabindex="0" + tabindex="-1" >
    , + details: "Details about the avatar go here", + title: "Room Name", + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; +export const Default: Story = {}; diff --git a/src/shared-components/avatar/AvatarWithDetails/AvatarWithDetails.test.tsx b/src/shared-components/avatar/AvatarWithDetails/AvatarWithDetails.test.tsx new file mode 100644 index 0000000000..f5d482613f --- /dev/null +++ b/src/shared-components/avatar/AvatarWithDetails/AvatarWithDetails.test.tsx @@ -0,0 +1,21 @@ +/* +Copyright 2025 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { composeStories } from "@storybook/react-vite"; +import { render } from "jest-matrix-react"; +import React from "react"; + +import * as stories from "./AvatarWithDetails.stories.tsx"; + +const { Default } = composeStories(stories); + +describe("AvatarWithDetails", () => { + it("renders a textual event", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); +}); diff --git a/src/shared-components/avatar/AvatarWithDetails/AvatarWithDetails.tsx b/src/shared-components/avatar/AvatarWithDetails/AvatarWithDetails.tsx new file mode 100644 index 0000000000..aab5729d5f --- /dev/null +++ b/src/shared-components/avatar/AvatarWithDetails/AvatarWithDetails.tsx @@ -0,0 +1,65 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { type ComponentProps, type ElementType, type JSX, type PropsWithChildren } from "react"; +import React from "react"; +import classNames from "classnames"; + +import styles from "./AvatarWithDetails.module.css"; +import { Flex } from "../../utils/Flex"; + +export type AvatarWithDetailsProps = { + /** + * The HTML tag. + * @default "div" + */ + as?: C; + /** + * The CSS class name. + */ + className?: string; + /** + * The title/label next to the avatar. Usually the user or room name. + */ + title: string; + /** + * A label with details to display under the avatar title. + * Commonly used to display the number of participants in a room. + */ + details: React.ReactNode; + /** The avatar to display. */ + avatar: React.ReactNode; +} & ComponentProps; + +/** + * A component to display an avatar with a title next to it in a grey box. + * + * @example + * ```tsx + * + * ``` + */ +export function AvatarWithDetails({ + as, + className, + details, + avatar, + title, + ...props +}: PropsWithChildren>): JSX.Element { + const Component = as || "div"; + + return ( + + {avatar} + + {title} + {details} + + + ); +} diff --git a/src/shared-components/avatar/AvatarWithDetails/__snapshots__/AvatarWithDetails.test.tsx.snap b/src/shared-components/avatar/AvatarWithDetails/__snapshots__/AvatarWithDetails.test.tsx.snap new file mode 100644 index 0000000000..e8a2e4579a --- /dev/null +++ b/src/shared-components/avatar/AvatarWithDetails/__snapshots__/AvatarWithDetails.test.tsx.snap @@ -0,0 +1,28 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`AvatarWithDetails renders a textual event 1`] = ` +
    +
    +
    +
    + + Room Name + + + Details about the avatar go here + +
    +
    +
    +`; diff --git a/src/shared-components/avatar/AvatarWithDetails/index.tsx b/src/shared-components/avatar/AvatarWithDetails/index.tsx new file mode 100644 index 0000000000..a54f416d82 --- /dev/null +++ b/src/shared-components/avatar/AvatarWithDetails/index.tsx @@ -0,0 +1,8 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +export { AvatarWithDetails } from "./AvatarWithDetails"; diff --git a/src/shared-components/hooks/useListKeyboardNavigation.test.ts b/src/shared-components/hooks/useListKeyboardNavigation.test.ts new file mode 100644 index 0000000000..9381619edc --- /dev/null +++ b/src/shared-components/hooks/useListKeyboardNavigation.test.ts @@ -0,0 +1,155 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { type KeyboardEvent } from "react"; +import { renderHook } from "jest-matrix-react"; + +import { useListKeyboardNavigation } from "./useListKeyboardNavigation"; + +describe("useListKeyDown", () => { + let mockList: HTMLUListElement; + let mockItems: HTMLElement[]; + let mockEvent: Partial>; + + beforeEach(() => { + // Create mock DOM elements + mockList = document.createElement("ul"); + mockItems = [document.createElement("li"), document.createElement("li"), document.createElement("li")]; + + // Set up the DOM structure + mockItems.forEach((item, index) => { + item.setAttribute("tabindex", "0"); + item.setAttribute("data-testid", `item-${index}`); + mockList.appendChild(item); + }); + + document.body.appendChild(mockList); + + // Mock event object + mockEvent = { + preventDefault: jest.fn(), + key: "", + }; + + // Mock focus methods + mockItems.forEach((item) => { + item.focus = jest.fn(); + item.click = jest.fn(); + }); + }); + + afterEach(() => { + document.body.removeChild(mockList); + jest.clearAllMocks(); + }); + + function render(): { + current: { + listRef: React.RefObject; + onKeyDown: React.KeyboardEventHandler; + onFocus: React.FocusEventHandler; + }; + } { + const { result } = renderHook(() => useListKeyboardNavigation()); + result.current.listRef.current = mockList; + return result; + } + + it.each([ + ["Enter", "Enter"], + ["Space", " "], + ])("should handle %s key to click active element", (name, key) => { + const result = render(); + + // Mock document.activeElement + Object.defineProperty(document, "activeElement", { + value: mockItems[1], + configurable: true, + }); + + // Simulate key press + result.current.onKeyDown({ + ...mockEvent, + key, + } as KeyboardEvent); + + expect(mockItems[1].click).toHaveBeenCalledTimes(1); + expect(mockEvent.preventDefault).toHaveBeenCalledTimes(1); + }); + + it.each( + // key, finalPosition, startPosition + [ + ["ArrowDown", 1, 0], + ["ArrowUp", 1, 2], + ["Home", 0, 1], + ["End", 2, 1], + ], + )("should handle %s to focus the %inth element", (key, finalPosition, startPosition) => { + const result = render(); + mockList.contains = jest.fn().mockReturnValue(true); + + Object.defineProperty(document, "activeElement", { + value: mockItems[startPosition], + configurable: true, + }); + + result.current.onKeyDown({ + ...mockEvent, + key, + } as KeyboardEvent); + + expect(mockItems[finalPosition].focus).toHaveBeenCalledTimes(1); + expect(mockEvent.preventDefault).toHaveBeenCalledTimes(1); + }); + + it.each([["ArrowDown"], ["ArrowUp"]])("should not handle %s when active element is not in list", (key) => { + const result = render(); + mockList.contains = jest.fn().mockReturnValue(false); + + const outsideElement = document.createElement("button"); + + Object.defineProperty(document, "activeElement", { + value: outsideElement, + configurable: true, + }); + + result.current.onKeyDown({ + ...mockEvent, + key, + } as KeyboardEvent); + + // No item should be focused + mockItems.forEach((item) => expect(item.focus).not.toHaveBeenCalled()); + expect(mockEvent.preventDefault).toHaveBeenCalledTimes(1); + }); + + it("should not prevent default for unhandled keys", () => { + const result = render(); + + result.current.onKeyDown({ + ...mockEvent, + key: "Tab", + } as KeyboardEvent); + + expect(mockEvent.preventDefault).not.toHaveBeenCalled(); + }); + + it("should focus the first item if list itself is focused", () => { + const result = render(); + result.current.onFocus({ target: mockList } as React.FocusEvent); + expect(mockItems[0].focus).toHaveBeenCalledTimes(1); + }); + + it("should focus the selected item if list itself is focused", () => { + mockItems[1].setAttribute("aria-selected", "true"); + const result = render(); + + result.current.onFocus({ target: mockList } as React.FocusEvent); + expect(mockItems[1].focus).toHaveBeenCalledTimes(1); + }); +}); diff --git a/src/shared-components/hooks/useListKeyboardNavigation.ts b/src/shared-components/hooks/useListKeyboardNavigation.ts new file mode 100644 index 0000000000..71d87aa12a --- /dev/null +++ b/src/shared-components/hooks/useListKeyboardNavigation.ts @@ -0,0 +1,92 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { + useCallback, + useRef, + type RefObject, + type KeyboardEvent, + type KeyboardEventHandler, + type FocusEventHandler, + type FocusEvent, +} from "react"; + +/** + * A hook that provides keyboard navigation for a list of options. + */ +export function useListKeyboardNavigation(): { + listRef: RefObject; + onKeyDown: KeyboardEventHandler; + onFocus: FocusEventHandler; +} { + const listRef = useRef(null); + + const onFocus = useCallback((evt: FocusEvent) => { + if (!listRef.current) return; + + if (evt.target === listRef.current) { + // By default, focus the selected item + let selectedChild = listRef.current?.firstElementChild; + + // If there is a selected item, focus that instead + for (const child of listRef.current.children) { + if (child.getAttribute("aria-selected") === "true") { + selectedChild = child; + break; + } + } + + (selectedChild as HTMLElement)?.focus(); + } + }, []); + + const onKeyDown = useCallback((evt: KeyboardEvent) => { + const { key } = evt; + + let handled = false; + + switch (key) { + case "Enter": + case " ": { + handled = true; + (document.activeElement as HTMLElement).click(); + break; + } + case "ArrowDown": { + handled = true; + const currentFocus = document.activeElement; + if (listRef.current?.contains(currentFocus) && currentFocus) { + (currentFocus.nextElementSibling as HTMLElement)?.focus(); + } + break; + } + case "ArrowUp": { + handled = true; + const currentFocus = document.activeElement; + if (listRef.current?.contains(currentFocus) && currentFocus) { + (currentFocus.previousElementSibling as HTMLElement)?.focus(); + } + break; + } + case "Home": { + handled = true; + (listRef.current?.firstElementChild as HTMLElement)?.focus(); + break; + } + case "End": { + handled = true; + (listRef.current?.lastElementChild as HTMLElement)?.focus(); + break; + } + } + + if (handled) { + evt.preventDefault(); + } + }, []); + return { listRef, onKeyDown, onFocus }; +} diff --git a/src/shared-components/pill-input/Pill/Pill.module.css b/src/shared-components/pill-input/Pill/Pill.module.css new file mode 100644 index 0000000000..59df489e06 --- /dev/null +++ b/src/shared-components/pill-input/Pill/Pill.module.css @@ -0,0 +1,17 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +.pill { + background-color: var(--cpd-color-bg-action-primary-rest); + padding: var(--cpd-space-1x) var(--cpd-space-1-5x) var(--cpd-space-1x) var(--cpd-space-1x); + border-radius: 99px; +} + +.label { + color: var(--cpd-color-text-on-solid-primary); + font: var(--cpd-font-body-sm-medium); +} diff --git a/src/shared-components/pill-input/Pill/Pill.stories.tsx b/src/shared-components/pill-input/Pill/Pill.stories.tsx new file mode 100644 index 0000000000..1ed233adf8 --- /dev/null +++ b/src/shared-components/pill-input/Pill/Pill.stories.tsx @@ -0,0 +1,33 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React from "react"; +import { fn } from "storybook/test"; + +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { Pill } from "./Pill"; + +const meta = { + title: "PillInput/Pill", + component: Pill, + tags: ["autodocs"], + args: { + label: "Pill", + children:
    , + onClick: fn(), + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const WithoutCloseButton: Story = { + args: { + onClick: undefined, + }, +}; diff --git a/src/shared-components/pill-input/Pill/Pill.test.tsx b/src/shared-components/pill-input/Pill/Pill.test.tsx new file mode 100644 index 0000000000..a539f6c295 --- /dev/null +++ b/src/shared-components/pill-input/Pill/Pill.test.tsx @@ -0,0 +1,26 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { composeStories } from "@storybook/react-vite"; +import { render } from "jest-matrix-react"; +import React from "react"; + +import * as stories from "./Pill.stories"; + +const { Default, WithoutCloseButton } = composeStories(stories); + +describe("Pill", () => { + it("renders the pill", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders the pill without close button", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); +}); diff --git a/src/shared-components/pill-input/Pill/Pill.tsx b/src/shared-components/pill-input/Pill/Pill.tsx new file mode 100644 index 0000000000..51f5ef0f2f --- /dev/null +++ b/src/shared-components/pill-input/Pill/Pill.tsx @@ -0,0 +1,62 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type MouseEventHandler, type JSX, type PropsWithChildren, type HTMLAttributes, useId } from "react"; +import classNames from "classnames"; +import { IconButton } from "@vector-im/compound-web"; +import CloseIcon from "@vector-im/compound-design-tokens/assets/web/icons/close"; + +import { Flex } from "../../utils/Flex"; +import styles from "./Pill.module.css"; +import { _t } from "../../utils/i18n"; + +export interface PillProps extends Omit, "onClick"> { + /** + * The text label to display inside the pill. + */ + label: string; + /** + * Optional click handler for a close button. + * If provided, a close button will be rendered. + */ + onClick?: MouseEventHandler; +} + +/** + * A pill component that can display a label and an optional close button. + * The badge can also contain child elements, such as icons or avatars. + * + * @example + * ```tsx + * console.log("Closed")}> + * + * + * ``` + */ +export function Pill({ className, children, label, onClick, ...props }: PropsWithChildren): JSX.Element { + const id = useId(); + + return ( + + {children} + + {label} + + {onClick && ( + + + + )} + + ); +} diff --git a/src/shared-components/pill-input/Pill/__snapshots__/Pill.test.tsx.snap b/src/shared-components/pill-input/Pill/__snapshots__/Pill.test.tsx.snap new file mode 100644 index 0000000000..ce81390347 --- /dev/null +++ b/src/shared-components/pill-input/Pill/__snapshots__/Pill.test.tsx.snap @@ -0,0 +1,66 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Pill renders the pill 1`] = ` +
    +
    +
    + + Pill + + +
    +
    +`; + +exports[`Pill renders the pill without close button 1`] = ` +
    +
    +
    + + Pill + +
    +
    +`; diff --git a/src/shared-components/pill-input/Pill/index.ts b/src/shared-components/pill-input/Pill/index.ts new file mode 100644 index 0000000000..1e0a4b6b66 --- /dev/null +++ b/src/shared-components/pill-input/Pill/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +export { Pill } from "./Pill"; diff --git a/src/shared-components/pill-input/PillInput/PillInput.module.css b/src/shared-components/pill-input/PillInput/PillInput.module.css new file mode 100644 index 0000000000..888da57746 --- /dev/null +++ b/src/shared-components/pill-input/PillInput/PillInput.module.css @@ -0,0 +1,34 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +.pillInput { + background-color: var(--cpd-color-bg-subtle-secondary); + border-radius: 20px; + padding: var(--cpd-space-2x) var(--cpd-space-3x) var(--cpd-space-2x) var(--cpd-space-3x); + /* To match pill height in order to avoid the PillInput to grow when a pill is inserted */ + min-height: 28px; +} + +.pillInput:has(.input:focus) { + outline: var(--cpd-border-width-1) solid var(--cpd-color-gray-1400); +} + +.input { + all: unset; + width: 100%; + flex: 1; + color: var(--cpd-color-text-primary); +} + +.input::placeholder { + color: var(--cpd-color-text-secondary); + font: var(--cpd-font-body-md-regular); +} + +.largerInput { + padding: var(--cpd-space-2x) 0; +} diff --git a/src/shared-components/pill-input/PillInput/PillInput.stories.tsx b/src/shared-components/pill-input/PillInput/PillInput.stories.tsx new file mode 100644 index 0000000000..3bb119dc75 --- /dev/null +++ b/src/shared-components/pill-input/PillInput/PillInput.stories.tsx @@ -0,0 +1,38 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React from "react"; +import { fn } from "storybook/test"; + +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { PillInput } from "./PillInput"; + +const meta = { + title: "PillInput/PillInput", + component: PillInput, + tags: ["autodocs"], + args: { + children: ( + <> +
    +
    + + ), + onChange: fn(), + onRemoveChildren: fn(), + inputProps: { + "placeholder": "Type something...", + "aria-label": "pill input", + }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const NoChild: Story = { args: { children: undefined } }; diff --git a/src/shared-components/pill-input/PillInput/PillInput.test.tsx b/src/shared-components/pill-input/PillInput/PillInput.test.tsx new file mode 100644 index 0000000000..b20b53c6e4 --- /dev/null +++ b/src/shared-components/pill-input/PillInput/PillInput.test.tsx @@ -0,0 +1,43 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { render, screen } from "jest-matrix-react"; +import React from "react"; +import { composeStories } from "@storybook/react-vite"; +import userEvent from "@testing-library/user-event"; + +import * as stories from "./PillInput.stories"; +import { PillInput } from "./PillInput"; + +const { Default, NoChild } = composeStories(stories); + +describe("PillInput", () => { + it("renders the pill input", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders only the input without children", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("calls onRemoveChildren when backspace is pressed and input is empty", async () => { + const user = userEvent.setup(); + const mockOnRemoveChildren = jest.fn(); + + render(); + + const input = screen.getByRole("textbox"); + + // Focus the input and press backspace (input should be empty by default) + await user.click(input); + await user.keyboard("{Backspace}"); + + expect(mockOnRemoveChildren).toHaveBeenCalledTimes(1); + }); +}); diff --git a/src/shared-components/pill-input/PillInput/PillInput.tsx b/src/shared-components/pill-input/PillInput/PillInput.tsx new file mode 100644 index 0000000000..bcb2cb1932 --- /dev/null +++ b/src/shared-components/pill-input/PillInput/PillInput.tsx @@ -0,0 +1,96 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { + type PropsWithChildren, + type JSX, + useRef, + type KeyboardEventHandler, + type HTMLAttributes, + type HTMLProps, + Children, +} from "react"; +import classNames from "classnames"; +import { omit } from "lodash"; +import { useMergeRefs } from "react-merge-refs"; + +import styles from "./PillInput.module.css"; +import { Flex } from "../../utils/Flex"; + +export interface PillInputProps extends HTMLAttributes { + /** + * Callback for when the user presses backspace on an empty input. + */ + onRemoveChildren?: KeyboardEventHandler; + /** + * Props to pass to the input element. + */ + inputProps?: HTMLProps & { "data-testid"?: string }; +} + +/** + * An input component that can contain multiple child elements and an input field. + * + * @example + * ```tsx + * + *
    Child 1
    + *
    Child 2
    + *
    + * ``` + */ +export function PillInput({ + className, + children, + onRemoveChildren, + inputProps, + ...props +}: PropsWithChildren): JSX.Element { + const inputRef = useRef(null); + const inputAttributes = omit(inputProps, ["onKeyDown", "ref"]); + const ref = useMergeRefs([inputRef, inputProps?.ref]); + + const hasChildren = Children.toArray(children).length > 0; + + return ( + { + evt.preventDefault(); + evt.stopPropagation(); + inputRef.current?.focus(); + }} + > + {hasChildren && ( + + {children} + + )} + { + const value = evt.currentTarget.value.trim(); + + // If the input is empty and the user presses backspace, we call the onRemoveChildren handler + if (evt.key === "Backspace" && !value) { + evt.preventDefault(); + onRemoveChildren?.(evt); + return; + } + + inputProps?.onKeyDown?.(evt); + }} + {...inputAttributes} + /> + + ); +} diff --git a/src/shared-components/pill-input/PillInput/__snapshots__/PillInput.test.tsx.snap b/src/shared-components/pill-input/PillInput/__snapshots__/PillInput.test.tsx.snap new file mode 100644 index 0000000000..7675610f6c --- /dev/null +++ b/src/shared-components/pill-input/PillInput/__snapshots__/PillInput.test.tsx.snap @@ -0,0 +1,44 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`PillInput renders only the input without children 1`] = ` +
    +
    + +
    +
    +`; + +exports[`PillInput renders the pill input 1`] = ` +
    +
    +
    +
    +
    +
    + +
    +
    +`; diff --git a/src/shared-components/pill-input/PillInput/index.ts b/src/shared-components/pill-input/PillInput/index.ts new file mode 100644 index 0000000000..76cb6e4625 --- /dev/null +++ b/src/shared-components/pill-input/PillInput/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +export { PillInput } from "./PillInput"; diff --git a/src/shared-components/rich-list/RichItem/RichItem.module.css b/src/shared-components/rich-list/RichItem/RichItem.module.css new file mode 100644 index 0000000000..d1028f33e4 --- /dev/null +++ b/src/shared-components/rich-list/RichItem/RichItem.module.css @@ -0,0 +1,76 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +.richItem { + /* Remove browser button style */ + background: transparent; + border: none; + padding: var(--cpd-space-2x) var(--cpd-space-4x) var(--cpd-space-2x) var(--cpd-space-4x); + width: 100%; + box-sizing: border-box; + cursor: pointer; + text-align: start; + + display: grid; + column-gap: var(--cpd-space-3x); + grid-template-columns: max-content 1fr max-content; + grid-template-areas: + "avatar title time" + "avatar description time"; +} + +.richItem:hover, +.richItem:focus { + background-color: var(--cpd-color-bg-subtle-secondary); + border-radius: 12px; +} + +.richItem:not(:last-child) { + border-bottom: var(--cpd-border-width-1) solid var(--cpd-color-gray-300); +} + +.avatar { + grid-area: avatar; + align-self: center; +} + +.title { + grid-area: title; + font: var(--cpd-font-body-sm-semibold); + color: var(--cpd-color-text-primary); +} + +.description { + grid-area: description; +} + +.timestamp { + grid-area: time; + align-self: center; +} + +.title, +.description { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.description, +.timestamp { + font: var(--cpd-font-body-sm-regular); + color: var(--cpd-color-text-secondary); +} + +.checkmark { + grid-area: avatar; + align-self: center; + background-color: var(--cpd-color-icon-accent-primary); + width: 32px; + height: 32px; + border-radius: 100%; +} diff --git a/src/shared-components/rich-list/RichItem/RichItem.stories.tsx b/src/shared-components/rich-list/RichItem/RichItem.stories.tsx new file mode 100644 index 0000000000..2abbd592ca --- /dev/null +++ b/src/shared-components/rich-list/RichItem/RichItem.stories.tsx @@ -0,0 +1,64 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React from "react"; +import { fn } from "storybook/test"; + +import { RichItem } from "./RichItem"; +import type { Meta, StoryFn } from "@storybook/react-vite"; + +const currentTimestamp = new Date("2025-03-09T12:00:00Z").getTime(); + +export default { + title: "RichList/RichItem", + component: RichItem, + tags: ["autodocs"], + args: { + avatar:
    , + title: "Rich Item Title", + description: "This is a description of the rich item.", + timestamp: currentTimestamp, + onClick: fn(), + }, + beforeEach: () => { + Date.now = () => new Date("2025-08-01T12:00:00Z").getTime(); + }, + parameters: { + a11y: { + context: "button", + }, + }, +} as Meta; + +const Template: StoryFn = (args) => ( +
      + +
    +); + +export const Default = Template.bind({}); + +export const Selected = Template.bind({}); +Selected.args = { + selected: true, +}; + +export const WithoutTimestamp = Template.bind({}); +WithoutTimestamp.args = { + timestamp: undefined, +}; + +export const Hover = Template.bind({}); +Hover.parameters = { pseudo: { hover: true } }; + +const TemplateSeparator: StoryFn = (args) => ( +
      + + +
    +); +export const Separator = TemplateSeparator.bind({}); diff --git a/src/shared-components/rich-list/RichItem/RichItem.test.tsx b/src/shared-components/rich-list/RichItem/RichItem.test.tsx new file mode 100644 index 0000000000..b5322d1fa5 --- /dev/null +++ b/src/shared-components/rich-list/RichItem/RichItem.test.tsx @@ -0,0 +1,35 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { composeStories } from "@storybook/react-vite"; +import { render } from "jest-matrix-react"; +import React from "react"; + +import * as stories from "./RichItem.stories"; + +const { Default, Selected, WithoutTimestamp } = composeStories(stories); + +describe("RichItem", () => { + beforeAll(() => { + jest.useFakeTimers().setSystemTime(new Date("2025-08-01T12:00:00Z")); + }); + + it("renders the item in default state", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders the item in selected state", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders the item without timestamp", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); +}); diff --git a/src/shared-components/rich-list/RichItem/RichItem.tsx b/src/shared-components/rich-list/RichItem/RichItem.tsx new file mode 100644 index 0000000000..3cef2690fc --- /dev/null +++ b/src/shared-components/rich-list/RichItem/RichItem.tsx @@ -0,0 +1,96 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type HTMLAttributes, type JSX, memo } from "react"; +import CheckIcon from "@vector-im/compound-design-tokens/assets/web/icons/check"; + +import styles from "./RichItem.module.css"; +import { humanizeTime } from "../../utils/humanize"; +import { Flex } from "../../utils/Flex"; + +export interface RichItemProps extends HTMLAttributes { + /** + * Avatar to display at the start of the item + */ + avatar: React.ReactNode; + /** + * Title to display at the top of the item + */ + title: string; + /** + * Description to display below the title + */ + description: string; + /** + * Timestamp to display at the end of the item + * The value is humanized (e.g. "5 minutes ago") + */ + timestamp?: number; + /** + * Whether the item is selected + * This will replace the avatar with a checkmark + * @default false + */ + selected?: boolean; +} + +/** + * A rich item to display in a list, with an avatar, title, description and optional timestamp. + * If selected, the avatar is replaced with a checkmark. + * A separator is added between items in a list. + * + * @example + * ```tsx + * } + * title="Rich Item Title" + * description="This is a description of the rich item." + * timestamp={Date.now() - 5 * 60 * 1000} // 5 minutes ago + * selected={true} + * onClick={() => console.log("Item clicked")} + * /> + * ``` + */ +export const RichItem = memo(function RichItem({ + avatar, + title, + description, + timestamp, + selected, + ...props +}: RichItemProps): JSX.Element { + return ( +
  • + {selected ? : {avatar}} + {title} + {description} + {timestamp && ( + + {humanizeTime(timestamp)} + + )} +
  • + ); +}); + +/** + * A checkmark icon inside a circle, used to indicate selection. + */ +function Checkmark(): JSX.Element { + return ( + + ); +} diff --git a/src/shared-components/rich-list/RichItem/__snapshots__/RichItem.test.tsx.snap b/src/shared-components/rich-list/RichItem/__snapshots__/RichItem.test.tsx.snap new file mode 100644 index 0000000000..84f6669b7a --- /dev/null +++ b/src/shared-components/rich-list/RichItem/__snapshots__/RichItem.test.tsx.snap @@ -0,0 +1,129 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`RichItem renders the item in default state 1`] = ` +
    +
      +
    • +
      +
      +
      + + Rich Item Title + + + This is a description of the rich item. + + + 145 days ago + +
    • +
    +
    +`; + +exports[`RichItem renders the item in selected state 1`] = ` +
    +
      +
    • + + + Rich Item Title + + + This is a description of the rich item. + + + 145 days ago + +
    • +
    +
    +`; + +exports[`RichItem renders the item without timestamp 1`] = ` +
    +
      +
    • +
      +
      +
      + + Rich Item Title + + + This is a description of the rich item. + +
    • +
    +
    +`; diff --git a/src/shared-components/rich-list/RichItem/index.ts b/src/shared-components/rich-list/RichItem/index.ts new file mode 100644 index 0000000000..0301144246 --- /dev/null +++ b/src/shared-components/rich-list/RichItem/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +export { RichItem } from "./RichItem"; diff --git a/src/shared-components/rich-list/RichList/RichList.module.css b/src/shared-components/rich-list/RichList/RichList.module.css new file mode 100644 index 0000000000..9fd59ef103 --- /dev/null +++ b/src/shared-components/rich-list/RichList/RichList.module.css @@ -0,0 +1,30 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +.richList { + height: inherit; +} + +.title { + font: var(--cpd-font-body-sm-semibold); + color: var(--cpd-color-text-secondary); + padding: var(--cpd-space-2x) var(--cpd-space-4x) var(--cpd-space-2x) var(--cpd-space-4x); +} + +.content { + width: 100%; + overflow: auto; + /* remove browser default ul padding/margin */ + padding: 0; + margin: 0; +} + +.empty { + margin-left: var(--cpd-space-6x); + font: var(--cpd-font-body-sm-regular); + color: var(--cpd-color-text-secondary); +} diff --git a/src/shared-components/rich-list/RichList/RichList.stories.tsx b/src/shared-components/rich-list/RichList/RichList.stories.tsx new file mode 100644 index 0000000000..e4a9406e71 --- /dev/null +++ b/src/shared-components/rich-list/RichList/RichList.stories.tsx @@ -0,0 +1,50 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React from "react"; + +import { RichList } from "./RichList"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { RichItem } from "../RichItem"; + +const avatar =
    ; + +const meta = { + title: "RichList/RichList", + component: RichList, + tags: ["autodocs"], + decorators: [ + (Story) => ( +
    + +
    + ), + ], + args: { + title: "Rich List Title", + children: ( + <> + + + + + + + ), + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Empty: Story = { + args: { + isEmpty: true, + children: "No items available", + }, +}; diff --git a/src/shared-components/rich-list/RichList/RichList.test.tsx b/src/shared-components/rich-list/RichList/RichList.test.tsx new file mode 100644 index 0000000000..625511f68e --- /dev/null +++ b/src/shared-components/rich-list/RichList/RichList.test.tsx @@ -0,0 +1,26 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { composeStories } from "@storybook/react-vite"; +import { render } from "jest-matrix-react"; +import React from "react"; + +import * as stories from "./RichList.stories"; + +const { Default, Empty } = composeStories(stories); + +describe("RichItem", () => { + it("renders the list", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders the list with isEmpty=true", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); +}); diff --git a/src/shared-components/rich-list/RichList/RichList.tsx b/src/shared-components/rich-list/RichList/RichList.tsx new file mode 100644 index 0000000000..549491e299 --- /dev/null +++ b/src/shared-components/rich-list/RichList/RichList.tsx @@ -0,0 +1,80 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type HTMLProps, type JSX, type PropsWithChildren, useId } from "react"; +import classNames from "classnames"; + +import styles from "./RichList.module.css"; +import { Flex } from "../../utils/Flex"; +import { useListKeyboardNavigation } from "../../hooks/useListKeyboardNavigation"; + +export interface RichListProps extends HTMLProps { + /** + * Title to display at the top of the list + */ + title: string; + /** + * Attributes to pass to the title element + * This can be used to set accessibility attributes like `aria-level` or `role` + * @example + * ```tsx + * + * ``` + */ + titleAttributes?: HTMLProps; + /** + * Indicates if the list should show an empty state. + * The list renders its children in a span instead of an ul. + */ + isEmpty?: boolean; +} + +/** + * A list component with a title and children. + * + * @example + * ```tsx + * + * + * + * + * ``` + */ +export function RichList({ + children, + title, + className, + titleAttributes, + isEmpty = false, + ...props +}: PropsWithChildren): JSX.Element { + const id = useId(); + const { listRef, onKeyDown, onFocus } = useListKeyboardNavigation(); + + return ( + + + {title} + + {isEmpty ? ( + {children} + ) : ( +
      + {children} +
    + )} +
    + ); +} diff --git a/src/shared-components/rich-list/RichList/__snapshots__/RichList.test.tsx.snap b/src/shared-components/rich-list/RichList/__snapshots__/RichList.test.tsx.snap new file mode 100644 index 0000000000..818984a786 --- /dev/null +++ b/src/shared-components/rich-list/RichList/__snapshots__/RichList.test.tsx.snap @@ -0,0 +1,189 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`RichItem renders the list 1`] = ` +
    +
    +
    + + Rich List Title + +
      +
    • +
      +
      +
      + + First Item + + + description + +
    • +
    • + + + Second Item + + + description + +
    • +
    • +
      +
      +
      + + Third Item + + + description + +
    • +
    • +
      +
      +
      + + Fourth Item + + + description + +
    • +
    • +
      +
      +
      + + Fifth Item + + + description + +
    • +
    +
    +
    +
    +`; + +exports[`RichItem renders the list with isEmpty=true 1`] = ` +
    +
    +
    + + Rich List Title + + + No items available + +
    +
    +
    +`; diff --git a/src/shared-components/rich-list/RichList/index.ts b/src/shared-components/rich-list/RichList/index.ts new file mode 100644 index 0000000000..88999fed3f --- /dev/null +++ b/src/shared-components/rich-list/RichList/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +export { RichList } from "./RichList"; diff --git a/src/shared-components/utils/humanize.test.ts b/src/shared-components/utils/humanize.test.ts new file mode 100644 index 0000000000..1c07dd3d04 --- /dev/null +++ b/src/shared-components/utils/humanize.test.ts @@ -0,0 +1,37 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { humanizeTime } from "./humanize"; + +describe("humanizeTime", () => { + const now = new Date("2025-08-01T12:00:00Z").getTime(); + + beforeAll(() => { + jest.useFakeTimers().setSystemTime(now); + }); + + it.each([ + // Past + ["returns 'a few seconds ago' for <15s ago", now - 5000, "a few seconds ago"], + ["returns 'about a minute ago' for <75s ago", now - 60000, "about a minute ago"], + ["returns '20 minutes ago' for <45min ago", now - 20 * 60000, "20 minutes ago"], + ["returns 'about an hour ago' for <75min ago", now - 70 * 60000, "about an hour ago"], + ["returns '5 hours ago' for <23h ago", now - 5 * 3600000, "5 hours ago"], + ["returns 'about a day ago' for <26h ago", now - 25 * 3600000, "about a day ago"], + ["returns '3 days ago' for >26h ago", now - 3 * 24 * 3600000, "3 days ago"], + // Future + ["returns 'a few seconds from now' for <15s ahead", now + 5000, "a few seconds from now"], + ["returns 'about a minute from now' for <75s ahead", now + 60000, "about a minute from now"], + ["returns '20 minutes from now' for <45min ahead", now + 20 * 60000, "20 minutes from now"], + ["returns 'about an hour from now' for <75min ahead", now + 70 * 60000, "about an hour from now"], + ["returns '5 hours from now' for <23h ahead", now + 5 * 3600000, "5 hours from now"], + ["returns 'about a day from now' for <26h ahead", now + 25 * 3600000, "about a day from now"], + ["returns '3 days from now' for >26h ahead", now + 3 * 24 * 3600000, "3 days from now"], + ])("%s", (_, date, expected) => { + expect(humanizeTime(date)).toBe(expected); + }); +}); diff --git a/src/utils/humanize.ts b/src/shared-components/utils/humanize.ts similarity index 98% rename from src/utils/humanize.ts rename to src/shared-components/utils/humanize.ts index 616ee93781..61f7705ace 100644 --- a/src/utils/humanize.ts +++ b/src/shared-components/utils/humanize.ts @@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { _t } from "../languageHandler"; +import { _t } from "./i18n"; // These are the constants we use for when to break the text const MILLISECONDS_RECENT = 15000; diff --git a/src/stores/BreadcrumbsStore.ts b/src/stores/BreadcrumbsStore.ts index e3b01cae0b..041430340e 100644 --- a/src/stores/BreadcrumbsStore.ts +++ b/src/stores/BreadcrumbsStore.ts @@ -143,7 +143,7 @@ export class BreadcrumbsStore extends AsyncStoreWithClient { // If the room is upgraded, use that room instead. We'll also splice out // any children of the room. - const history = this.matrixClient?.getRoomUpgradeHistory(room.roomId, false, msc3946ProcessDynamicPredecessor); + const history = this.matrixClient?.getRoomUpgradeHistory(room.roomId, true, msc3946ProcessDynamicPredecessor); if (history && history.length > 1) { room = history[history.length - 1]; // Last room is most recent in history diff --git a/src/stores/CallStore.ts b/src/stores/CallStore.ts index 6347cc898e..6dc41dfce1 100644 --- a/src/stores/CallStore.ts +++ b/src/stores/CallStore.ts @@ -7,10 +7,9 @@ Please see LICENSE files in the repository root for full details. */ import { logger } from "matrix-js-sdk/src/logger"; -import { GroupCallEventHandlerEvent } from "matrix-js-sdk/src/webrtc/groupCallEventHandler"; import { type MatrixRTCSession, MatrixRTCSessionManagerEvents } from "matrix-js-sdk/src/matrixrtc"; -import type { EmptyObject, GroupCall, Room } from "matrix-js-sdk/src/matrix"; +import type { EmptyObject, Room } from "matrix-js-sdk/src/matrix"; import defaultDispatcher from "../dispatcher/dispatcher"; import { UPDATE_EVENT } from "./AsyncStore"; import { AsyncStoreWithClient } from "./AsyncStoreWithClient"; @@ -53,8 +52,6 @@ export class CallStore extends AsyncStoreWithClient { for (const room of this.matrixClient.getRooms()) { this.updateRoom(room); } - this.matrixClient.on(GroupCallEventHandlerEvent.Incoming, this.onGroupCall); - this.matrixClient.on(GroupCallEventHandlerEvent.Outgoing, this.onGroupCall); this.matrixClient.matrixRTC.on(MatrixRTCSessionManagerEvents.SessionStarted, this.onRTCSessionStart); WidgetStore.instance.on(UPDATE_EVENT, this.onWidgets); @@ -85,12 +82,7 @@ export class CallStore extends AsyncStoreWithClient { this.calls.clear(); this._connectedCalls.clear(); - if (this.matrixClient) { - this.matrixClient.off(GroupCallEventHandlerEvent.Incoming, this.onGroupCall); - this.matrixClient.off(GroupCallEventHandlerEvent.Outgoing, this.onGroupCall); - this.matrixClient.off(GroupCallEventHandlerEvent.Ended, this.onGroupCall); - this.matrixClient.matrixRTC.off(MatrixRTCSessionManagerEvents.SessionStarted, this.onRTCSessionStart); - } + this.matrixClient?.matrixRTC.off(MatrixRTCSessionManagerEvents.SessionStarted, this.onRTCSessionStart); WidgetStore.instance.off(UPDATE_EVENT, this.onWidgets); } @@ -117,8 +109,16 @@ export class CallStore extends AsyncStoreWithClient { private calls = new Map(); // Key is room ID private callListeners = new Map unknown>>(); + private inUpdateRoom = false; private updateRoom(room: Room): void { - if (!this.calls.has(room.roomId)) { + // XXX: This method is guarded with the flag this.inUpdateRoom because + // we need to block this method from calling itself recursively. That + // could happen, for instance, if Call.get adds a new virtual widget to + // the WidgetStore, firing a WidgetStore update that we don't actually + // care about. Without the guard we could get duplicate Call objects + // fighting for control over the same widget. + if (!this.inUpdateRoom && !this.calls.has(room.roomId)) { + this.inUpdateRoom = true; const call = Call.get(room); if (call) { @@ -149,6 +149,7 @@ export class CallStore extends AsyncStoreWithClient { } this.emit(CallStoreEvent.Call, call, room.roomId); + this.inUpdateRoom = false; } } @@ -186,7 +187,6 @@ export class CallStore extends AsyncStoreWithClient { } }; - private onGroupCall = (groupCall: GroupCall): void => this.updateRoom(groupCall.room); private onRTCSessionStart = (roomId: string, session: MatrixRTCSession): void => { this.updateRoom(session.room); }; diff --git a/src/stores/ReleaseAnnouncementStore.ts b/src/stores/ReleaseAnnouncementStore.ts index 0b287d44b9..f828ff198f 100644 --- a/src/stores/ReleaseAnnouncementStore.ts +++ b/src/stores/ReleaseAnnouncementStore.ts @@ -13,11 +13,18 @@ import { cloneDeep } from "lodash"; import SettingsStore from "../settings/SettingsStore"; import { SettingLevel } from "../settings/SettingLevel"; import { Features } from "../settings/Settings"; +import ToastStore from "./ToastStore"; /** * The features are shown in the array order. */ -const FEATURES = ["pinningMessageList"] as const; +const FEATURES = [ + "newNotificationSounds", + "newRoomList_intro", + "newRoomList_sort", + "newRoomList_filter", + "newRoomList_settings", +] as const; /** * All the features that can be shown in the release announcements. */ @@ -76,6 +83,9 @@ export class ReleaseAnnouncementStore extends TypedEventEmitter { this.emit("releaseAnnouncementChanged", this.getReleaseAnnouncement()); }); + ToastStore.sharedInstance().on("update", () => { + this.emit("releaseAnnouncementChanged", this.getReleaseAnnouncement()); + }); } /** @@ -104,6 +114,9 @@ export class ReleaseAnnouncementStore extends TypedEventEmitter 0) return null; + const viewedReleaseAnnouncements = this.getViewedReleaseAnnouncements(); // Find the first feature that has not been viewed diff --git a/src/stores/RoomViewStore.tsx b/src/stores/RoomViewStore.tsx index e3102e773c..418a7a7d4f 100644 --- a/src/stores/RoomViewStore.tsx +++ b/src/stores/RoomViewStore.tsx @@ -26,7 +26,7 @@ import { type MatrixDispatcher } from "../dispatcher/dispatcher"; import { MatrixClientPeg } from "../MatrixClientPeg"; import Modal from "../Modal"; import { _t } from "../languageHandler"; -import { getCachedRoomIDForAlias, storeRoomAliasInCache } from "../RoomAliasCache"; +import { getCachedRoomIdForAlias, storeRoomAliasInCache } from "../RoomAliasCache"; import { Action } from "../dispatcher/actions"; import { retry } from "../utils/promise"; import { TimelineRenderingType } from "../contexts/RoomContext"; @@ -109,10 +109,6 @@ interface State { * Whether we're viewing a call or call lobby in this room */ viewingCall: boolean; - /** - * If we want the call to skip the lobby and immediately join - */ - skipLobby?: boolean; promptAskToJoin: boolean; @@ -359,13 +355,13 @@ export class RoomViewStore extends EventEmitter { let call = CallStore.instance.getCall(payload.room_id); // Start a call if not already there if (call === null) { - ElementCall.create(room, false); + ElementCall.create(room); call = CallStore.instance.getCall(payload.room_id)!; } call.presented = true; // Immediately start the call. This will connect to all required widget events // and allow the widget to show the lobby. - if (call.connectionState === ConnectionState.Disconnected) call.start(); + if (call.connectionState === ConnectionState.Disconnected) call.start({ skipLobby: payload.skipLobby }); } // If we switch to a different room from the call, we are no longer presenting it const prevRoomCall = this.state.roomId ? CallStore.instance.getCall(this.state.roomId) : null; @@ -413,7 +409,6 @@ export class RoomViewStore extends EventEmitter { replyingToEvent: null, viaServers: payload.via_servers ?? [], wasContextSwitch: payload.context_switch ?? false, - skipLobby: payload.skipLobby, viewingCall: payload.view_call ?? (payload.room_id === this.state.roomId @@ -438,6 +433,7 @@ export class RoomViewStore extends EventEmitter { action: Action.JoinRoom, roomId: payload.room_id, metricsTrigger: payload.metricsTrigger as JoinRoomPayload["metricsTrigger"], + canAskToJoin: SettingsStore.getValue("feature_ask_to_join"), }); } @@ -445,10 +441,16 @@ export class RoomViewStore extends EventEmitter { await setMarkedUnreadState(room, MatrixClientPeg.safeGet(), false); } } else if (payload.room_alias) { + let roomId: string; + let viaServers: string[] | undefined; + // Try the room alias to room ID navigation cache first to avoid // blocking room navigation on the homeserver. - let roomId = getCachedRoomIDForAlias(payload.room_alias); - if (!roomId) { + const cachedResult = getCachedRoomIdForAlias(payload.room_alias); + if (cachedResult) { + roomId = cachedResult.roomId; + viaServers = cachedResult.viaServers; + } else { // Room alias cache miss, so let's ask the homeserver. Resolve the alias // and then do a second dispatch with the room ID acquired. this.setState({ @@ -463,12 +465,12 @@ export class RoomViewStore extends EventEmitter { viaServers: payload.via_servers, wasContextSwitch: payload.context_switch, viewingCall: payload.view_call ?? false, - skipLobby: payload.skipLobby, }); try { const result = await MatrixClientPeg.safeGet().getRoomIdForAlias(payload.room_alias); - storeRoomAliasInCache(payload.room_alias, result.room_id); + storeRoomAliasInCache(payload.room_alias, result.room_id, result.servers); roomId = result.room_id; + viaServers = result.servers; } catch (err) { logger.error("RVS failed to get room id for alias: ", err); this.dis?.dispatch({ @@ -485,6 +487,7 @@ export class RoomViewStore extends EventEmitter { this.dis?.dispatch({ ...payload, room_id: roomId, + via_servers: viaServers, }); } } @@ -509,12 +512,13 @@ export class RoomViewStore extends EventEmitter { joining: true, }); - // take a copy of roomAlias & roomId as they may change by the time the join is complete - const { roomAlias, roomId } = this.state; - const address = payload.roomId || roomAlias || roomId!; + // take a copy of roomAlias, roomId & viaServers as they may change by the time the join is complete + const { roomAlias, roomId = payload.roomId, viaServers = [] } = this.state; + // prefer the room alias if we have one as it allows joining over federation even with no viaServers + const address = roomAlias || roomId!; const joinOpts: IJoinRoomOpts = { - viaServers: this.state.viaServers || [], + viaServers, ...(payload.opts ?? {}), }; if (SettingsStore.getValue("feature_share_history_on_invite")) { @@ -547,7 +551,7 @@ export class RoomViewStore extends EventEmitter { canAskToJoin: payload.canAskToJoin, }); - if (payload.canAskToJoin) { + if (payload.canAskToJoin && err instanceof MatrixError && err.httpStatus === 403) { this.dis?.dispatch({ action: Action.PromptAskToJoin }); } } @@ -729,10 +733,6 @@ export class RoomViewStore extends EventEmitter { return this.state.viewingCall; } - public skipCallLobby(): boolean | undefined { - return this.state.skipLobby; - } - /** * Gets the current state of the 'promptForAskToJoin' property. * diff --git a/src/stores/WidgetStore.ts b/src/stores/WidgetStore.ts index 5a76df7103..fbae950dbc 100644 --- a/src/stores/WidgetStore.ts +++ b/src/stores/WidgetStore.ts @@ -189,6 +189,7 @@ export default class WidgetStore extends AsyncStoreWithClient { const app = WidgetUtils.makeAppConfig(widget.id, widget, widget.creatorUserId, roomId, undefined); this.widgetMap.set(WidgetUtils.getWidgetUid(app), app); this.roomMap.get(roomId)!.widgets.push(app); + this.emit(UPDATE_EVENT, roomId); return app; } @@ -198,6 +199,7 @@ export default class WidgetStore extends AsyncStoreWithClient { if (roomApps) { roomApps.widgets = roomApps.widgets.filter((app) => !(app.id === widgetId && app.roomId === roomId)); } + this.emit(UPDATE_EVENT, roomId); } } diff --git a/src/stores/room-list-v3/RoomListStoreV3.ts b/src/stores/room-list-v3/RoomListStoreV3.ts index 7933b1fc85..f5fb48df07 100644 --- a/src/stores/room-list-v3/RoomListStoreV3.ts +++ b/src/stores/room-list-v3/RoomListStoreV3.ts @@ -6,9 +6,9 @@ Please see LICENSE files in the repository root for full details. */ import { logger } from "matrix-js-sdk/src/logger"; -import { EventType, KnownMembership } from "matrix-js-sdk/src/matrix"; +import { EventType } from "matrix-js-sdk/src/matrix"; -import type { EmptyObject, Room, RoomState } from "matrix-js-sdk/src/matrix"; +import type { EmptyObject, Room } from "matrix-js-sdk/src/matrix"; import type { MatrixDispatcher } from "../../dispatcher/dispatcher"; import type { ActionPayload } from "../../dispatcher/payloads"; import type { FilterKey } from "./skip-list/filters"; @@ -235,12 +235,10 @@ export class RoomListStoreV3Class extends AsyncStoreWithClient { this.addRoomAndEmit(payload.room); return; } - // If the user has left this room, remove it from the skiplist. if ( - (payload.oldMembership === KnownMembership.Invite || - payload.oldMembership === KnownMembership.Join) && - payload.membership === KnownMembership.Leave + (oldMembership === EffectiveMembership.Invite || oldMembership === EffectiveMembership.Join) && + newMembership === EffectiveMembership.Leave ) { this.roomSkipList.removeRoom(payload.room); this.emit(LISTS_UPDATE_EVENT); @@ -250,12 +248,15 @@ export class RoomListStoreV3Class extends AsyncStoreWithClient { // If we're joining an upgraded room, we'll want to make sure we don't proliferate // the dead room in the list. if (oldMembership !== EffectiveMembership.Join && newMembership === EffectiveMembership.Join) { - const roomState: RoomState = payload.room.currentState; - const predecessor = roomState.findPredecessor(this.msc3946ProcessDynamicPredecessor); - if (predecessor) { - const prevRoom = this.matrixClient?.getRoom(predecessor.roomId); - if (prevRoom) this.roomSkipList.removeRoom(prevRoom); - else logger.warn(`Unable to find predecessor room with id ${predecessor.roomId}`); + const room: Room = payload.room; + const roomUpgradeHistory = room.client.getRoomUpgradeHistory( + room.roomId, + true, + this.msc3946ProcessDynamicPredecessor, + ); + const predecessors = roomUpgradeHistory.slice(0, roomUpgradeHistory.indexOf(room)); + for (const predecessor of predecessors) { + this.roomSkipList.removeRoom(predecessor); } } diff --git a/src/stores/room-list/RoomListStore.ts b/src/stores/room-list/RoomListStore.ts index 2fc396b8b3..c6675d7aa5 100644 --- a/src/stores/room-list/RoomListStore.ts +++ b/src/stores/room-list/RoomListStore.ts @@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { type MatrixClient, type Room, type RoomState, EventType, type EmptyObject } from "matrix-js-sdk/src/matrix"; +import { type MatrixClient, type Room, EventType, type EmptyObject } from "matrix-js-sdk/src/matrix"; import { logger } from "matrix-js-sdk/src/logger"; import SettingsStore from "../../settings/SettingsStore"; @@ -308,24 +308,22 @@ export class RoomListStoreClass extends AsyncStoreWithClient implem const oldMembership = getEffectiveMembership(membershipPayload.oldMembership); const newMembership = getEffectiveMembershipTag(membershipPayload.room, membershipPayload.membership); if (oldMembership !== EffectiveMembership.Join && newMembership === EffectiveMembership.Join) { - // If we're joining an upgraded room, we'll want to make sure we don't proliferate - // the dead room in the list. - const roomState: RoomState = membershipPayload.room.currentState; - const predecessor = roomState.findPredecessor(this.msc3946ProcessDynamicPredecessor); - if (predecessor) { - const prevRoom = this.matrixClient?.getRoom(predecessor.roomId); - if (prevRoom) { - const isSticky = this.algorithm.stickyRoom === prevRoom; - if (isSticky) { - this.algorithm.setStickyRoom(null); - } - - // Note: we hit the algorithm instead of our handleRoomUpdate() function to - // avoid redundant updates. - this.algorithm.handleRoomUpdate(prevRoom, RoomUpdateCause.RoomRemoved); - } else { - logger.warn(`Unable to find predecessor room with id ${predecessor.roomId}`); + // If we're joining an upgraded room, we'll want to make sure we don't proliferate the dead room in the list. + const room: Room = membershipPayload.room; + const roomUpgradeHistory = room.client.getRoomUpgradeHistory( + room.roomId, + true, + this.msc3946ProcessDynamicPredecessor, + ); + const predecessors = roomUpgradeHistory.slice(0, roomUpgradeHistory.indexOf(room)); + for (const predecessor of predecessors) { + const isSticky = this.algorithm.stickyRoom === predecessor; + if (isSticky) { + this.algorithm.setStickyRoom(null); } + // Note: we hit the algorithm instead of our handleRoomUpdate() function to + // avoid redundant updates. + this.algorithm.handleRoomUpdate(predecessor, RoomUpdateCause.RoomRemoved); } await this.handleRoomUpdate(membershipPayload.room, RoomUpdateCause.NewRoom); diff --git a/src/stores/spaces/SpaceStore.ts b/src/stores/spaces/SpaceStore.ts index 2945d486c2..bfb98f6b02 100644 --- a/src/stores/spaces/SpaceStore.ts +++ b/src/stores/spaces/SpaceStore.ts @@ -49,7 +49,7 @@ import { UPDATE_SUGGESTED_ROOMS, UPDATE_TOP_LEVEL_SPACES, } from "."; -import { getCachedRoomIDForAlias } from "../../RoomAliasCache"; +import { getCachedRoomIdForAlias } from "../../RoomAliasCache"; import { EffectiveMembership, getEffectiveMembership } from "../../utils/membership"; import { flattenSpaceHierarchyWithCache, @@ -1249,7 +1249,8 @@ export class SpaceStoreClass extends AsyncStoreWithClient { let roomId = payload.room_id; if (payload.room_alias && !roomId) { - roomId = getCachedRoomIDForAlias(payload.room_alias); + const result = getCachedRoomIdForAlias(payload.room_alias); + if (result) roomId = result.roomId; } if (!roomId) return; // we'll get re-fired with the room ID shortly diff --git a/src/stores/widgets/StopGapWidgetDriver.ts b/src/stores/widgets/StopGapWidgetDriver.ts index aa8721c28e..afd0a85cfc 100644 --- a/src/stores/widgets/StopGapWidgetDriver.ts +++ b/src/stores/widgets/StopGapWidgetDriver.ts @@ -190,6 +190,9 @@ export class StopGapWidgetDriver extends WidgetDriver { EventType.Reaction, EventType.RoomRedaction, "io.element.call.reaction", + // MSC4310: Add dev and final event to ease future transition, + EventType.RTCDecline, + "m.rtc.decline", ]; for (const eventType of [...sendRoomEvents, ...sendRecvRoomEvents]) this.allowedCapabilities.add(WidgetEventCapability.forRoomEvent(EventDirection.Send, eventType).raw); diff --git a/src/toasts/IncomingCallToast.tsx b/src/toasts/IncomingCallToast.tsx index 9f393beb06..b5f426986e 100644 --- a/src/toasts/IncomingCallToast.tsx +++ b/src/toasts/IncomingCallToast.tsx @@ -6,10 +6,14 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import React, { type JSX, useCallback, useEffect, useState } from "react"; -import { type MatrixEvent, type RoomMember } from "matrix-js-sdk/src/matrix"; -import { Button, Tooltip, TooltipProvider } from "@vector-im/compound-web"; +import React, { type JSX, useCallback, useEffect, useRef, useState } from "react"; +import { type Room, type MatrixEvent, type RoomMember, RoomEvent, EventType } from "matrix-js-sdk/src/matrix"; +import { Button, ToggleInput, Tooltip, TooltipProvider } from "@vector-im/compound-web"; import VideoCallIcon from "@vector-im/compound-design-tokens/assets/web/icons/video-call-solid"; +import CheckIcon from "@vector-im/compound-design-tokens/assets/web/icons/check"; +import CrossIcon from "@vector-im/compound-design-tokens/assets/web/icons/close"; +import { logger } from "matrix-js-sdk/src/logger"; +import { type IRTCNotificationContent } from "matrix-js-sdk/src/matrixrtc"; import { _t } from "../languageHandler"; import RoomAvatar from "../components/views/avatars/RoomAvatar"; @@ -31,8 +35,36 @@ import { type Call, CallEvent } from "../models/Call"; import LegacyCallHandler, { AudioID } from "../LegacyCallHandler"; import { useEventEmitter } from "../hooks/useEventEmitter"; import { CallStore, CallStoreEvent } from "../stores/CallStore"; +import { AvatarWithDetails } from "../shared-components/avatar/AvatarWithDetails"; -export const getIncomingCallToastKey = (callId: string, roomId: string): string => `call_${callId}_${roomId}`; +/** + * Get the key for the incoming call toast. A combination of the event ID and room ID. + * @param notificationEventId The ID of the notification event. + * @param roomId The ID of the room. + * @returns The key for the incoming call toast. + */ +export const getIncomingCallToastKey = (notificationEventId: string, roomId: string): string => + `call_${notificationEventId}_${roomId}`; + +/** + * Get the ts when the notification event was sent. + * This can be either the origin_server_ts or a ts the sender of this event claims as + * the time they sent it (sender_ts). + * The origin_server_ts is the fallback if sender_ts seems wrong. + * @param event The RTCNotification event. + * @returns The timestamp to use as the expect start time to apply the `lifetime` to. + */ +export const getNotificationEventSendTs = (event: MatrixEvent): number => { + const content = event.getContent() as Partial; + const sendTs = content.sender_ts; + if (sendTs && Math.abs(sendTs - event.getTs()) >= 15000) { + logger.warn( + "Received RTCNotification event. With large sender_ts origin_server_ts offset -> using origin_server_ts", + ); + return event.getTs(); + } + return sendTs ?? event.getTs(); +}; const MAX_RING_TIME_MS = 90 * 1000; interface JoinCallButtonWithCallProps { @@ -49,11 +81,11 @@ function JoinCallButtonWithCall({ onClick, call, disabledTooltip }: JoinCallButt return ( + + ); +} + +interface Props { + notificationEvent: MatrixEvent; +} + +export function IncomingCallToast({ notificationEvent }: Props): JSX.Element { + const roomId = notificationEvent.getRoomId()!; + // Use a partial type so ts still helps us to not miss any type checks. + const notificationContent = notificationEvent.getContent() as Partial; const room = MatrixClientPeg.safeGet().getRoom(roomId) ?? undefined; const call = useCall(roomId); const [connectedCalls, setConnectedCalls] = useState(Array.from(CallStore.instance.connectedCalls)); @@ -75,35 +147,59 @@ export function IncomingCallToast({ notifyEvent }: Props): JSX.Element { setConnectedCalls(Array.from(CallStore.instance.connectedCalls)); }); const otherCallIsOngoing = connectedCalls.find((call) => call.roomId !== roomId); - // Start ringing if not already. + const soundHasStarted = useRef(false); useEffect(() => { - const isRingToast = (notifyEvent.getContent() as unknown as { notify_type: string })["notify_type"] == "ring"; - if (isRingToast && !LegacyCallHandler.instance.isPlaying(AudioID.Ring)) { - LegacyCallHandler.instance.play(AudioID.Ring); + // This section can race, so we use a ref to keep track of whether we have started trying to play. + // This is because `LegacyCallHandler.play` tries to load the sound and then play it asynchonously + // and `LegacyCallHandler.isPlaying` will not be `true` until the sound starts playing. + const isRingToast = notificationContent.notification_type == "ring"; + if (isRingToast && !soundHasStarted.current && !LegacyCallHandler.instance.isPlaying(AudioID.Ring)) { + // Start ringing if not already. + soundHasStarted.current = true; + void LegacyCallHandler.instance.play(AudioID.Ring); } - }, [notifyEvent]); + }, [notificationContent.notification_type, soundHasStarted]); // Stop ringing on dismiss. const dismissToast = useCallback((): void => { - ToastStore.sharedInstance().dismissToast( - getIncomingCallToastKey(notifyEvent.getContent().call_id ?? "", roomId), - ); + const notificationId = notificationEvent.getId(); + if (!notificationId) { + logger.warn("Could not get eventId for RTCNotification event"); + return; + } + ToastStore.sharedInstance().dismissToast(getIncomingCallToastKey(notificationId, roomId)); LegacyCallHandler.instance.pause(AudioID.Ring); - }, [notifyEvent, roomId]); + }, [notificationEvent, roomId]); // Dismiss if session got ended remotely. const onCall = useCallback( (call: Call, callRoomId: string): void => { - const roomId = notifyEvent.getRoomId(); + const roomId = notificationEvent.getRoomId(); if (!roomId && roomId !== callRoomId) return; if (call === null || call.participants.size === 0) { dismissToast(); } }, - [dismissToast, notifyEvent], + [dismissToast, notificationEvent], ); - // Dismiss if antother device from this user joins. + // Dismiss if session got declined remotely. + const onTimelineChange = useCallback( + (ev: MatrixEvent) => { + const userId = room?.client.getUserId(); + if ( + ev.getType() === EventType.RTCDecline && + userId !== undefined && + ev.getSender() === userId && // It is our decline not someone elses + ev.relationEventId === notificationEvent.getId() // The event declines this ringing toast. + ) { + dismissToast(); + } + }, + [dismissToast, notificationEvent, room?.client], + ); + + // Dismiss if another device from this user joins. const onParticipantChange = useCallback( (participants: Map>, prevParticipants: Map>) => { if (Array.from(participants.keys()).some((p) => p.userId == room?.client.getUserId())) { @@ -115,7 +211,8 @@ export function IncomingCallToast({ notifyEvent }: Props): JSX.Element { // Dismiss on timeout. useEffect(() => { - const timeout = setTimeout(dismissToast, MAX_RING_TIME_MS); + const lifetime = notificationContent.lifetime ?? MAX_RING_TIME_MS; + const timeout = setTimeout(dismissToast, getNotificationEventSendTs(notificationEvent) + lifetime - Date.now()); return () => clearTimeout(timeout); }); @@ -132,7 +229,10 @@ export function IncomingCallToast({ notifyEvent }: Props): JSX.Element { ), ); + const [skipLobbyToggle, setSkipLobbyToggle] = useState(true); + // Dismiss on clicking join. + // If the skip lobby option is undefined, it will use to the shift key state to decide if the lobby is skipped. const onJoinClick = useCallback( (e: ButtonEvent): void => { e.stopPropagation(); @@ -142,11 +242,11 @@ export function IncomingCallToast({ notifyEvent }: Props): JSX.Element { action: Action.ViewRoom, room_id: room?.roomId, view_call: true, - skipLobby: "shiftKey" in e ? e.shiftKey : false, + skipLobby: ("shiftKey" in e && e.shiftKey) || skipLobbyToggle, metricsTrigger: undefined, }); }, - [room], + [room, skipLobbyToggle], ); // Dismiss on closing toast. @@ -161,35 +261,47 @@ export function IncomingCallToast({ notifyEvent }: Props): JSX.Element { useEventEmitter(CallStore.instance, CallStoreEvent.Call, onCall); useEventEmitter(call ?? undefined, CallEvent.Participants, onParticipantChange); + useEventEmitter(room, RoomEvent.Timeline, onTimelineChange); + const callLiveContentSummary = call ? ( + + ) : ( + + ); return ( <> -
    - -
    -
    - - {room ? room.name : _t("voip|call_toast_unknown_room")} - -
    {_t("voip|video_call_started")}
    - {call ? ( - - ) : ( - - )} +
    + {" "} + {_t("voip|video_call_started")}
    - } + details={callLiveContentSummary} + title={room ? room.name : _t("voip|call_toast_unknown_room")} /> +
    + {_t("voip|skip_lobby_toggle_option")} + setSkipLobbyToggle(e.target.checked)} checked={skipLobbyToggle} /> +
    +
    + + +
    { deviceListener.dismissEncryptionSetup(); break; } - case Kind.KEY_STORAGE_OUT_OF_SYNC: { + case Kind.KEY_STORAGE_OUT_OF_SYNC: + case Kind.KEY_STORAGE_OUT_OF_SYNC_STORE: { // Open the user settings dialog to the encryption tab and start the flow to reset encryption const payload: OpenToTabPayload = { action: Action.ViewUserSettings, @@ -207,16 +208,6 @@ export const showToast = (kind: Kind): void => { defaultDispatcher.dispatch(payload); break; } - case Kind.KEY_STORAGE_OUT_OF_SYNC_STORE: { - // Open the user settings dialog to the encryption tab and start the flow to reset 4S - const payload: OpenToTabPayload = { - action: Action.ViewUserSettings, - initialTabId: UserTab.Encryption, - props: { initialEncryptionState: "change_recovery_key" }, - }; - defaultDispatcher.dispatch(payload); - break; - } case Kind.TURN_ON_KEY_STORAGE: { // The user clicked "Dismiss": offer them "Are you sure?" const modal = Modal.createDialog( diff --git a/src/utils/MediaEventHelper.ts b/src/utils/MediaEventHelper.ts index 98cbe4da58..075ef11c4e 100644 --- a/src/utils/MediaEventHelper.ts +++ b/src/utils/MediaEventHelper.ts @@ -117,7 +117,7 @@ export class MediaEventHelper implements IDestroyable { /** * Determine if the media event in question supports being hidden in the timeline. * @param event Any matrix event. - * @returns `true` if the media can be hidden, otherwise false. + * @returns `true` if the media can be hidden, otherwise `false`. */ public static canHide(event: MatrixEvent): boolean { if (!event) return false; diff --git a/src/utils/WellKnownUtils.ts b/src/utils/WellKnownUtils.ts index b2af51e2c3..f1e093b66a 100644 --- a/src/utils/WellKnownUtils.ts +++ b/src/utils/WellKnownUtils.ts @@ -30,8 +30,6 @@ export interface IE2EEWellKnown { * Disables the option to enable encryption in room settings for all new and existing rooms */ force_disable?: boolean; - secure_backup_required?: boolean; - secure_backup_setup_methods?: SecureBackupSetupMethod[]; } export interface ITileServerWellKnown { @@ -74,28 +72,3 @@ export function getEmbeddedPagesWellKnown(matrixClient: MatrixClient | undefined export function embeddedPagesFromWellKnown(clientWellKnown?: IClientWellKnown): IEmbeddedPagesWellKnown { return clientWellKnown?.[EMBEDDED_PAGES_WK_PROPERTY]; } - -export function isSecureBackupRequired(matrixClient: MatrixClient): boolean { - return getE2EEWellKnown(matrixClient)?.["secure_backup_required"] === true; -} - -export enum SecureBackupSetupMethod { - Key = "key", - Passphrase = "passphrase", -} - -export function getSecureBackupSetupMethods(matrixClient: MatrixClient): SecureBackupSetupMethod[] { - const wellKnown = getE2EEWellKnown(matrixClient); - if ( - !wellKnown || - !wellKnown["secure_backup_setup_methods"] || - !wellKnown["secure_backup_setup_methods"].length || - !( - wellKnown["secure_backup_setup_methods"].includes(SecureBackupSetupMethod.Key) || - wellKnown["secure_backup_setup_methods"].includes(SecureBackupSetupMethod.Passphrase) - ) - ) { - return [SecureBackupSetupMethod.Key, SecureBackupSetupMethod.Passphrase]; - } - return wellKnown["secure_backup_setup_methods"]; -} diff --git a/src/utils/leave-behaviour.ts b/src/utils/leave-behaviour.ts index 2ad6e7d4fe..8b7ee02f36 100644 --- a/src/utils/leave-behaviour.ts +++ b/src/utils/leave-behaviour.ts @@ -40,7 +40,7 @@ export async function leaveRoomBehaviour( let leavingAllVersions = true; const history = matrixClient.getRoomUpgradeHistory( roomId, - false, + true, SettingsStore.getValue("feature_dynamic_room_predecessors"), ); if (history && history.length > 0) { diff --git a/src/utils/room/placeCall.ts b/src/utils/room/placeCall.ts index 1f0d67c1e6..590ded7a80 100644 --- a/src/utils/room/placeCall.ts +++ b/src/utils/room/placeCall.ts @@ -21,12 +21,13 @@ import PosthogTrackers from "../../PosthogTrackers"; * @param room the room to place the call in * @param callType the type of call * @param platformCallType the platform to pass the call on + * @param skipLobby Has the user indicated they would like to skip the lobby. Otherwise, defer to platform defaults. */ export const placeCall = async ( room: Room, callType: CallType, platformCallType: PlatformCallType, - skipLobby: boolean, + skipLobby?: boolean, ): Promise => { const { analyticsName } = getPlatformCallTypeProps(platformCallType); PosthogTrackers.trackInteraction(analyticsName); diff --git a/src/vector/platform/ElectronPlatform.tsx b/src/vector/platform/ElectronPlatform.tsx index bef544d15d..236703922c 100644 --- a/src/vector/platform/ElectronPlatform.tsx +++ b/src/vector/platform/ElectronPlatform.tsx @@ -18,6 +18,7 @@ import { } from "matrix-js-sdk/src/matrix"; import React from "react"; import { logger } from "matrix-js-sdk/src/logger"; +import { uniqueId } from "lodash"; import BasePlatform, { UpdateCheckStatus, type UpdateStatus } from "../../BasePlatform"; import type BaseEventIndexManager from "../../indexing/BaseEventIndexManager"; @@ -43,6 +44,7 @@ import { SeshatIndexManager } from "./SeshatIndexManager"; import { IPCManager } from "./IPCManager"; import { _t } from "../../languageHandler"; import { BadgeOverlayRenderer } from "../../favicon"; +import GenericToast from "../../components/views/toasts/GenericToast.tsx"; interface SquirrelUpdate { releaseNotes: string; @@ -95,6 +97,7 @@ export default class ElectronPlatform extends BasePlatform { private badgeOverlayRenderer?: BadgeOverlayRenderer; private config!: IConfigOptions; private supportedSettings?: Record; + private clientStartedPromiseWithResolvers = Promise.withResolvers(); public constructor() { super(); @@ -182,6 +185,27 @@ export default class ElectronPlatform extends BasePlatform { await this.ipc.call("callDisplayMediaCallback", source ?? { id: "", name: "", thumbnailURL: "" }); }); + this.electron.on("showToast", async (ev, { title, description, priority = 40 }) => { + await this.clientStartedPromiseWithResolvers.promise; + + const key = uniqueId("electron_showToast_"); + const onPrimaryClick = (): void => { + ToastStore.sharedInstance().dismissToast(key); + }; + + ToastStore.sharedInstance().addOrReplaceToast({ + key, + title, + props: { + description, + primaryLabel: _t("action|dismiss"), + onPrimaryClick, + }, + component: GenericToast, + priority, + }); + }); + BreadcrumbsStore.instance.on(UPDATE_EVENT, this.onBreadcrumbsUpdate); this.initialised = this.initialise(); @@ -193,6 +217,10 @@ export default class ElectronPlatform extends BasePlatform { if (["call_state"].includes(payload.action)) { this.electron.send("app_onAction", payload); } + + if (payload.action === "client_started") { + this.clientStartedPromiseWithResolvers.resolve(); + } } private async initialise(): Promise { @@ -530,4 +558,12 @@ export default class ElectronPlatform extends BasePlatform { } return url; } + + public checkSessionLockFree(): boolean { + return true; + } + + public async getSessionLock(_onNewInstance: () => Promise): Promise { + return true; + } } diff --git a/src/vector/platform/WebPlatform.ts b/src/vector/platform/WebPlatform.ts index 46b6a61f83..87ed2389dc 100644 --- a/src/vector/platform/WebPlatform.ts +++ b/src/vector/platform/WebPlatform.ts @@ -22,6 +22,7 @@ import ToastStore from "../../stores/ToastStore.ts"; import GenericToast from "../../components/views/toasts/GenericToast.tsx"; import SdkConfig from "../../SdkConfig.ts"; import type { ActionPayload } from "../../dispatcher/payloads.ts"; +import * as SessionLock from "../../utils/SessionLock.ts"; const POKE_RATE_MS = 10 * 60 * 1000; // 10 min @@ -268,4 +269,12 @@ export default class WebPlatform extends BasePlatform { public reload(): void { window.location.reload(); } + + public checkSessionLockFree(): boolean { + return SessionLock.checkSessionLockFree(); + } + + public async getSessionLock(onNewInstance: () => Promise): Promise { + return SessionLock.getSessionLock(onNewInstance); + } } diff --git a/test/test-utils/call.ts b/test/test-utils/call.ts index a0a1c84536..c122d1d756 100644 --- a/test/test-utils/call.ts +++ b/test/test-utils/call.ts @@ -7,11 +7,29 @@ Please see LICENSE files in the repository root for full details. */ import { MatrixWidgetType } from "matrix-widget-api"; +import { + type GroupCall, + Room, + type RoomMember, + type MatrixEvent, + type MatrixClient, + PendingEventOrdering, + KnownMembership, + RoomStateEvent, + type IContent, +} from "matrix-js-sdk/src/matrix"; +import { mocked, type Mocked } from "jest-mock"; +import { type MatrixRTCSession } from "matrix-js-sdk/src/matrixrtc"; -import type { GroupCall, Room, RoomMember, MatrixEvent } from "matrix-js-sdk/src/matrix"; -import { mkEvent } from "./test-utils"; +import { mkEvent, mkRoomMember, setupAsyncStoreWithClient, stubClient } from "./test-utils"; import { Call, type ConnectionState, ElementCall, JitsiCall } from "../../src/models/Call"; import { CallStore } from "../../src/stores/CallStore"; +import { MatrixClientPeg } from "../../src/MatrixClientPeg"; +import DMRoomMap from "../../src/utils/DMRoomMap"; +import { MockEventEmitter } from "./client"; +import WidgetStore from "../../src/stores/WidgetStore"; +import { WidgetMessagingStore } from "../../src/stores/widgets/WidgetMessagingStore"; +import SettingsStore from "../../src/settings/SettingsStore"; export class MockedCall extends Call { public static readonly EVENT_TYPE = "org.example.mocked_call"; @@ -79,7 +97,6 @@ export class MockedCall extends Call { // No action needed for any of the following methods since this is just a mock public async clean(): Promise {} // Public to allow spying - public async performConnection(): Promise {} public async performDisconnection(): Promise {} public destroy() { @@ -106,8 +123,92 @@ export class MockedCall extends Call { /** * Sets up the call store to use mocked calls. */ -export const useMockedCalls = () => { +export function useMockedCalls() { Call.get = (room) => MockedCall.get(room); JitsiCall.create = async (room) => MockedCall.create(room, "1"); ElementCall.create = (room) => MockedCall.create(room, "1"); -}; +} + +/** + * Enables the feature flags required for call tests. + */ +export function enableCalls(): { enabledSettings: Set } { + const enabledSettings = new Set(["feature_group_calls", "feature_video_rooms", "feature_element_call_video_rooms"]); + jest.spyOn(SettingsStore, "getValue").mockImplementation((settingName): any => { + if (settingName.startsWith("feature_")) return enabledSettings.has(settingName); + if (settingName === "activeCallRoomIds") return []; + return undefined; + }); + return { enabledSettings }; +} + +export function setUpClientRoomAndStores(): { + client: Mocked; + room: Room; + alice: RoomMember; + bob: RoomMember; + carol: RoomMember; + roomSession: Mocked; +} { + stubClient(); + const client = mocked(MatrixClientPeg.safeGet()); + DMRoomMap.makeShared(client); + + const room = new Room("!1:example.org", client, "@alice:example.org", { + pendingEventOrdering: PendingEventOrdering.Detached, + }); + + const alice = mkRoomMember(room.roomId, "@alice:example.org"); + const bob = mkRoomMember(room.roomId, "@bob:example.org"); + const carol = mkRoomMember(room.roomId, "@carol:example.org"); + jest.spyOn(room, "getMember").mockImplementation((userId) => { + switch (userId) { + case alice.userId: + return alice; + case bob.userId: + return bob; + case carol.userId: + return carol; + default: + return null; + } + }); + + jest.spyOn(room, "getMyMembership").mockReturnValue(KnownMembership.Join); + + client.getRoom.mockImplementation((roomId) => (roomId === room.roomId ? room : null)); + + const roomSession = new MockEventEmitter({ + memberships: [], + getOldestMembership: jest.fn().mockReturnValue(undefined), + room, + }) as Mocked; + + client.matrixRTC.getRoomSession.mockReturnValue(roomSession); + client.getRooms.mockReturnValue([room]); + client.getUserId.mockReturnValue(alice.userId); + client.getDeviceId.mockReturnValue("alices_device"); + client.reEmitter.reEmit(room, [RoomStateEvent.Events]); + client.sendStateEvent.mockImplementation(async (roomId, eventType, content, stateKey = "") => { + if (roomId !== room.roomId) throw new Error("Unknown room"); + const event = mkEvent({ + event: true, + type: eventType, + room: roomId, + user: alice.userId, + skey: stateKey, + content: content as IContent, + }); + room.addLiveEvents([event], { addToState: true }); + return { event_id: event.getId()! }; + }); + + setupAsyncStoreWithClient(WidgetStore.instance, client); + setupAsyncStoreWithClient(WidgetMessagingStore.instance, client); + + return { client, room, alice, bob, carol, roomSession }; +} + +export function cleanUpClientRoomAndStores(client: MatrixClient, room: Room) { + client.reEmitter.stopReEmitting(room, [RoomStateEvent.Events]); +} diff --git a/test/test-utils/platform.ts b/test/test-utils/platform.ts index 3769826576..ec742a407e 100644 --- a/test/test-utils/platform.ts +++ b/test/test-utils/platform.ts @@ -10,6 +10,7 @@ import { type MethodLikeKeys, mocked, type MockedObject } from "jest-mock"; import BasePlatform from "../../src/BasePlatform"; import PlatformPeg from "../../src/PlatformPeg"; +import * as SessionLock from "../../src/utils/SessionLock"; // doesn't implement abstract // @ts-ignore @@ -18,6 +19,14 @@ class MockPlatform extends BasePlatform { super(); Object.assign(this, platformMocks); } + + public checkSessionLockFree(): boolean { + return SessionLock.checkSessionLockFree(); + } + + public async getSessionLock(onNewInstance: () => Promise): Promise { + return SessionLock.getSessionLock(onNewInstance); + } } /** * Mock Platform Peg diff --git a/test/test-utils/test-utils.ts b/test/test-utils/test-utils.ts index 1c147023c2..d96ee1d045 100644 --- a/test/test-utils/test-utils.ts +++ b/test/test-utils/test-utils.ts @@ -204,6 +204,7 @@ export function createTestClient(): MatrixClient { sendTyping: jest.fn().mockResolvedValue({}), sendMessage: jest.fn().mockResolvedValue({}), sendStateEvent: jest.fn().mockResolvedValue(undefined), + sendRtcDecline: jest.fn().mockResolvedValue(undefined), getSyncState: jest.fn().mockReturnValue("SYNCING"), generateClientSecret: () => "t35tcl1Ent5ECr3T", isGuest: jest.fn().mockReturnValue(false), diff --git a/test/unit-tests/ContentMessages-test.ts b/test/unit-tests/ContentMessages-test.ts index 80b400568e..51bb73fbfd 100644 --- a/test/unit-tests/ContentMessages-test.ts +++ b/test/unit-tests/ContentMessages-test.ts @@ -10,6 +10,7 @@ import { mocked } from "jest-mock"; import { type ISendEventResponse, type MatrixClient, + MatrixError, RelationType, type UploadResponse, } from "matrix-js-sdk/src/matrix"; @@ -20,6 +21,9 @@ import ContentMessages, { UploadCanceledError, uploadFile } from "../../src/Cont import { doMaybeLocalRoomAction } from "../../src/utils/local-room"; import { createTestClient, flushPromises, mkEvent } from "../test-utils"; import { BlurhashEncoder } from "../../src/BlurhashEncoder"; +import Modal from "../../src/Modal"; +import ErrorDialog from "../../src/components/views/dialogs/ErrorDialog"; +import { _t } from "../../src/languageHandler"; jest.mock("matrix-encrypt-attachment", () => ({ encryptAttachment: jest.fn().mockResolvedValue({}) })); @@ -291,6 +295,28 @@ describe("ContentMessages", () => { }), ); }); + + it("handles 413 error", async () => { + mocked(client.uploadContent).mockRejectedValue( + new MatrixError( + { + errcode: "M_TOO_LARGE", + error: "File size limit exceeded", + }, + 413, + ), + ); + const file = new File([], "fileName", { type: "image/jpeg" }); + const dialogSpy = jest.spyOn(Modal, "createDialog"); + await contentMessages.sendContentToRoom(file, roomId, undefined, client, undefined); + expect(dialogSpy).toHaveBeenCalledWith( + ErrorDialog, + expect.objectContaining({ + description: _t("upload_failed_size", { fileName: "fileName" }), + }), + ); + dialogSpy.mockRestore(); + }); }); describe("getCurrentUploads", () => { diff --git a/test/unit-tests/LegacyCallHandler-test.ts b/test/unit-tests/LegacyCallHandler-test.ts index 972f17b7e0..b21aa76a17 100644 --- a/test/unit-tests/LegacyCallHandler-test.ts +++ b/test/unit-tests/LegacyCallHandler-test.ts @@ -585,4 +585,42 @@ describe("LegacyCallHandler without third party protocols", () => { expect(mockAudioBufferSourceNode.start).not.toHaveBeenCalled(); }); }); + + describe("sidebar state", () => { + const roomId = "test-room-id"; + + it("should default to showing sidebar", () => { + const call = new MatrixCall({ + client: MatrixClientPeg.safeGet(), + roomId, + }); + const cli = MatrixClientPeg.safeGet(); + cli.emit(CallEventHandlerEvent.Incoming, call); + + expect(callHandler.isCallSidebarShown(call.callId)).toEqual(true); + }); + + it("should remember sidebar state per call", () => { + const call = new MatrixCall({ + client: MatrixClientPeg.safeGet(), + roomId, + }); + const cli = MatrixClientPeg.safeGet(); + cli.emit(CallEventHandlerEvent.Incoming, call); + + expect(callHandler.isCallSidebarShown(call.callId)).toEqual(true); + callHandler.setCallSidebarShown(call.callId, false); + expect(callHandler.isCallSidebarShown(call.callId)).toEqual(false); + + call.emit(CallEvent.Hangup, call); + + const call2 = new MatrixCall({ + client: MatrixClientPeg.safeGet(), + roomId, + }); + cli.emit(CallEventHandlerEvent.Incoming, call2); + + expect(callHandler.isCallSidebarShown(call2.callId)).toEqual(true); + }); + }); }); diff --git a/test/unit-tests/Notifier-test.ts b/test/unit-tests/Notifier-test.ts index 92df3bc385..5ff4b0bf77 100644 --- a/test/unit-tests/Notifier-test.ts +++ b/test/unit-tests/Notifier-test.ts @@ -371,6 +371,7 @@ describe("Notifier", () => { beforeEach(() => { jest.spyOn(SettingsStore, "getValue").mockReturnValue(true); jest.spyOn(ToastStore.sharedInstance(), "addOrReplaceToast"); + jest.spyOn(ToastStore.sharedInstance(), "dismissToast"); mockClient.getPushActionsForEvent.mockReturnValue({ notify: true, @@ -384,33 +385,49 @@ describe("Notifier", () => { jest.resetAllMocks(); }); - const emitCallNotifyEvent = (type?: string, roomMention = true) => { - const callEvent = mkEvent({ - type: type ?? EventType.CallNotify, + const emitCallNotificationEvent = ( + params: { + type?: string; + roomMention?: boolean; + lifetime?: number; + ts?: number; + } = {}, + ) => { + const { type, roomMention, lifetime, ts } = { + type: EventType.RTCNotification, + roomMention: true, + lifetime: 30000, + ts: Date.now(), + ...params, + }; + const notificationEvent = mkEvent({ + type: type, user: "@alice:foo", room: roomId, + ts, content: { - "application": "m.call", + "notification_type": "ring", + "m.relation": { rel_type: "m.reference", event_id: "$memberEventId" }, "m.mentions": { user_ids: [], room: roomMention }, - "notify_type": "ring", - "call_id": "abc123", + lifetime, + "sender_ts": ts, }, event: true, }); - emitLiveEvent(callEvent); - return callEvent; + emitLiveEvent(notificationEvent); + return notificationEvent; }; it("shows group call toast", () => { - const notifyEvent = emitCallNotifyEvent(); + const notificationEvent = emitCallNotificationEvent(); expect(ToastStore.sharedInstance().addOrReplaceToast).toHaveBeenCalledWith( expect.objectContaining({ - key: getIncomingCallToastKey(notifyEvent.getContent().call_id ?? "", roomId), + key: getIncomingCallToastKey(notificationEvent.getId() ?? "", roomId), priority: 100, component: IncomingCallToast, bodyClassName: "mx_IncomingCallToast", - props: { notifyEvent }, + props: { notificationEvent }, }), ); }); @@ -438,13 +455,19 @@ describe("Notifier", () => { const roomSession = MatrixRTCSession.roomSessionForRoom(mockClient, testRoom); mockClient.matrixRTC.getRoomSession.mockReturnValue(roomSession); - emitCallNotifyEvent(); + emitCallNotificationEvent(); expect(ToastStore.sharedInstance().addOrReplaceToast).not.toHaveBeenCalled(); spyCallMemberships.mockRestore(); }); - it("should not show toast when calling with non-group call event", () => { - emitCallNotifyEvent("event_type"); + it("should not show toast when calling with a different event type to org.matrix.msc4075.rtc.notification", () => { + emitCallNotificationEvent({ type: "event_type" }); + + expect(ToastStore.sharedInstance().addOrReplaceToast).not.toHaveBeenCalled(); + }); + + it("should not show notification event is expired", () => { + emitCallNotificationEvent({ ts: Date.now() - 40000 }); expect(ToastStore.sharedInstance().addOrReplaceToast).not.toHaveBeenCalled(); }); diff --git a/test/unit-tests/SupportedBrowser-test.ts b/test/unit-tests/SupportedBrowser-test.ts index 0eb2b42ed6..270da1baa0 100644 --- a/test/unit-tests/SupportedBrowser-test.ts +++ b/test/unit-tests/SupportedBrowser-test.ts @@ -64,19 +64,19 @@ describe("SupportedBrowser", () => { // Grabbed from https://www.whatismybrowser.com/guides/the-latest-user-agent/ it.each([ // Safari 18.0 on macOS Sonoma - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Safari/605.1.15", // Latest Firefox on macOS Sonoma - "Mozilla/5.0 (Macintosh; Intel Mac OS X 14.7; rv:139.0) Gecko/20100101 Firefox/139.0", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 15.7; rv:143.0) Gecko/20100101 Firefox/143.0", // Latest Edge on Windows - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.3240.92", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36", // Latest Edge on macOS - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.3240.92", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.3485.66", // Latest Firefox on Windows - "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:139.0) Gecko/20100101 Firefox/139.0", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0) Gecko/20100101 Firefox/143.0", // Latest Firefox on Linux - "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:139.0) Gecko/20100101 Firefox/139.0", + "Mozilla/5.0 (X11; Linux i686; rv:143.0) Gecko/20100101 Firefox/143.0", // Latest Chrome on Windows - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36", ])("should not warn for supported browsers", testUserAgentFactory()); it.each([ diff --git a/test/unit-tests/TextForEvent-test.ts b/test/unit-tests/TextForEvent-test.ts index 4799b0fd5d..73fc809856 100644 --- a/test/unit-tests/TextForEvent-test.ts +++ b/test/unit-tests/TextForEvent-test.ts @@ -664,24 +664,24 @@ describe("TextForEvent", () => { ["the legacy key", { topic: "My topic" }, { result: '@a changed the topic to "My topic".' }], [ "the legacy key with an empty m.topic key", - { "topic": "My topic", "m.topic": [] }, + { "topic": "My topic", "m.topic": { "m.text": [] } }, { result: '@a changed the topic to "My topic".' }, ], [ "the m.topic key", - { "topic": "Ignore this", "m.topic": [{ mimetype: "text/plain", body: "My topic" }] }, + { "topic": "Ignore this", "m.topic": { "m.text": [{ mimetype: "text/plain", body: "My topic" }] } }, { result: '@a changed the topic to "My topic".' }, ], [ "the m.topic key and the legacy key undefined", - { "topic": undefined, "m.topic": [{ mimetype: "text/plain", body: "My topic" }] }, + { "topic": undefined, "m.topic": { "m.text": [{ mimetype: "text/plain", body: "My topic" }] } }, { result: '@a changed the topic to "My topic".' }, ], ["the legacy key undefined", { topic: undefined }, { result: "@a removed the topic." }], ["the legacy key empty string", { topic: "" }, { result: "@a removed the topic." }], [ "both the legacy and new keys removed", - { "topic": undefined, "m.topic": [] }, + { "topic": undefined, "m.topic": { "m.text": [] } }, { result: "@a removed the topic." }, ], ]; diff --git a/test/unit-tests/__snapshots__/SlashCommands-test.tsx.snap b/test/unit-tests/__snapshots__/SlashCommands-test.tsx.snap index fdffb74ac3..472feb6dcf 100644 --- a/test/unit-tests/__snapshots__/SlashCommands-test.tsx.snap +++ b/test/unit-tests/__snapshots__/SlashCommands-test.tsx.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing exports[`SlashCommands /lenny should match snapshot with args 1`] = ` { diff --git a/test/unit-tests/__snapshots__/Terms-test.tsx.snap b/test/unit-tests/__snapshots__/Terms-test.tsx.snap index a35963cd51..7bd269d3ea 100644 --- a/test/unit-tests/__snapshots__/Terms-test.tsx.snap +++ b/test/unit-tests/__snapshots__/Terms-test.tsx.snap @@ -7,6 +7,7 @@ exports[`dialogTermsInteractionCallback should render a dialog with the expected class="" data-focus-lock-disabled="false" role="dialog" + tabindex="-1" >
    diff --git a/test/unit-tests/accessibility/LandmarkNavigation-test.tsx b/test/unit-tests/accessibility/LandmarkNavigation-test.tsx index ad160e8866..3325747f17 100644 --- a/test/unit-tests/accessibility/LandmarkNavigation-test.tsx +++ b/test/unit-tests/accessibility/LandmarkNavigation-test.tsx @@ -19,10 +19,10 @@ describe("KeyboardLandmarkUtils", () => {
    SPACE_BUTTON
    -
    +
    ROOM_SEARCH
    -
    +
    ROOM_TILE
    @@ -33,11 +33,11 @@ describe("KeyboardLandmarkUtils", () => { // ACTIVE_SPACE_BUTTON <-> ROOM_SEARCH <-> ROOM_LIST <-> HOME <-> ACTIVE_SPACE_BUTTON // ACTIVE_SPACE_BUTTON -> ROOM_SEARCH LandmarkNavigation.findAndFocusNextLandmark(Landmark.ACTIVE_SPACE_BUTTON); - expect(screen.getByTestId("mx_RoomSearch")).toHaveFocus(); + expect(screen.getByTestId("mx_RoomListSearch_search")).toHaveFocus(); // ROOM_SEARCH -> ROOM_LIST LandmarkNavigation.findAndFocusNextLandmark(Landmark.ROOM_SEARCH); - expect(screen.getByTestId("mx_RoomTile")).toHaveFocus(); + expect(screen.getByTestId("mx_RoomListItemView")).toHaveFocus(); // ROOM_LIST -> HOME_PAGE LandmarkNavigation.findAndFocusNextLandmark(Landmark.ROOM_LIST); @@ -53,11 +53,11 @@ describe("KeyboardLandmarkUtils", () => { // ROOM_LIST <- HOME_PAGE LandmarkNavigation.findAndFocusNextLandmark(Landmark.MESSAGE_COMPOSER_OR_HOME, true); - expect(screen.getByTestId("mx_RoomTile")).toHaveFocus(); + expect(screen.getByTestId("mx_RoomListItemView")).toHaveFocus(); // ROOM_SEARCH <- ROOM_LIST LandmarkNavigation.findAndFocusNextLandmark(Landmark.ROOM_LIST, true); - expect(screen.getByTestId("mx_RoomSearch")).toHaveFocus(); + expect(screen.getByTestId("mx_RoomListSearch_search")).toHaveFocus(); // ACTIVE_SPACE_BUTTON <- ROOM_SEARCH LandmarkNavigation.findAndFocusNextLandmark(Landmark.ROOM_SEARCH, true); @@ -72,10 +72,10 @@ describe("KeyboardLandmarkUtils", () => {
    SPACE_BUTTON
    -
    +
    ROOM_SEARCH
    -
    +
    ROOM_TILE
    @@ -89,11 +89,11 @@ describe("KeyboardLandmarkUtils", () => { // ACTIVE_SPACE_BUTTON <-> ROOM_SEARCH <-> ROOM_LIST <-> MESSAGE_COMPOSER <-> ACTIVE_SPACE_BUTTON // ACTIVE_SPACE_BUTTON -> ROOM_SEARCH LandmarkNavigation.findAndFocusNextLandmark(Landmark.ACTIVE_SPACE_BUTTON); - expect(screen.getByTestId("mx_RoomSearch")).toHaveFocus(); + expect(screen.getByTestId("mx_RoomListSearch_search")).toHaveFocus(); // ROOM_SEARCH -> ROOM_LIST LandmarkNavigation.findAndFocusNextLandmark(Landmark.ROOM_SEARCH); - expect(screen.getByTestId("mx_RoomTile_selected")).toHaveFocus(); + expect(screen.getByTestId("mx_RoomListItemView_selected")).toHaveFocus(); // ROOM_LIST -> MESSAGE_COMPOSER LandmarkNavigation.findAndFocusNextLandmark(Landmark.ROOM_LIST); @@ -109,11 +109,11 @@ describe("KeyboardLandmarkUtils", () => { // ROOM_LIST <- MESSAGE_COMPOSER LandmarkNavigation.findAndFocusNextLandmark(Landmark.MESSAGE_COMPOSER_OR_HOME, true); - expect(screen.getByTestId("mx_RoomTile_selected")).toHaveFocus(); + expect(screen.getByTestId("mx_RoomListItemView_selected")).toHaveFocus(); // ROOM_SEARCH <- ROOM_LIST LandmarkNavigation.findAndFocusNextLandmark(Landmark.ROOM_LIST, true); - expect(screen.getByTestId("mx_RoomSearch")).toHaveFocus(); + expect(screen.getByTestId("mx_RoomListSearch_search")).toHaveFocus(); // ACTIVE_SPACE_BUTTON <- ROOM_SEARCH LandmarkNavigation.findAndFocusNextLandmark(Landmark.ROOM_SEARCH, true); diff --git a/test/unit-tests/async-components/dialogs/security/__snapshots__/NewRecoveryMethodDialog-test.tsx.snap b/test/unit-tests/async-components/dialogs/security/__snapshots__/NewRecoveryMethodDialog-test.tsx.snap index 08b5ee18d3..0c38ed2a19 100644 --- a/test/unit-tests/async-components/dialogs/security/__snapshots__/NewRecoveryMethodDialog-test.tsx.snap +++ b/test/unit-tests/async-components/dialogs/security/__snapshots__/NewRecoveryMethodDialog-test.tsx.snap @@ -12,6 +12,7 @@ exports[` when key backup is disabled 1`] = ` class="mx_KeyBackupFailedDialog mx_Dialog_fixedWidth" data-focus-lock-disabled="false" role="dialog" + tabindex="-1" >
    when key backup is enabled 1`] = ` class="mx_KeyBackupFailedDialog mx_Dialog_fixedWidth" data-focus-lock-disabled="false" role="dialog" + tabindex="-1" >
    (); + public liveData = new SimpleObservable(); + + public constructor( + public currentState: PlaybackState, + public durationSeconds: number, + public timeSeconds: number, + ) { + super(); + } + + public setState(state: PlaybackState): void { + this.currentState = state; + this.emit("update", state); + } + + public get isPlaying(): boolean { + return this.currentState === PlaybackState.Playing; + } + + public get clockInfo() { + return { + liveData: this.liveData, + populatePlaceholdersFrom: () => undefined, + }; + } + + public get waveform(): number[] { + return []; + } + + public get waveformData(): SimpleObservable { + return this.waveformObservable; + } + + public prepare = jest.fn().mockResolvedValue(undefined); + public skipTo = jest.fn(); + public toggle = jest.fn(); + public destroy = jest.fn().mockResolvedValue(undefined); +} diff --git a/test/unit-tests/components/structures/MatrixChat-test.tsx b/test/unit-tests/components/structures/MatrixChat-test.tsx index 928b5d7ffd..3ebe826b1c 100644 --- a/test/unit-tests/components/structures/MatrixChat-test.tsx +++ b/test/unit-tests/components/structures/MatrixChat-test.tsx @@ -1081,10 +1081,10 @@ describe("", () => { getComponent(); // Then we are asked to verify our device - await screen.findByRole("heading", { name: "Verify this device", level: 1 }); + await screen.findByRole("heading", { name: "Confirm your identity", level: 2 }); // Sanity: we are not racing with another screen update, so this heading stays visible - await screen.findByRole("heading", { name: "Verify this device", level: 1 }); + await screen.findByRole("heading", { name: "Confirm your identity", level: 2 }); }); it("should not open app after cancelling device verify if unskippable verification is on", async () => { // See https://github.com/element-hq/element-web/issues/29230 @@ -1100,17 +1100,17 @@ describe("", () => { // And MatrixChat is rendered getComponent(); - // When we click "Verify with another device" - await screen.findByRole("heading", { name: "Verify this device", level: 1 }); - const verify = screen.getByRole("button", { name: "Verify with another device" }); + // When we click "Use another device" + await screen.findByRole("heading", { name: "Confirm your identity", level: 2 }); + const verify = screen.getByRole("button", { name: "Use another device" }); act(() => verify.click()); // And close the device verification dialog - const closeButton = await screen.findByRole("button", { name: "Close dialog" }); + const closeButton = screen.getByRole("button", { name: "Close dialog" }); act(() => closeButton.click()); // Then we are not allowed in - we are still being asked to verify - await screen.findByRole("heading", { name: "Verify this device", level: 1 }); + await screen.findByRole("heading", { name: "Confirm your identity", level: 2 }); }); describe("when query params have a loginToken", () => { @@ -1153,7 +1153,7 @@ describe("", () => { ); // Then we are not allowed in - we are being asked to verify - await screen.findByRole("heading", { name: "Verify this device", level: 1 }); + await screen.findByRole("heading", { name: "Confirm your identity", level: 2 }); }); }); @@ -1179,7 +1179,7 @@ describe("", () => { .fn() .mockResolvedValue({ signedByOwner: true } as DeviceVerificationStatus), isCrossSigningReady: jest.fn().mockReturnValue(false), - requestOwnUserVerification: jest.fn().mockResolvedValue({ cancel: jest.fn() }), + requestOwnUserVerification: jest.fn().mockResolvedValue({ cancel: jest.fn(), on: jest.fn() }), } as any; } }); @@ -1397,7 +1397,7 @@ describe("", () => { await flushPromises(); // Complete security begin screen is rendered - expect(screen.getByText("Unable to verify this device")).toBeInTheDocument(); + expect(screen.getByText("Confirm your identity")).toBeInTheDocument(); }); it("should setup e2e when server supports cross signing", async () => { @@ -1632,6 +1632,10 @@ describe("", () => { }); describe("Multi-tab lockout", () => { + beforeEach(() => { + mockPlatformPeg(); + }); + afterEach(() => { Lifecycle.setSessionLockNotStolen(); }); @@ -1677,6 +1681,8 @@ describe("", () => { beforeEach(() => { // make sure we start from a clean DOM for each of these tests document.body.replaceChildren(); + // use the MockPlatform + mockPlatformPeg(); }); function simulateSessionLockClaim() { diff --git a/test/unit-tests/components/structures/ReleaseAnnouncement-test.tsx b/test/unit-tests/components/structures/ReleaseAnnouncement-test.tsx index e53bf06d48..d7f576ddef 100644 --- a/test/unit-tests/components/structures/ReleaseAnnouncement-test.tsx +++ b/test/unit-tests/components/structures/ReleaseAnnouncement-test.tsx @@ -23,7 +23,7 @@ describe("ReleaseAnnouncement", () => { function renderReleaseAnnouncement() { return render( Multi-tab lockout shows the lockout page when a second tab opens after a session is restored 1`] = `
    @@ -113,7 +113,7 @@ exports[` Multi-tab lockout waits for other tab to stop during sta class="mx_AuthPage" >
    Multi-tab lockout waits for other tab to stop during sta />
    with a soft-logged-out session should show the soft-logo class="mx_AuthPage" >
    with a soft-logged-out session should show the soft-logo />
    with an existing session onAction() room actions leave_r class="mx_QuestionDialog mx_Dialog_fixedWidth" data-focus-lock-disabled="false" role="dialog" + tabindex="-1" >
    with an existing session onAction() room actions leave_r class="mx_QuestionDialog mx_Dialog_fixedWidth" data-focus-lock-disabled="false" role="dialog" + tabindex="-1" >