Compare commits
5 Commits
v1.11.93-r
...
hs/fix-err
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9623639b08 | ||
|
|
976a8f44bc | ||
|
|
9cb55970d3 | ||
|
|
d82029d0c1 | ||
|
|
c1df3d1511 |
5
.github/CODEOWNERS
vendored
5
.github/CODEOWNERS
vendored
@@ -11,11 +11,10 @@
|
||||
/src/stores/SetupEncryptionStore.ts @element-hq/element-crypto-web-reviewers
|
||||
/test/stores/SetupEncryptionStore-test.ts @element-hq/element-crypto-web-reviewers
|
||||
/src/components/views/settings/tabs/user/EncryptionUserSettingsTab.tsx @element-hq/element-crypto-web-reviewers
|
||||
/src/components/views/settings/encryption/ @element-hq/element-crypto-web-reviewers
|
||||
/src/src/components/views/settings/encryption/ @element-hq/element-crypto-web-reviewers
|
||||
/test/unit-tests/components/views/settings/encryption/ @element-hq/element-crypto-web-reviewers
|
||||
/src/components/views/dialogs/devtools/Crypto.tsx @element-hq/element-crypto-web-reviewers
|
||||
/playwright/e2e/crypto/ @element-hq/element-crypto-web-reviewers
|
||||
/playwright/e2e/settings/encryption-user-tab/ @element-hq/element-crypto-web-reviewers
|
||||
/src/components/views/dialogs/devtools/Crypto.tsx @element-hq/element-crypto-web-reviewers
|
||||
|
||||
# Ignore translations as those will be updated by GHA for Localazy download
|
||||
/src/i18n/strings
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "element-web",
|
||||
"version": "1.11.93-rc.0",
|
||||
"version": "1.11.91",
|
||||
"description": "Element: the future of secure communication",
|
||||
"author": "New Vector Ltd.",
|
||||
"repository": {
|
||||
@@ -128,7 +128,7 @@
|
||||
"maplibre-gl": "^5.0.0",
|
||||
"matrix-encrypt-attachment": "^1.0.3",
|
||||
"matrix-events-sdk": "0.0.1",
|
||||
"matrix-js-sdk": "37.0.0-rc.0",
|
||||
"matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop",
|
||||
"matrix-widget-api": "^1.10.0",
|
||||
"memoize-one": "^6.0.0",
|
||||
"mime": "^4.0.4",
|
||||
|
||||
@@ -10,7 +10,6 @@ import { test, expect } from "../../element-web-test";
|
||||
import { isDendrite } from "../../plugins/homeserver/dendrite";
|
||||
import { completeCreateSecretStorageDialog, createBot, logIntoElement } from "./utils.ts";
|
||||
import { type Client } from "../../pages/client.ts";
|
||||
import { type ElementAppPage } from "../../pages/ElementAppPage.ts";
|
||||
|
||||
const NAME = "Alice";
|
||||
|
||||
@@ -50,7 +49,13 @@ test.describe("Dehydration", () => {
|
||||
|
||||
await completeCreateSecretStorageDialog(page);
|
||||
|
||||
await expectDehydratedDeviceEnabled(app);
|
||||
// Open the settings again
|
||||
await app.settings.openUserSettings("Security & Privacy");
|
||||
|
||||
// The Security tab should indicate that there is a dehydrated device present
|
||||
await expect(securityTab.getByText("Offline device enabled")).toBeVisible();
|
||||
|
||||
await app.settings.closeDialog();
|
||||
|
||||
// the dehydrated device gets created with the name "Dehydrated
|
||||
// device". We want to make sure that it is not visible as a normal
|
||||
@@ -59,33 +64,6 @@ test.describe("Dehydration", () => {
|
||||
await expect(sessionsTab.getByText("Dehydrated device")).not.toBeVisible();
|
||||
});
|
||||
|
||||
test("'Set up recovery' creates dehydrated device", async ({ app, credentials, page }) => {
|
||||
await logIntoElement(page, credentials);
|
||||
|
||||
const settingsDialogLocator = await app.settings.openUserSettings("Encryption");
|
||||
await settingsDialogLocator.getByRole("button", { name: "Set up recovery" }).click();
|
||||
|
||||
// First it displays an informative panel about the recovery key
|
||||
await expect(settingsDialogLocator.getByRole("heading", { name: "Set up recovery" })).toBeVisible();
|
||||
await settingsDialogLocator.getByRole("button", { name: "Continue" }).click();
|
||||
|
||||
// Next, it displays the new recovery key. We click on the copy button.
|
||||
await expect(settingsDialogLocator.getByText("Save your recovery key somewhere safe")).toBeVisible();
|
||||
await settingsDialogLocator.getByRole("button", { name: "Copy" }).click();
|
||||
const recoveryKey = await app.getClipboard();
|
||||
await settingsDialogLocator.getByRole("button", { name: "Continue" }).click();
|
||||
|
||||
await expect(
|
||||
settingsDialogLocator.getByText("Enter your recovery key to confirm", { exact: true }),
|
||||
).toBeVisible();
|
||||
await settingsDialogLocator.getByRole("textbox").fill(recoveryKey);
|
||||
await settingsDialogLocator.getByRole("button", { name: "Finish set up" }).click();
|
||||
|
||||
await app.settings.closeDialog();
|
||||
|
||||
await expectDehydratedDeviceEnabled(app);
|
||||
});
|
||||
|
||||
test("Reset recovery key during login re-creates dehydrated device", async ({
|
||||
page,
|
||||
homeserver,
|
||||
@@ -131,16 +109,3 @@ async function getDehydratedDeviceIds(client: Client): Promise<string[]> {
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
/** Wait for our user to have a dehydrated device */
|
||||
async function expectDehydratedDeviceEnabled(app: ElementAppPage): Promise<void> {
|
||||
// It might be nice to do this via the UI, but currently this info is not exposed via the UI.
|
||||
//
|
||||
// Note we might have to wait for the device list to be refreshed, so we wrap in `expect.poll`.
|
||||
await expect
|
||||
.poll(async () => {
|
||||
const dehydratedDeviceIds = await getDehydratedDeviceIds(app.client);
|
||||
return dehydratedDeviceIds.length;
|
||||
})
|
||||
.toEqual(1);
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ import { type HomeserverContainer, type StartedHomeserverContainer } from "./Hom
|
||||
import { type StartedMatrixAuthenticationServiceContainer } from "./mas.ts";
|
||||
import { Api, ClientServerApi, type Verb } from "../plugins/utils/api.ts";
|
||||
|
||||
const TAG = "develop@sha256:32ee365ad97dde86033e8a33e143048167271299e4c727413f3cdff48c65f8d9";
|
||||
const TAG = "develop@sha256:dfacd4d40994c77eb478fc5773913a38fbf07d593421a5410c5dafb8330ddd13";
|
||||
|
||||
const DEFAULT_CONFIG = {
|
||||
server_name: "localhost",
|
||||
|
||||
@@ -16,7 +16,6 @@ Please see LICENSE files in the repository root for full details.
|
||||
|
||||
.mx_MemberListHeaderView_invite_small {
|
||||
margin-left: var(--cpd-space-3x);
|
||||
margin-right: var(--cpd-space-4x);
|
||||
}
|
||||
|
||||
.mx_MemberListHeaderView_invite_large {
|
||||
@@ -34,7 +33,5 @@ Please see LICENSE files in the repository root for full details.
|
||||
|
||||
.mx_MemberListHeaderView_search {
|
||||
width: 240px;
|
||||
flex-grow: 1;
|
||||
margin-left: var(--cpd-space-4x);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,11 +27,13 @@ Please see LICENSE files in the repository root for full details.
|
||||
|
||||
.mx_MemberTileView_name {
|
||||
font: var(--cpd-font-body-md-medium);
|
||||
font-size: 15px;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.mx_MemberTileView_userLabel {
|
||||
font: var(--cpd-font-body-sm-regular);
|
||||
font-size: 13px;
|
||||
color: var(--cpd-color-text-secondary);
|
||||
margin-left: var(--cpd-space-4x);
|
||||
}
|
||||
|
||||
@@ -69,4 +69,11 @@
|
||||
flex-direction: column;
|
||||
gap: var(--cpd-space-8x);
|
||||
}
|
||||
|
||||
.mx_ChangeRecoveryKey_footer {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--cpd-space-4x);
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,10 +31,3 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.mx_EncryptionCard_buttons {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--cpd-space-4x);
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
@@ -16,4 +16,11 @@
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
.mx_ResetIdentityPanel_footer {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--cpd-space-4x);
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,6 @@ Please see LICENSE files in the repository root for full details.
|
||||
|
||||
.mx_Field.mx_AppearanceUserSettingsTab_checkboxControlledField {
|
||||
width: 256px;
|
||||
/* matches checkbox box + padding to align with checkbox label */
|
||||
margin-inline-start: calc($font-16px + 10px);
|
||||
/* Line up with Settings field toggle button */
|
||||
margin-inline-start: 0;
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ import {
|
||||
MatrixError,
|
||||
HTTPError,
|
||||
type IThreepid,
|
||||
type UIAResponse,
|
||||
} from "matrix-js-sdk/src/matrix";
|
||||
|
||||
import Modal from "./Modal";
|
||||
@@ -180,7 +181,9 @@ export default class AddThreepid {
|
||||
* with a "message" property which contains a human-readable message detailing why
|
||||
* the request failed.
|
||||
*/
|
||||
public async checkEmailLinkClicked(): Promise<[success?: boolean, result?: IAddThreePidOnlyBody | Error | null]> {
|
||||
public async checkEmailLinkClicked(): Promise<
|
||||
[success?: boolean, result?: UIAResponse<IAddThreePidOnlyBody> | Error | null]
|
||||
> {
|
||||
try {
|
||||
if (this.bind) {
|
||||
const authClient = new IdentityAuthClient();
|
||||
@@ -267,7 +270,7 @@ export default class AddThreepid {
|
||||
*/
|
||||
public async haveMsisdnToken(
|
||||
msisdnToken: string,
|
||||
): Promise<[success?: boolean, result?: IAddThreePidOnlyBody | Error | null]> {
|
||||
): Promise<[success?: boolean, result?: UIAResponse<IAddThreePidOnlyBody> | Error | null]> {
|
||||
const authClient = new IdentityAuthClient();
|
||||
|
||||
if (this.submitUrl) {
|
||||
|
||||
@@ -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 { type AuthDict, type MatrixClient, MatrixError } from "matrix-js-sdk/src/matrix";
|
||||
import { type AuthDict, type MatrixClient, MatrixError, type UIAResponse } from "matrix-js-sdk/src/matrix";
|
||||
|
||||
import { SSOAuthEntry } from "./components/views/auth/InteractiveAuthEntryComponents";
|
||||
import Modal from "./Modal";
|
||||
@@ -38,7 +38,7 @@ export async function createCrossSigning(cli: MatrixClient): Promise<void> {
|
||||
|
||||
export async function uiAuthCallback(
|
||||
matrixClient: MatrixClient,
|
||||
makeRequest: (authData: AuthDict) => Promise<void>,
|
||||
makeRequest: (authData: AuthDict) => Promise<UIAResponse<void>>,
|
||||
): Promise<void> {
|
||||
try {
|
||||
await makeRequest({});
|
||||
|
||||
@@ -41,7 +41,7 @@ import PlatformPeg from "./PlatformPeg";
|
||||
import { formatList } from "./utils/FormattingUtils";
|
||||
import SdkConfig from "./SdkConfig";
|
||||
import { setDeviceIsolationMode } from "./settings/controllers/DeviceIsolationModeController.ts";
|
||||
import { initialiseDehydrationIfEnabled } from "./utils/device/dehydration";
|
||||
import { initialiseDehydration } from "./utils/device/dehydration";
|
||||
|
||||
export interface IMatrixClientCreds {
|
||||
homeserverUrl: string;
|
||||
@@ -347,7 +347,7 @@ class MatrixClientPegClass implements IMatrixClientPeg {
|
||||
// is a new login, we will start dehydration after Secret Storage is
|
||||
// unlocked.
|
||||
try {
|
||||
await initialiseDehydrationIfEnabled(this.matrixClient, { onlyIfKeyCached: true, rehydrate: false });
|
||||
await initialiseDehydration({ onlyIfKeyCached: true, rehydrate: false }, this.matrixClient);
|
||||
} catch (e) {
|
||||
// We may get an error dehydrating, such as if cross-signing and
|
||||
// SSSS are not set up yet. Just log the error and continue.
|
||||
|
||||
@@ -191,10 +191,7 @@ function textForMemberEvent(
|
||||
case KnownMembership.Leave:
|
||||
if (ev.getSender() === ev.getStateKey()) {
|
||||
if (prevContent.membership === KnownMembership.Invite) {
|
||||
return () =>
|
||||
reason
|
||||
? _t("timeline|m.room.member|reject_invite_reason", { targetName, reason })
|
||||
: _t("timeline|m.room.member|reject_invite", { targetName });
|
||||
return () => _t("timeline|m.room.member|reject_invite", { targetName });
|
||||
} else {
|
||||
return () =>
|
||||
reason
|
||||
|
||||
@@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details.
|
||||
import React, { createRef } from "react";
|
||||
import FileSaver from "file-saver";
|
||||
import { logger } from "matrix-js-sdk/src/logger";
|
||||
import { type AuthDict } from "matrix-js-sdk/src/matrix";
|
||||
import { type AuthDict, type UIAResponse } from "matrix-js-sdk/src/matrix";
|
||||
import { type GeneratedSecretStorageKey } from "matrix-js-sdk/src/crypto-api";
|
||||
import classNames from "classnames";
|
||||
import CheckmarkIcon from "@vector-im/compound-design-tokens/assets/web/icons/check";
|
||||
@@ -37,7 +37,7 @@ import Spinner from "../../../../components/views/elements/Spinner";
|
||||
import InteractiveAuthDialog from "../../../../components/views/dialogs/InteractiveAuthDialog";
|
||||
import { type IValidationResult } from "../../../../components/views/elements/Validation";
|
||||
import PassphraseConfirmField from "../../../../components/views/auth/PassphraseConfirmField";
|
||||
import { initialiseDehydrationIfEnabled } from "../../../../utils/device/dehydration";
|
||||
import { initialiseDehydration } from "../../../../utils/device/dehydration";
|
||||
|
||||
// I made a mistake while converting this and it has to be fixed!
|
||||
enum Phase {
|
||||
@@ -177,7 +177,9 @@ export default class CreateSecretStorageDialog extends React.PureComponent<IProp
|
||||
});
|
||||
};
|
||||
|
||||
private doBootstrapUIAuth = async (makeRequest: (authData: AuthDict) => Promise<void>): Promise<void> => {
|
||||
private doBootstrapUIAuth = async (
|
||||
makeRequest: (authData: AuthDict) => Promise<UIAResponse<void>>,
|
||||
): Promise<void> => {
|
||||
const dialogAesthetics = {
|
||||
[SSOAuthEntry.PHASE_PREAUTH]: {
|
||||
title: _t("auth|uia|sso_title"),
|
||||
@@ -271,7 +273,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent<IProp
|
||||
setupNewKeyBackup: !backupInfo,
|
||||
});
|
||||
}
|
||||
await initialiseDehydrationIfEnabled(cli, { createNewKey: true });
|
||||
await initialiseDehydration({ createNewKey: true });
|
||||
|
||||
this.setState({
|
||||
phase: Phase.Stored,
|
||||
|
||||
@@ -27,10 +27,13 @@ import Spinner from "../views/elements/Spinner";
|
||||
|
||||
export const ERROR_USER_CANCELLED = new Error("User cancelled auth session");
|
||||
|
||||
export type InteractiveAuthCallback<T> = {
|
||||
(success: true, response: T, extra?: { emailSid?: string; clientSecret?: string }): Promise<void>;
|
||||
(success: false, response: IAuthData | Error): Promise<void>;
|
||||
};
|
||||
type InteractiveAuthCallbackSuccess<T> = (
|
||||
success: true,
|
||||
response: T,
|
||||
extra?: { emailSid?: string; clientSecret?: string },
|
||||
) => Promise<void>;
|
||||
type InteractiveAuthCallbackFailure = (success: false, response: IAuthData | Error) => Promise<void>;
|
||||
export type InteractiveAuthCallback<T> = InteractiveAuthCallbackSuccess<T> & InteractiveAuthCallbackFailure;
|
||||
|
||||
export interface InteractiveAuthProps<T> {
|
||||
// matrix client to use for UI auth requests
|
||||
@@ -46,6 +49,10 @@ export interface InteractiveAuthProps<T> {
|
||||
emailSid?: string;
|
||||
// If true, poll to see if the auth flow has been completed out-of-band
|
||||
poll?: boolean;
|
||||
// If true, components will be told that the 'Continue' button
|
||||
// is managed by some other party and should not be managed by
|
||||
// the component itself.
|
||||
continueIsManaged?: boolean;
|
||||
// continueText and continueKind are passed straight through to the AuthEntryComponent.
|
||||
continueText?: string;
|
||||
continueKind?: ContinueKind;
|
||||
@@ -281,6 +288,7 @@ export default class InteractiveAuthComponent<T> extends React.Component<Interac
|
||||
stageState={this.state.stageState}
|
||||
fail={this.onAuthStageFailed}
|
||||
setEmailSid={this.setEmailSid}
|
||||
showContinue={!this.props.continueIsManaged}
|
||||
onPhaseChange={this.onPhaseChange}
|
||||
requestEmailToken={this.authLogic.requestEmailToken}
|
||||
continueText={this.props.continueText}
|
||||
|
||||
@@ -85,6 +85,7 @@ interface IAuthEntryProps {
|
||||
requestEmailToken?: () => Promise<void>;
|
||||
fail: (error: Error) => void;
|
||||
clientSecret: string;
|
||||
showContinue: boolean;
|
||||
}
|
||||
|
||||
interface IPasswordAuthEntryState {
|
||||
@@ -360,11 +361,9 @@ export class TermsAuthEntry extends React.Component<ITermsAuthEntryProps, ITerms
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="mx_InteractiveAuthEntryComponents">
|
||||
<p>{_t("auth|uia|terms")}</p>
|
||||
{checkboxes}
|
||||
{errorSection}
|
||||
let submitButton: JSX.Element | undefined;
|
||||
if (this.props.showContinue !== false) {
|
||||
submitButton = (
|
||||
<AccessibleButton
|
||||
kind="primary"
|
||||
className="mx_InteractiveAuthEntryComponents_termsSubmit"
|
||||
@@ -373,6 +372,15 @@ export class TermsAuthEntry extends React.Component<ITermsAuthEntryProps, ITerms
|
||||
>
|
||||
{_t("action|accept")}
|
||||
</AccessibleButton>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="mx_InteractiveAuthEntryComponents">
|
||||
<p>{_t("auth|uia|terms")}</p>
|
||||
{checkboxes}
|
||||
{errorSection}
|
||||
{submitButton}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
import { type MatrixClient } from "matrix-js-sdk/src/matrix";
|
||||
import { type MatrixClient, type UIAResponse } from "matrix-js-sdk/src/matrix";
|
||||
import { type AuthType } from "matrix-js-sdk/src/interactive-auth";
|
||||
|
||||
import { _t } from "../../../languageHandler";
|
||||
@@ -63,7 +63,7 @@ export interface InteractiveAuthDialogProps<T = unknown>
|
||||
// Default is defined in _getDefaultDialogAesthetics()
|
||||
aestheticsForStagePhases?: DialogAesthetics;
|
||||
|
||||
onFinished(success?: boolean, result?: T | Error | null): void;
|
||||
onFinished(success?: boolean, result?: UIAResponse<T> | Error | null): void;
|
||||
}
|
||||
|
||||
interface IState {
|
||||
@@ -111,7 +111,7 @@ export default class InteractiveAuthDialog<T> extends React.Component<Interactiv
|
||||
|
||||
private onAuthFinished: InteractiveAuthCallback<T> = async (success, result): Promise<void> => {
|
||||
if (success) {
|
||||
this.props.onFinished(true, result as T);
|
||||
this.props.onFinished(true, result);
|
||||
} else {
|
||||
if (result === ERROR_USER_CANCELLED) {
|
||||
this.props.onFinished(false, null);
|
||||
|
||||
@@ -60,8 +60,6 @@ interface IProps {
|
||||
// If specified, contents will appear as a tooltip on the element and
|
||||
// validation feedback tooltips will be suppressed.
|
||||
tooltipContent?: JSX.Element | string;
|
||||
// If specified the tooltip will be shown regardless of feedback
|
||||
forceTooltipVisible?: boolean;
|
||||
// If specified, the tooltip with be aligned accorindly with the field, defaults to Right.
|
||||
tooltipAlignment?: ComponentProps<typeof Tooltip>["placement"];
|
||||
// If specified alongside tooltipContent, the class name to apply to the
|
||||
@@ -274,7 +272,6 @@ export default class Field extends React.PureComponent<PropShapes, IState> {
|
||||
validateOnChange,
|
||||
validateOnFocus,
|
||||
usePlaceholderAsHint,
|
||||
forceTooltipVisible,
|
||||
tooltipAlignment,
|
||||
...inputProps
|
||||
} = this.props;
|
||||
@@ -283,8 +280,7 @@ export default class Field extends React.PureComponent<PropShapes, IState> {
|
||||
const tooltipProps: Pick<React.ComponentProps<typeof Tooltip>, "aria-live" | "aria-atomic"> = {};
|
||||
let tooltipOpen = false;
|
||||
if (tooltipContent || this.state.feedback) {
|
||||
tooltipOpen = (this.state.focused && forceTooltipVisible) || this.state.feedbackVisible;
|
||||
|
||||
tooltipOpen = this.state.feedbackVisible;
|
||||
if (!tooltipContent) {
|
||||
tooltipProps["aria-atomic"] = "true";
|
||||
tooltipProps["aria-live"] = this.state.valid ? "polite" : "assertive";
|
||||
|
||||
@@ -9,6 +9,7 @@ Please see LICENSE files in the repository root for full details.
|
||||
import React, { type ReactNode } from "react";
|
||||
import { logger } from "matrix-js-sdk/src/logger";
|
||||
import { type IThreepid } from "matrix-js-sdk/src/matrix";
|
||||
import { EditInPlace, ErrorMessage, TooltipProvider } from "@vector-im/compound-web";
|
||||
|
||||
import { _t } from "../../../languageHandler";
|
||||
import { MatrixClientPeg } from "../../../MatrixClientPeg";
|
||||
@@ -22,7 +23,6 @@ import { timeout } from "../../../utils/promise";
|
||||
import { type ActionPayload } from "../../../dispatcher/payloads";
|
||||
import InlineSpinner from "../elements/InlineSpinner";
|
||||
import AccessibleButton from "../elements/AccessibleButton";
|
||||
import Field from "../elements/Field";
|
||||
import QuestionDialog from "../dialogs/QuestionDialog";
|
||||
import SettingsFieldset from "./SettingsFieldset";
|
||||
import { SettingsSubsectionText } from "./shared/SettingsSubsection";
|
||||
@@ -117,26 +117,7 @@ export default class SetIdServer extends React.Component<IProps, IState> {
|
||||
private onIdentityServerChanged = (ev: React.ChangeEvent<HTMLInputElement>): void => {
|
||||
const u = ev.target.value;
|
||||
|
||||
this.setState({ idServer: u });
|
||||
};
|
||||
|
||||
private getTooltip = (): JSX.Element | undefined => {
|
||||
if (this.state.checking) {
|
||||
return (
|
||||
<div>
|
||||
<InlineSpinner />
|
||||
{_t("identity_server|checking")}
|
||||
</div>
|
||||
);
|
||||
} else if (this.state.error) {
|
||||
return <strong className="warning">{this.state.error}</strong>;
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
};
|
||||
|
||||
private idServerChangeEnabled = (): boolean => {
|
||||
return !!this.state.idServer && !this.state.busy;
|
||||
this.setState({ idServer: u, error: undefined });
|
||||
};
|
||||
|
||||
private saveIdServer = (fullUrl: string): void => {
|
||||
@@ -175,7 +156,7 @@ export default class SetIdServer extends React.Component<IProps, IState> {
|
||||
// Double check that the identity server even has terms of service.
|
||||
const hasTerms = await doesIdentityServerHaveTerms(MatrixClientPeg.safeGet(), fullUrl);
|
||||
if (!hasTerms) {
|
||||
const [confirmed] = await this.showNoTermsWarning(fullUrl);
|
||||
const [confirmed] = await this.showNoTermsWarning();
|
||||
save = !!confirmed;
|
||||
}
|
||||
|
||||
@@ -213,7 +194,7 @@ export default class SetIdServer extends React.Component<IProps, IState> {
|
||||
});
|
||||
};
|
||||
|
||||
private showNoTermsWarning(fullUrl: string): Promise<[ok?: boolean]> {
|
||||
private showNoTermsWarning(): Promise<[ok?: boolean]> {
|
||||
const { finished } = Modal.createDialog(QuestionDialog, {
|
||||
title: _t("terms|identity_server_no_terms_title"),
|
||||
description: (
|
||||
@@ -393,28 +374,27 @@ export default class SetIdServer extends React.Component<IProps, IState> {
|
||||
|
||||
return (
|
||||
<SettingsFieldset legend={sectionTitle} description={bodyText}>
|
||||
<form className="mx_SetIdServer" onSubmit={this.checkIdServer}>
|
||||
<Field
|
||||
<TooltipProvider>
|
||||
<EditInPlace
|
||||
cancelButtonLabel={_t("action|reset")}
|
||||
label={_t("identity_server|url_field_label")}
|
||||
type="text"
|
||||
autoComplete="off"
|
||||
onChange={this.onIdentityServerChanged}
|
||||
onCancel={() => this.setState((s) => ({ idServer: s.currentClientIdServer ?? "" }))}
|
||||
onClearServerErrors={() => this.setState({ error: undefined })}
|
||||
onSave={this.checkIdServer}
|
||||
size={48}
|
||||
saveButtonLabel={_t("action|change")}
|
||||
savedLabel={this.state.error ? undefined : _t("identity_server|changed")}
|
||||
savingLabel={_t("identity_server|checking")}
|
||||
placeholder={this.state.defaultIdServer}
|
||||
value={this.state.idServer}
|
||||
onChange={this.onIdentityServerChanged}
|
||||
tooltipContent={this.getTooltip()}
|
||||
tooltipClassName="mx_SetIdServer_tooltip"
|
||||
disabled={this.state.busy}
|
||||
forceValidity={this.state.error ? false : undefined}
|
||||
/>
|
||||
<AccessibleButton
|
||||
kind="primary_sm"
|
||||
onClick={this.checkIdServer}
|
||||
disabled={!this.idServerChangeEnabled()}
|
||||
serverInvalid={!!this.state.error}
|
||||
>
|
||||
{_t("action|change")}
|
||||
</AccessibleButton>
|
||||
{this.state.error && <ErrorMessage>{this.state.error}</ErrorMessage>}
|
||||
</EditInPlace>
|
||||
{discoSection}
|
||||
</form>
|
||||
</TooltipProvider>
|
||||
</SettingsFieldset>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -19,16 +19,14 @@ import {
|
||||
} from "@vector-im/compound-web";
|
||||
import CopyIcon from "@vector-im/compound-design-tokens/assets/web/icons/copy";
|
||||
import KeyIcon from "@vector-im/compound-design-tokens/assets/web/icons/key-solid";
|
||||
import { logger } from "matrix-js-sdk/src/logger";
|
||||
|
||||
import { _t } from "../../../../languageHandler";
|
||||
import { EncryptionCard } from "./EncryptionCard";
|
||||
import { useMatrixClientContext } from "../../../../contexts/MatrixClientContext";
|
||||
import { useAsyncMemo } from "../../../../hooks/useAsyncMemo";
|
||||
import { copyPlaintext } from "../../../../utils/strings";
|
||||
import { initialiseDehydrationIfEnabled } from "../../../../utils/device/dehydration.ts";
|
||||
import { withSecretStorageKeyCache } from "../../../../SecurityManager";
|
||||
import { EncryptionCardButtons } from "./EncryptionCardButtons";
|
||||
import { logErrorAndShowErrorDialog } from "../../../../utils/ErrorUtils.tsx";
|
||||
|
||||
/**
|
||||
* The possible states of the component.
|
||||
@@ -124,16 +122,15 @@ export function ChangeRecoveryKey({
|
||||
try {
|
||||
// We need to enable the cache to avoid to prompt the user to enter the new key
|
||||
// when we will try to access the secret storage during the bootstrap
|
||||
await withSecretStorageKeyCache(async () => {
|
||||
await crypto.bootstrapSecretStorage({
|
||||
await withSecretStorageKeyCache(() =>
|
||||
crypto.bootstrapSecretStorage({
|
||||
setupNewSecretStorage: true,
|
||||
createSecretStorageKey: async () => recoveryKey,
|
||||
});
|
||||
await initialiseDehydrationIfEnabled(matrixClient, { createNewKey: true });
|
||||
});
|
||||
}),
|
||||
);
|
||||
onFinish();
|
||||
} catch (e) {
|
||||
logErrorAndShowErrorDialog("Failed to set up secret storage", e);
|
||||
logger.error("Failed to bootstrap secret storage", e);
|
||||
}
|
||||
}}
|
||||
submitButtonLabel={
|
||||
@@ -240,12 +237,12 @@ function InformationPanel({ onContinueClick, onCancelClick }: InformationPanelPr
|
||||
<Text as="span" weight="medium" className="mx_InformationPanel_description">
|
||||
{_t("settings|encryption|recovery|set_up_recovery_secondary_description")}
|
||||
</Text>
|
||||
<EncryptionCardButtons>
|
||||
<div className="mx_ChangeRecoveryKey_footer">
|
||||
<Button onClick={onContinueClick}>{_t("action|continue")}</Button>
|
||||
<Button kind="tertiary" onClick={onCancelClick}>
|
||||
{_t("action|cancel")}
|
||||
</Button>
|
||||
</EncryptionCardButtons>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -287,12 +284,12 @@ function KeyPanel({ recoveryKey, onConfirmClick, onCancelClick }: KeyPanelProps)
|
||||
<CopyIcon />
|
||||
</IconButton>
|
||||
</div>
|
||||
<EncryptionCardButtons>
|
||||
<div className="mx_ChangeRecoveryKey_footer">
|
||||
<Button onClick={onConfirmClick}>{_t("action|continue")}</Button>
|
||||
<Button kind="tertiary" onClick={onCancelClick}>
|
||||
{_t("action|cancel")}
|
||||
</Button>
|
||||
</EncryptionCardButtons>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -350,12 +347,12 @@ function KeyForm({ onCancelClick, onSubmit, recoveryKey, submitButtonLabel }: Ke
|
||||
<ErrorMessage>{_t("settings|encryption|recovery|enter_key_error")}</ErrorMessage>
|
||||
)}
|
||||
</Field>
|
||||
<EncryptionCardButtons>
|
||||
<div className="mx_ChangeRecoveryKey_footer">
|
||||
<Button disabled={!isKeyValid}>{submitButtonLabel}</Button>
|
||||
<Button kind="tertiary" onClick={onCancelClick}>
|
||||
{_t("action|cancel")}
|
||||
</Button>
|
||||
</EncryptionCardButtons>
|
||||
</div>
|
||||
</Root>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
/*
|
||||
* Copyright 2024 New Vector Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
|
||||
* Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
import React, { type PropsWithChildren } from "react";
|
||||
|
||||
/**
|
||||
* A component to present action buttons at the bottom of an {@link EncryptionCard}
|
||||
* (mostly as somewhere for the common CSS to live).
|
||||
*/
|
||||
export function EncryptionCardButtons({ children }: PropsWithChildren): JSX.Element {
|
||||
return <div className="mx_EncryptionCard_buttons">{children}</div>;
|
||||
}
|
||||
@@ -15,7 +15,6 @@ import { _t } from "../../../../languageHandler";
|
||||
import { EncryptionCard } from "./EncryptionCard";
|
||||
import { useMatrixClientContext } from "../../../../contexts/MatrixClientContext";
|
||||
import { uiAuthCallback } from "../../../../CreateCrossSigning";
|
||||
import { EncryptionCardButtons } from "./EncryptionCardButtons";
|
||||
|
||||
interface ResetIdentityPanelProps {
|
||||
/**
|
||||
@@ -75,7 +74,7 @@ export function ResetIdentityPanel({ onCancelClick, onFinish, variant }: ResetId
|
||||
</VisualList>
|
||||
{variant === "compromised" && <span>{_t("settings|encryption|advanced|breadcrumb_warning")}</span>}
|
||||
</div>
|
||||
<EncryptionCardButtons>
|
||||
<div className="mx_ResetIdentityPanel_footer">
|
||||
<Button
|
||||
destructive={true}
|
||||
onClick={async (evt) => {
|
||||
@@ -90,7 +89,7 @@ export function ResetIdentityPanel({ onCancelClick, onFinish, variant }: ResetId
|
||||
<Button kind="tertiary" onClick={onCancelClick}>
|
||||
{_t("action|cancel")}
|
||||
</Button>
|
||||
</EncryptionCardButtons>
|
||||
</div>
|
||||
</EncryptionCard>
|
||||
</>
|
||||
);
|
||||
|
||||
@@ -11,7 +11,6 @@ import React, { type ChangeEvent, type ReactNode } from "react";
|
||||
import { type EmptyObject } from "matrix-js-sdk/src/matrix";
|
||||
|
||||
import { _t } from "../../../../../languageHandler";
|
||||
import SdkConfig from "../../../../../SdkConfig";
|
||||
import SettingsStore from "../../../../../settings/SettingsStore";
|
||||
import SettingsFlag from "../../../elements/SettingsFlag";
|
||||
import Field from "../../../elements/Field";
|
||||
@@ -48,7 +47,6 @@ export default class AppearanceUserSettingsTab extends React.Component<EmptyObje
|
||||
private renderAdvancedSection(): ReactNode {
|
||||
if (!SettingsStore.getValue(UIFeature.AdvancedSettings)) return null;
|
||||
|
||||
const brand = SdkConfig.get().brand;
|
||||
const toggle = (
|
||||
<AccessibleButton
|
||||
kind="link"
|
||||
@@ -62,21 +60,18 @@ export default class AppearanceUserSettingsTab extends React.Component<EmptyObje
|
||||
let advanced: React.ReactNode;
|
||||
|
||||
if (this.state.showAdvanced) {
|
||||
const tooltipContent = _t("settings|appearance|custom_font_description", { brand });
|
||||
advanced = (
|
||||
<>
|
||||
<SettingsFlag name="useCompactLayout" level={SettingLevel.DEVICE} useCheckbox={true} />
|
||||
<SettingsFlag name="useCompactLayout" level={SettingLevel.DEVICE} />
|
||||
|
||||
<SettingsFlag
|
||||
name="useBundledEmojiFont"
|
||||
level={SettingLevel.DEVICE}
|
||||
useCheckbox={true}
|
||||
onChange={(checked) => this.setState({ useBundledEmojiFont: checked })}
|
||||
/>
|
||||
<SettingsFlag
|
||||
name="useSystemFont"
|
||||
level={SettingLevel.DEVICE}
|
||||
useCheckbox={true}
|
||||
onChange={(checked) => this.setState({ useSystemFont: checked })}
|
||||
/>
|
||||
<Field
|
||||
@@ -89,8 +84,6 @@ export default class AppearanceUserSettingsTab extends React.Component<EmptyObje
|
||||
|
||||
SettingsStore.setValue("systemFont", null, SettingLevel.DEVICE, value.target.value);
|
||||
}}
|
||||
tooltipContent={tooltipContent}
|
||||
forceTooltipVisible={true}
|
||||
disabled={!this.state.useSystemFont}
|
||||
value={this.state.systemFont}
|
||||
/>
|
||||
|
||||
@@ -878,22 +878,22 @@
|
||||
"empty_room_was_name": "Prázdná místnost (dříve %(oldName)s)",
|
||||
"encryption": {
|
||||
"access_secret_storage_dialog": {
|
||||
"enter_phrase_or_key_prompt": "Pro pokračování zadejte bezpečnostní frázi nebo <button>klíč pro obnovení</button>.",
|
||||
"enter_phrase_or_key_prompt": "Zadejte bezpečnostní frázi nebo <button>použijte bezpečnostní klíč</button> pro pokračování.",
|
||||
"key_validation_text": {
|
||||
"invalid_security_key": "Neplatný klíč pro obnovení",
|
||||
"invalid_security_key": "Neplatný bezpečnostní klíč",
|
||||
"recovery_key_is_correct": "To vypadá dobře!",
|
||||
"wrong_file_type": "Špatný typ souboru",
|
||||
"wrong_security_key": "Špatný klíč pro obnovení"
|
||||
"wrong_security_key": "Špatný bezpečnostní klíč"
|
||||
},
|
||||
"reset_title": "Resetovat vše",
|
||||
"reset_warning_1": "Udělejte to, pouze pokud nemáte žádné jiné zařízení, se kterým byste mohli dokončit ověření.",
|
||||
"reset_warning_2": "Pokud vše resetujete, začnete bez důvěryhodných relací, bez důvěryhodných uživatelů a možná nebudete moci zobrazit minulé zprávy.",
|
||||
"restoring": "Obnovení klíčů ze zálohy",
|
||||
"security_key_title": "Klíč pro obnovení",
|
||||
"security_key_title": "Bezpečnostní klíč",
|
||||
"security_phrase_incorrect_error": "Nelze získat přístup k zabezpečenému úložišti. Ověřte, zda jste zadali správnou bezpečnostní frázi.",
|
||||
"security_phrase_title": "Bezpečnostní fráze",
|
||||
"separator": "%(securityKey)s nebo %(recoveryFile)s",
|
||||
"use_security_key_prompt": "Pokračujte pomocí klíče pro obnovení."
|
||||
"use_security_key_prompt": "Pokračujte pomocí bezpečnostního klíče."
|
||||
},
|
||||
"bootstrap_title": "Příprava klíčů",
|
||||
"cancel_entering_passphrase_description": "Chcete určitě zrušit zadávání přístupové fráze?",
|
||||
@@ -996,7 +996,7 @@
|
||||
"incoming_sas_dialog_waiting": "Čekání na potvrzení partnerem…",
|
||||
"incoming_sas_user_dialog_text_1": "Po ověření bude uživatel označen jako důvěryhodný. Ověřování uživatelů vám dává větší jistotu, že je komunikace důvěrná.",
|
||||
"incoming_sas_user_dialog_text_2": "Ověření uživatele označí jeho relace za důvěryhodné a vaše relace budou důvěryhodné pro něj.",
|
||||
"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 totožnost, budete muset obnovit ověřovací klíče.",
|
||||
"no_key_or_device": "Vypadá to, že nemáte bezpečnostní klíč ani žádné jiné zařízení, které byste mohli ověřit. Toto zařízení nebude mít přístup ke starým šifrovaným zprávám. Abyste mohli na tomto zařízení ověřit svou totožnost, budete muset resetovat 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.",
|
||||
@@ -1046,10 +1046,10 @@
|
||||
"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_reset_warning_1": "Resetování ověřovacích klíčů nelze vrátit zpět. Po jejich resetování nebudete mít přístup ke starým zašifrovaným zprávám a všem přátelům, kteří vás dříve ověřili, se zobrazí bezpečnostní varování, dokud se u nich znovu neověříte.",
|
||||
"verify_reset_warning_2": "Pokračujte pouze v případě, že jste si jisti, že jste ztratili všechna ostatní zařízení a klíč pro obnovení.",
|
||||
"verify_reset_warning_2": "Pokračujte pouze v případě, že jste si jisti, že jste ztratili všechna ostatní zařízení a bezpečnostní klíč.",
|
||||
"verify_using_device": "Ověřit pomocí jiného zařízení",
|
||||
"verify_using_key": "Ověření pomocí klíče pro obnovení",
|
||||
"verify_using_key_or_phrase": "Ověření pomocí klíče pro obnovení nebo fráze",
|
||||
"verify_using_key": "Ověření pomocí bezpečnostního klíče",
|
||||
"verify_using_key_or_phrase": "Ověření pomocí bezpečnostního klíče 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)…",
|
||||
@@ -1091,7 +1091,7 @@
|
||||
"description_3": "Vymazání úložiště prohlížeče možná váš problém opraví, zároveň se tím ale odhlásíte a můžete přijít o historii svých šifrovaných konverzací.",
|
||||
"title": "Nelze obnovit relaci"
|
||||
},
|
||||
"something_went_wrong": "Něco se nepovedlo!",
|
||||
"something_went_wrong": "Něco se nepodařilo!",
|
||||
"storage_evicted_description_1": "Některá data sezení, například klíče od šifrovaných zpráv, nám chybí. Přihlaste se prosím znovu a obnovte si klíče ze zálohy.",
|
||||
"storage_evicted_description_2": "Prohlížeč data možná smazal aby ušetřil místo na disku.",
|
||||
"storage_evicted_title": "Chybějící data relace",
|
||||
@@ -1497,7 +1497,6 @@
|
||||
"location_share_live_description": "Dočasná implementace. Polohy zůstanou v historii místností.",
|
||||
"mjolnir": "Nové způsoby ignorování lidí",
|
||||
"msc3531_hide_messages_pending_moderation": "Umožnit moderátorům skrývat zprávy čekající na moderaci.",
|
||||
"new_room_list": "Povolit nový seznam místností",
|
||||
"notification_settings": "Nová nastavení oznámení",
|
||||
"notification_settings_beta_caption": "Představujeme jednodušší způsob, jak změnit nastavení oznámení. Přizpůsobte svůj %(brand)s přesně tak, jak se vám líbí.",
|
||||
"notification_settings_beta_title": "Nastavení oznámení",
|
||||
@@ -1802,24 +1801,24 @@
|
||||
"restore_key_backup_dialog": {
|
||||
"count_of_decryption_failures": "Nepovedlo se rozšifrovat %(failedCount)s sezení!",
|
||||
"count_of_successfully_restored_keys": "Úspěšně obnoveno %(sessionCount)s klíčů",
|
||||
"enter_key_description": "Získejte přístup k historii zabezpečených zpráv a nastavte zabezpečené zasílání zpráv zadáním klíče pro obnovení.",
|
||||
"enter_key_title": "Zadejte klíč pro obnovení",
|
||||
"enter_key_description": "Vstupte do historie zabezpečených zpráv a nastavte zabezpečené zprávy zadáním bezpečnostního klíče.",
|
||||
"enter_key_title": "Zadejte bezpečnostní klíč",
|
||||
"enter_phrase_description": "Vstupte do historie zabezpečených zpráv a nastavte zabezpečené zprávy zadáním bezpečnostní fráze.",
|
||||
"enter_phrase_title": "Zadejte bezpečnostní frázi",
|
||||
"incorrect_security_phrase_dialog": "Zálohu nebylo možné dešifrovat pomocí této bezpečnostní fráze: ověřte, zda jste zadali správnou bezpečnostní frázi.",
|
||||
"incorrect_security_phrase_title": "Nesprávná bezpečnostní fráze",
|
||||
"key_backup_warning": "<b>Uporoznění</b>: záloha by měla být prováděna na důvěryhodném počítači.",
|
||||
"key_fetch_in_progress": "Načítání klíčů ze serveru…",
|
||||
"key_forgotten_text": "Pokud jste zapomněli klíč pro obnovení, můžete <button>nastavit nové možnosti obnovení</button>",
|
||||
"key_is_invalid": "Neplatný klíč pro obnovení",
|
||||
"key_is_valid": "Vypadá to jako platný klíč pro obnovení!",
|
||||
"key_forgotten_text": "Pokud jste zapomněli bezpečnostní klíč, můžete <button>nastavit nové možnosti obnovení</button>",
|
||||
"key_is_invalid": "Neplatný bezpečnostní klíč",
|
||||
"key_is_valid": "Vypadá to jako platný bezpečnostní klíč!",
|
||||
"keys_restored_title": "Klíče byly obnoveny",
|
||||
"load_error_content": "Nepovedlo se načíst stav zálohy",
|
||||
"load_keys_progress": "Obnoveno %(completed)s z %(total)s klíčů",
|
||||
"no_backup_error": "Nenalezli jsme žádnou zálohu!",
|
||||
"phrase_forgotten_text": "Pokud jste zapomněli bezpečnostní frázi, můžete <button1>použít klíč pro obnovení</button1> nebo <button2>nastavit nové možnosti obnovení</button2>",
|
||||
"recovery_key_mismatch_description": "Zálohu se nepodařilo dešifrovat pomocí tohoto klíče pro obnovení: ověřte, zda jste zadali správný klíč pro obnovení.",
|
||||
"recovery_key_mismatch_title": "Neshoda klíče pro obnovení",
|
||||
"phrase_forgotten_text": "Pokud jste zapomněli bezpečnostní frázi, můžete <button1>použít bezpečnostní klíč</button1> nebo <button2>nastavit nové možnosti obnovení</button2>",
|
||||
"recovery_key_mismatch_description": "Zálohu nebylo možné dešifrovat pomocí tohoto bezpečnostního klíče: ověřte, zda jste zadali správný bezpečnostní klíč.",
|
||||
"recovery_key_mismatch_title": "Neshoda bezpečnostního klíče",
|
||||
"restore_failed_error": "Nepovedlo se obnovit ze zálohy"
|
||||
},
|
||||
"right_panel": {
|
||||
@@ -2622,21 +2621,21 @@
|
||||
"enter_phrase_description": "Zadejte bezpečnostní frázi, kterou znáte jen vy, protože slouží k ochraně vašich dat. V zájmu bezpečnosti byste neměli heslo k účtu používat opakovaně.",
|
||||
"enter_phrase_title": "Zadání bezpečnostní fráze",
|
||||
"enter_phrase_to_confirm": "Zadejte bezpečnostní frázi podruhé a potvrďte ji.",
|
||||
"generate_security_key_description": "Vygenerujeme klíč pro obnovení, který můžete uložit někde v bezpečí, jako je správce hesel nebo trezor.",
|
||||
"generate_security_key_title": "Vygenerovat klíč pro obnovení",
|
||||
"generate_security_key_description": "Vygenerujeme vám bezpečnostní klíč, který uložíte na bezpečné místo, například do správce hesel nebo do trezoru.",
|
||||
"generate_security_key_title": "Vygenerovat bezpečnostní klíč",
|
||||
"pass_phrase_match_failed": "To nesedí.",
|
||||
"pass_phrase_match_success": "To odpovídá!",
|
||||
"phrase_strong_enough": "Skvělé! Tato bezpečnostní fráze vypadá dostatečně silně.",
|
||||
"secret_storage_query_failure": "Nelze zjistit stav úložiště klíčů",
|
||||
"security_key_safety_reminder": "Klíč pro obnovení uložte na bezpečném místě, jako je správce hesel nebo trezor, protože slouží k ochraně vašich šifrovaných dat.",
|
||||
"security_key_safety_reminder": "Bezpečnostní klíč uložte na bezpečné místo, například do správce hesel nebo do trezoru, protože slouží k ochraně zašifrovaných dat.",
|
||||
"set_phrase_again": "Nastavit heslo znovu.",
|
||||
"settings_reminder": "Zabezpečené zálohování a správu klíčů můžete také nastavit v Nastavení.",
|
||||
"title_confirm_phrase": "Potvrďte bezpečnostní frázi",
|
||||
"title_save_key": "Uložit klíč pro obnovení",
|
||||
"title_save_key": "Uložte svůj bezpečnostní klíč",
|
||||
"title_set_phrase": "Nastavit bezpečnostní frázi",
|
||||
"unable_to_setup": "Nepovedlo se nastavit bezpečné úložiště",
|
||||
"use_different_passphrase": "Použít jinou přístupovou frázi?",
|
||||
"use_phrase_only_you_know": "Použijte tajnou frázi, kterou znáte pouze vy, a volitelně uložte klíč pro obnovení, který použijete pro zálohování."
|
||||
"use_phrase_only_you_know": "Použijte tajnou frázi, kterou znáte pouze vy, a volitelně uložte bezpečnostní klíč, který použijete pro zálohování."
|
||||
}
|
||||
},
|
||||
"key_export_import": {
|
||||
@@ -2755,7 +2754,7 @@
|
||||
"backup_key_stored_status": "Klíč zálohy uložen:",
|
||||
"backup_key_unexpected_type": "neočekávaný typ",
|
||||
"backup_key_well_formed": "ve správném tvaru",
|
||||
"backup_keys_description": "Zálohujte šifrovací klíče s daty účtu pro případ, že ztratíte přístup k relacím. Vaše klíče budou zabezpečeny jedinečným klíčem pro obnovení.",
|
||||
"backup_keys_description": "Zálohujte šifrovací klíče s daty účtu pro případ, že ztratíte přístup k relacím. Vaše klíče budou zabezpečeny jedinečným bezpečnostním klíčem.",
|
||||
"bulk_options_accept_all_invites": "Přijmout pozvání do všech těchto místností: %(invitedRooms)s",
|
||||
"bulk_options_reject_all_invites": "Odmítnutí všech %(invitedRooms)s pozvání",
|
||||
"bulk_options_section": "Hromadná možnost",
|
||||
@@ -3463,7 +3462,6 @@
|
||||
"left_reason": "%(targetName)s opustil(a) místnost: %(reason)s",
|
||||
"no_change": "%(senderName)s neprovedl(a) žádnou změnu",
|
||||
"reject_invite": "%(targetName)s odmítl(a) pozvání",
|
||||
"reject_invite_reason": "%(targetName)s pozvánku odmítl(a): %(reason)s",
|
||||
"remove_avatar": "%(senderName)s odstranil(a) svůj profilový obrázek",
|
||||
"remove_name": "%(senderName)s odstranil(a) své zobrazované jméno (%(oldDisplayName)s)",
|
||||
"set_avatar": "%(senderName)s si nastavil(a) profilový obrázek",
|
||||
@@ -3850,7 +3848,6 @@
|
||||
"unban_space_specific": "Zrušit jejich vykázání z konkrétních míst, kde mám oprávnění",
|
||||
"unban_space_warning": "Nebudou mít přístup ke všemu, čeho nejste správcem.",
|
||||
"unignore_button": "Zrušit ignorování",
|
||||
"verification_unavailable": "Ověření uživatele není k dispozici",
|
||||
"verify_button": "Ověřit uživatele",
|
||||
"verify_explainer": "Pro lepší bezpečnost, ověřte uživatele zkontrolováním jednorázového kódu na vašich zařízeních."
|
||||
},
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -877,22 +877,22 @@
|
||||
"empty_room_was_name": "Leerer Raum (war %(oldName)s)",
|
||||
"encryption": {
|
||||
"access_secret_storage_dialog": {
|
||||
"enter_phrase_or_key_prompt": "Um fortzufahren, geben Sie Ihre Sicherheitsphrase ein oder <button> verwenden Sie Ihren Wiederherstellungsschlüssel</button>, um fortzufahren.",
|
||||
"enter_phrase_or_key_prompt": "Um fortzufahren gib die Sicherheitsphrase ein oder <button>verwende deinen Sicherheitsschlüssel</button>.",
|
||||
"key_validation_text": {
|
||||
"invalid_security_key": "Ungültiger Wiederherstellungsschlüssel",
|
||||
"invalid_security_key": "Ungültiger Sicherheitsschlüssel",
|
||||
"recovery_key_is_correct": "Sieht gut aus!",
|
||||
"wrong_file_type": "Falscher Dateityp",
|
||||
"wrong_security_key": "Falscher Wiederherstellungsschlüssel"
|
||||
"wrong_security_key": "Falscher Sicherheitsschlüssel"
|
||||
},
|
||||
"reset_title": "Alles zurücksetzen",
|
||||
"reset_warning_1": "Verwende es nur, wenn du kein Gerät, mit dem du dich verifizieren kannst, bei dir hast.",
|
||||
"reset_warning_2": "Wenn du alles zurücksetzt, beginnst du ohne verifizierte Sitzungen und Benutzende von Neuem und siehst eventuell keine alten Nachrichten.",
|
||||
"restoring": "Schlüssel aus der Sicherung wiederherstellen",
|
||||
"security_key_title": "Wiederherstellungsschlüssel",
|
||||
"security_key_title": "Sicherheitsschlüssel",
|
||||
"security_phrase_incorrect_error": "Zugriff auf sicheren Speicher nicht möglich. Bitte überprüfe, ob du die richtige Sicherheitsphrase eingegeben hast.",
|
||||
"security_phrase_title": "Sicherheitsphrase",
|
||||
"separator": "%(securityKey)s oder %(recoveryFile)s",
|
||||
"use_security_key_prompt": "Verwenden Sie Ihren Wiederherstellungsschlüssel, um fortzufahren."
|
||||
"use_security_key_prompt": "Benutze deinen Sicherheitsschlüssel um fortzufahren."
|
||||
},
|
||||
"bootstrap_title": "Schlüssel werden eingerichtet",
|
||||
"cancel_entering_passphrase_description": "Bist du sicher, dass du die Eingabe der Passphrase abbrechen möchtest?",
|
||||
@@ -995,7 +995,7 @@
|
||||
"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.",
|
||||
"no_key_or_device": "Es sieht so aus, als hättest du keinen Sicherheitsschlüssel oder andere Geräte, mit denen du dich verifizieren könntest. Dieses Gerät wird keine alten verschlüsselten Nachrichten lesen können. Um deine Identität auf diesem Gerät zu verifizieren musst du deine Verifizierungsschlüssel zurücksetzen.",
|
||||
"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.",
|
||||
"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.",
|
||||
@@ -1045,10 +1045,10 @@
|
||||
"verify_emoji_prompt_qr": "Wenn du obigen Code nicht erfassen kannst, verifiziere stattdessen durch den Vergleich von Emojis.",
|
||||
"verify_later": "Später verifizieren",
|
||||
"verify_reset_warning_1": "Das Zurücksetzen deiner Sicherheitsschlüssel kann nicht rückgängig gemacht werden. Nach dem Zurücksetzen wirst du alte Nachrichten nicht mehr lesen können und Freunde, die dich vorher verifiziert haben werden Sicherheitswarnungen bekommen, bis du dich erneut mit ihnen verifizierst.",
|
||||
"verify_reset_warning_2": "Bitte fahren Sie nur fort, wenn Sie sicher sind, dass Sie Ihren Zugang zu allen anderen Geräte und Ihren Wiederherstellungsschlüssel verloren haben.",
|
||||
"verify_reset_warning_2": "Bitte fahre nur fort, wenn du sicher bist, dass du alle anderen Geräte und deinen Sicherheitsschlüssel verloren hast.",
|
||||
"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",
|
||||
"verify_using_key": "Mit Sicherheitsschlüssel verifizieren",
|
||||
"verify_using_key_or_phrase": "Mit Sicherheitsschlüssel oder Sicherheitsphrase 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…",
|
||||
@@ -1496,7 +1496,6 @@
|
||||
"location_share_live_description": "Vorläufige Implementierung: Standorte verbleiben im Raumverlauf.",
|
||||
"mjolnir": "Neue Methoden, Personen zu blockieren",
|
||||
"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",
|
||||
@@ -1800,23 +1799,23 @@
|
||||
"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": "Greife auf deinen verschlüsselten Nachrichtenverlauf zu und richte die sichere Kommunikation ein, indem du deinen Sicherheitsschlüssel eingibst.",
|
||||
"enter_key_title": "Sicherheitsschlüssel eingeben",
|
||||
"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": "<b>Warnung</b>: 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 <button> Neue Wiederherstellungsoptionen einrichten </button>",
|
||||
"key_is_invalid": "Kein gültiger Wiederherstellungsschlüssel",
|
||||
"key_is_valid": "Das sieht nach einem gültigen Wiederherstellungsschlüssel aus!",
|
||||
"key_forgotten_text": "Wenn du deinen Sicherheitsschlüssel vergessen hast, kannst du <button>neue Wiederherstellungsoptionen einrichten</button>",
|
||||
"key_is_invalid": "Kein gültiger Sicherheisschlüssel",
|
||||
"key_is_valid": "Dies sieht aus wie ein gültiger Sicherheitsschlü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 <button1> verwenden </button1> oder neue Wiederherstellungsoptionen <button2> einrichten </button2>",
|
||||
"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": "Wenn du deine Sicherheitsphrase vergessen hast, kannst du <button1>deinen Sicherheitsschlüssel nutzen</button1> oder <button2>neue Wiederherstellungsoptionen einrichten</button2>",
|
||||
"recovery_key_mismatch_description": "Das Backup konnte mit diesem Sicherheitsschlüssel nicht entschlüsselt werden: Bitte überprüfe, ob du den richtigen Sicherheitsschlüssel eingegeben hast.",
|
||||
"recovery_key_mismatch_title": "Nicht übereinstimmende Sicherheitsschlüssel",
|
||||
"restore_failed_error": "Konnte Schlüsselsicherung nicht wiederherstellen"
|
||||
},
|
||||
@@ -2493,7 +2492,6 @@
|
||||
"description": "Falls Sie alle Ihre Geräte verloren haben. stellen Sie Ihre kryptografische Identität und Ihren Nachrichtenverlauf mit einem Wiederherstellungsschlüssel wieder her.",
|
||||
"enter_key_error": "Der eingegebene Wiederherstellungsschlüssel ist nicht korrekt.",
|
||||
"enter_recovery_key": "Geben Sie 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!",
|
||||
"save_key_title": "Wiederherstellungsschlüssel",
|
||||
@@ -2616,21 +2614,21 @@
|
||||
"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": "Wir generieren einen Sicherheitsschlüssel für dich, den du in einem Passwort-Manager oder Safe sicher aufbewahren solltest.",
|
||||
"generate_security_key_title": "Sicherheitsschlüssel generieren",
|
||||
"pass_phrase_match_failed": "Das passt nicht.",
|
||||
"pass_phrase_match_success": "Das passt!",
|
||||
"phrase_strong_enough": "Großartig! 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 deinen Sicherheitsschlüssel sicher auf, etwa in einem Passwortmanager oder einem Safe, da er verwendet wird, um deine Daten zu sichern.",
|
||||
"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": "Sicherungsschlüssel sichern",
|
||||
"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 für deine Sicherung eine geheime Phrase, die nur du kennst, und speichere optional einen Sicherheitsschlüssel."
|
||||
}
|
||||
},
|
||||
"key_export_import": {
|
||||
@@ -2749,7 +2747,7 @@
|
||||
"backup_key_stored_status": "Sicherungsschlüssel gespeichert:",
|
||||
"backup_key_unexpected_type": "unbekannter Typ",
|
||||
"backup_key_well_formed": "wohlgeformt",
|
||||
"backup_keys_description": "Sichern Sie Ihren Chiffrierschlüssel zusammen mit Ihren Kontodaten, für den Fall, dass Sie den Zugriff auf Ihre Sitzungen verlieren. Ihre Schlüssel werden mit einem unikalen Wiederherstellungsschlüssel geschützt.",
|
||||
"backup_keys_description": "Sichere deine Schlüssel mit deinen Kontodaten, für den Fall, dass du den Zugriff auf deine Sitzungen verlierst. Deine Schlüssel werden mit einem eindeutigen Sicherheitsschlüssel geschützt.",
|
||||
"bulk_options_accept_all_invites": "Akzeptiere alle %(invitedRooms)s Einladungen",
|
||||
"bulk_options_reject_all_invites": "Alle %(invitedRooms)s Einladungen ablehnen",
|
||||
"bulk_options_section": "Sammeloptionen",
|
||||
@@ -3457,7 +3455,6 @@
|
||||
"left_reason": "%(targetName)s hat den Raum 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",
|
||||
"remove_avatar": "%(senderName)s hat das Profilbild entfernt",
|
||||
"remove_name": "%(senderName)s hat den alten Anzeigenamen %(oldDisplayName)s entfernt",
|
||||
"set_avatar": "%(senderName)s hat das Profilbild gesetzt",
|
||||
@@ -3844,7 +3841,6 @@
|
||||
"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.",
|
||||
"unignore_button": "Nicht mehr ignorieren",
|
||||
"verification_unavailable": "Benutzerverifizierung nicht verfügbar",
|
||||
"verify_button": "Nutzer verifizieren",
|
||||
"verify_explainer": "Für zusätzliche Sicherheit, verifiziere diesen Nutzer, durch Vergleichen eines Einmal-Codes auf euren beiden Geräten."
|
||||
},
|
||||
|
||||
@@ -1244,6 +1244,7 @@
|
||||
"change_prompt": "Disconnect from the identity server <current /> and connect to <new /> instead?",
|
||||
"change_server_prompt": "If you don't want to use <server /> to discover and be discoverable by existing contacts you know, enter another identity server below.",
|
||||
"checking": "Checking server",
|
||||
"changed": "Your identity server has been changed",
|
||||
"description_connected": "You are currently using <server></server> to discover and be discoverable by existing contacts you know. You can change your identity server below.",
|
||||
"description_disconnected": "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.",
|
||||
"description_optional": "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.",
|
||||
@@ -3458,7 +3459,6 @@
|
||||
"left_reason": "%(targetName)s left the room: %(reason)s",
|
||||
"no_change": "%(senderName)s made no change",
|
||||
"reject_invite": "%(targetName)s rejected the invitation",
|
||||
"reject_invite_reason": "%(targetName)s rejected the invitation: %(reason)s",
|
||||
"remove_avatar": "%(senderName)s removed their profile picture",
|
||||
"remove_name": "%(senderName)s removed their display name (%(oldDisplayName)s)",
|
||||
"set_avatar": "%(senderName)s set a profile picture",
|
||||
|
||||
@@ -915,6 +915,7 @@
|
||||
"title": "Kas hävitame risttunnustamise võtmed?",
|
||||
"warning": "Risttunnustamise võtmete kustutamine on tegevus, mida ei saa tagasi pöörata. Kõik sinu verifitseeritud vestluskaaslased näevad seejärel turvateateid. Kui sa just pole kaotanud ligipääsu kõikidele oma seadmetele, kust sa risttunnustamist oled teinud, siis sa ilmselgelt ei peaks kustutamist ette võtma."
|
||||
},
|
||||
"enter_recovery_key": "Sisesta taastevõti",
|
||||
"event_shield_reason_authenticity_not_guaranteed": "Selle krüptitud sõnumi autentsus pole selles seadmes tagatud.",
|
||||
"event_shield_reason_mismatched_sender_key": "Krüptitud verifitseerimata sessiooni poolt",
|
||||
"event_shield_reason_unknown_device": "Krüptitud tundmatu või kustutatud seadme poolt.",
|
||||
@@ -2479,18 +2480,25 @@
|
||||
"device_not_verified_title": "Seade on verifitseerimata",
|
||||
"dialog_title": "<strong>Seadistused:</strong>Krüptimine",
|
||||
"recovery": {
|
||||
"change_recovery_confirm_button": "Kinnita uus taastevõti",
|
||||
"change_recovery_confirm_description": "Toimingu lõpetamiseks palun sisesta alljärgnevalt oma uus taastevõti. Senine taastevõti enam ei toimi.",
|
||||
"change_recovery_confirm_title": "Sisesta oma taastevõti",
|
||||
"change_recovery_key": "Muuda taastevõtit",
|
||||
"change_recovery_key_description": "Palun salvesta see taastevõti turvalisel viisil. Muutuse kinnitamiseks klõpsi „Jätka“.",
|
||||
"change_recovery_key_title": "Kas muudame taastevõtit?",
|
||||
"description": "Kui sa oled kaotanud ligipääsu kõikidele oma olemasolevatele seadmetele, siis sa saad taastevõtme abil taastada ligipääsu oma krüptoidentiteedile ja sõnumite ajaloole.",
|
||||
"enter_key_error": "Sinu sisestatud taastevõti pole korrektne.",
|
||||
"enter_recovery_key": "Sisesta taastevõti",
|
||||
"key_storage_warning": "Sinu võtmehoidla pole sünkroonis. Vea parandamiseks palun klõpsi järgnevat nuppu.",
|
||||
"save_key_description": "Ära jaga seda mitte kellegagi!",
|
||||
"save_key_title": "Taastevõti",
|
||||
"set_up_recovery": "Seadista taastamine",
|
||||
"set_up_recovery_confirm_button": "Lõpeta seadistamine",
|
||||
"set_up_recovery_confirm_description": "Taastamise seadistamise lõpetamiseks palun sisesta eelmises vaates näidatud taastevõti.",
|
||||
"set_up_recovery_confirm_title": "Kinnitamiseks sisesta oma taastevõti",
|
||||
"set_up_recovery_description": "Sinu krüptovõtmete hoidlat kaitseb taastevõti. Kui peale seadistamist peaksid vajama uut taastevõtit, siis saad ta uuesti luua valikust „%(changeRecoveryKeyButton)s“.",
|
||||
"set_up_recovery_save_key_description": "Palun märgi see taastevõti üles ja hoia teda turvaliselt, näiteks digitaalses salasõnalaekas, krüptitud märkmetes või vana kooli seifis.",
|
||||
"set_up_recovery_save_key_title": "Palun salvesta oma taastevõti turvalisel viisil",
|
||||
"set_up_recovery_secondary_description": "Kui klõpsid nuppu „Jätka“, loome me sulle uue taastevõtme.",
|
||||
"title": "Taastamine"
|
||||
},
|
||||
|
||||
@@ -812,6 +812,7 @@
|
||||
"title": "Tuhoa ristiinvarmennuksen avaimet?",
|
||||
"warning": "Ristiinvarmennuksen avainten tuhoamista ei voi kumota. Jokainen, jonka olet varmentanut, tulee näkemään turvallisuushälytyksiä. Et todennäköisesti halua tehdä tätä, ellet ole hukannut kaikkia laitteitasi, joista pystyit ristiinvarmentamaan."
|
||||
},
|
||||
"enter_recovery_key": "Kirjoita palautusavain",
|
||||
"event_shield_reason_authenticity_not_guaranteed": "Tämän salatun viestin aitoutta ei voida taata tällä laitteella.",
|
||||
"event_shield_reason_mismatched_sender_key": "Salattu varmentamattoman istunnon toimesta",
|
||||
"export_unsupported": "Selaimesi ei tue vaadittuja kryptografisia laajennuksia",
|
||||
@@ -2153,11 +2154,16 @@
|
||||
"device_not_verified_title": "Laitetta ei ole vahvistettu",
|
||||
"dialog_title": "<strong>Asetukset:</strong> Salaus",
|
||||
"recovery": {
|
||||
"change_recovery_confirm_button": "Vahvista uusi palautusavain",
|
||||
"change_recovery_key": "Vaihda palautusavain",
|
||||
"change_recovery_key_title": "Vaihdetaanko palautusavain?",
|
||||
"description": "Palauta kryptografinen identiteettisi ja viestihistoriasi palautusavaimella, jos olet kadottanut kaikki olemassa olevat laitteesi.",
|
||||
"enter_key_error": "Kirjoittamasi palautusavain ei ole oikein.",
|
||||
"enter_recovery_key": "Kirjoita palautusavain",
|
||||
"forgot_recovery_key": "Unohditko palautusavaimen?",
|
||||
"save_key_description": "Älä jaa tätä kenenkään kanssa!",
|
||||
"save_key_title": "Palautusavain",
|
||||
"set_up_recovery_save_key_title": "Tallenna palautusavain turvalliseen paikkaan",
|
||||
"title": "Palautuminen"
|
||||
},
|
||||
"title": "Salaus"
|
||||
|
||||
@@ -200,7 +200,7 @@
|
||||
"email_help_text": "Ajouter une adresse e-mail pour pouvoir réinitialiser votre mot de passe.",
|
||||
"email_phone_discovery_text": "Utiliser une adresse e-mail ou un numéro de téléphone pour pouvoir être découvert par des contacts existants.",
|
||||
"enter_email_explainer": "<b>%(homeserver)s</b> va vous envoyer un lien de vérification vous permettant de réinitialiser votre mot de passe.",
|
||||
"enter_email_heading": "Saisir votre adresse e-mail pour réinitialiser le mot de passe",
|
||||
"enter_email_heading": "Entrez votre adresse e-mail pour réinitialiser le mot de passe",
|
||||
"failed_connect_identity_server": "Impossible de joindre le serveur d’identité",
|
||||
"failed_connect_identity_server_other": "Vous pouvez vous connecter, mais certaines fonctionnalités ne seront pas disponibles jusqu’au retour du serveur d’identité. Si vous continuez à voir cet avertissement, vérifiez votre configuration ou contactez un administrateur du serveur.",
|
||||
"failed_connect_identity_server_register": "Vous pouvez vous inscrire, mais certaines fonctionnalités ne seront pas disponibles jusqu’au retour du serveur d’identité. Si vous continuez à voir cet avertissement, vérifiez votre configuration ou contactez un administrateur du serveur.",
|
||||
@@ -248,7 +248,7 @@
|
||||
"phone_optional_label": "Téléphone (facultatif)",
|
||||
"qr_code_login": {
|
||||
"check_code_explainer": "Cela vérifiera que la connexion à votre autre appareil est sécurisée.",
|
||||
"check_code_heading": "Saisir le numéro affiché sur votre autre appareil",
|
||||
"check_code_heading": "Entrez le numéro affiché sur votre autre appareil",
|
||||
"check_code_input_label": "code à 2 chiffres",
|
||||
"check_code_mismatch": "Les chiffres ne correspondent pas",
|
||||
"completing_setup": "Fin de la configuration de votre nouvel appareil",
|
||||
@@ -539,7 +539,6 @@
|
||||
"qr_code": "QR code",
|
||||
"random": "Aléatoire",
|
||||
"reactions": "Réactions",
|
||||
"recommended": "Recommandé",
|
||||
"report_a_bug": "Signaler un bug",
|
||||
"room": "Salon",
|
||||
"room_name": "Nom du salon",
|
||||
@@ -732,44 +731,6 @@
|
||||
"category_room": "Salon",
|
||||
"caution_colon": "Attention :",
|
||||
"client_versions": "Versions des clients",
|
||||
"crypto": {
|
||||
"4s_public_key_in_account_data": "dans les données du compte",
|
||||
"4s_public_key_not_in_account_data": "non trouvé",
|
||||
"4s_public_key_status": "Clé publique du coffre secret :",
|
||||
"backup_key_cached": "mise en cache localement",
|
||||
"backup_key_cached_status": "Clé de sauvegarde mise en cache :",
|
||||
"backup_key_not_stored": "non sauvegardé",
|
||||
"backup_key_stored": "dans le coffre secret",
|
||||
"backup_key_stored_status": "Clé de sauvegarde enregistrée :",
|
||||
"backup_key_unexpected_type": "type inattendu",
|
||||
"backup_key_well_formed": "bien formée",
|
||||
"cross_signing": "Signature croisée",
|
||||
"cross_signing_cached": "mise en cache localement",
|
||||
"cross_signing_not_ready": "La signature croisée n’est pas configurée.",
|
||||
"cross_signing_private_keys_in_storage": "dans le coffre secret",
|
||||
"cross_signing_private_keys_in_storage_status": "Clés privées de signature croisée :",
|
||||
"cross_signing_private_keys_not_in_storage": "non trouvé dans le coffre",
|
||||
"cross_signing_public_keys_on_device": "en mémoire",
|
||||
"cross_signing_public_keys_on_device_status": "Clés publiques de signature croisée :",
|
||||
"cross_signing_ready": "La signature croisée est prête à être utilisée.",
|
||||
"cross_signing_status": "État de la signature croisée :",
|
||||
"cross_signing_untrusted": "Votre compte a une identité de signature croisée dans le coffre secret, mais cette session ne lui fait pas encore confiance.",
|
||||
"crypto_not_available": "Le module cryptographique n'est pas disponible",
|
||||
"key_backup_active_version": "Version de sauvegarde active :",
|
||||
"key_backup_active_version_none": "Aucun",
|
||||
"key_backup_inactive_warning": "Vos clés ne sont pas sauvegardées sur cette session.",
|
||||
"key_backup_latest_version": "Dernière version de la sauvegarde sur le serveur :",
|
||||
"key_storage": "Stockage des clés",
|
||||
"master_private_key_cached_status": "Clé privée maîtresse :",
|
||||
"not_found": "non trouvé",
|
||||
"not_found_locally": "non trouvée localement",
|
||||
"secret_storage_not_ready": "pas prêt",
|
||||
"secret_storage_ready": "prêt",
|
||||
"secret_storage_status": "Coffre secret :",
|
||||
"self_signing_private_key_cached_status": "Clé privée d’auto-signature :",
|
||||
"title": "Chiffrement de bout en bout",
|
||||
"user_signing_private_key_cached_status": "Clé privée de signature de l’utilisateur :"
|
||||
},
|
||||
"developer_mode": "Mode développeur",
|
||||
"developer_tools": "Outils de développement",
|
||||
"edit_setting": "Modifier le paramètre",
|
||||
@@ -877,22 +838,22 @@
|
||||
"empty_room_was_name": "Salon vide (précédemment %(oldName)s)",
|
||||
"encryption": {
|
||||
"access_secret_storage_dialog": {
|
||||
"enter_phrase_or_key_prompt": "Saisissez votre phrase de sécurité ou <button>utilisez votre clé de récupération</button> pour continuer.",
|
||||
"enter_phrase_or_key_prompt": "Saisissez votre phrase de sécurité ou <button>utilisez votre clé de sécurité</button> pour continuer.",
|
||||
"key_validation_text": {
|
||||
"invalid_security_key": "Clé de récupération incorrecte",
|
||||
"invalid_security_key": "Clé de Sécurité invalide",
|
||||
"recovery_key_is_correct": "Ça a l’air correct !",
|
||||
"wrong_file_type": "Mauvais type de fichier",
|
||||
"wrong_security_key": "Clé de récupération incorrecte"
|
||||
"wrong_security_key": "Mauvaise Clé de Sécurité"
|
||||
},
|
||||
"reset_title": "Tout réinitialiser",
|
||||
"reset_warning_1": "Poursuivez seulement si vous n’avez aucun autre appareil avec lequel procéder à la vérification.",
|
||||
"reset_warning_2": "Si vous réinitialisez tout, vous allez repartir sans session et utilisateur de confiance. Vous pourriez ne pas voir certains messages passés.",
|
||||
"restoring": "Restauration des clés depuis la sauvegarde",
|
||||
"security_key_title": "Clé de récupération",
|
||||
"security_phrase_incorrect_error": "Impossible d’accéder à l’espace de stockage sécurisé. Merci de vérifier que vous avez saisi la bonne phrase de sécurité.",
|
||||
"security_key_title": "Clé de sécurité",
|
||||
"security_phrase_incorrect_error": "Impossible d’accéder à l’espace de stockage sécurisé. Merci de vérifier que vous avez saisi la bonne phrase secrète.",
|
||||
"security_phrase_title": "Phrase de sécurité",
|
||||
"separator": "%(securityKey)s ou %(recoveryFile)s",
|
||||
"use_security_key_prompt": "Utilisez votre clé de récupération pour continuer."
|
||||
"use_security_key_prompt": "Utilisez votre clé de sécurité pour continuer."
|
||||
},
|
||||
"bootstrap_title": "Configuration des clés",
|
||||
"cancel_entering_passphrase_description": "Souhaitez-vous vraiment annuler la saisie de la phrase de passe ?",
|
||||
@@ -915,18 +876,14 @@
|
||||
"title": "Détruire les clés de signature croisée ?",
|
||||
"warning": "La suppression des clés de signature croisée est permanente. Tous ceux que vous avez vérifié vont voir des alertes de sécurité. Il est peu probable que ce soit ce que vous voulez faire, sauf si vous avez perdu tous les appareils vous permettant d’effectuer une signature croisée."
|
||||
},
|
||||
"enter_recovery_key": "Saisir la clé de récupération",
|
||||
"event_shield_reason_authenticity_not_guaranteed": "L’authenticité de ce message chiffré ne peut pas être garantie sur cet appareil.",
|
||||
"event_shield_reason_mismatched_sender_key": "Chiffré par une session non vérifiée",
|
||||
"event_shield_reason_unknown_device": "Chiffré par un appareil inconnu ou supprimé.",
|
||||
"event_shield_reason_unsigned_device": "Chiffré par un appareil non vérifié par son propriétaire.",
|
||||
"event_shield_reason_unverified_identity": "Chiffré par un utilisateur non vérifié.",
|
||||
"export_unsupported": "Votre navigateur ne prend pas en charge les extensions cryptographiques nécessaires",
|
||||
"forgot_recovery_key": "Clé de récupération oubliée ?",
|
||||
"import_invalid_keyfile": "Fichier de clé %(brand)s non valide",
|
||||
"import_invalid_passphrase": "Erreur d’authentification : mot de passe incorrect ?",
|
||||
"key_storage_out_of_sync": "Le stockage de vos clés n'est pas synchronisé.",
|
||||
"key_storage_out_of_sync_description": "Confirmez votre clé de récupération pour conserver l’accès à votre stockage de clés et à l’historique des messages.",
|
||||
"messages_not_secure": {
|
||||
"cause_1": "Votre serveur d’accueil",
|
||||
"cause_2": "Le serveur d’accueil auquel l’utilisateur que vous vérifiez est connecté",
|
||||
@@ -936,7 +893,7 @@
|
||||
"title": "Vos messages ne sont pas sécurisés"
|
||||
},
|
||||
"new_recovery_method_detected": {
|
||||
"description_1": "Une nouvelle phrase et clé de sécurité pour les messages sécurisés ont été détectées.",
|
||||
"description_1": "Une nouvelle phrase secrète et clé de sécurité pour les messages sécurisés ont été détectées.",
|
||||
"description_2": "Cette session chiffre l’historique en utilisant la nouvelle méthode de récupération.",
|
||||
"title": "Nouvelle méthode de récupération",
|
||||
"warning": "Si vous n’avez pas activé de nouvelle méthode de récupération, un attaquant essaye peut-être d’accéder à votre compte. Changez immédiatement le mot de passe de votre compte et configurez une nouvelle méthode de récupération dans les paramètres."
|
||||
@@ -945,7 +902,7 @@
|
||||
"pinned_identity_changed": "L'identité de %(displayName)s(<b>%(userId)s</b>) semble avoir changé. <a>En savoir plus </a>",
|
||||
"pinned_identity_changed_no_displayname": "<b>%(userId)s</b>semble avoir changé d'identité. <a>En savoir plus</a>",
|
||||
"recovery_method_removed": {
|
||||
"description_1": "Cette session a détecté que votre phrase de sécurité et clé de sécurité pour les messages sécurisés ont été supprimées.",
|
||||
"description_1": "Cette session a détecté que votre phrase secrète et clé de sécurité pour les messages sécurisés ont été supprimées.",
|
||||
"description_2": "Si vous l’avez fait accidentellement, vous pouvez configurer les messages sécurisés sur cette session ce qui re-chiffrera l’historique des messages de cette session avec une nouvelle méthode de récupération.",
|
||||
"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."
|
||||
@@ -995,7 +952,7 @@
|
||||
"incoming_sas_dialog_waiting": "Attente de la confirmation du partenaire…",
|
||||
"incoming_sas_user_dialog_text_1": "Vérifier cet utilisateur pour le marquer comme fiable. Faire confiance aux utilisateurs vous permet d’être tranquille lorsque vous utilisez des messages chiffrés de bout en bout.",
|
||||
"incoming_sas_user_dialog_text_2": "Vérifier cet utilisateur marquera sa session comme fiable, et marquera aussi votre session comme fiable pour lui.",
|
||||
"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_key_or_device": "Il semblerait que vous n’avez pas de clé de sécurité ou d’autres appareils pour faire 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.",
|
||||
"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é.",
|
||||
@@ -1045,21 +1002,18 @@
|
||||
"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_reset_warning_1": "La réinitialisation de vos clés de vérification ne peut pas être annulé. Après la réinitialisation, vous n’aurez plus accès à vos anciens messages chiffrés, et tous les amis que vous aviez précédemment vérifiés verront des avertissement de sécurité jusqu'à ce vous les vérifiiez à nouveau.",
|
||||
"verify_reset_warning_2": "Veuillez ne continuer que si vous êtes certain d’avoir perdu tous vos autres appareils et votre clé de récupération.",
|
||||
"verify_reset_warning_2": "Veuillez ne continuer que si vous êtes certain d’avoir perdu tous vos autres appareils et votre Clé de Sécurité.",
|
||||
"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",
|
||||
"verify_using_key": "Vérifier avec une clé de sécurité",
|
||||
"verify_using_key_or_phrase": "Vérifier avec une clé de sécurité 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)…",
|
||||
"waiting_other_user": "En attente de la vérification de %(displayName)s…"
|
||||
},
|
||||
"verification_requested_toast_title": "Vérification requise",
|
||||
"verified_identity_changed": "%(displayName)s l'identité vérifiée de (<b>%(userId)s</b>) a changé. <a>En savoir plus </a>",
|
||||
"verified_identity_changed_no_displayname": "L'identité vérifiée de <b>%(userId)s</b> a changé. <a>En savoir plus </a>",
|
||||
"verify_toast_description": "D’autres utilisateurs pourraient ne pas lui faire confiance",
|
||||
"verify_toast_title": "Vérifier cette session",
|
||||
"withdraw_verification_action": "Révoquer la vérification"
|
||||
"verify_toast_title": "Vérifier cette session"
|
||||
},
|
||||
"error": {
|
||||
"admin_contact": "Veuillez <a>contacter l’administrateur de votre service</a> pour continuer à l’utiliser.",
|
||||
@@ -1161,7 +1115,7 @@
|
||||
"creating_output": "Création du résultat…",
|
||||
"creator_summary": "%(creatorName)s a créé ce salon.",
|
||||
"current_timeline": "Historique actuel",
|
||||
"enter_number_between_min_max": "Saisir un nombre entre %(min)s et %(max)s",
|
||||
"enter_number_between_min_max": "Entrez un nombre entre %(min)s et %(max)s",
|
||||
"error_fetching_file": "Erreur lors de la récupération du fichier",
|
||||
"export_info": "C’est le début de l’export de <roomName/>. Exporté par <exporterDetails/> le %(exportDate)s.",
|
||||
"export_successful": "Export réussi !",
|
||||
@@ -1496,7 +1450,6 @@
|
||||
"location_share_live_description": "Implémentation temporaire. Les positions sont persistantes dans l’historique du salon.",
|
||||
"mjolnir": "Nouvelles manières d’ignorer des gens",
|
||||
"msc3531_hide_messages_pending_moderation": "Permettre aux modérateurs de cacher des messages en attente de modération.",
|
||||
"new_room_list": "Activer la nouvelle liste de salons",
|
||||
"notification_settings": "Nouveaux paramètres de notification",
|
||||
"notification_settings_beta_caption": "Introduit une manière plus simple de changer vos préférences de notifications. Customisez %(brand)s, comme ça vous convient.",
|
||||
"notification_settings_beta_title": "Paramètres de notification",
|
||||
@@ -1620,14 +1573,8 @@
|
||||
"toggle_attribution": "Changer l’attribution"
|
||||
},
|
||||
"member_list": {
|
||||
"count": {
|
||||
"one": "%(count)s Membre",
|
||||
"other": "%(count)s Membres"
|
||||
},
|
||||
"filter_placeholder": "Filtrer les membres du salon",
|
||||
"invite_button_no_perms_tooltip": "Vous n’avez pas la permission d’inviter des utilisateurs",
|
||||
"invited_label": "Invité",
|
||||
"no_matches": "Aucune correspondance",
|
||||
"power_label": "%(userName)s (rang %(powerLevelNumber)s)"
|
||||
},
|
||||
"member_list_back_action_label": "Membres du salon",
|
||||
@@ -1800,24 +1747,24 @@
|
||||
"restore_key_backup_dialog": {
|
||||
"count_of_decryption_failures": "Le déchiffrement de %(failedCount)s sessions a échoué !",
|
||||
"count_of_successfully_restored_keys": "%(sessionCount)s clés ont été restaurées avec succès",
|
||||
"enter_key_description": "Accédez à votre historique de messages chiffrés et mettez en place la messagerie sécurisée en saisissant votre clé de récupération.",
|
||||
"enter_key_title": "Saisir la clé de récupération",
|
||||
"enter_phrase_description": "Accédez à votre historique de messages chiffrés et mettez en place la messagerie sécurisée en saisissant votre phrase de sécurité.",
|
||||
"enter_phrase_title": "Saisir la phrase de sécurité",
|
||||
"incorrect_security_phrase_dialog": "La sauvegarde n’a pas pu être déchiffrée avec cette phrase de sécurité : merci de vérifier que vous avez saisi la bonne phrase de sécurité.",
|
||||
"incorrect_security_phrase_title": "Phrase de sécurité incorrecte",
|
||||
"enter_key_description": "Accédez à votre historique de messages chiffrés et mettez en place la messagerie sécurisée en entrant votre clé de sécurité.",
|
||||
"enter_key_title": "Saisir la clé de sécurité",
|
||||
"enter_phrase_description": "Accédez à votre historique de messages chiffrés et mettez en place la messagerie sécurisée en entrant votre phrase secrète.",
|
||||
"enter_phrase_title": "Saisir la phrase de secrète",
|
||||
"incorrect_security_phrase_dialog": "La sauvegarde n’a pas pu être déchiffrée avec cette phrase secrète : merci de vérifier que vous avez saisi la bonne phrase secrète.",
|
||||
"incorrect_security_phrase_title": "Phrase secrète incorrecte",
|
||||
"key_backup_warning": "<b>Attention</b> : vous ne devriez configurer la sauvegarde des clés que depuis un ordinateur de confiance.",
|
||||
"key_fetch_in_progress": "Récupération des clés depuis le serveur…",
|
||||
"key_forgotten_text": "Si vous avez oublié votre clé de récupération, vous pouvez <button>définir de nouvelles options de récupération</button>",
|
||||
"key_is_invalid": "Clé de récupération invalide",
|
||||
"key_is_valid": "La clé de récupération semble valide !",
|
||||
"key_forgotten_text": "Si vous avez oublié votre clé de sécurité, vous pouvez <button>définir de nouvelles options de récupération</button>",
|
||||
"key_is_invalid": "Clé de sécurité invalide",
|
||||
"key_is_valid": "Ça ressemble à une clé de sécurité !",
|
||||
"keys_restored_title": "Clés restaurées",
|
||||
"load_error_content": "Impossible de récupérer l’état de la sauvegarde",
|
||||
"load_keys_progress": "%(completed)s clés sur %(total)s restaurées",
|
||||
"no_backup_error": "Aucune sauvegarde n’a été trouvée !",
|
||||
"phrase_forgotten_text": "Si vous avez oublié votre phrase de sécurité, vous pouvez <button1>utiliser votre clé de récupération</button1> ou <button2>définir de nouvelles options de récupération</button2>",
|
||||
"recovery_key_mismatch_description": "La sauvegarde n’a pas pu être déchiffrée avec cette clé de récupération : merci de vérifier que vous avez saisi la bonne clé de récupération.",
|
||||
"recovery_key_mismatch_title": "Clé de récupération non concordante",
|
||||
"phrase_forgotten_text": "Si vous avez oublié votre phrase secrète vous pouvez <button1>utiliser votre clé de sécurité</button1> ou <button2>définir de nouvelles options de récupération</button2>",
|
||||
"recovery_key_mismatch_description": "La sauvegarde n’a pas pu être déchiffrée avec cette clé de sécurité : merci de vérifier que vous avez saisi la bonne clé de sécurité.",
|
||||
"recovery_key_mismatch_title": "Pas de correspondance entre les clés de sécurité",
|
||||
"restore_failed_error": "Impossible de restaurer la sauvegarde"
|
||||
},
|
||||
"right_panel": {
|
||||
@@ -2433,7 +2380,7 @@
|
||||
"custom_theme_add": "Ajouter un thème personnalisé",
|
||||
"custom_theme_downloading": "Téléchargement du thème personnalisé…",
|
||||
"custom_theme_error_downloading": "Erreur lors du téléchargement du thème",
|
||||
"custom_theme_help": "Saisir l'URL du thème personnalisé que vous souhaitez appliquer.",
|
||||
"custom_theme_help": "Entrez l'URL du thème personnalisé que vous souhaitez appliquer.",
|
||||
"custom_theme_invalid": "Schéma du thème invalide.",
|
||||
"dialog_title": "<strong>Paramètres : </strong> Apparence",
|
||||
"font_size": "Taille de la police",
|
||||
@@ -2459,56 +2406,6 @@
|
||||
"emoji_autocomplete": "Activer la suggestion d’émojis lors de la saisie",
|
||||
"enable_markdown": "Activer Markdown",
|
||||
"enable_markdown_description": "Commencez les messages avec <code>/plain</code> pour les envoyer sans markdown.",
|
||||
"encryption": {
|
||||
"advanced": {
|
||||
"breadcrumb_first_description": "Les détails de votre compte, vos contacts, vos préférences et votre liste de discussions seront conservés",
|
||||
"breadcrumb_page": "Réinitialiser le chiffrement",
|
||||
"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_forgot": "Vous avez oublié votre clé de récupération ? Vous devez réinitialiser votre identité.",
|
||||
"breadcrumb_warning": "Ne faites cela que si vous pensez que votre compte a été compromis.",
|
||||
"details_title": "Détails du chiffrement",
|
||||
"export_keys": "Exporter les clés",
|
||||
"import_keys": "Importer les clés",
|
||||
"other_people_device_description": "Par défaut, dans les salons chiffrées, n'envoyez pas de messages chiffrés à qui que ce soit avant de les avoir vérifiés",
|
||||
"other_people_device_label": "N'envoyez jamais de messages chiffrés à des appareils non vérifiés",
|
||||
"other_people_device_title": "Appareils d'autres personnes",
|
||||
"reset_identity": "Réinitialiser l'identité cryptographique",
|
||||
"session_id": "Identifiant de session :",
|
||||
"session_key": "Clé de session :",
|
||||
"title": "Avancé"
|
||||
},
|
||||
"device_not_verified_button": "Vérifiez cet appareil",
|
||||
"device_not_verified_description": "Vous devez vérifier cet appareil afin de visualiser vos paramètres de chiffrement.",
|
||||
"device_not_verified_title": "Appareil non vérifié",
|
||||
"dialog_title": "<strong>Paramètres : </strong> Chiffrement",
|
||||
"recovery": {
|
||||
"change_recovery_confirm_button": "Confirmez la nouvelle clé de récupération",
|
||||
"change_recovery_confirm_description": "Saisissez votre nouvelle clé de récupération ci-dessous pour terminer. Votre ancienne clé ne fonctionnera plus.",
|
||||
"change_recovery_confirm_title": "Saisir votre nouvelle clé de récupération",
|
||||
"change_recovery_key": "Changer la clé de récupération",
|
||||
"change_recovery_key_description": "Notez cette nouvelle clé de récupération dans un endroit sûr. Cliquez ensuite sur Continuer pour confirmer la modification.",
|
||||
"change_recovery_key_title": "Changer la clé de récupération ?",
|
||||
"description": "Récupérez votre identité cryptographique et l'historique de vos messages à l'aide d'une clé de récupération si vous avez perdu tous vos appareils existants.",
|
||||
"enter_key_error": "La clé de récupération que vous avez saisie est incorrecte.",
|
||||
"enter_recovery_key": "Saisir la clé de récupération",
|
||||
"forgot_recovery_key": "Clé de récupération oubliée ?",
|
||||
"key_storage_warning": "Le stockage de vos clés n'est pas synchronisé. Cliquez sur l'un des boutons ci-dessous pour résoudre le problème.",
|
||||
"save_key_description": "Ne partagez cela avec personne !",
|
||||
"save_key_title": "Clé de récupération",
|
||||
"set_up_recovery": "Configurer la sauvegarde",
|
||||
"set_up_recovery_confirm_button": "Terminer la configuration",
|
||||
"set_up_recovery_confirm_description": "Saisissez la clé de récupération affichée sur l’écran précédent pour terminer la configuration de la récupération.",
|
||||
"set_up_recovery_confirm_title": "Saisissez votre clé de récupération pour confirmer",
|
||||
"set_up_recovery_description": "Le stockage de vos clés est protégé par une clé de récupération. Si vous avez besoin d'une nouvelle clé de récupération après la création, vous pouvez la recréer en sélectionnant « %(changeRecoveryKeyButton)s ».",
|
||||
"set_up_recovery_save_key_description": "Recopier cette clé de récupération dans un endroit sûr, comme un gestionnaire de mots de passe, une note chiffrée ou un coffre-fort physique.",
|
||||
"set_up_recovery_save_key_title": "Enregistrez votre clé de récupération dans un endroit sûr",
|
||||
"set_up_recovery_secondary_description": "Après avoir cliqué sur continuer, nous allons générer une clé de récupération pour vous.",
|
||||
"title": "Récupération"
|
||||
},
|
||||
"title": "Chiffrement"
|
||||
},
|
||||
"general": {
|
||||
"account_management_section": "Gestion du compte",
|
||||
"account_section": "Compte",
|
||||
@@ -2610,27 +2507,27 @@
|
||||
"backup_setup_success_description": "Vos clés sont maintenant sauvegardées depuis cet appareil.",
|
||||
"backup_setup_success_title": "Sauvegarde sécurisée réalisée avec succès",
|
||||
"cancel_warning": "Si vous annulez maintenant, vous pourriez perdre vos messages et données chiffrés si vous perdez l’accès à vos identifiants.",
|
||||
"confirm_security_phrase": "Confirmez votre phrase de sécurité",
|
||||
"confirm_security_phrase": "Confirmez votre phrase secrète",
|
||||
"description": "Protection afin d’éviter de perdre l’accès aux messages et données chiffrés en sauvegardant les clés de chiffrement sur votre serveur.",
|
||||
"download_or_copy": "%(downloadButton)s ou %(copyButton)s",
|
||||
"enter_phrase_description": "Saisissez une phrase de sécurité connue de vous seul·e car elle est utilisée pour protéger vos données. Pour plus de sécurité, vous ne devriez pas réutiliser le mot de passe de votre compte.",
|
||||
"enter_phrase_description": "Saisissez une Phrase de Sécurité connue de vous seul·e car elle est utilisée pour protéger vos données. Pour plus de sécurité, vous ne devriez pas réutiliser le mot de passe de votre compte.",
|
||||
"enter_phrase_title": "Saisir une phrase de sécurité",
|
||||
"enter_phrase_to_confirm": "Saisissez à nouveau votre phrase de sécurité pour la confirmer.",
|
||||
"generate_security_key_description": "Nous allons générer une clé de récupération que vous devrez conserver dans un endroit sûr, comme un gestionnaire de mots de passe ou un coffre.",
|
||||
"generate_security_key_title": "Générer une clé de récupération",
|
||||
"enter_phrase_to_confirm": "Saisissez à nouveau votre phrase secrète pour la confirmer.",
|
||||
"generate_security_key_description": "Nous génèrerons une clé de sécurité que vous devrez stocker dans un endroit sûr, comme un gestionnaire de mots de passe ou un coffre.",
|
||||
"generate_security_key_title": "Générer une clé de sécurité",
|
||||
"pass_phrase_match_failed": "Ça ne correspond pas.",
|
||||
"pass_phrase_match_success": "Ça correspond !",
|
||||
"phrase_strong_enough": "Super ! Cette phrase de sécurité a l’air assez robuste.",
|
||||
"phrase_strong_enough": "Super ! Cette phrase secrète a l’air assez solide.",
|
||||
"secret_storage_query_failure": "Impossible de demander le statut du coffre secret",
|
||||
"security_key_safety_reminder": "Conservez votre clé de récupération dans un endroit sûr, comme un gestionnaire de mots de passe ou un coffre. Elle est utilisée pour protéger vos données chiffrées.",
|
||||
"security_key_safety_reminder": "Stockez votre clé de sécurité dans un endroit sûr, comme un gestionnaire de mots de passe ou un coffre, car elle est utilisée pour protéger vos données chiffrées.",
|
||||
"set_phrase_again": "Retournez en arrière pour la redéfinir.",
|
||||
"settings_reminder": "Vous pouvez aussi configurer la sauvegarde sécurisée et gérer vos clés depuis les paramètres.",
|
||||
"title_confirm_phrase": "Confirmer la phrase de sécurité",
|
||||
"title_save_key": "Sauvegarder votre clé de récupération",
|
||||
"title_save_key": "Sauvegarder votre clé de sécurité",
|
||||
"title_set_phrase": "Définir une phrase de sécurité",
|
||||
"unable_to_setup": "Impossible de configurer le coffre secret",
|
||||
"use_different_passphrase": "Utiliser une phrase secrète différente ?",
|
||||
"use_phrase_only_you_know": "Utilisez une phrase secrète uniquement connue de vous et enregistrez éventuellement une clé de récupération à utiliser pour vos sauvegardes."
|
||||
"use_phrase_only_you_know": "Utilisez une phrase secrète que vous êtes seul à connaître et enregistrez éventuellement une clé de sécurité à utiliser pour la sauvegarde."
|
||||
}
|
||||
},
|
||||
"key_export_import": {
|
||||
@@ -2680,7 +2577,7 @@
|
||||
"error_updating": "Nous avons rencontré une erreur lors de la mise-à-jour de vos préférences de notification. Veuillez essayer de réactiver l’option.",
|
||||
"invites": "Invitation dans un salon",
|
||||
"keywords": "Affiche un badge <badge/> quand des mots-clés sont utilisés dans un salon.",
|
||||
"keywords_prompt": "Saisir des mots-clés ici, ou pour des orthographes alternatives ou des surnoms",
|
||||
"keywords_prompt": "Entrer des mots-clés ici, ou pour des orthographes alternatives ou des surnoms",
|
||||
"labs_notice_prompt": "<strong>Mise-à-jour : </strong>Nous avons simplifié les paramètres de notifications pour rendre les options plus facile à trouver. Certains paramètres que vous aviez choisi par le passé ne sont pas visibles ici, mais ils sont toujours actifs. Si vous continuez, certains de vos paramètres peuvent changer. <a>En savoir plus</a>",
|
||||
"mentions_keywords": "Mentions et mots-clés",
|
||||
"mentions_keywords_only": "Seulement les mentions et les mots-clés",
|
||||
@@ -2749,7 +2646,7 @@
|
||||
"backup_key_stored_status": "Clé de sauvegarde enregistrée :",
|
||||
"backup_key_unexpected_type": "type inattendu",
|
||||
"backup_key_well_formed": "bien formée",
|
||||
"backup_keys_description": "Sauvegardez vos clés de chiffrement avec les données de votre compte au cas où vous perdriez l'accès à vos sessions. Vos clés seront sécurisées à l'aide d'une clé de récupération unique.",
|
||||
"backup_keys_description": "Sauvegardez vos clés de chiffrement et les données de votre compte au cas où vous perdiez l’accès à vos sessions. Vos clés seront sécurisés avec une Clé de Sécurité unique.",
|
||||
"bulk_options_accept_all_invites": "Accepter les %(invitedRooms)s invitations",
|
||||
"bulk_options_reject_all_invites": "Rejeter la totalité des %(invitedRooms)s invitations",
|
||||
"bulk_options_section": "Options de groupe",
|
||||
@@ -3457,7 +3354,6 @@
|
||||
"left_reason": "%(targetName)s a quitté le salon : %(reason)s",
|
||||
"no_change": "%(senderName)s n’a fait aucun changement",
|
||||
"reject_invite": "%(targetName)s a rejeté l’invitation",
|
||||
"reject_invite_reason": "%(targetName)s a rejeté l'invitation : %(reason)s",
|
||||
"remove_avatar": "%(senderName)s a supprimé son image de profil",
|
||||
"remove_name": "%(senderName)s a supprimé son nom d’affichage (%(oldDisplayName)s)",
|
||||
"set_avatar": "%(senderName)s a défini une image de profil",
|
||||
@@ -3494,8 +3390,7 @@
|
||||
},
|
||||
"m.room.tombstone": "%(senderDisplayName)s a mis à niveau ce salon.",
|
||||
"m.room.topic": {
|
||||
"changed": "%(senderDisplayName)s a changé le sujet du salon en « %(topic)s ».",
|
||||
"removed": "%(senderDisplayName)s a supprimé le sujet."
|
||||
"changed": "%(senderDisplayName)s a changé le sujet du salon en « %(topic)s »."
|
||||
},
|
||||
"m.sticker": "%(senderDisplayName)s a envoyé un autocollant.",
|
||||
"m.video": {
|
||||
@@ -3844,7 +3739,6 @@
|
||||
"unban_space_specific": "Annuler le bannissement de certains endroits où j’ai le droit de le faire",
|
||||
"unban_space_warning": "Ils ne pourront plus accéder aux endroits dans lesquels vous n’êtes pas administrateur.",
|
||||
"unignore_button": "Ne plus ignorer",
|
||||
"verification_unavailable": "Vérification de l’utilisateur indisponible",
|
||||
"verify_button": "Vérifier l’utilisateur",
|
||||
"verify_explainer": "Pour une sécurité supplémentaire, vérifiez cet utilisateur en comparant un code à usage unique sur vos deux appareils."
|
||||
},
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1506,7 +1506,6 @@
|
||||
"location_share_live_description": "Implementacja tymczasowa. Lokalizacje są zapisywane w historii pokoju.",
|
||||
"mjolnir": "Nowe sposoby na ignorowanie osób",
|
||||
"msc3531_hide_messages_pending_moderation": "Daj moderatorom ukrycie wiadomości które są sprawdzane.",
|
||||
"new_room_list": "Włącz nową listę pokojów",
|
||||
"notification_settings": "Ustawienia nowych powiadomień",
|
||||
"notification_settings_beta_caption": "Przedstawiamy prostszy sposób zmiany ustawień powiadomień. Dostosuj %(brand)s wedle swojego upodobania.",
|
||||
"notification_settings_beta_title": "Ustawienia powiadomień",
|
||||
|
||||
@@ -43,7 +43,6 @@
|
||||
"copy_link": "Copiar Link",
|
||||
"create": "Criar",
|
||||
"create_a_room": "Criar uma sala",
|
||||
"create_account": "Criar uma conta",
|
||||
"decline": "Recusar",
|
||||
"delete": "Apagar",
|
||||
"deny": "Negar",
|
||||
@@ -85,7 +84,6 @@
|
||||
"next": "Próximo",
|
||||
"no": "Não",
|
||||
"ok": "OK",
|
||||
"open": "Abrir",
|
||||
"pause": "Pausar",
|
||||
"pin": "Fixar",
|
||||
"play": "Reproduzir",
|
||||
@@ -229,7 +227,6 @@
|
||||
},
|
||||
"misconfigured_body": "Pede ao teu administrador %(brand)s para verificar <a>a tua configuração</a> para ver se há entradas incorretas ou duplicadas.",
|
||||
"misconfigured_title": "O teu %(brand)s está mal configurado",
|
||||
"mobile_create_account_title": "Estás prestes a criar uma conta no %(hsName)s",
|
||||
"msisdn_field_description": "Outros utilizadores podem convidar-te para salas utilizando os teus dados de contacto",
|
||||
"msisdn_field_label": "Telefone",
|
||||
"msisdn_field_number_invalid": "Este número de telefone não parece estar correto, por favor verifica e tenta novamente",
|
||||
@@ -279,8 +276,6 @@
|
||||
"security_code": "Código de segurança",
|
||||
"security_code_prompt": "Se solicitado, insira o código abaixo no seu outro dispositivo.",
|
||||
"select_qr_code": "Seleciona \"%(scanQRCode)s\"",
|
||||
"unsupported_explainer": "O teu fornecedor de conta não suporta o início de sessão num novo dispositivo com um código QR.",
|
||||
"unsupported_heading": "Código QR não suportado",
|
||||
"waiting_for_device": "A aguardar que o dispositivo inicie sessão"
|
||||
},
|
||||
"register_action": "Criar conta",
|
||||
@@ -357,7 +352,6 @@
|
||||
"soft_logout_subheading": "Limpar dados pessoais",
|
||||
"soft_logout_warning": "Aviso: os teus dados pessoais (incluindo chaves de encriptação) ainda estão armazenados nesta sessão. Limpa-a se já tiveres terminado de utilizar esta sessão ou se quiseres iniciar sessão noutra conta.",
|
||||
"sso": "Registo único",
|
||||
"sso_complete_in_browser_dialog_title": "Vai para o teu browser para concluir o início de sessão",
|
||||
"sso_failed_missing_storage": "Pedimos ao navegador que se lembrasse do homeserver que usa para permitir o início de sessão, mas infelizmente o seu navegador esqueceu. Aceda à página de início de sessão e tente novamente.",
|
||||
"sso_or_username_password": "%(ssoButtons)s Ou %(usernamePassword)s",
|
||||
"sync_footer_subtitle": "Se já te juntaste a muitas salas, isto pode demorar um pouco",
|
||||
@@ -369,8 +363,6 @@
|
||||
"email_resend_prompt": "Não o recebeste? <a>Reenvia-o</a>",
|
||||
"email_resent": "Reenviado!",
|
||||
"fallback_button": "Iniciar autenticação",
|
||||
"mas_cross_signing_reset_cta": "Ir para a tua conta",
|
||||
"mas_cross_signing_reset_description": "Repõe a tua identidade através do teu fornecedor de conta e, em seguida, volta a clicar em \"Repetir\".",
|
||||
"msisdn": "Foi enviada uma mensagem de texto para %(msisdn)s",
|
||||
"msisdn_token_incorrect": "Token incorreto",
|
||||
"msisdn_token_prompt": "Por favor, entre com o código que está na mensagem:",
|
||||
@@ -501,7 +493,6 @@
|
||||
"matrix": "Matrix",
|
||||
"message": "Mensagem",
|
||||
"message_layout": "Disposição da mensagem",
|
||||
"message_timestamp_invalid": "Carimbo de data/hora inválido",
|
||||
"microphone": "Microfone",
|
||||
"model": "Modelo",
|
||||
"modern": "Moderno",
|
||||
@@ -539,7 +530,6 @@
|
||||
"qr_code": "Código QR",
|
||||
"random": "Aleatório",
|
||||
"reactions": "Reações",
|
||||
"recommended": "Recomendado",
|
||||
"report_a_bug": "Comunicar falha",
|
||||
"room": "Sala",
|
||||
"room_name": "Nome da sala",
|
||||
@@ -725,51 +715,12 @@
|
||||
"twemoji": "A arte do emoji <twemoji>Twemoji</twemoji> é © <author>Twitter, Inc e outros colaboradores</author> utilizada ao abrigo dos termos de <terms>CC-BY 4.0</terms>.",
|
||||
"twemoji_colr": "O tipo de letra <colr>twemoji-colr</colr> é © <author>Mozilla Foundation</author> utilizado nos termos de <terms>Apache 2.0</terms>."
|
||||
},
|
||||
"desktop_default_device_name": "%(brand)s Desktop: %(platformName)s",
|
||||
"devtools": {
|
||||
"active_widgets": "Widgets ativos",
|
||||
"category_other": "Outros",
|
||||
"category_room": "Sala",
|
||||
"caution_colon": "Atenção:",
|
||||
"client_versions": "Versões de cliente",
|
||||
"crypto": {
|
||||
"4s_public_key_in_account_data": "nos dados da conta",
|
||||
"4s_public_key_not_in_account_data": "não encontrado",
|
||||
"4s_public_key_status": "Chave pública de armazenamento secreto:",
|
||||
"backup_key_cached": "armazenado em cache localmente",
|
||||
"backup_key_cached_status": "Chave de backup armazenada em cache:",
|
||||
"backup_key_not_stored": "não armazenado",
|
||||
"backup_key_stored": "em armazenamento secreto",
|
||||
"backup_key_stored_status": "Chave de backup armazenada:",
|
||||
"backup_key_unexpected_type": "tipo inesperado",
|
||||
"backup_key_well_formed": "bem formado",
|
||||
"cross_signing": "Assinatura cruzada",
|
||||
"cross_signing_cached": "armazenados em cache localmente",
|
||||
"cross_signing_not_ready": "A assinatura cruzada não está configurada.",
|
||||
"cross_signing_private_keys_in_storage": "em armazenamento secreto",
|
||||
"cross_signing_private_keys_in_storage_status": "Assinatura cruzada de chaves privadas:",
|
||||
"cross_signing_private_keys_not_in_storage": "não encontrado no armazenamento",
|
||||
"cross_signing_public_keys_on_device": "na memória",
|
||||
"cross_signing_public_keys_on_device_status": "Assinatura cruzada de chaves públicas:",
|
||||
"cross_signing_ready": "A assinatura cruzada está pronta para uso.",
|
||||
"cross_signing_status": "Status da assinatura cruzada:",
|
||||
"cross_signing_untrusted": "Sua conta tem uma identidade de assinatura cruzada no armazenamento secreto, mas ainda não é confiável para esta sessão.",
|
||||
"crypto_not_available": "O módulo criptográfico não está disponível",
|
||||
"key_backup_active_version": "Versão de backup ativo:",
|
||||
"key_backup_active_version_none": "Nenhum",
|
||||
"key_backup_inactive_warning": "Não está a ser feito o backup das suas chaves a partir desta sessão.",
|
||||
"key_backup_latest_version": "Versão de backup mais recente no servidor:",
|
||||
"key_storage": "Armazenamento de chaves",
|
||||
"master_private_key_cached_status": "Chave mestra privada:",
|
||||
"not_found": "não encontrado",
|
||||
"not_found_locally": "não encontrado localmente",
|
||||
"secret_storage_not_ready": "não está pronto",
|
||||
"secret_storage_ready": "pronto",
|
||||
"secret_storage_status": "Armazenamento secreto:",
|
||||
"self_signing_private_key_cached_status": "Chave privada de auto-assinatura:",
|
||||
"title": "Criptografia de ponta a ponta",
|
||||
"user_signing_private_key_cached_status": "Chave privada de assinatura do usuário:"
|
||||
},
|
||||
"developer_mode": "Modo de desenvolvedor",
|
||||
"developer_tools": "Ferramentas de desenvolvedor",
|
||||
"edit_setting": "Editar configuração",
|
||||
@@ -856,7 +807,6 @@
|
||||
"widget_screenshots": "Ativar capturas de ecrã de widgets em widgets suportados"
|
||||
},
|
||||
"dialog_close_label": "Fechar diálogo",
|
||||
"download_completed": "Download Concluído",
|
||||
"emoji": {
|
||||
"categories": "Categorias",
|
||||
"category_activities": "Atividades",
|
||||
@@ -877,22 +827,22 @@
|
||||
"empty_room_was_name": "Sala vazia (era %(oldName)s)",
|
||||
"encryption": {
|
||||
"access_secret_storage_dialog": {
|
||||
"enter_phrase_or_key_prompt": "Introduz a tua frase de segurança ou <button>utiliza a tua chave de recuperação</button> para continuar.",
|
||||
"enter_phrase_or_key_prompt": "Introduz a tua frase de segurança ou <button>utiliza a tua chave de segurança</button> para continuar.",
|
||||
"key_validation_text": {
|
||||
"invalid_security_key": "Chave de recuperação inválida",
|
||||
"invalid_security_key": "Chave de segurança inválida",
|
||||
"recovery_key_is_correct": "Parece bom!",
|
||||
"wrong_file_type": "Tipo de ficheiro errado",
|
||||
"wrong_security_key": "Chave de recuperação errada"
|
||||
"wrong_security_key": "Chave de segurança errada"
|
||||
},
|
||||
"reset_title": "Repor tudo",
|
||||
"reset_warning_1": "Faz isto apenas se não tiveres outro dispositivo para completar a verificação.",
|
||||
"reset_warning_2": "Se reiniciares tudo, irás reiniciar sem sessões de confiança, sem utilizadores de confiança e poderás não conseguir ver mensagens anteriores.",
|
||||
"restoring": "Restaurar chaves a partir de uma cópia de segurança",
|
||||
"security_key_title": "Chave de recuperação",
|
||||
"security_key_title": "Chave de segurança",
|
||||
"security_phrase_incorrect_error": "Não é possível aceder ao armazenamento secreto. Verifica se introduziste a frase de segurança correcta.",
|
||||
"security_phrase_title": "Frase de segurança",
|
||||
"separator": "%(securityKey)s ou %(recoveryFile)s",
|
||||
"use_security_key_prompt": "Utiliza a tua chave de recuperação para continuar."
|
||||
"use_security_key_prompt": "Utiliza a tua chave de segurança para continuar."
|
||||
},
|
||||
"bootstrap_title": "A configurar chaves",
|
||||
"cancel_entering_passphrase_description": "Tem a certeza que quer cancelar a introdução da frase-passe?",
|
||||
@@ -915,18 +865,14 @@
|
||||
"title": "Destrói as chaves de assinatura cruzada?",
|
||||
"warning": "A eliminação das chaves de assinatura cruzada é permanente. Qualquer pessoa com quem tenhas feito a verificação verá alertas de segurança. É quase certo que não vais querer fazer isto, a menos que tenhas perdido todos os dispositivos a partir dos quais podes fazer a assinatura cruzada."
|
||||
},
|
||||
"enter_recovery_key": "Introduzir a chave de recuperação",
|
||||
"event_shield_reason_authenticity_not_guaranteed": "A autenticidade desta mensagem encriptada não pode ser garantida neste dispositivo.",
|
||||
"event_shield_reason_mismatched_sender_key": "Encriptado por uma sessão não verificada",
|
||||
"event_shield_reason_unknown_device": "Encriptado por um dispositivo desconhecido ou apagado.",
|
||||
"event_shield_reason_unsigned_device": "Encriptado por um dispositivo não verificado pelo seu proprietário.",
|
||||
"event_shield_reason_unverified_identity": "Encriptado por um utilizador não verificado.",
|
||||
"export_unsupported": "O seu navegador não suporta as extensões de criptografia necessárias",
|
||||
"forgot_recovery_key": "Esqueceste-te da chave de recuperação?",
|
||||
"import_invalid_keyfile": "Não é um ficheiro de chaves %(brand)s válido",
|
||||
"import_invalid_passphrase": "Erro de autenticação: palavra-passe incorreta?",
|
||||
"key_storage_out_of_sync": "O teu armazenamento de chaves está dessincronizado.",
|
||||
"key_storage_out_of_sync_description": "Confirma a tua chave de recuperação para manteres o acesso ao teu armazenamento de chaves e ao histórico de mensagens.",
|
||||
"messages_not_secure": {
|
||||
"cause_1": "O teu servidor doméstico",
|
||||
"cause_2": "O servidor doméstico ao qual o utilizador que estás a verificar está ligado",
|
||||
@@ -942,8 +888,6 @@
|
||||
"warning": "Se não tiveres definido o novo 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."
|
||||
},
|
||||
"not_supported": "<não suportado>",
|
||||
"pinned_identity_changed": "A identidade de %(displayName)s (<b>%(userId)s</b> ) parece ter mudado.<a> Saber mais</a>",
|
||||
"pinned_identity_changed_no_displayname": "A identidade de <b>%(userId)s</b> parece ter mudado. <a>Saiba mais</a>",
|
||||
"recovery_method_removed": {
|
||||
"description_1": "Esta sessão detectou que a tua frase de segurança e a chave para as mensagens seguras foram removidas.",
|
||||
"description_2": "Se o fizeste acidentalmente, podes configurar as Mensagens seguras nesta sessão, o que criptografará novamente o histórico de mensagens desta sessão com um novo método de recuperação.",
|
||||
@@ -951,9 +895,6 @@
|
||||
"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? <a>Repor tudo</a>",
|
||||
"set_up_recovery": "Configurar a recuperação",
|
||||
"set_up_recovery_later": "Agora nã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_description": "Protege-te contra a perda de acesso a mensagens e dados encriptados",
|
||||
"set_up_toast_title": "Configura uma cópia de segurança segura",
|
||||
"setup_secure_backup": {
|
||||
@@ -995,7 +936,7 @@
|
||||
"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_key_or_device": "Parece que não tens uma chave de segurança ou quaisquer outros dispositivos que possam ser verificados. 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.",
|
||||
@@ -1045,40 +986,29 @@
|
||||
"verify_emoji_prompt_qr": "Se não conseguires ler o código acima, verifica-o comparando emojis.",
|
||||
"verify_later": "Verificarei mais tarde",
|
||||
"verify_reset_warning_1": "A reposição das tuas chaves de verificação não pode ser anulada. Após a reposição, não terás acesso a mensagens encriptadas antigas e todos os amigos que te tenham verificado anteriormente verão avisos de segurança até voltares a verificar com eles.",
|
||||
"verify_reset_warning_2": "Só avances se tiveres a certeza de que perdeste todos os teus outros dispositivos e a tua chave de recuperação.",
|
||||
"verify_reset_warning_2": "Só avances se tiveres a certeza de que perdeste todos os teus outros dispositivos e a tua chave de segurança.",
|
||||
"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",
|
||||
"verify_using_key": "Verifica com a chave de segurança",
|
||||
"verify_using_key_or_phrase": "Verifica com a chave ou frase de segurança",
|
||||
"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)...",
|
||||
"waiting_other_user": "À espera de %(displayName)s para verificar..."
|
||||
},
|
||||
"verification_requested_toast_title": "Verificação solicitada",
|
||||
"verified_identity_changed": "%(displayName)s(<b>%(userId)s</b>) mudou a tua identidade verificada. <a>Saber mais</a>",
|
||||
"verified_identity_changed_no_displayname": "A identidade verificada de <b>%(userId)s</b> foi alterada. <a>Saber mais</a>",
|
||||
"verify_toast_description": "Outros utilizadores podem não confiar nisto",
|
||||
"verify_toast_title": "Verifica esta sessão",
|
||||
"withdraw_verification_action": "Retirar verificação"
|
||||
"verify_toast_title": "Verifica esta sessão"
|
||||
},
|
||||
"error": {
|
||||
"admin_contact": "Por favor, <a>contacta o teu administrador de serviços</a> para continuares a utilizar este serviço.",
|
||||
"admin_contact_short": "Contacta o teu administrador do servidor <a></a> .",
|
||||
"app_launch_unexpected_error": "Erro inesperado ao preparar a aplicação. Consulta a consola para mais detalhes.",
|
||||
"cannot_load_config": "Não foi possível carregar o ficheiro de configuração: actualiza a página para tentares novamente.",
|
||||
"connection": "Houve um problema de comunicação com o servidor doméstico, por favor tenta novamente mais tarde.",
|
||||
"dialog_description_default": "Ocorreu um erro.",
|
||||
"download_media": "Falha ao transferir o media de origem, não foi encontrado nenhum url de origem",
|
||||
"edit_history_unsupported": "O teu servidor doméstico não parece suportar esta funcionalidade.",
|
||||
"failed_copy": "Falha ao copiar",
|
||||
"hs_blocked": "Este servidor doméstico foi bloqueado pelo seu administrador.",
|
||||
"invalid_configuration_mixed_server": "Configuração inválida: não pode ser especificado um default_hs_url juntamente com default_server_name ou default_server_config",
|
||||
"invalid_configuration_no_server": "Configuração inválida: não especificaste o servidor predefinido.",
|
||||
"invalid_json": "A tua configuração do Element contém um JSON inválido. Corrige o problema e volta a carregar a página.",
|
||||
"invalid_json_detail": "A mensagem do analisador é: %(message)s",
|
||||
"invalid_json_generic": "JSON inválido",
|
||||
"mau": "Este servidor doméstico atingiu o seu limite mensal de utilizadores activos.",
|
||||
"misconfigured": "O teu Element está mal configurado",
|
||||
"mixed_content": "Não consigo conectar ao servidor padrão através de HTTP quando uma URL HTTPS está na barra de endereços do seu navegador. Use HTTPS ou então <a>habilite scripts não seguros no seu navegador</a>.",
|
||||
"non_urgent_echo_failure_toast": "O teu servidor não está a responder a alguns pedidos <a></a> .",
|
||||
"resource_limits": "Este servidor doméstico excedeu um dos seus limites de recursos.",
|
||||
@@ -1107,7 +1037,7 @@
|
||||
"for_desktop": "O teu disco pode estar cheio. Limpa algum espaço e volta a carregar.",
|
||||
"for_web": "Se limpaste os dados de navegação, esta mensagem é esperada. %(brand)s também pode estar aberto noutro separador ou o teu disco está cheio. Limpa algum espaço e volta a carregar"
|
||||
},
|
||||
"error_database_closed_title": "%(brand)s parou de funcionar",
|
||||
"error_database_closed_title": "Base de dados fechada inesperadamente",
|
||||
"error_dialog": {
|
||||
"copy_room_link_failed": {
|
||||
"description": "Não é possível copiar uma ligação à sala para a área de transferência.",
|
||||
@@ -1143,15 +1073,7 @@
|
||||
"you": "Reagiste %(reaction)s a %(message)s"
|
||||
},
|
||||
"m.sticker": "%(senderName)s: %(stickerName)s",
|
||||
"m.text": "%(senderName)s: %(message)s",
|
||||
"prefix": {
|
||||
"audio": "Áudio",
|
||||
"file": "Ficheiro",
|
||||
"image": "Imagem",
|
||||
"poll": "Sondagem",
|
||||
"video": "Vídeo"
|
||||
},
|
||||
"preview": "<bold>%(prefix)s:</bold> %(preview)s"
|
||||
"m.text": "%(senderName)s: %(message)s"
|
||||
},
|
||||
"export_chat": {
|
||||
"cancelled": "Exportação cancelada",
|
||||
@@ -1273,21 +1195,6 @@
|
||||
"one": "Em %(spaceName)s e noutro espaço.",
|
||||
"other": "Em %(spaceName)s e %(count)s outros espaços."
|
||||
},
|
||||
"incompatible_browser": {
|
||||
"continue": "Continuar assim mesmo",
|
||||
"description": "%(brand)s usa alguns recursos do navegador que não estão disponíveis no seu navegador atual. %(detail)s",
|
||||
"detail_can_continue": "Se continuares, algumas funcionalidades podem deixar de funcionar e existe o risco de perderes dados no futuro.",
|
||||
"detail_no_continue": "Tenta atualizar este browser se não estiveres a utilizar a versão mais recente e tenta novamente.",
|
||||
"learn_more": "Saber mais",
|
||||
"linux": "Linux",
|
||||
"macos": "Mac",
|
||||
"supported_browsers": "Para uma melhor experiência, utiliza <Chrome>Chrome</Chrome>, <Firefox>Firefox</Firefox>, <Edge>Edge</Edge>, ou <Safari>Safari</Safari>.",
|
||||
"title": "%(brand)s não suporta este browser",
|
||||
"use_desktop_heading": "Utiliza antes o %(brand)s Desktop",
|
||||
"use_mobile_heading": "Utiliza antes o %(brand)s no telemóvel",
|
||||
"use_mobile_heading_after_desktop": "Ou utiliza a nossa aplicação móvel",
|
||||
"windows": "Windows (%(bits)s-bit)"
|
||||
},
|
||||
"info_tooltip_title": "Informação",
|
||||
"integration_manager": {
|
||||
"connecting": "Conectando ao gerenciador de integração…",
|
||||
@@ -1462,11 +1369,8 @@
|
||||
"dynamic_room_predecessors": "Antecessores de sala dinâmica",
|
||||
"dynamic_room_predecessors_description": "Ativar MSC3946 (para suportar arquivos de salas que chegam tarde)",
|
||||
"element_call_video_rooms": "Salas de Chamada de vídeo Element",
|
||||
"exclude_insecure_devices": "Exclui dispositivos inseguros ao enviar/receber mensagens",
|
||||
"exclude_insecure_devices_description": "Quando este modo está ativado, as mensagens encriptadas não serão partilhadas com dispositivos não verificados e as mensagens de dispositivos não verificados serão apresentadas como um erro. Tem em atenção que, se activares este modo, poderás não conseguir comunicar com utilizadores que não tenham verificado os seus dispositivos.",
|
||||
"experimental_description": "Estás a sentir-te experimental? Experimenta as nossas ideias mais recentes em desenvolvimento. Estas funcionalidades não estão finalizadas; podem ser instáveis, podem ser alteradas ou podem ser completamente abandonadas. <a>Sabe mais em</a>.",
|
||||
"experimental_section": "Pré-visualizações antecipadas",
|
||||
"extended_profiles_msc_support": "Requer que o teu servidor suporte MSC4133",
|
||||
"feature_disable_call_per_sender_encryption": "Desativar a cifragem por remetente na Element Call",
|
||||
"feature_wysiwyg_composer_description": "Utiliza texto rico em vez de Markdown no compositor de mensagens.",
|
||||
"group_calls": "Nova experiência de chamada de grupo",
|
||||
@@ -1496,7 +1400,6 @@
|
||||
"location_share_live_description": "Implementação temporária. As localizações permanecem no histórico da sala.",
|
||||
"mjolnir": "Novas formas de ignorar pessoas",
|
||||
"msc3531_hide_messages_pending_moderation": "Permitir que os moderadores ocultem mensagens pendentes de moderação.",
|
||||
"new_room_list": "Ativar nova lista de salas",
|
||||
"notification_settings": "Novas Definições de Notificação",
|
||||
"notification_settings_beta_caption": "Apresentamos uma forma mais simples de alterar as tuas definições de notificação. Personaliza o teu %(brand)s, tal como gostas.",
|
||||
"notification_settings_beta_title": "Definições de Notificação",
|
||||
@@ -1620,14 +1523,8 @@
|
||||
"toggle_attribution": "Alterna a atribuição"
|
||||
},
|
||||
"member_list": {
|
||||
"count": {
|
||||
"one": "%(count)s Membro",
|
||||
"other": "%(count)s Membros"
|
||||
},
|
||||
"filter_placeholder": "Filtrar integrantes da sala",
|
||||
"invite_button_no_perms_tooltip": "Não tens permissão para convidar utilizadores",
|
||||
"invited_label": "Convidado",
|
||||
"no_matches": "Sem correspondências",
|
||||
"power_label": "%(userName)s (nível de permissão %(powerLevelNumber)s)"
|
||||
},
|
||||
"member_list_back_action_label": "Membros da sala",
|
||||
@@ -1737,8 +1634,6 @@
|
||||
"moderator": "Moderador/a",
|
||||
"restricted": "Restrito"
|
||||
},
|
||||
"powered_by_matrix": "Fornecido por Matrix",
|
||||
"powered_by_matrix_with_logo": "Conversa e colaboração descentralizadas e encriptadas com a tecnologia $matrixLogo",
|
||||
"presence": {
|
||||
"away": "Ausente",
|
||||
"busy": "Ocupado",
|
||||
@@ -1800,30 +1695,29 @@
|
||||
"restore_key_backup_dialog": {
|
||||
"count_of_decryption_failures": "Falha ao descriptografar%(failedCount)s sessões!",
|
||||
"count_of_successfully_restored_keys": "%(sessionCount)s Chaves restauradas com sucesso",
|
||||
"enter_key_description": "Acede ao teu histórico de mensagens seguras e configura o envio de mensagens seguras introduzindo a tua chave de recuperação.",
|
||||
"enter_key_title": "Introduzir a chave de recuperação",
|
||||
"enter_key_description": "Acede ao teu histórico de mensagens seguras e configura o envio seguro de mensagens introduzindo a tua chave de segurança.",
|
||||
"enter_key_title": "Introduzir chave de segurança",
|
||||
"enter_phrase_description": "Acede ao teu histórico de mensagens seguras e configura o envio de mensagens seguras introduzindo a tua frase de segurança.",
|
||||
"enter_phrase_title": "Introduzir frase de segurança",
|
||||
"incorrect_security_phrase_dialog": "Não foi possível desencriptar a cópia de segurança com esta frase de segurança: verifica se introduziste a frase de segurança correcta.",
|
||||
"incorrect_security_phrase_title": "Frase de segurança incorreta",
|
||||
"key_backup_warning": "<b>Aviso</b>: só deves configurar a cópia de segurança das chaves a partir de um computador de confiança.",
|
||||
"key_fetch_in_progress": "A obter chaves do servidor…",
|
||||
"key_forgotten_text": "Se te esqueceste da tua chave de recuperação, podes <button>configurar novas opções de recuperação</button>",
|
||||
"key_is_invalid": "Não é uma chave de recuperação válida",
|
||||
"key_is_valid": "Esta parece ser uma chave de recuperação válida!",
|
||||
"key_forgotten_text": "Se te esqueceste da tua chave de segurança, podes <button>configurar novas opções de recuperação</button>",
|
||||
"key_is_invalid": "Não é uma chave de segurança válida",
|
||||
"key_is_valid": "Isto parece ser uma chave de segurança válida!",
|
||||
"keys_restored_title": "Chaves restauradas",
|
||||
"load_error_content": "Não foi possível carregar o estado da cópia de segurança",
|
||||
"load_keys_progress": "%(completed)s de %(total)s chaves restauradas",
|
||||
"no_backup_error": "Nenhuma cópia de segurança encontrada!",
|
||||
"phrase_forgotten_text": "Se te esqueceste da tua Frase de Segurança, podes <button1>utilizar a tua Chave de Recuperação</button1> ou <button2>definir novas opções de recuperação</button2>",
|
||||
"recovery_key_mismatch_description": "Não foi possível desencriptar a cópia de segurança com esta chave de recuperação: verifica se introduziste a chave de recuperação correta.",
|
||||
"recovery_key_mismatch_title": "Chave de recuperação não coincide",
|
||||
"phrase_forgotten_text": "Se te esqueceste da tua Frase de Segurança, podes <button1>utilizar a tua Chave de Segurança</button1> ou <button2>definir novas opções de recuperação</button2>",
|
||||
"recovery_key_mismatch_description": "A cópia de segurança não pôde ser desencriptada com esta chave de segurança: verifica se introduziste a chave de segurança correcta.",
|
||||
"recovery_key_mismatch_title": "Incompatibilidade da chave de segurança",
|
||||
"restore_failed_error": "Não foi possível restaurar a cópia de segurança"
|
||||
},
|
||||
"right_panel": {
|
||||
"add_integrations": "Adiciona widgets, pontes e bots",
|
||||
"add_topic": "Adicionar descrição",
|
||||
"extensions_button": "Extensões",
|
||||
"extensions_empty_description": "Seleciona \"%(addIntegrations)s\" para procurar e adicionar extensões a esta sala",
|
||||
"extensions_empty_title": "Aumenta a produtividade com mais ferramentas, widgets e bots",
|
||||
"files_button": "Ficheiros",
|
||||
@@ -1839,18 +1733,9 @@
|
||||
"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 <link> mensagem do tópico</link>",
|
||||
"unpin_all": {
|
||||
"button": "Desafixa todas as mensagens",
|
||||
"content": "Certifica-te de que queres mesmo remover todas as mensagens fixadas. Esta ação não pode ser anulada.",
|
||||
"title": "Desfixar todas as mensagens?"
|
||||
},
|
||||
"view": "Ver na linha do tempo"
|
||||
"button": "Desafixa todas as mensagens"
|
||||
}
|
||||
},
|
||||
"pinned_messages_button": "Fixado",
|
||||
"poll": {
|
||||
@@ -1955,7 +1840,6 @@
|
||||
},
|
||||
"room_is_public": "Esta sala é pública"
|
||||
},
|
||||
"header_avatar_open_settings_label": "Abre as definições da sala",
|
||||
"header_face_pile_tooltip": "Alternar lista de membros",
|
||||
"header_untrusted_label": "Não confiável",
|
||||
"inaccessible": "De momento, esta sala ou espaço não está acessível.",
|
||||
@@ -1983,7 +1867,7 @@
|
||||
"invite_reject_ignore": "Rejeitar e ignorar o utilizador",
|
||||
"invite_sent_to_email": "Este convite foi enviado para %(email)s",
|
||||
"invite_sent_to_email_room": "Este convite para %(roomName)s foi enviado para %(email)s",
|
||||
"invite_subtitle": "Convidado por <userName/>",
|
||||
"invite_subtitle": "<userName/> convidou-o",
|
||||
"invite_this_room": "Convidar para esta sala",
|
||||
"invite_title": "Queres juntar-te a %(roomName)s?",
|
||||
"inviter_unknown": "Desconhecido",
|
||||
@@ -2026,14 +1910,6 @@
|
||||
"not_found_title": "Esta sala ou espaço não existe.",
|
||||
"not_found_title_name": "%(roomName)s não existe.",
|
||||
"peek_join_prompt": "Estás a visualizar %(roomName)s. Queres juntar-te a ele?",
|
||||
"pinned_message_badge": "Mensagem fixada",
|
||||
"pinned_message_banner": {
|
||||
"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": "<bold>%(index)s de %(length)s</bold> Mensagens fixadas"
|
||||
},
|
||||
"read_topic": "Clica para ler o tópico",
|
||||
"rejecting": "Rejeitando o convite...",
|
||||
"rejoin_button": "Junta-te novamente",
|
||||
@@ -2179,8 +2055,6 @@
|
||||
"error_deleting_alias_description": "Ocorreu um erro ao removeres esse endereço. Pode já não existir ou ocorreu um erro temporário.",
|
||||
"error_deleting_alias_description_forbidden": "Não tens autorização para apagar o endereço.",
|
||||
"error_deleting_alias_title": "Erro ao remover o endereço",
|
||||
"error_publishing": "Não é possível publicar a sala",
|
||||
"error_publishing_detail": "Houve um erro ao publicar este sala",
|
||||
"error_save_space_settings": "Não conseguiste guardar as definições de espaço.",
|
||||
"error_updating_alias_description": "Ocorreu um erro ao atualizar os endereços alternativos da sala. Pode não ser permitido pelo servidor ou ocorreu uma falha temporária.",
|
||||
"error_updating_canonical_alias_description": "Ocorreu um erro ao atualizar o endereço principal da sala. Pode não ser permitido pelo servidor ou ocorreu uma falha temporária.",
|
||||
@@ -2460,56 +2334,6 @@
|
||||
"emoji_autocomplete": "Permitir sugestões de Emoji durante a escrita",
|
||||
"enable_markdown": "Ativar Markdown",
|
||||
"enable_markdown_description": "Inicia as mensagens com <code>/plain</code> para enviar sem marcação.",
|
||||
"encryption": {
|
||||
"advanced": {
|
||||
"breadcrumb_first_description": "Os detalhes da sua conta, contactos, preferências e lista de conversação serão mantidos",
|
||||
"breadcrumb_page": "Repor a encriptação",
|
||||
"breadcrumb_second_description": "Perderás qualquer histórico de mensagens que esteja armazenado apenas no servidor",
|
||||
"breadcrumb_third_description": "Terá de verificar novamente todos os seus dispositivos e contactos existentes",
|
||||
"breadcrumb_title": "Tens a certeza de que queres redefinir a tua identidade?",
|
||||
"breadcrumb_title_forgot": "Esqueceu-se da sua chave de recuperação? Terá de repor a sua identidade.",
|
||||
"breadcrumb_warning": "Faz isto apenas se acreditares que a tua conta foi comprometida.",
|
||||
"details_title": "Detalhes da encriptação",
|
||||
"export_keys": "Exportar chaves",
|
||||
"import_keys": "Importar chaves",
|
||||
"other_people_device_description": "Por predefinição, nas salas encriptadas, não envies mensagens encriptadas a ninguém até as teres verificado",
|
||||
"other_people_device_label": "Nunca enviar mensagens encriptadas para dispositivos não verificados",
|
||||
"other_people_device_title": "Dispositivos de outras pessoas",
|
||||
"reset_identity": "Redefinir identidade criptográfica",
|
||||
"session_id": "ID da sessão:",
|
||||
"session_key": "Chave da sessão:",
|
||||
"title": "Avançadas"
|
||||
},
|
||||
"device_not_verified_button": "Verificar este dispositivo",
|
||||
"device_not_verified_description": "Você precisa verificar este dispositivo para visualizar suas configurações de criptografia.",
|
||||
"device_not_verified_title": "Dispositivo não verificado",
|
||||
"dialog_title": "<strong>Configurações:</strong> Encriptação",
|
||||
"recovery": {
|
||||
"change_recovery_confirm_button": "Confirmar nova chave de recuperação",
|
||||
"change_recovery_confirm_description": "Introduz a tua nova chave de recuperação abaixo para terminar. A tua chave antiga deixará de funcionar.",
|
||||
"change_recovery_confirm_title": "Introduz a tua nova chave de recuperação",
|
||||
"change_recovery_key": "Altera a chave de recuperação",
|
||||
"change_recovery_key_description": "Anota esta nova chave de recuperação num local seguro. Em seguida, clica em Continuar para confirmar a alteração.",
|
||||
"change_recovery_key_title": "Alterar a chave de recuperação?",
|
||||
"description": "Recupera a tua identidade criptográfica e o histórico de mensagens com uma chave de recuperação, caso tenhas perdido todos os teus dispositivos existentes.",
|
||||
"enter_key_error": "A chave de recuperação inserida não está correta.",
|
||||
"enter_recovery_key": "Insira a chave de recuperação",
|
||||
"forgot_recovery_key": "Esqueceu-se da chave de recuperação?",
|
||||
"key_storage_warning": "O teu armazenamento de chaves não está sincronizado. Clica num dos botões abaixo para resolveres o problema.",
|
||||
"save_key_description": "Não partilhes isto com ninguém!",
|
||||
"save_key_title": "Chave de recuperação",
|
||||
"set_up_recovery": "Configurar a recuperação",
|
||||
"set_up_recovery_confirm_button": "Concluir configuração",
|
||||
"set_up_recovery_confirm_description": "Digite a chave de recuperação mostrada na tela anterior para concluir a configuração da recuperação.",
|
||||
"set_up_recovery_confirm_title": "Introduza a sua chave de recuperação para confirmar",
|
||||
"set_up_recovery_description": "O armazenamento da sua chave está protegido por uma chave de recuperação. Se precisar de uma nova chave de recuperação após a configuração, pode recriá-la selecionando '%(changeRecoveryKeyButton)s'.",
|
||||
"set_up_recovery_save_key_description": "Anote essa chave de recuperação em algum lugar seguro, como um gerenciador de senhas, uma nota criptografada ou um cofre físico.",
|
||||
"set_up_recovery_save_key_title": "Guarda a tua chave de recuperação num local seguro",
|
||||
"set_up_recovery_secondary_description": "Depois de clicares em continuar, iremos gerar uma chave de recuperação para ti.",
|
||||
"title": "Recuperação"
|
||||
},
|
||||
"title": "Encriptação"
|
||||
},
|
||||
"general": {
|
||||
"account_management_section": "Gestão de conta",
|
||||
"account_section": "Conta",
|
||||
@@ -2545,7 +2369,7 @@
|
||||
"deactivate_confirm_erase_label": "Esconde as minhas mensagens dos novos aderentes",
|
||||
"deactivate_section": "Desativar conta",
|
||||
"deactivate_warning": "A desativação da tua conta é uma ação permanente - tem cuidado!",
|
||||
"discovery_email_empty": "As opções de descoberta serão apresentadas quando adicionares um e-mail.",
|
||||
"discovery_email_empty": "As opções de descoberta vão aparecer assim que adicione um e-mail acima.",
|
||||
"discovery_email_verification_instructions": "Verifica o link na tua caixa de entrada",
|
||||
"discovery_msisdn_empty": "As opções de descoberta aparecerão quando tiveres adicionado um número de telefone acima.",
|
||||
"discovery_needs_terms": "Concorda com os Termos de Serviço do servidor de identidade (%(serverName)s) para que possas ser descoberto através do teu endereço de e-mail ou número de telefone.",
|
||||
@@ -2617,21 +2441,21 @@
|
||||
"enter_phrase_description": "Introduz uma frase de segurança que só tu conheças, pois é utilizada para proteger os teus dados. Para estares seguro, não deves reutilizar a palavra-passe da tua conta.",
|
||||
"enter_phrase_title": "Introduzir uma frase de segurança",
|
||||
"enter_phrase_to_confirm": "Introduz a tua frase de segurança uma segunda vez para a confirmar.",
|
||||
"generate_security_key_description": "Iremos gerar uma chave de recuperação para guardares num local seguro, como um gestor de palavras-passe ou um cofre.",
|
||||
"generate_security_key_title": "Gerar uma chave de recuperação",
|
||||
"generate_security_key_description": "Iremos gerar uma chave de segurança para guardares num local seguro, como um gestor de palavras-passe ou um cofre.",
|
||||
"generate_security_key_title": "Gera uma chave de segurança",
|
||||
"pass_phrase_match_failed": "Isso não combina.",
|
||||
"pass_phrase_match_success": "Isso combina!",
|
||||
"phrase_strong_enough": "Ótimo! Esta frase de segurança parece suficientemente forte.",
|
||||
"secret_storage_query_failure": "Não é possível consultar o estado do armazenamento secreto",
|
||||
"security_key_safety_reminder": "Guarda a tua chave de recuperação num local seguro, como um gestor de palavras-passe ou um cofre, uma vez que é utilizada para proteger os teus dados encriptados.",
|
||||
"security_key_safety_reminder": "Guarda a tua chave de segurança num local seguro, como um gestor de palavras-passe ou um cofre, uma vez que é utilizada para proteger os teus dados encriptados.",
|
||||
"set_phrase_again": "Volta atrás para o definir novamente.",
|
||||
"settings_reminder": "Também podes configurar a Cópia de segurança segura e gerir as tuas chaves nas Definições.",
|
||||
"title_confirm_phrase": "Confirma a frase de segurança",
|
||||
"title_save_key": "Guarda a tua chave de recuperação",
|
||||
"title_save_key": "Guarda a tua chave de segurança",
|
||||
"title_set_phrase": "Define uma frase de segurança",
|
||||
"unable_to_setup": "Não é possível configurar o armazenamento secreto",
|
||||
"use_different_passphrase": "Utiliza uma frase-chave diferente?",
|
||||
"use_phrase_only_you_know": "Utiliza uma frase secreta que só tu sabes e, opcionalmente, guarda uma chave de recuperação para utilizar como cópia de segurança."
|
||||
"use_phrase_only_you_know": "Utiliza uma frase secreta que só tu sabes e, opcionalmente, guarda uma chave de segurança para utilizar como cópia de segurança."
|
||||
}
|
||||
},
|
||||
"key_export_import": {
|
||||
@@ -2721,7 +2545,6 @@
|
||||
"code_blocks_heading": "Blocos de código",
|
||||
"compact_modern": "Utiliza um layout \"moderno\" mais compacto",
|
||||
"composer_heading": "Compositor",
|
||||
"default_timezone": "Predefinição do browser (%(timezone)s)",
|
||||
"dialog_title": "<strong>Definições:</strong> Preferências",
|
||||
"enable_hardware_acceleration": "Ativar a aceleração de hardware",
|
||||
"enable_tray_icon": "Mostra o ícone do tabuleiro e minimiza a janela ao fechar",
|
||||
@@ -2729,7 +2552,6 @@
|
||||
"keyboard_view_shortcuts_button": "Para ver todos os atalhos de teclado, <a>clica aqui</a>.",
|
||||
"media_heading": "Imagens, GIFs e vídeos",
|
||||
"presence_description": "Partilha a tua atividade e o teu estado com outros.",
|
||||
"publish_timezone": "Publica o fuso horário no perfil público",
|
||||
"rm_lifetime": "Vida útil do marcador de leitura (ms)",
|
||||
"rm_lifetime_offscreen": "Vida útil do marcador de leitura fora do ecrã (ms)",
|
||||
"room_directory_heading": "Diretório de salas",
|
||||
@@ -2737,8 +2559,7 @@
|
||||
"show_avatars_pills": "Mostra os avatares nas menções de utilizadores, salas e eventos",
|
||||
"show_polls_button": "Mostrar botão de sondagens",
|
||||
"surround_text": "Rodeia o texto selecionado ao escrever caracteres especiais",
|
||||
"time_heading": "Mostra a hora",
|
||||
"user_timezone": "Define o fuso horário"
|
||||
"time_heading": "Mostra a hora"
|
||||
},
|
||||
"prompt_invite": "Avisa antes de enviar convites para IDs de matrix potencialmente inválidos",
|
||||
"replace_plain_emoji": "Substituir Emoji de texto automaticamente",
|
||||
@@ -2750,7 +2571,7 @@
|
||||
"backup_key_stored_status": "Chave de backup armazenada:",
|
||||
"backup_key_unexpected_type": "tipo inesperado",
|
||||
"backup_key_well_formed": "bem formado",
|
||||
"backup_keys_description": "Faça backup de suas chaves de criptografia com os dados da sua conta para o caso de perder o acesso às suas sessões. As suas chaves serão protegidas com uma chave de recuperação exclusiva.",
|
||||
"backup_keys_description": "Faz uma cópia de segurança das tuas chaves de encriptação com os dados da tua conta para o caso de perderes o acesso às tuas sessões. As tuas chaves serão protegidas com uma chave de segurança única.",
|
||||
"bulk_options_accept_all_invites": "Aceita todos os convites de %(invitedRooms)s ",
|
||||
"bulk_options_reject_all_invites": "Rejeitar todos os %(invitedRooms)s convites",
|
||||
"bulk_options_section": "Opções em massa",
|
||||
@@ -2868,7 +2689,6 @@
|
||||
"inactive_sessions_list_description": "Considera a possibilidade de sair de sessões antigas (%(inactiveAgeDays)s dias ou mais) que já não utilizas.",
|
||||
"ip": "Endereço IP",
|
||||
"last_activity": "Última atividade",
|
||||
"manage": "Gerir esta sessão",
|
||||
"mobile_session": "Sessão móvel",
|
||||
"n_sessions_selected": {
|
||||
"one": "%(count)s sessão selecionada",
|
||||
@@ -2895,7 +2715,6 @@
|
||||
"sign_in_with_qr": "Ligar novo dispositivo",
|
||||
"sign_in_with_qr_button": "Mostrar código QR",
|
||||
"sign_in_with_qr_description": "Utiliza um código QR para iniciar sessão noutro dispositivo e configurar as mensagens seguras.",
|
||||
"sign_in_with_qr_unsupported": "Não suportado pelo teu fornecedor de conta",
|
||||
"sign_out": "Sair desta sessão",
|
||||
"sign_out_all_other_sessions": "Sair de todas as outras sessões (%(otherSessionsCount)s)",
|
||||
"sign_out_confirm_description": {
|
||||
@@ -2986,7 +2805,6 @@
|
||||
"warning": "<w>AVISO:</w><description/>"
|
||||
},
|
||||
"share": {
|
||||
"link_copied": "Link copiado",
|
||||
"permalink_message": "Link para a mensagem selecionada",
|
||||
"permalink_most_recent": "Link para a mensagem mais recente",
|
||||
"share_call": "Link de convite para conferência",
|
||||
@@ -3294,8 +3112,6 @@
|
||||
"historical_event_no_key_backup": "As mensagens históricas não estão disponíveis neste dispositivo",
|
||||
"historical_event_unverified_device": "Tens de verificar este dispositivo para acederes às mensagens históricas",
|
||||
"historical_event_user_not_joined": "Não tens acesso a esta mensagem",
|
||||
"sender_identity_previously_verified": "A identidade verificada do remetente foi alterada",
|
||||
"sender_unsigned_device": "Enviado de um dispositivo inseguro.",
|
||||
"unable_to_decrypt": "Não é possível desencriptar a mensagem"
|
||||
},
|
||||
"disambiguated_profile": "%(displayName)s (%(matrixId)s)",
|
||||
@@ -3303,7 +3119,6 @@
|
||||
"download_action_downloading": "A transferir…",
|
||||
"download_failed": "A transferência falhou",
|
||||
"download_failed_description": "Ocorreu um erro ao transferir este ficheiro",
|
||||
"e2e_state": "Estado da encriptação de ponta a ponta",
|
||||
"edits": {
|
||||
"tooltip_label": "Editado em %(date)s. Clica para ver as edições.",
|
||||
"tooltip_sub": "Clica para ver as edições",
|
||||
@@ -3357,7 +3172,7 @@
|
||||
},
|
||||
"m.file": {
|
||||
"error_decrypting": "Erro ao descriptografar o anexo",
|
||||
"error_invalid": "Ficheiro inválido"
|
||||
"error_invalid": "Arquivo inválido %(extra)s"
|
||||
},
|
||||
"m.image": {
|
||||
"error": "Não é possível mostrar a imagem devido a um erro",
|
||||
@@ -3494,8 +3309,7 @@
|
||||
},
|
||||
"m.room.tombstone": "%(senderDisplayName)s atualizou a sala.",
|
||||
"m.room.topic": {
|
||||
"changed": "%(senderDisplayName)s mudou o tópico para \"%(topic)s\".",
|
||||
"removed": "%(senderDisplayName)s removeu o tópico."
|
||||
"changed": "%(senderDisplayName)s mudou o tópico para \"%(topic)s\"."
|
||||
},
|
||||
"m.sticker": "%(senderDisplayName)s enviou um sticker.",
|
||||
"m.video": {
|
||||
@@ -3770,7 +3584,6 @@
|
||||
"error_files_too_large": "Estes ficheiros são <b>demasiado grandes</b> para serem carregados. O limite de tamanho do ficheiro é %(limit)s.",
|
||||
"error_some_files_too_large": "Alguns ficheiros são <b>demasiado grandes</b> para serem carregados. O limite de tamanho dos ficheiros é %(limit)s.",
|
||||
"error_title": "Erro de carregamento",
|
||||
"not_image": "O ficheiro que escolheu não é um ficheiro de imagem válido.",
|
||||
"title": "Carregar ficheiros",
|
||||
"title_progress": "Carrega ficheiros (%(current)s de %(total)s)",
|
||||
"upload_all_button": "Carregar tudo",
|
||||
@@ -3845,7 +3658,6 @@
|
||||
"unban_space_specific": "Desbani-los de coisas específicas que estou autorizado",
|
||||
"unban_space_warning": "Não poderão aceder a nada que não seja administrado por ti.",
|
||||
"unignore_button": "Designorar",
|
||||
"verification_unavailable": "Verificação do usuário indisponível",
|
||||
"verify_button": "Verificar utilizador",
|
||||
"verify_explainer": "Para maior segurança, verifica este utilizador através de um código de utilização única em ambos os dispositivos."
|
||||
},
|
||||
@@ -3957,8 +3769,6 @@
|
||||
"voice_call": "Chamada de voz",
|
||||
"you_are_presenting": "Estás a apresentar"
|
||||
},
|
||||
"web_default_device_name": "%(appName)s: %(browserName)s em %(osName)s",
|
||||
"welcome_to_element": "Bem-vindo ao Element",
|
||||
"widget": {
|
||||
"added_by": "Widget adicionado por",
|
||||
"capabilities_dialog": {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -905,6 +905,10 @@ export const SETTINGS: Settings = {
|
||||
supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS,
|
||||
default: false,
|
||||
displayName: _td("settings|appearance|custom_font"),
|
||||
description: () =>
|
||||
_t("settings|appearance|custom_font_description", {
|
||||
brand: SdkConfig.get().brand,
|
||||
}),
|
||||
controller: new SystemFontController(),
|
||||
},
|
||||
"systemFont": {
|
||||
|
||||
@@ -20,7 +20,7 @@ import { type Device, type SecretStorage } from "matrix-js-sdk/src/matrix";
|
||||
import { MatrixClientPeg } from "../MatrixClientPeg";
|
||||
import { AccessCancelledError, accessSecretStorage } from "../SecurityManager";
|
||||
import { asyncSome } from "../utils/arrays";
|
||||
import { initialiseDehydrationIfEnabled } from "../utils/device/dehydration";
|
||||
import { initialiseDehydration } from "../utils/device/dehydration";
|
||||
|
||||
export enum Phase {
|
||||
Loading = 0,
|
||||
@@ -149,7 +149,7 @@ export class SetupEncryptionStore extends EventEmitter {
|
||||
);
|
||||
resolve();
|
||||
|
||||
await initialiseDehydrationIfEnabled(cli);
|
||||
await initialiseDehydration();
|
||||
|
||||
if (backupInfo) {
|
||||
await cli.getCrypto()?.loadSessionBackupPrivateKeyFromSecretStorage();
|
||||
|
||||
@@ -8,14 +8,11 @@ Please see LICENSE files in the repository root for full details.
|
||||
|
||||
import React, { type ReactNode } from "react";
|
||||
import { MatrixError, ConnectionError } from "matrix-js-sdk/src/matrix";
|
||||
import { logger } from "matrix-js-sdk/src/logger";
|
||||
|
||||
import { _t, _td, lookupString, type Tags, type TranslatedString, type TranslationKey } from "../languageHandler";
|
||||
import SdkConfig from "../SdkConfig";
|
||||
import { type ValidatedServerConfig } from "./ValidatedServerConfig";
|
||||
import ExternalLink from "../components/views/elements/ExternalLink";
|
||||
import Modal from "../Modal.tsx";
|
||||
import ErrorDialog from "../components/views/dialogs/ErrorDialog.tsx";
|
||||
|
||||
export const resourceLimitStrings = {
|
||||
"monthly_active_user": _td("error|mau"),
|
||||
@@ -194,27 +191,3 @@ export function messageForConnectionError(
|
||||
|
||||
return errorText;
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility for handling unexpected errors: pops up the error dialog.
|
||||
*
|
||||
* Example usage:
|
||||
* ```
|
||||
* try {
|
||||
* /// complicated operation
|
||||
* } catch (e) {
|
||||
* logErrorAndShowErrorDialog("Failed complicated operation", e);
|
||||
* }
|
||||
* ```
|
||||
*
|
||||
* This isn't particularly intended to be pretty; rather it lets the user know that *something* has gone wrong so that
|
||||
* they can report a bug. The general idea is that it's better to let the user know of a failure, even if they
|
||||
* can't do anything about it, than it is to fail silently with the appearance of success.
|
||||
*
|
||||
* @param title - Title for the error dialog.
|
||||
* @param error - The thrown error. Becomes the content of the error dialog.
|
||||
*/
|
||||
export function logErrorAndShowErrorDialog(title: string, error: any): void {
|
||||
logger.error(`${title}:`, error);
|
||||
Modal.createDialog(ErrorDialog, { title, description: `${error}` });
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import { logger } from "matrix-js-sdk/src/logger";
|
||||
import { type CryptoApi, type StartDehydrationOpts } from "matrix-js-sdk/src/crypto-api";
|
||||
|
||||
import type { MatrixClient } from "matrix-js-sdk/src/matrix";
|
||||
import { MatrixClientPeg } from "../../MatrixClientPeg";
|
||||
|
||||
/**
|
||||
* Check if device dehydration is enabled.
|
||||
@@ -37,13 +38,11 @@ async function deviceDehydrationEnabled(client: MatrixClient, crypto: CryptoApi
|
||||
* the configuration), rehydrate a device (if available) and create
|
||||
* a new dehydrated device.
|
||||
*
|
||||
* @param client - MatrixClient to use for the operation
|
||||
* @param opts - options for the startDehydration operation, if one is performed.
|
||||
* @param createNewKey: force a new dehydration key to be created, even if one
|
||||
* already exists. This is used when we reset secret storage.
|
||||
*/
|
||||
export async function initialiseDehydrationIfEnabled(
|
||||
client: MatrixClient,
|
||||
opts: StartDehydrationOpts = {},
|
||||
): Promise<void> {
|
||||
export async function initialiseDehydration(opts: StartDehydrationOpts = {}, client?: MatrixClient): Promise<void> {
|
||||
client = client || MatrixClientPeg.safeGet();
|
||||
const crypto = client.getCrypto();
|
||||
if (await deviceDehydrationEnabled(client, crypto)) {
|
||||
logger.log("Device dehydration enabled");
|
||||
|
||||
@@ -519,49 +519,6 @@ describe("TextForEvent", () => {
|
||||
),
|
||||
).toMatchInlineSnapshot(`"Andy changed their display name and profile picture"`);
|
||||
});
|
||||
|
||||
it("should handle rejected invites", () => {
|
||||
expect(
|
||||
textForEvent(
|
||||
new MatrixEvent({
|
||||
type: "m.room.member",
|
||||
sender: "@a:foo",
|
||||
content: {
|
||||
membership: KnownMembership.Leave,
|
||||
},
|
||||
unsigned: {
|
||||
prev_content: {
|
||||
membership: KnownMembership.Invite,
|
||||
},
|
||||
},
|
||||
state_key: "@a:foo",
|
||||
}),
|
||||
mockClient,
|
||||
),
|
||||
).toMatchInlineSnapshot(`"Member rejected the invitation"`);
|
||||
});
|
||||
|
||||
it("should handle rejected invites with a reason", () => {
|
||||
expect(
|
||||
textForEvent(
|
||||
new MatrixEvent({
|
||||
type: "m.room.member",
|
||||
sender: "@a:foo",
|
||||
content: {
|
||||
membership: KnownMembership.Leave,
|
||||
reason: "I don't want to be in this room.",
|
||||
},
|
||||
unsigned: {
|
||||
prev_content: {
|
||||
membership: KnownMembership.Invite,
|
||||
},
|
||||
},
|
||||
state_key: "@a:foo",
|
||||
}),
|
||||
mockClient,
|
||||
),
|
||||
).toMatchInlineSnapshot(`"Member rejected the invitation: I don't want to be in this room."`);
|
||||
});
|
||||
});
|
||||
|
||||
describe("textForJoinRulesEvent()", () => {
|
||||
|
||||
@@ -31,6 +31,7 @@ describe("<EmailIdentityAuthEntry/>", () => {
|
||||
submitAuthDict={jest.fn()}
|
||||
fail={jest.fn()}
|
||||
clientSecret="my secret"
|
||||
showContinue={true}
|
||||
inputs={{ emailAddress: "alice@example.xyz" }}
|
||||
/>,
|
||||
);
|
||||
@@ -72,6 +73,7 @@ describe("<MasUnlockCrossSigningAuthEntry/>", () => {
|
||||
submitAuthDict={jest.fn()}
|
||||
fail={jest.fn()}
|
||||
clientSecret="my secret"
|
||||
showContinue={true}
|
||||
stageParams={{ url: "https://example.com" }}
|
||||
{...props}
|
||||
/>,
|
||||
@@ -112,6 +114,7 @@ describe("<TermsAuthEntry/>", () => {
|
||||
submitAuthDict={jest.fn()}
|
||||
fail={jest.fn()}
|
||||
clientSecret="my secret"
|
||||
showContinue={true}
|
||||
stageParams={{
|
||||
policies: {
|
||||
test_policy: policy,
|
||||
|
||||
@@ -9,7 +9,6 @@ import React from "react";
|
||||
import { render, screen, waitFor } from "jest-matrix-react";
|
||||
import { type MatrixClient } from "matrix-js-sdk/src/matrix";
|
||||
import userEvent from "@testing-library/user-event";
|
||||
import { mocked } from "jest-mock";
|
||||
|
||||
import { ChangeRecoveryKey } from "../../../../../../src/components/views/settings/encryption/ChangeRecoveryKey";
|
||||
import { createTestClient, withClientContextRenderOptions } from "../../../../../test-utils";
|
||||
@@ -19,10 +18,6 @@ jest.mock("../../../../../../src/utils/strings", () => ({
|
||||
copyPlaintext: jest.fn(),
|
||||
}));
|
||||
|
||||
afterEach(() => {
|
||||
jest.restoreAllMocks();
|
||||
});
|
||||
|
||||
describe("<ChangeRecoveryKey />", () => {
|
||||
let matrixClient: MatrixClient;
|
||||
|
||||
@@ -41,7 +36,7 @@ describe("<ChangeRecoveryKey />", () => {
|
||||
);
|
||||
}
|
||||
|
||||
describe("flow to set up a recovery key", () => {
|
||||
describe("flow to setup a recovery key", () => {
|
||||
it("should display information about the recovery key", async () => {
|
||||
const user = userEvent.setup();
|
||||
|
||||
@@ -112,33 +107,6 @@ describe("<ChangeRecoveryKey />", () => {
|
||||
await user.click(finishButton);
|
||||
expect(onFinish).toHaveBeenCalledWith();
|
||||
});
|
||||
|
||||
it("should display errors from bootstrapSecretStorage", async () => {
|
||||
const consoleErrorSpy = jest.spyOn(console, "error").mockReturnValue(undefined);
|
||||
mocked(matrixClient.getCrypto()!).bootstrapSecretStorage.mockRejectedValue(new Error("can't bootstrap"));
|
||||
|
||||
const user = userEvent.setup();
|
||||
renderComponent(false);
|
||||
|
||||
// Display the recovery key to save
|
||||
await waitFor(() => user.click(screen.getByRole("button", { name: "Continue" })));
|
||||
// Display the form to confirm the recovery key
|
||||
await waitFor(() => user.click(screen.getByRole("button", { name: "Continue" })));
|
||||
|
||||
await waitFor(() => expect(screen.getByText("Enter your recovery key to confirm")).toBeInTheDocument());
|
||||
|
||||
const finishButton = screen.getByRole("button", { name: "Finish set up" });
|
||||
const input = screen.getByRole("textbox");
|
||||
await userEvent.type(input, "encoded private key");
|
||||
await user.click(finishButton);
|
||||
|
||||
await screen.findByText("Failed to set up secret storage");
|
||||
await screen.findByText("Error: can't bootstrap");
|
||||
expect(consoleErrorSpy).toHaveBeenCalledWith(
|
||||
"Failed to set up secret storage:",
|
||||
new Error("can't bootstrap"),
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe("flow to change the recovery key", () => {
|
||||
|
||||
@@ -135,7 +135,7 @@ exports[`<ChangeRecoveryKey /> flow to change the recovery key should display th
|
||||
</button>
|
||||
</div>
|
||||
<div
|
||||
class="mx_EncryptionCard_buttons"
|
||||
class="mx_ChangeRecoveryKey_footer"
|
||||
>
|
||||
<button
|
||||
class="_button_i91xf_17"
|
||||
@@ -160,7 +160,7 @@ exports[`<ChangeRecoveryKey /> flow to change the recovery key should display th
|
||||
</DocumentFragment>
|
||||
`;
|
||||
|
||||
exports[`<ChangeRecoveryKey /> flow to set up a recovery key should ask the user to enter the recovery key 1`] = `
|
||||
exports[`<ChangeRecoveryKey /> flow to setup a recovery key should ask the user to enter the recovery key 1`] = `
|
||||
<DocumentFragment>
|
||||
<nav
|
||||
class="_breadcrumb_ikpbb_17"
|
||||
@@ -266,7 +266,7 @@ exports[`<ChangeRecoveryKey /> flow to set up a recovery key should ask the user
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
class="mx_EncryptionCard_buttons"
|
||||
class="mx_ChangeRecoveryKey_footer"
|
||||
>
|
||||
<button
|
||||
aria-disabled="true"
|
||||
@@ -293,7 +293,7 @@ exports[`<ChangeRecoveryKey /> flow to set up a recovery key should ask the user
|
||||
</DocumentFragment>
|
||||
`;
|
||||
|
||||
exports[`<ChangeRecoveryKey /> flow to set up a recovery key should ask the user to enter the recovery key 2`] = `
|
||||
exports[`<ChangeRecoveryKey /> flow to setup a recovery key should ask the user to enter the recovery key 2`] = `
|
||||
<DocumentFragment>
|
||||
<nav
|
||||
class="_breadcrumb_ikpbb_17"
|
||||
@@ -421,7 +421,7 @@ exports[`<ChangeRecoveryKey /> flow to set up a recovery key should ask the user
|
||||
</span>
|
||||
</div>
|
||||
<div
|
||||
class="mx_EncryptionCard_buttons"
|
||||
class="mx_ChangeRecoveryKey_footer"
|
||||
>
|
||||
<button
|
||||
aria-disabled="true"
|
||||
@@ -448,7 +448,7 @@ exports[`<ChangeRecoveryKey /> flow to set up a recovery key should ask the user
|
||||
</DocumentFragment>
|
||||
`;
|
||||
|
||||
exports[`<ChangeRecoveryKey /> flow to set up a recovery key should display information about the recovery key 1`] = `
|
||||
exports[`<ChangeRecoveryKey /> flow to setup a recovery key should display information about the recovery key 1`] = `
|
||||
<DocumentFragment>
|
||||
<nav
|
||||
class="_breadcrumb_ikpbb_17"
|
||||
@@ -539,7 +539,7 @@ exports[`<ChangeRecoveryKey /> flow to set up a recovery key should display info
|
||||
After clicking continue, we’ll generate a recovery key for you.
|
||||
</span>
|
||||
<div
|
||||
class="mx_EncryptionCard_buttons"
|
||||
class="mx_ChangeRecoveryKey_footer"
|
||||
>
|
||||
<button
|
||||
class="_button_i91xf_17"
|
||||
@@ -564,7 +564,7 @@ exports[`<ChangeRecoveryKey /> flow to set up a recovery key should display info
|
||||
</DocumentFragment>
|
||||
`;
|
||||
|
||||
exports[`<ChangeRecoveryKey /> flow to set up a recovery key should display the recovery key 1`] = `
|
||||
exports[`<ChangeRecoveryKey /> flow to setup a recovery key should display the recovery key 1`] = `
|
||||
<DocumentFragment>
|
||||
<nav
|
||||
class="_breadcrumb_ikpbb_17"
|
||||
@@ -699,7 +699,7 @@ exports[`<ChangeRecoveryKey /> flow to set up a recovery key should display the
|
||||
</button>
|
||||
</div>
|
||||
<div
|
||||
class="mx_EncryptionCard_buttons"
|
||||
class="mx_ChangeRecoveryKey_footer"
|
||||
>
|
||||
<button
|
||||
class="_button_i91xf_17"
|
||||
|
||||
@@ -155,7 +155,7 @@ exports[`<ResetIdentityPanel /> should display the 'forgot recovery key' variant
|
||||
</ul>
|
||||
</div>
|
||||
<div
|
||||
class="mx_EncryptionCard_buttons"
|
||||
class="mx_ResetIdentityPanel_footer"
|
||||
>
|
||||
<button
|
||||
class="_button_i91xf_17 _destructive_i91xf_116"
|
||||
@@ -338,7 +338,7 @@ exports[`<ResetIdentityPanel /> should reset the encryption when the continue bu
|
||||
</span>
|
||||
</div>
|
||||
<div
|
||||
class="mx_EncryptionCard_buttons"
|
||||
class="mx_ResetIdentityPanel_footer"
|
||||
>
|
||||
<button
|
||||
class="_button_i91xf_17 _destructive_i91xf_116"
|
||||
|
||||
@@ -329,7 +329,7 @@ exports[`<EncryptionUserSettingsTab /> should display the reset identity panel w
|
||||
</span>
|
||||
</div>
|
||||
<div
|
||||
class="mx_EncryptionCard_buttons"
|
||||
class="mx_ResetIdentityPanel_footer"
|
||||
>
|
||||
<button
|
||||
class="_button_i91xf_17 _destructive_i91xf_116"
|
||||
|
||||
@@ -8723,10 +8723,9 @@ matrix-events-sdk@0.0.1:
|
||||
resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd"
|
||||
integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==
|
||||
|
||||
matrix-js-sdk@37.0.0-rc.0:
|
||||
version "37.0.0-rc.0"
|
||||
resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-37.0.0-rc.0.tgz#d6a87bda024d2ec9ee782e7d825da1e8e31fc00f"
|
||||
integrity sha512-KcshXXWRIrXx6E7vsm+BvBgcJc8STEgbOcMTu9ZneITDwHrjP13qObdEUXUZv3x8tYxKSWj821aMr+nOH3jL+A==
|
||||
"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop":
|
||||
version "36.2.0"
|
||||
resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/b584f818f51c899cc81bc83bf1499a2ed374c6c7"
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.12.5"
|
||||
"@matrix-org/matrix-sdk-crypto-wasm" "^13.0.0"
|
||||
|
||||
Reference in New Issue
Block a user