+ ) : null }
+
+ { spaces.length + rooms.length + dms.length < 1 ?
{ _t("No results") }
: undefined }
diff --git a/src/components/views/dialogs/InviteDialog.tsx b/src/components/views/dialogs/InviteDialog.tsx
index a274f96a17..2ebc84ec7c 100644
--- a/src/components/views/dialogs/InviteDialog.tsx
+++ b/src/components/views/dialogs/InviteDialog.tsx
@@ -31,6 +31,7 @@ import Modal from "../../../Modal";
import {humanizeTime} from "../../../utils/humanize";
import createRoom, {
canEncryptToAllUsers, ensureDMExists, findDMForUser, privateShouldBeEncrypted,
+ IInvite3PID,
} from "../../../createRoom";
import {inviteMultipleToRoom, showCommunityInviteDialog} from "../../../RoomInvite";
import {Key} from "../../../Keyboard";
@@ -618,13 +619,14 @@ export default class InviteDialog extends React.PureComponent {
this.setState({busy: true});
+ const client = MatrixClientPeg.get();
const targets = this._convertFilter();
const targetIds = targets.map(t => t.userId);
// Check if there is already a DM with these people and reuse it if possible.
let existingRoom: Room;
if (targetIds.length === 1) {
- existingRoom = findDMForUser(MatrixClientPeg.get(), targetIds[0]);
+ existingRoom = findDMForUser(client, targetIds[0]);
} else {
existingRoom = DMRoomMap.shared().getDMRoomForIdentifiers(targetIds);
}
@@ -646,7 +648,6 @@ export default class InviteDialog extends React.PureComponent t instanceof ThreepidMember);
if (!has3PidMembers) {
- const client = MatrixClientPeg.get();
const allHaveDeviceKeys = await canEncryptToAllUsers(client, targetIds);
if (allHaveDeviceKeys) {
createRoomOptions.encryption = true;
@@ -656,35 +657,41 @@ export default class InviteDialog extends React.PureComponent;
- const isSelf = targetIds.length === 1 && targetIds[0] === MatrixClientPeg.get().getUserId();
- if (targetIds.length === 1 && !isSelf) {
- createRoomOptions.dmUserId = targetIds[0];
- createRoomPromise = createRoom(createRoomOptions);
- } else if (isSelf) {
- createRoomPromise = createRoom(createRoomOptions);
- } else {
- // Create a boring room and try to invite the targets manually.
- createRoomPromise = createRoom(createRoomOptions).then(roomId => {
- return inviteMultipleToRoom(roomId, targetIds);
- }).then(result => {
- if (this._shouldAbortAfterInviteError(result)) {
- return true; // abort
- }
- });
- }
+ try {
+ const isSelf = targetIds.length === 1 && targetIds[0] === client.getUserId();
+ if (targetIds.length === 1 && !isSelf) {
+ createRoomOptions.dmUserId = targetIds[0];
+ }
- // the createRoom call will show the room for us, so we don't need to worry about that.
- createRoomPromise.then(abort => {
- if (abort === true) return; // only abort on true booleans, not roomIds or something
+ if (targetIds.length > 1) {
+ createRoomOptions.createOpts = targetIds.reduce(
+ (roomOptions, address) => {
+ const type = getAddressType(address);
+ if (type === 'email') {
+ const invite: IInvite3PID = {
+ id_server: client.getIdentityServerUrl(true),
+ medium: 'email',
+ address,
+ };
+ roomOptions.invite_3pid.push(invite);
+ } else if (type === 'mx-user-id') {
+ roomOptions.invite.push(address);
+ }
+ return roomOptions;
+ },
+ { invite: [], invite_3pid: [] },
+ )
+ }
+
+ await createRoom(createRoomOptions);
this.props.onFinished();
- }).catch(err => {
+ } catch (err) {
console.error(err);
this.setState({
busy: false,
errorText: _t("We couldn't create your DM."),
});
- });
+ }
};
_inviteUsers = async () => {
@@ -712,8 +719,7 @@ export default class InviteDialog extends React.PureComponent
{_t("You most likely do not want to reset your event index store")}
{_t("If you do, please note that none of your messages will be deleted, " +
- "but the search experience might be degraded for a few moments" +
+ "but the search experience might be degraded for a few moments " +
"whilst the index is recreated",
)}
diff --git a/src/components/views/dialogs/security/AccessSecretStorageDialog.tsx b/src/components/views/dialogs/security/AccessSecretStorageDialog.tsx
index 3c09470b39..ffe513581b 100644
--- a/src/components/views/dialogs/security/AccessSecretStorageDialog.tsx
+++ b/src/components/views/dialogs/security/AccessSecretStorageDialog.tsx
@@ -25,6 +25,8 @@ import Field from '../../elements/Field';
import AccessibleButton from '../../elements/AccessibleButton';
import {_t} from '../../../../languageHandler';
import {IDialogProps} from "../IDialogProps";
+import {accessSecretStorage} from "../../../../SecurityManager";
+import Modal from "../../../../Modal";
// Maximum acceptable size of a key file. It's 59 characters including the spaces we encode,
// so this should be plenty and allow for people putting extra whitespace in the file because
@@ -47,6 +49,7 @@ interface IState {
forceRecoveryKey: boolean;
passPhrase: string;
keyMatches: boolean | null;
+ resetting: boolean;
}
/*
@@ -66,10 +69,14 @@ export default class AccessSecretStorageDialog extends React.PureComponent {
+ if (this.state.resetting) {
+ this.setState({resetting: false});
+ }
this.props.onFinished(false);
};
@@ -201,6 +208,55 @@ export default class AccessSecretStorageDialog extends React.PureComponent) => {
+ ev.preventDefault();
+ this.setState({resetting: true});
+ };
+
+ private onConfirmResetAllClick = async () => {
+ // Hide ourselves so the user can interact with the reset dialogs.
+ // We don't conclude the promise chain (onFinished) yet to avoid confusing
+ // any upstream code flows.
+ //
+ // Note: this will unmount us, so don't call `setState` or anything in the
+ // rest of this function.
+ Modal.toggleCurrentDialogVisibility();
+
+ try {
+ // Force reset secret storage (which resets the key backup)
+ await accessSecretStorage(async () => {
+ // Now reset cross-signing so everything Just Works™ again.
+ const cli = MatrixClientPeg.get();
+ await cli.bootstrapCrossSigning({
+ authUploadDeviceSigningKeys: async (makeRequest) => {
+ // XXX: Making this an import breaks the app.
+ const InteractiveAuthDialog = sdk.getComponent("views.dialogs.InteractiveAuthDialog");
+ const {finished} = Modal.createTrackedDialog(
+ 'Cross-signing keys dialog', '', InteractiveAuthDialog,
+ {
+ title: _t("Setting up keys"),
+ matrixClient: cli,
+ makeRequest,
+ },
+ );
+ const [confirmed] = await finished;
+ if (!confirmed) {
+ throw new Error("Cross-signing key upload auth canceled");
+ }
+ },
+ setupNewCrossSigning: true,
+ });
+
+ // Now we can indicate that the user is done pressing buttons, finally.
+ // Upstream flows will detect the new secret storage, key backup, etc and use it.
+ this.props.onFinished(true);
+ }, true);
+ } catch (e) {
+ console.error(e);
+ this.props.onFinished(false);
+ }
+ };
+
private getKeyValidationText(): string {
if (this.state.recoveryKeyFileError) {
return _t("Wrong file type");
@@ -216,8 +272,9 @@ export default class AccessSecretStorageDialog extends React.PureComponent
+ {_t("Forgotten or lost all recovery methods? Reset all", null, {
+ a: (sub) => {sub},
+ })}
+
+ );
+
let content;
let title;
let titleClass;
- if (hasPassphrase && !this.state.forceRecoveryKey) {
- const DialogButtons = sdk.getComponent('views.elements.DialogButtons');
+ if (this.state.resetting) {
+ title = _t("Reset everything");
+ titleClass = ['mx_AccessSecretStorageDialog_titleWithIcon mx_AccessSecretStorageDialog_resetBadge'];
+ content =
+
{_t("Only do this if you have no other device to complete verification with.")}
+
{_t("If you reset everything, you will restart with no trusted sessions, no trusted users, and "
+ + "might not be able to see past messages.")}
+
+
;
+ } else if (hasPassphrase && !this.state.forceRecoveryKey) {
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
title = _t("Security Phrase");
titleClass = ['mx_AccessSecretStorageDialog_titleWithIcon mx_AccessSecretStorageDialog_securePhraseTitle'];
@@ -278,13 +360,13 @@ export default class AccessSecretStorageDialog extends React.PureComponent
;
} else {
title = _t("Security Key");
titleClass = ['mx_AccessSecretStorageDialog_titleWithIcon mx_AccessSecretStorageDialog_secureBackupTitle'];
- const DialogButtons = sdk.getComponent('views.elements.DialogButtons');
const feedbackClasses = classNames({
'mx_AccessSecretStorageDialog_recoveryKeyFeedback': true,
@@ -339,6 +421,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent
;
diff --git a/src/components/views/elements/EventTilePreview.tsx b/src/components/views/elements/EventTilePreview.tsx
index 077c116873..b15fbbed2b 100644
--- a/src/components/views/elements/EventTilePreview.tsx
+++ b/src/components/views/elements/EventTilePreview.tsx
@@ -55,22 +55,10 @@ interface IProps {
* The mxc:// avatar URL of the displayed user
*/
avatarUrl?: string;
-
- /**
- * Whether the EventTile should appear faded
- */
- faded?: boolean;
-
- /**
- * Callback for when the component is clicked
- */
- onClick?: () => void;
}
interface IState {
message: string;
- faded: boolean;
- eventTileKey: number;
}
const AVATAR_SIZE = 32;
@@ -81,23 +69,9 @@ export default class EventTilePreview extends React.Component {
super(props);
this.state = {
message: props.message,
- faded: !!props.faded,
- eventTileKey: 0,
};
}
- changeMessage(message: string) {
- this.setState({
- message,
- // Change the EventTile key to force React to create a new instance
- eventTileKey: this.state.eventTileKey + 1,
- });
- }
-
- unfade() {
- this.setState({ faded: false });
- }
-
private fakeEvent({message}: IState) {
// Fake it till we make it
/* eslint-disable quote-props */
@@ -147,12 +121,10 @@ export default class EventTilePreview extends React.Component {
const className = classnames(this.props.className, {
"mx_IRCLayout": this.props.layout == Layout.IRC,
"mx_GroupLayout": this.props.layout == Layout.Group,
- "mx_EventTilePreview_faded": this.state.faded,
});
- return
+ return
{
const isKnownMember = (member: RoomMember) => !!DMRoomMap.shared().getDMRoomsForUserId(member.userId)?.length;
const FacePile = ({ room, onlyKnownUsers = true, numShown = DEFAULT_NUM_FACES, ...props }: IProps) => {
+ const cli = useContext(MatrixClientContext);
let members = useRoomMembers(room);
// sort users with an explicit avatar first
@@ -46,21 +48,42 @@ const FacePile = ({ room, onlyKnownUsers = true, numShown = DEFAULT_NUM_FACES, .
// sort known users first
iteratees.unshift(member => isKnownMember(member));
}
- if (members.length < 1) return null;
- const shownMembers = sortBy(members, iteratees).slice(0, numShown);
+ // exclude ourselves from the shown members list
+ const shownMembers = sortBy(members.filter(m => m.userId !== cli.getUserId()), iteratees).slice(0, numShown);
+ if (shownMembers.length < 1) return null;
+
+ // We reverse the order of the shown faces in CSS to simplify their visual overlap,
+ // reverse members in tooltip order to make the order between the two match up.
+ const commaSeparatedMembers = shownMembers.map(m => m.rawDisplayName).reverse().join(", ");
+
+ let tooltip: ReactNode;
+ if (props.onClick) {
+ tooltip =
+ );
+ } else {
+ // If there is no event - we're viewing an avatar, we set
+ // an empty div here, since the panel uses space-between
+ // and we want the same placement of elements
+ info = (
+
+ );
+ }
+
+ let contextMenuButton;
+ if (this.props.mxEvent) {
+ contextMenuButton = (
+
+ );
+ }
+
+ return (
+
+
+
+ );
+ }
+}
diff --git a/src/components/views/elements/InfoTooltip.tsx b/src/components/views/elements/InfoTooltip.tsx
index 8f7f1ea53f..d49090dbae 100644
--- a/src/components/views/elements/InfoTooltip.tsx
+++ b/src/components/views/elements/InfoTooltip.tsx
@@ -18,8 +18,8 @@ limitations under the License.
import React from 'react';
import classNames from 'classnames';
-import Tooltip from './Tooltip';
-import { _t } from "../../../languageHandler";
+import Tooltip, {Alignment} from './Tooltip';
+import {_t} from "../../../languageHandler";
import {replaceableComponent} from "../../../utils/replaceableComponent";
interface ITooltipProps {
@@ -61,7 +61,7 @@ export default class InfoTooltip extends React.PureComponent : ;
return (
diff --git a/src/components/views/elements/InviteReason.tsx b/src/components/views/elements/InviteReason.tsx
new file mode 100644
index 0000000000..ddce7552ed
--- /dev/null
+++ b/src/components/views/elements/InviteReason.tsx
@@ -0,0 +1,62 @@
+/*
+Copyright 2021 The Matrix.org Foundation C.I.C.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import classNames from "classnames";
+import React from "react";
+import { _t } from "../../../languageHandler";
+import { replaceableComponent } from "../../../utils/replaceableComponent";
+
+interface IProps {
+ reason: string;
+}
+
+interface IState {
+ hidden: boolean;
+}
+
+@replaceableComponent("views.elements.InviteReason")
+export default class InviteReason extends React.PureComponent {
+ constructor(props) {
+ super(props);
+ this.state = {
+ // We hide the reason for invitation by default, since it can be a
+ // vector for spam/harassment.
+ hidden: true,
+ };
+ }
+
+ onViewClick = () => {
+ this.setState({
+ hidden: false,
+ });
+ }
+
+ render() {
+ const classes = classNames({
+ "mx_InviteReason": true,
+ "mx_InviteReason_hidden": this.state.hidden,
+ });
+
+ return
+
{this.props.reason}
+
+ {_t("View message")}
+
+
;
+ }
+}
diff --git a/src/components/views/elements/PersistedElement.js b/src/components/views/elements/PersistedElement.js
index f504b3e97f..701c140a19 100644
--- a/src/components/views/elements/PersistedElement.js
+++ b/src/components/views/elements/PersistedElement.js
@@ -139,6 +139,8 @@ export default class PersistedElement extends React.Component {
_onAction(payload) {
if (payload.action === 'timeline_resize') {
this._repositionChild();
+ } else if (payload.action === 'logout') {
+ PersistedElement.destroyElement(this.props.persistKey);
}
}
diff --git a/src/components/views/elements/TextWithTooltip.js b/src/components/views/elements/TextWithTooltip.js
index 0bd491768c..a6fc00fc2e 100644
--- a/src/components/views/elements/TextWithTooltip.js
+++ b/src/components/views/elements/TextWithTooltip.js
@@ -25,6 +25,7 @@ export default class TextWithTooltip extends React.Component {
class: PropTypes.string,
tooltipClass: PropTypes.string,
tooltip: PropTypes.node.isRequired,
+ tooltipProps: PropTypes.object,
};
constructor() {
@@ -46,15 +47,17 @@ export default class TextWithTooltip extends React.Component {
render() {
const Tooltip = sdk.getComponent("elements.Tooltip");
- const {class: className, children, tooltip, tooltipClass, ...props} = this.props;
+ const {class: className, children, tooltip, tooltipClass, tooltipProps, ...props} = this.props;
return (
{children}
{this.state.hover && }
+ className={"mx_TextWithTooltip_tooltip"}
+ /> }
);
}
diff --git a/src/components/views/elements/Tooltip.tsx b/src/components/views/elements/Tooltip.tsx
index b2dd00de18..062d26c852 100644
--- a/src/components/views/elements/Tooltip.tsx
+++ b/src/components/views/elements/Tooltip.tsx
@@ -25,6 +25,14 @@ import {replaceableComponent} from "../../../utils/replaceableComponent";
const MIN_TOOLTIP_HEIGHT = 25;
+export enum Alignment {
+ Natural, // Pick left or right
+ Left,
+ Right,
+ Top, // Centered
+ Bottom, // Centered
+}
+
interface IProps {
// Class applied to the element used to position the tooltip
className?: string;
@@ -36,7 +44,7 @@ interface IProps {
visible?: boolean;
// the react element to put into the tooltip
label: React.ReactNode;
- forceOnRight?: boolean;
+ alignment?: Alignment; // defaults to Natural
yOffset?: number;
}
@@ -46,10 +54,14 @@ export default class Tooltip extends React.Component {
private tooltip: void | Element | Component;
private parent: Element;
+ // XXX: This is because some components (Field) are unable to `import` the Tooltip class,
+ // so we expose the Alignment options off of us statically.
+ public static readonly Alignment = Alignment;
public static readonly defaultProps = {
visible: true,
yOffset: 0,
+ alignment: Alignment.Natural,
};
// Create a wrapper for the tooltip outside the parent and attach it to the body element
@@ -86,11 +98,35 @@ export default class Tooltip extends React.Component {
offset = Math.floor(parentBox.height - MIN_TOOLTIP_HEIGHT);
}
- style.top = (parentBox.top - 2 + this.props.yOffset) + window.pageYOffset + offset;
- if (!this.props.forceOnRight && parentBox.right > window.innerWidth / 2) {
- style.right = window.innerWidth - parentBox.right - window.pageXOffset - 16;
- } else {
- style.left = parentBox.right + window.pageXOffset + 6;
+ const baseTop = (parentBox.top - 2 + this.props.yOffset) + window.pageYOffset;
+ const top = baseTop + offset;
+ const right = window.innerWidth - parentBox.right - window.pageXOffset - 16;
+ const left = parentBox.right + window.pageXOffset + 6;
+ const horizontalCenter = parentBox.right - window.pageXOffset - (parentBox.width / 2);
+ switch (this.props.alignment) {
+ case Alignment.Natural:
+ if (parentBox.right > window.innerWidth / 2) {
+ style.right = right;
+ style.top = top;
+ break;
+ }
+ // fall through to Right
+ case Alignment.Right:
+ style.left = left;
+ style.top = top;
+ break;
+ case Alignment.Left:
+ style.right = right;
+ style.top = top;
+ break;
+ case Alignment.Top:
+ style.top = baseTop - 16;
+ style.left = horizontalCenter;
+ break;
+ case Alignment.Bottom:
+ style.top = baseTop + parentBox.height;
+ style.left = horizontalCenter;
+ break;
}
return style;
diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js
index 3683818027..5af2063c84 100644
--- a/src/components/views/messages/MImageBody.js
+++ b/src/components/views/messages/MImageBody.js
@@ -41,6 +41,9 @@ export default class MImageBody extends React.Component {
/* the maximum image height to use */
maxImageHeight: PropTypes.number,
+
+ /* the permalinkCreator */
+ permalinkCreator: PropTypes.object,
};
static contextType = MatrixClientContext;
@@ -106,6 +109,7 @@ export default class MImageBody extends React.Component {
src: httpUrl,
name: content.body && content.body.length > 0 ? content.body : _t('Attachment'),
mxEvent: this.props.mxEvent,
+ permalinkCreator: this.props.permalinkCreator,
};
if (content.info) {
@@ -114,7 +118,7 @@ export default class MImageBody extends React.Component {
params.fileSize = content.info.size;
}
- Modal.createDialog(ImageView, params, "mx_Dialog_lightbox");
+ Modal.createDialog(ImageView, params, "mx_Dialog_lightbox", null, true);
}
}
diff --git a/src/components/views/messages/MessageEvent.js b/src/components/views/messages/MessageEvent.js
index 28c2f8f9b9..60f7631c8e 100644
--- a/src/components/views/messages/MessageEvent.js
+++ b/src/components/views/messages/MessageEvent.js
@@ -46,6 +46,9 @@ export default class MessageEvent extends React.Component {
/* the maximum image height to use, if the event is an image */
maxImageHeight: PropTypes.number,
+
+ /* the permalinkCreator */
+ permalinkCreator: PropTypes.object,
};
constructor(props) {
@@ -126,6 +129,7 @@ export default class MessageEvent extends React.Component {
editState={this.props.editState}
onHeightChanged={this.props.onHeightChanged}
onMessageAllowed={this.onTileUpdate}
+ permalinkCreator={this.props.permalinkCreator}
/>;
}
}
diff --git a/src/components/views/messages/MessageTimestamp.js b/src/components/views/messages/MessageTimestamp.js
index c9bdb8937e..a7f350adcd 100644
--- a/src/components/views/messages/MessageTimestamp.js
+++ b/src/components/views/messages/MessageTimestamp.js
@@ -17,7 +17,7 @@ limitations under the License.
import React from 'react';
import PropTypes from 'prop-types';
-import {formatFullDate, formatTime} from '../../../DateUtils';
+import {formatFullDate, formatTime, formatFullTime} from '../../../DateUtils';
import {replaceableComponent} from "../../../utils/replaceableComponent";
@replaceableComponent("views.messages.MessageTimestamp")
@@ -25,13 +25,24 @@ export default class MessageTimestamp extends React.Component {
static propTypes = {
ts: PropTypes.number.isRequired,
showTwelveHour: PropTypes.bool,
+ showFullDate: PropTypes.bool,
+ showSeconds: PropTypes.bool,
};
render() {
const date = new Date(this.props.ts);
+ let timestamp;
+ if (this.props.showFullDate) {
+ timestamp = formatFullDate(date, this.props.showTwelveHour, this.props.showSeconds);
+ } else if (this.props.showSeconds) {
+ timestamp = formatFullTime(date, this.props.showTwelveHour);
+ } else {
+ timestamp = formatTime(date, this.props.showTwelveHour);
+ }
+
return (
- { formatTime(date, this.props.showTwelveHour) }
+ {timestamp}
);
}
diff --git a/src/components/views/messages/RoomAvatarEvent.js b/src/components/views/messages/RoomAvatarEvent.js
index 00aaf9bfda..41eada3193 100644
--- a/src/components/views/messages/RoomAvatarEvent.js
+++ b/src/components/views/messages/RoomAvatarEvent.js
@@ -49,7 +49,7 @@ export default class RoomAvatarEvent extends React.Component {
src: httpUrl,
name: text,
};
- Modal.createDialog(ImageView, params, "mx_Dialog_lightbox");
+ Modal.createDialog(ImageView, params, "mx_Dialog_lightbox", null, true);
};
render() {
diff --git a/src/components/views/right_panel/UserInfo.tsx b/src/components/views/right_panel/UserInfo.tsx
index 12a6a2a311..be152d91bd 100644
--- a/src/components/views/right_panel/UserInfo.tsx
+++ b/src/components/views/right_panel/UserInfo.tsx
@@ -24,6 +24,7 @@ import {RoomMember} from 'matrix-js-sdk/src/models/room-member';
import {User} from 'matrix-js-sdk/src/models/user';
import {Room} from 'matrix-js-sdk/src/models/room';
import {EventTimeline} from 'matrix-js-sdk/src/models/event-timeline';
+import {MatrixEvent} from 'matrix-js-sdk/src/models/event';
import dis from '../../../dispatcher/dispatcher';
import Modal from '../../../Modal';
@@ -496,11 +497,11 @@ const isMuted = (member: RoomMember, powerLevelContent: IPowerLevelsContent) =>
export const useRoomPowerLevels = (cli: MatrixClient, room: Room) => {
const [powerLevels, setPowerLevels] = useState({});
- const update = useCallback(() => {
- if (!room) {
- return;
- }
- const event = room.currentState.getStateEvents("m.room.power_levels", "");
+ const update = useCallback((ev?: MatrixEvent) => {
+ if (!room) return;
+ if (ev && ev.getType() !== EventType.RoomPowerLevels) return;
+
+ const event = room.currentState.getStateEvents(EventType.RoomPowerLevels, "");
if (event) {
setPowerLevels(event.getContent());
} else {
@@ -511,7 +512,7 @@ export const useRoomPowerLevels = (cli: MatrixClient, room: Room) => {
};
}, [room]);
- useEventEmitter(cli, "RoomState.members", update);
+ useEventEmitter(cli, "RoomState.events", update);
useEffect(() => {
update();
return () => {
@@ -1431,7 +1432,7 @@ const UserInfoHeader: React.FC<{
name: member.name,
};
- Modal.createDialog(ImageView, params, "mx_Dialog_lightbox");
+ Modal.createDialog(ImageView, params, "mx_Dialog_lightbox", null, true);
}, [member]);
const avatarElement = (
@@ -1494,7 +1495,7 @@ const UserInfoHeader: React.FC<{
e2eIcon = ;
}
- const displayName = member.name || member.displayname;
+ const displayName = member.rawDisplayName || member.displayname;
return
{ avatarElement }
diff --git a/src/components/views/rooms/BasicMessageComposer.tsx b/src/components/views/rooms/BasicMessageComposer.tsx
index 9d9e3a1ba0..e83f066bd0 100644
--- a/src/components/views/rooms/BasicMessageComposer.tsx
+++ b/src/components/views/rooms/BasicMessageComposer.tsx
@@ -140,7 +140,12 @@ export default class BasicMessageEditor extends React.Component
}
public componentDidUpdate(prevProps: IProps) {
- if (this.props.placeholder !== prevProps.placeholder && this.props.placeholder) {
+ // We need to re-check the placeholder when the enabled state changes because it causes the
+ // placeholder element to remount, which gets rid of the `::before` class. Re-evaluating the
+ // placeholder means we get a proper `::before` with the placeholder.
+ const enabledChange = this.props.disabled !== prevProps.disabled;
+ const placeholderChanged = this.props.placeholder !== prevProps.placeholder;
+ if (this.props.placeholder && (placeholderChanged || enabledChange)) {
const {isEmpty} = this.props.model;
if (isEmpty) {
this.showPlaceholder();
@@ -670,8 +675,6 @@ export default class BasicMessageEditor extends React.Component
});
const classes = classNames("mx_BasicMessageComposer_input", {
"mx_BasicMessageComposer_input_shouldShowPillAvatar": this.state.showPillAvatar,
-
- // TODO: @@ TravisR: This doesn't work properly. The composer resets in a strange way.
"mx_BasicMessageComposer_input_disabled": this.props.disabled,
});
diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js
index d51f4c00f1..f6fb83c064 100644
--- a/src/components/views/rooms/EventTile.js
+++ b/src/components/views/rooms/EventTile.js
@@ -1,8 +1,6 @@
/*
-Copyright 2015, 2016 OpenMarket Ltd
-Copyright 2017 New Vector Ltd
Copyright 2019 Michael Telatynski <7t3chguy@gmail.com>
-Copyright 2019, 2020 The Matrix.org Foundation C.I.C.
+Copyright 2019 - 2021 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -17,18 +15,19 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
-import ReplyThread from "../elements/ReplyThread";
import React, {createRef} from 'react';
import PropTypes from 'prop-types';
import classNames from "classnames";
import {EventType} from "matrix-js-sdk/src/@types/event";
+import {EventStatus} from 'matrix-js-sdk/src/models/event';
+
+import ReplyThread from "../elements/ReplyThread";
import { _t } from '../../../languageHandler';
import * as TextForEvent from "../../../TextForEvent";
import * as sdk from "../../../index";
import dis from '../../../dispatcher/dispatcher';
import SettingsStore from "../../../settings/SettingsStore";
import {Layout, LayoutPropType} from "../../../settings/Layout";
-import {EventStatus} from 'matrix-js-sdk/src/models/event';
import {formatTime} from "../../../DateUtils";
import {MatrixClientPeg} from '../../../MatrixClientPeg';
import {ALL_RULE_TYPES} from "../../../mjolnir/BanList";
@@ -43,39 +42,56 @@ import {replaceableComponent} from "../../../utils/replaceableComponent";
import Tooltip from "../elements/Tooltip";
const eventTileTypes = {
- 'm.room.message': 'messages.MessageEvent',
- 'm.sticker': 'messages.MessageEvent',
- 'm.key.verification.cancel': 'messages.MKeyVerificationConclusion',
- 'm.key.verification.done': 'messages.MKeyVerificationConclusion',
- 'm.room.encryption': 'messages.EncryptionEvent',
- 'm.call.invite': 'messages.TextualEvent',
- 'm.call.answer': 'messages.TextualEvent',
- 'm.call.hangup': 'messages.TextualEvent',
- 'm.call.reject': 'messages.TextualEvent',
+ [EventType.RoomMessage]: 'messages.MessageEvent',
+ [EventType.Sticker]: 'messages.MessageEvent',
+ [EventType.KeyVerificationCancel]: 'messages.MKeyVerificationConclusion',
+ [EventType.KeyVerificationDone]: 'messages.MKeyVerificationConclusion',
+ [EventType.CallInvite]: 'messages.TextualEvent',
+ [EventType.CallAnswer]: 'messages.TextualEvent',
+ [EventType.CallHangup]: 'messages.TextualEvent',
+ [EventType.CallReject]: 'messages.TextualEvent',
};
const stateEventTileTypes = {
- 'm.room.encryption': 'messages.EncryptionEvent',
- 'm.room.canonical_alias': 'messages.TextualEvent',
- 'm.room.create': 'messages.RoomCreate',
- 'm.room.member': 'messages.TextualEvent',
- 'm.room.name': 'messages.TextualEvent',
- 'm.room.avatar': 'messages.RoomAvatarEvent',
- 'm.room.third_party_invite': 'messages.TextualEvent',
- 'm.room.history_visibility': 'messages.TextualEvent',
- 'm.room.topic': 'messages.TextualEvent',
- 'm.room.power_levels': 'messages.TextualEvent',
- 'm.room.pinned_events': 'messages.TextualEvent',
- 'm.room.server_acl': 'messages.TextualEvent',
+ [EventType.RoomEncryption]: 'messages.EncryptionEvent',
+ [EventType.RoomCanonicalAlias]: 'messages.TextualEvent',
+ [EventType.RoomCreate]: 'messages.RoomCreate',
+ [EventType.RoomMember]: 'messages.TextualEvent',
+ [EventType.RoomName]: 'messages.TextualEvent',
+ [EventType.RoomAvatar]: 'messages.RoomAvatarEvent',
+ [EventType.RoomThirdPartyInvite]: 'messages.TextualEvent',
+ [EventType.RoomHistoryVisibility]: 'messages.TextualEvent',
+ [EventType.RoomTopic]: 'messages.TextualEvent',
+ [EventType.RoomPowerLevels]: 'messages.TextualEvent',
+ [EventType.RoomPinnedEvents]: 'messages.TextualEvent',
+ [EventType.RoomServerAcl]: 'messages.TextualEvent',
// TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111)
'im.vector.modular.widgets': 'messages.TextualEvent',
[WIDGET_LAYOUT_EVENT_TYPE]: 'messages.TextualEvent',
- 'm.room.tombstone': 'messages.TextualEvent',
- 'm.room.join_rules': 'messages.TextualEvent',
- 'm.room.guest_access': 'messages.TextualEvent',
- 'm.room.related_groups': 'messages.TextualEvent',
+ [EventType.RoomTombstone]: 'messages.TextualEvent',
+ [EventType.RoomJoinRules]: 'messages.TextualEvent',
+ [EventType.RoomGuestAccess]: 'messages.TextualEvent',
+ 'm.room.related_groups': 'messages.TextualEvent', // legacy communities flair
};
+const stateEventSingular = new Set([
+ EventType.RoomEncryption,
+ EventType.RoomCanonicalAlias,
+ EventType.RoomCreate,
+ EventType.RoomName,
+ EventType.RoomAvatar,
+ EventType.RoomHistoryVisibility,
+ EventType.RoomTopic,
+ EventType.RoomPowerLevels,
+ EventType.RoomPinnedEvents,
+ EventType.RoomServerAcl,
+ WIDGET_LAYOUT_EVENT_TYPE,
+ EventType.RoomTombstone,
+ EventType.RoomJoinRules,
+ EventType.RoomGuestAccess,
+ 'm.room.related_groups',
+]);
+
// Add all the Mjolnir stuff to the renderer
for (const evType of ALL_RULE_TYPES) {
stateEventTileTypes[evType] = 'messages.TextualEvent';
@@ -132,7 +148,12 @@ export function getHandlerTile(ev) {
}
}
- return ev.isState() ? stateEventTileTypes[type] : eventTileTypes[type];
+ if (ev.isState()) {
+ if (stateEventSingular.has(type) && ev.getStateKey() !== "") return undefined;
+ return stateEventTileTypes[type];
+ }
+
+ return eventTileTypes[type];
}
const MAX_READ_AVATARS = 5;
@@ -239,6 +260,9 @@ export default class EventTile extends React.Component {
// whether or not to show flair at all
enableFlair: PropTypes.bool,
+
+ // whether or not to show read receipts
+ showReadReceipts: PropTypes.bool,
};
static defaultProps = {
@@ -837,8 +861,6 @@ export default class EventTile extends React.Component {
permalink = this.props.permalinkCreator.forEvent(this.props.mxEvent.getId());
}
- const readAvatars = this.getReadAvatars();
-
let avatar;
let sender;
let avatarSize;
@@ -967,6 +989,16 @@ export default class EventTile extends React.Component {
const groupPadlock = !useIRCLayout && !isBubbleMessage && this._renderE2EPadlock();
const ircPadlock = useIRCLayout && !isBubbleMessage && this._renderE2EPadlock();
+ let msgOption;
+ if (this.props.showReadReceipts) {
+ const readAvatars = this.getReadAvatars();
+ msgOption = (
+
;
} else if (Object.values(this.state.sublists).some(list => list.length > 0)) {
const unfilteredLists = RoomListStore.instance.unfilteredLists
diff --git a/src/components/views/rooms/RoomPreviewBar.js b/src/components/views/rooms/RoomPreviewBar.js
index f84458a32f..7f20451d6d 100644
--- a/src/components/views/rooms/RoomPreviewBar.js
+++ b/src/components/views/rooms/RoomPreviewBar.js
@@ -1,7 +1,5 @@
/*
-Copyright 2015, 2016 OpenMarket Ltd
-Copyright 2017 Vector Creations Ltd
-Copyright 2019, 2020 The Matrix.org Foundation C.I.C.
+Copyright 2015-2021 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -25,10 +23,10 @@ import classNames from 'classnames';
import { _t } from '../../../languageHandler';
import SdkConfig from "../../../SdkConfig";
import IdentityAuthClient from '../../../IdentityAuthClient';
-import SettingsStore from "../../../settings/SettingsStore";
import {CommunityPrototypeStore} from "../../../stores/CommunityPrototypeStore";
import {UPDATE_EVENT} from "../../../stores/AsyncStore";
-import {replaceableComponent} from "../../../utils/replaceableComponent";
+import { replaceableComponent } from "../../../utils/replaceableComponent";
+import InviteReason from "../elements/InviteReason";
const MessageCase = Object.freeze({
NotLoggedIn: "NotLoggedIn",
@@ -303,7 +301,6 @@ export default class RoomPreviewBar extends React.Component {
const brand = SdkConfig.get().brand;
const Spinner = sdk.getComponent('elements.Spinner');
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
- const EventTilePreview = sdk.getComponent('elements.EventTilePreview');
let showSpinner = false;
let title;
@@ -497,24 +494,7 @@ export default class RoomPreviewBar extends React.Component {
const myUserId = MatrixClientPeg.get().getUserId();
const reason = this.props.room.currentState.getMember(myUserId).events.member.event.content.reason;
if (reason) {
- this.reasonElement = React.createRef();
- // We hide the reason for invitation by default, since it can be a
- // vector for spam/harassment.
- const showReason = () => {
- this.reasonElement.current.unfade();
- this.reasonElement.current.changeMessage(reason);
- };
- reasonElement = ;
+ reasonElement = ;
}
primaryActionHandler = this.props.onJoinClick;
diff --git a/src/components/views/rooms/RoomSublist.tsx b/src/components/views/rooms/RoomSublist.tsx
index 74052e8ba1..a726ab99fc 100644
--- a/src/components/views/rooms/RoomSublist.tsx
+++ b/src/components/views/rooms/RoomSublist.tsx
@@ -74,6 +74,7 @@ interface IProps {
tagId: TagID;
onResize: () => void;
showSkeleton?: boolean;
+ alwaysVisible?: boolean;
extraTiles?: ReactComponentElement[];
@@ -125,8 +126,6 @@ export default class RoomSublist extends React.Component {
};
// Why Object.assign() and not this.state.height? Because TypeScript says no.
this.state = Object.assign(this.state, {height: this.calculateInitialHeight()});
- this.dispatcherRef = defaultDispatcher.register(this.onAction);
- RoomListStore.instance.on(LISTS_UPDATE_EVENT, this.onListsUpdated);
}
private calculateInitialHeight() {
@@ -242,6 +241,11 @@ export default class RoomSublist extends React.Component {
return false;
}
+ public componentDidMount() {
+ this.dispatcherRef = defaultDispatcher.register(this.onAction);
+ RoomListStore.instance.on(LISTS_UPDATE_EVENT, this.onListsUpdated);
+ }
+
public componentWillUnmount() {
defaultDispatcher.unregister(this.dispatcherRef);
RoomListStore.instance.off(LISTS_UPDATE_EVENT, this.onListsUpdated);
@@ -759,6 +763,7 @@ export default class RoomSublist extends React.Component {
'mx_RoomSublist': true,
'mx_RoomSublist_hasMenuOpen': !!this.state.contextMenuPosition,
'mx_RoomSublist_minimized': this.props.isMinimized,
+ 'mx_RoomSublist_hidden': !this.state.rooms.length && this.props.alwaysVisible !== true,
});
let content = null;
diff --git a/src/components/views/rooms/RoomTile.tsx b/src/components/views/rooms/RoomTile.tsx
index 79db460275..b2a07d7e06 100644
--- a/src/components/views/rooms/RoomTile.tsx
+++ b/src/components/views/rooms/RoomTile.tsx
@@ -97,22 +97,8 @@ export default class RoomTile extends React.PureComponent {
// generatePreview() will return nothing if the user has previews disabled
messagePreview: this.generatePreview(),
};
-
- ActiveRoomObserver.addListener(this.props.room.roomId, this.onActiveRoomUpdate);
- this.dispatcherRef = defaultDispatcher.register(this.onAction);
- MessagePreviewStore.instance.on(
- MessagePreviewStore.getPreviewChangedEventName(this.props.room),
- this.onRoomPreviewChanged,
- );
this.notificationState = RoomNotificationStateStore.instance.getRoomState(this.props.room);
- this.notificationState.on(NOTIFICATION_STATE_UPDATE, this.onNotificationUpdate);
this.roomProps = EchoChamber.forRoom(this.props.room);
- this.roomProps.on(PROPERTY_UPDATED, this.onRoomPropertyUpdate);
- CommunityPrototypeStore.instance.on(
- CommunityPrototypeStore.getUpdateEventName(this.props.room.roomId),
- this.onCommunityUpdate,
- );
- this.props.room.on("Room.name", this.onRoomNameUpdate);
}
private onRoomNameUpdate = (room) => {
@@ -167,6 +153,20 @@ export default class RoomTile extends React.PureComponent {
if (this.state.selected) {
this.scrollIntoView();
}
+
+ ActiveRoomObserver.addListener(this.props.room.roomId, this.onActiveRoomUpdate);
+ this.dispatcherRef = defaultDispatcher.register(this.onAction);
+ MessagePreviewStore.instance.on(
+ MessagePreviewStore.getPreviewChangedEventName(this.props.room),
+ this.onRoomPreviewChanged,
+ );
+ this.notificationState.on(NOTIFICATION_STATE_UPDATE, this.onNotificationUpdate);
+ this.roomProps.on(PROPERTY_UPDATED, this.onRoomPropertyUpdate);
+ this.roomProps.on("Room.name", this.onRoomNameUpdate);
+ CommunityPrototypeStore.instance.on(
+ CommunityPrototypeStore.getUpdateEventName(this.props.room.roomId),
+ this.onCommunityUpdate,
+ );
}
public componentWillUnmount() {
@@ -182,8 +182,15 @@ export default class RoomTile extends React.PureComponent {
);
this.props.room.off("Room.name", this.onRoomNameUpdate);
}
+ ActiveRoomObserver.removeListener(this.props.room.roomId, this.onActiveRoomUpdate);
defaultDispatcher.unregister(this.dispatcherRef);
this.notificationState.off(NOTIFICATION_STATE_UPDATE, this.onNotificationUpdate);
+ this.roomProps.off(PROPERTY_UPDATED, this.onRoomPropertyUpdate);
+ this.roomProps.off("Room.name", this.onRoomNameUpdate);
+ CommunityPrototypeStore.instance.off(
+ CommunityPrototypeStore.getUpdateEventName(this.props.room.roomId),
+ this.onCommunityUpdate,
+ );
}
private onAction = (payload: ActionPayload) => {
@@ -547,7 +554,7 @@ export default class RoomTile extends React.PureComponent {
/>;
let badge: React.ReactNode;
- if (!this.props.isMinimized) {
+ if (!this.props.isMinimized && this.notificationState) {
// aria-hidden because we summarise the unread count/highlight status in a manual aria-label below
badge = (
@@ -563,7 +570,11 @@ export default class RoomTile extends React.PureComponent {
let messagePreview = null;
if (this.showMessagePreview && this.state.messagePreview) {
messagePreview = (
-
+
{this.state.messagePreview}
);
diff --git a/src/components/views/rooms/SendMessageComposer.js b/src/components/views/rooms/SendMessageComposer.js
index 75bc943146..0d3a174766 100644
--- a/src/components/views/rooms/SendMessageComposer.js
+++ b/src/components/views/rooms/SendMessageComposer.js
@@ -477,6 +477,10 @@ export default class SendMessageComposer extends React.Component {
}
onAction = (payload) => {
+ // don't let the user into the composer if it is disabled - all of these branches lead
+ // to the cursor being in the composer
+ if (this.props.disabled) return;
+
switch (payload.action) {
case 'reply_to_event':
case Action.FocusComposer:
diff --git a/src/components/views/rooms/VoiceRecordComposerTile.tsx b/src/components/views/rooms/VoiceRecordComposerTile.tsx
index b4999ac0df..9b7f0da472 100644
--- a/src/components/views/rooms/VoiceRecordComposerTile.tsx
+++ b/src/components/views/rooms/VoiceRecordComposerTile.tsx
@@ -17,21 +17,21 @@ limitations under the License.
import AccessibleTooltipButton from "../elements/AccessibleTooltipButton";
import {_t} from "../../../languageHandler";
import React from "react";
-import {VoiceRecorder} from "../../../voice/VoiceRecorder";
+import {VoiceRecording} from "../../../voice/VoiceRecording";
import {Room} from "matrix-js-sdk/src/models/room";
import {MatrixClientPeg} from "../../../MatrixClientPeg";
import classNames from "classnames";
import LiveRecordingWaveform from "../voice_messages/LiveRecordingWaveform";
import {replaceableComponent} from "../../../utils/replaceableComponent";
import LiveRecordingClock from "../voice_messages/LiveRecordingClock";
+import {VoiceRecordingStore} from "../../../stores/VoiceRecordingStore";
interface IProps {
room: Room;
- onRecording: (haveRecording: boolean) => void;
}
interface IState {
- recorder?: VoiceRecorder;
+ recorder?: VoiceRecording;
}
/**
@@ -53,17 +53,45 @@ export default class VoiceRecordComposerTile extends React.PureComponent Math.round(v * 1024)),
+ },
});
+ await VoiceRecordingStore.instance.disposeRecording();
this.setState({recorder: null});
- this.props.onRecording(false);
return;
}
- const recorder = new VoiceRecorder(MatrixClientPeg.get());
+ const recorder = VoiceRecordingStore.instance.startRecording();
await recorder.start();
- this.props.onRecording(true);
this.setState({recorder});
};
diff --git a/src/components/views/settings/tabs/room/RolesRoomSettingsTab.js b/src/components/views/settings/tabs/room/RolesRoomSettingsTab.js
index 09498e0d4a..59a175906d 100644
--- a/src/components/views/settings/tabs/room/RolesRoomSettingsTab.js
+++ b/src/components/views/settings/tabs/room/RolesRoomSettingsTab.js
@@ -1,5 +1,5 @@
/*
-Copyright 2019 New Vector Ltd
+Copyright 2019, 2021 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -22,17 +22,19 @@ import * as sdk from "../../../../..";
import AccessibleButton from "../../../elements/AccessibleButton";
import Modal from "../../../../../Modal";
import {replaceableComponent} from "../../../../../utils/replaceableComponent";
+import {EventType} from "matrix-js-sdk/src/@types/event";
const plEventsToLabels = {
// These will be translated for us later.
- "m.room.avatar": _td("Change room avatar"),
- "m.room.name": _td("Change room name"),
- "m.room.canonical_alias": _td("Change main address for the room"),
- "m.room.history_visibility": _td("Change history visibility"),
- "m.room.power_levels": _td("Change permissions"),
- "m.room.topic": _td("Change topic"),
- "m.room.tombstone": _td("Upgrade the room"),
- "m.room.encryption": _td("Enable room encryption"),
+ [EventType.RoomAvatar]: _td("Change room avatar"),
+ [EventType.RoomName]: _td("Change room name"),
+ [EventType.RoomCanonicalAlias]: _td("Change main address for the room"),
+ [EventType.RoomHistoryVisibility]: _td("Change history visibility"),
+ [EventType.RoomPowerLevels]: _td("Change permissions"),
+ [EventType.RoomTopic]: _td("Change topic"),
+ [EventType.RoomTombstone]: _td("Upgrade the room"),
+ [EventType.RoomEncryption]: _td("Enable room encryption"),
+ [EventType.RoomServerAcl]: _td("Change server ACLs"),
// TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111)
"im.vector.modular.widgets": _td("Modify widgets"),
@@ -40,14 +42,15 @@ const plEventsToLabels = {
const plEventsToShow = {
// If an event is listed here, it will be shown in the PL settings. Defaults will be calculated.
- "m.room.avatar": {isState: true},
- "m.room.name": {isState: true},
- "m.room.canonical_alias": {isState: true},
- "m.room.history_visibility": {isState: true},
- "m.room.power_levels": {isState: true},
- "m.room.topic": {isState: true},
- "m.room.tombstone": {isState: true},
- "m.room.encryption": {isState: true},
+ [EventType.RoomAvatar]: {isState: true},
+ [EventType.RoomName]: {isState: true},
+ [EventType.RoomCanonicalAlias]: {isState: true},
+ [EventType.RoomHistoryVisibility]: {isState: true},
+ [EventType.RoomPowerLevels]: {isState: true},
+ [EventType.RoomTopic]: {isState: true},
+ [EventType.RoomTombstone]: {isState: true},
+ [EventType.RoomEncryption]: {isState: true},
+ [EventType.RoomServerAcl]: {isState: true},
// TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111)
"im.vector.modular.widgets": {isState: true},
diff --git a/src/components/views/spaces/SpacePanel.tsx b/src/components/views/spaces/SpacePanel.tsx
index bacf1bd929..36ab423885 100644
--- a/src/components/views/spaces/SpacePanel.tsx
+++ b/src/components/views/spaces/SpacePanel.tsx
@@ -25,7 +25,12 @@ import SpaceCreateMenu from "./SpaceCreateMenu";
import {SpaceItem} from "./SpaceTreeLevel";
import AccessibleTooltipButton from "../elements/AccessibleTooltipButton";
import {useEventEmitter} from "../../../hooks/useEventEmitter";
-import SpaceStore, {HOME_SPACE, UPDATE_SELECTED_SPACE, UPDATE_TOP_LEVEL_SPACES} from "../../../stores/SpaceStore";
+import SpaceStore, {
+ HOME_SPACE,
+ UPDATE_INVITED_SPACES,
+ UPDATE_SELECTED_SPACE,
+ UPDATE_TOP_LEVEL_SPACES,
+} from "../../../stores/SpaceStore";
import AutoHideScrollbar from "../../structures/AutoHideScrollbar";
import {SpaceNotificationState} from "../../../stores/notifications/SpaceNotificationState";
import NotificationBadge from "../rooms/NotificationBadge";
@@ -105,19 +110,21 @@ const SpaceButton: React.FC = ({
;
}
-const useSpaces = (): [Room[], Room | null] => {
+const useSpaces = (): [Room[], Room[], Room | null] => {
+ const [invites, setInvites] = useState(SpaceStore.instance.invitedSpaces);
+ useEventEmitter(SpaceStore.instance, UPDATE_INVITED_SPACES, setInvites);
const [spaces, setSpaces] = useState(SpaceStore.instance.spacePanelSpaces);
useEventEmitter(SpaceStore.instance, UPDATE_TOP_LEVEL_SPACES, setSpaces);
const [activeSpace, setActiveSpace] = useState(SpaceStore.instance.activeSpace);
useEventEmitter(SpaceStore.instance, UPDATE_SELECTED_SPACE, setActiveSpace);
- return [spaces, activeSpace];
+ return [invites, spaces, activeSpace];
};
const SpacePanel = () => {
// We don't need the handle as we position the menu in a constant location
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const [menuDisplayed, handle, openMenu, closeMenu] = useContextMenu();
- const [spaces, activeSpace] = useSpaces();
+ const [invites, spaces, activeSpace] = useSpaces();
const [isPanelCollapsed, setPanelCollapsed] = useState(true);
const newClasses = classNames("mx_SpaceButton_new", {
@@ -209,6 +216,13 @@ const SpacePanel = () => {
notificationState={SpaceStore.instance.getNotificationState(HOME_SPACE)}
isNarrow={isPanelCollapsed}
/>
+ { invites.map(s => setPanelCollapsed(false)}
+ />) }
{ spaces.map(s => {
super(props);
this.state = {
- collapsed: !props.isNested, // default to collapsed for root items
+ collapsed: !props.isNested, // default to collapsed for root items
contextMenuPosition: null,
};
}
@@ -83,6 +85,7 @@ export class SpaceItem extends React.PureComponent {
}
private onContextMenu = (ev: React.MouseEvent) => {
+ if (this.props.space.getMyMembership() !== "join") return;
ev.preventDefault();
ev.stopPropagation();
this.setState({
@@ -185,6 +188,8 @@ export class SpaceItem extends React.PureComponent {
};
private renderContextMenu(): React.ReactElement {
+ if (this.props.space.getMyMembership() !== "join") return null;
+
let contextMenu = null;
if (this.state.contextMenuPosition) {
const userId = this.context.getUserId();
@@ -300,7 +305,9 @@ export class SpaceItem extends React.PureComponent {
mx_SpaceButton_hasMenuOpen: !!this.state.contextMenuPosition,
mx_SpaceButton_narrow: isNarrow,
});
- const notificationState = SpaceStore.instance.getNotificationState(space.roomId);
+ const notificationState = space.getMyMembership() === "invite"
+ ? StaticNotificationState.forSymbol("!", NotificationColor.Red)
+ : SpaceStore.instance.getNotificationState(space.roomId);
let childItems;
if (childSpaces && !collapsed) {
diff --git a/src/components/views/voice_messages/LiveRecordingClock.tsx b/src/components/views/voice_messages/LiveRecordingClock.tsx
index 00316d196a..5e9006c6ab 100644
--- a/src/components/views/voice_messages/LiveRecordingClock.tsx
+++ b/src/components/views/voice_messages/LiveRecordingClock.tsx
@@ -15,12 +15,12 @@ limitations under the License.
*/
import React from "react";
-import {IRecordingUpdate, VoiceRecorder} from "../../../voice/VoiceRecorder";
+import {IRecordingUpdate, VoiceRecording} from "../../../voice/VoiceRecording";
import {replaceableComponent} from "../../../utils/replaceableComponent";
import Clock from "./Clock";
interface IProps {
- recorder: VoiceRecorder;
+ recorder: VoiceRecording;
}
interface IState {
diff --git a/src/components/views/voice_messages/LiveRecordingWaveform.tsx b/src/components/views/voice_messages/LiveRecordingWaveform.tsx
index e7cab4a5cb..c1f5e97fff 100644
--- a/src/components/views/voice_messages/LiveRecordingWaveform.tsx
+++ b/src/components/views/voice_messages/LiveRecordingWaveform.tsx
@@ -15,14 +15,14 @@ limitations under the License.
*/
import React from "react";
-import {IRecordingUpdate, VoiceRecorder} from "../../../voice/VoiceRecorder";
+import {IRecordingUpdate, VoiceRecording} from "../../../voice/VoiceRecording";
import {replaceableComponent} from "../../../utils/replaceableComponent";
import {arrayFastResample, arraySeed} from "../../../utils/arrays";
import {percentageOf} from "../../../utils/numbers";
import Waveform from "./Waveform";
interface IProps {
- recorder: VoiceRecorder;
+ recorder: VoiceRecording;
}
interface IState {
diff --git a/src/createRoom.ts b/src/createRoom.ts
index a5343076ac..310d894266 100644
--- a/src/createRoom.ts
+++ b/src/createRoom.ts
@@ -90,6 +90,12 @@ export interface IOpts {
parentSpace?: Room;
}
+export interface IInvite3PID {
+ id_server: string,
+ medium: 'email',
+ address: string,
+}
+
/**
* Create a new room, and switch to it.
*
diff --git a/src/customisations/Security.ts b/src/customisations/Security.ts
index 96b5b62cdb..e215c5cb24 100644
--- a/src/customisations/Security.ts
+++ b/src/customisations/Security.ts
@@ -74,8 +74,20 @@ export interface ISecurityCustomisations {
catchAccessSecretStorageError?: typeof catchAccessSecretStorageError,
setupEncryptionNeeded?: typeof setupEncryptionNeeded,
getDehydrationKey?: typeof getDehydrationKey,
+
+ /**
+ * When false, disables the post-login UI from showing. If there's
+ * an error during setup, that will be shown to the user.
+ *
+ * Note: when this is set to false then the app will assume the user's
+ * encryption is set up some other way which would circumvent the default
+ * UI, such as by presenting alternative UI.
+ */
+ SHOW_ENCRYPTION_SETUP_UI?: boolean, // default true
}
// A real customisation module will define and export one or more of the
// customisation points that make up `ISecurityCustomisations`.
-export default {} as ISecurityCustomisations;
+export default {
+ SHOW_ENCRYPTION_SETUP_UI: true,
+} as ISecurityCustomisations;
diff --git a/src/editor/deserialize.ts b/src/editor/deserialize.ts
index bc1dd74c7d..a0c4d74275 100644
--- a/src/editor/deserialize.ts
+++ b/src/editor/deserialize.ts
@@ -143,11 +143,11 @@ function parseElement(n: HTMLElement, partCreator: PartCreator, lastNode: HTMLEl
// math nodes are translated back into delimited latex strings
if (n.hasAttribute("data-mx-maths")) {
const delimLeft = (n.nodeName == "SPAN") ?
- (SdkConfig.get()['latex_maths_delims'] || {})['inline_left'] || "$" :
- (SdkConfig.get()['latex_maths_delims'] || {})['display_left'] || "$$";
+ ((SdkConfig.get()['latex_maths_delims'] || {})['inline'] || {})['left'] || "\\(" :
+ ((SdkConfig.get()['latex_maths_delims'] || {})['display'] || {})['left'] || "\\[";
const delimRight = (n.nodeName == "SPAN") ?
- (SdkConfig.get()['latex_maths_delims'] || {})['inline_right'] || "$" :
- (SdkConfig.get()['latex_maths_delims'] || {})['display_right'] || "$$";
+ ((SdkConfig.get()['latex_maths_delims'] || {})['inline'] || {})['right'] || "\\)" :
+ ((SdkConfig.get()['latex_maths_delims'] || {})['display'] || {})['right'] || "\\]";
const tex = n.getAttribute("data-mx-maths");
return partCreator.plain(delimLeft + tex + delimRight);
} else if (!checkDescendInto(n)) {
diff --git a/src/editor/serialize.ts b/src/editor/serialize.ts
index d43cb4f38d..5167e3d376 100644
--- a/src/editor/serialize.ts
+++ b/src/editor/serialize.ts
@@ -47,21 +47,65 @@ export function mdSerialize(model: EditorModel) {
export function htmlSerializeIfNeeded(model: EditorModel, {forceHTML = false} = {}) {
let md = mdSerialize(model);
+ // copy of raw input to remove unwanted math later
+ const orig = md;
if (SettingsStore.getValue("feature_latex_maths")) {
- const displayPattern = (SdkConfig.get()['latex_maths_delims'] || {})['display_pattern'] ||
- "\\$\\$(([^$]|\\\\\\$)*)\\$\\$";
- const inlinePattern = (SdkConfig.get()['latex_maths_delims'] || {})['inline_pattern'] ||
- "\\$(([^$]|\\\\\\$)*)\\$";
+ const patternNames = ['tex', 'latex'];
+ const patternTypes = ['display', 'inline'];
+ const patternDefaults = {
+ "tex": {
+ // detect math with tex delimiters, inline: $...$, display $$...$$
+ // preferably use negative lookbehinds, not supported in all major browsers:
+ // const displayPattern = "^(?\n\n
\n\n`;
- });
+ // conditions for display math detection $$...$$:
+ // - pattern starts at beginning of line or is not prefixed with backslash or dollar
+ // - left delimiter ($$) is not escaped by backslash
+ "display": "(^|[^\\\\$])\\$\\$(([^$]|\\\\\\$)+?)\\$\\$",
- md = md.replace(RegExp(inlinePattern, "gm"), function(m, p1) {
- const p1e = AllHtmlEntities.encode(p1);
- return ``;
+ // conditions for inline math detection $...$:
+ // - pattern starts at beginning of line, follows whitespace character or punctuation
+ // - pattern is on a single line
+ // - left and right delimiters ($) are not escaped by backslashes
+ // - left delimiter is not followed by whitespace character
+ // - right delimiter is not prefixed with whitespace character
+ "inline":
+ "(^|\\s|[.,!?:;])(?!\\\\)\\$(?!\\s)(([^$\\n]|\\\\\\$)*([^\\\\\\s\\$]|\\\\\\$)(?:\\\\\\$)?)\\$",
+ },
+ "latex": {
+ // detect math with latex delimiters, inline: \(...\), display \[...\]
+
+ // conditions for display math detection \[...\]:
+ // - pattern starts at beginning of line or is not prefixed with backslash
+ // - pattern is not empty
+ "display": "(^|[^\\\\])\\\\\\[(?!\\\\\\])(.*?)\\\\\\]",
+
+ // conditions for inline math detection \(...\):
+ // - pattern starts at beginning of line or is not prefixed with backslash
+ // - pattern is not empty
+ "inline": "(^|[^\\\\])\\\\\\((?!\\\\\\))(.*?)\\\\\\)",
+ },
+ };
+
+ patternNames.forEach(function(patternName) {
+ patternTypes.forEach(function(patternType) {
+ // get the regex replace pattern from config or use the default
+ const pattern = (((SdkConfig.get()["latex_maths_delims"] ||
+ {})[patternType] || {})["pattern"] || {})[patternName] ||
+ patternDefaults[patternName][patternType];
+
+ md = md.replace(RegExp(pattern, "gms"), function(m, p1, p2) {
+ const p2e = AllHtmlEntities.encode(p2);
+ switch (patternType) {
+ case "display":
+ return `${p1}
\n\n
\n\n`;
+ case "inline":
+ return `${p1}`;
+ }
+ });
+ });
});
// make sure div tags always start on a new line, otherwise it will confuse
@@ -73,15 +117,29 @@ export function htmlSerializeIfNeeded(model: EditorModel, {forceHTML = false} =
if (!parser.isPlainText() || forceHTML) {
// feed Markdown output to HTML parser
const phtml = cheerio.load(parser.toHTML(),
- { _useHtmlParser2: true, decodeEntities: false })
+ { _useHtmlParser2: true, decodeEntities: false });
- // add fallback output for latex math, which should not be interpreted as markdown
- phtml('div, span').each(function(i, e) {
- const tex = phtml(e).attr('data-mx-maths')
- if (tex) {
- phtml(e).html(`${tex}`)
- }
- });
+ if (SettingsStore.getValue("feature_latex_maths")) {
+ // original Markdown without LaTeX replacements
+ const parserOrig = new Markdown(orig);
+ const phtmlOrig = cheerio.load(parserOrig.toHTML(),
+ { _useHtmlParser2: true, decodeEntities: false });
+
+ // since maths delimiters are handled before Markdown,
+ // code blocks could contain mangled content.
+ // replace code blocks with original content
+ phtmlOrig('code').each(function(i) {
+ phtml('code').eq(i).text(phtmlOrig('code').eq(i).text());
+ });
+
+ // add fallback output for latex math, which should not be interpreted as markdown
+ phtml('div, span').each(function(i, e) {
+ const tex = phtml(e).attr('data-mx-maths')
+ if (tex) {
+ phtml(e).html(`${tex}`)
+ }
+ });
+ }
return phtml.html();
}
// ensure removal of escape backslashes in non-Markdown messages
diff --git a/src/email.ts b/src/email.ts
index 6642a51541..0476d4467c 100644
--- a/src/email.ts
+++ b/src/email.ts
@@ -14,7 +14,10 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
-const EMAIL_ADDRESS_REGEX = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i;
+// Regexp based on Simpler Version from https://gist.github.com/gregseth/5582254 - matches RFC2822
+const EMAIL_ADDRESS_REGEX = new RegExp(
+ "^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*" + // localpart
+ "@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$", "i");
export function looksValid(email: string): boolean {
return EMAIL_ADDRESS_REGEX.test(email);
diff --git a/src/i18n/strings/ar.json b/src/i18n/strings/ar.json
index 67b5426d09..cc63995e0f 100644
--- a/src/i18n/strings/ar.json
+++ b/src/i18n/strings/ar.json
@@ -1551,5 +1551,6 @@
"You've reached the maximum number of simultaneous calls.": "لقد وصلت للحد الاقصى من المكالمات المتزامنة.",
"Too Many Calls": "مكالمات كثيرة جدا",
"Call failed because webcam or microphone could not be accessed. Check that:": "فشلت المكالمة لعدم امكانية الوصل للميكروفون او الكاميرا , من فضلك قم بالتأكد.",
- "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "فشلت المكالمة لعدم امكانية الوصل للميكروفون , تأكد من ان المكروفون متصل وتم اعداده بشكل صحيح."
+ "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "فشلت المكالمة لعدم امكانية الوصل للميكروفون , تأكد من ان المكروفون متصل وتم اعداده بشكل صحيح.",
+ "Explore rooms": "استكشِف الغرف"
}
diff --git a/src/i18n/strings/az.json b/src/i18n/strings/az.json
index 5a8dec76f0..987cef73b2 100644
--- a/src/i18n/strings/az.json
+++ b/src/i18n/strings/az.json
@@ -380,5 +380,8 @@
"%(senderDisplayName)s disabled flair for %(groups)s in this room.": "Bu otaqda %(groups)s üçün %(senderDisplayName)s aktiv oldu.",
"powered by Matrix": "Matrix tərəfindən təchiz edilmişdir",
"Custom Server Options": "Fərdi Server Seçimləri",
- "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "Bu otaqda %(newGroups)s üçün aktiv və %(oldGroups)s üçün %(senderDisplayName)s deaktiv oldu."
+ "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "Bu otaqda %(newGroups)s üçün aktiv və %(oldGroups)s üçün %(senderDisplayName)s deaktiv oldu.",
+ "Create Account": "Hesab Aç",
+ "Explore rooms": "Otaqları kəşf edin",
+ "Sign In": "Daxil ol"
}
diff --git a/src/i18n/strings/ca.json b/src/i18n/strings/ca.json
index 7db987b8af..9a9e0efaa7 100644
--- a/src/i18n/strings/ca.json
+++ b/src/i18n/strings/ca.json
@@ -950,5 +950,6 @@
"Confirm": "Confirma",
"Click the button below to confirm adding this email address.": "Fes clic al botó de sota per confirmar l'addició d'aquesta adreça de correu electrònic.",
"Unable to access webcam / microphone": "No s'ha pogut accedir a la càmera web / micròfon",
- "Unable to access microphone": "No s'ha pogut accedir al micròfon"
+ "Unable to access microphone": "No s'ha pogut accedir al micròfon",
+ "Explore rooms": "Explora sales"
}
diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json
index b03bd6a2b5..7f9ff9341c 100644
--- a/src/i18n/strings/cs.json
+++ b/src/i18n/strings/cs.json
@@ -3165,5 +3165,42 @@
"Edit devices": "Upravit zařízení",
"Check your devices": "Zkontrolujte svá zařízení",
"You have unverified logins": "Máte neověřená přihlášení",
- "Open": "Otevřít"
+ "Open": "Otevřít",
+ "Share decryption keys for room history when inviting users": "Při pozvání uživatelů sdílet dešifrovací klíče pro historii místnosti",
+ "Manage & explore rooms": "Spravovat a prozkoumat místnosti",
+ "Message search initilisation failed": "Inicializace vyhledávání zpráv se nezdařila",
+ "%(count)s people you know have already joined|one": "%(count)s osoba, kterou znáte, se již připojila",
+ "Invited people will be able to read old messages.": "Pozvaní lidé budou moci číst staré zprávy.",
+ "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Pokud tak učiníte, nezapomeňte, že žádná z vašich zpráv nebude smazána, ale vyhledávání může být na několik okamžiků degradováno, zatímco index bude znovu vytvářen",
+ "You can add more later too, including already existing ones.": "Později můžete přidat i další, včetně již existujících.",
+ "Verify your identity to access encrypted messages and prove your identity to others.": "Ověřte svou identitu, abyste získali přístup k šifrovaným zprávám a prokázali svou identitu ostatním.",
+ "Sends the given message as a spoiler": "Odešle danou zprávu jako spoiler",
+ "Review to ensure your account is safe": "Zkontrolujte, zda je váš účet v bezpečí",
+ "%(deviceId)s from %(ip)s": "%(deviceId)s z %(ip)s",
+ "Send and receive voice messages (in development)": "Odesílat a přijímat hlasové zprávy (ve vývoji)",
+ "unknown person": "neznámá osoba",
+ "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "Konzultace s %(transferTarget)s. Převod na %(transferee)s",
+ "Warn before quitting": "Varovat před ukončením",
+ "Invite to just this room": "Pozvat jen do této místnosti",
+ "Quick actions": "Rychlé akce",
+ "Invite messages are hidden by default. Click to show the message.": "Zprávy s pozvánkou jsou ve výchozím nastavení skryté. Kliknutím zobrazíte zprávu.",
+ "Record a voice message": "Nahrát hlasovou zprávu",
+ "Stop & send recording": "Zastavit a odeslat záznam",
+ "Accept on your other login…": "Přijměte ve svém dalším přihlášení…",
+ "%(count)s people you know have already joined|other": "%(count)s lidí, které znáte, se již připojili",
+ "Add existing rooms": "Přidat stávající místnosti",
+ "Adding...": "Přidávání...",
+ "We couldn't create your DM.": "Nemohli jsme vytvořit vaši přímou zprávu.",
+ "Consult first": "Nejprve se poraďte",
+ "You most likely do not want to reset your event index store": "Pravděpodobně nechcete resetovat úložiště indexů událostí",
+ "Reset event store": "Resetovat úložiště událostí",
+ "Reset event store?": "Resetovat úložiště událostí?",
+ "Verify other login": "Ověřit další přihlášení",
+ "Avatar": "Avatar",
+ "Verification requested": "Žádost ověření",
+ "Please choose a strong password": "Vyberte silné heslo",
+ "What are some things you want to discuss in %(spaceName)s?": "O kterých tématech chcete diskutovat v %(spaceName)s?",
+ "Let's create a room for each of them.": "Vytvořme pro každé z nich místnost.",
+ "Use another login": "Použijte jiné přihlašovací jméno",
+ "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Bez ověření nebudete mít přístup ke všem svým zprávám a ostatním se můžete zobrazit jako nedůvěryhodný."
}
diff --git a/src/i18n/strings/cy.json b/src/i18n/strings/cy.json
index 99c5296be5..b99b834636 100644
--- a/src/i18n/strings/cy.json
+++ b/src/i18n/strings/cy.json
@@ -8,5 +8,8 @@
"The version of %(brand)s": "Fersiwn %(brand)s",
"Whether or not you're logged in (we don't record your username)": "Os ydych wedi mewngofnodi ai peidio (nid ydym yn cofnodi'ch enw defnyddiwr)",
"Your language of choice": "Eich iaith o ddewis",
- "The version of %(brand)s": "Fersiwn %(brand)s"
+ "Sign In": "Mewngofnodi",
+ "Create Account": "Creu Cyfrif",
+ "Dismiss": "Wfftio",
+ "Explore rooms": "Archwilio Ystafelloedd"
}
diff --git a/src/i18n/strings/da.json b/src/i18n/strings/da.json
index 1f4eef4d93..ca28295c4f 100644
--- a/src/i18n/strings/da.json
+++ b/src/i18n/strings/da.json
@@ -54,7 +54,7 @@
"OK": "OK",
"Search": "Søg",
"Custom Server Options": "Brugerdefinerede serverindstillinger",
- "Dismiss": "Afskedige",
+ "Dismiss": "Afslut",
"powered by Matrix": "Drevet af Matrix",
"Close": "Luk",
"Cancel": "Afbryd",
@@ -618,5 +618,45 @@
"Unable to access microphone": "Kan ikke tilgå mikrofonen",
"The call could not be established": "Opkaldet kunne ikke etableres",
"Call Declined": "Opkald afvist",
- "Folder": "Mappe"
+ "Folder": "Mappe",
+ "We couldn't log you in": "Vi kunne ikke logge dig ind",
+ "Try again": "Prøv igen",
+ "Already in call": "",
+ "You're already in a call with this person.": "Du har allerede i et opkald med denne person.",
+ "Chile": "Chile",
+ "Call failed because webcam or microphone could not be accessed. Check that:": "Opkald fejlede på grund af kamera og mikrofon ikke kunne nås. Tjek dette:",
+ "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Opkald fejlede på grund af mikrofon ikke kunne nås. Tjek at din mikrofon er tilsluttet og sat op rigtigt.",
+ "India": "Indien",
+ "Iceland": "Island",
+ "Hong Kong": "Hong Kong",
+ "Greenland": "Grønland",
+ "Greece": "Grækenland",
+ "Ghana": "Ghana",
+ "Germany": "Tyskland",
+ "Faroe Islands": "Færøerne",
+ "Estonia": "Estonien",
+ "Ecuador": "Ecuador",
+ "Czech Republic": "Tjekkiet",
+ "Colombia": "Colombien",
+ "Chad": "Chad",
+ "Bulgaria": "Bulgarien",
+ "Brazil": "Brazilien",
+ "Bosnia": "Bosnien",
+ "Bolivia": "Bolivien",
+ "Belarus": "Hviderusland",
+ "Austria": "Østrig",
+ "Australia": "Australien",
+ "Armenia": "Armenien",
+ "Argentina": "Argentina",
+ "Antarctica": "Antarktis",
+ "Angola": "Angola",
+ "Albania": "Albanien",
+ "Afghanistan": "Afghanistan",
+ "United States": "Amerikas Forenede Stater",
+ "United Kingdom": "Storbritanien",
+ "This will end the conference for everyone. Continue?": "Dette vil afbryde opkaldet for alle. Fortsæt?",
+ "No other application is using the webcam": "Ingen anden application bruger kameraet",
+ "A microphone and webcam are plugged in and set up correctly": "En mikrofon og kamera er tilsluttet og sat op rigtigt",
+ "Croatia": "Kroatien",
+ "Answered Elsewhere": "Svaret andet sted"
}
diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json
index d22b9ebfb7..9551f00e55 100644
--- a/src/i18n/strings/de_DE.json
+++ b/src/i18n/strings/de_DE.json
@@ -11,7 +11,7 @@
"The email address linked to your account must be entered.": "Es muss die mit dem Benutzerkonto verbundene E-Mail-Adresse eingegeben werden.",
"Name": "Name",
"Session ID": "Sitzungs-ID",
- "Displays action": "Zeigt Aktionen an",
+ "Displays action": "Als Aktionen anzeigen",
"Bans user with given id": "Verbannt den Benutzer mit der angegebenen ID",
"Deops user with given id": "Setzt das Berechtigungslevel beim Benutzer mit der angegebenen ID zurück",
"Invites user with given id to current room": "Lädt den Benutzer mit der angegebenen ID in den aktuellen Raum ein",
@@ -25,8 +25,8 @@
"Warning!": "Warnung!",
"Error": "Fehler",
"Advanced": "Erweitert",
- "Anyone who knows the room's link, apart from guests": "Alle, die den Raum-Link kennen (ausgenommen Gäste)",
- "Anyone who knows the room's link, including guests": "Alle, die den Raum-Link kennen (auch Gäste)",
+ "Anyone who knows the room's link, apart from guests": "Alle, die den Raumlink kennen (ausgenommen Gäste)",
+ "Anyone who knows the room's link, including guests": "Alle, die den Raumlink kennen (auch Gäste)",
"Are you sure you want to reject the invitation?": "Bist du sicher, dass du die Einladung ablehnen willst?",
"Banned users": "Verbannte Benutzer",
"Continue": "Fortfahren",
@@ -50,7 +50,7 @@
"Homeserver is": "Der Heimserver ist",
"Identity Server is": "Der Identitätsserver ist",
"I have verified my email address": "Ich habe meine E-Mail-Adresse verifiziert",
- "Import E2E room keys": "E2E-Raum-Schlüssel importieren",
+ "Import E2E room keys": "E2E-Raumschlüssel importieren",
"Invalid Email Address": "Ungültige E-Mail-Adresse",
"Sign in with": "Anmelden mit",
"Leave room": "Raum verlassen",
@@ -78,7 +78,7 @@
"Someone": "Jemand",
"Success": "Erfolg",
"This doesn't appear to be a valid email address": "Dies scheint keine gültige E-Mail-Adresse zu sein",
- "This room is not accessible by remote Matrix servers": "Remote-Matrix-Server können auf diesen Raum nicht zugreifen",
+ "This room is not accessible by remote Matrix servers": "Ferngesteuerte Matrixserver können auf diesen Raum nicht zugreifen",
"Admin": "Administrator",
"Server may be unavailable, overloaded, or you hit a bug.": "Server ist nicht verfügbar, überlastet oder du bist auf einen Softwarefehler gestoßen.",
"Labs": "Labor",
@@ -115,7 +115,7 @@
"You are already in a call.": "Du bist bereits in einem Gespräch.",
"You cannot place a call with yourself.": "Du kannst keinen Anruf mit dir selbst starten.",
"You cannot place VoIP calls in this browser.": "VoIP-Gespräche werden von diesem Browser nicht unterstützt.",
- "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Deine E-Mail-Adresse scheint nicht mit einer Matrix-ID auf diesem Homeserver verbunden zu sein.",
+ "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Deine E-Mail-Adresse scheint nicht mit einer Matrix-ID auf diesem Heimserver verbunden zu sein.",
"Sun": "So",
"Mon": "Mo",
"Tue": "Di",
@@ -126,12 +126,12 @@
"Jan": "Jan",
"Feb": "Feb",
"Mar": "Mrz",
- "Apr": "April",
+ "Apr": "Apr",
"May": "Mai",
"Jun": "Jun",
"Jul": "Jul",
"Aug": "Aug",
- "Sep": "Sep",
+ "Sep": "Sept",
"Oct": "Okt",
"Nov": "Nov",
"Dec": "Dez",
@@ -155,7 +155,7 @@
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s von %(fromPowerLevel)s zu %(toPowerLevel)s",
"%(senderName)s invited %(targetName)s.": "%(senderName)s hat %(targetName)s eingeladen.",
"%(targetName)s joined the room.": "%(targetName)s hat den Raum betreten.",
- "%(senderName)s kicked %(targetName)s.": "%(senderName)s hat %(targetName)s gekickt.",
+ "%(senderName)s kicked %(targetName)s.": "%(senderName)s hat %(targetName)s rausgeworfen.",
"%(targetName)s left the room.": "%(targetName)s hat den Raum verlassen.",
"%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s hat den Chatverlauf für alle Raummitglieder ab ihrer Einladung sichtbar gemacht.",
"%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s hat den Chatverlauf für alle Raummitglieder ab ihrem Beitreten sichtbar gemacht.",
@@ -190,7 +190,7 @@
"click to reveal": "anzeigen",
"Failed to forget room %(errCode)s": "Das Entfernen des Raums ist fehlgeschlagen %(errCode)s",
"and %(count)s others...|other": "und %(count)s weitere...",
- "and %(count)s others...|one": "und ein(e) weitere(r)...",
+ "and %(count)s others...|one": "und ein weiterer...",
"Are you sure?": "Bist du sicher?",
"Attachment": "Anhang",
"Ban": "Bannen",
@@ -204,14 +204,14 @@
"Failed to ban user": "Verbannen des Benutzers fehlgeschlagen",
"Failed to change power level": "Ändern der Berechtigungsstufe fehlgeschlagen",
"Failed to join room": "Betreten des Raumes ist fehlgeschlagen",
- "Failed to kick": "Kicken fehlgeschlagen",
+ "Failed to kick": "Rauswurf fehlgeschlagen",
"Failed to mute user": "Stummschalten des Nutzers fehlgeschlagen",
"Failed to reject invite": "Ablehnen der Einladung ist fehlgeschlagen",
"Failed to set display name": "Anzeigename konnte nicht gesetzt werden",
"Fill screen": "Fülle Bildschirm",
"Incorrect verification code": "Falscher Verifizierungscode",
"Join Room": "Raum beitreten",
- "Kick": "Kicken",
+ "Kick": "Rausschmeißen",
"not specified": "nicht angegeben",
"No more results": "Keine weiteren Ergebnisse",
"No results": "Keine Ergebnisse",
@@ -237,8 +237,8 @@
"Autoplay GIFs and videos": "Videos und GIFs automatisch abspielen",
"%(items)s and %(lastItem)s": "%(items)s und %(lastItem)s",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(day)s. %(monthName)s %(fullYear)s %(time)s",
- "Access Token:": "Zugangs-Token:",
- "Always show message timestamps": "Nachrichten-Zeitstempel immer anzeigen",
+ "Access Token:": "Zugangstoken:",
+ "Always show message timestamps": "Nachrichtenzeitstempel immer anzeigen",
"Authentication": "Authentifizierung",
"An error has occurred.": "Ein Fehler ist aufgetreten.",
"Confirm password": "Passwort bestätigen",
@@ -282,7 +282,7 @@
"If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Wenn du keine E-Mail-Adresse angibst, wirst du nicht in der Lage sein, dein Passwort zurückzusetzen. Bist du sicher?",
"Error decrypting audio": "Entschlüsseln des Audios fehlgeschlagen",
"Error decrypting image": "Entschlüsselung des Bilds fehlgeschlagen",
- "Error decrypting video": "Video-Entschlüsselung fehlgeschlagen",
+ "Error decrypting video": "Videoentschlüsselung fehlgeschlagen",
"Import room keys": "Raum-Schlüssel importieren",
"File to import": "Zu importierende Datei",
"Failed to invite the following users to the %(roomName)s room:": "Folgende Benutzer konnten nicht in den Raum \"%(roomName)s\" eingeladen werden:",
@@ -302,7 +302,7 @@
"Idle": "Abwesend",
"Ongoing conference call%(supportedText)s.": "Laufendes Konferenzgespräch%(supportedText)s.",
"You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Um dein Konto für die Verwendung von %(integrationsUrl)s zu authentifizieren, wirst du jetzt auf die Website eines Drittanbieters weitergeleitet. Möchtest du fortfahren?",
- "Start automatically after system login": "Nach System-Login automatisch starten",
+ "Start automatically after system login": "Nach Systemstart automatisch starten",
"Jump to first unread message.": "Zur ersten ungelesenen Nachricht springen.",
"Options": "Optionen",
"Invited": "Eingeladen",
@@ -380,19 +380,19 @@
"(could not connect media)": "(Medienverbindung konnte nicht hergestellt werden)",
"(no answer)": "(keine Antwort)",
"(unknown failure: %(reason)s)": "(Unbekannter Fehler: %(reason)s)",
- "Your browser does not support the required cryptography extensions": "Dein Browser unterstützt die benötigten Verschlüsselungs-Erweiterungen nicht",
+ "Your browser does not support the required cryptography extensions": "Dein Browser unterstützt die benötigten Verschlüsselungserweiterungen nicht",
"Not a valid %(brand)s keyfile": "Keine gültige %(brand)s-Schlüsseldatei",
"Authentication check failed: incorrect password?": "Authentifizierung fehlgeschlagen: Falsches Passwort?",
"Do you want to set an email address?": "Möchtest du eine E-Mail-Adresse setzen?",
"This will allow you to reset your password and receive notifications.": "Dies ermöglicht es dir, dein Passwort zurückzusetzen und Benachrichtigungen zu empfangen.",
"Skip": "Überspringen",
- "Check for update": "Nach Updates suchen",
+ "Check for update": "Nach Aktualisierung suchen",
"Add a widget": "Widget hinzufügen",
"Allow": "Erlauben",
"Delete widget": "Widget entfernen",
"Define the power level of a user": "Berechtigungsstufe einers Benutzers setzen",
"Edit": "Bearbeiten",
- "Enable automatic language detection for syntax highlighting": "Automatische Spracherkennung für die Syntax-Hervorhebung",
+ "Enable automatic language detection for syntax highlighting": "Automatische Spracherkennung für die Syntaxhervorhebung",
"To get started, please pick a username!": "Um zu starten, wähle bitte einen Nutzernamen!",
"Unable to create widget.": "Widget kann nicht erstellt werden.",
"You are not in this room.": "Du bist nicht in diesem Raum.",
@@ -443,7 +443,7 @@
"The user '%(displayName)s' could not be removed from the summary.": "Der Benutzer '%(displayName)s' konnte nicht aus der Übersicht entfernt werden.",
"Unknown": "Unbekannt",
"Failed to add the following rooms to %(groupId)s:": "Die folgenden Räume konnten nicht zu %(groupId)s hinzugefügt werden:",
- "Matrix Room ID": "Matrix-Raum-ID",
+ "Matrix Room ID": "Matrixraum-ID",
"email address": "E-Mail-Adresse",
"Try using one of the following valid address types: %(validTypesList)s.": "Bitte einen der folgenden gültigen Adresstypen verwenden: %(validTypesList)s.",
"Failed to remove '%(roomName)s' from %(groupId)s": "Entfernen von '%(roomName)s' aus %(groupId)s fehlgeschlagen",
@@ -451,7 +451,7 @@
"Pinned Messages": "Angeheftete Nachrichten",
"%(senderName)s changed the pinned messages for the room.": "%(senderName)s hat die angehefteten Nachrichten für diesen Raum geändert.",
"Jump to read receipt": "Zur Lesebestätigung springen",
- "Message Pinning": "Nachrichten-Anheftung",
+ "Message Pinning": "Nachrichtenanheftung",
"Long Description (HTML)": "Lange Beschreibung (HTML)",
"Jump to message": "Zur Nachricht springen",
"No pinned messages.": "Keine angehefteten Nachrichten vorhanden.",
@@ -476,12 +476,12 @@
"New community ID (e.g. +foo:%(localDomain)s)": "Neue Community-ID (z. B. +foo:%(localDomain)s)",
"Remove from community": "Aus Community entfernen",
"Failed to remove user from community": "Entfernen des Benutzers aus der Community fehlgeschlagen",
- "Filter community members": "Community-Mitglieder filtern",
- "Filter community rooms": "Community-Räume filtern",
+ "Filter community members": "Communitymitglieder filtern",
+ "Filter community rooms": "Communityräume filtern",
"Failed to remove room from community": "Entfernen des Raumes aus der Community fehlgeschlagen",
- "Removing a room from the community will also remove it from the community page.": "Das Entfernen eines Raumes aus der Community wird ihn auch von der Community-Seite entfernen.",
+ "Removing a room from the community will also remove it from the community page.": "Das Entfernen eines Raumes aus der Community wird ihn auch von der Communityseite entfernen.",
"Create Community": "Community erstellen",
- "Community Name": "Community-Name",
+ "Community Name": "Communityname",
"Community ID": "Community-ID",
"example": "Beispiel",
"Add rooms to the community summary": "Fügt Räume zur Community-Übersicht hinzu",
@@ -539,10 +539,10 @@
"were banned %(count)s times|one": "wurden verbannt",
"was banned %(count)s times|other": "wurde %(count)s-mal verbannt",
"was banned %(count)s times|one": "wurde verbannt",
- "were kicked %(count)s times|other": "wurden %(count)s-mal gekickt",
- "were kicked %(count)s times|one": "wurden gekickt",
- "was kicked %(count)s times|other": "wurde %(count)s-mal gekickt",
- "was kicked %(count)s times|one": "wurde gekickt",
+ "were kicked %(count)s times|other": "wurden %(count)s-mal rausgeworfen",
+ "were kicked %(count)s times|one": "wurden rausgeworfen",
+ "was kicked %(count)s times|other": "wurde %(count)s-mal rausgeworfen",
+ "was kicked %(count)s times|one": "wurde rausgeworfen",
"%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)shaben %(count)s-mal ihren Namen geändert",
"%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)shaben ihren Namen geändert",
"%(oneUser)schanged their name %(count)s times|other": "%(oneUser)shat %(count)s-mal den Namen geändert",
@@ -551,7 +551,7 @@
"%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)shat das Profilbild %(count)s-mal geändert",
"%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)shat das Profilbild geändert",
"Disinvite this user?": "Einladung für diesen Benutzer zurückziehen?",
- "Kick this user?": "Diesen Benutzer kicken?",
+ "Kick this user?": "Diesen Benutzer rausschmeißen?",
"Unban this user?": "Verbannung für diesen Benutzer aufheben?",
"Ban this user?": "Diesen Benutzer verbannen?",
"Members only (since the point in time of selecting this option)": "Mitglieder",
@@ -577,12 +577,12 @@
"The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Die Sichtbarkeit von '%(roomName)s' in %(groupId)s konnte nicht aktualisiert werden.",
"Visibility in Room List": "Sichtbarkeit in Raumliste",
"Visible to everyone": "Für alle sichtbar",
- "Only visible to community members": "Nur für Community-Mitglieder sichtbar",
+ "Only visible to community members": "Nur für Communitymitglieder sichtbar",
"Community Invites": "Community-Einladungen",
"Notify the whole room": "Alle im Raum benachrichtigen",
"Room Notification": "Raum-Benachrichtigung",
"These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Diese Räume werden Community-Mitgliedern auf der Community-Seite angezeigt. Community-Mitglieder können diesen Räumen beitreten, indem sie diese anklicken.",
- "Show these rooms to non-members on the community page and room list?": "Sollen diese Räume öffentlich sichtbar auf der Community-Seite und in der Raum-Liste angezeigt werden?",
+ "Show these rooms to non-members on the community page and room list?": "Sollen diese Räume öffentlich auf der Community-Seite und in der Raum-Liste angezeigt werden?",
"
HTML for your community's page
\n
\n Use the long description to introduce new members to the community, or distribute\n some important links\n
\n
\n You can even use 'img' tags\n
\n": "
HTML für deine Community-Seite
\n
\n Nutze die ausführliche Beschreibung, um neuen Mitgliedern diese Community vorzustellen\n oder um wichtige Links bereitzustellen.\n
\n
\n Du kannst sogar 'img'-Tags (HTML) verwenden\n
\n",
"Your community hasn't got a Long Description, a HTML page to show to community members. Click here to open settings and give it one!": "Deine Community hat noch keine ausführliche Beschreibung, d. h. eine HTML-Seite, die Community-Mitgliedern angezeigt wird. Hier klicken, um die Einstellungen zu öffnen und eine Beschreibung zu erstellen!",
"Enable inline URL previews by default": "URL-Vorschau standardmäßig aktivieren",
@@ -627,12 +627,12 @@
"The version of %(brand)s": "Die %(brand)s-Version",
"Your language of choice": "Deine ausgewählte Sprache",
"Whether or not you're using the Richtext mode of the Rich Text Editor": "Ob du den Richtext-Modus des Editors benutzt oder nicht",
- "Your homeserver's URL": "Deine Homeserver-URL",
+ "Your homeserver's URL": "Deine Heimserver-URL",
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s. %(monthName)s %(fullYear)s",
"You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Du wirst nicht in der Lage sein, die Änderung zurückzusetzen, da du dich degradierst. Wenn du der letze Nutzer mit Berechtigungen bist, wird es unmöglich sein die Privilegien zurückzubekommen.",
"Community IDs cannot be empty.": "Community-IDs können nicht leer sein.",
"Learn more about how we use analytics.": "Lerne mehr darüber, wie wir die Analysedaten nutzen.",
- "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Wenn diese Seite identifizierbare Informationen wie Raum-, Nutzer- oder Gruppen-ID enthält, werden diese Daten entfernt bevor sie an den Server gesendet werden.",
+ "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Wenn diese Seite identifizierbare Informationen wie Raum-, Nutzer- oder Gruppen-ID enthält, werden diese Daten entfernt, bevor sie an den Server gesendet werden.",
"Which officially provided instance you are using, if any": "Welche offiziell angebotene Instanz du nutzt, wenn überhaupt eine",
"In reply to": "Als Antwort auf",
"This room is not public. You will not be able to rejoin without an invite.": "Dies ist kein öffentlicher Raum. Du wirst diesen nicht ohne Einladung wieder beitreten können.",
@@ -654,14 +654,14 @@
"Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Änderungen am Namen und Bild deiner Community werden evtl. erst nach 30 Minuten von anderen Nutzern gesehen werden.",
"Join this community": "Community beitreten",
"Leave this community": "Community verlassen",
- "You don't currently have any stickerpacks enabled": "Du hast aktuell keine Stickerpacks aktiviert",
+ "You don't currently have any stickerpacks enabled": "Du hast aktuell keine Stickerpakete aktiviert",
"Hide Stickers": "Sticker ausblenden",
"Show Stickers": "Sticker anzeigen",
"Who can join this community?": "Wer kann dieser Community beitreten?",
"Everyone": "Jeder",
- "Stickerpack": "Stickerpack",
+ "Stickerpack": "Stickerpaket",
"Fetching third party location failed": "Das Abrufen des Drittanbieterstandorts ist fehlgeschlagen",
- "Send Account Data": "Benutzerkonto-Daten senden",
+ "Send Account Data": "Benutzerkontodaten senden",
"All notifications are currently disabled for all targets.": "Aktuell sind alle Benachrichtigungen für alle Ziele deaktiviert.",
"Uploading report": "Lade Bericht hoch",
"Sunday": "Sonntag",
@@ -676,8 +676,8 @@
"Changelog": "Änderungsprotokoll",
"Waiting for response from server": "Auf Antwort vom Server warten",
"Send Custom Event": "Benutzerdefiniertes Event senden",
- "Advanced notification settings": "Erweiterte Benachrichtigungs-Einstellungen",
- "Failed to send logs: ": "Senden von Logs fehlgeschlagen: ",
+ "Advanced notification settings": "Erweiterte Benachrichtigungseinstellungen",
+ "Failed to send logs: ": "Senden von Protokolldateien fehlgeschlagen: ",
"Forget": "Entfernen",
"You cannot delete this image. (%(code)s)": "Das Bild kann nicht gelöscht werden. (%(code)s)",
"Cancel Sending": "Senden abbrechen",
@@ -694,12 +694,12 @@
"Please set a password!": "Bitte setze ein Passwort!",
"You have successfully set a password!": "Du hast erfolgreich ein Passwort gesetzt!",
"An error occurred whilst saving your email notification preferences.": "Beim Speichern deiner E-Mail-Benachrichtigungseinstellungen ist ein Fehler aufgetreten.",
- "Explore Room State": "Raum-Status erkunden",
+ "Explore Room State": "Raumstatus erkunden",
"Source URL": "Quell-URL",
"Messages sent by bot": "Nachrichten von Bots",
"Filter results": "Ergebnisse filtern",
"Members": "Mitglieder",
- "No update available.": "Kein Update verfügbar.",
+ "No update available.": "Keine Aktualisierung verfügbar.",
"Noisy": "Laut",
"Collecting app version information": "App-Versionsinformationen werden abgerufen",
"Keywords": "Schlüsselwörter",
@@ -714,9 +714,9 @@
"Remove %(name)s from the directory?": "Soll der Raum %(name)s aus dem Verzeichnis entfernt werden?",
"%(brand)s uses many advanced browser features, some of which are not available or experimental in your current browser.": "%(brand)s nutzt zahlreiche fortgeschrittene Browser-Funktionen, die teilweise in deinem aktuell verwendeten Browser noch nicht verfügbar sind oder sich noch im experimentellen Status befinden.",
"Developer Tools": "Entwicklerwerkzeuge",
- "Preparing to send logs": "Senden von Logs wird vorbereitet",
+ "Preparing to send logs": "Senden von Protokolldateien wird vorbereitet",
"Remember, you can always set an email address in user settings if you change your mind.": "Vergiss nicht, dass du in den Benutzereinstellungen jederzeit eine E-Mail-Adresse setzen kannst, wenn du deine Meinung änderst.",
- "Explore Account Data": "Konto-Daten erkunden",
+ "Explore Account Data": "Kontodaten erkunden",
"All messages (noisy)": "Alle Nachrichten (laut)",
"Saturday": "Samstag",
"I understand the risks and wish to continue": "Ich verstehe die Risiken und möchte fortfahren",
@@ -729,33 +729,33 @@
"Enable them now": "Diese jetzt aktivieren",
"Toolbox": "Werkzeugkasten",
"Collecting logs": "Protokolle werden abgerufen",
- "You must specify an event type!": "Du musst einen Event-Typ spezifizieren!",
+ "You must specify an event type!": "Du musst einen Eventtyp spezifizieren!",
"(HTTP status %(httpStatus)s)": "(HTTP-Status %(httpStatus)s)",
"Invite to this room": "In diesen Raum einladen",
"Wednesday": "Mittwoch",
"You cannot delete this message. (%(code)s)": "Diese Nachricht kann nicht gelöscht werden. (%(code)s)",
"Quote": "Zitat",
- "Send logs": "Logdateien übermitteln",
+ "Send logs": "Protokolldateien übermitteln",
"All messages": "Alle Nachrichten",
"Call invitation": "Anrufe",
- "Downloading update...": "Update wird heruntergeladen...",
- "State Key": "Status-Schlüssel",
+ "Downloading update...": "Aktualisierung wird heruntergeladen...",
+ "State Key": "Statusschlüssel",
"Failed to send custom event.": "Senden des benutzerdefinierten Events fehlgeschlagen.",
"What's new?": "Was ist neu?",
"Notify me for anything else": "Über alles andere benachrichtigen",
"When I'm invited to a room": "Einladungen",
- "Can't update user notification settings": "Benachrichtigungs-Einstellungen des Benutzers konnten nicht aktualisiert werden",
+ "Can't update user notification settings": "Benachrichtigungseinstellungen des Benutzers konnten nicht aktualisiert werden",
"Notify for all other messages/rooms": "Benachrichtigungen für alle anderen Mitteilungen/Räume aktivieren",
"Unable to look up room ID from server": "Es ist nicht möglich, die Raum-ID auf dem Server nachzuschlagen",
"Couldn't find a matching Matrix room": "Konnte keinen entsprechenden Matrix-Raum finden",
"All Rooms": "In allen Räumen",
"Thursday": "Donnerstag",
"Search…": "Suchen…",
- "Logs sent": "Logs gesendet",
+ "Logs sent": "Protokolldateien gesendet",
"Back": "Zurück",
"Reply": "Antworten",
"Show message in desktop notification": "Nachrichteninhalt in der Desktopbenachrichtigung anzeigen",
- "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Fehlerberichte enthalten Anwendungsdaten wie deinen Nutzernamen, Raum- und Gruppen-ID's und Aliase die du besucht hast sowie Nutzernamen anderer Nutzer. Sie enthalten keine Nachrichten.",
+ "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Fehlerberichte enthalten Anwendungsdaten wie deinen Nutzernamen, Raum- und Gruppen-IDs und Aliase die du besucht hast sowie Nutzernamen anderer Nutzer. Sie enthalten keine Nachrichten.",
"Unhide Preview": "Vorschau wieder anzeigen",
"Unable to join network": "Es ist nicht möglich, dem Netzwerk beizutreten",
"Sorry, your browser is not able to run %(brand)s.": "Es tut uns leid, aber dein Browser kann %(brand)s nicht ausführen.",
@@ -770,18 +770,18 @@
"Mentions only": "Nur, wenn du erwähnt wirst",
"You can now return to your account after signing out, and sign in on other devices.": "Du kannst nun zu deinem Benutzerkonto zurückkehren, nachdem du dich abgemeldet hast. Anschließend kannst du dich an anderen Geräten anmelden.",
"Enable email notifications": "Benachrichtigungen per E-Mail",
- "Event Type": "Event-Typ",
+ "Event Type": "Eventtyp",
"Download this file": "Datei herunterladen",
"Pin Message": "Nachricht anheften",
"Failed to change settings": "Einstellungen konnten nicht geändert werden",
"View Community": "Community ansehen",
"Event sent!": "Event gesendet!",
- "View Source": "Quellcode ansehen",
- "Event Content": "Event-Inhalt",
+ "View Source": "Rohdaten anzeigen",
+ "Event Content": "Eventinhalt",
"Thank you!": "Danke!",
"Uploaded on %(date)s by %(user)s": "Hochgeladen: %(date)s von %(user)s",
"With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "In deinem aktuell verwendeten Browser können Aussehen und Handhabung der Anwendung unter Umständen noch komplett fehlerhaft sein, so dass einige bzw. im Extremfall alle Funktionen nicht zur Verfügung stehen. Du kannst es trotzdem versuchen und fortfahren, bist dabei aber bezüglich aller auftretenden Probleme auf dich allein gestellt!",
- "Checking for an update...": "Nach Updates suchen...",
+ "Checking for an update...": "Nach Aktualisierung suchen...",
"Missing roomId.": "Fehlende Raum-ID.",
"Every page you use in the app": "Jede Seite, die du in der App benutzt",
"e.g. ": "z. B. ",
@@ -795,11 +795,11 @@
"We encountered an error trying to restore your previous session.": "Wir haben ein Problem beim Wiederherstellen deiner vorherigen Sitzung festgestellt.",
"Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Den Browser-Speicher zu löschen kann das Problem lösen, wird dich aber abmelden und verschlüsselte Chats unlesbar machen.",
"Collapse Reply Thread": "Antwort-Thread zusammenklappen",
- "Enable widget screenshots on supported widgets": "Widget-Screenshots bei unterstützten Widgets aktivieren",
+ "Enable widget screenshots on supported widgets": "Bildschirmfotos bei unterstützten Widgets aktivieren",
"Send analytics data": "Analysedaten senden",
"e.g. %(exampleValue)s": "z.B. %(exampleValue)s",
"Muted Users": "Stummgeschaltete Benutzer",
- "This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. This action is irreversible.": "Dies wird deinen Konto permanent unbenutzbar machen. Du wirst nicht in der Lage sein, dich anzumelden und keiner wird dieselbe Benutzer-ID erneut registrieren können. Alle Räume, in denen der Account ist, werden verlassen und deine Account-Daten werden vom Identitätsserver gelöscht. Diese Aktion ist unumkehrbar.",
+ "This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. This action is irreversible.": "Dies wird deinen Konto permanent unbenutzbar machen. Du wirst nicht in der Lage sein, dich anzumelden und keiner wird dieselbe Benutzer-ID erneut registrieren können. Alle Räume, in denen dein Konto ist, werden verlassen und deine Kontodaten werden vom Identitätsserver gelöscht. Diese Aktion ist unumkehrbar.",
"Deactivating your account does not by default cause us to forget messages you have sent. If you would like us to forget your messages, please tick the box below.": "Standardmäßig werden die von dir gesendeten Nachrichten beim Deaktiveren nicht gelöscht. Wenn du dies von uns möchtest, aktivere das Auswahlfeld unten.",
"Message visibility in Matrix is similar to email. Our forgetting your messages means that messages you have sent will not be shared with any new or unregistered users, but registered users who already have access to these messages will still have access to their copy.": "Die Sichtbarkeit der Nachrichten in Matrix ist vergleichbar mit E-Mails: Wenn wir deine Nachrichten vergessen heißt das, dass diese nicht mit neuen oder nicht registrierten Nutzern teilen werden, aber registrierte Nutzer, die bereits zugriff haben, werden Zugriff auf ihre Kopie behalten.",
"Please forget all messages I have sent when my account is deactivated (Warning: this will cause future users to see an incomplete view of conversations)": "Bitte vergesst alle Nachrichten, die ich gesendet habe, wenn mein Konto deaktiviert wird. (Warnung: Zukünftige Nutzer werden eine unvollständige Konversation sehen)",
@@ -821,7 +821,7 @@
"Share Message": "Nachricht teilen",
"No Audio Outputs detected": "Keine Audioausgabe erkannt",
"Audio Output": "Audioausgabe",
- "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "In verschlüsselten Räumen wie diesem ist die Link-Vorschau standardmäßig deaktiviert, damit dein Heimserver (der die Vorschau erzeugt) keine Informationen über Links in diesem Raum bekommt.",
+ "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "In verschlüsselten Räumen wie diesem ist die Linkvorschau standardmäßig deaktiviert, damit dein Heimserver (der die Vorschau erzeugt) keine Informationen über Links in diesem Raum bekommt.",
"When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "Die URL-Vorschau kann Informationen wie den Titel, die Beschreibung sowie ein Vorschaubild der Website enthalten.",
"The email field must not be blank.": "Das E-Mail-Feld darf nicht leer sein.",
"The phone number field must not be blank.": "Das Telefonnummern-Feld darf nicht leer sein.",
@@ -838,10 +838,10 @@
"Failed to remove widget": "Widget konnte nicht entfernt werden",
"An error ocurred whilst trying to remove the widget from the room": "Ein Fehler trat auf während versucht wurde, das Widget aus diesem Raum zu entfernen",
"System Alerts": "Systembenachrichtigung",
- "Only room administrators will see this warning": "Nur Raum-Administratoren werden diese Nachricht sehen",
+ "Only room administrators will see this warning": "Nur Raumadministratoren werden diese Nachricht sehen",
"Please contact your service administrator to continue using the service.": "Bitte kontaktiere deinen Systemadministrator, um diesen Dienst weiter zu nutzen.",
- "This homeserver has hit its Monthly Active User limit.": "Dieser Heimserver hat sein Limit an monatlich aktiven Nutzern erreicht.",
- "This homeserver has exceeded one of its resource limits.": "Dieser Heimserver hat einen seiner Ressourcen-Limits überschritten.",
+ "This homeserver has hit its Monthly Active User limit.": "Dieser Heimserver hat seinen Grenzwert an monatlich aktiven Nutzern erreicht.",
+ "This homeserver has exceeded one of its resource limits.": "Dieser Heimserver hat einen seiner Ressourcengrenzwert überschritten.",
"Upgrade Room Version": "Raum-Version aufrüsten",
"Create a new room with the same name, description and avatar": "Einen neuen Raum mit demselben Namen, Beschreibung und Profilbild erstellen",
"Update any local room aliases to point to the new room": "Alle lokalen Raum-Aliase aktualisieren, damit sie auf den neuen Raum zeigen",
@@ -850,8 +850,8 @@
"Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please contact your service administrator to continue using the service.": "Deine Nachricht wurde nicht gesendet, weil dieser Heimserver sein Limit an monatlich aktiven Benutzern erreicht hat. Bitte kontaktiere deinen Systemadministrator um diesen Dienst weiter zu nutzen.",
"Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.": "Deine Nachricht wurde nicht gesendet, weil dieser Heimserver ein Ressourcen-Limit erreicht hat. Bitte kontaktiere deinen Systemadministrator um diesen Dienst weiter zu nutzen.",
"Please contact your service administrator to continue using this service.": "Bitte kontaktiere deinen Systemadministrator um diesen Dienst weiter zu nutzen.",
- "Sorry, your homeserver is too old to participate in this room.": "Sorry, dein Homeserver ist zu alt, um an diesem Raum teilzunehmen.",
- "Please contact your homeserver administrator.": "Bitte setze dich mit der Administration deines Homeservers in Verbindung.",
+ "Sorry, your homeserver is too old to participate in this room.": "Leider ist dein Heimserver zu alt, um an diesem Raum teilzunehmen.",
+ "Please contact your homeserver administrator.": "Bitte setze dich mit der Administration deines Heimservers in Verbindung.",
"Legal": "Rechtliches",
"This room has been replaced and is no longer active.": "Dieser Raum wurde ersetzt und ist nicht länger aktiv.",
"The conversation continues here.": "Die Konversation wird hier fortgesetzt.",
@@ -860,11 +860,11 @@
"Failed to upgrade room": "Konnte Raum nicht aufrüsten",
"The room upgrade could not be completed": "Die Raum-Aufrüstung konnte nicht fertiggestellt werden",
"Upgrade this room to version %(version)s": "Diesen Raum zur Version %(version)s aufrüsten",
- "Forces the current outbound group session in an encrypted room to be discarded": "Erzwingt, dass die aktuell ausgehende Gruppen-Sitzung in einem verschlüsseltem Raum verworfen wird",
+ "Forces the current outbound group session in an encrypted room to be discarded": "Erzwingt, dass die aktuell ausgehende Gruppensitzung in einem verschlüsseltem Raum verworfen wird",
"Unable to connect to Homeserver. Retrying...": "Verbindung mit Heimserver nicht möglich. Versuche erneut...",
"%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s hat die Hauptadresse zu diesem Raum auf %(address)s gesetzt.",
"%(senderName)s removed the main address for this room.": "%(senderName)s hat die Hauptadresse von diesem Raum entfernt.",
- "Before submitting logs, you must create a GitHub issue to describe your problem.": "Bevor du Log-Dateien übermittelst, musst du ein GitHub-Issue erstellen um dein Problem zu beschreiben.",
+ "Before submitting logs, you must create a GitHub issue to describe your problem.": "Bevor du Protokolldateien übermittelst, musst du auf GitHub einen \"Issue\" erstellen um dein Problem zu beschreiben.",
"%(brand)s now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!": "%(brand)s benutzt nun 3 - 5-mal weniger Arbeitsspeicher, indem Informationen über andere Nutzer erst bei Bedarf geladen werden. Bitte warte, während die Daten erneut mit dem Server abgeglichen werden!",
"Updating %(brand)s": "Aktualisiere %(brand)s",
"You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.": "Du hast zuvor %(brand)s auf %(host)s ohne das verzögerte Laden von Mitgliedern genutzt. In dieser Version war das verzögerte Laden deaktiviert. Da die lokal zwischengespeicherten Daten zwischen diesen Einstellungen nicht kompatibel sind, muss %(brand)s dein Konto neu synchronisieren.",
@@ -880,7 +880,7 @@
"Delete Backup": "Sicherung löschen",
"Backup version: ": "Sicherungsversion: ",
"Algorithm: ": "Algorithmus: ",
- "To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of %(brand)s to do this": "Um zu vermeiden, dass dein Chat-Verlauf verloren geht, musst du deine Raum-Schlüssel exportieren, bevor du dich abmeldest. Dazu musst du auf die neuere Version von %(brand)s zurückgehen",
+ "To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of %(brand)s to do this": "Um zu vermeiden, dass dein Chatverlauf verloren geht, musst du deine Raumschlüssel exportieren, bevor du dich abmeldest. Dazu musst du auf die neuere Version von %(brand)s zurückgehen",
"Incompatible Database": "Inkompatible Datenbanken",
"Continue With Encryption Disabled": "Mit deaktivierter Verschlüsselung fortfahren",
"Next": "Weiter",
@@ -933,14 +933,14 @@
"Encrypted messages in group chats": "Verschlüsselte Gruppenchats",
"Use a longer keyboard pattern with more turns": "Nutze ein längeres Tastaturmuster mit mehr Abwechslung",
"Straight rows of keys are easy to guess": "Gerade Reihen von Tasten sind einfach zu erraten",
- "Custom user status messages": "Angepasste Nutzerstatus-Nachrichten",
+ "Custom user status messages": "Angepasste Nutzerstatusnachrichten",
"Unable to load key backup status": "Konnte Status der Schlüsselsicherung nicht laden",
"Don't ask again": "Nicht erneut fragen",
"Set up": "Einrichten",
"Please review and accept all of the homeserver's policies": "Bitte prüfe und akzeptiere alle Richtlinien des Heimservers",
"Failed to load group members": "Gruppenmitglieder konnten nicht geladen werden",
"That doesn't look like a valid email address": "Sieht nicht nach einer gültigen E-Mail-Adresse aus",
- "Unable to load commit detail: %(msg)s": "Konnte Commit-Details nicht laden: %(msg)s",
+ "Unable to load commit detail: %(msg)s": "Konnte Übermittlungsdetails nicht laden: %(msg)s",
"Checking...": "Überprüfe...",
"Unable to load backup status": "Konnte Sicherungsstatus nicht laden",
"Failed to decrypt %(failedCount)s sessions!": "Konnte %(failedCount)s Sitzungen nicht entschlüsseln!",
@@ -960,12 +960,12 @@
"If you didn't set the new recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Wenn du die neue Wiederherstellungsmethode nicht festgelegt hast, versucht ein Angreifer möglicherweise, auf dein Konto zuzugreifen. Ändere dein Kontopasswort und lege sofort eine neue Wiederherstellungsmethode in den Einstellungen fest.",
"Set up Secure Messages": "Richte sichere Nachrichten ein",
"Go to Settings": "Gehe zu Einstellungen",
- "Sign in with single sign-on": "Melde dich mit „Single Sign-On“ an",
+ "Sign in with single sign-on": "Einmalanmeldung nutzen",
"Unrecognised address": "Nicht erkannte Adresse",
"User %(user_id)s may or may not exist": "Unklar, ob Benutzer %(user_id)s existiert",
"Prompt before sending invites to potentially invalid matrix IDs": "Warnen, bevor du Einladungen zu ungültigen Matrix-IDs sendest",
"The following users may not exist": "Eventuell existieren folgende Benutzer nicht",
- "Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?": "Profile für die unteren Matrix IDs wurden nicht gefunden - willst Du sie trotzdem einladen?",
+ "Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?": "Profile für die unteren Matrix-IDs wurden nicht gefunden - willst Du sie trotzdem einladen?",
"Invite anyway and never warn me again": "Trotzdem einladen und mich nicht mehr warnen",
"Invite anyway": "Trotzdem einladen",
"Whether or not you're logged in (we don't record your username)": "Ob du angemeldet bist oder nicht (wir speichern deinen Benutzernamen nicht)",
@@ -976,16 +976,16 @@
"%(names)s and %(count)s others are typing …|other": "%(names)s und %(count)s andere tippen…",
"%(names)s and %(count)s others are typing …|one": "%(names)s und eine weitere Person tippen…",
"%(names)s and %(lastPerson)s are typing …": "%(names)s und %(lastPerson)s tippen…",
- "Render simple counters in room header": "Einfache Zähler in Raum-Kopfzeile anzeigen",
- "Enable Emoji suggestions while typing": "Emoji-Vorschläge während Eingabe",
+ "Render simple counters in room header": "Einfache Zähler in Raumkopfzeile anzeigen",
+ "Enable Emoji suggestions while typing": "Emojivorschläge während Eingabe",
"Show a placeholder for removed messages": "Zeigt einen Platzhalter für gelöschte Nachrichten an",
- "Show join/leave messages (invites/kicks/bans unaffected)": "Betreten oder Verlassen von Benutzern (ausgen. Kicks/Bans)",
- "Show avatar changes": "Avatar-Änderungen anzeigen",
+ "Show join/leave messages (invites/kicks/bans unaffected)": "Betreten oder Verlassen von Benutzern (ausgen. Einladungen/Rauswürfe/Banne)",
+ "Show avatar changes": "Avataränderungen anzeigen",
"Show display name changes": "Änderungen von Anzeigenamen",
"Send typing notifications": "Tippbenachrichtigungen senden",
"Show avatars in user and room mentions": "Avatare in Benutzer- und Raumerwähnungen",
"Enable big emoji in chat": "Große Emojis im Chat anzeigen",
- "Enable Community Filter Panel": "Community-Filter-Panel",
+ "Enable Community Filter Panel": "Community-Filtertafel",
"Messages containing my username": "Nachrichten mit meinem Benutzernamen",
"The other party cancelled the verification.": "Die Gegenstelle hat die Überprüfung abgebrochen.",
"Verified!": "Verifiziert!",
@@ -1020,15 +1020,15 @@
"For help with using %(brand)s, click here.": "Um Hilfe zur Benutzung von %(brand)s zu erhalten, klicke hier.",
"For help with using %(brand)s, click here or start a chat with our bot using the button below.": "Um Hilfe zur Benutzung von %(brand)s zu erhalten, klicke hier oder beginne einen Chat mit unserem Bot. Klicke dazu auf den unteren Knopf.",
"Chat with %(brand)s Bot": "Chatte mit dem %(brand)s-Bot",
- "Help & About": "Hilfe & Über",
+ "Help & About": "Hilfe und Über",
"Bug reporting": "Fehler melden",
"FAQ": "Häufige Fragen",
"Versions": "Versionen",
- "Room Addresses": "Raum-Adressen",
+ "Room Addresses": "Raumadressen",
"Deactivating your account is a permanent action - be careful!": "Die Deaktivierung deines Kontos ist unwiderruflich - sei vorsichtig!",
"Preferences": "Chats",
"Room list": "Raumliste",
- "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Die Datei '%(fileName)s' überschreitet die maximale Uploadgröße deines Homeservers",
+ "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Die Datei '%(fileName)s' überschreitet die maximale Uploadgröße deines Heimservers",
"This room has no topic.": "Dieser Raum hat kein Thema.",
"%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s hat den Raum für jeden, der den Link kennt, öffentlich gemacht.",
"%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s hat den Raum auf eingeladene Benutzer beschränkt.",
@@ -1036,7 +1036,7 @@
"%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s erlaubte Gäste diesem Raum beizutreten.",
"%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s hat Gästen verboten, diesem Raum beizutreten.",
"%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s änderte den Gastzugriff auf '%(rule)s'",
- "Group & filter rooms by custom tags (refresh to apply changes)": "Gruppiere & filtere Räume nach eigenen Tags (neu laden um Änderungen zu übernehmen)",
+ "Group & filter rooms by custom tags (refresh to apply changes)": "Gruppiere und filtere Räume nach eigenen Tags (neu laden um Änderungen zu übernehmen)",
"Unable to find a supported verification method.": "Konnte keine unterstützte Verifikationsmethode finden.",
"Dog": "Hund",
"Cat": "Katze",
@@ -1102,7 +1102,7 @@
"Pin": "Anheften",
"Timeline": "Chatverlauf",
"Autocomplete delay (ms)": "Verzögerung zur Autovervollständigung (ms)",
- "Roles & Permissions": "Rollen & Berechtigungen",
+ "Roles & Permissions": "Rollen und Berechtigungen",
"Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.": "Änderungen an der Sichtbarkeit des Chatverlaufs gelten nur für zukünftige Nachrichten. Die Sichtbarkeit des existierenden Verlaufs bleibt unverändert.",
"Security & Privacy": "Sicherheit",
"Encryption": "Verschlüsselung",
@@ -1125,7 +1125,7 @@
"Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Bist du sicher? Du wirst alle deine verschlüsselten Nachrichten verlieren, wenn deine Schlüssel nicht gut gesichert sind.",
"Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Verschlüsselte Nachrichten sind mit Ende-zu-Ende-Verschlüsselung gesichert. Nur du und der/die Empfänger haben die Schlüssel um diese Nachrichten zu lesen.",
"Restore from Backup": "Von Sicherung wiederherstellen",
- "Back up your keys before signing out to avoid losing them.": "Damit du deine Schlüssel nicht verlierst, sichere sie, bevor du dich abmeldest.",
+ "Back up your keys before signing out to avoid losing them.": "Um deine Schlüssel nicht zu verlieren, musst du sie vor der Abmeldung sichern.",
"Start using Key Backup": "Beginne Schlüsselsicherung zu nutzen",
"Credits": "Danksagungen",
"Starting backup...": "Starte Sicherung...",
@@ -1149,7 +1149,7 @@
"Report bugs & give feedback": "Melde Fehler & gib Rückmeldungen",
"Update status": "Aktualisiere Status",
"Set status": "Setze Status",
- "Hide": "Verberge",
+ "Hide": "Verbergen",
"This homeserver would like to make sure you are not a robot.": "Dieser Heimserver möchte sicherstellen, dass du kein Roboter bist.",
"Server Name": "Servername",
"Your Modular server": "Dein Modular-Server",
@@ -1207,11 +1207,11 @@
"Change permissions": "Ändere Berechtigungen",
"Change topic": "Ändere das Thema",
"Modify widgets": "Widgets bearbeiten",
- "Default role": "Standard Rolle",
+ "Default role": "Standard-Rolle",
"Send messages": "Nachrichten senden",
"Invite users": "Benutzer einladen",
"Change settings": "Einstellungen ändern",
- "Kick users": "Benutzer kicken",
+ "Kick users": "Benutzer rauswerfen",
"Ban users": "Benutzer verbannen",
"Remove messages": "Nachrichten löschen",
"Notify everyone": "Jeden benachrichtigen",
@@ -1220,8 +1220,8 @@
"Enable encryption?": "Verschlüsselung aktivieren?",
"Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.": "Sobald aktiviert, kann die Verschlüsselung für einen Raum nicht mehr deaktiviert werden. Nachrichten in einem verschlüsselten Raum können nur noch von Teilnehmern aber nicht mehr vom Server gelesen werden. Einige Bots und Brücken werden vielleicht nicht mehr funktionieren. Erfahre mehr über Verschlüsselung.",
"Error updating main address": "Fehler beim Aktualisieren der Hauptadresse",
- "There was an error updating the room's main address. It may not be allowed by the server or a temporary failure occurred.": "Es gab ein Problem beim Aktualisieren der Raum-Hauptadresse. Es kann sein, dass es vom Server verboten ist oder ein temporäres Problem auftrat.",
- "Error updating flair": "Abzeichen-Aktualisierung fehlgeschlagen",
+ "There was an error updating the room's main address. It may not be allowed by the server or a temporary failure occurred.": "Es gab ein Problem beim Aktualisieren der Raumhauptadresse. Es kann sein, dass es vom Server verboten ist oder ein temporäres Problem auftrat.",
+ "Error updating flair": "Abzeichenaktualisierung fehlgeschlagen",
"There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "Es gab ein Problem beim Aktualisieren des Abzeichens für diesen Raum. Es kann sein, dass der Server es nicht erlaubt oder ein temporäres Problem auftrat.",
"Power level": "Berechtigungsstufe",
"Room Settings - %(roomName)s": "Raumeinstellungen - %(roomName)s",
@@ -1238,28 +1238,28 @@
"You cannot modify widgets in this room.": "Du darfst in diesem Raum keine Widgets verändern.",
"Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Ob du die \"Breadcrumbs\"-Funktion nutzt oder nicht (Avatare oberhalb der Raumliste)",
"The server does not support the room version specified.": "Der Server unterstützt die angegebene Raumversion nicht.",
- "Warning: Upgrading a room will not automatically migrate room members to the new version of the room. We'll post a link to the new room in the old version of the room - room members will have to click this link to join the new room.": "Achtung: Ein Raum-Upgrade wird die Mitglieder des Raumes nicht automatisch auf die neue Version migrieren. Wir werden in der alten Raumversion einen Link zum neuen Raum posten - Raum-Mitglieder müssen dann auf diesen Link klicken um dem neuen Raum beizutreten.",
+ "Warning: Upgrading a room will not automatically migrate room members to the new version of the room. We'll post a link to the new room in the old version of the room - room members will have to click this link to join the new room.": "Achtung: Ein Raum-Upgrade wird die Mitglieder des Raumes nicht automatisch auf die neue Version migrieren. Wir werden in der alten Raumversion einen Link zum neuen Raum posten - Raummitglieder müssen dann auf diesen Link klicken um dem neuen Raum beizutreten.",
"Replying With Files": "Mit Dateien antworten",
- "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Momentan ist es nicht möglich mit einer Datei zu antworten. Möchtest Du die Datei hochladen ohne zu antworten?",
+ "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Momentan ist es nicht möglich mit einer Datei zu antworten. Möchtest Du die Datei hochladen, ohne zu antworten?",
"The file '%(fileName)s' failed to upload.": "Die Datei \"%(fileName)s\" konnte nicht hochgeladen werden.",
"Changes your avatar in this current room only": "Ändert deinen Avatar für diesen Raum",
"Unbans user with given ID": "Entbannt den Benutzer mit der angegebenen ID",
"Sends the given message coloured as a rainbow": "Sendet die Nachricht in Regenbogenfarben",
- "Adds a custom widget by URL to the room": "Fügt ein Benutzer-Widget über eine URL zum Raum hinzu",
+ "Adds a custom widget by URL to the room": "Fügt ein Benutzerwidget über eine URL zum Raum hinzu",
"Please supply a https:// or http:// widget URL": "Bitte gib eine mit https:// oder http:// beginnende Widget-URL an",
"Sends the given emote coloured as a rainbow": "Zeigt Aktionen in Regenbogenfarben",
"%(senderName)s made no change.": "%(senderName)s hat keine Änderung vorgenommen.",
"%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s hat die Einladung zum Raumbeitritt für %(targetDisplayName)s zurückgezogen.",
"Cannot reach homeserver": "Der Heimserver ist nicht erreichbar",
- "Ensure you have a stable internet connection, or get in touch with the server admin": "Stelle sicher, dass du eine stabile Internetverbindung hast oder wende dich an deinen Server-Administrator",
+ "Ensure you have a stable internet connection, or get in touch with the server admin": "Stelle sicher, dass du eine stabile Internetverbindung hast oder wende dich an deinen Serveradministrator",
"Ask your %(brand)s admin to check your config for incorrect or duplicate entries.": "Wende dich an deinen %(brand)s-Admin um deine Konfiguration auf ungültige oder doppelte Einträge zu überprüfen.",
- "Unexpected error resolving identity server configuration": "Ein unerwarteter Fehler ist beim Laden der Identitätsserver-Konfiguration aufgetreten",
+ "Unexpected error resolving identity server configuration": "Ein unerwarteter Fehler ist beim Laden der Identitätsserverkonfiguration aufgetreten",
"Cannot reach identity server": "Der Identitätsserver ist nicht erreichbar",
- "You can register, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Du kannst dich registrieren, aber manche Funktionen werden erst wieder verfügbar sein, wenn der Identitätsserver wieder online ist. Wenn diese Warnmeldung weiterhin angezeigt wird, überprüfe deine Konfiguration oder kontaktiere die Server-Administration.",
- "You can reset your password, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Du kannst dein Passwort zurücksetzen, aber manche Funktionen werden nicht verfügbar sein, bis der Identitätsserver wieder online ist. Wenn du diese Warnmeldung weiterhin siehst, überprüfe deine Konfiguration oder kontaktiere die Server-Administration.",
- "You can log in, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Du kannst dich einloggen, aber manche Funktionen werden nicht verfügbar sein bis der Identitätsserver wieder online ist. Wenn du diese Warnmeldung weiterhin siehst, überprüfe deine Konfiguration oder kontaktiere deinen Server-Administrator.",
+ "You can register, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Du kannst dich registrieren, aber manche Funktionen werden erst wieder verfügbar sein, wenn der Identitätsserver wieder online ist. Wenn diese Warnmeldung weiterhin angezeigt wird, überprüfe deine Konfiguration oder kontaktiere die Serveradministration.",
+ "You can reset your password, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Du kannst dein Passwort zurücksetzen, aber manche Funktionen werden nicht verfügbar sein, bis der Identitätsserver wieder online ist. Wenn du diese Warnmeldung weiterhin siehst, überprüfe deine Konfiguration oder kontaktiere die Serveradministrator.",
+ "You can log in, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Du kannst dich anmelden, aber manche Funktionen werden nicht verfügbar sein bis der Identitätsserver wieder erreichbar ist. Wenn du diese Warnmeldung weiterhin siehst, überprüfe deine Konfiguration oder kontaktiere deinen Serveradministrator.",
"No homeserver URL provided": "Keine Heimserver-URL angegeben",
- "Unexpected error resolving homeserver configuration": "Ein unerwarteter Fehler ist beim Laden der Heimserver-Konfiguration aufgetreten",
+ "Unexpected error resolving homeserver configuration": "Ein unerwarteter Fehler ist beim Laden der Heimserverkonfiguration aufgetreten",
"The user's homeserver does not support the version of the room.": "Die Raumversion wird vom Heimserver des Benutzers nicht unterstützt.",
"Show hidden events in timeline": "Zeige versteckte Ereignisse in der Chronik",
"Low bandwidth mode": "Modus für niedrige Bandbreite",
@@ -1274,7 +1274,7 @@
" invited you": " hat dich eingeladen",
"edited": "bearbeitet",
"Edit message": "Nachricht bearbeiten",
- "GitHub issue": "GitHub-Issue",
+ "GitHub issue": "\"Issue\" auf Github",
"Upload files": "Dateien hochladen",
"Upload all": "Alle hochladen",
"Upload": "Hochladen",
@@ -1298,16 +1298,16 @@
"Call failed due to misconfigured server": "Anruf aufgrund eines falsch konfigurierten Servers fehlgeschlagen",
"Try using turn.matrix.org": "Versuche es mit turn.matrix.org",
"You do not have the required permissions to use this command.": "Du hast nicht die erforderlichen Berechtigungen, diesen Befehl zu verwenden.",
- "Multiple integration managers": "Mehrere Integrationsmanager",
+ "Multiple integration managers": "Mehrere Integrationsverwalter",
"Public Name": "Öffentlicher Name",
- "Identity Server URL must be HTTPS": "Die Identity-Server-URL über HTTPS erreichbar sein",
+ "Identity Server URL must be HTTPS": "Identitätsserver-URL muss HTTPS sein",
"Could not connect to Identity Server": "Verbindung zum Identitätsserver konnte nicht hergestellt werden",
"Checking server": "Server wird überprüft",
"Identity server has no terms of service": "Der Identitätsserver hat keine Nutzungsbedingungen",
"Disconnect": "Trennen",
"Identity Server": "Identitätsserver",
"Use an identity server": "Benutze einen Identitätsserver",
- "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Benutze einen Identitätsserver, um andere mittels E-Mail einzuladen. Klicke auf fortfahren, um den Standard-Identitätsserver (%(defaultIdentityServerName)s) zu benutzen oder ändere ihn in den Einstellungen.",
+ "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Benutze einen Identitätsserver, um andere mittels E-Mail einzuladen. Klicke auf fortfahren, um den Standardidentitätsserver (%(defaultIdentityServerName)s) zu benutzen oder ändere ihn in den Einstellungen.",
"ID": "ID",
"Not a valid Identity Server (status code %(code)s)": "Ungültiger Identitätsserver (Fehlercode %(code)s)",
"Terms of service not accepted or the identity server is invalid.": "Die Nutzungsbedingungen wurden nicht akzeptiert oder der Identitätsserver ist ungültig.",
@@ -1328,8 +1328,8 @@
"Find a room…": "Einen Raum suchen…",
"Find a room… (e.g. %(exampleRoom)s)": "Einen Raum suchen… (z.B. %(exampleRoom)s)",
"If you can't find the room you're looking for, ask for an invite or Create a new room.": "Wenn du den gesuchten Raum nicht finden kannst, frage nach einer Einladung für den Raum oder Erstelle einen neuen Raum.",
- "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternativ kannst du versuchen, den öffentlichen Server unter turn.matrix.org zu verwenden. Allerdings wird dieser nicht so zuverlässig sein und du teilst deine IP-Adresse mit diesem Server. Du kannst dies auch in den Einstellungen konfigurieren.",
- "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Diese Handlung erfordert es, auf den Standard-Identitätsserver zuzugreifen, um eine E-Mail Adresse oder Telefonnummer zu validieren, aber der Server hat keine Nutzungsbedingungen.",
+ "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternativ kannst du versuchen, den öffentlichen Server unter turn.matrix.org zu verwenden. Allerdings wird dieser nicht so zuverlässig sein und du teilst deine IP-Adresse mit dem Server. Du kannst dies auch in den Einstellungen konfigurieren.",
+ "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Diese Handlung erfordert es, auf den Standardidentitätsserver zuzugreifen, um eine E-Mail-Adresse oder Telefonnummer zu validieren, aber der Server hat keine Nutzungsbedingungen.",
"Only continue if you trust the owner of the server.": "Fahre nur fort, wenn du den Betreibern des Servers vertraust.",
"Trust": "Vertrauen",
"Custom (%(level)s)": "Benutzerdefinierte (%(level)s)",
@@ -1368,7 +1368,7 @@
"%(num)s hours from now": "in %(num)s Stunden",
"about a day from now": "in etwa einem Tag",
"%(num)s days from now": "in %(num)s Tagen",
- "Show info about bridges in room settings": "Information über Bridges in den Raumeinstellungen anzeigen",
+ "Show info about bridges in room settings": "Information über Brücken in den Raumeinstellungen anzeigen",
"Enable message search in encrypted rooms": "Nachrichtensuche in verschlüsselten Räumen aktivieren",
"Lock": "Schloss",
"Later": "Später",
@@ -1380,9 +1380,9 @@
"Manage": "Verwalten",
"Securely cache encrypted messages locally for them to appear in search results.": "Speichere verschlüsselte Nachrichten lokal, sodass sie deinen Suchergebnissen erscheinen können.",
"Enable": "Aktivieren",
- "Connecting to integration manager...": "Verbinde mit Integrationsmanager...",
- "Cannot connect to integration manager": "Verbindung zum Integrationsmanager fehlgeschlagen",
- "The integration manager is offline or it cannot reach your homeserver.": "Der Integrationsmanager ist offline oder er kann den Heimserver nicht erreichen.",
+ "Connecting to integration manager...": "Verbinde mit Integrationsverwalter...",
+ "Cannot connect to integration manager": "Verbindung zum Integrationsverwalter fehlgeschlagen",
+ "The integration manager is offline or it cannot reach your homeserver.": "Der Integrationsverwalter ist offline oder er kann den Heimserver nicht erreichen.",
"not stored": "nicht gespeichert",
"Backup has a signature from unknown user with ID %(deviceId)s": "Die Sicherung hat eine Signatur von unbekanntem Nutzer mit ID %(deviceId)s",
"Backup key stored: ": "Backup Schlüssel gespeichert: ",
@@ -1394,10 +1394,10 @@
"wait and try again later": "warte und versuche es später erneut",
"Disconnect anyway": "Verbindung trotzdem trennen",
"You are still sharing your personal data on the identity server .": "Du teilst deine persönlichen Daten immer noch auf dem Identitätsserver .",
- "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Wir empfehlen, dass du deine Email Adressen und Telefonnummern vom Identitätsserver löschst, bevor du die Verbindung trennst.",
+ "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Wir empfehlen, dass du deine E-Mail-Adressen und Telefonnummern vom Identitätsserver löschst, bevor du die Verbindung trennst.",
"You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Zur Zeit benutzt du keinen Identitätsserver. Trage unten einen Server ein, um Kontakte finden und von anderen gefunden zu werden.",
- "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Nutze einen Integrationsmanager (%(serverName)s), um Bots, Widgets und Stickerpacks zu verwalten.",
- "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Verwende einen Integrationsmanager, um Bots, Widgets und Sticker Packs zu verwalten.",
+ "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Nutze einen Integrationsverwalter (%(serverName)s), um Bots, Widgets und Stickerpakete zu verwalten.",
+ "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Verwende einen Integrationsverwalter, um Bots, Widgets und Stickerpakete zu verwalten.",
"Manage integrations": "Integrationen verwalten",
"Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Stimme den Nutzungsbedingungen des Identitätsservers %(serverName)s zu, um dich per E-Mail-Adresse und Telefonnummer auffindbar zu machen.",
"Clear cache and reload": "Zwischenspeicher löschen und neu laden",
@@ -1416,25 +1416,25 @@
"View rules": "Regeln öffnen",
"You are currently subscribed to:": "Du abonnierst momentan:",
"⚠ These settings are meant for advanced users.": "⚠ Diese Einstellungen sind für fortgeschrittene Nutzer gedacht.",
- "Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Ob du %(brand)s auf einem Gerät verwendest, bei dem das Tasten die primäre Eingabemöglichkeit ist",
- "Whether you're using %(brand)s as an installed Progressive Web App": "Ob du %(brand)s als installierte progressive Web-App verwendest",
- "Your user agent": "Dein User-Agent",
+ "Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Ob du %(brand)s auf einem Gerät verwendest, bei dem die Berührung die primäre Eingabemöglichkeit ist",
+ "Whether you're using %(brand)s as an installed Progressive Web App": "Ob du %(brand)s als installierte progressive Web-App (PWA) verwendest",
+ "Your user agent": "Dein Useragent",
"If you cancel now, you won't complete verifying the other user.": "Wenn Sie jetzt abbrechen, werden Sie die Verifizierung des anderen Nutzers nicht beenden können.",
"If you cancel now, you won't complete verifying your other session.": "Wenn Sie jetzt abbrechen, werden Sie die Verifizierung der anderen Sitzung nicht beenden können.",
"Cancel entering passphrase?": "Eingabe der Passphrase abbrechen?",
"Setting up keys": "Einrichten der Schlüssel",
- "Encryption upgrade available": "Verschlüsselungs-Update verfügbar",
- "Verifies a user, session, and pubkey tuple": "Verifiziert einen Benutzer, eine Sitzung und Pubkey-Tupel",
+ "Encryption upgrade available": "Verschlüsselungsaufstufung verfügbar",
+ "Verifies a user, session, and pubkey tuple": "Verifiziert einen Benutzer, eine Sitzung und die öffentlichen Schlüsselpaare",
"Unknown (user, session) pair:": "Unbekanntes Nutzer-/Sitzungspaar:",
"Session already verified!": "Sitzung bereits verifiziert!",
"WARNING: Session already verified, but keys do NOT MATCH!": "WARNUNG: Die Sitzung wurde bereits verifiziert, aber die Schlüssel passen NICHT ZUSAMMEN!",
- "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ACHTUNG: SCHLÜSSEL-VERIFIZIERUNG FEHLGESCHLAGEN! Der Signierschlüssel für %(userId)s und Sitzung %(deviceId)s ist \"%(fprint)s\", was nicht mit dem bereitgestellten Schlüssel \"%(fingerprint)s\" übereinstimmt. Das könnte bedeuten, dass deine Kommunikation abgehört wird!",
+ "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ACHTUNG: SCHLÜSSELVERIFIZIERUNG FEHLGESCHLAGEN! Der Signierschlüssel für %(userId)s und Sitzung %(deviceId)s ist \"%(fprint)s\", was nicht mit dem bereitgestellten Schlüssel \"%(fingerprint)s\" übereinstimmt. Das könnte bedeuten, dass deine Kommunikation abgehört wird!",
"Never send encrypted messages to unverified sessions from this session": "Niemals verschlüsselte Nachrichten von dieser Sitzung zu unverifizierten Sitzungen senden",
"Never send encrypted messages to unverified sessions in this room from this session": "Niemals verschlüsselte Nachrichten von dieser Sitzung zu unverifizierten Sitzungen in diesem Raum senden",
- "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Durch die Änderung des Passworts werden derzeit alle Ende-zu-Ende-Verschlüsselungsschlüssel in allen Sitzungen zurückgesetzt, sodass der verschlüsselte Chat-Verlauf nicht mehr lesbar ist, es sei denn, du exportierst zuerst deine Raumschlüssel und importierst sie anschließend wieder. In Zukunft wird dies verbessert werden.",
+ "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Durch die Änderung des Passworts werden derzeit alle Ende-zu-Ende-Verschlüsselungsschlüssel in allen Sitzungen zurückgesetzt, sodass der verschlüsselte Chatverlauf nicht mehr lesbar ist, es sei denn, du exportierst zuerst deine Raumschlüssel und importierst sie anschließend wieder. In Zukunft wird dies verbessert werden.",
"Delete %(count)s sessions|other": "%(count)s Sitzungen löschen",
"Backup is not signed by any of your sessions": "Die Sicherung wurde von keiner deiner Sitzungen bestätigt",
- "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Dein Passwort wurde erfolgreich geändert. Du erhältst keine Push-Benachrichtigungen zu anderen Sitzungen, bis du dich wieder bei diesen anmeldest",
+ "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Dein Passwort wurde erfolgreich geändert. Du erhältst keine Puschbenachrichtigungen zu anderen Sitzungen, bis du dich wieder bei diesen anmeldest",
"Notification sound": "Benachrichtigungston",
"Set a new custom sound": "Benutzerdefinierten Ton setzen",
"Browse": "Durchsuchen",
@@ -1461,7 +1461,7 @@
"If your other sessions do not have the key for this message you will not be able to decrypt them.": "Wenn deine anderen Sitzungen nicht über den Schlüssel für diese Nachricht verfügen, kannst du die Nachricht nicht entschlüsseln.",
"Re-request encryption keys from your other sessions.": "Fordere die Schlüssel aus deinen anderen Sitzungen erneut an.",
"Room %(name)s": "Raum %(name)s",
- "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Ein Upgrade dieses Raums schaltet die aktuelle Instanz des Raums ab und erstellt einen aktualisierten Raum mit demselben Namen.",
+ "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Ein Aktualisierung dieses Raums deaktiviert die aktuelle Instanz des Raums und erstellt einen aktualisierten Raum mit demselben Namen.",
"%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) hat sich zu einer neuen Sitzung angemeldet, ohne sie zu verifizieren:",
"%(count)s verified sessions|other": "%(count)s verifizierte Sitzungen",
"Hide verified sessions": "Verifizierte Sitzungen ausblenden",
@@ -1594,7 +1594,7 @@
"This backup is trusted because it has been restored on this session": "Dieser Sicherung wird vertraut, da sie während dieser Sitzung wiederhergestellt wurde",
"Enable desktop notifications for this session": "Desktopbenachrichtigungen in dieser Sitzung",
"Enable audible notifications for this session": "Benachrichtigungstöne in dieser Sitzung",
- "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrationsmanager erhalten Konfigurationsdaten und können Widgets modifizieren, Raumeinladungen verschicken und in deinem Namen Berechtigungslevel setzen.",
+ "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrationsverwalter erhalten Konfigurationsdaten und können Widgets modifizieren, Raumeinladungen verschicken und in deinem Namen Berechtigungslevel setzen.",
"Read Marker lifetime (ms)": "Gültigkeitsdauer der Gelesen-Markierung (ms)",
"Read Marker off-screen lifetime (ms)": "Gültigkeitsdauer der Gelesen-Markierung außerhalb des Bildschirms (ms)",
"Session key:": "Sitzungsschlüssel:",
@@ -1609,7 +1609,7 @@
"The encryption used by this room isn't supported.": "Die von diesem Raum verwendete Verschlüsselung wird nicht unterstützt.",
"React": "Reagieren",
"e.g. my-room": "z.B. mein-raum",
- "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "Verwende einen Identitätsserver, um per E-Mail einzuladen. Nutze den Standard-Identitätsserver (%(defaultIdentityServerName)s) oder konfiguriere einen in den Einstellungen.",
+ "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "Verwende einen Identitätsserver, um per E-Mail einzuladen. Nutze den Standardidentitätsserver (%(defaultIdentityServerName)s) oder konfiguriere einen in den Einstellungen.",
"Use an identity server to invite by email. Manage in Settings.": "Verwende einen Identitätsserver, um mit einer E-Mail-Adresse einzuladen. Diese können in den Einstellungen konfiguriert werden.",
"Create a public room": "Öffentlichen Raum erstellen",
"Show advanced": "Erweiterte Einstellungen",
@@ -1633,11 +1633,11 @@
"Sends a message as html, without interpreting it as markdown": "Verschickt eine Nachricht im HTML-Format, ohne sie als Markdown zu darzustellen",
"Show rooms with unread notifications first": "Räume mit ungelesenen Benachrichtigungen zuerst zeigen",
"Show shortcuts to recently viewed rooms above the room list": "Kürzlich besuchte Räume anzeigen",
- "Use Single Sign On to continue": "Einmal-Anmeldung zum Fortfahren nutzen",
- "Confirm adding this email address by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte E-Mail-Adresse mit der Einmal-Anmeldung, um deine Identität nachzuweisen.",
- "Single Sign On": "Einmal-Anmeldung",
+ "Use Single Sign On to continue": "Einmalanmeldung zum Fortfahren nutzen",
+ "Confirm adding this email address by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte E-Mail-Adresse mit der Einmalanmeldung, um deine Identität nachzuweisen.",
+ "Single Sign On": "Einmalanmeldung",
"Confirm adding email": "Hinzugefügte E-Mail-Addresse bestätigen",
- "Confirm adding this phone number by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte Telefonnummer, indem du deine Identität mittels der Einmal-Anmeldung nachweist.",
+ "Confirm adding this phone number by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte Telefonnummer, indem du deine Identität mittels der Einmalanmeldung nachweist.",
"Click the button below to confirm adding this phone number.": "Klicke unten die Schaltfläche, um die hinzugefügte Telefonnummer zu bestätigen.",
"If you cancel now, you won't complete your operation.": "Wenn du jetzt abbrichst, wirst du deinen Vorgang nicht fertigstellen.",
"%(name)s is requesting verification": "%(name)s fordert eine Verifizierung an",
@@ -1676,14 +1676,14 @@
"Forgotten your password?": "Passwort vergessen?",
"You're signed out": "Du wurdest abgemeldet",
"Warning: Your personal data (including encryption keys) is still stored in this session. Clear it if you're finished using this session, or want to sign in to another account.": "Achtung: Deine persönlichen Daten (einschließlich Verschlüsselungsschlüssel) sind noch in dieser Sitzung gespeichert. Lösche diese Daten, wenn du diese Sitzung nicht mehr benötigst, oder dich mit einem anderen Konto anmelden möchtest.",
- "Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Melde dich mittels Single Sign-On an, um das Löschen der Sitzungen zu bestätigen.",
- "Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Melde dich mittels Single Sign-On an, um das Löschen der Sitzung zu bestätigen.",
+ "Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Melde dich mittels Einmalanmeldung an, um das Löschen der Sitzungen zu bestätigen.",
+ "Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Bestätige das Löschen dieser Sitzung mittels Einmalanmeldung um deine Identität nachzuweisen.",
"Confirm deleting these sessions": "Bestätige das Löschen dieser Sitzungen",
"Click the button below to confirm deleting these sessions.|other": "Klicke den Knopf, um das Löschen dieser Sitzungen zu bestätigen.",
"Click the button below to confirm deleting these sessions.|one": "Klicke den Knopf, um das Löschen dieser Sitzung zu bestätigen.",
"Clear all data in this session?": "Alle Daten dieser Sitzung löschen?",
"Clear all data": "Alle Daten löschen",
- "Confirm your account deactivation by using Single Sign On to prove your identity.": "Bestätige das Löschen deines Kontos indem du dich mittels Single Sign-On anmeldest um deine Identität nachzuweisen.",
+ "Confirm your account deactivation by using Single Sign On to prove your identity.": "Bestätige das Löschen deines Kontos indem du dich mittels Einmalanmeldung anmeldest um deine Identität nachzuweisen.",
"Confirm account deactivation": "Konto löschen bestätigen",
"Confirm your identity by entering your account password below.": "Bestätige deine Identität, indem du unten dein Kontopasswort eingibst.",
"Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.": "Bestätige deine Identität indem du diesen Login von einer deiner anderen Sitzungen verifizierst um Zugriff auf deine verschlüsselten Nachrichten zu erhalten.",
@@ -1710,21 +1710,21 @@
"eg: @bot:* or example.org": "z.B. @bot:* oder example.org",
"Subscribed lists": "Abonnierte Listen",
"Subscribing to a ban list will cause you to join it!": "Eine Verbotsliste abonnieren bedeutet ihr beizutreten!",
- "If this isn't what you want, please use a different tool to ignore users.": "Wenn dies nicht das ist, was du willst, verwende ein anderes Tool, um Benutzer zu blockieren.",
+ "If this isn't what you want, please use a different tool to ignore users.": "Wenn dies nicht das ist, was du willst, verwende ein anderes Werkzeug, um Benutzer zu blockieren.",
"Subscribe": "Abonnieren",
"Always show the window menu bar": "Fenstermenüleiste immer anzeigen",
"Show tray icon and minimize window to it on close": "Beim Schließen des Fensters in die Taskleiste minimieren",
"Session ID:": "Sitzungs-ID:",
"Message search": "Nachrichtensuche",
- "Cross-signing": "Cross-Signing",
+ "Cross-signing": "Quersignierung",
"This room is bridging messages to the following platforms. Learn more.": "Dieser Raum verbindet Nachrichten mit den folgenden Plattformen. Mehr erfahren.",
"This room isn’t bridging messages to any platforms. Learn more.": "Dieser Raum verbindet keine Nachrichten mit anderen Plattformen. Mehr erfahren.",
- "Bridges": "Bridges",
+ "Bridges": "Brücken",
"Uploaded sound": "Hochgeladener Ton",
"Upgrade this room to the recommended room version": "Aktualisiere diesen Raum auf die empfohlene Raumversion",
"this room": "Dieser Raum",
"View older messages in %(roomName)s.": "Zeige alte Nachrichten in %(roomName)s.",
- "Send a bug report with logs": "Einen Fehlerbericht mit Logs senden",
+ "Send a bug report with logs": "Einen Fehlerbericht mit der Protokolldatei senden",
"Verify all your sessions to ensure your account & messages are safe": "Verifiziere alle deine Sitzungen, um dein Konto und deine Nachrichten zu schützen",
"Verify your other session using one of the options below.": "Verifiziere deine andere Sitzung mit einer der folgenden Optionen.",
"You signed in to a new session without verifying it:": "Du hast dich in einer neuen Sitzung angemeldet ohne sie zu verifizieren:",
@@ -1732,29 +1732,29 @@
"Upgrade": "Hochstufen",
"Verify the new login accessing your account: %(name)s": "Verifiziere die neue Anmeldung an deinem Konto: %(name)s",
"From %(deviceName)s (%(deviceId)s)": "Von %(deviceName)s (%(deviceId)s)",
- "Your homeserver does not support cross-signing.": "Dein Heimserver unterstützt kein Cross-Signing.",
+ "Your homeserver does not support cross-signing.": "Dein Heimserver unterstützt keine Quersignierung.",
"Cross-signing and secret storage are enabled.": "Cross-signing und der sichere Speicher wurden eingerichtet.",
- "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Dein Konto hat eine Cross-Signing-Identität im sicheren Speicher, der von dieser Sitzung jedoch noch nicht vertraut wird.",
+ "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Dein Konto hat eine Quersignaturidentität im sicheren Speicher, der von dieser Sitzung jedoch noch nicht vertraut wird.",
"Cross-signing and secret storage are not yet set up.": "Cross-Signing und der sichere Speicher sind noch nicht eingerichtet.",
"Reset cross-signing and secret storage": "Cross-Signing und den sicheren Speicher zurücksetzen",
"Bootstrap cross-signing and secret storage": "Richte Cross-Signing und den sicheren Speicher ein",
"unexpected type": "unbekannter Typ",
- "Cross-signing public keys:": "Öffentliche Cross-Signing-Schlüssel:",
+ "Cross-signing public keys:": "Öffentlicher Quersignaturschlüssel:",
"in memory": "im Speicher",
- "Cross-signing private keys:": "Private Cross-Signing-Schlüssel:",
+ "Cross-signing private keys:": "Private Quersignaturschlüssel:",
"in secret storage": "im Schlüsselspeicher",
"Self signing private key:": "Selbst signierter privater Schlüssel:",
"cached locally": "lokal zwischengespeichert",
"not found locally": "lokal nicht gefunden",
- "User signing private key:": "Privater Benutzer-Schlüssel:",
+ "User signing private key:": "Privater Benutzerschlüssel:",
"Session backup key:": "Sitzungswiederherstellungsschlüssel:",
"Secret storage public key:": "Öffentlicher Schlüssel des sicheren Speichers:",
"in account data": "in den Kontodaten",
- "Homeserver feature support:": "Unterstützte Funktionen des Homeservers:",
+ "Homeserver feature support:": "Unterstützte Funktionen des Heimservers:",
"exists": "existiert",
"Delete sessions|other": "Sitzungen löschen",
"Delete sessions|one": "Sitzung löschen",
- "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Alle Sitzungen einzeln verifizieren, anstatt auch Sitzungen zu vertrauen, die durch Cross-Signing verifiziert sind.",
+ "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Alle Sitzungen einzeln verifizieren, anstatt auch Sitzungen zu vertrauen, die durch Quersignierungen verifiziert sind.",
"Securely cache encrypted messages locally for them to appear in search results, using ": "Der Zwischenspeicher für die lokale Suche in verschlüsselten Nachrichten benötigt ",
" to store messages from ": " um Nachrichten von ",
"%(brand)s is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom %(brand)s Desktop with search components added.": "Um verschlüsselte Nachrichten lokal zu durchsuchen, benötigt %(brand)s weitere Komponenten. Wenn du diese Funktion testen möchtest, kannst du dir deine eigene Version von %(brand)s Desktop mit der integrierten Suchfunktion kompilieren.",
@@ -1783,7 +1783,7 @@
"Share": "Teilen",
"You have not verified this user.": "Du hast diesen Nutzer nicht verifiziert.",
"Everyone in this room is verified": "Alle in diesem Raum sind verifiziert",
- "Mod": "Mod",
+ "Mod": "Moderator",
"Invite only": "Nur auf Einladung",
"Scroll to most recent messages": "Zur neusten Nachricht springen",
"No recent messages by %(user)s found": "Keine neuen Nachrichten von %(user)s gefunden",
@@ -1806,7 +1806,7 @@
"Re-join": "Wieder beitreten",
"You were banned from %(roomName)s by %(memberName)s": "Du wurdest von %(memberName)s aus %(roomName)s verbannt",
"Something went wrong with your invite to %(roomName)s": "Bei deiner Einladung zu %(roomName)s ist ein Fehler aufgetreten",
- "An error (%(errcode)s) was returned while trying to validate your invite. You could try to pass this information on to a room admin.": "Während der Verifizierung deiner Einladung ist ein Fehler (%(errcode)s) aufgetreten. Du kannst diese Information einem Raum-Administrator weitergeben.",
+ "An error (%(errcode)s) was returned while trying to validate your invite. You could try to pass this information on to a room admin.": "Während der Verifizierung deiner Einladung ist ein Fehler (%(errcode)s) aufgetreten. Du kannst diese Information einem Raumadministrator weitergeben.",
"You can only join it with a working invite.": "Du kannst nur mit einer gültigen Einladung beitreten.",
"Try to join anyway": "Dennoch versuchen beizutreten",
"You can still join it because this is a public room.": "Du kannst trotzdem beitreten, weil es ein öffentlicher Raum ist.",
@@ -1817,7 +1817,7 @@
"Share this email in Settings to receive invites directly in %(brand)s.": "Teile diese E-Mail-Adresse in den Einstellungen, um Einladungen direkt in %(brand)s zu erhalten.",
"%(roomName)s can't be previewed. Do you want to join it?": "Vorschau von %(roomName)s kann nicht angezeigt werden. Möchtest du den Raum betreten?",
"This room doesn't exist. Are you sure you're at the right place?": "Dieser Raum existiert nicht. Bist du sicher, dass du hier richtig bist?",
- "Try again later, or ask a room admin to check if you have access.": "Versuche es später erneut oder bitte einen Raum-Administrator zu prüfen, ob du berechtigt bist.",
+ "Try again later, or ask a room admin to check if you have access.": "Versuche es später erneut oder bitte einen Raumadministrator zu prüfen, ob du berechtigt bist.",
"%(errcode)s was returned while trying to access the room. If you think you're seeing this message in error, please submit a bug report.": "%(errcode)s wurde beim Versuch den Raum zu betreten, zurückgegeben. Wenn du denkst dass diese Meldung nicht korrekt ist, erstelle bitte einen Fehlerbericht.",
"%(count)s unread messages including mentions.|other": "%(count)s ungelesene Nachrichten einschließlich Erwähnungen.",
"%(count)s unread messages including mentions.|one": "1 ungelesene Erwähnung.",
@@ -1825,7 +1825,7 @@
"%(count)s unread messages.|one": "1 ungelesene Nachricht.",
"Unread mentions.": "Ungelesene Erwähnungen.",
"Unread messages.": "Ungelesene Nachrichten.",
- "This room has already been upgraded.": "Diese Raum wurde bereits aktualisiert.",
+ "This room has already been upgraded.": "Dieser Raum wurde bereits aktualisiert.",
"This room is running room version , which this homeserver has marked as unstable.": "Dieser Raum läuft mit der Raumversion , welche dieser Heimserver als instabil markiert hat.",
"Unknown Command": "Unbekannter Befehl",
"Unrecognised command: %(commandText)s": "Unbekannter Befehl: %(commandText)s",
@@ -1860,7 +1860,7 @@
"%(role)s in %(roomName)s": "%(role)s in %(roomName)s",
"This client does not support end-to-end encryption.": "Dieser Client unterstützt keine Ende-zu-Ende-Verschlüsselung.",
"Verify by scanning": "Verifizierung durch Scannen eines QR-Codes",
- "If you can't scan the code above, verify by comparing unique emoji.": "Wenn du den obigen Code nicht scannen kannst, verifiziere stattdessen durch den Emoji-Vergleich.",
+ "If you can't scan the code above, verify by comparing unique emoji.": "Wenn du den obigen Code nicht scannen kannst, verifiziere stattdessen durch den Emojivergleich.",
"Verify all users in a room to ensure it's secure.": "Verifiziere alle Benutzer in einem Raum um die vollständige Sicherheit zu gewährleisten.",
"In encrypted rooms, verify all users to ensure it’s secure.": "Verifiziere alle Benutzer in verschlüsselten Räumen, um die vollständige Sicherheit zu gewährleisten.",
"You've successfully verified %(deviceName)s (%(deviceId)s)!": "Du hast %(deviceName)s (%(deviceId)s) erfolgreich verifiziert!",
@@ -1890,13 +1890,13 @@
"Message deleted by %(name)s": "Nachricht von %(name)s gelöscht",
"Edited at %(date)s. Click to view edits.": "Am %(date)s geändert. Klicke, um Änderungen anzuzeigen.",
"Can't load this message": "Diese Nachricht kann nicht geladen werden",
- "Submit logs": "Log-Dateien senden",
+ "Submit logs": "Protokolldateien senden",
"Frequently Used": "Oft verwendet",
- "Smileys & People": "Smileys & Leute",
- "Animals & Nature": "Tiere & Natur",
- "Food & Drink": "Essen & Trinken",
+ "Smileys & People": "Smileys und Leute",
+ "Animals & Nature": "Tiere und Natur",
+ "Food & Drink": "Essen und Trinken",
"Activities": "Aktivitäten",
- "Travel & Places": "Reisen & Orte",
+ "Travel & Places": "Reisen und Orte",
"Objects": "Objekte",
"Symbols": "Symbole",
"Flags": "Flaggen",
@@ -1935,16 +1935,16 @@
"Server name": "Servername",
"Add a new server...": "Füge einen Server hinzu...",
"%(networkName)s rooms": "%(networkName)s Räume",
- "Matrix rooms": "Matrix Räume",
+ "Matrix rooms": "Matrixräume",
"Close dialog": "Dialog schließen",
- "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Bitte teile uns mit, was schief lief - oder besser, erstelle ein GitHub-Issue, das das Problem beschreibt.",
+ "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Bitte teile uns mit, was schief lief - oder besser, beschreibe das Problem auf GitHub in einem \"Issue\".",
"Reminder: Your browser is unsupported, so your experience may be unpredictable.": "Warnung: Dein Browser wird nicht unterstützt. Die Anwendung kann instabil sein.",
"Notes": "Notizen",
"If there is additional context that would help in analysing the issue, such as what you were doing at the time, room IDs, user IDs, etc., please include those things here.": "Wenn du mehr Informationen hast, die uns bei Untersuchung des Problems helfen (z.B. was du gerade getan hast, Raum-IDs, Benutzer-IDs, etc.), gib sie bitte hier an.",
"Removing…": "Löschen…",
"Destroy cross-signing keys?": "Cross-Signing-Schlüssel zerstören?",
"Clear cross-signing keys": "Cross-Signing-Schlüssel löschen",
- "Enable end-to-end encryption": "Ende-zu-Ende Verschlüsselung aktivieren",
+ "Enable end-to-end encryption": "Ende-zu-Ende-Verschlüsselung aktivieren",
"You can’t disable this later. Bridges & most bots won’t work yet.": "Du kannst dies später nicht mehr ändern. Bridges und die meisten Bots werden nicht funktionieren.",
"Server did not require any authentication": "Der Server benötigt keine Authentifizierung",
"Server did not return valid authentication information.": "Der Server lieferte keine gültigen Authentifizierungsinformationen.",
@@ -2149,7 +2149,7 @@
"Unable to query secret storage status": "Status des sicheren Speichers kann nicht gelesen werden",
"We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "Wir werden eine verschlüsselte Kopie deiner Schlüssel auf unserem Server speichern. Schütze deine Sicherung mit einer Wiederherstellungspassphrase.",
"Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "Ohne eine Schlüsselsicherung kann dein verschlüsselter Nachrichtenverlauf nicht wiederhergestellt werden wenn du dich abmeldest oder eine andere Sitzung verwendest.",
- "There was an error updating the room's alternative addresses. It may not be allowed by the server or a temporary failure occurred.": "Es gab einen Fehler beim Ändern des Raum-Aliases. Entweder erlaubt es der Server nicht oder es gab ein temporäres Problem.",
+ "There was an error updating the room's alternative addresses. It may not be allowed by the server or a temporary failure occurred.": "Es gab einen Fehler beim Ändern des Raumaliases. Entweder erlaubt es der Server nicht oder es gab ein temporäres Problem.",
"Self-verification request": "Selbstverifikationsanfrage",
"or another cross-signing capable Matrix client": "oder einen anderen Matrix Client der Cross-signing fähig ist",
"%(brand)s is securely caching encrypted messages locally for them to appear in search results:": "%(brand)s verwendet einen sicheren Zwischenspeicher für verschlüsselte Nachrichten, damit sie in den Suchergebnissen angezeigt werden:",
@@ -2185,7 +2185,7 @@
"Click the button below to confirm setting up encryption.": "Klick die Schaltfläche unten um die Einstellungen der Verschlüsselung zu bestätigen.",
"Font scaling": "Schriftskalierung",
"Font size": "Schriftgröße",
- "IRC display name width": "Breite des IRC Anzeigenamens",
+ "IRC display name width": "Breite des IRC-Anzeigenamens",
"Size must be a number": "Schriftgröße muss eine Zahl sein",
"Custom font size can only be between %(min)s pt and %(max)s pt": "Eigene Schriftgröße kann nur eine Zahl zwischen %(min)s pt und %(max)s pt sein",
"Use between %(min)s pt and %(max)s pt": "Verwende eine Zahl zwischen %(min)s pt und %(max)s pt",
@@ -2200,9 +2200,9 @@
"Help us improve %(brand)s": "Hilf uns, %(brand)s zu verbessern",
"Send anonymous usage data which helps us improve %(brand)s. This will use a cookie.": "Hilf uns, %(brand)s zu verbessern, indem du anonyme Nutzungsdaten schickst. Dies wird ein Cookie verwenden.",
"I want to help": "Ich möchte helfen",
- "Your homeserver has exceeded its user limit.": "Dein Heimserver hat das Benutzerlimit erreicht.",
+ "Your homeserver has exceeded its user limit.": "Dein Heimserver hat das Benutzergrenzwert erreicht.",
"Your homeserver has exceeded one of its resource limits.": "Dein Heimserver hat eine seiner Ressourcengrenzen erreicht.",
- "Contact your server admin.": "Kontaktiere deine Heimserver-Administration.",
+ "Contact your server admin.": "Kontaktiere deine Heimserveradministration.",
"Ok": "Ok",
"Set password": "Setze Passwort",
"To return to your account in future you need to set a password": "Um dein Konto zukünftig wieder verwenden zu können, setze ein Passwort",
@@ -2225,7 +2225,7 @@
"Address (optional)": "Adresse (optional)",
"delete the address.": "lösche die Adresse.",
"Use a different passphrase?": "Eine andere Passphrase verwenden?",
- "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "Deine Server-Administration hat die Ende-zu-Ende-Verschlüsselung für private Räume und Direktnachrichten standardmäßig deaktiviert.",
+ "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "Deine Serveradministration hat die Ende-zu-Ende-Verschlüsselung für private Räume und Direktnachrichten standardmäßig deaktiviert.",
"People": "Personen",
"There was an error removing that address. It may no longer exist or a temporary error occurred.": "Beim Entfernen dieser Adresse ist ein Fehler aufgetreten. Vielleicht existiert sie nicht mehr oder es kam zu einem temporären Fehler.",
"Set a room address to easily share your room with other people.": "Vergebe eine Raum-Adresse, um diesen Raum auf einfache Weise mit anderen Personen teilen zu können.",
@@ -2258,12 +2258,12 @@
"Dark": "Dunkel",
"Use the improved room list (will refresh to apply changes)": "Verwende die verbesserte Raumliste (lädt die Anwendung neu)",
"Use custom size": "Verwende individuelle Größe",
- "Hey you. You're the best!": "Hey du. Du bist der Beste!",
+ "Hey you. You're the best!": "Hey du. Du bist großartig.",
"Message layout": "Nachrichtenlayout",
"Compact": "Kompakt",
"Modern": "Modern",
"Use a system font": "Systemschriftart verwenden",
- "System font name": "System-Schriftart",
+ "System font name": "Systemschriftart",
"Customise your appearance": "Verändere das Erscheinungsbild",
"Appearance Settings only affect this %(brand)s session.": "Einstellungen zum Erscheinungsbild wirken sich nur auf diese Sitzung aus.",
"The authenticity of this encrypted message can't be guaranteed on this device.": "Die Echtheit dieser verschlüsselten Nachricht kann auf diesem Gerät nicht garantiert werden.",
@@ -2363,7 +2363,7 @@
"We’re excited to announce Riot is now Element!": "Wir freuen uns bekanntzugeben: Riot ist jetzt Element!",
"Learn more at element.io/previously-riot": "Erfahre mehr unter element.io/previously-riot",
"The person who invited you already left the room.": "Die Person, die dich eingeladen hat, hat den Raum bereits verlassen.",
- "The person who invited you already left the room, or their server is offline.": "Die Person, die dich eingeladen hat, hat den Raum bereits verlassen oder ihr Server ist offline.",
+ "The person who invited you already left the room, or their server is offline.": "Die Person, die dich eingeladen hat, hat den Raum bereits verlassen oder ihr Server ist nicht erreichbar bzw. aus.",
"Change notification settings": "Benachrichtigungseinstellungen ändern",
"Your server isn't responding to some requests.": "Dein Server antwortet auf einige Anfragen nicht.",
"Go to Element": "Zu Element gehen",
@@ -2429,7 +2429,7 @@
"Send %(count)s invites|other": "%(count)s Einladungen senden",
"There was an error creating your community. The name may be taken or the server is unable to process your request.": "Beim Erstellen deiner Community ist ein Fehler aufgetreten. Entweder ist der Name schon vergeben oder der Server kann die Anfrage nicht verarbeiten.",
"Community ID: +:%(domain)s": "Community-ID: +:%(domain)s",
- "Explore community rooms": "Entdecke Community Räume",
+ "Explore community rooms": "Entdecke Communityräume",
"You can change this later if needed.": "Falls nötig, kannst du es später noch ändern.",
"What's the name of your community or team?": "Welchen Namen hat deine Community oder dein Team?",
"Enter name": "Namen eingeben",
@@ -2445,8 +2445,8 @@
"Use this when referencing your community to others. The community ID cannot be changed.": "Verwende dies, um deine Community von andere referenzieren zu lassen. Die Community-ID kann später nicht geändert werden.",
"Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone.": "Private Räume können nur auf Einladung gefunden und betreten werden. Öffentliche Räume können von jedem gefunden und betreten werden.",
"Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.": "Private Räume können nur auf Einladung gefunden und betreten werden. Öffentliche Räume können von jedem in dieser Community gefunden und betreten werden.",
- "You might enable this if the room will only be used for collaborating with internal teams on your homeserver. This cannot be changed later.": "Du solltest dies aktivieren, wenn der Raum nur für die Zusammenarbeit mit Benutzern von deinem Homeserver verwendet werden soll. Dies kann später nicht mehr geändert werden.",
- "You might disable this if the room will be used for collaborating with external teams who have their own homeserver. This cannot be changed later.": "Du solltest dies deaktivieren, wenn der Raum für die Zusammenarbeit mit Benutzern von anderen Homeserver verwendet werden soll. Dies kann später nicht mehr geändert werden.",
+ "You might enable this if the room will only be used for collaborating with internal teams on your homeserver. This cannot be changed later.": "Du solltest dies aktivieren, wenn der Raum nur für die Zusammenarbeit mit Benutzern von deinem Heimserver verwendet werden soll. Dies kann später nicht mehr geändert werden.",
+ "You might disable this if the room will be used for collaborating with external teams who have their own homeserver. This cannot be changed later.": "Du solltest dies deaktivieren, wenn der Raum für die Zusammenarbeit mit Benutzern von anderen Heimserver verwendet werden soll. Dies kann später nicht mehr geändert werden.",
"Block anyone not part of %(serverName)s from ever joining this room.": "Betreten nur für Nutzer von %(serverName)s erlauben.",
"Privacy": "Privatsphäre",
"There was an error updating your community. The server is unable to process your request.": "Beim Aktualisieren deiner Community ist ein Fehler aufgetreten. Der Server kann deine Anfrage nicht verarbeiten.",
@@ -2478,9 +2478,9 @@
"Group call modified by %(senderName)s": "Gruppenanruf wurde von %(senderName)s verändert",
"Group call started by %(senderName)s": "Gruppenanruf von %(senderName)s gestartet",
"Group call ended by %(senderName)s": "Gruppenanruf wurde von %(senderName)s beendet",
- "Cross-signing is ready for use.": "Cross-Signing ist bereit zur Anwendung.",
- "Cross-signing is not set up.": "Cross-Signing wurde nicht eingerichtet.",
- "Backup version:": "Backup-Version:",
+ "Cross-signing is ready for use.": "Quersignaturen sind bereits in Anwendung.",
+ "Cross-signing is not set up.": "Quersignierung wurde nicht eingerichtet.",
+ "Backup version:": "Version der Sicherung:",
"Algorithm:": "Algorithmus:",
"Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Recovery Key.": "Sichere deine Verschlüsselungsschlüssel mit deinen Kontodaten, falls du den Zugriff auf deine Sitzungen verlierst. Deine Schlüssel werden mit einem eindeutigen Wiederherstellungsschlüssel gesichert.",
"Backup key stored:": "Sicherungsschlüssel gespeichert:",
@@ -2488,15 +2488,15 @@
"Secret storage:": "Sicherer Speicher:",
"ready": "bereit",
"not ready": "nicht bereit",
- "Secure Backup": "Sicheres Backup",
+ "Secure Backup": "Sichere Aufbewahrungskopie",
"End Call": "Anruf beenden",
"Remove the group call from the room?": "Konferenzgespräch aus diesem Raum entfernen?",
"You don't have permission to remove the call from the room": "Du hast keine Berechtigung um den Konferenzanruf aus dem Raum zu entfernen",
"Safeguard against losing access to encrypted messages & data": "Schütze dich vor dem Verlust verschlüsselter Nachrichten und Daten",
"not found in storage": "nicht im Speicher gefunden",
"Widgets": "Widgets",
- "Edit widgets, bridges & bots": "Widgets, Bridges & Bots bearbeiten",
- "Add widgets, bridges & bots": "Widgets, Bridges & Bots hinzufügen",
+ "Edit widgets, bridges & bots": "Widgets, Brücken und Bots bearbeiten",
+ "Add widgets, bridges & bots": "Widgets, Brücken und Bots hinzufügen",
"You can only pin 2 widgets at a time": "Du kannst jeweils nur 2 Widgets anheften",
"Minimize widget": "Widget minimieren",
"Maximize widget": "Widget maximieren",
@@ -2535,12 +2535,12 @@
"Hide Widgets": "Widgets verstecken",
"%(senderName)s declined the call.": "%(senderName)s hat den Anruf abgelehnt.",
"(an error occurred)": "(ein Fehler ist aufgetreten)",
- "(their device couldn't start the camera / microphone)": "(ihr/sein Gerät konnte Kamera oder Mikrophon nicht starten)",
+ "(their device couldn't start the camera / microphone)": "(Gerät des Gegenübers konnte Kamera oder Mikrofon nicht starten)",
"(connection failed)": "(Verbindung fehlgeschlagen)",
"🎉 All servers are banned from participating! This room can no longer be used.": "🎉 Alle Server sind von der Teilnahme ausgeschlossen! Dieser Raum kann nicht mehr genutzt werden.",
"%(senderDisplayName)s changed the server ACLs for this room.": "%(senderDisplayName)s hat die Server-ACLs für diesen Raum geändert.",
"%(senderDisplayName)s set the server ACLs for this room.": "%(senderDisplayName)s hat die Server-ACLs für diesen Raum gesetzt.",
- "The call was answered on another device.": "Der Anruf wurde an einem anderen Gerät angenommen.",
+ "The call was answered on another device.": "Der Anruf wurde auf einem anderen Gerät angenommen.",
"Answered Elsewhere": "Anderswo beantwortet",
"The call could not be established": "Der Anruf kann nicht getätigt werden",
"The other party declined the call.": "Die andere Seite hat den Anruf abgelehnt.",
@@ -2552,7 +2552,7 @@
"Report a bug": "Einen Fehler melden",
"Add comment": "Kommentar hinzufügen",
"Rate %(brand)s": "%(brand)s bewerten",
- "Feedback sent": "Feedback gesendet",
+ "Feedback sent": "Rückmeldung gesendet",
"Takes the call in the current room off hold": "Beendet das Halten des Anrufs",
"Places the call in the current room on hold": "Den aktuellen Anruf halten",
"Uzbekistan": "Usbekistan",
@@ -2616,12 +2616,12 @@
"New version of %(brand)s is available": "Neue Version von %(brand)s verfügbar",
"You ended the call": "Du hast den Anruf beendet",
"%(senderName)s ended the call": "%(senderName)s hat den Anruf beendet",
- "Use Command + Enter to send a message": "Benutze Betriebssystemtaste + Enter um eine Nachricht zu senden",
+ "Use Command + Enter to send a message": "Benutze Betriebssystemtaste + Eingabe um eine Nachricht zu senden",
"Use Ctrl + Enter to send a message": "Nachrichten mit Strg + Enter senden",
"Call Paused": "Anruf pausiert",
"Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "Verschlüsselte Nachrichten sicher lokal zwischenspeichern, um sie in Suchergebnissen finden zu können. Es werden %(size)s benötigt, um die Nachrichten von %(rooms)s Räumen zu speichern.",
"Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|one": "Verschlüsselte Nachrichten sicher lokal zwischenspeichern, um sie in Suchergebnissen finden zu können. Es werden %(size)s benötigt, um die Nachrichten vom Raum %(rooms)s zu speichern.",
- "Only the two of you are in this conversation, unless either of you invites anyone to join.": "Nur ihr zwei seid in dieser Konversation, außer ihr lädt jemanden neues ein.",
+ "Only the two of you are in this conversation, unless either of you invites anyone to join.": "Nur ihr zwei seid in dieser Konversation, außer ihr ladet jemanden Neues ein.",
"This is the beginning of your direct message history with .": "Dies ist der Beginn deiner Direktnachrichten mit .",
"Topic: %(topic)s (edit)": "Thema: %(topic)s (ändern)",
"Topic: %(topic)s ": "Thema: %(topic)s ",
@@ -2649,7 +2649,7 @@
"Decline All": "Alles ablehnen",
"Go to Home View": "Zur Startseite gehen",
"Filter rooms and people": "Räume und Personen filtern",
- "%(creator)s created this DM.": "%(creator)s hat diese DM erstellt.",
+ "%(creator)s created this DM.": "%(creator)s hat diese Direktnachricht erstellt.",
"Now, let's help you get started": "Nun, lassen Sie uns Ihnen den Einstieg erleichtern",
"Welcome %(name)s": "Willkommen %(name)s",
"Add a photo so people know it's you.": "Fügen Sie ein Foto hinzu, damit die Leute wissen, dass Sie es sind.",
@@ -2659,7 +2659,7 @@
"Enter email address": "E-Mail-Adresse eingeben",
"Open the link in the email to continue registration.": "Öffnen Sie den Link in der E-Mail, um mit der Registrierung fortzufahren.",
"A confirmation email has been sent to %(emailAddress)s": "Eine Bestätigungs-E-Mail wurde an %(emailAddress)s gesendet",
- "Use the + to make a new room or explore existing ones below": "Benutze das + um einen neuen Raum zu erstellen oder darunter um existierende Räume zu suchen",
+ "Use the + to make a new room or explore existing ones below": "Benutze das + um einen neuen Raum zu erstellen oder um existierende Räume zu entdecken",
"Return to call": "Zurück zum Anruf",
"Fill Screen": "Bildschirm ausfüllen",
"Voice Call": "Sprachanruf",
@@ -3023,7 +3023,7 @@
"Access your secure message history and set up secure messaging by entering your Security Key.": "Greife auf deinen sicheren Chatverlauf zu und richte die sichere Nachrichtenübermittlung ein, indem du deinen Sicherheitsschlüssel eingibst.",
"If you've forgotten your Security Phrase you can use your Security Key or set up new recovery options": "Wenn du deine Sicherheitsphrase vergessen hast, kannst du deinen Sicherheitsschlüssel nutzen oder neue Wiederherstellungsoptionen einrichten",
"Security Key mismatch": "Nicht übereinstimmende Sicherheitsschlüssel",
- "Set my room layout for everyone": "Dieses Raum-Layout für alle setzen",
+ "Set my room layout for everyone": "Diese Raumgestaltung für alle setzen",
"%(senderName)s has updated the widget layout": "%(senderName)s hat das Widget-Layout aktualisiert",
"Search (must be enabled)": "Suche (muss aktiviert sein)",
"Remember this": "Dies merken",
@@ -3038,10 +3038,10 @@
"Use app": "App verwenden",
"Element Web is experimental on mobile. For a better experience and the latest features, use our free native app.": "Element Web ist auf mobilen Endgeräten experimentell. Für eine bessere Erfahrung und die neuesten Erweiterungen, nutze unsere freie, native App.",
"Use app for a better experience": "Nutze die App für eine bessere Erfahrung",
- "We asked the browser to remember which homeserver you use to let you sign in, but unfortunately your browser has forgotten it. Go to the sign in page and try again.": "Wir haben deinen Browser gebeten, sich zu merken, bei welchem Homeserver du dich anmeldest, aber dein Browser hat dies leider vergessen. Gehe zur Anmeldeseite und versuche es erneut.",
- "Show stickers button": "Sticker-Schaltfläche",
- "Your homeserver rejected your log in attempt. This could be due to things just taking too long. Please try again. If this continues, please contact your homeserver administrator.": "Dein Homeserver hat deinen Anmeldeversuch abgelehnt. Vielleicht dauert der Prozess einfach zu lange. Bitte versuche es erneut. Wenn dies öfters passiert, wende dich bitte an deine Homeserver-Administration.",
- "Your homeserver was unreachable and was not able to log you in. Please try again. If this continues, please contact your homeserver administrator.": "Dein Homeserver war nicht erreichbar und konnte dich nicht anmelden. Bitte versuche es erneut. Wenn dies öfters passiert, wende dich bitte an deine Homeserver-Administration.",
+ "We asked the browser to remember which homeserver you use to let you sign in, but unfortunately your browser has forgotten it. Go to the sign in page and try again.": "Wir haben deinen Browser gebeten, sich zu merken, bei welchem Heimserver du dich anmeldest, aber dein Browser hat dies leider vergessen. Gehe zur Anmeldeseite und versuche es erneut.",
+ "Show stickers button": "Stickerschaltfläche",
+ "Your homeserver rejected your log in attempt. This could be due to things just taking too long. Please try again. If this continues, please contact your homeserver administrator.": "Dein Heimserver hat deinen Anmeldeversuch abgelehnt. Vielleicht dauert der Prozess einfach zu lange. Bitte versuche es erneut. Wenn dies öfters passiert, wende dich bitte an deine Heimserveradministrator.",
+ "Your homeserver was unreachable and was not able to log you in. Please try again. If this continues, please contact your homeserver administrator.": "Dein Heimserver war nicht erreichbar und konnte dich nicht anmelden. Bitte versuche es erneut. Wenn dies öfters passiert, wende dich bitte an deine Heimserveradministrator.",
"We couldn't log you in": "Wir konnten dich nicht anmelden",
"Windows": "Fenster",
"Screens": "Bildschirme",
@@ -3076,8 +3076,8 @@
"Settable at global": "Global einstellbar",
"Setting definition:": "Definition der Einstellung:",
"Value in this room": "Wert in diesem Raum",
- "Settings Explorer": "Einstellungs-Explorer",
- "Values at explicit levels": "Werte für explizite Levels",
+ "Settings Explorer": "Einstellungsdurchsucher",
+ "Values at explicit levels": "Werte für explizite Stufen",
"Settable at room": "Für den Raum einstellbar",
"Room name": "Raumname",
"%(count)s members|other": "%(count)s Mitglieder",
@@ -3122,7 +3122,7 @@
"Invite members": "Mitglieder einladen",
"Add some details to help people recognise it.": "Gib einige Infos über deinen neuen Space an.",
"Spaces are new ways to group rooms and people. To join an existing space you'll need an invite.": "Mit Matrix-Spaces kannst du Räume und Personen gruppieren. Um einen existierenden Space zu betreten, musst du eingeladen werden.",
- "Spaces prototype. Incompatible with Communities, Communities v2 and Custom Tags. Requires compatible homeserver for some features.": "Spaces Prototyp. Inkompatibel mit Communities, Communities v2 und Custom Tags. Für einige Features wird ein kompatibler Homeserver benötigt.",
+ "Spaces prototype. Incompatible with Communities, Communities v2 and Custom Tags. Requires compatible homeserver for some features.": "Spaces Prototyp. Inkompatibel mit Communities, Communities v2 und benutzerdefinierte Tags. Für einige Funktionen wird ein kompatibler Heimserver benötigt.",
"Invite to this space": "In diesen Space enladen",
"Verify this login to access your encrypted messages and prove to others that this login is really you.": "Verifiziere diese Anmeldung um deine Identität zu bestätigen und Zugriff auf verschlüsselte Nachrichten zu erhalten.",
"What projects are you working on?": "An welchen Projekten arbeitest du gerade?",
@@ -3204,5 +3204,47 @@
"Don't want to add an existing room?": "Willst du keinen existierenden Raum hinzufügen?",
"Edit devices": "Sitzungen anzeigen",
"Your private space ": "Dein privater Space ",
- "Your public space ": "Dein öffentlicher Space "
+ "Your public space ": "Dein öffentlicher Space ",
+ "Quick actions": "Schnellaktionen",
+ "We couldn't create your DM.": "Wir konnten deine Direktnachricht nicht erstellen.",
+ "Adding...": "Hinzufügen...",
+ "Add existing rooms": "Bestehende Räume hinzufügen",
+ "Space selection": "Matrix-Space-Auswahl",
+ "%(count)s people you know have already joined|one": "%(count)s Person, die du kennst, ist schon beigetreten",
+ "%(count)s people you know have already joined|other": "%(count)s Leute, die du kennst, sind bereits beigetreten",
+ "Accept on your other login…": "Akzeptiere in deiner anderen Anmeldung…",
+ "Stop & send recording": "Stoppen und Aufzeichnung senden",
+ "Record a voice message": "Eine Sprachnachricht aufnehmen",
+ "Invite messages are hidden by default. Click to show the message.": "Einladungsnachrichten sind standardmäßig ausgeblendet. Klicken um diese anzuzeigen.",
+ "Warn before quitting": "Vor Beenden warnen",
+ "Spell check dictionaries": "Wörterbücher für Rechtschreibprüfung",
+ "Space options": "Matrix-Space-Optionen",
+ "Manage & explore rooms": "Räume entdecken und verwalten",
+ "unknown person": "unbekannte Person",
+ "Send and receive voice messages (in development)": "Sprachnachrichten senden und empfangen (in der Entwicklung)",
+ "Check your devices": "Überprüfe dein Gerät",
+ "%(deviceId)s from %(ip)s": "%(deviceId)s von %(ip)s",
+ "This homeserver has been blocked by it's administrator.": "Dieser Heimserver wurde von seiner Administration blockiert.",
+ "You have unverified logins": "Du hast nicht-bestätigte Anmeldungen",
+ "Review to ensure your account is safe": "Überprüfen, um sicher zu sein, dass dein Konto sicher ist",
+ "Message search initilisation failed": "Initialisierung der Nachrichtensuche fehlgeschlagen",
+ "Support": "Unterstützen",
+ "This room is suggested as a good one to join": "Dieser Raum wurde als gut zum Beitreten vorgeschlagen",
+ "Your message wasn't sent because this homeserver has been blocked by it's administrator. Please contact your service administrator to continue using the service.": "Deine Nachricht wurde nicht versendet, weil dieser Heimserver von dessen Administrator gesperrt wurde. Bitte kontaktiere deinen Dienstadministrator um den Dienst weiterzunutzen.",
+ "Verification requested": "Verifizierung angefragt",
+ "Avatar": "Avatar",
+ "Verify other login": "Andere Anmeldung verifizieren",
+ "Invited people will be able to read old messages.": "Eingeladene Leute werden ältere Nachrichten lesen können.",
+ "Sends the given message as a spoiler": "Die gegebene Nachricht als Spoiler senden",
+ "Values at explicit levels in this room:": "Werte für explizite Stufen in diesem Raum:",
+ "Values at explicit levels:": "Werte für explizite Stufen:",
+ "Values at explicit levels in this room": "Werte für explizite Stufen in diesem Raum",
+ "Confirm abort of host creation": "Bestätige das Abbrechen der Host-Erstellung",
+ "Are you sure you wish to abort creation of the host? The process cannot be continued.": "Soll die Host-Erstellung wirklich abgebrochen werden? Dieser Prozess kann nicht wieder fortgesetzt werden.",
+ "Invite to just this room": "Nur für diesen Raum einladen",
+ "Consult first": "Konsultiere zuerst",
+ "Reset event store?": "Ereigniss-Speicher zurück setzen?",
+ "You most likely do not want to reset your event index store": "Es ist wahrscheinlich, dass du den Ereigniss-Index-Speicher nicht zurück setzen möchtest",
+ "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Falls du dies tust, werden keine deiner Nachrichten gelöscht. Allerdings wird die Such-Funktion eine Weile lang schlecht funktionieren, bis der Index wieder hergestellt ist",
+ "Reset event store": "Ereignis-Speicher zurück setzen"
}
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json
index ae9962600b..0fdc52c5e1 100644
--- a/src/i18n/strings/en_EN.json
+++ b/src/i18n/strings/en_EN.json
@@ -786,6 +786,7 @@
"%(senderName)s: %(stickerName)s": "%(senderName)s: %(stickerName)s",
"Change notification settings": "Change notification settings",
"Spaces prototype. Incompatible with Communities, Communities v2 and Custom Tags. Requires compatible homeserver for some features.": "Spaces prototype. Incompatible with Communities, Communities v2 and Custom Tags. Requires compatible homeserver for some features.",
+ "Show options to enable 'Do not disturb' mode": "Show options to enable 'Do not disturb' mode",
"Send and receive voice messages (in development)": "Send and receive voice messages (in development)",
"Render LaTeX maths in messages": "Render LaTeX maths in messages",
"Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.",
@@ -800,7 +801,6 @@
"Show message previews for reactions in DMs": "Show message previews for reactions in DMs",
"Show message previews for reactions in all rooms": "Show message previews for reactions in all rooms",
"Offline encrypted messaging using dehydrated devices": "Offline encrypted messaging using dehydrated devices",
- "Share decryption keys for room history when inviting users": "Share decryption keys for room history when inviting users",
"Enable advanced debugging for the room list": "Enable advanced debugging for the room list",
"Show info about bridges in room settings": "Show info about bridges in room settings",
"Font size": "Font size",
@@ -1362,6 +1362,7 @@
"Change topic": "Change topic",
"Upgrade the room": "Upgrade the room",
"Enable room encryption": "Enable room encryption",
+ "Change server ACLs": "Change server ACLs",
"Modify widgets": "Modify widgets",
"Failed to unban": "Failed to unban",
"Unban": "Unban",
@@ -1474,6 +1475,7 @@
"The conversation continues here.": "The conversation continues here.",
"This room has been replaced and is no longer active.": "This room has been replaced and is no longer active.",
"You do not have permission to post to this room": "You do not have permission to post to this room",
+ "%(seconds)ss left": "%(seconds)ss left",
"Bold": "Bold",
"Italics": "Italics",
"Strikethrough": "Strikethrough",
@@ -1579,7 +1581,6 @@
"Start chatting": "Start chatting",
"Do you want to join %(roomName)s?": "Do you want to join %(roomName)s?",
" invited you": " invited you",
- "Invite messages are hidden by default. Click to show the message.": "Invite messages are hidden by default. Click to show the message.",
"Reject": "Reject",
"Reject & Ignore user": "Reject & Ignore user",
"You're previewing %(roomName)s. Want to join it?": "You're previewing %(roomName)s. Want to join it?",
@@ -1916,16 +1917,20 @@
"Please create a new issue on GitHub so that we can investigate this bug.": "Please create a new issue on GitHub so that we can investigate this bug.",
"collapse": "collapse",
"expand": "expand",
+ "View all %(count)s members|other": "View all %(count)s members",
+ "View all %(count)s members|one": "View 1 member",
+ "Including %(commaSeparatedMembers)s": "Including %(commaSeparatedMembers)s",
+ "%(count)s members including %(commaSeparatedMembers)s|other": "%(count)s members including %(commaSeparatedMembers)s",
+ "%(count)s members including %(commaSeparatedMembers)s|one": "%(commaSeparatedMembers)s",
"%(count)s people you know have already joined|other": "%(count)s people you know have already joined",
"%(count)s people you know have already joined|one": "%(count)s person you know has already joined",
- "You cannot delete this image. (%(code)s)": "You cannot delete this image. (%(code)s)",
- "Uploaded on %(date)s by %(user)s": "Uploaded on %(date)s by %(user)s",
- "Rotate Left": "Rotate Left",
- "Rotate counter-clockwise": "Rotate counter-clockwise",
"Rotate Right": "Rotate Right",
- "Rotate clockwise": "Rotate clockwise",
- "Download this file": "Download this file",
+ "Rotate Left": "Rotate Left",
+ "Zoom out": "Zoom out",
+ "Zoom in": "Zoom in",
+ "Download": "Download",
"Information": "Information",
+ "View message": "View message",
"Language Dropdown": "Language Dropdown",
"%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s",
"%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)sjoined %(count)s times",
@@ -2016,6 +2021,7 @@
"Add existing rooms": "Add existing rooms",
"Filter your rooms and spaces": "Filter your rooms and spaces",
"Spaces": "Spaces",
+ "Direct Messages": "Direct Messages",
"Don't want to add an existing room?": "Don't want to add an existing room?",
"Create a new room": "Create a new room",
"Failed to add rooms to space": "Failed to add rooms to space",
@@ -2206,7 +2212,6 @@
"Suggestions": "Suggestions",
"May include members not in %(communityName)s": "May include members not in %(communityName)s",
"Recently Direct Messaged": "Recently Direct Messaged",
- "Direct Messages": "Direct Messages",
"Start a conversation with someone using their name, email address or username (like ).": "Start a conversation with someone using their name, email address or username (like ).",
"Start a conversation with someone using their name or username (like ).": "Start a conversation with someone using their name or username (like ).",
"This won't invite them to %(communityName)s. To invite someone to %(communityName)s, click here": "This won't invite them to %(communityName)s. To invite someone to %(communityName)s, click here",
@@ -2312,7 +2317,7 @@
"About homeservers": "About homeservers",
"Reset event store?": "Reset event store?",
"You most likely do not want to reset your event index store": "You most likely do not want to reset your event index store",
- "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated",
+ "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few moments whilst the index is recreated": "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few moments whilst the index is recreated",
"Reset event store": "Reset event store",
"Sign out and remove encryption keys?": "Sign out and remove encryption keys?",
"Clear Storage and Sign Out": "Clear Storage and Sign Out",
@@ -2378,6 +2383,10 @@
"Looks good!": "Looks good!",
"Wrong Security Key": "Wrong Security Key",
"Invalid Security Key": "Invalid Security Key",
+ "Forgotten or lost all recovery methods? Reset all": "Forgotten or lost all recovery methods? Reset all",
+ "Reset everything": "Reset everything",
+ "Only do this if you have no other device to complete verification with.": "Only do this if you have no other device to complete verification with.",
+ "If you reset everything, you will restart with no trusted sessions, no trusted users, and might not be able to see past messages.": "If you reset everything, you will restart with no trusted sessions, no trusted users, and might not be able to see past messages.",
"Security Phrase": "Security Phrase",
"Unable to access secret storage. Please verify that you entered the correct Security Phrase.": "Unable to access secret storage. Please verify that you entered the correct Security Phrase.",
"Enter your Security Phrase or to continue.": "Enter your Security Phrase or to continue.",
@@ -2554,6 +2563,7 @@
"Failed to reject invitation": "Failed to reject invitation",
"Cannot create rooms in this community": "Cannot create rooms in this community",
"You do not have permission to create rooms in this community.": "You do not have permission to create rooms in this community.",
+ "You are the only person here. If you leave, no one will be able to join in the future, including you.": "You are the only person here. If you leave, no one will be able to join in the future, including you.",
"This space is not public. You will not be able to rejoin without an invite.": "This space is not public. You will not be able to rejoin without an invite.",
"This room is not public. You will not be able to rejoin without an invite.": "This room is not public. You will not be able to rejoin without an invite.",
"Are you sure you want to leave the space '%(spaceName)s'?": "Are you sure you want to leave the space '%(spaceName)s'?",
@@ -2797,7 +2807,6 @@
"Your Security Key is a safety net - you can use it to restore access to your encrypted messages if you forget your Security Phrase.": "Your Security Key is a safety net - you can use it to restore access to your encrypted messages if you forget your Security Phrase.",
"Keep a copy of it somewhere secure, like a password manager or even a safe.": "Keep a copy of it somewhere secure, like a password manager or even a safe.",
"Your Security Key": "Your Security Key",
- "Download": "Download",
"Your Security Key has been copied to your clipboard, paste it to:": "Your Security Key has been copied to your clipboard, paste it to:",
"Your Security Key is in your Downloads folder.": "Your Security Key is in your Downloads folder.",
"Print it and store it somewhere safe": "Print it and store it somewhere safe",
diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json
index a1275fb089..003da7ef8f 100644
--- a/src/i18n/strings/en_US.json
+++ b/src/i18n/strings/en_US.json
@@ -650,5 +650,12 @@
"Error upgrading room": "Error upgrading room",
"Double check that your server supports the room version chosen and try again.": "Double check that your server supports the room version chosen and try again.",
"Changes the avatar of the current room": "Changes the avatar of the current room",
- "Changes your avatar in all rooms": "Changes your avatar in all rooms"
+ "Changes your avatar in all rooms": "Changes your avatar in all rooms",
+ "Favourited": "Favorited",
+ "Explore rooms": "Explore rooms",
+ "Click the button below to confirm adding this email address.": "Click the button below to confirm adding this email address.",
+ "Confirm adding email": "Confirm adding email",
+ "Single Sign On": "Single Sign On",
+ "Confirm adding this email address by using Single Sign On to prove your identity.": "Confirm adding this email address by using Single Sign On to prove your identity.",
+ "Use Single Sign On to continue": "Use Single Sign On to continue"
}
diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json
index c6e84570d6..d396cc318f 100644
--- a/src/i18n/strings/es.json
+++ b/src/i18n/strings/es.json
@@ -3188,5 +3188,42 @@
"From %(deviceName)s (%(deviceId)s) at %(ip)s": "De %(deviceName)s (%(deviceId)s) en",
"Check your devices": "Comprueba tus dispositivos",
"A new login is accessing your account: %(name)s (%(deviceID)s) at %(ip)s": "Alguien está iniciando sesión a tu cuenta: %(name)s (%(deviceID)s) en %(ip)s",
- "You have unverified logins": "Tienes inicios de sesión sin verificar"
+ "You have unverified logins": "Tienes inicios de sesión sin verificar",
+ "Verification requested": "Verificación solicitada",
+ "Avatar": "Imagen de perfil",
+ "Verify other login": "Verificar otro inicio de sesión",
+ "Consult first": "Consultar primero",
+ "Invited people will be able to read old messages.": "Las personas invitadas podrán leer mensajes antiguos.",
+ "We couldn't create your DM.": "No hemos podido crear tu mensaje directo.",
+ "Adding...": "Añadiendo...",
+ "Add existing rooms": "Añadir salas existentes",
+ "%(count)s people you know have already joined|one": "%(count)s persona que ya conoces se ha unido",
+ "%(count)s people you know have already joined|other": "%(count)s personas que ya conoces se han unido",
+ "Accept on your other login…": "Acepta en tu otro inicio de sesión…",
+ "Stop & send recording": "Parar y enviar grabación",
+ "Record a voice message": "Grabar un mensaje de voz",
+ "Quick actions": "Acciones rápidas",
+ "Invite to just this room": "Invitar solo a esta sala",
+ "Warn before quitting": "Avisar antes de salir",
+ "Manage & explore rooms": "Gestionar y explorar salas",
+ "unknown person": "persona desconocida",
+ "Share decryption keys for room history when inviting users": "Compartir claves para descifrar el historial de la sala al invitar a gente",
+ "Send and receive voice messages (in development)": "Enviar y recibir mensajes de voz (en desarrollo)",
+ "%(deviceId)s from %(ip)s": "%(deviceId)s desde %(ip)s",
+ "Review to ensure your account is safe": "Revisa que tu cuenta esté segura",
+ "Sends the given message as a spoiler": "Envía el mensaje como un spoiler",
+ "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "Consultando a %(transferTarget)s. Transferir a %(transferee)s",
+ "Message search initilisation failed": "Ha fallado la inicialización de la búsqueda de mensajes",
+ "Reset event store?": "¿Restablecer almacenamiento de eventos?",
+ "You most likely do not want to reset your event index store": "Lo más probable es que no quieras restablecer tu almacenamiento de índice de ecentos",
+ "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Si lo haces, ten en cuenta que no se borrarán tus mensajes, pero la experiencia de búsqueda será peor durante unos momentos mientras se recrea el índice",
+ "Reset event store": "Restablecer el almacenamiento de eventos",
+ "What are some things you want to discuss in %(spaceName)s?": "¿De qué quieres hablar en %(spaceName)s?",
+ "Let's create a room for each of them.": "Crearemos una sala para cada uno.",
+ "You can add more later too, including already existing ones.": "Puedes añadir más después, incluso si ya existen.",
+ "Please choose a strong password": "Por favor, elige una contraseña segura",
+ "Use another login": "Usar otro inicio de sesión",
+ "Verify your identity to access encrypted messages and prove your identity to others.": "Verifica tu identidad para acceder a mensajes cifrados y probar tu identidad a otros.",
+ "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Si no verificas no tendrás acceso a todos tus mensajes y puede que aparezcas como no confiable para otros usuarios.",
+ "Invite messages are hidden by default. Click to show the message.": "Los mensajes de invitación no se muestran por defecto. Haz clic para mostrarlo."
}
diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json
index 85f8cbb751..444475deea 100644
--- a/src/i18n/strings/et.json
+++ b/src/i18n/strings/et.json
@@ -2517,7 +2517,7 @@
"Join the conference from the room information card on the right": "Liitu konverentsiga selle jututoa infolehelt paremal",
"Video conference ended by %(senderName)s": "%(senderName)s lõpetas video rühmakõne",
"Video conference updated by %(senderName)s": "%(senderName)s uuendas video rühmakõne",
- "Video conference started by %(senderName)s": "%(senderName)s alustas video rühmakõne",
+ "Video conference started by %(senderName)s": "%(senderName)s alustas video rühmakõnet",
"End conference": "Lõpeta videokonverents",
"This will end the conference for everyone. Continue?": "Sellega lõpetame kõikide osalejate jaoks videokonverentsi. Nõus?",
"Ignored attempt to disable encryption": "Eirasin katset lõpetada krüptimise kasutamine",
@@ -3226,5 +3226,42 @@
"Open": "Ava",
"Check your devices": "Kontrolli oma seadmeid",
"A new login is accessing your account: %(name)s (%(deviceID)s) at %(ip)s": "Uus sisselogimissessioon kasutab sinu Matrixi kontot: %(name)s %(deviceID)s aadressil %(ip)s",
- "You have unverified logins": "Sul on verifitseerimata sisselogimissessioone"
+ "You have unverified logins": "Sul on verifitseerimata sisselogimissessioone",
+ "Manage & explore rooms": "Halda ja uuri jututubasid",
+ "Warn before quitting": "Hoiata enne rakenduse töö lõpetamist",
+ "Invite to just this room": "Kutsi vaid siia jututuppa",
+ "Quick actions": "Kiirtoimingud",
+ "Adding...": "Lisan...",
+ "Sends the given message as a spoiler": "Saadab selle sõnumi rõõmurikkujana",
+ "unknown person": "tundmatu isik",
+ "Send and receive voice messages (in development)": "Saada ja võta vastu häälsõnumeid (arendusjärgus)",
+ "%(deviceId)s from %(ip)s": "%(deviceId)s ip-aadressil %(ip)s",
+ "Review to ensure your account is safe": "Tagamaks, et su konto on sinu kontrolli all, vaata andmed üle",
+ "Share decryption keys for room history when inviting users": "Kasutajate kutsumisel jaga jututoa ajaloo võtmeid",
+ "Record a voice message": "Salvesta häälsõnum",
+ "Stop & send recording": "Lõpeta salvestamine ja saada häälsõnum",
+ "Add existing rooms": "Lisa olemasolevaid jututubasid",
+ "%(count)s people you know have already joined|other": "%(count)s sulle tuttavat kasutajat on juba liitunud",
+ "We couldn't create your DM.": "Otsesuhtluse loomine ei õnnestunud.",
+ "Invited people will be able to read old messages.": "Kutse saanud kasutajad saavad lugeda vanu sõnumeid.",
+ "Consult first": "Pea esmalt nõu",
+ "Reset event store?": "Kas lähtestame sündmuste andmekogu?",
+ "Reset event store": "Lähtesta sündmuste andmekogu",
+ "Verify other login": "Verifitseeri muu sisselogimissessioon",
+ "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "Suhtlen teise osapoolega %(transferTarget)s. Saadan andmeid kasutajale %(transferee)s",
+ "Message search initilisation failed": "Sõnumite otsingu alustamine ei õnnestunud",
+ "Invite messages are hidden by default. Click to show the message.": "Kutsed on vaikimisi peidetud. Sõnumi nägemiseks klõpsi.",
+ "Accept on your other login…": "Nõustu oma teise sisselogimissessiooniga…",
+ "Avatar": "Tunnuspilt",
+ "Verification requested": "Verifitseerimistaotlus on saadetud",
+ "%(count)s people you know have already joined|one": "%(count)s sulle tuttav kasutaja on juba liitunud",
+ "You most likely do not want to reset your event index store": "Pigem sa siiski ei taha lähtestada sündmuste andmekogu ja selle indeksit",
+ "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Kui sa siiski soovid seda teha, siis sinu sõnumeid me ei kustuta, aga seniks kuni sõnumite indeks taustal uuesti luuakse, toimib otsing aeglaselt ja ebatõhusalt",
+ "You can add more later too, including already existing ones.": "Sa võid ka hiljem siia luua uusi jututubasid või lisada olemasolevaid.",
+ "What are some things you want to discuss in %(spaceName)s?": "Mida sa sooviksid arutada %(spaceName)s kogukonnakeskuses?",
+ "Please choose a strong password": "Palun tee üks korralik salasõna",
+ "Use another login": "Pruugi muud kasutajakontot",
+ "Verify your identity to access encrypted messages and prove your identity to others.": "Tagamaks ligipääsu oma krüptitud sõnumitele ja tõestamaks oma isikut teistele kasutajatale, verifitseeri end.",
+ "Let's create a room for each of them.": "Teeme siis iga teema jaoks oma jututoa.",
+ "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Ilma verifitseerimiseta sul puudub ligipääs kõikidele oma sõnumitele ning teised ei näe sinu kasutajakontot usaldusväärsena."
}
diff --git a/src/i18n/strings/fa.json b/src/i18n/strings/fa.json
index 738f48733c..d036a55c23 100644
--- a/src/i18n/strings/fa.json
+++ b/src/i18n/strings/fa.json
@@ -311,5 +311,8 @@
"Your device resolution": "وضوح دستگاه شما",
"e.g. ": "برای مثال ",
"Every page you use in the app": "هر صفحهی برنامه از که آن استفاده میکنید",
- "e.g. %(exampleValue)s": "برای مثال %(exampleValue)s"
+ "e.g. %(exampleValue)s": "برای مثال %(exampleValue)s",
+ "Explore rooms": "کاوش اتاق",
+ "Sign In": "ورود",
+ "Create Account": "ایجاد اکانت"
}
diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json
index 01390329bb..fcc5ec9afe 100644
--- a/src/i18n/strings/fr.json
+++ b/src/i18n/strings/fr.json
@@ -3225,5 +3225,42 @@
"From %(deviceName)s (%(deviceId)s) at %(ip)s": "Sur %(deviceName)s %(deviceId)s depuis %(ip)s",
"Check your devices": "Vérifiez vos appareils",
"A new login is accessing your account: %(name)s (%(deviceID)s) at %(ip)s": "Une nouvelle session a accès à votre compte : %(name)s %(deviceID)s depuis %(ip)s",
- "You have unverified logins": "Vous avez des sessions non-vérifiées"
+ "You have unverified logins": "Vous avez des sessions non-vérifiées",
+ "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Sans vérification vous n’aurez pas accès à tous vos messages et n’apparaîtrez pas comme de confiance aux autres.",
+ "Verify your identity to access encrypted messages and prove your identity to others.": "Vérifiez votre identité pour accéder aux messages chiffrés et prouver votre identité aux autres.",
+ "Use another login": "Utiliser un autre identifiant",
+ "Please choose a strong password": "Merci de choisir un mot de passe fort",
+ "You can add more later too, including already existing ones.": "Vous pourrez en ajouter plus tard, y compris certains déjà existant.",
+ "Let's create a room for each of them.": "Créons un salon pour chacun d’entre eux.",
+ "What are some things you want to discuss in %(spaceName)s?": "De quoi voulez vous discuter dans %(spaceName)s ?",
+ "Verification requested": "Vérification requise",
+ "Avatar": "Avatar",
+ "Verify other login": "Vérifier l’autre connexion",
+ "Reset event store": "Réinitialiser le magasin d’événements",
+ "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Si vous le faites, notes qu’aucun de vos messages ne sera supprimé, mais la recherche pourrait être dégradée pendant quelques instants, le temps de recréer l’index",
+ "You most likely do not want to reset your event index store": "Il est probable que vous ne vouliez pas réinitialiser votre magasin d’index d’événements",
+ "Reset event store?": "Réinitialiser le magasin d’événements ?",
+ "Consult first": "Consulter d’abord",
+ "Invited people will be able to read old messages.": "Les personnes invitées pourront lire les anciens messages.",
+ "We couldn't create your DM.": "Nous n’avons pas pu créer votre message direct.",
+ "Adding...": "Ajout…",
+ "Add existing rooms": "Ajouter des salons existants",
+ "%(count)s people you know have already joined|one": "%(count)s personne que vous connaissez en fait déjà partie",
+ "%(count)s people you know have already joined|other": "%(count)s personnes que vous connaissez en font déjà partie",
+ "Accept on your other login…": "Acceptez sur votre autre connexion…",
+ "Stop & send recording": "Terminer et envoyer l’enregistrement",
+ "Record a voice message": "Enregistrer un message vocal",
+ "Invite messages are hidden by default. Click to show the message.": "Les messages d’invitation sont masqués par défaut. Cliquez pour voir le message.",
+ "Quick actions": "Actions rapides",
+ "Invite to just this room": "Inviter seulement dans ce salon",
+ "Warn before quitting": "Avertir avant de quitter",
+ "Message search initilisation failed": "Échec de l’initialisation de la recherche de message",
+ "Manage & explore rooms": "Gérer et découvrir les salons",
+ "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "Consultation avec %(transferTarget)s. Transfert à %(transferee)s",
+ "unknown person": "personne inconnue",
+ "Share decryption keys for room history when inviting users": "Partager les clés de déchiffrement lors de l’invitation d’utilisateurs",
+ "Send and receive voice messages (in development)": "Envoyez et recevez des messages vocaux (en développement)",
+ "%(deviceId)s from %(ip)s": "%(deviceId)s depuis %(ip)s",
+ "Review to ensure your account is safe": "Vérifiez pour assurer la sécurité de votre compte",
+ "Sends the given message as a spoiler": "Envoie le message flouté"
}
diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json
index 026207030e..f6ebce684f 100644
--- a/src/i18n/strings/gl.json
+++ b/src/i18n/strings/gl.json
@@ -3248,5 +3248,42 @@
"From %(deviceName)s (%(deviceId)s) at %(ip)s": "Desde %(deviceName)s%(deviceId)s en %(ip)s",
"Check your devices": "Comproba os teus dispositivos",
"A new login is accessing your account: %(name)s (%(deviceID)s) at %(ip)s": "Hai unha nova conexión á túa conta: %(name)s %(deviceID)s desde %(ip)s",
- "You have unverified logins": "Tes conexións sen verificar"
+ "You have unverified logins": "Tes conexións sen verificar",
+ "Sends the given message as a spoiler": "Envía a mensaxe dada como un spoiler",
+ "Review to ensure your account is safe": "Revisa para asegurarte de que a túa conta está protexida",
+ "Share decryption keys for room history when inviting users": "Comparte chaves de descifrado para o historial da sala ao convidar usuarias",
+ "Warn before quitting": "Aviso antes de saír",
+ "Invite to just this room": "Convida só a esta sala",
+ "Stop & send recording": "Deter e enviar e a gravación",
+ "We couldn't create your DM.": "Non puidemos crear o teu MD.",
+ "Invited people will be able to read old messages.": "As persoas convidadas poderán ler as mensaxes antigas.",
+ "Reset event store?": "Restablecer almacenaxe do evento?",
+ "You most likely do not want to reset your event index store": "Probablemente non queiras restablecer o índice de almacenaxe do evento",
+ "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Se o fas, ten en conta que ningunha das mensaxes será eliminada, pero a experiencia de busca podería degradarse durante o tempo en que o índice volve a crearse",
+ "Avatar": "Avatar",
+ "Please choose a strong password": "Escolle un contrasinal forte",
+ "Verify your identity to access encrypted messages and prove your identity to others.": "Verifica a túa identidade para acceder a mensaxes cifradas e acreditar a túa identidade ante outras.",
+ "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Sen verificación, non terás acceso a tódalas túas mensaxes e poderías aparecer antes outras como non confiable.",
+ "%(deviceId)s from %(ip)s": "%(deviceId)s desde %(ip)s",
+ "Send and receive voice messages (in development)": "Enviar e recibir mensaxes de voz (en desenvolvemento)",
+ "unknown person": "persoa descoñecida",
+ "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "Consultando con %(transferTarget)s. Transferir a %(transferee)s",
+ "Manage & explore rooms": "Xestionar e explorar salas",
+ "Message search initilisation failed": "Fallo a inicialización da busca de mensaxes",
+ "Quick actions": "Accións rápidas",
+ "Invite messages are hidden by default. Click to show the message.": "As mensaxes de convite están agochadas por defecto. Preme para amosar a mensaxe.",
+ "Record a voice message": "Gravar mensaxe de voz",
+ "Accept on your other login…": "Acepta na túa outra sesión…",
+ "%(count)s people you know have already joined|other": "%(count)s persoas que coñeces xa se uniron",
+ "%(count)s people you know have already joined|one": "%(count)s persoa que coñeces xa se uniu",
+ "Add existing rooms": "Engadir salas existentes",
+ "Adding...": "Engadindo...",
+ "Consult first": "Preguntar primeiro",
+ "Reset event store": "Restablecer almacenaxe de eventos",
+ "Verify other login": "Verificar outra conexión",
+ "Verification requested": "Verificación solicitada",
+ "What are some things you want to discuss in %(spaceName)s?": "Sobre que temas queres conversar en %(spaceName)s?",
+ "Let's create a room for each of them.": "Crea unha sala para cada un deles.",
+ "You can add more later too, including already existing ones.": "Podes engadir máis posteriormente, incluíndo os xa existentes.",
+ "Use another login": "Usar outra conexión"
}
diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json
index dda9902e72..5baa1d7c67 100644
--- a/src/i18n/strings/he.json
+++ b/src/i18n/strings/he.json
@@ -52,7 +52,7 @@
"Operation failed": "פעולה נכשלה",
"Search": "חפש",
"Custom Server Options": "הגדרות שרת מותאמות אישית",
- "Dismiss": "שחרר",
+ "Dismiss": "התעלם",
"powered by Matrix": "מופעל ע\"י Matrix",
"Error": "שגיאה",
"Remove": "הסר",
diff --git a/src/i18n/strings/hi.json b/src/i18n/strings/hi.json
index 75b14cca18..f71c024342 100644
--- a/src/i18n/strings/hi.json
+++ b/src/i18n/strings/hi.json
@@ -585,5 +585,8 @@
"You cannot modify widgets in this room.": "आप इस रूम में विजेट्स को संशोधित नहीं कर सकते।",
"%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s ने कमरे में शामिल होने के लिए %(targetDisplayName)s के निमंत्रण को रद्द कर दिया।",
"User %(userId)s is already in the room": "उपयोगकर्ता %(userId)s पहले से ही रूम में है",
- "The user must be unbanned before they can be invited.": "उपयोगकर्ता को आमंत्रित करने से पहले उन्हें प्रतिबंधित किया जाना चाहिए।"
+ "The user must be unbanned before they can be invited.": "उपयोगकर्ता को आमंत्रित करने से पहले उन्हें प्रतिबंधित किया जाना चाहिए।",
+ "Explore rooms": "रूम का अन्वेषण करें",
+ "Sign In": "साइन करना",
+ "Create Account": "खाता बनाएं"
}
diff --git a/src/i18n/strings/hr.json b/src/i18n/strings/hr.json
index 527b86e0a7..2511771578 100644
--- a/src/i18n/strings/hr.json
+++ b/src/i18n/strings/hr.json
@@ -4,5 +4,6 @@
"Failed to verify email address: make sure you clicked the link in the email": "Nismo u mogućnosti verificirati Vašu email adresu. Provjerite dali ste kliknuli link u mailu",
"The platform you're on": "Platforma na kojoj se nalazite",
"The version of %(brand)s": "Verzija %(brand)s",
- "Your language of choice": "Izabrani jezik"
+ "Your language of choice": "Izabrani jezik",
+ "Dismiss": "Odbaci"
}
diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json
index eaa77e809d..2ec5af8a17 100644
--- a/src/i18n/strings/hu.json
+++ b/src/i18n/strings/hu.json
@@ -3243,5 +3243,42 @@
"From %(deviceName)s (%(deviceId)s) at %(ip)s": "Innen: %(deviceName)s (%(deviceId)s), %(ip)s",
"Check your devices": "Ellenőrizze az eszközeit",
"A new login is accessing your account: %(name)s (%(deviceID)s) at %(ip)s": "Új bejelentkezéssel hozzáférés történik a fiókjához: %(name)s (%(deviceID)s), %(ip)s",
- "You have unverified logins": "Ellenőrizetlen bejelentkezései vannak"
+ "You have unverified logins": "Ellenőrizetlen bejelentkezései vannak",
+ "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Az ellenőrzés nélkül nem fér hozzá az összes üzenetéhez és mások számára megbízhatatlannak fog látszani.",
+ "Verify your identity to access encrypted messages and prove your identity to others.": "Ellenőrizze a személyazonosságát, hogy hozzáférjen a titkosított üzeneteihez és másoknak is bizonyítani tudja személyazonosságát.",
+ "Use another login": "Másik munkamenet használata",
+ "Please choose a strong password": "Kérem válasszon erős jelszót",
+ "You can add more later too, including already existing ones.": "Később is hozzáadhat többet, beleértve meglévőket is.",
+ "Let's create a room for each of them.": "Készítsünk szobát mindhez.",
+ "What are some things you want to discuss in %(spaceName)s?": "Mik azok amikről beszélni szeretne itt: %(spaceName)s?",
+ "Verification requested": "Hitelesítés kérés elküldve",
+ "Avatar": "Profilkép",
+ "Verify other login": "Másik munkamenet ellenőrzése",
+ "Reset event store": "Az esemény tárolót alaphelyzetbe állítása",
+ "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Ha ezt teszi, tudnia kell, hogy az üzenetek nem kerülnek törlésre de keresés nem lesz tökéletes amíg az indexek nem készülnek el újra",
+ "You most likely do not want to reset your event index store": "Az esemény index tárolót nagy valószínűséggel nem szeretné alaphelyzetbe állítani",
+ "Reset event store?": "Az esemény tárolót alaphelyzetbe állítja?",
+ "Consult first": "Kérjen először véleményt",
+ "Invited people will be able to read old messages.": "A meghívott személyek el tudják olvasni a régi üzeneteket.",
+ "We couldn't create your DM.": "Nem tudjuk elkészíteni a közvetlen üzenetét.",
+ "Adding...": "Hozzáadás…",
+ "Add existing rooms": "Létező szobák hozzáadása",
+ "%(count)s people you know have already joined|one": "%(count)s ismerős már csatlakozott",
+ "%(count)s people you know have already joined|other": "%(count)s ismerős már csatlakozott",
+ "Accept on your other login…": "Egy másik bejelentkezésében fogadta el…",
+ "Stop & send recording": "Megállít és a felvétel elküldése",
+ "Record a voice message": "Hang üzenet felvétele",
+ "Invite messages are hidden by default. Click to show the message.": "A meghívók alapesetben rejtve vannak. A megjelenítéshez kattintson.",
+ "Quick actions": "Gyors műveletek",
+ "Invite to just this room": "Meghívás csak ebbe a szobába",
+ "Warn before quitting": "Kilépés előtt figyelmeztet",
+ "Message search initilisation failed": "Üzenet keresés beállítása sikertelen",
+ "Manage & explore rooms": "Szobák kezelése és felderítése",
+ "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "Egyeztetés vele: %(transferTarget)s. Átadás ide: %(transferee)s",
+ "unknown person": "ismeretlen személy",
+ "Share decryption keys for room history when inviting users": "Visszafejtéshez szükséges kulcsok megosztása a szoba előzményekhez felhasználók meghívásakor",
+ "Send and receive voice messages (in development)": "Hang üzenetek küldése és fogadása (fejlesztés alatt)",
+ "%(deviceId)s from %(ip)s": "%(deviceId)s innen: %(ip)s",
+ "Review to ensure your account is safe": "Tekintse át, hogy meggyőződjön arról, hogy a fiókja biztonságban van",
+ "Sends the given message as a spoiler": "A megadott üzenet szpojlerként küldése"
}
diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json
index 229b769c18..2d0edb77e6 100644
--- a/src/i18n/strings/it.json
+++ b/src/i18n/strings/it.json
@@ -3248,5 +3248,42 @@
"Check your devices": "Controlla i tuoi dispositivi",
"A new login is accessing your account: %(name)s (%(deviceID)s) at %(ip)s": "Una nuova sessione sta accedendo al tuo account: %(name)s (%(deviceID)s) al %(ip)s",
"You have unverified logins": "Hai accessi non verificati",
- "Open": "Apri"
+ "Open": "Apri",
+ "Send and receive voice messages (in development)": "Invia e ricevi messaggi vocali (in sviluppo)",
+ "unknown person": "persona sconosciuta",
+ "Sends the given message as a spoiler": "Invia il messaggio come spoiler",
+ "Review to ensure your account is safe": "Controlla per assicurarti che l'account sia sicuro",
+ "%(deviceId)s from %(ip)s": "%(deviceId)s da %(ip)s",
+ "Share decryption keys for room history when inviting users": "Condividi le chiavi di decifrazione della cronologia della stanza quando inviti utenti",
+ "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "Consultazione con %(transferTarget)s. Trasferisci a %(transferee)s",
+ "Manage & explore rooms": "Gestisci ed esplora le stanze",
+ "Invite to just this room": "Invita solo in questa stanza",
+ "%(count)s people you know have already joined|other": "%(count)s persone che conosci sono già entrate",
+ "%(count)s people you know have already joined|one": "%(count)s persona che conosci è già entrata",
+ "Message search initilisation failed": "Inizializzazione ricerca messaggi fallita",
+ "Add existing rooms": "Aggiungi stanze esistenti",
+ "Warn before quitting": "Avvisa prima di uscire",
+ "Invited people will be able to read old messages.": "Le persone invitate potranno leggere i vecchi messaggi.",
+ "You most likely do not want to reset your event index store": "Probabilmente non hai bisogno di reinizializzare il tuo archivio indice degli eventi",
+ "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Se lo fai, ricorda che nessuno dei tuoi messaggi verrà eliminato, ma l'esperienza di ricerca potrà peggiorare per qualche momento mentre l'indice viene ricreato",
+ "Avatar": "Avatar",
+ "Verification requested": "Verifica richiesta",
+ "What are some things you want to discuss in %(spaceName)s?": "Quali sono le cose di cui vuoi discutere in %(spaceName)s?",
+ "Please choose a strong password": "Scegli una password robusta",
+ "Quick actions": "Azioni rapide",
+ "Invite messages are hidden by default. Click to show the message.": "I messaggi di invito sono nascosti in modo predefinito. Clicca per mostrare il messaggio.",
+ "Record a voice message": "Registra un messaggio vocale",
+ "Stop & send recording": "Ferma e invia la registrazione",
+ "Accept on your other login…": "Accetta nella tua altra sessione…",
+ "Adding...": "Aggiunta...",
+ "We couldn't create your DM.": "Non abbiamo potuto creare il tuo messaggio diretto.",
+ "Consult first": "Prima consulta",
+ "Reset event store?": "Reinizializzare l'archivio eventi?",
+ "Reset event store": "Reinizializza archivio eventi",
+ "Verify other login": "Verifica l'altra sessione",
+ "Let's create a room for each of them.": "Creiamo una stanza per ognuno di essi.",
+ "You can add more later too, including already existing ones.": "Puoi aggiungerne anche altri in seguito, inclusi quelli già esistenti.",
+ "Use another login": "Usa un altro accesso",
+ "Verify your identity to access encrypted messages and prove your identity to others.": "Verifica la tua identità per accedere ai messaggi cifrati e provare agli altri che sei tu.",
+ "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Senza la verifica, non avrai accesso a tutti i tuoi messaggi e potresti apparire agli altri come non fidato."
}
diff --git a/src/i18n/strings/jbo.json b/src/i18n/strings/jbo.json
index f2c9dc6e43..b19d4bb95d 100644
--- a/src/i18n/strings/jbo.json
+++ b/src/i18n/strings/jbo.json
@@ -580,5 +580,8 @@
"%(displayName)s cancelled verification.": ".i la'o zoi. %(displayName)s .zoi co'u co'a lacri",
"Decrypt %(text)s": "nu facki le du'u mifra la'o zoi. %(text)s .zoi",
"Download %(text)s": "nu kibycpa la'o zoi. %(text)s .zoi",
- "Download this file": "nu kibycpa le vreji"
+ "Download this file": "nu kibycpa le vreji",
+ "Explore rooms": "nu facki le du'u ve zilbe'i",
+ "Create Account": "nu pa re'u co'a jaspu",
+ "Dismiss": "nu mipri"
}
diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json
index c4e0cc7099..b6e1b3020f 100644
--- a/src/i18n/strings/kab.json
+++ b/src/i18n/strings/kab.json
@@ -2,7 +2,7 @@
"Confirm": "Sentem",
"Analytics": "Tiselḍin",
"Error": "Tuccḍa",
- "Dismiss": "Agi",
+ "Dismiss": "Agwi",
"OK": "IH",
"Permission Required": "Tasiregt tlaq",
"Continue": "Kemmel",
diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json
index 59bb68af94..f817dbc26b 100644
--- a/src/i18n/strings/ko.json
+++ b/src/i18n/strings/ko.json
@@ -1666,5 +1666,6 @@
"WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "경고: 키 검증 실패! 제공된 키인 \"%(fingerprint)s\"가 사용자 %(userId)s와 %(deviceId)s 세션의 서명 키인 \"%(fprint)s\"와 일치하지 않습니다. 이는 통신이 탈취되고 있는 중일 수도 있다는 뜻입니다!",
"The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "사용자 %(userId)s의 세션 %(deviceId)s에서 받은 서명 키와 당신이 제공한 서명 키가 일치합니다. 세션이 검증되었습니다.",
"Show more": "더 보기",
- "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "비밀번호를 변경한다면 방의 암호화 키를 내보낸 후 다시 가져오지 않는 이상 모든 종단간 암호화 키는 초기화 될 것이고, 암호화된 대화 내역은 읽을 수 없게 될 것입니다. 이 문제는 추후에 개선될 것입니다."
+ "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "비밀번호를 변경한다면 방의 암호화 키를 내보낸 후 다시 가져오지 않는 이상 모든 종단간 암호화 키는 초기화 될 것이고, 암호화된 대화 내역은 읽을 수 없게 될 것입니다. 이 문제는 추후에 개선될 것입니다.",
+ "Create Account": "계정 만들기"
}
diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json
index 6ba078ad64..83b59681e7 100644
--- a/src/i18n/strings/lt.json
+++ b/src/i18n/strings/lt.json
@@ -1184,7 +1184,7 @@
"Manage integrations": "Valdyti integracijas",
"Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integracijų Tvarkytuvai gauna konfigūracijos duomenis ir jūsų vardu gali keisti valdiklius, siųsti kambario pakvietimus ir nustatyti galios lygius.",
"Invalid theme schema.": "Klaidinga temos schema.",
- "Error downloading theme information.": "Klaida parsisiunčiant temos informaciją.",
+ "Error downloading theme information.": "Klaida atsisiunčiant temos informaciją.",
"Theme added!": "Tema pridėta!",
"Custom theme URL": "Pasirinktinės temos URL",
"Add theme": "Pridėti temą",
@@ -2091,5 +2091,16 @@
"Successfully restored %(sessionCount)s keys": "Sėkmingai atkurti %(sessionCount)s raktai",
"Warning: Your personal data (including encryption keys) is still stored in this session. Clear it if you're finished using this session, or want to sign in to another account.": "Įspėjimas: Jūsų asmeniniai duomenys (įskaitant šifravimo raktus) vis dar yra saugomi šiame seanse. Išvalykite juos, jei baigėte naudoti šį seansą, arba norite prisijungti prie kitos paskyros.",
"Reason (optional)": "Priežastis (nebūtina)",
- "Reason: %(reason)s": "Priežastis: %(reason)s"
+ "Reason: %(reason)s": "Priežastis: %(reason)s",
+ "Already have an account? Sign in here": "Jau turite paskyrą? Prisijunkite čia",
+ "Host account on": "Kurti paskyrą serveryje",
+ "Forgotten your password?": "Pamiršote savo slaptažodį?",
+ "Homeserver": "Serveris",
+ "New? Create account": "Naujas vartotojas? Sukurkite paskyrą",
+ "Forgot password?": "Pamiršote slaptažodį?",
+ "Preparing to download logs": "Ruošiamasi parsiųsti žurnalus",
+ "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use Element with an existing Matrix account on a different homeserver.": "Jūs galite naudoti serverio parinktis, norėdami prisijungti prie kitų Matrix serverių, nurodydami kitą serverio URL. Tai leidžia jums naudoti Element su egzistuojančia paskyra kitame serveryje.",
+ "Server Options": "Serverio Parinktys",
+ "Your homeserver": "Jūsų serveris",
+ "Download logs": "Parsisiųsti žurnalus"
}
diff --git a/src/i18n/strings/lv.json b/src/i18n/strings/lv.json
index 4b07a93ea6..ed7da7dc6b 100644
--- a/src/i18n/strings/lv.json
+++ b/src/i18n/strings/lv.json
@@ -300,7 +300,7 @@
"You need to be logged in.": "Tev ir jāpierakstās.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Jūsu epasta adrese nav piesaistīta nevienam Matrix ID šajā bāzes serverī.",
"You seem to be in a call, are you sure you want to quit?": "Izskatās, ka atrodies zvana režīmā. Vai tiešām vēlies iziet?",
- "You seem to be uploading files, are you sure you want to quit?": "Izskatās, ka šobrīd augšuplādē failus. Vai tiešām vēlies iziet?",
+ "You seem to be uploading files, are you sure you want to quit?": "Izskatās, ka šobrīd notiek failu augšupielāde. Vai tiešām vēlaties iziet?",
"Sun": "Sv.",
"Mon": "P.",
"Tue": "O.",
@@ -747,7 +747,7 @@
"Unhide Preview": "Rādīt priekšskatījumu",
"Unable to join network": "Neizdodas pievienoties tīklam",
"Sorry, your browser is not able to run %(brand)s.": "Atvaino, diemžēl tavs tīmekļa pārlūks nespēj darbināt %(brand)s.",
- "Uploaded on %(date)s by %(user)s": "Augšuplādēja %(user)s %(date)s",
+ "Uploaded on %(date)s by %(user)s": "Augšupielādēja %(user)s %(date)s",
"Messages in group chats": "Ziņas grupas čatos",
"Yesterday": "Vakardien",
"Error encountered (%(errorDetail)s).": "Gadījās kļūda (%(errorDetail)s).",
@@ -1559,5 +1559,27 @@
"Verify this session": "Verificēt šo sesiju",
"You signed in to a new session without verifying it:": "Jūs pierakstījāties jaunā sesijā, neveicot tās verifikāciju:",
"You're already in a call with this person.": "Jums jau notiek zvans ar šo personu.",
- "Already in call": "Notiek zvans"
+ "Already in call": "Notiek zvans",
+ "%(deviceId)s from %(ip)s": "%(deviceId)s no %(ip)s",
+ "%(count)s people you know have already joined|other": "%(count)s pazīstami cilvēki ir jau pievienojusies",
+ "%(count)s people you know have already joined|one": "%(count)s pazīstama persona ir jau pievienojusies",
+ "Saving...": "Saglabā…",
+ "%(count)s members|one": "%(count)s dalībnieks",
+ "Save Changes": "Saglabāt izmaiņas",
+ "%(count)s messages deleted.|other": "%(count)s ziņas ir dzēstas.",
+ "%(count)s messages deleted.|one": "%(count)s ziņa ir dzēsta.",
+ "Welcome to ": "Laipni lūdzam uz ",
+ "Room name": "Istabas nosaukums",
+ "%(count)s members|other": "%(count)s dalībnieki",
+ "Room List": "Istabu saraksts",
+ "Send as message": "Nosūtīt kā ziņu",
+ "%(brand)s URL": "%(brand)s URL",
+ "Send a message…": "Nosūtīt ziņu…",
+ "Send a reply…": "Nosūtīt atbildi…",
+ "Room version": "Istabas versija",
+ "Room list": "Istabu saraksts",
+ "Failed to set topic": "Neizdevās iestatīt tematu",
+ "Upload files": "Failu augšupielāde",
+ "These files are too large to upload. The file size limit is %(limit)s.": "Šie faili pārsniedz augšupielādes izmēra limitu %(limit)s.",
+ "Upload files (%(current)s of %(total)s)": "Failu augšupielāde (%(current)s no %(total)s)"
}
diff --git a/src/i18n/strings/ml.json b/src/i18n/strings/ml.json
index 23740fefda..6183fe7de2 100644
--- a/src/i18n/strings/ml.json
+++ b/src/i18n/strings/ml.json
@@ -127,5 +127,8 @@
"Failed to change settings": "സജ്ജീകരണങ്ങള് മാറ്റുന്നവാന് സാധിച്ചില്ല",
"View Source": "സോഴ്സ് കാണുക",
"With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "നിങ്ങളുടെ ഇപ്പോളത്തെ ബ്രൌസര് റയട്ട് പ്രവര്ത്തിപ്പിക്കാന് പൂര്ണമായും പര്യാപത്മല്ല. പല ഫീച്ചറുകളും പ്രവര്ത്തിക്കാതെയിരിക്കാം. ഈ ബ്രൌസര് തന്നെ ഉപയോഗിക്കണമെങ്കില് മുന്നോട്ട് പോകാം. പക്ഷേ നിങ്ങള് നേരിടുന്ന പ്രശ്നങ്ങള് നിങ്ങളുടെ ഉത്തരവാദിത്തത്തില് ആയിരിക്കും!",
- "Checking for an update...": "അപ്ഡേറ്റ് ഉണ്ടോ എന്ന് തിരയുന്നു..."
+ "Checking for an update...": "അപ്ഡേറ്റ് ഉണ്ടോ എന്ന് തിരയുന്നു...",
+ "Explore rooms": "മുറികൾ കണ്ടെത്തുക",
+ "Sign In": "പ്രവേശിക്കുക",
+ "Create Account": "അക്കൗണ്ട് സൃഷ്ടിക്കുക"
}
diff --git a/src/i18n/strings/mn.json b/src/i18n/strings/mn.json
index 0967ef424b..5e44298332 100644
--- a/src/i18n/strings/mn.json
+++ b/src/i18n/strings/mn.json
@@ -1 +1,6 @@
-{}
+{
+ "Explore rooms": "Өрөөнүүд үзэх",
+ "Sign In": "Нэвтрэх",
+ "Create Account": "Хэрэглэгч үүсгэх",
+ "Dismiss": "Орхих"
+}
diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json
index ee116fa5bd..d3be9cd2ea 100644
--- a/src/i18n/strings/nb_NO.json
+++ b/src/i18n/strings/nb_NO.json
@@ -1507,5 +1507,479 @@
"This will end the conference for everyone. Continue?": "Dette vil avslutte konferansen for alle. Fortsett?",
"End conference": "Avslutt konferanse",
"You're already in a call with this person.": "Du er allerede i en samtale med denne personen.",
- "Already in call": "Allerede i en samtale"
+ "Already in call": "Allerede i en samtale",
+ "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Er du sikke på at du vil fjerne '%(roomName)s' fra %(groupId)s?",
+ "Burundi": "Burundi",
+ "Burkina Faso": "Burkina Faso",
+ "Bulgaria": "Bulgaria",
+ "Brunei": "Brunei",
+ "Brazil": "Brazil",
+ "Botswana": "Botswana",
+ "Bolivia": "Bolivia",
+ "Bhutan": "Bhutan",
+ "Bermuda": "Bermuda",
+ "Benin": "Benin",
+ "Belize": "Belize",
+ "Belarus": "Hviterussland",
+ "Barbados": "Barbados",
+ "Bangladesh": "Bangladesh",
+ "Bahrain": "Bahrain",
+ "Bahamas": "Bahamas",
+ "Azerbaijan": "Azerbaijan",
+ "Austria": "Østerrike",
+ "Australia": "Australia",
+ "Aruba": "Aruba",
+ "Armenia": "Armenia",
+ "Argentina": "Argentina",
+ "Antigua & Barbuda": "Antigua og Barbuda",
+ "Antarctica": "Antarktis",
+ "Anguilla": "Anguilla",
+ "Angola": "Angola",
+ "Andorra": "Andorra",
+ "Algeria": "Algeria",
+ "Albania": "Albania",
+ "Åland Islands": "Åland",
+ "Afghanistan": "Afghanistan",
+ "United Kingdom": "Storbritannia",
+ "Your homeserver was unreachable and was not able to log you in. Please try again. If this continues, please contact your homeserver administrator.": "Din hjemmeserver kunne ikke nås, og kan derfor ikke logge deg inn. Vennligst prøv igjen. Hvis dette fortsetter, kontakt administratoren til din hjemmeserver.",
+ "Only continue if you trust the owner of the server.": "Fortsett kun om du stoler på eieren av serveren.",
+ "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Denne handlingen krever tilgang til standard identitetsserver for å kunne validere en epostaddresse eller telefonnummer, men serveren har ikke bruksvilkår.",
+ "Too Many Calls": "For mange samtaler",
+ "Call failed because webcam or microphone could not be accessed. Check that:": "Samtalen mislyktes fordi du fikk ikke tilgang til webkamera eller mikrofon. Sørg for at:",
+ "Unable to access webcam / microphone": "Ingen tilgang til webkamera / mikrofon",
+ "The call was answered on another device.": "Samtalen ble besvart på en annen enhet.",
+ "The call could not be established": "Samtalen kunne ikke etableres",
+ "The other party declined the call.": "Den andre parten avviste samtalen.",
+ "Call Declined": "Samtale avvist",
+ "Click the button below to confirm adding this phone number.": "Klikk knappen nedenfor for å bekrefte dette telefonnummeret.",
+ "Single Sign On": "Single Sign On",
+ "Confirm adding this phone number by using Single Sign On to prove your identity.": "Bekreft dette telefonnummeret ved å bruke Single Sign On for å bevise din identitet.",
+ "Confirm adding this email address by using Single Sign On to prove your identity.": "Befrekt denne e-postadressen ved å bruke Single Sign On for å bevise din identitet.",
+ "Show stickers button": "Vis klistremerkeknappen",
+ "Recently visited rooms": "Nylig besøkte rom",
+ "Windows": "Vinduer",
+ "Abort": "Avbryt",
+ "You have unverified logins": "Du har uverifiserte pålogginger",
+ "Check your devices": "Sjekk enhetene dine",
+ "Record a voice message": "Send en stemmebeskjed",
+ "Edit devices": "Rediger enheter",
+ "Homeserver": "Hjemmetjener",
+ "Edit Values": "Rediger verdier",
+ "Add existing room": "Legg til et eksisterende rom",
+ "Spell check dictionaries": "Stavesjekk-ordbøker",
+ "Invite to this space": "Inviter til dette området",
+ "Send message": "Send melding",
+ "Cookie Policy": "Infokapselretningslinjer",
+ "Invite to %(roomName)s": "Inviter til %(roomName)s",
+ "Resume": "Fortsett",
+ "Avatar": "Profilbilde",
+ "A confirmation email has been sent to %(emailAddress)s": "En bekreftelses-E-post har blitt sendt til %(emailAddress)s",
+ "Suggested Rooms": "Foreslåtte rom",
+ "Welcome %(name)s": "Velkommen, %(name)s",
+ "Upgrade to %(hostSignupBrand)s": "Oppgrader til %(hostSignupBrand)s",
+ "Verification requested": "Verifisering ble forespurt",
+ "%(count)s members|one": "%(count)s medlem",
+ "Removing...": "Fjerner …",
+ "No results found": "Ingen resultater ble funnet",
+ "Public space": "Offentlig område",
+ "Private space": "Privat område",
+ "Support": "Support",
+ "What projects are you working on?": "Hvilke prosjekter jobber du på?",
+ "Suggested": "Anbefalte",
+ "%(deviceId)s from %(ip)s": "%(deviceId)s fra %(ip)s",
+ "Accept on your other login…": "Aksepter på din andre pålogging …",
+ "Value:": "Verdi:",
+ "Leave Space": "Forlat området",
+ "View dev tools": "Vis utviklerverktøy",
+ "Saving...": "Lagrer …",
+ "Save Changes": "Lagre endringer",
+ "Verify other login": "Verifiser en annen pålogging",
+ "You don't have permission": "Du har ikke tillatelse",
+ "%(count)s rooms|other": "%(count)s rom",
+ "%(count)s rooms|one": "%(count)s rom",
+ "Invite by username": "Inviter etter brukernavn",
+ "Delete": "Slett",
+ "Your public space": "Ditt offentlige område",
+ "Your private space": "Ditt private område",
+ "Invite to %(spaceName)s": "Inviter til %(spaceName)s",
+ "%(count)s members|other": "%(count)s medlemmer",
+ "Random": "Tilfeldig",
+ "unknown person": "ukjent person",
+ "Public": "Offentlig",
+ "Private": "Privat",
+ "Click to copy": "Klikk for å kopiere",
+ "Share invite link": "Del invitasjonslenke",
+ "Leave space": "Forlat området",
+ "Warn before quitting": "Advar før avslutning",
+ "Quick actions": "Hurtigvalg",
+ "Screens": "Skjermer",
+ "%(count)s people you know have already joined|other": "%(count)s personer du kjenner har allerede blitt med",
+ "Add existing rooms": "Legg til eksisterende rom",
+ "Don't want to add an existing room?": "Vil du ikke legge til et eksisterende rom?",
+ "Create a new room": "Opprett et nytt rom",
+ "Adding...": "Legger til …",
+ "Settings Explorer": "Innstillingsutforsker",
+ "Value": "Verdi",
+ "Setting:": "Innstilling:",
+ "Caution:": "Advarsel:",
+ "Level": "Nivå",
+ "Privacy Policy": "Personvern",
+ "You should know": "Du bør vite",
+ "Room name": "Rommets navn",
+ "Skip for now": "Hopp over for nå",
+ "Creating rooms...": "Oppretter rom …",
+ "Share %(name)s": "Del %(name)s",
+ "Just me": "Bare meg selv",
+ "Inviting...": "Inviterer …",
+ "Please choose a strong password": "Vennligst velg et sterkt passord",
+ "New? Create account": "Er du ny her? Opprett en konto",
+ "Use another login": "Bruk en annen pålogging",
+ "Use Security Key or Phrase": "Bruk sikkerhetsnøkkel eller -frase",
+ "Use Security Key": "Bruk sikkerhetsnøkkel",
+ "Upgrade private room": "Oppgrader privat rom",
+ "Upgrade public room": "Oppgrader offentlig rom",
+ "Decline All": "Avslå alle",
+ "Enter Security Key": "Skriv inn sikkerhetsnøkkel",
+ "Germany": "Tyskland",
+ "Malta": "Malta",
+ "Uruguay": "Uruguay",
+ "Community settings": "Fellesskapsinnstillinger",
+ "You’re all caught up": "Du har lest deg opp på alt det nye",
+ "Remember this": "Husk dette",
+ "Move right": "Gå til høyre",
+ "Notify the whole room": "Varsle hele rommet",
+ "Got an account? Sign in": "Har du en konto? Logg på",
+ "You created this room.": "Du opprettet dette rommet.",
+ "Security Phrase": "Sikkerhetsfrase",
+ "Start a Conversation": "Start en samtale",
+ "Open dial pad": "Åpne nummerpanelet",
+ "Message deleted on %(date)s": "Meldingen ble slettet den %(date)s",
+ "Approve": "Godkjenn",
+ "Create community": "Opprett fellesskap",
+ "Already have an account? Sign in here": "Har du allerede en konto? Logg på",
+ "%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s eller %(usernamePassword)s",
+ "That username already exists, please try another.": "Det brukernavnet finnes allerede, vennligst prøv et annet et",
+ "New here? Create an account": "Er du ny her? Opprett en konto",
+ "Now, let's help you get started": "Nå, la oss hjelpe deg med å komme i gang",
+ "Forgot password?": "Glemt passord?",
+ "Enter email address": "Legg inn e-postadresse",
+ "Enter phone number": "Skriv inn telefonnummer",
+ "Please enter the code it contains:": "Vennligst skriv inn koden den inneholder:",
+ "Token incorrect": "Sjetongen er feil",
+ "A text message has been sent to %(msisdn)s": "En SMS har blitt sendt til %(msisdn)s",
+ "Open the link in the email to continue registration.": "Åpne lenken i E-posten for å fortsette registreringen.",
+ "This room is public": "Dette rommet er offentlig",
+ "Move left": "Gå til venstre",
+ "Take a picture": "Ta et bilde",
+ "Hold": "Hold",
+ "Enter Security Phrase": "Skriv inn sikkerhetsfrase",
+ "Security Key": "Sikkerhetsnøkkel",
+ "Invalid Security Key": "Ugyldig sikkerhetsnøkkel",
+ "Wrong Security Key": "Feil sikkerhetsnøkkel",
+ "About homeservers": "Om hjemmetjenere",
+ "New Recovery Method": "Ny gjenopprettingsmetode",
+ "Generate a Security Key": "Generer en sikkerhetsnøkkel",
+ "Confirm your Security Phrase": "Bekreft sikkerhetsfrasen din",
+ "Your Security Key": "Sikkerhetsnøkkelen din",
+ "Repeat your Security Phrase...": "Gjenta sikkerhetsfrasen din",
+ "Set up with a Security Key": "Sett opp med en sikkerhetsnøkkel",
+ "Use app": "Bruk app",
+ "Learn more": "Lær mer",
+ "Use app for a better experience": "Bruk appen for en bedre opplevelse",
+ "Continue with %(provider)s": "Fortsett med %(provider)s",
+ "This address is already in use": "Denne adressen er allerede i bruk",
+ "In reply to": "Som svar på",
+ "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)sendret navnet sitt %(count)s ganger",
+ "%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)sfikk sin invitasjon trukket tilbake",
+ "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)sfikk sine invitasjoner trukket tilbake",
+ "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)savslo invitasjonen sin",
+ "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)sforlot og ble med igjen",
+ "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)sforlot og ble med igjen",
+ "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)sble med og forlot igjen",
+ "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)sble med og forlot igjen",
+ "Information": "Informasjon",
+ "Add rooms to this community": "Legg til rom i dette fellesskapet",
+ "%(name)s cancelled verifying": "%(name)s avbrøt verifiseringen",
+ "You cancelled verifying %(name)s": "Du avbrøt verifiseringen av %(name)s",
+ "Invalid file%(extra)s": "Ugyldig fil%(extra)s",
+ "Failed to ban user": "Mislyktes i å bannlyse brukeren",
+ "Room settings": "Rominnstillinger",
+ "Show files": "Vis filer",
+ "Not encrypted": "Ikke kryptert",
+ "About": "Om",
+ "Widgets": "Komponenter",
+ "Room Info": "Rominfo",
+ "Favourited": "Favorittmerket",
+ "Forget Room": "Glem rommet",
+ "Show previews of messages": "Vis forhåndsvisninger av meldinger",
+ "Invalid URL": "Ugyldig URL",
+ "Continuing without email": "Fortsetter uten E-post",
+ "Are you sure you want to sign out?": "Er du sikker på at du vil logge av?",
+ "Transfer": "Overfør",
+ "Invite by email": "Inviter gjennom E-post",
+ "Waiting for partner to confirm...": "Venter på at partneren skal bekrefte …",
+ "Report a bug": "Rapporter en feil",
+ "Comment": "Kommentar",
+ "Add comment": "Legg til kommentar",
+ "Active Widgets": "Aktive moduler",
+ "Create a room in %(communityName)s": "Opprett et rom i %(communityName)s",
+ "Reason (optional)": "Årsak (valgfritt)",
+ "Send %(count)s invites|one": "Send %(count)s invitasjon",
+ "Send %(count)s invites|other": "Send %(count)s invitasjoner",
+ "Add another email": "Legg til en annen E-postadresse",
+ "%(count)s results|one": "%(count)s resultat",
+ "%(count)s results|other": "%(count)s resultater",
+ "Start a new chat": "Start en ny chat",
+ "Custom Tag": "Egendefinert merkelapp",
+ "Explore public rooms": "Utforsk offentlige rom",
+ "Explore community rooms": "Utforsk samfunnsrom",
+ "Invite to this community": "Inviter til dette fellesskapet",
+ "Verify the link in your inbox": "Verifiser lenken i innboksen din",
+ "Bridges": "Broer",
+ "Privacy": "Personvern",
+ "Reject all %(invitedRooms)s invites": "Avslå alle %(invitedRooms)s-invitasjoner",
+ "Upgrade Room Version": "Oppgrader romversjon",
+ "You cancelled verification.": "Du avbrøt verifiseringen.",
+ "Ask %(displayName)s to scan your code:": "Be %(displayName)s om å skanne koden:",
+ "Role": "Rolle",
+ "Failed to deactivate user": "Mislyktes i å deaktivere brukeren",
+ "Accept all %(invitedRooms)s invites": "Aksepter alle %(invitedRooms)s-invitasjoner",
+ "": "",
+ "Custom theme URL": "URL-en til et selvvalgt tema",
+ "not ready": "ikke klar",
+ "ready": "klar",
+ "Algorithm:": "Algoritme:",
+ "Backing up %(sessionsRemaining)s keys...": "Sikkerhetskopierer %(sessionsRemaining)s nøkler …",
+ "Away": "Borte",
+ "Start chat": "Start chat",
+ "Show Widgets": "Vis moduler",
+ "Hide Widgets": "Skjul moduler",
+ "Unknown for %(duration)s": "Ukjent i %(duration)s",
+ "Update %(brand)s": "Oppdater %(brand)s",
+ "You are currently ignoring:": "Du ignorerer for øyeblikket:",
+ "Unknown caller": "Ukjent oppringer",
+ "Dial pad": "Nummerpanel",
+ "%(name)s on hold": "%(name)s står på vent",
+ "Fill Screen": "Fyll skjermen",
+ "Voice Call": "Taleanrop",
+ "Video Call": "Videoanrop",
+ "sends confetti": "sender konfetti",
+ "System font name": "Systemskrifttypenavn",
+ "Use a system font": "Bruk en systemskrifttype",
+ "Waiting for answer": "Venter på svar",
+ "Call in progress": "Anrop pågår",
+ "Channel: ": "Kanal: ",
+ "Enable desktop notifications": "Aktiver skrivebordsvarsler",
+ "Don't miss a reply": "Ikke gå glipp av noen svar",
+ "Help us improve %(brand)s": "Hjelp oss å forbedre %(brand)s",
+ "Unknown App": "Ukjent app",
+ "Short keyboard patterns are easy to guess": "Korte tastatur mønstre er lett å gjette",
+ "This is similar to a commonly used password": "Dette ligner på et passord som er brukt mye",
+ "Predictable substitutions like '@' instead of 'a' don't help very much": "Forutsigbar erstatninger som ‘ @‘ istedet for ‘a’ hjelper ikke mye",
+ "Reversed words aren't much harder to guess": "Ord som er skrevet baklengs er vanskeligere å huske.",
+ "All-uppercase is almost as easy to guess as all-lowercase": "Bare store bokstaver er nesten like enkelt å gjette som bare små bokstaver",
+ "Capitalization doesn't help very much": "Store bokstaver er ikke spesielt nyttig",
+ "Use a longer keyboard pattern with more turns": "Bruke et lengre og mer uventet tastatur mønster",
+ "No need for symbols, digits, or uppercase letters": "Ikke nødvendig med symboler, sifre eller bokstaver",
+ "See images posted to this room": "Se bilder som er lagt ut i dette rommet",
+ "%(senderName)s declined the call.": "%(senderName)s avslo oppringingen.",
+ "(an error occurred)": "(en feil oppstod)",
+ "(connection failed)": "(tilkobling mislyktes)",
+ "Change the topic of this room": "Endre dette rommets tema",
+ "Effects": "Effekter",
+ "Zimbabwe": "Zimbabwe",
+ "Yemen": "Jemen",
+ "Zambia": "Zambia",
+ "Western Sahara": "Vest-Sahara",
+ "Wallis & Futuna": "Wallis og Futuna",
+ "Venezuela": "Venezuela",
+ "Vietnam": "Vietnam",
+ "Vatican City": "Vatikanstaten",
+ "Vanuatu": "Vanuatu",
+ "Uzbekistan": "Usbekistan",
+ "United Arab Emirates": "De forente arabiske emirater",
+ "Ukraine": "Ukraina",
+ "U.S. Virgin Islands": "De amerikanske jomfruøyene",
+ "Uganda": "Uganda",
+ "Tuvalu": "Tuvalu",
+ "Turks & Caicos Islands": "Turks- og Caicosøyene",
+ "Turkmenistan": "Turkmenistan",
+ "Tunisia": "Tunis",
+ "Turkey": "Tyrkia",
+ "Trinidad & Tobago": "Trinidad og Tobago",
+ "Tonga": "Tonga",
+ "Tokelau": "Tokelau",
+ "Togo": "Togo",
+ "Timor-Leste": "Timor-Leste",
+ "Thailand": "Thailand",
+ "Tanzania": "Tanzania",
+ "Tajikistan": "Tadsjikistan",
+ "Taiwan": "Taiwan",
+ "São Tomé & Príncipe": "São Tomé og Príncipe",
+ "Syria": "Syria",
+ "Sweden": "Sverige",
+ "Switzerland": "Sveits",
+ "Swaziland": "Swaziland",
+ "Svalbard & Jan Mayen": "Svalbard og Jan Mayen",
+ "Suriname": "Surinam",
+ "Sudan": "Sudan",
+ "St. Vincent & Grenadines": "St. Vincent og Grenadinene",
+ "St. Kitts & Nevis": "St. Kitts og Nevis",
+ "St. Helena": "St. Helena",
+ "Sri Lanka": "Sri Lanka",
+ "Spain": "Spania",
+ "South Sudan": "Sør-Sudan",
+ "South Korea": "Syd-Korea",
+ "Somalia": "Somalia",
+ "South Africa": "Sør-Afrika",
+ "Solomon Islands": "Solomonøyene",
+ "Slovenia": "Slovenia",
+ "Slovakia": "Slovakia",
+ "Sint Maarten": "Sint Maarten",
+ "Singapore": "Singapore",
+ "Sierra Leone": "Sierra Leone",
+ "Seychelles": "Seyschellene",
+ "Serbia": "Serbia",
+ "Saudi Arabia": "Saudi-Arabia",
+ "Senegal": "Senegal",
+ "San Marino": "San Marino",
+ "Samoa": "Samoa",
+ "Réunion": "Réunion",
+ "Rwanda": "Rwanda",
+ "Russia": "Russland",
+ "Qatar": "Qatar",
+ "Romania": "Romania",
+ "Puerto Rico": "Puerto Rico",
+ "Portugal": "Portugal",
+ "Poland": "Polen",
+ "Pitcairn Islands": "Pitcairn-øyene",
+ "Philippines": "Filippinene",
+ "Peru": "Peru",
+ "Papua New Guinea": "Papua New Guinea",
+ "Paraguay": "Paraguay",
+ "Panama": "Panama",
+ "Palestine": "Palestina",
+ "Pakistan": "Pakistan",
+ "Palau": "Palau",
+ "Oman": "Oman",
+ "Norway": "Norge",
+ "Northern Mariana Islands": "Northern Mariana Islands",
+ "North Korea": "Nord-Korea",
+ "Norfolk Island": "Norfolkøyene",
+ "Niue": "Niue",
+ "Nigeria": "Nigeria",
+ "Niger": "Niger",
+ "New Zealand": "New Zealand",
+ "Nicaragua": "Nicaragua",
+ "New Caledonia": "New Caledonia",
+ "Netherlands": "Nederland",
+ "Nepal": "Nepal",
+ "Nauru": "Nauru",
+ "Namibia": "Namibia",
+ "Myanmar": "Myanmar",
+ "Mozambique": "Mosambik",
+ "Morocco": "Marokko",
+ "Montenegro": "Montenegro",
+ "Montserrat": "Montserrat",
+ "Mongolia": "Mongolia",
+ "Monaco": "Monaco",
+ "Moldova": "Moldova",
+ "Micronesia": "Mikronesia",
+ "Mexico": "Mexico",
+ "Mayotte": "Mayotte",
+ "Mauritius": "Mauritius",
+ "Mauritania": "Mauretania",
+ "Martinique": "Martinique",
+ "Marshall Islands": "Marshall Islands",
+ "Maldives": "Maldivene",
+ "Mali": "Mali",
+ "Malaysia": "Malaysia",
+ "Malawi": "Malawi",
+ "Madagascar": "Madagaskar",
+ "Macedonia": "Nord-Makedonia",
+ "Macau": "Macau",
+ "Luxembourg": "Luxemburg",
+ "Lithuania": "Litauen",
+ "Liechtenstein": "Liechtenstein",
+ "Libya": "Libya",
+ "Liberia": "Liberia",
+ "Lesotho": "Lesotho",
+ "Lebanon": "Libanon",
+ "Latvia": "Latvia",
+ "Laos": "Laos",
+ "Kyrgyzstan": "Kirgistan",
+ "Kuwait": "Kuwait",
+ "Kosovo": "Kosovo",
+ "Kiribati": "Kiribati",
+ "Kazakhstan": "Kasakstan",
+ "Kenya": "Kenya",
+ "Jamaica": "Jamaica",
+ "Isle of Man": "Man",
+ "Iceland": "Island",
+ "Hungary": "Ungarn",
+ "Hong Kong": "Hong Kong",
+ "Honduras": "Honduras",
+ "Haiti": "Haiti",
+ "Guinea-Bissau": "Guinea-Bissau",
+ "Guyana": "Guyana",
+ "Guinea": "Guinea",
+ "Guernsey": "Guernsey",
+ "Guatemala": "Guatemala",
+ "Guam": "Guam",
+ "Guadeloupe": "Guadeloupe",
+ "Grenada": "Grenada",
+ "Greece": "Hellas",
+ "Greenland": "Grønland",
+ "Gibraltar": "Gibraltar",
+ "Ghana": "Ghana",
+ "Georgia": "Georgia",
+ "Gambia": "Gambia",
+ "Gabon": "Gabon",
+ "French Southern Territories": "De franske sørterritoriene",
+ "French Polynesia": "Fransk polynesia",
+ "French Guiana": "Fransk Guyana",
+ "France": "Frankrike",
+ "Finland": "Finnland",
+ "Fiji": "Fiji",
+ "Falkland Islands": "Falklandsøyene",
+ "Faroe Islands": "Færøyene",
+ "Ethiopia": "Etiopia",
+ "Estonia": "Estland",
+ "Eritrea": "Eritrea",
+ "Equatorial Guinea": "Ekvatorial-Guinea",
+ "El Salvador": "El Salvador",
+ "Egypt": "Egypt",
+ "Ecuador": "Ecuador",
+ "Dominican Republic": "Dominikanske republikk",
+ "Djibouti": "Djibouti",
+ "Dominica": "Dominica",
+ "Denmark": "Danmark",
+ "Côte d’Ivoire": "Elfenbenskysten",
+ "Czech Republic": "Tsjekkia",
+ "Cyprus": "Kypros",
+ "Curaçao": "Curaçao",
+ "Cuba": "Kuba",
+ "Colombia": "Colombia",
+ "Comoros": "Komorene",
+ "Cocos (Keeling) Islands": "Cocos- (Keeling) øyene",
+ "Christmas Island": "Juløya",
+ "China": "Kina",
+ "Chad": "Tsjad",
+ "Chile": "Chile",
+ "Central African Republic": "Sentralafrikanske republikk",
+ "Cayman Islands": "Caymanøyene",
+ "Caribbean Netherlands": "Karibisk Nederland",
+ "Cape Verde": "Kapp Verde",
+ "Canada": "Canada",
+ "Cameroon": "Kamerun",
+ "Cambodia": "Kambodsja",
+ "British Virgin Islands": "De britiske jomfruøyer",
+ "British Indian Ocean Territory": "Britiske havområder i det indiske hav",
+ "Bouvet Island": "Bouvetøya",
+ "Bosnia": "Bosnia",
+ "Croatia": "Kroatia",
+ "Costa Rica": "Costa Rica",
+ "Cook Islands": "Cook-øyene",
+ "All keys backed up": "Alle nøkler er sikkerhetskopiert",
+ "Secret storage:": "Hemmelig lagring:"
}
diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json
index ee99127e04..de98a878e8 100644
--- a/src/i18n/strings/nl.json
+++ b/src/i18n/strings/nl.json
@@ -198,7 +198,7 @@
"Join Room": "Gesprek toetreden",
"%(targetName)s joined the room.": "%(targetName)s is tot het gesprek toegetreden.",
"Jump to first unread message.": "Spring naar het eerste ongelezen bericht.",
- "Labs": "Experimenteel",
+ "Labs": "Labs",
"Last seen": "Laatst gezien",
"Leave room": "Gesprek verlaten",
"%(targetName)s left the room.": "%(targetName)s heeft het gesprek verlaten.",
@@ -632,7 +632,7 @@
"The version of %(brand)s": "De versie van %(brand)s",
"Your language of choice": "De door jou gekozen taal",
"Which officially provided instance you are using, if any": "Welke officieel aangeboden instantie je eventueel gebruikt",
- "Whether or not you're using the Richtext mode of the Rich Text Editor": "Of je de tekstverwerker al dan niet in de modus voor opgemaakte tekst gebruikt",
+ "Whether or not you're using the Richtext mode of the Rich Text Editor": "Of u de tekstverwerker al dan niet in de modus voor opgemaakte tekst gebruikt",
"Your homeserver's URL": "De URL van je homeserver",
"In reply to": "Als antwoord op",
"This room is not public. You will not be able to rejoin without an invite.": "Dit is geen openbaar gesprek. Slechts op uitnodiging zult u opnieuw kunnen toetreden.",
@@ -1255,7 +1255,7 @@
"The homeserver may be unavailable or overloaded.": "De homeserver is mogelijk onbereikbaar of overbelast.",
"You have %(count)s unread notifications in a prior version of this room.|other": "U heeft %(count)s ongelezen meldingen in een vorige versie van dit gesprek.",
"You have %(count)s unread notifications in a prior version of this room.|one": "U heeft %(count)s ongelezen meldingen in een vorige versie van dit gesprek.",
- "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Of je de icoontjes voor recente gesprekken (boven de gesprekkenlijst) al dan niet gebruikt",
+ "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Of u de icoontjes voor recente gesprekken (boven de gesprekkenlijst) al dan niet gebruikt",
"Replying With Files": "Beantwoorden met bestanden",
"At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Het is momenteel niet mogelijk met een bestand te antwoorden. Wil je dit bestand uploaden zonder te antwoorden?",
"The file '%(fileName)s' failed to upload.": "Het bestand ‘%(fileName)s’ kon niet geüpload worden.",
@@ -1758,7 +1758,7 @@
"Cancelling…": "Bezig met annuleren…",
"%(brand)s is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom %(brand)s Desktop with search components added.": "In %(brand)s ontbreken enige modulen vereist voor het veilig lokaal bewaren van versleutelde berichten. Wilt u deze functie uittesten, compileer dan een aangepaste versie van %(brand)s Desktop die de zoekmodulen bevat.",
"This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Deze sessie maakt geen back-ups van uw sleutels, maar u beschikt over een reeds bestaande back-up waaruit u kunt herstellen en waaraan u nieuwe sleutels vanaf nu kunt toevoegen.",
- "Customise your experience with experimental labs features. Learn more.": "Personaliseer uw ervaring met experimentele functies. Klik hier voor meer informatie.",
+ "Customise your experience with experimental labs features. Learn more.": "Personaliseer uw ervaring met experimentele labs functies. Lees verder.",
"Cross-signing": "Kruiselings ondertekenen",
"Your key share request has been sent - please check your other sessions for key share requests.": "Uw sleuteldeelverzoek is verstuurd - controleer de sleuteldeelverzoeken op uw andere sessies.",
"Key share requests are sent to your other sessions automatically. If you rejected or dismissed the key share request on your other sessions, click here to request the keys for this session again.": "Sleuteldeelverzoeken worden automatisch naar andere sessies verstuurd. Als u op uw andere sessies het sleuteldeelverzoek geweigerd of genegeerd hebt, kunt u hier klikken op de sleutels voor deze sessie opnieuw aan te vragen.",
@@ -3134,5 +3134,42 @@
"From %(deviceName)s (%(deviceId)s) at %(ip)s": "Van %(deviceName)s (%(deviceId)s) op %(ip)s",
"Check your devices": "Controleer uw apparaten",
"A new login is accessing your account: %(name)s (%(deviceID)s) at %(ip)s": "Een nieuwe login heeft toegang tot uw account: %(name)s (%(deviceID)s) op %(ip)s",
- "You have unverified logins": "U heeft ongeverifieerde logins"
+ "You have unverified logins": "U heeft ongeverifieerde logins",
+ "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Zonder verifiëren heeft u geen toegang tot al uw berichten en kan u als onvertrouwd aangemerkt staan bij anderen.",
+ "Verify your identity to access encrypted messages and prove your identity to others.": "Verifeer uw identiteit om toegang te krijgen tot uw versleutelde berichten en uw identiteit te bewijzen voor anderen.",
+ "Use another login": "Gebruik andere login",
+ "Please choose a strong password": "Kies een sterk wachtwoord",
+ "You can add more later too, including already existing ones.": "U kunt er later nog meer toevoegen, inclusief al bestaande gesprekken.",
+ "Let's create a room for each of them.": "Laten we voor elk een los gesprek maken.",
+ "What are some things you want to discuss in %(spaceName)s?": "Wat wilt u allemaal bespreken in %(spaceName)s?",
+ "Verification requested": "Verificatieverzocht",
+ "Avatar": "Avatar",
+ "Verify other login": "Verifieer andere login",
+ "You most likely do not want to reset your event index store": "U wilt waarschijnlijk niet uw gebeurtenisopslag-index resetten",
+ "Reset event store?": "Gebeurtenisopslag resetten?",
+ "Reset event store": "Gebeurtenisopslag resetten",
+ "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Als u dit wilt, let op uw berichten worden niet verwijderd, zal het zoeken tijdelijk minder goed werken terwijl we uw index opnieuw opbouwen",
+ "Consult first": "Eerst overleggen",
+ "Invited people will be able to read old messages.": "Uitgenodigde personen kunnen de oude berichten lezen.",
+ "We couldn't create your DM.": "We konden uw DM niet aanmaken.",
+ "Adding...": "Toevoegen...",
+ "Add existing rooms": "Bestaande gesprekken toevoegen",
+ "%(count)s people you know have already joined|one": "%(count)s persoon die u kent is al geregistreerd",
+ "%(count)s people you know have already joined|other": "%(count)s personen die u kent hebben zijn al geregistreerd",
+ "Accept on your other login…": "Accepteer op uw andere login…",
+ "Stop & send recording": "Stop & verstuur opname",
+ "Record a voice message": "Audiobericht opnemen",
+ "Invite messages are hidden by default. Click to show the message.": "Uitnodigingen zijn standaard verborgen. Klik om de uitnodigingen weer te geven.",
+ "Quick actions": "Snelle acties",
+ "Invite to just this room": "Uitnodigen voor alleen dit gesprek",
+ "Warn before quitting": "Waarschuwen voordat u afsluit",
+ "Message search initilisation failed": "Zoeken in berichten opstarten is mislukt",
+ "Manage & explore rooms": "Beheer & ontdek gesprekken",
+ "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "Overleggen met %(transferTarget)s. Verstuur naar %(transferee)s",
+ "unknown person": "onbekend persoon",
+ "Share decryption keys for room history when inviting users": "Deel ontsleutelsleutels voor de gespreksgeschiedenis wanneer u personen uitnodigd",
+ "Send and receive voice messages (in development)": "Verstuur en ontvang audioberichten (in ontwikkeling)",
+ "%(deviceId)s from %(ip)s": "%(deviceId)s van %(ip)s",
+ "Review to ensure your account is safe": "Controleer om u te verzekeren dat uw account veilig is",
+ "Sends the given message as a spoiler": "Verstuurt het bericht als een spoiler"
}
diff --git a/src/i18n/strings/oc.json b/src/i18n/strings/oc.json
index cd62ff69db..d882b04ac9 100644
--- a/src/i18n/strings/oc.json
+++ b/src/i18n/strings/oc.json
@@ -62,7 +62,7 @@
"Server error": "Error servidor",
"Single Sign On": "Autentificacion unica",
"Confirm": "Confirmar",
- "Dismiss": "Far desaparéisser",
+ "Dismiss": "Refusar",
"OK": "D’acòrdi",
"Continue": "Contunhar",
"Go Back": "En arrièr",
@@ -118,7 +118,7 @@
"Incoming call": "Sonada entranta",
"Accept": "Acceptar",
"Start": "Començament",
- "Cancelling…": "Anullacion...",
+ "Cancelling…": "Anullacion…",
"Fish": "Pes",
"Butterfly": "Parpalhòl",
"Tree": "Arborescéncia",
@@ -338,5 +338,13 @@
"Esc": "Escap",
"Enter": "Entrada",
"Space": "Espaci",
- "End": "Fin"
+ "End": "Fin",
+ "Explore rooms": "Percórrer las salas",
+ "Create Account": "Crear un compte",
+ "Click the button below to confirm adding this email address.": "Clicatz sus lo boton aicí dejós per confirmar l'adicion de l'adreça e-mail.",
+ "Confirm adding email": "Confirmar l'adicion de l'adressa e-mail",
+ "Confirm adding this email address by using Single Sign On to prove your identity.": "Confirmatz l'adicion d'aquela adreça e-mail en utilizant l'autentificacion unica per provar la vòstra identitat.",
+ "Use Single Sign On to continue": "Utilizar l'autentificacion unica (SSO) per contunhar",
+ "This phone number is already in use": "Aquel numèro de telefòn es ja utilizat",
+ "This email address is already in use": "Aquela adreça e-mail es ja utilizada"
}
diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json
index 9fa9c7555e..ab9a478446 100644
--- a/src/i18n/strings/pl.json
+++ b/src/i18n/strings/pl.json
@@ -1277,8 +1277,8 @@
"Enable desktop notifications for this session": "Włącz powiadomienia na pulpicie dla tej sesji",
"Enable audible notifications for this session": "Włącz powiadomienia dźwiękowe dla tej sesji",
"Direct Messages": "Wiadomości bezpośrednie",
- "Create Account": "Utwórz konto",
- "Sign In": "Zaloguj się",
+ "Create Account": "Stwórz konto",
+ "Sign In": "Zaloguj",
"a few seconds ago": "kilka sekund temu",
"%(num)s minutes ago": "%(num)s minut temu",
"%(num)s hours ago": "%(num)s godzin temu",
diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json
index f72edc150d..4047aae760 100644
--- a/src/i18n/strings/pt.json
+++ b/src/i18n/strings/pt.json
@@ -569,5 +569,8 @@
"Try using turn.matrix.org": "Tente utilizar turn.matrix.org",
"Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Quer esteja a usar o %(brand)s num dispositivo onde o touch é o mecanismo de entrada primário",
"Whether you're using %(brand)s as an installed Progressive Web App": "Quer esteja a usar o %(brand)s como uma Progressive Web App (PWA)",
- "Your user agent": "O seu user agent"
+ "Your user agent": "O seu user agent",
+ "Explore rooms": "Explorar rooms",
+ "Sign In": "Iniciar sessão",
+ "Create Account": "Criar conta"
}
diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json
index 0ec835362a..8497ae7164 100644
--- a/src/i18n/strings/pt_BR.json
+++ b/src/i18n/strings/pt_BR.json
@@ -1175,7 +1175,7 @@
"Learn More": "Saiba mais",
"Sign In or Create Account": "Faça login ou crie uma conta",
"Use your account or create a new one to continue.": "Use sua conta ou crie uma nova para continuar.",
- "Create Account": "Criar conta",
+ "Create Account": "Criar Conta",
"Sign In": "Entrar",
"Custom (%(level)s)": "Personalizado (%(level)s)",
"Messages": "Mensagens",
diff --git a/src/i18n/strings/ro.json b/src/i18n/strings/ro.json
index aa87d0a912..062a89f2e3 100644
--- a/src/i18n/strings/ro.json
+++ b/src/i18n/strings/ro.json
@@ -70,5 +70,9 @@
"Add to community": "Adăugați la comunitate",
"Failed to invite the following users to %(groupId)s:": "Nu a putut fi invitat următorii utilizatori %(groupId)s",
"Failed to invite users to community": "Nu a fost posibilă invitarea utilizatorilor la comunitate",
- "Failed to invite users to %(groupId)s": "Nu a fost posibilă invitarea utilizatorilor la %(groupId)s"
+ "Failed to invite users to %(groupId)s": "Nu a fost posibilă invitarea utilizatorilor la %(groupId)s",
+ "Explore rooms": "Explorează camerele",
+ "Sign In": "Autentificare",
+ "Create Account": "Înregistare",
+ "Dismiss": "Închide"
}
diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json
index 27a418c5c2..7db3758fd8 100644
--- a/src/i18n/strings/ru.json
+++ b/src/i18n/strings/ru.json
@@ -3169,5 +3169,46 @@
"Decrypted event source": "Расшифрованный исходный код",
"%(count)s rooms and %(numSpaces)s spaces|one": "%(count)s комната и %(numSpaces)s пространств",
"%(count)s rooms and %(numSpaces)s spaces|other": "%(count)s комнат и %(numSpaces)s пространств",
- "If you can't find the room you're looking for, ask for an invite or create a new room.": "Если вы не можете найти комнату, попросите приглашение или создайте новую комнату."
+ "If you can't find the room you're looking for, ask for an invite or create a new room.": "Если вы не можете найти комнату, попросите приглашение или создайте новую комнату.",
+ "Values at explicit levels in this room:": "Значения уровня чувствительности в этой комнате:",
+ "Values at explicit levels:": "Значения уровня чувствительности:",
+ "Values at explicit levels in this room": "Значения уровня чувствительности в этой комнате",
+ "Values at explicit levels": "Значения уровня чувствительности",
+ "We'll create rooms for each of them. You can add more later too, including already existing ones.": "Мы создадим комнаты для каждого из них. Вы можете добавить ещё больше позже, включая уже существующие.",
+ "What projects are you working on?": "Над какими проектами вы работаете?",
+ "Invite by username": "Пригласить по имени пользователя",
+ "Make sure the right people have access. You can invite more later.": "Убедитесь, что правильные люди имеют доступ. Вы можете пригласить больше людей позже.",
+ "Invite your teammates": "Пригласите своих товарищей по команде",
+ "Inviting...": "Приглашение…",
+ "Failed to invite the following users to your space: %(csvUsers)s": "Не удалось пригласить следующих пользователей в ваше пространство: %(csvUsers)s",
+ "Me and my teammates": "Я и мои товарищи по команде",
+ "A private space for you and your teammates": "Приватное пространство для вас и ваших товарищей по команде",
+ "A private space to organise your rooms": "Приватное пространство для организации ваших комнат",
+ "Just me": "Только я",
+ "Make sure the right people have access to %(name)s": "Убедитесь, что правильные люди имеют доступ к %(name)s",
+ "Who are you working with?": "С кем ты работаешь?",
+ "Go to my first room": "Перейти в мою первую комнату",
+ "It's just you at the moment, it will be even better with others.": "Сейчас здесь только ты, с другими будет ещё лучше.",
+ "Share %(name)s": "Поделиться %(name)s",
+ "Creating rooms...": "Создание комнат…",
+ "Skip for now": "Пропустить сейчас",
+ "Failed to create initial space rooms": "Не удалось создать первоначальные комнаты пространства",
+ "Room name": "Название комнаты",
+ "Support": "Поддержка",
+ "Random": "Случайный",
+ "Welcome to ": "Добро пожаловать в ",
+ "Your server does not support showing space hierarchies.": "Ваш сервер не поддерживает отображение пространственных иерархий.",
+ "Add existing rooms & spaces": "Добавить существующие комнаты и пространства",
+ "Private space": "Приватное пространство",
+ "Public space": "Публичное пространство",
+ " invites you": " пригласил(а) тебя",
+ "Search names and description": "Искать имена и описание",
+ "You may want to try a different search or check for typos.": "Вы можете попробовать другой поиск или проверить опечатки.",
+ "No results found": "Результаты не найдены",
+ "Mark as suggested": "Отметить как рекомендуется",
+ "Mark as not suggested": "Отметить как не рекомендуется",
+ "Removing...": "Удаление…",
+ "Failed to remove some rooms. Try again later": "Не удалось удалить несколько комнат. Попробуйте позже",
+ "%(count)s rooms and 1 space|one": "%(count)s комната и одно пространство",
+ "%(count)s rooms and 1 space|other": "%(count)s комнат и одно пространство"
}
diff --git a/src/i18n/strings/sl.json b/src/i18n/strings/sl.json
index 0e9bdb3d3e..aa2019ad45 100644
--- a/src/i18n/strings/sl.json
+++ b/src/i18n/strings/sl.json
@@ -27,5 +27,7 @@
"Your homeserver's URL": "URL domačega strežnika",
"End": "Konec",
"Use default": "Uporabi privzeto",
- "Change": "Sprememba"
+ "Change": "Sprememba",
+ "Explore rooms": "Raziščite sobe",
+ "Create Account": "Registracija"
}
diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json
index 58d23e9395..ad768b59cb 100644
--- a/src/i18n/strings/sq.json
+++ b/src/i18n/strings/sq.json
@@ -874,7 +874,7 @@
"Incompatible Database": "Bazë të dhënash e Papërputhshme",
"Continue With Encryption Disabled": "Vazhdo Me Fshehtëzimin të Çaktivizuar",
"Unable to load! Check your network connectivity and try again.": "S’arrihet të ngarkohet! Kontrolloni lidhjen tuaj në rrjet dhe riprovoni.",
- "Forces the current outbound group session in an encrypted room to be discarded": "",
+ "Forces the current outbound group session in an encrypted room to be discarded": "E detyron të hidhet tej sesionin e tanishëm outbound grupi në një dhomë të fshehtëzuar",
"Delete Backup": "Fshije Kopjeruajtjen",
"Unable to load key backup status": "S’arrihet të ngarkohet gjendje kopjeruajtjeje kyçesh",
"Backup version: ": "Version kopjeruajtjeje: ",
@@ -3240,5 +3240,37 @@
"From %(deviceName)s (%(deviceId)s) at %(ip)s": "Nga %(deviceName)s (%(deviceId)s) te %(ip)s",
"Check your devices": "Kontrolloni pajisjet tuaja",
"A new login is accessing your account: %(name)s (%(deviceID)s) at %(ip)s": "Në llogarinë tuaj po hyhet nga një palë kredenciale të reja: %(name)s (%(deviceID)s) te %(ip)s",
- "You have unverified logins": "Keni kredenciale të erifikuar"
+ "You have unverified logins": "Keni kredenciale të erifikuar",
+ "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Pa e verifikuar, s’do të mund të hyni te krejt mesazhet tuaja dhe mund të dukeni jo i besueshëm për të tjerët.",
+ "Verify your identity to access encrypted messages and prove your identity to others.": "Verifikoni identitetin tuaj që të hyhet në mesazhe të fshehtëzuar dhe t’u provoni të tjerëve identitetin tuaj.",
+ "Use another login": "Përdorni të tjera kredenciale hyrjesh",
+ "Please choose a strong password": "Ju lutemi, zgjidhni një fjalëkalim të fuqishëm",
+ "You can add more later too, including already existing ones.": "Mund të shtoni edhe të tjera më vonë, përfshi ato ekzistueset tashmë.",
+ "Let's create a room for each of them.": "Le të krijojmë një dhomë për secilën prej tyre.",
+ "What are some things you want to discuss in %(spaceName)s?": "Cilat janë disa nga gjërat që doni të diskutoni në %(spaceName)s?",
+ "Verification requested": "U kërkua verifikim",
+ "Avatar": "Avatar",
+ "Verify other login": "Verifikoni kredencialet e tjera për hyrje",
+ "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Nëse e bëni, ju lutemi, kini parasysh se s’do të fshihet asnjë prej mesazheve tuaja, por puna me kërkimet mund të bjerë, për ca çaste, teksa rikrijohet treguesi",
+ "Consult first": "Konsultohu së pari",
+ "Invited people will be able to read old messages.": "Personat e ftuar do të jenë në gjendje të lexojnë mesazhe të vjetër.",
+ "We couldn't create your DM.": "S’e krijuam dot DM-në tuaj.",
+ "Adding...": "Po shtohet…",
+ "Add existing rooms": "Shtoni dhoma ekzistuese",
+ "%(count)s people you know have already joined|one": "%(count)s person që e njihni është bërë pjesë tashmë",
+ "%(count)s people you know have already joined|other": "%(count)s persona që i njihni janë bërë pjesë tashmë",
+ "Stop & send recording": "Ndale & dërgo incizimin",
+ "Record a voice message": "Incizoni një mesazh zanor",
+ "Invite messages are hidden by default. Click to show the message.": "Mesazhet e ftesave, si parazgjedhje, janë të fshehur. Klikoni që të shfaqet mesazhi.",
+ "Quick actions": "Veprime të shpejta",
+ "Invite to just this room": "Ftoje thjesht te kjo dhomë",
+ "Warn before quitting": "Sinjalizo përpara daljes",
+ "Message search initilisation failed": "Dështoi gatitje kërkimi mesazhesh",
+ "Manage & explore rooms": "Administroni & eksploroni dhoma",
+ "unknown person": "person i panjohur",
+ "Sends the given message as a spoiler": "E dërgon mesazhin e dhënë si spoiler",
+ "Share decryption keys for room history when inviting users": "Ndani me përdorues kyçe shfshehtëzimi, kur ftohen përdorues",
+ "Send and receive voice messages (in development)": "Dërgoni dhe merrni mesazhe zanorë (në zhvillim)",
+ "%(deviceId)s from %(ip)s": "%(deviceId)s prej %(ip)s",
+ "Review to ensure your account is safe": "Shqyrtojeni për t’u siguruar se llogaria është e parrezik"
}
diff --git a/src/i18n/strings/sr_Latn.json b/src/i18n/strings/sr_Latn.json
index 19778858d0..96a5d89411 100644
--- a/src/i18n/strings/sr_Latn.json
+++ b/src/i18n/strings/sr_Latn.json
@@ -58,5 +58,6 @@
"Failed to invite users to the room:": "Nije uspelo pozivanje korisnika u sobu:",
"You need to be logged in.": "Morate biti prijavljeni",
"You need to be able to invite users to do that.": "Mora vam biti dozvoljeno da pozovete korisnike kako bi to uradili.",
- "Failed to send request.": "Slanje zahteva nije uspelo."
+ "Failed to send request.": "Slanje zahteva nije uspelo.",
+ "Create Account": "Napravite nalog"
}
diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json
index a3147634c7..42a7f78268 100644
--- a/src/i18n/strings/sv.json
+++ b/src/i18n/strings/sv.json
@@ -3180,5 +3180,41 @@
"From %(deviceName)s (%(deviceId)s) at %(ip)s": "Från %(deviceName)s %(deviceId)s på %(ip)s",
"Check your devices": "Kolla dina enheter",
"A new login is accessing your account: %(name)s (%(deviceID)s) at %(ip)s": "En ny inloggning kommer åt ditt konto: %(name)s %(deviceID)s på %(ip)s",
- "You have unverified logins": "Du har overifierade inloggningar"
+ "You have unverified logins": "Du har overifierade inloggningar",
+ "%(count)s people you know have already joined|other": "%(count)s personer du känner har redan gått med",
+ "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Om du gör det, observera att inga av dina meddelanden kommer att raderas, men din sökupplevelse kommer att degraderas en stund medans registret byggs upp igen",
+ "What are some things you want to discuss in %(spaceName)s?": "Vad är några saker du vill diskutera i %(spaceName)s?",
+ "You can add more later too, including already existing ones.": "Du kan lägga till flera senare också, inklusive redan existerande.",
+ "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "Tillfrågar %(transferTarget)s. %(transferTarget)sÖverför till %(transferee)s",
+ "Review to ensure your account is safe": "Granska för att försäkra dig om att ditt konto är säkert",
+ "%(deviceId)s from %(ip)s": "%(deviceId)s från %(ip)s",
+ "Send and receive voice messages (in development)": "Skicka och ta emot röstmeddelanden (under utveckling)",
+ "unknown person": "okänd person",
+ "Warn before quitting": "Varna innan avslutning",
+ "Invite to just this room": "Bjud in till bara det här rummet",
+ "Invite messages are hidden by default. Click to show the message.": "Inbjudningsmeddelanden är dolda som förval. Klicka för att visa meddelandet.",
+ "Record a voice message": "Spela in ett röstmeddelande",
+ "Stop & send recording": "Stoppa och skicka inspelning",
+ "Accept on your other login…": "Acceptera på din andra inloggning…",
+ "%(count)s people you know have already joined|one": "%(count)s person du känner har redan gått med",
+ "Quick actions": "Snabbhandlingar",
+ "Add existing rooms": "Lägg till existerande rum",
+ "Adding...": "Lägger till…",
+ "We couldn't create your DM.": "Vi kunde inte skapa ditt DM.",
+ "Reset event store": "Återställ händelselagring",
+ "Invited people will be able to read old messages.": "Inbjudna personer kommer att kunna läsa gamla meddelanden.",
+ "Reset event store?": "Återställ händelselagring?",
+ "You most likely do not want to reset your event index store": "Du vill troligen inte återställa din händelseregisterlagring",
+ "Consult first": "Tillfråga först",
+ "Verify other login": "Verifiera annan inloggning",
+ "Avatar": "Avatar",
+ "Let's create a room for each of them.": "Låt oss skapa ett rum för varje.",
+ "Verification requested": "Verifiering begärd",
+ "Sends the given message as a spoiler": "Skickar det angivna meddelandet som en spoiler",
+ "Manage & explore rooms": "Hantera och utforska rum",
+ "Message search initilisation failed": "Initialisering av meddelandesökning misslyckades",
+ "Please choose a strong password": "Vänligen välj ett starkt lösenord",
+ "Use another login": "Använd annan inloggning",
+ "Verify your identity to access encrypted messages and prove your identity to others.": "Verifiera din identitet för att komma åt krypterade meddelanden och bevisa din identitet för andra.",
+ "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Om du inte verifierar så kommer du inte ha åtkomst till alla dina meddelanden och kan synas som ej betrodd för andra."
}
diff --git a/src/i18n/strings/ta.json b/src/i18n/strings/ta.json
index 9cb046ed39..4f87230ef3 100644
--- a/src/i18n/strings/ta.json
+++ b/src/i18n/strings/ta.json
@@ -179,5 +179,7 @@
"Mar": "மார்ச்",
"Apr": "ஏப்ரல்",
"May": "மே",
- "Jun": "ஜூன்"
+ "Jun": "ஜூன்",
+ "Explore rooms": "அறைகளை ஆராயுங்கள்",
+ "Create Account": "உங்கள் கணக்கை துவங்குங்கள்"
}
diff --git a/src/i18n/strings/th.json b/src/i18n/strings/th.json
index 811d549d54..16a9e521c2 100644
--- a/src/i18n/strings/th.json
+++ b/src/i18n/strings/th.json
@@ -26,7 +26,7 @@
"Results from DuckDuckGo": "ผลจาก DuckDuckGo",
"%(brand)s version:": "เวอร์ชัน %(brand)s:",
"Cancel": "ยกเลิก",
- "Dismiss": "ไม่สนใจ",
+ "Dismiss": "ปิด",
"Mute": "เงียบ",
"Notifications": "การแจ้งเตือน",
"Operation failed": "การดำเนินการล้มเหลว",
@@ -378,5 +378,10 @@
"Unable to fetch notification target list": "ไม่สามารถรับรายชื่ออุปกรณ์แจ้งเตือน",
"Quote": "อ้างอิง",
"With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "การแสดงผลของโปรแกรมอาจผิดพลาด ฟังก์ชันบางอย่างหรือทั้งหมดอาจไม่ทำงานในเบราว์เซอร์ปัจจุบันของคุณ หากคุณต้องการลองดำเนินการต่อ คุณต้องรับมือกับปัญหาที่อาจจะเกิดขึ้นด้วยตัวคุณเอง!",
- "Checking for an update...": "กำลังตรวจหาอัปเดต..."
+ "Checking for an update...": "กำลังตรวจหาอัปเดต...",
+ "Explore rooms": "สำรวจห้อง",
+ "Sign In": "ลงชื่อเข้า",
+ "Create Account": "สร้างบัญชี",
+ "Add Email Address": "เพิ่มที่อยู่อีเมล",
+ "Confirm": "ยืนยัน"
}
diff --git a/src/i18n/strings/vi.json b/src/i18n/strings/vi.json
index 744310675c..eebbaef3d0 100644
--- a/src/i18n/strings/vi.json
+++ b/src/i18n/strings/vi.json
@@ -293,5 +293,7 @@
"Enable URL previews by default for participants in this room": "Bật mặc định xem trước nội dung đường link cho mọi người trong phòng",
"Room Colour": "Màu phòng chat",
"Enable widget screenshots on supported widgets": "Bật widget chụp màn hình cho các widget có hỗ trợ",
- "Sign In": "Đăng nhập"
+ "Sign In": "Đăng nhập",
+ "Explore rooms": "Khám phá phòng chat",
+ "Create Account": "Tạo tài khoản"
}
diff --git a/src/i18n/strings/vls.json b/src/i18n/strings/vls.json
index 1172804efa..75ab903ebe 100644
--- a/src/i18n/strings/vls.json
+++ b/src/i18n/strings/vls.json
@@ -1443,5 +1443,7 @@
"Terms of service not accepted or the identity server is invalid.": "Dienstvoorwoardn nie anveird, of den identiteitsserver is oungeldig.",
"Enter a new identity server": "Gift e nieuwen identiteitsserver in",
"Remove %(email)s?": "%(email)s verwydern?",
- "Remove %(phone)s?": "%(phone)s verwydern?"
+ "Remove %(phone)s?": "%(phone)s verwydern?",
+ "Explore rooms": "Gesprekkn ountdekkn",
+ "Create Account": "Account anmoakn"
}
diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json
index 33abcfe74e..c9bb9bb2d7 100644
--- a/src/i18n/strings/zh_Hant.json
+++ b/src/i18n/strings/zh_Hant.json
@@ -3251,5 +3251,42 @@
"From %(deviceName)s (%(deviceId)s) at %(ip)s": "從 %(deviceName)s (%(deviceId)s) 於 %(ip)s",
"Check your devices": "檢查您的裝置",
"A new login is accessing your account: %(name)s (%(deviceID)s) at %(ip)s": "新登入正在存取您的帳號:%(name)s (%(deviceID)s) 於 %(ip)s",
- "You have unverified logins": "您有未驗證的登入"
+ "You have unverified logins": "您有未驗證的登入",
+ "unknown person": "不明身份的人",
+ "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "與 %(transferTarget)s 進行協商。轉讓至 %(transferee)s",
+ "Message search initilisation failed": "訊息搜尋初始化失敗",
+ "Invite to just this room": "邀請到此聊天室",
+ "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "如果這樣做,請注意,您的任何訊息都不會被刪除,但是在重新建立索引的同時,搜索體驗可能會降低片刻",
+ "Let's create a room for each of them.": "讓我們為每個主題建立一個聊天室吧。",
+ "Verify your identity to access encrypted messages and prove your identity to others.": "驗證您的身份來存取已加密的訊息並對其他人證明您的身份。",
+ "Sends the given message as a spoiler": "將指定訊息以劇透傳送",
+ "Review to ensure your account is safe": "請審閱以確保您的帳號安全",
+ "%(deviceId)s from %(ip)s": "從 %(ip)s 而來的 %(deviceId)s",
+ "Send and receive voice messages (in development)": "傳送與接收語音訊息(開發中)",
+ "Share decryption keys for room history when inviting users": "邀請使用者時分享聊天室歷史紀錄的解密金鑰",
+ "Manage & explore rooms": "管理與探索聊天室",
+ "Warn before quitting": "離開前警告",
+ "Quick actions": "快速動作",
+ "Invite messages are hidden by default. Click to show the message.": "邀請訊息預設隱藏。點擊以顯示訊息。",
+ "Record a voice message": "錄製語音訊息",
+ "Stop & send recording": "停止並傳送錄音",
+ "Accept on your other login…": "接受您的其他登入……",
+ "%(count)s people you know have already joined|other": "%(count)s 個您認識的人已加入",
+ "%(count)s people you know have already joined|one": "%(count)s 個您認識的人已加入",
+ "Add existing rooms": "新增既有聊天室",
+ "Adding...": "正在新增……",
+ "We couldn't create your DM.": "我們無法建立您的直接訊息。",
+ "Invited people will be able to read old messages.": "被邀請的人將能閱讀舊訊息。",
+ "Consult first": "先協商",
+ "Reset event store?": "重設活動儲存?",
+ "You most likely do not want to reset your event index store": "您很可能不想重設您的活動索引儲存",
+ "Reset event store": "重設活動儲存",
+ "Verify other login": "驗證其他登入",
+ "Avatar": "大頭貼",
+ "Verification requested": "已請求驗證",
+ "What are some things you want to discuss in %(spaceName)s?": "您想在 %(spaceName)s 中討論什麼?",
+ "You can add more later too, including already existing ones.": "您稍後可以新增更多內容,包含既有的。",
+ "Please choose a strong password": "請選擇強密碼",
+ "Use another login": "使用其他登入",
+ "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "未經驗證,您將無法存取您的所有訊息,且可能不被其他人信任。"
}
diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts
index 55fddc4a35..2a26eeac13 100644
--- a/src/settings/Settings.ts
+++ b/src/settings/Settings.ts
@@ -128,6 +128,12 @@ export const SETTINGS: {[setting: string]: ISetting} = {
default: false,
controller: new ReloadOnChangeController(),
},
+ "feature_dnd": {
+ isFeature: true,
+ displayName: _td("Show options to enable 'Do not disturb' mode"),
+ supportedLevels: LEVELS_FEATURE,
+ default: false,
+ },
"feature_voice_messages": {
isFeature: true,
displayName: _td("Send and receive voice messages (in development)"),
@@ -220,18 +226,16 @@ export const SETTINGS: {[setting: string]: ISetting} = {
supportedLevels: LEVELS_FEATURE,
default: false,
},
- "feature_room_history_key_sharing": {
- isFeature: true,
- displayName: _td("Share decryption keys for room history when inviting users"),
- supportedLevels: LEVELS_FEATURE,
- default: false,
- },
"advancedRoomListLogging": {
// TODO: Remove flag before launch: https://github.com/vector-im/element-web/issues/14231
displayName: _td("Enable advanced debugging for the room list"),
supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS,
default: false,
},
+ "doNotDisturb": {
+ supportedLevels: [SettingLevel.DEVICE],
+ default: false,
+ },
"mjolnirRooms": {
supportedLevels: [SettingLevel.ACCOUNT],
default: [],
diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx
index dec8832792..e4b180f3ce 100644
--- a/src/stores/SpaceStore.tsx
+++ b/src/stores/SpaceStore.tsx
@@ -46,11 +46,14 @@ export const HOME_SPACE = Symbol("home-space");
export const SUGGESTED_ROOMS = Symbol("suggested-rooms");
export const UPDATE_TOP_LEVEL_SPACES = Symbol("top-level-spaces");
+export const UPDATE_INVITED_SPACES = Symbol("invited-spaces");
export const UPDATE_SELECTED_SPACE = Symbol("selected-space");
// Space Room ID/HOME_SPACE will be emitted when a Space's children change
const MAX_SUGGESTED_ROOMS = 20;
+const getSpaceContextKey = (space?: Room) => `mx_space_context_${space?.roomId || "home_space"}`;
+
const partitionSpacesAndRooms = (arr: Room[]): [Room[], Room[]] => { // [spaces, rooms]
return arr.reduce((result, room: Room) => {
result[room.isSpaceRoom() ? 0 : 1].push(room);
@@ -91,6 +94,11 @@ export class SpaceStoreClass extends AsyncStoreWithClient {
// The space currently selected in the Space Panel - if null then `Home` is selected
private _activeSpace?: Room = null;
private _suggestedRooms: ISpaceSummaryRoom[] = [];
+ private _invitedSpaces = new Set();
+
+ public get invitedSpaces(): Room[] {
+ return Array.from(this._invitedSpaces);
+ }
public get spacePanelSpaces(): Room[] {
return this.rootSpaces;
@@ -104,13 +112,41 @@ export class SpaceStoreClass extends AsyncStoreWithClient {
return this._suggestedRooms;
}
- public async setActiveSpace(space: Room | null) {
+ public async setActiveSpace(space: Room | null, contextSwitch = true) {
if (space === this.activeSpace) return;
this._activeSpace = space;
this.emit(UPDATE_SELECTED_SPACE, this.activeSpace);
this.emit(SUGGESTED_ROOMS, this._suggestedRooms = []);
+ if (contextSwitch) {
+ // view last selected room from space
+ const roomId = window.localStorage.getItem(getSpaceContextKey(this.activeSpace));
+
+ // if the space being selected is an invite then always view that invite
+ // else if the last viewed room in this space is joined then view that
+ // else view space home or home depending on what is being clicked on
+ if (space?.getMyMembership !== "invite" &&
+ this.matrixClient?.getRoom(roomId)?.getMyMembership() === "join"
+ ) {
+ defaultDispatcher.dispatch({
+ action: "view_room",
+ room_id: roomId,
+ context_switch: true,
+ });
+ } else if (space) {
+ defaultDispatcher.dispatch({
+ action: "view_room",
+ room_id: space.roomId,
+ context_switch: true,
+ });
+ } else {
+ defaultDispatcher.dispatch({
+ action: "view_home_page",
+ });
+ }
+ }
+
// persist space selected
if (space) {
window.localStorage.setItem(ACTIVE_SPACE_LS_KEY, space.roomId);
@@ -189,25 +225,27 @@ export class SpaceStoreClass extends AsyncStoreWithClient {
return sortBy(parents, r => r.roomId)?.[0] || null;
}
- public getSpaces = () => {
- return this.matrixClient.getRooms().filter(r => r.isSpaceRoom() && r.getMyMembership() === "join");
- };
-
public getSpaceFilteredRoomIds = (space: Room | null): Set => {
return this.spaceFilteredRooms.get(space?.roomId || HOME_SPACE) || new Set();
};
private rebuild = throttle(() => {
- // get all most-upgraded rooms & spaces except spaces which have been left (historical)
- const visibleRooms = this.matrixClient.getVisibleRooms().filter(r => {
- return !r.isSpaceRoom() || r.getMyMembership() === "join";
- });
+ const [visibleSpaces, visibleRooms] = partitionSpacesAndRooms(this.matrixClient.getVisibleRooms());
+ const [joinedSpaces, invitedSpaces] = visibleSpaces.reduce((arr, s) => {
+ if (s.getMyMembership() === "join") {
+ arr[0].push(s);
+ } else if (s.getMyMembership() === "invite") {
+ arr[1].push(s);
+ }
+ return arr;
+ }, [[], []]);
- const unseenChildren = new Set(visibleRooms);
+ // exclude invited spaces from unseenChildren as they will be forcibly shown at the top level of the treeview
+ const unseenChildren = new Set([...visibleRooms, ...joinedSpaces]);
const backrefs = new EnhancedMap>();
// Sort spaces by room ID to force the cycle breaking to be deterministic
- const spaces = sortBy(visibleRooms.filter(r => r.isSpaceRoom()), space => space.roomId);
+ const spaces = sortBy(joinedSpaces, space => space.roomId);
// TODO handle cleaning up links when a Space is removed
spaces.forEach(space => {
@@ -271,6 +309,10 @@ export class SpaceStoreClass extends AsyncStoreWithClient {
this.onRoomsUpdate(); // TODO only do this if a change has happened
this.emit(UPDATE_TOP_LEVEL_SPACES, this.spacePanelSpaces);
+
+ // build initial state of invited spaces as we would have missed the emitted events about the room at launch
+ this._invitedSpaces = new Set(invitedSpaces);
+ this.emit(UPDATE_INVITED_SPACES, this.invitedSpaces);
}, 100, {trailing: true, leading: true});
onSpaceUpdate = () => {
@@ -278,6 +320,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient {
}
private showInHomeSpace = (room: Room) => {
+ if (room.isSpaceRoom()) return false;
return !this.parentMap.get(room.roomId)?.size // put all orphaned rooms in the Home Space
|| DMRoomMap.shared().getUserIdForRoomId(room.roomId) // put all DMs in the Home Space
|| RoomListStore.instance.getTagsForRoom(room).includes(DefaultTagID.Favourite) // show all favourites
@@ -308,8 +351,8 @@ export class SpaceStoreClass extends AsyncStoreWithClient {
const oldFilteredRooms = this.spaceFilteredRooms;
this.spaceFilteredRooms = new Map();
- // put all invites (rooms & spaces) in the Home Space
- const invites = this.matrixClient.getRooms().filter(r => r.getMyMembership() === "invite");
+ // put all room invites in the Home Space
+ const invites = visibleRooms.filter(r => !r.isSpaceRoom() && r.getMyMembership() === "invite");
this.spaceFilteredRooms.set(HOME_SPACE, new Set(invites.map(room => room.roomId)));
visibleRooms.forEach(room => {
@@ -362,13 +405,18 @@ export class SpaceStoreClass extends AsyncStoreWithClient {
this.spaceFilteredRooms.forEach((roomIds, s) => {
// Update NotificationStates
- const rooms = this.matrixClient.getRooms().filter(room => roomIds.has(room.roomId));
- this.getNotificationState(s)?.setRooms(rooms);
+ this.getNotificationState(s)?.setRooms(visibleRooms.filter(room => roomIds.has(room.roomId)));
});
}, 100, {trailing: true, leading: true});
- private onRoom = (room: Room) => {
- if (room?.isSpaceRoom()) {
+ private onRoom = (room: Room, membership?: string, oldMembership?: string) => {
+ if ((membership || room.getMyMembership()) === "invite") {
+ this._invitedSpaces.add(room);
+ this.emit(UPDATE_INVITED_SPACES, this.invitedSpaces);
+ } else if (oldMembership === "invite") {
+ this._invitedSpaces.delete(room);
+ this.emit(UPDATE_INVITED_SPACES, this.invitedSpaces);
+ } else if (room?.isSpaceRoom()) {
this.onSpaceUpdate();
this.emit(room.roomId);
} else {
@@ -376,16 +424,16 @@ export class SpaceStoreClass extends AsyncStoreWithClient {
this.onRoomsUpdate();
}
- // if the user was looking at the room and then joined select that space
- if (room.getMyMembership() === "join" && room.roomId === RoomViewStore.getRoomId()) {
- this.setActiveSpace(room);
- }
-
if (room.getMyMembership() === "join") {
- const numSuggestedRooms = this._suggestedRooms.length;
- this._suggestedRooms = this._suggestedRooms.filter(r => r.room_id !== room.roomId);
- if (numSuggestedRooms !== this._suggestedRooms.length) {
- this.emit(SUGGESTED_ROOMS, this._suggestedRooms);
+ if (!room.isSpaceRoom()) {
+ const numSuggestedRooms = this._suggestedRooms.length;
+ this._suggestedRooms = this._suggestedRooms.filter(r => r.room_id !== room.roomId);
+ if (numSuggestedRooms !== this._suggestedRooms.length) {
+ this.emit(SUGGESTED_ROOMS, this._suggestedRooms);
+ }
+ } else if (room.roomId === RoomViewStore.getRoomId()) {
+ // if the user was looking at the space and then joined: select that space
+ this.setActiveSpace(room);
}
}
};
@@ -421,11 +469,11 @@ export class SpaceStoreClass extends AsyncStoreWithClient {
}
};
- private onRoomAccountData = (ev: MatrixEvent, room: Room, lastEvent: MatrixEvent) => {
+ private onRoomAccountData = (ev: MatrixEvent, room: Room, lastEvent?: MatrixEvent) => {
if (ev.getType() === EventType.Tag && !room.isSpaceRoom()) {
// If the room was in favourites and now isn't or the opposite then update its position in the trees
- const oldTags = lastEvent.getContent()?.tags;
- const newTags = ev.getContent()?.tags;
+ const oldTags = lastEvent?.getContent()?.tags || {};
+ const newTags = ev.getContent()?.tags || {};
if (!!oldTags[DefaultTagID.Favourite] !== !!newTags[DefaultTagID.Favourite]) {
this.onRoomUpdate(room);
}
@@ -488,24 +536,32 @@ export class SpaceStoreClass extends AsyncStoreWithClient {
case "view_room": {
const room = this.matrixClient?.getRoom(payload.room_id);
- if (room?.getMyMembership() === "join") {
- if (room.isSpaceRoom()) {
- this.setActiveSpace(room);
- } else if (!this.spaceFilteredRooms.get(this._activeSpace?.roomId || HOME_SPACE).has(room.roomId)) {
- // TODO maybe reverse these first 2 clauses once space panel active is fixed
- let parent = this.rootSpaces.find(s => this.spaceFilteredRooms.get(s.roomId)?.has(room.roomId));
- if (!parent) {
- parent = this.getCanonicalParent(room.roomId);
- }
- if (!parent) {
- const parents = Array.from(this.parentMap.get(room.roomId) || []);
- parent = parents.find(p => this.matrixClient.getRoom(p));
- }
- if (parent) {
- this.setActiveSpace(parent);
- }
+ // Don't auto-switch rooms when reacting to a context-switch
+ // as this is not helpful and can create loops of rooms/space switching
+ if (!room || payload.context_switch) break;
+
+ // persist last viewed room from a space
+
+ if (room.isSpaceRoom()) {
+ this.setActiveSpace(room);
+ } else if (!this.getSpaceFilteredRoomIds(this.activeSpace).has(room.roomId)) {
+ // TODO maybe reverse these first 2 clauses once space panel active is fixed
+ let parent = this.rootSpaces.find(s => this.spaceFilteredRooms.get(s.roomId)?.has(room.roomId));
+ if (!parent) {
+ parent = this.getCanonicalParent(room.roomId);
}
+ if (!parent) {
+ const parents = Array.from(this.parentMap.get(room.roomId) || []);
+ parent = parents.find(p => this.matrixClient.getRoom(p));
+ }
+ // don't trigger a context switch when we are switching a space to match the chosen room
+ this.setActiveSpace(parent || null, false);
}
+
+ // Persist last viewed room from a space
+ // we don't await setActiveSpace above as we only care about this.activeSpace being up to date
+ // synchronously for the below code - everything else can and should be async.
+ window.localStorage.setItem(getSpaceContextKey(this.activeSpace), payload.room_id);
break;
}
case "after_leave_room":
@@ -525,6 +581,26 @@ export class SpaceStoreClass extends AsyncStoreWithClient {
this.notificationStateMap.set(key, state);
return state;
}
+
+ // traverse space tree with DFS calling fn on each space including the given root one
+ public traverseSpace(
+ spaceId: string,
+ fn: (roomId: string) => void,
+ includeRooms = false,
+ parentPath?: Set,
+ ) {
+ if (parentPath && parentPath.has(spaceId)) return; // prevent cycles
+
+ fn(spaceId);
+
+ const newPath = new Set(parentPath).add(spaceId);
+ const [childSpaces, childRooms] = partitionSpacesAndRooms(this.getChildren(spaceId));
+
+ if (includeRooms) {
+ childRooms.forEach(r => fn(r.roomId));
+ }
+ childSpaces.forEach(s => this.traverseSpace(s.roomId, fn, includeRooms, newPath));
+ }
}
export default class SpaceStore {
diff --git a/src/stores/VoiceRecordingStore.ts b/src/stores/VoiceRecordingStore.ts
new file mode 100644
index 0000000000..cc999f23f8
--- /dev/null
+++ b/src/stores/VoiceRecordingStore.ts
@@ -0,0 +1,80 @@
+/*
+Copyright 2021 The Matrix.org Foundation C.I.C.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import {AsyncStoreWithClient} from "./AsyncStoreWithClient";
+import defaultDispatcher from "../dispatcher/dispatcher";
+import {ActionPayload} from "../dispatcher/payloads";
+import {VoiceRecording} from "../voice/VoiceRecording";
+
+interface IState {
+ recording?: VoiceRecording;
+}
+
+export class VoiceRecordingStore extends AsyncStoreWithClient {
+ private static internalInstance: VoiceRecordingStore;
+
+ public constructor() {
+ super(defaultDispatcher, {});
+ }
+
+ /**
+ * Gets the active recording instance, if any.
+ */
+ public get activeRecording(): VoiceRecording | null {
+ return this.state.recording;
+ }
+
+ public static get instance(): VoiceRecordingStore {
+ if (!VoiceRecordingStore.internalInstance) {
+ VoiceRecordingStore.internalInstance = new VoiceRecordingStore();
+ }
+ return VoiceRecordingStore.internalInstance;
+ }
+
+ protected async onAction(payload: ActionPayload): Promise {
+ // Nothing to do, but we're required to override the function
+ return;
+ }
+
+ /**
+ * Starts a new recording if one isn't already in progress. Note that this simply
+ * creates a recording instance - whether or not recording is actively in progress
+ * can be seen via the VoiceRecording class.
+ * @returns {VoiceRecording} The recording.
+ */
+ public startRecording(): VoiceRecording {
+ if (!this.matrixClient) throw new Error("Cannot start a recording without a MatrixClient");
+ if (this.state.recording) throw new Error("A recording is already in progress");
+
+ const recording = new VoiceRecording(this.matrixClient);
+
+ // noinspection JSIgnoredPromiseFromCall - we can safely run this async
+ this.updateState({recording});
+
+ return recording;
+ }
+
+ /**
+ * Disposes of the current recording, no matter the state of it.
+ * @returns {Promise} Resolves when complete.
+ */
+ public disposeRecording(): Promise {
+ if (this.state.recording) {
+ this.state.recording.destroy(); // stops internally
+ }
+ return this.updateState({recording: null});
+ }
+}
diff --git a/src/stores/notifications/RoomNotificationStateStore.ts b/src/stores/notifications/RoomNotificationStateStore.ts
index 8b5da674f5..7253b46ddd 100644
--- a/src/stores/notifications/RoomNotificationStateStore.ts
+++ b/src/stores/notifications/RoomNotificationStateStore.ts
@@ -22,6 +22,7 @@ import { FetchRoomFn, ListNotificationState } from "./ListNotificationState";
import { Room } from "matrix-js-sdk/src/models/room";
import { RoomNotificationState } from "./RoomNotificationState";
import { SummarizedNotificationState } from "./SummarizedNotificationState";
+import { VisibilityProvider } from "../room-list/filters/VisibilityProvider";
interface IState {}
@@ -47,7 +48,9 @@ export class RoomNotificationStateStore extends AsyncStoreWithClient {
// This will include highlights from the previous version of the room internally
const globalState = new SummarizedNotificationState();
for (const room of this.matrixClient.getVisibleRooms()) {
- globalState.add(this.getRoomState(room));
+ if (VisibilityProvider.instance.isRoomVisible(room)) {
+ globalState.add(this.getRoomState(room));
+ }
}
return globalState;
}
diff --git a/src/stores/room-list/RoomListStore.ts b/src/stores/room-list/RoomListStore.ts
index 88df05b5d0..caab46a0c2 100644
--- a/src/stores/room-list/RoomListStore.ts
+++ b/src/stores/room-list/RoomListStore.ts
@@ -599,11 +599,7 @@ export class RoomListStoreClass extends AsyncStoreWithClient {
private getPlausibleRooms(): Room[] {
if (!this.matrixClient) return [];
- let rooms = [
- ...this.matrixClient.getVisibleRooms(),
- // also show space invites in the room list
- ...this.matrixClient.getRooms().filter(r => r.isSpaceRoom() && r.getMyMembership() === "invite"),
- ].filter(r => VisibilityProvider.instance.isRoomVisible(r));
+ let rooms = this.matrixClient.getVisibleRooms().filter(r => VisibilityProvider.instance.isRoomVisible(r));
if (this.prefilterConditions.length > 0) {
rooms = rooms.filter(r => {
diff --git a/src/stores/room-list/SpaceWatcher.ts b/src/stores/room-list/SpaceWatcher.ts
index d26f563a91..13e1d83901 100644
--- a/src/stores/room-list/SpaceWatcher.ts
+++ b/src/stores/room-list/SpaceWatcher.ts
@@ -28,12 +28,22 @@ export class SpaceWatcher {
private activeSpace: Room = SpaceStore.instance.activeSpace;
constructor(private store: RoomListStoreClass) {
- this.filter.updateSpace(this.activeSpace); // get the filter into a consistent state
+ this.updateFilter(); // get the filter into a consistent state
store.addFilter(this.filter);
SpaceStore.instance.on(UPDATE_SELECTED_SPACE, this.onSelectedSpaceUpdated);
}
- private onSelectedSpaceUpdated = (activeSpace) => {
- this.filter.updateSpace(this.activeSpace = activeSpace);
+ private onSelectedSpaceUpdated = (activeSpace: Room) => {
+ this.activeSpace = activeSpace;
+ this.updateFilter();
+ };
+
+ private updateFilter = () => {
+ if (this.activeSpace) {
+ SpaceStore.instance.traverseSpace(this.activeSpace.roomId, roomId => {
+ this.store.matrixClient?.getRoom(roomId)?.loadMembersIfNeeded();
+ });
+ }
+ this.filter.updateSpace(this.activeSpace);
};
}
diff --git a/src/stores/room-list/filters/SpaceFilterCondition.ts b/src/stores/room-list/filters/SpaceFilterCondition.ts
index ad0ab88868..43bdcb3879 100644
--- a/src/stores/room-list/filters/SpaceFilterCondition.ts
+++ b/src/stores/room-list/filters/SpaceFilterCondition.ts
@@ -42,10 +42,16 @@ export class SpaceFilterCondition extends EventEmitter implements IFilterConditi
private onStoreUpdate = async (): Promise => {
const beforeRoomIds = this.roomIds;
- this.roomIds = SpaceStore.instance.getSpaceFilteredRoomIds(this.space);
+ // clone the set as it may be mutated by the space store internally
+ this.roomIds = new Set(SpaceStore.instance.getSpaceFilteredRoomIds(this.space));
if (setHasDiff(beforeRoomIds, this.roomIds)) {
this.emit(FILTER_CHANGED);
+ // XXX: Room List Store has a bug where updates to the pre-filter during a local echo of a
+ // tags transition seem to be ignored, so refire in the next tick to work around it
+ setImmediate(() => {
+ this.emit(FILTER_CHANGED);
+ });
}
};
diff --git a/src/utils/Mouse.ts b/src/utils/Mouse.ts
new file mode 100644
index 0000000000..a85c6492c4
--- /dev/null
+++ b/src/utils/Mouse.ts
@@ -0,0 +1,50 @@
+/*
+Copyright 2021 Šimon Brandner
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+/**
+ * Different browsers use different deltaModes. This causes different behaviour.
+ * To avoid that we use this function to convert any event to pixels.
+ * @param {WheelEvent} event to normalize
+ * @returns {WheelEvent} normalized event event
+ */
+export function normalizeWheelEvent(event: WheelEvent): WheelEvent {
+ const LINE_HEIGHT = 18;
+
+ let deltaX;
+ let deltaY;
+ let deltaZ;
+
+ if (event.deltaMode === 1) { // Units are lines
+ deltaX = (event.deltaX * LINE_HEIGHT);
+ deltaY = (event.deltaY * LINE_HEIGHT);
+ deltaZ = (event.deltaZ * LINE_HEIGHT);
+ } else {
+ deltaX = event.deltaX;
+ deltaY = event.deltaY;
+ deltaZ = event.deltaZ;
+ }
+
+ return new WheelEvent(
+ "syntheticWheel",
+ {
+ deltaMode: 0,
+ deltaY: deltaY,
+ deltaX: deltaX,
+ deltaZ: deltaZ,
+ ...event,
+ },
+ );
+}
diff --git a/src/utils/Singleflight.ts b/src/utils/Singleflight.ts
new file mode 100644
index 0000000000..c2a564ea3e
--- /dev/null
+++ b/src/utils/Singleflight.ts
@@ -0,0 +1,126 @@
+/*
+Copyright 2021 The Matrix.org Foundation C.I.C.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import {EnhancedMap} from "./maps";
+
+// Inspired by https://pkg.go.dev/golang.org/x/sync/singleflight
+
+const keyMap = new EnhancedMap