From 7367c73a37a795f1baf3e8be0f33da51ca97dbd7 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Jan 2020 10:50:02 +0000 Subject: [PATCH 001/906] Searchbox Enter is to clear, tabbing to clear button doesn't work, remove it Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/SearchBox.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/structures/SearchBox.js b/src/components/structures/SearchBox.js index 9090152de8..6bf7c754f0 100644 --- a/src/components/structures/SearchBox.js +++ b/src/components/structures/SearchBox.js @@ -133,9 +133,11 @@ module.exports = createReactClass({ return null; } const clearButton = (!this.state.blurred || this.state.searchTerm) ? - ( {this._clearSearch("button"); } }> + ( {this._clearSearch("button"); } }> ) : undefined; // show a shorter placeholder when blurred, if requested From 5252cf4c454c8790ea7f5d12eb7e8ac426aa57a7 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 15 Jan 2020 02:44:22 +0000 Subject: [PATCH 002/906] Implement roving tab index context based magic thing and demo on LeftPanel Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/rooms/_RoomTile.scss | 5 +- src/components/structures/LeftPanel.js | 3 - src/components/structures/RoomSubList.js | 36 +++- .../views/groups/GroupInviteTile.js | 17 +- src/components/views/rooms/RoomList.js | 5 +- src/components/views/rooms/RoomTile.js | 8 +- src/contexts/RovingTabIndexContext.js | 193 ++++++++++++++++++ 7 files changed, 242 insertions(+), 25 deletions(-) create mode 100644 src/contexts/RovingTabIndexContext.js diff --git a/res/css/views/rooms/_RoomTile.scss b/res/css/views/rooms/_RoomTile.scss index cb1137bb2f..db2c09f6f1 100644 --- a/res/css/views/rooms/_RoomTile.scss +++ b/res/css/views/rooms/_RoomTile.scss @@ -142,10 +142,11 @@ limitations under the License. } } -// toggle menuButton and badge on hover/menu displayed +// toggle menuButton and badge on menu displayed .mx_RoomTile_menuDisplayed, // or on keyboard focus of room tile -.mx_RoomTile.focus-visible:focus-within, +.mx_LeftPanel_container:not(.collapsed) .mx_RoomTile:focus-within, +// or on pointer hover .mx_LeftPanel_container:not(.collapsed) .mx_RoomTile:hover { .mx_RoomTile_menuButton { display: block; diff --git a/src/components/structures/LeftPanel.js b/src/components/structures/LeftPanel.js index 796840a625..3444225d06 100644 --- a/src/components/structures/LeftPanel.js +++ b/src/components/structures/LeftPanel.js @@ -129,9 +129,6 @@ const LeftPanel = createReactClass({ if (!this.focusedElement) return; switch (ev.key) { - case Key.TAB: - this._onMoveFocus(ev, ev.shiftKey); - break; case Key.ARROW_UP: this._onMoveFocus(ev, true, true); break; diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js index 123ed7c4e1..915a952e79 100644 --- a/src/components/structures/RoomSubList.js +++ b/src/components/structures/RoomSubList.js @@ -31,6 +31,7 @@ import PropTypes from 'prop-types'; import RoomTile from "../views/rooms/RoomTile"; import LazyRenderList from "../views/elements/LazyRenderList"; import {_t} from "../../languageHandler"; +import {RovingTabIndex, RovingTabIndexGroup} from "../../contexts/RovingTabIndexContext"; // turn this on for drop & drag console debugging galore const debug = false; @@ -272,20 +273,32 @@ export default class RoomSubList extends React.PureComponent { // Wrap the contents in a div and apply styles to the child div so that the browser default outline works if (subListNotifCount > 0) { badge = ( - +
{ FormattingUtils.formatCount(subListNotifCount) }
-
+ ); } else if (this.props.isInvite && this.props.list.length) { // no notifications but highlight anyway because this is an invite badge badge = ( - +
{ this.props.list.length }
-
+ ); } } @@ -308,7 +321,9 @@ export default class RoomSubList extends React.PureComponent { let addRoomButton; if (this.props.onAddRoom) { addRoomButton = ( - ); } - return ( + return
- {this.props.label} { incomingCall } - + { badge } { addRoomButton }
- ); +
; } checkOverflow = () => { diff --git a/src/components/views/groups/GroupInviteTile.js b/src/components/views/groups/GroupInviteTile.js index c0d0d9eafe..e7ccbdf40b 100644 --- a/src/components/views/groups/GroupInviteTile.js +++ b/src/components/views/groups/GroupInviteTile.js @@ -26,6 +26,7 @@ import classNames from 'classnames'; import MatrixClientPeg from "../../../MatrixClientPeg"; import {ContextMenu, ContextMenuButton, toRightOf} from "../../structures/ContextMenu"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; +import {RovingTabIndex, RovingTabIndexGroup} from "../../../contexts/RovingTabIndexContext"; // XXX this class copies a lot from RoomTile.js export default createReactClass({ @@ -138,14 +139,16 @@ export default createReactClass({ const badgeContent = badgeEllipsis ? '\u00B7\u00B7\u00B7' : '!'; const badge = ( - { badgeContent } - + ); let tooltip; @@ -170,8 +173,10 @@ export default createReactClass({ ); } - return - + { tooltip } - + { contextMenu } - ; + ; }, }); diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index 35a5ca9e66..277aedb65e 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -41,6 +41,7 @@ import ResizeHandle from '../elements/ResizeHandle'; import {Resizer} from '../../../resizer'; import {Layout, Distributor} from '../../../resizer/distributors/roomsublist2'; +import {RovingTabIndexContextWrapper} from "../../../contexts/RovingTabIndexContext"; const HIDE_CONFERENCE_CHANS = true; const STANDARD_TAGS_REGEX = /^(m\.(favourite|lowpriority|server_notice)|im\.vector\.fake\.(invite|recent|direct|archived))$/; const HOVER_MOVE_TIMEOUT = 1000; @@ -788,7 +789,9 @@ module.exports = createReactClass({ onMouseMove={this.onMouseMove} onMouseLeave={this.onMouseLeave} > - { subListComponents } + + { subListComponents } + ); }, diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index 4dbcc7ca03..6358564042 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -32,6 +32,7 @@ import ActiveRoomObserver from '../../../ActiveRoomObserver'; import RoomViewStore from '../../../stores/RoomViewStore'; import SettingsStore from "../../../settings/SettingsStore"; import {_t} from "../../../languageHandler"; +import {RovingTabIndex} from "../../../contexts/RovingTabIndexContext"; module.exports = createReactClass({ displayName: 'RoomTile', @@ -432,8 +433,9 @@ module.exports = createReactClass({ } return - { /* { incomingCallBox } */ } { tooltip } - + { contextMenu } ; diff --git a/src/contexts/RovingTabIndexContext.js b/src/contexts/RovingTabIndexContext.js new file mode 100644 index 0000000000..a571bd2eae --- /dev/null +++ b/src/contexts/RovingTabIndexContext.js @@ -0,0 +1,193 @@ +/* + * + * Copyright 2019 Michael Telatynski <7t3chguy@gmail.com> + * + * 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 React, { + createContext, + useCallback, + useContext, + useLayoutEffect, + useMemo, + useRef, + useReducer, +} from "react"; +import PropTypes from "prop-types"; +import {Key} from "../Keyboard"; + +const DOCUMENT_POSITION_PRECEDING = 2; +const ANY = Symbol(); + +const RovingTabIndexContext = createContext({ + state: { + activeRef: null, + refs: [], + }, + dispatch: () => {}, +}); +RovingTabIndexContext.displayName = "RovingTabIndexContext"; + +// TODO use a TypeScript type here +const types = { + REGISTER: "REGISTER", + UNREGISTER: "UNREGISTER", + SET_FOCUS: "SET_FOCUS", +}; + +const reducer = (state, action) => { + switch (action.type) { + case types.REGISTER: { + if (state.refs.length === 0) { + return { + ...state, + activeRef: action.payload.ref, + refs: [action.payload.ref], + }; + } + + if (state.refs.includes(action.payload.ref)) { + return state; // already in refs, this should not happen + } + + let newIndex = state.refs.findIndex(ref => { + return ref.current.compareDocumentPosition(action.payload.ref.current) & DOCUMENT_POSITION_PRECEDING; + }); + + if (newIndex < 0) { + newIndex = state.refs.length; // append to the end + } + + return { + ...state, + refs: [ + ...state.refs.slice(0, newIndex), + action.payload.ref, + ...state.refs.slice(newIndex), + ], + }; + } + case types.UNREGISTER: { + const refs = state.refs.filter(r => r !== action.payload.ref); // keep all other refs + + if (refs.length === state.refs.length) { + return state; // already removed, this should not happen + } + + if (state.activeRef === action.payload.ref) { // we just removed the active ref, need to replace it + const oldIndex = state.refs.findIndex(r => r === action.payload.ref); + return { + ...state, + activeRef: oldIndex >= refs.length ? refs[refs.length - 1] : refs[oldIndex], + refs, + }; + } + + return { + ...state, + refs, + }; + } + case types.SET_FOCUS: { + return { + ...state, + activeRef: action.payload.ref, + }; + } + default: + return state; + } +}; + +export const RovingTabIndexContextWrapper = ({children}) => { + const [state, dispatch] = useReducer(reducer, { + activeRef: null, + refs: [], + }); + + const context = useMemo(() => ({state, dispatch}), [state]); + + return + {children} + ; +}; + +export const useRovingTabIndex = () => { + const ref = useRef(null); + const context = useContext(RovingTabIndexContext); + + // setup/teardown + // add ref to the context + useLayoutEffect(() => { + context.dispatch({ + type: types.REGISTER, + payload: {ref}, + }); + return () => { + context.dispatch({ + type: types.UNREGISTER, + payload: {ref}, + }); + }; + }, []); // eslint-disable-line react-hooks/exhaustive-deps + + const onFocus = useCallback(() => { + context.dispatch({ + type: types.SET_FOCUS, + payload: {ref}, + }); + }, [ref, context]); + const isActive = context.state.activeRef === ref || context.state.activeRef === ANY; + return [onFocus, isActive, ref]; +}; + +export const RovingTabIndexGroup = ({children}) => { + const [onFocus, isActive, ref] = useRovingTabIndex(); + + // fake reducer dispatch to catch SET_FOCUS calls and pass them to parent as a focus of the group + const dispatch = useCallback(({type}) => { + if (type === types.SET_FOCUS) { + onFocus(); + } + }, [onFocus]); + + const context = useMemo(() => ({ + state: {activeRef: isActive ? ANY : undefined}, + dispatch, + }), [isActive, dispatch]); + + return
+ + {children} + +
; +}; + +// Wraps a given element to attach it to the roving context, props onFocus and tabIndex overridden +export const RovingTabIndex = ({component: E, useInputRef, ...props}) => { + const [onFocus, isActive, ref] = useRovingTabIndex(); + const refProps = {}; + if (useInputRef) { + refProps.inputRef = ref; + } else { + refProps.ref = ref; + } + return ; +}; +RovingTabIndex.propTypes = { + component: PropTypes.elementType.isRequired, + useInputRef: PropTypes.bool, // whether to pass inputRef instead of ref like for AccessibleButton +}; + From dedf1eab315347cd85ea45ed3d6a85d60f542104 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 15 Jan 2020 11:37:14 +0000 Subject: [PATCH 003/906] Iterate to get rid of the magic group and just provide a generic functional render wrapper Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/RoomSubList.js | 149 +++++++++--------- .../views/groups/GroupInviteTile.js | 67 ++++---- src/components/views/rooms/RoomTile.js | 69 ++++---- src/contexts/RovingTabIndexContext.js | 81 +++++----- 4 files changed, 184 insertions(+), 182 deletions(-) diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js index 915a952e79..98e69f6edb 100644 --- a/src/components/structures/RoomSubList.js +++ b/src/components/structures/RoomSubList.js @@ -31,7 +31,7 @@ import PropTypes from 'prop-types'; import RoomTile from "../views/rooms/RoomTile"; import LazyRenderList from "../views/elements/LazyRenderList"; import {_t} from "../../languageHandler"; -import {RovingTabIndex, RovingTabIndexGroup} from "../../contexts/RovingTabIndexContext"; +import {RovingTabIndexWrapper} from "../../contexts/RovingTabIndexContext"; // turn this on for drop & drag console debugging galore const debug = false; @@ -264,45 +264,6 @@ export default class RoomSubList extends React.PureComponent { const subListNotifCount = subListNotifications.count; const subListNotifHighlight = subListNotifications.highlight; - let badge; - if (!this.props.collapsed) { - const badgeClasses = classNames({ - 'mx_RoomSubList_badge': true, - 'mx_RoomSubList_badgeHighlight': subListNotifHighlight, - }); - // Wrap the contents in a div and apply styles to the child div so that the browser default outline works - if (subListNotifCount > 0) { - badge = ( - -
- { FormattingUtils.formatCount(subListNotifCount) } -
-
- ); - } else if (this.props.isInvite && this.props.list.length) { - // no notifications but highlight anyway because this is an invite badge - badge = ( - -
- { this.props.list.length } -
-
- ); - } - } - // When collapsed, allow a long hover on the header to show user // the full tag name and room count let title; @@ -318,19 +279,6 @@ export default class RoomSubList extends React.PureComponent { ; } - let addRoomButton; - if (this.props.onAddRoom) { - addRoomButton = ( - - ); - } - const len = this.props.list.length + this.props.extraTiles.length; let chevron; if (len) { @@ -342,26 +290,81 @@ export default class RoomSubList extends React.PureComponent { chevron = (
); } - return -
- - { chevron } - {this.props.label} - { incomingCall } - - { badge } - { addRoomButton } -
-
; + return + {({onFocus, isActive, ref}) => { + const tabIndex = isActive ? 0 : -1; + + let badge; + if (!this.props.collapsed) { + const badgeClasses = classNames({ + 'mx_RoomSubList_badge': true, + 'mx_RoomSubList_badgeHighlight': subListNotifHighlight, + }); + // Wrap the contents in a div and apply styles to the child div so that the browser default outline works + if (subListNotifCount > 0) { + badge = ( + +
+ { FormattingUtils.formatCount(subListNotifCount) } +
+
+ ); + } else if (this.props.isInvite && this.props.list.length) { + // no notifications but highlight anyway because this is an invite badge + badge = ( + +
+ { this.props.list.length } +
+
+ ); + } + } + + let addRoomButton; + if (this.props.onAddRoom) { + addRoomButton = ( + + ); + } + + return ( +
+ + { chevron } + {this.props.label} + { incomingCall } + + { badge } + { addRoomButton } +
+ ); + } } +
; } checkOverflow = () => { diff --git a/src/components/views/groups/GroupInviteTile.js b/src/components/views/groups/GroupInviteTile.js index e7ccbdf40b..70baeb1e78 100644 --- a/src/components/views/groups/GroupInviteTile.js +++ b/src/components/views/groups/GroupInviteTile.js @@ -26,7 +26,7 @@ import classNames from 'classnames'; import MatrixClientPeg from "../../../MatrixClientPeg"; import {ContextMenu, ContextMenuButton, toRightOf} from "../../structures/ContextMenu"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; -import {RovingTabIndex, RovingTabIndexGroup} from "../../../contexts/RovingTabIndexContext"; +import {RovingTabIndexWrapper} from "../../../contexts/RovingTabIndexContext"; // XXX this class copies a lot from RoomTile.js export default createReactClass({ @@ -138,18 +138,6 @@ export default createReactClass({ }); const badgeContent = badgeEllipsis ? '\u00B7\u00B7\u00B7' : '!'; - const badge = ( - - { badgeContent } - - ); let tooltip; if (this.props.collapsed && this.state.hover) { @@ -173,27 +161,40 @@ export default createReactClass({ ); } - return - -
- { av } -
-
- { label } - { badge } -
- { tooltip } -
+ return + + {({onFocus, isActive, ref}) => + +
+ { av } +
+
+ { label } + + { badgeContent } + +
+ { tooltip } +
+ } +
{ contextMenu } -
; + ; }, }); diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index 6358564042..001baf0b96 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -32,7 +32,7 @@ import ActiveRoomObserver from '../../../ActiveRoomObserver'; import RoomViewStore from '../../../stores/RoomViewStore'; import SettingsStore from "../../../settings/SettingsStore"; import {_t} from "../../../languageHandler"; -import {RovingTabIndex} from "../../../contexts/RovingTabIndexContext"; +import {RovingTabIndexWrapper} from "../../../contexts/RovingTabIndexContext"; module.exports = createReactClass({ displayName: 'RoomTile', @@ -433,37 +433,42 @@ module.exports = createReactClass({ } return - -
-
- - { dmIndicator } -
-
- { privateIcon } -
-
- { label } - { subtextLabel } -
- { dmOnline } - { contextMenuButton } - { badge } -
- { /* { incomingCallBox } */ } - { tooltip } -
+ + {({onFocus, isActive, ref}) => + +
+
+ + { dmIndicator } +
+
+ { privateIcon } +
+
+ { label } + { subtextLabel } +
+ { dmOnline } + { contextMenuButton } + { badge } +
+ { /* { incomingCallBox } */ } + { tooltip } +
+ } +
{ contextMenu }
; diff --git a/src/contexts/RovingTabIndexContext.js b/src/contexts/RovingTabIndexContext.js index a571bd2eae..f5001d28cc 100644 --- a/src/contexts/RovingTabIndexContext.js +++ b/src/contexts/RovingTabIndexContext.js @@ -25,11 +25,9 @@ import React, { useRef, useReducer, } from "react"; -import PropTypes from "prop-types"; import {Key} from "../Keyboard"; const DOCUMENT_POSITION_PRECEDING = 2; -const ANY = Symbol(); const RovingTabIndexContext = createContext({ state: { @@ -119,15 +117,42 @@ export const RovingTabIndexContextWrapper = ({children}) => { const context = useMemo(() => ({state, dispatch}), [state]); - return - {children} - ; + const onKeyDown = useCallback((ev) => { + if (state.refs.length <= 0) return; + + let handled = true; + switch (ev.key) { + case Key.HOME: + setImmediate(() => state.refs[0].current.focus()); + break; + case Key.END: + state.refs[state.refs.length - 1].current.focus(); + break; + default: + handled = false; + } + + if (handled) { + ev.preventDefault(); + ev.stopPropagation(); + } + }, [state]); + + return
+ + {children} + +
; }; -export const useRovingTabIndex = () => { - const ref = useRef(null); +export const useRovingTabIndex = (inputRef) => { + let ref = useRef(null); const context = useContext(RovingTabIndexContext); + if (inputRef) { + ref = inputRef; + } + // setup/teardown // add ref to the context useLayoutEffect(() => { @@ -149,45 +174,13 @@ export const useRovingTabIndex = () => { payload: {ref}, }); }, [ref, context]); - const isActive = context.state.activeRef === ref || context.state.activeRef === ANY; + + const isActive = context.state.activeRef === ref; return [onFocus, isActive, ref]; }; -export const RovingTabIndexGroup = ({children}) => { - const [onFocus, isActive, ref] = useRovingTabIndex(); - - // fake reducer dispatch to catch SET_FOCUS calls and pass them to parent as a focus of the group - const dispatch = useCallback(({type}) => { - if (type === types.SET_FOCUS) { - onFocus(); - } - }, [onFocus]); - - const context = useMemo(() => ({ - state: {activeRef: isActive ? ANY : undefined}, - dispatch, - }), [isActive, dispatch]); - - return
- - {children} - -
; -}; - -// Wraps a given element to attach it to the roving context, props onFocus and tabIndex overridden -export const RovingTabIndex = ({component: E, useInputRef, ...props}) => { - const [onFocus, isActive, ref] = useRovingTabIndex(); - const refProps = {}; - if (useInputRef) { - refProps.inputRef = ref; - } else { - refProps.ref = ref; - } - return ; -}; -RovingTabIndex.propTypes = { - component: PropTypes.elementType.isRequired, - useInputRef: PropTypes.bool, // whether to pass inputRef instead of ref like for AccessibleButton +export const RovingTabIndexWrapper = ({children, inputRef}) => { + const [onFocus, isActive, ref] = useRovingTabIndex(inputRef); + return children({onFocus, isActive, ref}); }; From 2b37fe76242fe1ae328d435abb8d82ca454ec13d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 16 Jan 2020 00:40:08 +0000 Subject: [PATCH 004/906] do some renaming Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/rooms/RoomList.js | 6 +++--- src/contexts/RovingTabIndexContext.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index 45ff940c22..4441b4d539 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -39,7 +39,7 @@ import * as sdk from "../../../index"; import * as Receipt from "../../../utils/Receipt"; import {Resizer} from '../../../resizer'; import {Layout, Distributor} from '../../../resizer/distributors/roomsublist2'; -import {RovingTabIndexContextWrapper} from "../../../contexts/RovingTabIndexContext"; +import {RovingTabIndexContextProvider} from "../../../contexts/RovingTabIndexContext"; const HIDE_CONFERENCE_CHANS = true; const STANDARD_TAGS_REGEX = /^(m\.(favourite|lowpriority|server_notice)|im\.vector\.fake\.(invite|recent|direct|archived))$/; @@ -788,9 +788,9 @@ export default createReactClass({ onMouseMove={this.onMouseMove} onMouseLeave={this.onMouseLeave} > - + { subListComponents } - +
); }, diff --git a/src/contexts/RovingTabIndexContext.js b/src/contexts/RovingTabIndexContext.js index f5001d28cc..182a7f5504 100644 --- a/src/contexts/RovingTabIndexContext.js +++ b/src/contexts/RovingTabIndexContext.js @@ -109,7 +109,7 @@ const reducer = (state, action) => { } }; -export const RovingTabIndexContextWrapper = ({children}) => { +export const RovingTabIndexContextProvider = ({children}) => { const [state, dispatch] = useReducer(reducer, { activeRef: null, refs: [], From 8c1fdf4cabfb0984f5d34d4656bc3e48d345d7d8 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 16 Jan 2020 01:25:44 +0000 Subject: [PATCH 005/906] tidy up Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/contexts/RovingTabIndexContext.js | 78 ++++++++++++++++++--------- 1 file changed, 54 insertions(+), 24 deletions(-) diff --git a/src/contexts/RovingTabIndexContext.js b/src/contexts/RovingTabIndexContext.js index 182a7f5504..2e8439d2a4 100644 --- a/src/contexts/RovingTabIndexContext.js +++ b/src/contexts/RovingTabIndexContext.js @@ -1,20 +1,18 @@ /* - * - * Copyright 2019 Michael Telatynski <7t3chguy@gmail.com> - * - * 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. - * / - */ +Copyright 2020 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 React, { createContext, @@ -27,12 +25,25 @@ import React, { } from "react"; import {Key} from "../Keyboard"; +/** + * Module to simplify implementing the Roving TabIndex accessibility technique + * + * Wrap the Widget in an RovingTabIndexContextProvider + * and then for all buttons make use of useRovingTabIndex or RovingTabIndexWrapper. + * The code will keep track of which tabIndex was most recently focused and expose that information as `isActive` which + * can then be used to only set the tabIndex to 0 as expected by the roving tabindex technique. + * When the active button gets unmounted the closest button will be chosen as expected. + * Initially the first button to mount will be given active state. + * + * https://developer.mozilla.org/en-US/docs/Web/Accessibility/Keyboard-navigable_JavaScript_widgets#Technique_1_Roving_tabindex + */ + const DOCUMENT_POSITION_PRECEDING = 2; const RovingTabIndexContext = createContext({ state: { activeRef: null, - refs: [], + refs: [], // list of refs in DOM order }, dispatch: () => {}, }); @@ -49,6 +60,7 @@ const reducer = (state, action) => { switch (action.type) { case types.REGISTER: { if (state.refs.length === 0) { + // Our list of refs was empty, set activeRef to this first item return { ...state, activeRef: action.payload.ref, @@ -60,6 +72,7 @@ const reducer = (state, action) => { return state; // already in refs, this should not happen } + // find the index of the first ref which is not preceding this one in DOM order let newIndex = state.refs.findIndex(ref => { return ref.current.compareDocumentPosition(action.payload.ref.current) & DOCUMENT_POSITION_PRECEDING; }); @@ -68,6 +81,7 @@ const reducer = (state, action) => { newIndex = state.refs.length; // append to the end } + // update the refs list return { ...state, refs: [ @@ -78,13 +92,16 @@ const reducer = (state, action) => { }; } case types.UNREGISTER: { - const refs = state.refs.filter(r => r !== action.payload.ref); // keep all other refs + // filter out the ref which we are removing + const refs = state.refs.filter(r => r !== action.payload.ref); if (refs.length === state.refs.length) { return state; // already removed, this should not happen } - if (state.activeRef === action.payload.ref) { // we just removed the active ref, need to replace it + if (state.activeRef === action.payload.ref) { + // we just removed the active ref, need to replace it + // pick the ref which is now in the index the old ref was in const oldIndex = state.refs.findIndex(r => r === action.payload.ref); return { ...state, @@ -93,12 +110,14 @@ const reducer = (state, action) => { }; } + // update the refs list return { ...state, refs, }; } case types.SET_FOCUS: { + // update active ref return { ...state, activeRef: action.payload.ref, @@ -115,17 +134,18 @@ export const RovingTabIndexContextProvider = ({children}) => { refs: [], }); - const context = useMemo(() => ({state, dispatch}), [state]); - const onKeyDown = useCallback((ev) => { + // check if we actually have any items if (state.refs.length <= 0) return; let handled = true; switch (ev.key) { case Key.HOME: + // move focus to first item setImmediate(() => state.refs[0].current.focus()); break; case Key.END: + // move focus to last item state.refs[state.refs.length - 1].current.focus(); break; default: @@ -138,6 +158,9 @@ export const RovingTabIndexContextProvider = ({children}) => { } }, [state]); + const context = useMemo(() => ({state, dispatch}), [state]); + + // wrap in a div with key-down handling for HOME/END keys return
{children} @@ -145,21 +168,27 @@ export const RovingTabIndexContextProvider = ({children}) => {
; }; +// Hook to register a roving tab index +// inputRef parameter specifies the ref to use +// onFocus should be called when the index gained focus in any manner +// isActive should be used to set tabIndex in a manner such as `tabIndex={isActive ? 0 : -1}` +// ref should be passed to a DOM node which will be used for DOM compareDocumentPosition export const useRovingTabIndex = (inputRef) => { - let ref = useRef(null); const context = useContext(RovingTabIndexContext); + let ref = useRef(null); if (inputRef) { + // if we are given a ref, use it instead of ours ref = inputRef; } - // setup/teardown - // add ref to the context + // setup (after refs) useLayoutEffect(() => { context.dispatch({ type: types.REGISTER, payload: {ref}, }); + // teardown return () => { context.dispatch({ type: types.UNREGISTER, @@ -179,6 +208,7 @@ export const useRovingTabIndex = (inputRef) => { return [onFocus, isActive, ref]; }; +// Wrapper to allow use of useRovingTabIndex outside of React Functional Components. export const RovingTabIndexWrapper = ({children, inputRef}) => { const [onFocus, isActive, ref] = useRovingTabIndex(inputRef); return children({onFocus, isActive, ref}); From 781db63fa639e286622542bc7cba4e29c3c17e5f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 16 Jan 2020 01:35:42 +0000 Subject: [PATCH 006/906] split out home/end handling into a helper as not all roving-tab-index widgets want it Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/rooms/RoomList.js | 6 ++++-- src/contexts/RovingTabIndexContext.js | 26 ++++++++++++++++---------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index 4441b4d539..21cd1ed719 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -39,7 +39,7 @@ import * as sdk from "../../../index"; import * as Receipt from "../../../utils/Receipt"; import {Resizer} from '../../../resizer'; import {Layout, Distributor} from '../../../resizer/distributors/roomsublist2'; -import {RovingTabIndexContextProvider} from "../../../contexts/RovingTabIndexContext"; +import {RovingTabIndexContextProvider, RovingTabIndexHomeEndHelper} from "../../../contexts/RovingTabIndexContext"; const HIDE_CONFERENCE_CHANS = true; const STANDARD_TAGS_REGEX = /^(m\.(favourite|lowpriority|server_notice)|im\.vector\.fake\.(invite|recent|direct|archived))$/; @@ -789,7 +789,9 @@ export default createReactClass({ onMouseLeave={this.onMouseLeave} > - { subListComponents } + + { subListComponents } + ); diff --git a/src/contexts/RovingTabIndexContext.js b/src/contexts/RovingTabIndexContext.js index 2e8439d2a4..55ac19e40f 100644 --- a/src/contexts/RovingTabIndexContext.js +++ b/src/contexts/RovingTabIndexContext.js @@ -134,19 +134,30 @@ export const RovingTabIndexContextProvider = ({children}) => { refs: [], }); + const context = useMemo(() => ({state, dispatch}), [state]); + + return + {children} + ; +}; + +// Helper to handle Home/End to jump to first/last roving-tab-index for widgets such as treeview +export const RovingTabIndexHomeEndHelper = ({children}) => { + const context = useContext(RovingTabIndexContext); + const onKeyDown = useCallback((ev) => { // check if we actually have any items - if (state.refs.length <= 0) return; + if (context.state.refs.length <= 0) return; let handled = true; switch (ev.key) { case Key.HOME: // move focus to first item - setImmediate(() => state.refs[0].current.focus()); + setImmediate(() => context.state.refs[0].current.focus()); break; case Key.END: // move focus to last item - state.refs[state.refs.length - 1].current.focus(); + context.state.refs[context.state.refs.length - 1].current.focus(); break; default: handled = false; @@ -156,15 +167,10 @@ export const RovingTabIndexContextProvider = ({children}) => { ev.preventDefault(); ev.stopPropagation(); } - }, [state]); + }, [context.state]); - const context = useMemo(() => ({state, dispatch}), [state]); - - // wrap in a div with key-down handling for HOME/END keys return
- - {children} - + { children }
; }; From 2230b7732a703215c49a356697a7acd9cd969383 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 16 Jan 2020 01:45:16 +0000 Subject: [PATCH 007/906] rearrange Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../RovingTabIndex.js} | 2 +- src/components/structures/RoomSubList.js | 2 +- src/components/views/groups/GroupInviteTile.js | 2 +- src/components/views/rooms/RoomList.js | 6 +++--- src/components/views/rooms/RoomTile.js | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) rename src/{contexts/RovingTabIndexContext.js => accessibility/RovingTabIndex.js} (99%) diff --git a/src/contexts/RovingTabIndexContext.js b/src/accessibility/RovingTabIndex.js similarity index 99% rename from src/contexts/RovingTabIndexContext.js rename to src/accessibility/RovingTabIndex.js index 55ac19e40f..ad2051f1f1 100644 --- a/src/contexts/RovingTabIndexContext.js +++ b/src/accessibility/RovingTabIndex.js @@ -128,7 +128,7 @@ const reducer = (state, action) => { } }; -export const RovingTabIndexContextProvider = ({children}) => { +export const RovingTabIndexProvider = ({children}) => { const [state, dispatch] = useReducer(reducer, { activeRef: null, refs: [], diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js index 775b6b69ce..2d41abf902 100644 --- a/src/components/structures/RoomSubList.js +++ b/src/components/structures/RoomSubList.js @@ -31,7 +31,7 @@ import PropTypes from 'prop-types'; import RoomTile from "../views/rooms/RoomTile"; import LazyRenderList from "../views/elements/LazyRenderList"; import {_t} from "../../languageHandler"; -import {RovingTabIndexWrapper} from "../../contexts/RovingTabIndexContext"; +import {RovingTabIndexWrapper} from "../../accessibility/RovingTabIndex"; // turn this on for drop & drag console debugging galore const debug = false; diff --git a/src/components/views/groups/GroupInviteTile.js b/src/components/views/groups/GroupInviteTile.js index 488c1e20cf..3b15c6ff41 100644 --- a/src/components/views/groups/GroupInviteTile.js +++ b/src/components/views/groups/GroupInviteTile.js @@ -26,7 +26,7 @@ import classNames from 'classnames'; import {MatrixClientPeg} from "../../../MatrixClientPeg"; import {ContextMenu, ContextMenuButton, toRightOf} from "../../structures/ContextMenu"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; -import {RovingTabIndexWrapper} from "../../../contexts/RovingTabIndexContext"; +import {RovingTabIndexWrapper} from "../../../accessibility/RovingTabIndex"; // XXX this class copies a lot from RoomTile.js export default createReactClass({ diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index 21cd1ed719..a137a36c60 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -39,7 +39,7 @@ import * as sdk from "../../../index"; import * as Receipt from "../../../utils/Receipt"; import {Resizer} from '../../../resizer'; import {Layout, Distributor} from '../../../resizer/distributors/roomsublist2'; -import {RovingTabIndexContextProvider, RovingTabIndexHomeEndHelper} from "../../../contexts/RovingTabIndexContext"; +import {RovingTabIndexProvider, RovingTabIndexHomeEndHelper} from "../../../accessibility/RovingTabIndex"; const HIDE_CONFERENCE_CHANS = true; const STANDARD_TAGS_REGEX = /^(m\.(favourite|lowpriority|server_notice)|im\.vector\.fake\.(invite|recent|direct|archived))$/; @@ -788,11 +788,11 @@ export default createReactClass({ onMouseMove={this.onMouseMove} onMouseLeave={this.onMouseLeave} > - + { subListComponents } - + ); }, diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index 8701c3d287..3b13001225 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -32,7 +32,7 @@ import ActiveRoomObserver from '../../../ActiveRoomObserver'; import RoomViewStore from '../../../stores/RoomViewStore'; import SettingsStore from "../../../settings/SettingsStore"; import {_t} from "../../../languageHandler"; -import {RovingTabIndexWrapper} from "../../../contexts/RovingTabIndexContext"; +import {RovingTabIndexWrapper} from "../../../accessibility/RovingTabIndex"; export default createReactClass({ displayName: 'RoomTile', From 4504d9b790c1fdbaa2ab2545cf9c7de2a601f6c8 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 16 Jan 2020 03:15:52 +0000 Subject: [PATCH 008/906] add tests Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/accessibility/RovingTabIndex.js | 2 +- test/accessibility/RovingTabIndex-test.js | 117 ++++++++++++++++++++++ 2 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 test/accessibility/RovingTabIndex-test.js diff --git a/src/accessibility/RovingTabIndex.js b/src/accessibility/RovingTabIndex.js index ad2051f1f1..85aa133aa4 100644 --- a/src/accessibility/RovingTabIndex.js +++ b/src/accessibility/RovingTabIndex.js @@ -153,7 +153,7 @@ export const RovingTabIndexHomeEndHelper = ({children}) => { switch (ev.key) { case Key.HOME: // move focus to first item - setImmediate(() => context.state.refs[0].current.focus()); + context.state.refs[0].current.focus(); break; case Key.END: // move focus to last item diff --git a/test/accessibility/RovingTabIndex-test.js b/test/accessibility/RovingTabIndex-test.js new file mode 100644 index 0000000000..2b55d1420c --- /dev/null +++ b/test/accessibility/RovingTabIndex-test.js @@ -0,0 +1,117 @@ +/* +Copyright 2020 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 React from "react"; +import Adapter from "enzyme-adapter-react-16"; +import { configure, mount } from "enzyme"; + +import { + RovingTabIndexProvider, + RovingTabIndexWrapper, + useRovingTabIndex, +} from "../../src/accessibility/RovingTabIndex"; + +configure({ adapter: new Adapter() }); + +const Button = (props) => { + const [onFocus, isActive, ref] = useRovingTabIndex(); + return ; +const button2 = ; +const button3 = ; +const button4 = ; + +describe("RovingTabIndex", () => { + it("RovingTabIndexProvider renders children as expected", () => { + const wrapper = mount( +
Test
+
); + expect(wrapper.text()).toBe("Test"); + expect(wrapper.html()).toBe('
Test
'); + }); + + it("RovingTabIndexProvider works as expected with useRovingTabIndex", () => { + const wrapper = mount( + { button1 } + { button2 } + { button3 } + ); + + // should begin with 0th being active + checkTabIndexes(wrapper.find("button"), [0, -1, -1]); + + // focus on 2nd button and test it is the only active one + wrapper.find("button").at(2).simulate("focus"); + wrapper.update(); + checkTabIndexes(wrapper.find("button"), [-1, -1, 0]); + + // focus on 1st button and test it is the only active one + wrapper.find("button").at(1).simulate("focus"); + wrapper.update(); + checkTabIndexes(wrapper.find("button"), [-1, 0, -1]); + + // check that the active button does not change even on an explicit blur event + wrapper.find("button").at(1).simulate("blur"); + wrapper.update(); + checkTabIndexes(wrapper.find("button"), [-1, 0, -1]); + + // update the children, it should remain on the same button + wrapper.setProps({ + children: [button1, button4, button2, button3], + }); + wrapper.update(); + checkTabIndexes(wrapper.find("button"), [-1, -1, 0, -1]); + + // update the children, remove the active button, it should move to the next one + wrapper.setProps({ + children: [button1, button4, button3], + }); + wrapper.update(); + checkTabIndexes(wrapper.find("button"), [-1, -1, 0]); + }); + + it("RovingTabIndexProvider works as expected with RovingTabIndexWrapper", () => { + const wrapper = mount( + { button1 } + { button2 } + + {({onFocus, isActive, ref}) => + + } + + ); + + // should begin with 0th being active + checkTabIndexes(wrapper.find("button"), [0, -1, -1]); + + // focus on 2nd button and test it is the only active one + wrapper.find("button").at(2).simulate("focus"); + wrapper.update(); + checkTabIndexes(wrapper.find("button"), [-1, -1, 0]); + }); +}); + + From d30c46a641a061c6f54694ef642d469dcf175f98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 14 Jan 2020 11:20:56 +0100 Subject: [PATCH 009/906] FilePanel: Refactor out the file panel and convert the methods to async ones. --- src/components/structures/FilePanel.js | 62 +++++++++++++++----------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/src/components/structures/FilePanel.js b/src/components/structures/FilePanel.js index 61b3d2d4b9..6728472a6c 100644 --- a/src/components/structures/FilePanel.js +++ b/src/components/structures/FilePanel.js @@ -40,42 +40,50 @@ const FilePanel = createReactClass({ }; }, - componentDidMount: function() { - this.updateTimelineSet(this.props.roomId); + async componentDidMount() { + await this.updateTimelineSet(this.props.roomId); }, - updateTimelineSet: function(roomId) { + async fetchFileEventsServer(room) { + const client = MatrixClientPeg.get(); + + const filter = new Matrix.Filter(client.credentials.userId); + filter.setDefinition( + { + "room": { + "timeline": { + "contains_url": true, + "types": [ + "m.room.message", + ], + }, + }, + }, + ); + + // FIXME: we shouldn't be doing this every time we change room - see comment above. + // TODO: Remove this stale comment? Which comment above? + const filterId = await client.getOrCreateFilter("FILTER_FILES_" + client.credentials.userId, filter) + filter.filterId = filterId; + const timelineSet = room.getOrCreateFilteredTimelineSet(filter); + + return timelineSet; + }, + + async updateTimelineSet(roomId: string) { const client = MatrixClientPeg.get(); const room = client.getRoom(roomId); this.noRoom = !room; if (room) { - const filter = new Matrix.Filter(client.credentials.userId); - filter.setDefinition( - { - "room": { - "timeline": { - "contains_url": true, - "types": [ - "m.room.message", - ], - }, - }, - }, - ); + try { + let timelineSet = await this.fetchFileEventsServer(room) + this.setState({ timelineSet: timelineSet }); - // FIXME: we shouldn't be doing this every time we change room - see comment above. - client.getOrCreateFilter("FILTER_FILES_" + client.credentials.userId, filter).then( - (filterId)=>{ - filter.filterId = filterId; - const timelineSet = room.getOrCreateFilteredTimelineSet(filter); - this.setState({ timelineSet: timelineSet }); - }, - (error)=>{ - console.error("Failed to get or create file panel filter", error); - }, - ); + } catch (error) { + console.error("Failed to get or create file panel filter", error); + } } else { console.error("Failed to add filtered timelineSet for FilePanel as no room!"); } From 4f63b10465c28db5f9abb6e5d04fd241b03e74f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Wed, 15 Jan 2020 10:41:33 +0100 Subject: [PATCH 010/906] EventIndex: Live events can be unencrypted as well. --- src/indexing/EventIndex.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index c912e31fa5..0980413eb5 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -170,7 +170,12 @@ export default class EventIndex { return; } - const e = ev.toJSON().decrypted; + const jsonEvent = ev.toJSON(); + + let e; + if (ev.isEncrypted()) e = jsonEvent.decrypted; + else e = jsonEvent; + const profile = { displayname: ev.sender.rawDisplayName, avatar_url: ev.sender.getMxcAvatarUrl(), From 263370c9ae6d13038157417e71220a9c5e5cfd87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Wed, 15 Jan 2020 12:04:27 +0100 Subject: [PATCH 011/906] BaseEventIndexManager: Add a method to load file events of a room. --- src/indexing/BaseEventIndexManager.js | 30 ++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/indexing/BaseEventIndexManager.js b/src/indexing/BaseEventIndexManager.js index 5e8ca668ad..d7b322bb1a 100644 --- a/src/indexing/BaseEventIndexManager.js +++ b/src/indexing/BaseEventIndexManager.js @@ -62,11 +62,18 @@ export interface SearchArgs { room_id: ?string; } -export interface HistoricEvent { +export interface EventAndProfile { event: MatrixEvent; profile: MatrixProfile; } +export interface LoadArgs { + roomId: string; + limit: number; + fromEvent: string; + direction: string; +} + /** * Base class for classes that provide platform-specific event indexing. * @@ -145,7 +152,7 @@ export default class BaseEventIndexManager { * * This is used to add a batch of events to the index. * - * @param {[HistoricEvent]} events The list of events and profiles that + * @param {[EventAndProfile]} events The list of events and profiles that * should be added to the event index. * @param {[CrawlerCheckpoint]} checkpoint A new crawler checkpoint that * should be stored in the index which should be used to continue crawling @@ -158,7 +165,7 @@ export default class BaseEventIndexManager { * were already added to the index, false otherwise. */ async addHistoricEvents( - events: [HistoricEvent], + events: [EventAndProfile], checkpoint: CrawlerCheckpoint | null, oldCheckpoint: CrawlerCheckpoint | null, ): Promise { @@ -201,6 +208,23 @@ export default class BaseEventIndexManager { throw new Error("Unimplemented"); } + /** Load events that contain an mxc URL to a file from the index. + * + * @param {object} args Arguments object for the method. + * @param {string} args.roomId The ID of the room for which the events + * should be loaded. + * @param {number} args.limit The maximum number of events to return. + * @param {string} args.fromEvent An event id of a previous event returned + * by this method. If set events that are older than the event with the + * given event ID will be returned. + * + * @return {Promise<[EventAndProfile]>} A promise that will resolve to an array + * of Matrix events that contain mxc URLs. + */ + async loadFileEvents(args: LoadArgs): Promise<[EventAndProfile]> { + throw new Error("Unimplemented"); + } + /** * close our event index. * From 8a17c73b79d13eddd31418de59716870a5b2cfeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Wed, 15 Jan 2020 12:05:02 +0100 Subject: [PATCH 012/906] EventIndex: Add a method to populate an event timeline with file events. --- src/indexing/EventIndex.js | 68 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 0980413eb5..501e21b29d 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -17,6 +17,12 @@ limitations under the License. import PlatformPeg from "../PlatformPeg"; import {MatrixClientPeg} from "../MatrixClientPeg"; +import Matrix from 'matrix-js-sdk'; +import EventTimelineSet from 'matrix-js-sdk/lib/models/event-timeline-set'; +import EventTimeline from 'matrix-js-sdk/lib/models/event-timeline'; +import MatrixEvent from 'matrix-js-sdk/lib/models/event'; +import RoomMember from 'matrix-js-sdk/lib/models/room-member'; + /* * Event indexing class that wraps the platform specific event indexing. */ @@ -411,4 +417,66 @@ export default class EventIndex { const indexManager = PlatformPeg.get().getEventIndexingManager(); return indexManager.searchEventIndex(searchArgs); } + + async populateFileTimeline(room, timelineSet) { + const client = MatrixClientPeg.get(); + const indexManager = PlatformPeg.get().getEventIndexingManager(); + + // Get our events from the event index. + const events = await indexManager.loadFileEvents( + { + roomId: room.roomId, + limit: 10 + } + ); + + let eventMapper = client.getEventMapper(); + + // Turn the events into MatrixEvent objects. + const matrixEvents = events.map(e => { + const matrixEvent = eventMapper(e.event); + + const member = new RoomMember(room.roomId, matrixEvent.getSender()); + + // We can't really reconstruct the whole room state from our + // EventIndex to calculate the correct display name. Use the + // disambiguated form always instead. + member.name = e.profile.displayname + " (" + matrixEvent.getSender() + ")"; + + // This is sets the avatar URL. + const memberEvent = eventMapper( + { + content: { + membership: "join", + avatar_url: e.profile.avatar_url, + displayname: e.profile.displayname, + }, + type: "m.room.member", + event_id: matrixEvent.getId() + ":eventIndex", + room_id: matrixEvent.getRoomId(), + sender: matrixEvent.getSender(), + origin_server_ts: matrixEvent.getTs(), + state_key: matrixEvent.getSender() + } + ); + + // We set this manually to avoid emitting RoomMember.membership and + // RoomMember.name events. + member.events.member = memberEvent; + matrixEvent.sender = member; + + return matrixEvent; + }); + + // Add the events to the live timeline of the file panel. + matrixEvents.forEach(e => { + if (!timelineSet.eventIdToTimeline(e.getId())) { + const liveTimeline = timelineSet.getLiveTimeline(); + timelineSet.addEventToTimeline(e, liveTimeline, true) + } + }); + + // Set the pagination token to the oldest event that we retrieved. + timelineSet.getLiveTimeline().setPaginationToken("", EventTimeline.BACKWARDS); + } } From a1cbff3c8cefa3945c5ebedc85e31dd305d2b9ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Wed, 15 Jan 2020 12:05:43 +0100 Subject: [PATCH 013/906] FilePanel: Use the event index in encrypted rooms to populate the panel. --- src/components/structures/FilePanel.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/components/structures/FilePanel.js b/src/components/structures/FilePanel.js index 6728472a6c..56bc9dee64 100644 --- a/src/components/structures/FilePanel.js +++ b/src/components/structures/FilePanel.js @@ -22,6 +22,7 @@ import PropTypes from 'prop-types'; import Matrix from 'matrix-js-sdk'; import * as sdk from '../../index'; import {MatrixClientPeg} from '../../MatrixClientPeg'; +import {EventIndexPeg} from "../../indexing/EventIndexPeg"; import { _t } from '../../languageHandler'; /* @@ -73,12 +74,20 @@ const FilePanel = createReactClass({ async updateTimelineSet(roomId: string) { const client = MatrixClientPeg.get(); const room = client.getRoom(roomId); + const eventIndex = EventIndexPeg.get(); this.noRoom = !room; if (room) { + let timelineSet; + try { - let timelineSet = await this.fetchFileEventsServer(room) + timelineSet = await this.fetchFileEventsServer(room) + + if (client.isRoomEncrypted(roomId) && eventIndex !== null) { + await eventIndex.populateFileTimeline(room, timelineSet); + } + this.setState({ timelineSet: timelineSet }); } catch (error) { From 7fb3645e940073a7c7db4e022e1655ca7facde7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Wed, 15 Jan 2020 12:06:29 +0100 Subject: [PATCH 014/906] LifeCycle: Start the event index before the client. --- src/Lifecycle.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Lifecycle.js b/src/Lifecycle.js index 0796e326a0..aab7884b2e 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -588,8 +588,8 @@ async function startMatrixClient(startSyncing=true) { Mjolnir.sharedInstance().start(); if (startSyncing) { - await MatrixClientPeg.start(); await EventIndexPeg.init(); + await MatrixClientPeg.start(); } else { console.warn("Caller requested only auxiliary services be started"); await MatrixClientPeg.assign(); From 49c1dbe42133dd8103e1d0d8036d5bcc29c32c06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 17 Jan 2020 10:04:53 +0100 Subject: [PATCH 015/906] FilePanel: Implement pagination requesting using the EventIndex. --- src/components/structures/FilePanel.js | 18 +++- src/components/structures/TimelinePanel.js | 14 ++- src/indexing/EventIndex.js | 99 +++++++++++++++++++--- 3 files changed, 119 insertions(+), 12 deletions(-) diff --git a/src/components/structures/FilePanel.js b/src/components/structures/FilePanel.js index 56bc9dee64..74b434cdbf 100644 --- a/src/components/structures/FilePanel.js +++ b/src/components/structures/FilePanel.js @@ -71,6 +71,20 @@ const FilePanel = createReactClass({ return timelineSet; }, + onPaginationRequest(timelineWindow, direction, limit) { + const client = MatrixClientPeg.get(); + const eventIndex = EventIndexPeg.get(); + const roomId = this.props.roomId; + + const room = client.getRoom(roomId); + + if (client.isRoomEncrypted(roomId) && eventIndex !== null) { + return eventIndex.paginateTimelineWindow(room, timelineWindow, direction, limit); + } else { + return timelineWindow.paginate(direction, limit); + } + }, + async updateTimelineSet(roomId: string) { const client = MatrixClientPeg.get(); const room = client.getRoom(roomId); @@ -85,7 +99,8 @@ const FilePanel = createReactClass({ timelineSet = await this.fetchFileEventsServer(room) if (client.isRoomEncrypted(roomId) && eventIndex !== null) { - await eventIndex.populateFileTimeline(room, timelineSet); + const timeline = timelineSet.getLiveTimeline(); + await eventIndex.populateFileTimeline(timelineSet, timeline, room, 1); } this.setState({ timelineSet: timelineSet }); @@ -128,6 +143,7 @@ const FilePanel = createReactClass({ manageReadMarkers={false} timelineSet={this.state.timelineSet} showUrlPreview = {false} + onPaginationRequest={this.onPaginationRequest} tileShape="file_grid" resizeNotifier={this.props.resizeNotifier} empty={_t('There are no visible files in this room')} diff --git a/src/components/structures/TimelinePanel.js b/src/components/structures/TimelinePanel.js index 30b02bfcca..41b1b6f675 100644 --- a/src/components/structures/TimelinePanel.js +++ b/src/components/structures/TimelinePanel.js @@ -94,6 +94,10 @@ const TimelinePanel = createReactClass({ // callback which is called when the read-up-to mark is updated. onReadMarkerUpdated: PropTypes.func, + // callback which is called when we wish to paginate the timeline + // window. + onPaginationRequest: PropTypes.func, + // maximum number of events to show in a timeline timelineCap: PropTypes.number, @@ -338,6 +342,14 @@ const TimelinePanel = createReactClass({ } }, + onPaginationRequest(timelineWindow, direction, size) { + if (this.props.onPaginationRequest) { + return this.props.onPaginationRequest(timelineWindow, direction, size); + } else { + return timelineWindow.paginate(direction, size); + } + }, + // set off a pagination request. onMessageListFillRequest: function(backwards) { if (!this._shouldPaginate()) return Promise.resolve(false); @@ -360,7 +372,7 @@ const TimelinePanel = createReactClass({ debuglog("TimelinePanel: Initiating paginate; backwards:"+backwards); this.setState({[paginatingKey]: true}); - return this._timelineWindow.paginate(dir, PAGINATE_SIZE).then((r) => { + return this.onPaginationRequest(this._timelineWindow, dir, PAGINATE_SIZE).then((r) => { if (this.unmounted) { return; } debuglog("TimelinePanel: paginate complete backwards:"+backwards+"; success:"+r); diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 501e21b29d..7263d8b2c4 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -418,17 +418,29 @@ export default class EventIndex { return indexManager.searchEventIndex(searchArgs); } - async populateFileTimeline(room, timelineSet) { + async loadFileEvents(room, limit = 10, fromEvent = null, direction = EventTimeline.BACKWARDS) { const client = MatrixClientPeg.get(); const indexManager = PlatformPeg.get().getEventIndexingManager(); + let loadArgs = { + roomId: room.roomId, + limit: limit + } + + if (fromEvent) { + loadArgs.fromEvent = fromEvent; + loadArgs.direction = direction; + } + + let events + // Get our events from the event index. - const events = await indexManager.loadFileEvents( - { - roomId: room.roomId, - limit: 10 - } - ); + try { + events = await indexManager.loadFileEvents(loadArgs); + } catch (e) { + console.log("EventIndex: Error getting file events", e); + return [] + } let eventMapper = client.getEventMapper(); @@ -468,15 +480,82 @@ export default class EventIndex { return matrixEvent; }); + return matrixEvents; + } + + async populateFileTimeline(timelineSet, timeline, room, limit = 10, + fromEvent = null, direction = EventTimeline.BACKWARDS) { + let matrixEvents = await this.loadFileEvents(room, limit, fromEvent, direction); + // Add the events to the live timeline of the file panel. matrixEvents.forEach(e => { if (!timelineSet.eventIdToTimeline(e.getId())) { - const liveTimeline = timelineSet.getLiveTimeline(); - timelineSet.addEventToTimeline(e, liveTimeline, true) + timelineSet.addEventToTimeline(e, timeline, + direction == EventTimeline.BACKWARDS) } }); // Set the pagination token to the oldest event that we retrieved. - timelineSet.getLiveTimeline().setPaginationToken("", EventTimeline.BACKWARDS); + if (matrixEvents.length > 0) { + timeline.setPaginationToken(matrixEvents[matrixEvents.length - 1].getId(), + EventTimeline.BACKWARDS); + return true; + } else { + timeline.setPaginationToken("", EventTimeline.BACKWARDS); + return false; + } + } + + paginateTimelineWindow(room, timelineWindow, direction, limit) { + let tl; + + // TODO this is from the js-sdk, this should probably be exposed to + // us through the js-sdk. + const moveWindowCap = (titmelineWindow, timeline, direction, limit) => { + var count = (direction == EventTimeline.BACKWARDS) ? + timeline.retreat(limit) : timeline.advance(limit); + + if (count) { + timelineWindow._eventCount += count; + var excess = timelineWindow._eventCount - timelineWindow._windowLimit; + + if (excess > 0) { + timelineWindow.unpaginate(3, direction != EventTimeline.BACKWARDS); + } + return true; + } + + return false; + }; + + // TODO these private fields should be somehow exposed in the js-sdk. + if (direction == EventTimeline.BACKWARDS) tl = timelineWindow._start; + else if (direction == EventTimeline.FORWARDS) tl = timelineWindow._end; + + if (!tl) return Promise.resolve(false); + if (tl.pendingPaginate) return tl.pendingPaginate; + + if (moveWindowCap(timelineWindow, tl, direction, limit)) { + return Promise.resolve(true); + } + + const paginationMethod = async (timelineWindow, timeline, room, direction, limit) => { + const timelineSet = timelineWindow._timelineSet; + const token = timeline.timeline.getPaginationToken(direction); + + const ret = await this.populateFileTimeline(timelineSet, timeline.timeline, + room, limit, token, direction); + + moveWindowCap(timelineWindow, timeline, direction, limit) + timeline.pendingPaginate = null; + + return ret; + }; + + const paginationPromise = paginationMethod(timelineWindow, tl, room, + direction, limit); + tl.pendingPaginate = paginationPromise; + + return paginationPromise; } } From 70d394e668615d431a0c9f9ed4f2c16cad1c2a34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 17 Jan 2020 10:35:33 +0100 Subject: [PATCH 016/906] EventIndex: Update the imports for the new build system. --- src/components/structures/FilePanel.js | 2 +- src/indexing/EventIndex.js | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/components/structures/FilePanel.js b/src/components/structures/FilePanel.js index 74b434cdbf..0ef9331338 100644 --- a/src/components/structures/FilePanel.js +++ b/src/components/structures/FilePanel.js @@ -22,7 +22,7 @@ import PropTypes from 'prop-types'; import Matrix from 'matrix-js-sdk'; import * as sdk from '../../index'; import {MatrixClientPeg} from '../../MatrixClientPeg'; -import {EventIndexPeg} from "../../indexing/EventIndexPeg"; +import EventIndexPeg from "../../indexing/EventIndexPeg"; import { _t } from '../../languageHandler'; /* diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 7263d8b2c4..cb2f646d07 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -17,11 +17,9 @@ limitations under the License. import PlatformPeg from "../PlatformPeg"; import {MatrixClientPeg} from "../MatrixClientPeg"; -import Matrix from 'matrix-js-sdk'; -import EventTimelineSet from 'matrix-js-sdk/lib/models/event-timeline-set'; -import EventTimeline from 'matrix-js-sdk/lib/models/event-timeline'; -import MatrixEvent from 'matrix-js-sdk/lib/models/event'; -import RoomMember from 'matrix-js-sdk/lib/models/room-member'; +import * as Matrix from 'matrix-js-sdk'; +import {EventTimelineSet} from 'matrix-js-sdk'; +import {EventTimeline} from 'matrix-js-sdk'; /* * Event indexing class that wraps the platform specific event indexing. @@ -448,7 +446,7 @@ export default class EventIndex { const matrixEvents = events.map(e => { const matrixEvent = eventMapper(e.event); - const member = new RoomMember(room.roomId, matrixEvent.getSender()); + const member = new Matrix.RoomMember(room.roomId, matrixEvent.getSender()); // We can't really reconstruct the whole room state from our // EventIndex to calculate the correct display name. Use the From 95b86b42d00b1b23cfaed2f1aa474b962d55fe2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 17 Jan 2020 11:06:05 +0100 Subject: [PATCH 017/906] BaseEventIndexManager: Update the docs for the loadFileEvents method. --- src/indexing/BaseEventIndexManager.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/indexing/BaseEventIndexManager.js b/src/indexing/BaseEventIndexManager.js index d7b322bb1a..c4758bcaa3 100644 --- a/src/indexing/BaseEventIndexManager.js +++ b/src/indexing/BaseEventIndexManager.js @@ -215,11 +215,14 @@ export default class BaseEventIndexManager { * should be loaded. * @param {number} args.limit The maximum number of events to return. * @param {string} args.fromEvent An event id of a previous event returned - * by this method. If set events that are older than the event with the - * given event ID will be returned. + * by this method. Passing this means that we are going to continue loading + * events from this point in the history. + * @param {string} args.direction The direction to which we should continue + * loading events from. This is used only if fromEvent is used as well. * - * @return {Promise<[EventAndProfile]>} A promise that will resolve to an array - * of Matrix events that contain mxc URLs. + * @return {Promise<[EventAndProfile]>} A promise that will resolve to an + * array of Matrix events that contain mxc URLs accompanied with the + * historic profile of the sender. */ async loadFileEvents(args: LoadArgs): Promise<[EventAndProfile]> { throw new Error("Unimplemented"); From ccfe3c7e70e9b9d5e8beddf7e8dc4c3e111bab56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 17 Jan 2020 11:52:20 +0100 Subject: [PATCH 018/906] FilePanel/EventIndex: Fix lint errors. --- src/components/structures/FilePanel.js | 6 +++--- src/indexing/EventIndex.js | 27 +++++++++++++------------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/components/structures/FilePanel.js b/src/components/structures/FilePanel.js index 0ef9331338..6faec27284 100644 --- a/src/components/structures/FilePanel.js +++ b/src/components/structures/FilePanel.js @@ -64,7 +64,8 @@ const FilePanel = createReactClass({ // FIXME: we shouldn't be doing this every time we change room - see comment above. // TODO: Remove this stale comment? Which comment above? - const filterId = await client.getOrCreateFilter("FILTER_FILES_" + client.credentials.userId, filter) + const filterId = await client.getOrCreateFilter("FILTER_FILES_" + client.credentials.userId, + filter); filter.filterId = filterId; const timelineSet = room.getOrCreateFilteredTimelineSet(filter); @@ -96,7 +97,7 @@ const FilePanel = createReactClass({ let timelineSet; try { - timelineSet = await this.fetchFileEventsServer(room) + timelineSet = await this.fetchFileEventsServer(room); if (client.isRoomEncrypted(roomId) && eventIndex !== null) { const timeline = timelineSet.getLiveTimeline(); @@ -104,7 +105,6 @@ const FilePanel = createReactClass({ } this.setState({ timelineSet: timelineSet }); - } catch (error) { console.error("Failed to get or create file panel filter", error); } diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index cb2f646d07..0e48af749c 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -18,7 +18,6 @@ import PlatformPeg from "../PlatformPeg"; import {MatrixClientPeg} from "../MatrixClientPeg"; import * as Matrix from 'matrix-js-sdk'; -import {EventTimelineSet} from 'matrix-js-sdk'; import {EventTimeline} from 'matrix-js-sdk'; /* @@ -420,27 +419,27 @@ export default class EventIndex { const client = MatrixClientPeg.get(); const indexManager = PlatformPeg.get().getEventIndexingManager(); - let loadArgs = { + const loadArgs = { roomId: room.roomId, - limit: limit - } + limit: limit, + }; if (fromEvent) { loadArgs.fromEvent = fromEvent; loadArgs.direction = direction; } - let events + let events; // Get our events from the event index. try { events = await indexManager.loadFileEvents(loadArgs); } catch (e) { console.log("EventIndex: Error getting file events", e); - return [] + return []; } - let eventMapper = client.getEventMapper(); + const eventMapper = client.getEventMapper(); // Turn the events into MatrixEvent objects. const matrixEvents = events.map(e => { @@ -466,8 +465,8 @@ export default class EventIndex { room_id: matrixEvent.getRoomId(), sender: matrixEvent.getSender(), origin_server_ts: matrixEvent.getTs(), - state_key: matrixEvent.getSender() - } + state_key: matrixEvent.getSender(), + }, ); // We set this manually to avoid emitting RoomMember.membership and @@ -483,13 +482,13 @@ export default class EventIndex { async populateFileTimeline(timelineSet, timeline, room, limit = 10, fromEvent = null, direction = EventTimeline.BACKWARDS) { - let matrixEvents = await this.loadFileEvents(room, limit, fromEvent, direction); + const matrixEvents = await this.loadFileEvents(room, limit, fromEvent, direction); // Add the events to the live timeline of the file panel. matrixEvents.forEach(e => { if (!timelineSet.eventIdToTimeline(e.getId())) { timelineSet.addEventToTimeline(e, timeline, - direction == EventTimeline.BACKWARDS) + direction == EventTimeline.BACKWARDS); } }); @@ -510,12 +509,12 @@ export default class EventIndex { // TODO this is from the js-sdk, this should probably be exposed to // us through the js-sdk. const moveWindowCap = (titmelineWindow, timeline, direction, limit) => { - var count = (direction == EventTimeline.BACKWARDS) ? + const count = (direction == EventTimeline.BACKWARDS) ? timeline.retreat(limit) : timeline.advance(limit); if (count) { timelineWindow._eventCount += count; - var excess = timelineWindow._eventCount - timelineWindow._windowLimit; + const excess = timelineWindow._eventCount - timelineWindow._windowLimit; if (excess > 0) { timelineWindow.unpaginate(3, direction != EventTimeline.BACKWARDS); @@ -544,7 +543,7 @@ export default class EventIndex { const ret = await this.populateFileTimeline(timelineSet, timeline.timeline, room, limit, token, direction); - moveWindowCap(timelineWindow, timeline, direction, limit) + moveWindowCap(timelineWindow, timeline, direction, limit); timeline.pendingPaginate = null; return ret; From f324f676d37ae5d330beedc77268bbb954fe2cfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 26 Nov 2019 13:14:53 +0100 Subject: [PATCH 019/906] EventIndex: Add a method to get the current disk usage of the index. --- src/indexing/BaseEventIndexManager.js | 7 +++++++ src/indexing/EventIndex.js | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/src/indexing/BaseEventIndexManager.js b/src/indexing/BaseEventIndexManager.js index 5e8ca668ad..733dc05dd6 100644 --- a/src/indexing/BaseEventIndexManager.js +++ b/src/indexing/BaseEventIndexManager.js @@ -117,6 +117,13 @@ export default class BaseEventIndexManager { throw new Error("Unimplemented"); } + /** + * Get the disk usage of the index + */ + async indexSize(): Promise { + throw new Error("Unimplemented"); + } + /** * Commit the previously queued up events to the index. * diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index c912e31fa5..ae738e5d4d 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -406,4 +406,9 @@ export default class EventIndex { const indexManager = PlatformPeg.get().getEventIndexingManager(); return indexManager.searchEventIndex(searchArgs); } + + async indexSize() { + const indexManager = PlatformPeg.get().getEventIndexingManager(); + return indexManager.indexSize(); + } } From b7b66cfd9aad22f3a00e3b3126a708d1d81e0447 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 26 Nov 2019 13:15:55 +0100 Subject: [PATCH 020/906] EventIndex: Use the sleep method from our utils. --- src/indexing/EventIndex.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index ae738e5d4d..f034df888c 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -16,6 +16,7 @@ limitations under the License. import PlatformPeg from "../PlatformPeg"; import {MatrixClientPeg} from "../MatrixClientPeg"; +import {sleep} from "../utils/promise"; /* * Event indexing class that wraps the platform specific event indexing. @@ -180,12 +181,6 @@ export default class EventIndex { } async crawlerFunc() { - // TODO either put this in a better place or find a library provided - // method that does this. - const sleep = async (ms) => { - return new Promise(resolve => setTimeout(resolve, ms)); - }; - let cancelled = false; console.log("EventIndex: Started crawler function"); From 47156351a6d9ffe9ee2110c63c8667fc043c8936 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 26 Nov 2019 13:25:34 +0100 Subject: [PATCH 021/906] EventIndex: Use a setting for the crawler sleep time. --- src/indexing/EventIndex.js | 24 ++++++++++++++++++++---- src/settings/Settings.js | 5 +++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index f034df888c..1e15fcaa5a 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -16,6 +16,8 @@ limitations under the License. import PlatformPeg from "../PlatformPeg"; import {MatrixClientPeg} from "../MatrixClientPeg"; +import SettingsStore from '../settings/SettingsStore'; +import {SettingLevel} from "../settings/SettingsStore"; import {sleep} from "../utils/promise"; /* @@ -24,9 +26,9 @@ import {sleep} from "../utils/promise"; export default class EventIndex { constructor() { this.crawlerCheckpoints = []; - // The time that the crawler will wait between /rooms/{room_id}/messages - // requests - this._crawlerTimeout = 3000; + // The time in ms that the crawler will wait loop iterations if there + // have not been any checkpoints to consume in the last iteration. + this._crawlerIdleTime = 5000; // The maximum number of events our crawler should fetch in a single // crawl. this._eventsPerCrawl = 100; @@ -194,11 +196,22 @@ export default class EventIndex { cancelled = true; }; + let idle = false; + while (!cancelled) { // This is a low priority task and we don't want to spam our // homeserver with /messages requests so we set a hefty timeout // here. - await sleep(this._crawlerTimeout); + let sleepTime = SettingsStore.getValueAt(SettingLevel.DEVICE, 'crawlerSleepTime'); + + // Don't let the user configure a lower sleep time than 100 ms. + sleepTime = Math.max(sleepTime, 100); + + if (idle) { + sleepTime = this._crawlerIdleTime; + } + + await sleep(sleepTime); console.log("EventIndex: Running the crawler loop."); @@ -211,9 +224,12 @@ export default class EventIndex { /// There is no checkpoint available currently, one may appear if // a sync with limited room timelines happens, so go back to sleep. if (checkpoint === undefined) { + idle = true; continue; } + idle = false; + console.log("EventIndex: crawling using checkpoint", checkpoint); // We have a checkpoint, let us fetch some messages, again, very diff --git a/src/settings/Settings.js b/src/settings/Settings.js index eacf63e55d..e967becf98 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -486,4 +486,9 @@ export const SETTINGS = { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, default: RIGHT_PANEL_PHASES.GroupMemberList, }, + "crawlerSleepTime": { + supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, + displayName: _td("How long should the crawler wait between requests"), + default: 3000, + } }; From 0132c3bbe3521ecd2af39bfd526ea41048791619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 26 Nov 2019 13:31:16 +0100 Subject: [PATCH 022/906] EventIndex: Start the crawler only if it's configured to start. --- src/indexing/EventIndex.js | 4 +++- src/settings/Settings.js | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 1e15fcaa5a..c907e769b5 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -120,7 +120,9 @@ export default class EventIndex { if (eventIndexWasEmpty) await addInitialCheckpoints(); // Start our crawler. - this.startCrawler(); + if (SettingsStore.getValueAt(SettingLevel.DEVICE, 'enableCrawling')) { + this.startCrawler(); + } return; } diff --git a/src/settings/Settings.js b/src/settings/Settings.js index e967becf98..1c65c38167 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -490,5 +490,10 @@ export const SETTINGS = { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, displayName: _td("How long should the crawler wait between requests"), default: 3000, + }, + "enableCrawling" : { + supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, + displayName: _td("How long should the crawler wait between requests"), + default: true, } }; From 4fe7752f3cd9d52b97d212afc49fc46c60d318d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 26 Nov 2019 13:37:07 +0100 Subject: [PATCH 023/906] EventIndex: Add a method to gather the currently crawled rooms. --- src/indexing/EventIndex.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index c907e769b5..1b17cc6d87 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -33,6 +33,7 @@ export default class EventIndex { // crawl. this._eventsPerCrawl = 100; this._crawler = null; + this._currentCheckpoint = null; this.liveEventsForIndex = new Set(); } @@ -213,6 +214,8 @@ export default class EventIndex { sleepTime = this._crawlerIdleTime; } + this._currentCheckpoint = null; + await sleep(sleepTime); console.log("EventIndex: Running the crawler loop."); @@ -230,6 +233,8 @@ export default class EventIndex { continue; } + this._currentCheckpoint = checkpoint; + idle = false; console.log("EventIndex: crawling using checkpoint", checkpoint); @@ -424,4 +429,31 @@ export default class EventIndex { const indexManager = PlatformPeg.get().getEventIndexingManager(); return indexManager.indexSize(); } + + currentlyCrawledRooms() { + let crawlingRooms = new Set(); + let totalRooms = new Set(); + + this.crawlerCheckpoints.forEach((checkpoint, index) => { + crawlingRooms.add(checkpoint.roomId); + }); + + if (this._currentCheckpoint !== null) { + crawlingRooms.add(this._currentCheckpoint.roomId); + } + + const client = MatrixClientPeg.get(); + const rooms = client.getRooms(); + + const isRoomEncrypted = (room) => { + return client.isRoomEncrypted(room.roomId); + }; + + const encryptedRooms = rooms.filter(isRoomEncrypted); + encryptedRooms.forEach((room, index) => { + totalRooms.add(room.roomId); + }); + + return {crawlingRooms, totalRooms} + } } From 928bb69b116fbfb3041d6b2538080b37f503e7e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 26 Nov 2019 13:37:53 +0100 Subject: [PATCH 024/906] EventIndexPeg: Add a helper method to easily start the crawler. --- src/indexing/EventIndexPeg.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/indexing/EventIndexPeg.js b/src/indexing/EventIndexPeg.js index 3746591b1f..a63756ab4e 100644 --- a/src/indexing/EventIndexPeg.js +++ b/src/indexing/EventIndexPeg.js @@ -69,6 +69,11 @@ class EventIndexPeg { return this.index; } + start() { + if (this.index === null) return; + this.index.startCrawler(); + } + stop() { if (this.index === null) return; this.index.stopCrawler(); From 2fe36037371fc723d4d7219e884b8fb77298a8ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 26 Nov 2019 13:39:45 +0100 Subject: [PATCH 025/906] utils: Add an utility function to format bytes. --- src/utils/FormattingUtils.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/utils/FormattingUtils.js b/src/utils/FormattingUtils.js index 1fd7d00feb..9016d62cfb 100644 --- a/src/utils/FormattingUtils.js +++ b/src/utils/FormattingUtils.js @@ -30,6 +30,22 @@ export function formatCount(count) { return (count / 1000000000).toFixed(1) + "B"; // 10B is enough for anyone, right? :S } +/** + * format a size in bytes into a human readable form + * e.g: 1024 -> 1.00 KB + */ +export function formatBytes(bytes, decimals = 2) { + if (bytes === 0) return '0 Bytes'; + + const k = 1024; + const dm = decimals < 0 ? 0 : decimals; + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + + const i = Math.floor(Math.log(bytes) / Math.log(k)); + + return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; +} + /** * format a key into groups of 4 characters, for easier visual inspection * From c397de18bdea962ca8dca8f2f1a98c26aa29941d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 26 Nov 2019 13:43:47 +0100 Subject: [PATCH 026/906] PreferencesUserSettingsTab: Add initial event indexing preferences. --- .../tabs/user/PreferencesUserSettingsTab.js | 91 +++++++++++++++++++ src/i18n/strings/en_EN.json | 9 ++ 2 files changed, 100 insertions(+) diff --git a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js index db5b95cb4c..d1fed21a1f 100644 --- a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js @@ -23,6 +23,8 @@ import SettingsStore from "../../../../../settings/SettingsStore"; import Field from "../../../elements/Field"; import * as sdk from "../../../../.."; import PlatformPeg from "../../../../../PlatformPeg"; +import EventIndexPeg from "../../../../../indexing/EventIndexPeg"; +import {formatBytes} from "../../../../../utils/FormattingUtils"; export default class PreferencesUserSettingsTab extends React.Component { static COMPOSER_SETTINGS = [ @@ -70,6 +72,13 @@ export default class PreferencesUserSettingsTab extends React.Component { alwaysShowMenuBarSupported: false, minimizeToTray: true, minimizeToTraySupported: false, + eventIndexSize: 0, + crawlingRooms: 0, + totalCrawlingRooms: 0, + eventIndexingEnabled: + SettingsStore.getValueAt(SettingLevel.DEVICE, 'enableCrawling'), + crawlerSleepTime: + SettingsStore.getValueAt(SettingLevel.DEVICE, 'crawlerSleepTime'), autocompleteDelay: SettingsStore.getValueAt(SettingLevel.DEVICE, 'autocompleteDelay').toString(10), readMarkerInViewThresholdMs: @@ -100,6 +109,19 @@ export default class PreferencesUserSettingsTab extends React.Component { minimizeToTray = await platform.getMinimizeToTrayEnabled(); } + let eventIndexSize = 0; + let crawlingRooms = 0; + let totalCrawlingRooms = 0; + + let eventIndex = EventIndexPeg.get(); + + if (eventIndex !== null) { + eventIndexSize = await eventIndex.indexSize(); + let crawledRooms = eventIndex.currentlyCrawledRooms(); + crawlingRooms = crawledRooms.crawlingRooms.size; + totalCrawlingRooms = crawledRooms.totalRooms.size; + } + this.setState({ autoLaunch, autoLaunchSupported, @@ -107,6 +129,9 @@ export default class PreferencesUserSettingsTab extends React.Component { alwaysShowMenuBar, minimizeToTraySupported, minimizeToTray, + eventIndexSize, + crawlingRooms, + totalCrawlingRooms, }); } @@ -137,6 +162,20 @@ export default class PreferencesUserSettingsTab extends React.Component { SettingsStore.setValue("readMarkerOutOfViewThresholdMs", null, SettingLevel.DEVICE, e.target.value); }; + _onEventIndexingEnabledChange = (checked) => { + SettingsStore.setValue("enableCrawling", null, SettingLevel.DEVICE, checked); + + if (checked) EventIndexPeg.start(); + else EventIndexPeg.stop(); + + this.setState({eventIndexingEnabled: checked}); + } + + _onCrawlerSleepTimeChange = (e) => { + this.setState({crawlerSleepTime: e.target.value}); + SettingsStore.setValue("crawlerSleepTime", null, SettingLevel.DEVICE, e.target.value); + } + _renderGroup(settingIds) { const SettingsFlag = sdk.getComponent("views.elements.SettingsFlag"); return settingIds.map(i => ); @@ -167,9 +206,61 @@ export default class PreferencesUserSettingsTab extends React.Component { label={_t('Show tray icon and minimize window to it on close')} />; } + let eventIndexingSettings = null; + let crawlerState; + + if (!this.state.eventIndexingEnabled) { + crawlerState =
{_t("Message downloader is stopped.")}
; + } + else if (this.state.crawlingRooms === 0) { + crawlerState =
{_t("Message downloader is currently idle.")}
; + } else { + crawlerState = ( +
{_t( + "Currently downloading mesages in %(crawlingRooms)s of %(totalRooms)s rooms.", + { crawlingRooms: this.state.crawlingRooms, + totalRooms: this.state.totalCrawlingRooms, + })} +
+ ); + } + + if (EventIndexPeg.get() !== null) { + eventIndexingSettings = ( +
+ {_t("Encrypted search")} + { + _t( "To enable search in encrypted rooms, Riot needs to run " + + "a background process to download historical messages " + + "from those rooms to your computer." + ) + } +
+ {_t("Message disk usage:")} {formatBytes(this.state.eventIndexSize, 0)}
+ {crawlerState}
+
+ + + + +
+ ); + } + return (
{_t("Preferences")}
+ + {eventIndexingSettings} +
{_t("Composer")} {this._renderGroup(PreferencesUserSettingsTab.COMPOSER_SETTINGS)} diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index f8b17db7c5..aa8583cf8d 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -415,6 +415,7 @@ "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)", "Send read receipts for messages (requires compatible homeserver to disable)": "Send read receipts for messages (requires compatible homeserver to disable)", "Show previews/thumbnails for images": "Show previews/thumbnails for images", + "How long should the crawler wait between requests": "How long should the crawler wait between requests", "Collecting app version information": "Collecting app version information", "Collecting logs": "Collecting logs", "Uploading report": "Uploading report", @@ -731,6 +732,14 @@ "Start automatically after system login": "Start automatically after system login", "Always show the window menu bar": "Always show the window menu bar", "Show tray icon and minimize window to it on close": "Show tray icon and minimize window to it on close", + "Message downloader is stopped.": "Message downloader is stopped.", + "Message downloader is currently idle.": "Message downloader is currently idle.", + "Currently downloading mesages in %(crawlingRooms)s of %(totalRooms)s rooms.": "Currently downloading mesages in %(crawlingRooms)s of %(totalRooms)s rooms.", + "Encrypted search": "Encrypted search", + "To enable search in encrypted rooms, Riot needs to run a background process to download historical messages from those rooms to your computer.": "To enable search in encrypted rooms, Riot needs to run a background process to download historical messages from those rooms to your computer.", + "Message disk usage:": "Message disk usage:", + "Enable message downloading": "Enable message downloading", + "Message downloading sleep time(ms)": "Message downloading sleep time(ms)", "Preferences": "Preferences", "Composer": "Composer", "Timeline": "Timeline", From 3c46a563914f0347ebdfed3f80161ea86b4e841b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 26 Nov 2019 15:06:04 +0100 Subject: [PATCH 027/906] EventIndex: Fix some lint errors. --- .../settings/tabs/user/PreferencesUserSettingsTab.js | 11 +++++------ src/indexing/EventIndex.js | 6 +++--- src/settings/Settings.js | 4 ++-- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js index d1fed21a1f..e47f591dcb 100644 --- a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js @@ -113,11 +113,11 @@ export default class PreferencesUserSettingsTab extends React.Component { let crawlingRooms = 0; let totalCrawlingRooms = 0; - let eventIndex = EventIndexPeg.get(); + const eventIndex = EventIndexPeg.get(); if (eventIndex !== null) { eventIndexSize = await eventIndex.indexSize(); - let crawledRooms = eventIndex.currentlyCrawledRooms(); + const crawledRooms = eventIndex.currentlyCrawledRooms(); crawlingRooms = crawledRooms.crawlingRooms.size; totalCrawlingRooms = crawledRooms.totalRooms.size; } @@ -211,8 +211,7 @@ export default class PreferencesUserSettingsTab extends React.Component { if (!this.state.eventIndexingEnabled) { crawlerState =
{_t("Message downloader is stopped.")}
; - } - else if (this.state.crawlingRooms === 0) { + } else if (this.state.crawlingRooms === 0) { crawlerState =
{_t("Message downloader is currently idle.")}
; } else { crawlerState = ( @@ -231,8 +230,8 @@ export default class PreferencesUserSettingsTab extends React.Component { {_t("Encrypted search")} { _t( "To enable search in encrypted rooms, Riot needs to run " + - "a background process to download historical messages " + - "from those rooms to your computer." + "a background process to download historical messages " + + "from those rooms to your computer.", ) }
diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 1b17cc6d87..0d7f43b839 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -431,8 +431,8 @@ export default class EventIndex { } currentlyCrawledRooms() { - let crawlingRooms = new Set(); - let totalRooms = new Set(); + const crawlingRooms = new Set(); + const totalRooms = new Set(); this.crawlerCheckpoints.forEach((checkpoint, index) => { crawlingRooms.add(checkpoint.roomId); @@ -454,6 +454,6 @@ export default class EventIndex { totalRooms.add(room.roomId); }); - return {crawlingRooms, totalRooms} + return {crawlingRooms, totalRooms}; } } diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 1c65c38167..817adcfc4d 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -491,9 +491,9 @@ export const SETTINGS = { displayName: _td("How long should the crawler wait between requests"), default: 3000, }, - "enableCrawling" : { + "enableCrawling": { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, displayName: _td("How long should the crawler wait between requests"), default: true, - } + }, }; From 3b99f7565dbbf453eb615f9034db2dfd574c9128 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 17 Jan 2020 17:10:59 +0100 Subject: [PATCH 028/906] PreferencesUserSettingsTab: Move the event index UI into a separate component. --- .../views/settings/EventIndexPanel.js | 131 ++++++++++++++++++ .../tabs/user/PreferencesUserSettingsTab.js | 90 +----------- 2 files changed, 134 insertions(+), 87 deletions(-) create mode 100644 src/components/views/settings/EventIndexPanel.js diff --git a/src/components/views/settings/EventIndexPanel.js b/src/components/views/settings/EventIndexPanel.js new file mode 100644 index 0000000000..98ba83f62b --- /dev/null +++ b/src/components/views/settings/EventIndexPanel.js @@ -0,0 +1,131 @@ +/* +Copyright 2020 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 React from 'react'; +import PropTypes from 'prop-types'; +import classNames from 'classnames'; + +import * as sdk from '../../../index'; +import { _t } from '../../../languageHandler'; +import Modal from '../../../Modal'; +import SettingsStore, {SettingLevel} from "../../../settings/SettingsStore"; +import LabelledToggleSwitch from "../elements/LabelledToggleSwitch"; +import Field from "../elements/Field"; +import {formatBytes} from "../../../utils/FormattingUtils"; +import EventIndexPeg from "../../../indexing/EventIndexPeg"; + +export default class EventIndexPanel extends React.Component { + constructor() { + super(); + + this.state = { + eventIndexSize: 0, + crawlingRooms: 0, + totalCrawlingRooms: 0, + eventIndexingEnabled: + SettingsStore.getValueAt(SettingLevel.DEVICE, 'enableCrawling'), + crawlerSleepTime: + SettingsStore.getValueAt(SettingLevel.DEVICE, 'crawlerSleepTime'), + }; + } + + async componentWillMount(): void { + let eventIndexSize = 0; + let crawlingRooms = 0; + let totalCrawlingRooms = 0; + + const eventIndex = EventIndexPeg.get(); + + if (eventIndex !== null) { + eventIndexSize = await eventIndex.indexSize(); + const crawledRooms = eventIndex.currentlyCrawledRooms(); + crawlingRooms = crawledRooms.crawlingRooms.size; + totalCrawlingRooms = crawledRooms.totalRooms.size; + } + + this.setState({ + eventIndexSize, + crawlingRooms, + totalCrawlingRooms, + }); + } + + _onEventIndexingEnabledChange = (checked) => { + SettingsStore.setValue("enableCrawling", null, SettingLevel.DEVICE, checked); + + if (checked) EventIndexPeg.start(); + else EventIndexPeg.stop(); + + this.setState({eventIndexingEnabled: checked}); + } + + _onCrawlerSleepTimeChange = (e) => { + this.setState({crawlerSleepTime: e.target.value}); + SettingsStore.setValue("crawlerSleepTime", null, SettingLevel.DEVICE, e.target.value); + } + + render() { + let eventIndexingSettings = null; + let crawlerState; + + if (!this.state.eventIndexingEnabled) { + crawlerState =
{_t("Message downloader is stopped.")}
; + } else if (this.state.crawlingRooms === 0) { + crawlerState =
{_t("Message downloader is currently idle.")}
; + } else { + crawlerState = ( +
{_t( + "Currently downloading mesages in %(crawlingRooms)s of %(totalRooms)s rooms.", + { crawlingRooms: this.state.crawlingRooms, + totalRooms: this.state.totalCrawlingRooms, + })} +
+ ); + } + + if (EventIndexPeg.get() !== null) { + eventIndexingSettings = ( +
+ {_t("Encrypted search")} + { + _t( "To enable search in encrypted rooms, Riot needs to run " + + "a background process to download historical messages " + + "from those rooms to your computer.", + ) + } +
+ {_t("Message disk usage:")} {formatBytes(this.state.eventIndexSize, 0)}
+ {crawlerState}
+
+ + + + +
+ ); + } + + return eventIndexingSettings; + } +} diff --git a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js index e47f591dcb..5ecafcc5ae 100644 --- a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js @@ -23,7 +23,6 @@ import SettingsStore from "../../../../../settings/SettingsStore"; import Field from "../../../elements/Field"; import * as sdk from "../../../../.."; import PlatformPeg from "../../../../../PlatformPeg"; -import EventIndexPeg from "../../../../../indexing/EventIndexPeg"; import {formatBytes} from "../../../../../utils/FormattingUtils"; export default class PreferencesUserSettingsTab extends React.Component { @@ -72,13 +71,6 @@ export default class PreferencesUserSettingsTab extends React.Component { alwaysShowMenuBarSupported: false, minimizeToTray: true, minimizeToTraySupported: false, - eventIndexSize: 0, - crawlingRooms: 0, - totalCrawlingRooms: 0, - eventIndexingEnabled: - SettingsStore.getValueAt(SettingLevel.DEVICE, 'enableCrawling'), - crawlerSleepTime: - SettingsStore.getValueAt(SettingLevel.DEVICE, 'crawlerSleepTime'), autocompleteDelay: SettingsStore.getValueAt(SettingLevel.DEVICE, 'autocompleteDelay').toString(10), readMarkerInViewThresholdMs: @@ -109,19 +101,6 @@ export default class PreferencesUserSettingsTab extends React.Component { minimizeToTray = await platform.getMinimizeToTrayEnabled(); } - let eventIndexSize = 0; - let crawlingRooms = 0; - let totalCrawlingRooms = 0; - - const eventIndex = EventIndexPeg.get(); - - if (eventIndex !== null) { - eventIndexSize = await eventIndex.indexSize(); - const crawledRooms = eventIndex.currentlyCrawledRooms(); - crawlingRooms = crawledRooms.crawlingRooms.size; - totalCrawlingRooms = crawledRooms.totalRooms.size; - } - this.setState({ autoLaunch, autoLaunchSupported, @@ -129,9 +108,6 @@ export default class PreferencesUserSettingsTab extends React.Component { alwaysShowMenuBar, minimizeToTraySupported, minimizeToTray, - eventIndexSize, - crawlingRooms, - totalCrawlingRooms, }); } @@ -162,26 +138,14 @@ export default class PreferencesUserSettingsTab extends React.Component { SettingsStore.setValue("readMarkerOutOfViewThresholdMs", null, SettingLevel.DEVICE, e.target.value); }; - _onEventIndexingEnabledChange = (checked) => { - SettingsStore.setValue("enableCrawling", null, SettingLevel.DEVICE, checked); - - if (checked) EventIndexPeg.start(); - else EventIndexPeg.stop(); - - this.setState({eventIndexingEnabled: checked}); - } - - _onCrawlerSleepTimeChange = (e) => { - this.setState({crawlerSleepTime: e.target.value}); - SettingsStore.setValue("crawlerSleepTime", null, SettingLevel.DEVICE, e.target.value); - } - _renderGroup(settingIds) { const SettingsFlag = sdk.getComponent("views.elements.SettingsFlag"); return settingIds.map(i => ); } render() { + const EventIndexPanel = sdk.getComponent('views.settings.EventIndexPanel'); + let autoLaunchOption = null; if (this.state.autoLaunchSupported) { autoLaunchOption = ; } - let eventIndexingSettings = null; - let crawlerState; - - if (!this.state.eventIndexingEnabled) { - crawlerState =
{_t("Message downloader is stopped.")}
; - } else if (this.state.crawlingRooms === 0) { - crawlerState =
{_t("Message downloader is currently idle.")}
; - } else { - crawlerState = ( -
{_t( - "Currently downloading mesages in %(crawlingRooms)s of %(totalRooms)s rooms.", - { crawlingRooms: this.state.crawlingRooms, - totalRooms: this.state.totalCrawlingRooms, - })} -
- ); - } - - if (EventIndexPeg.get() !== null) { - eventIndexingSettings = ( -
- {_t("Encrypted search")} - { - _t( "To enable search in encrypted rooms, Riot needs to run " + - "a background process to download historical messages " + - "from those rooms to your computer.", - ) - } -
- {_t("Message disk usage:")} {formatBytes(this.state.eventIndexSize, 0)}
- {crawlerState}
-
- - - - -
- ); - } - return (
{_t("Preferences")}
- {eventIndexingSettings} +
{_t("Composer")} From 695b8aff5b4672d3af70db317c023f84c9968aca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 17 Jan 2020 17:14:55 +0100 Subject: [PATCH 029/906] EventIndexPanel: Reword the enable/disable setting. --- src/components/views/settings/EventIndexPanel.js | 2 +- src/i18n/strings/en_EN.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/settings/EventIndexPanel.js b/src/components/views/settings/EventIndexPanel.js index 98ba83f62b..bade2d8735 100644 --- a/src/components/views/settings/EventIndexPanel.js +++ b/src/components/views/settings/EventIndexPanel.js @@ -114,7 +114,7 @@ export default class EventIndexPanel extends React.Component { + label={_t('Download and index encrypted messages')} /> Date: Mon, 20 Jan 2020 10:06:20 +0100 Subject: [PATCH 030/906] Lifecycle: Comment why we need to initialize the index before the client. --- src/Lifecycle.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Lifecycle.js b/src/Lifecycle.js index aab7884b2e..b52e5e9da5 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -588,6 +588,9 @@ async function startMatrixClient(startSyncing=true) { Mjolnir.sharedInstance().start(); if (startSyncing) { + // The client might want to populate some views with events from the + // index (e.g. the FilePanel), therefore initialize the event index + // before the client. await EventIndexPeg.init(); await MatrixClientPeg.start(); } else { From 0c854fce9b19543a57e2494b24b494faefcca35a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Mon, 20 Jan 2020 10:09:58 +0100 Subject: [PATCH 031/906] FilePanel: Remove a stale comment. --- src/components/structures/FilePanel.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/structures/FilePanel.js b/src/components/structures/FilePanel.js index 6faec27284..cb788cd6d2 100644 --- a/src/components/structures/FilePanel.js +++ b/src/components/structures/FilePanel.js @@ -62,8 +62,6 @@ const FilePanel = createReactClass({ }, ); - // FIXME: we shouldn't be doing this every time we change room - see comment above. - // TODO: Remove this stale comment? Which comment above? const filterId = await client.getOrCreateFilter("FILTER_FILES_" + client.credentials.userId, filter); filter.filterId = filterId; From b4c8a686cec16290f56603d3fe925ddc1d975830 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Mon, 20 Jan 2020 12:41:55 +0100 Subject: [PATCH 032/906] EventIndex: Don't import the whole js-sdk. --- src/indexing/EventIndex.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 0e48af749c..67a3d4cace 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -16,9 +16,7 @@ limitations under the License. import PlatformPeg from "../PlatformPeg"; import {MatrixClientPeg} from "../MatrixClientPeg"; - -import * as Matrix from 'matrix-js-sdk'; -import {EventTimeline} from 'matrix-js-sdk'; +import {EventTimeline, RoomMember} from 'matrix-js-sdk'; /* * Event indexing class that wraps the platform specific event indexing. @@ -445,7 +443,7 @@ export default class EventIndex { const matrixEvents = events.map(e => { const matrixEvent = eventMapper(e.event); - const member = new Matrix.RoomMember(room.roomId, matrixEvent.getSender()); + const member = new RoomMember(room.roomId, matrixEvent.getSender()); // We can't really reconstruct the whole room state from our // EventIndex to calculate the correct display name. Use the From 0b4b9d8d5d166ed7454b7d729fc5a08478ac6fb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Mon, 20 Jan 2020 12:42:46 +0100 Subject: [PATCH 033/906] EventIndex: Simplify the json event getting logic. --- src/indexing/EventIndex.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 67a3d4cace..e361f66edc 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -172,10 +172,7 @@ export default class EventIndex { } const jsonEvent = ev.toJSON(); - - let e; - if (ev.isEncrypted()) e = jsonEvent.decrypted; - else e = jsonEvent; + const e = ev.isEncrypted() ? jsonEvent.decrypted: jsonEvent; const profile = { displayname: ev.sender.rawDisplayName, @@ -311,10 +308,7 @@ export default class EventIndex { // consume. const events = filteredEvents.map((ev) => { const jsonEvent = ev.toJSON(); - - let e; - if (ev.isEncrypted()) e = jsonEvent.decrypted; - else e = jsonEvent; + const e = ev.isEncrypted() ? jsonEvent.decrypted: jsonEvent; let profile = {}; if (e.sender in profiles) profile = profiles[e.sender]; From 4cf44cf5a561f801c107b121f109e18236db0e79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Mon, 20 Jan 2020 12:43:20 +0100 Subject: [PATCH 034/906] EventIndex/FilePanel: Allow longer lines. --- src/components/structures/FilePanel.js | 3 +-- src/indexing/EventIndex.js | 16 ++++++---------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/components/structures/FilePanel.js b/src/components/structures/FilePanel.js index cb788cd6d2..71e8143f0a 100644 --- a/src/components/structures/FilePanel.js +++ b/src/components/structures/FilePanel.js @@ -62,8 +62,7 @@ const FilePanel = createReactClass({ }, ); - const filterId = await client.getOrCreateFilter("FILTER_FILES_" + client.credentials.userId, - filter); + const filterId = await client.getOrCreateFilter("FILTER_FILES_" + client.credentials.userId, filter); filter.filterId = filterId; const timelineSet = room.getOrCreateFilteredTimelineSet(filter); diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index e361f66edc..cb77d92c27 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -479,15 +479,13 @@ export default class EventIndex { // Add the events to the live timeline of the file panel. matrixEvents.forEach(e => { if (!timelineSet.eventIdToTimeline(e.getId())) { - timelineSet.addEventToTimeline(e, timeline, - direction == EventTimeline.BACKWARDS); + timelineSet.addEventToTimeline(e, timeline, direction == EventTimeline.BACKWARDS); } }); // Set the pagination token to the oldest event that we retrieved. if (matrixEvents.length > 0) { - timeline.setPaginationToken(matrixEvents[matrixEvents.length - 1].getId(), - EventTimeline.BACKWARDS); + timeline.setPaginationToken(matrixEvents[matrixEvents.length - 1].getId(), EventTimeline.BACKWARDS); return true; } else { timeline.setPaginationToken("", EventTimeline.BACKWARDS); @@ -501,7 +499,7 @@ export default class EventIndex { // TODO this is from the js-sdk, this should probably be exposed to // us through the js-sdk. const moveWindowCap = (titmelineWindow, timeline, direction, limit) => { - const count = (direction == EventTimeline.BACKWARDS) ? + const count = (direction === EventTimeline.BACKWARDS) ? timeline.retreat(limit) : timeline.advance(limit); if (count) { @@ -509,7 +507,7 @@ export default class EventIndex { const excess = timelineWindow._eventCount - timelineWindow._windowLimit; if (excess > 0) { - timelineWindow.unpaginate(3, direction != EventTimeline.BACKWARDS); + timelineWindow.unpaginate(3, direction !== EventTimeline.BACKWARDS); } return true; } @@ -532,8 +530,7 @@ export default class EventIndex { const timelineSet = timelineWindow._timelineSet; const token = timeline.timeline.getPaginationToken(direction); - const ret = await this.populateFileTimeline(timelineSet, timeline.timeline, - room, limit, token, direction); + const ret = await this.populateFileTimeline(timelineSet, timeline.timeline, room, limit, token, direction); moveWindowCap(timelineWindow, timeline, direction, limit); timeline.pendingPaginate = null; @@ -541,8 +538,7 @@ export default class EventIndex { return ret; }; - const paginationPromise = paginationMethod(timelineWindow, tl, room, - direction, limit); + const paginationPromise = paginationMethod(timelineWindow, tl, room, direction, limit); tl.pendingPaginate = paginationPromise; return paginationPromise; From d2ef6ba3f52395b93f38833b87b2d50d1962c89f Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 20 Jan 2020 14:27:19 +0000 Subject: [PATCH 035/906] js-sdk 4.0.0-rc.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d4e58c80e4..d24fcd1777 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "is-ip": "^2.0.0", "linkifyjs": "^2.1.6", "lodash": "^4.17.14", - "matrix-js-sdk": "3.0.0", + "matrix-js-sdk": "4.0.0-rc.1", "pako": "^1.0.5", "png-chunks-extract": "^1.0.0", "prop-types": "^15.5.8", diff --git a/yarn.lock b/yarn.lock index 0177629cd8..808721a188 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5732,10 +5732,10 @@ mathml-tag-names@^2.0.1: resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.1.tgz#6dff66c99d55ecf739ca53c492e626f1d12a33cc" integrity sha512-pWB896KPGSGkp1XtyzRBftpTzwSOL0Gfk0wLvxt4f2mgzjY19o0LxJ3U25vNWTzsh7da+KTbuXQoQ3lOJZ8WHw== -matrix-js-sdk@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-3.0.0.tgz#97908f9eda9eeb3ba0333b7e474c45f2b258e50c" - integrity sha512-lzUMwJAZHw7Dk0K+rubqe6kEpy4+pJ+qCp8n6lisfdKfMDJXdNCkjiiXRnakM1ZD4PFYK8ju89+NfxlyhAAd4A== +matrix-js-sdk@4.0.0-rc.1: + version "4.0.0-rc.1" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-4.0.0-rc.1.tgz#160d445364aa8ff36ae4fffb0ebc944f680afa4e" + integrity sha512-1tP9fUCU5I4bXQQHuVlKHbpySh71aM6sugVC6L8ikG1ebZuKkAc2tXf1tiHizp3hZadHoTZ1PGH19ZFlKDZ8Qw== dependencies: another-json "^0.2.0" browser-request "^0.3.3" From 6c8f20df60f2cb1b9dfbe2de434d1c63f89ee9be Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 20 Jan 2020 14:34:07 +0000 Subject: [PATCH 036/906] Prepare changelog for v2.0.0-rc.1 --- CHANGELOG.md | 156 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ae2711e25..eda0e0e911 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,159 @@ +Changes in [2.0.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v2.0.0-rc.1) (2020-01-20) +============================================================================================================= +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v1.7.6...v2.0.0-rc.1) + +BREAKING CHANGES +================ + * The react-sdk node module now exports ES6 rather than ES5. If you + wish to supports target that aren't compatible with ES6, you + will need to transpile the react-sdk to a suitable dialect. + +All Changes +=========== + * Fix arrows keys moving through edit history + [\#3874](https://github.com/matrix-org/matrix-react-sdk/pull/3874) + * Fix error about MessagePanel not being available for read markers + [\#3867](https://github.com/matrix-org/matrix-react-sdk/pull/3867) + * Adjust secret storage to work before sync + [\#3864](https://github.com/matrix-org/matrix-react-sdk/pull/3864) + * Update from Weblate + [\#3872](https://github.com/matrix-org/matrix-react-sdk/pull/3872) + * Remove unused deps and dev-deps + [\#3870](https://github.com/matrix-org/matrix-react-sdk/pull/3870) + * Tidy Jest test stuff and dependencies + [\#3869](https://github.com/matrix-org/matrix-react-sdk/pull/3869) + * Move feature flag check for new session toast + [\#3865](https://github.com/matrix-org/matrix-react-sdk/pull/3865) + * Catch exception in checkTerms if no ID server + [\#3863](https://github.com/matrix-org/matrix-react-sdk/pull/3863) + * Catch exception if passphrase dialog cancelled + [\#3862](https://github.com/matrix-org/matrix-react-sdk/pull/3862) + * Disable key request dialogs with cross-signing + [\#3860](https://github.com/matrix-org/matrix-react-sdk/pull/3860) + * Toasts for new, unverified sessions + [\#3859](https://github.com/matrix-org/matrix-react-sdk/pull/3859) + * Check for a matrixclient before trying to use it + [\#3861](https://github.com/matrix-org/matrix-react-sdk/pull/3861) + * Room header & message box shields now reflect cross-signing state + [\#3850](https://github.com/matrix-org/matrix-react-sdk/pull/3850) + * Fix Array.concat undefined + [\#3857](https://github.com/matrix-org/matrix-react-sdk/pull/3857) + * Update chokidar to fix reskindex not working + [\#3856](https://github.com/matrix-org/matrix-react-sdk/pull/3856) + * Make the new DM invite dialog work for regular invites too + [\#3854](https://github.com/matrix-org/matrix-react-sdk/pull/3854) + * Fix event handler leak in MemberStatusMessageAvatar + [\#3855](https://github.com/matrix-org/matrix-react-sdk/pull/3855) + * Move DM creation logic into DMInviteDialog + [\#3843](https://github.com/matrix-org/matrix-react-sdk/pull/3843) + * Remove all text when cutting in the composer + [\#3848](https://github.com/matrix-org/matrix-react-sdk/pull/3848) + * Add a ToastStore + [\#3853](https://github.com/matrix-org/matrix-react-sdk/pull/3853) + * 'Members' button always toggle the right panel + [\#3804](https://github.com/matrix-org/matrix-react-sdk/pull/3804) + * Fix timing of when Composer considers itself to be modified + [\#3842](https://github.com/matrix-org/matrix-react-sdk/pull/3842) + * Compute download file icon immediately + [\#3851](https://github.com/matrix-org/matrix-react-sdk/pull/3851) + * Fix not being able to open profiles from the timeline + [\#3852](https://github.com/matrix-org/matrix-react-sdk/pull/3852) + * Add post-login complete security flow + [\#3847](https://github.com/matrix-org/matrix-react-sdk/pull/3847) + * Added cut/copy and pasting user pills from editor. + [\#3828](https://github.com/matrix-org/matrix-react-sdk/pull/3828) + * Fix imports for help & support tab + [\#3846](https://github.com/matrix-org/matrix-react-sdk/pull/3846) + * Humanize the recent DM rooms ourselves for translations + [\#3841](https://github.com/matrix-org/matrix-react-sdk/pull/3841) + * Improve the quality of invite suggestions by filtering out DMs + [\#3840](https://github.com/matrix-org/matrix-react-sdk/pull/3840) + * Fix linter and tests on develop + [\#3845](https://github.com/matrix-org/matrix-react-sdk/pull/3845) + * Fix sourcemaps by refactoring the build system + [\#3839](https://github.com/matrix-org/matrix-react-sdk/pull/3839) + * Don't error on unverified/unknown devices. + [\#3837](https://github.com/matrix-org/matrix-react-sdk/pull/3837) + * Padlock icons in room header + [\#3835](https://github.com/matrix-org/matrix-react-sdk/pull/3835) + * Don't allow upgrade from untrusted key backup. + [\#3822](https://github.com/matrix-org/matrix-react-sdk/pull/3822) + * Emoji verification: Change name of 🔒 to lock + [\#3825](https://github.com/matrix-org/matrix-react-sdk/pull/3825) + * Room padlock decorations only if cross-signing is enabled + [\#3838](https://github.com/matrix-org/matrix-react-sdk/pull/3838) + * Enable end-to-end tests for sourcemaps (+Windows instructions) + [\#3827](https://github.com/matrix-org/matrix-react-sdk/pull/3827) + * Repair community member info panel + [\#3832](https://github.com/matrix-org/matrix-react-sdk/pull/3832) + * Add feature flag around the presence indicator in room list + [\#3831](https://github.com/matrix-org/matrix-react-sdk/pull/3831) + * Display a padlock icon beside invite-only rooms in the room list + [\#3821](https://github.com/matrix-org/matrix-react-sdk/pull/3821) + * Update from Weblate + [\#3830](https://github.com/matrix-org/matrix-react-sdk/pull/3830) + * Fix listener leak on RoomView + [\#3826](https://github.com/matrix-org/matrix-react-sdk/pull/3826) + * Regenerate i18n for sourcemaps branch + [\#3824](https://github.com/matrix-org/matrix-react-sdk/pull/3824) + * Fix tests for sourcemaps branch + [\#3823](https://github.com/matrix-org/matrix-react-sdk/pull/3823) + * Jest + [\#3724](https://github.com/matrix-org/matrix-react-sdk/pull/3724) + * Sourcemaps: develop -> feature branch + [\#3817](https://github.com/matrix-org/matrix-react-sdk/pull/3817) + * Support pasting a bunch of identifiers into the invite dialog + [\#3820](https://github.com/matrix-org/matrix-react-sdk/pull/3820) + * Support 3PIDs (email addresses) in the invite dialog + [\#3819](https://github.com/matrix-org/matrix-react-sdk/pull/3819) + * Placeholder PR for cleaner diffs: ES6 + [\#3765](https://github.com/matrix-org/matrix-react-sdk/pull/3765) + * Misc fixes for ES6 imports/exports + [\#3766](https://github.com/matrix-org/matrix-react-sdk/pull/3766) + * Wire up the invite targets dialog to a real composer and show selections + [\#3815](https://github.com/matrix-org/matrix-react-sdk/pull/3815) + * Change ref handling in TextualBody to prevent it parsing generated nodes + [\#3711](https://github.com/matrix-org/matrix-react-sdk/pull/3711) + * Render encoded html entities in og:description + [\#3789](https://github.com/matrix-org/matrix-react-sdk/pull/3789) + * Update package.json for new build process + cosmetics + [\#3767](https://github.com/matrix-org/matrix-react-sdk/pull/3767) + * Convert CommonJS exports to ES6 exports + [\#3761](https://github.com/matrix-org/matrix-react-sdk/pull/3761) + * Round 2 of CommonJS to ES6 imports + [\#3764](https://github.com/matrix-org/matrix-react-sdk/pull/3764) + * Strip all variation selectors on emoji + [\#3814](https://github.com/matrix-org/matrix-react-sdk/pull/3814) + * Use the new js-sdk imports and import from src + [\#3763](https://github.com/matrix-org/matrix-react-sdk/pull/3763) + * Convert many imports to handle ES6 exports + [\#3762](https://github.com/matrix-org/matrix-react-sdk/pull/3762) + * Fix userinfo for users not in the room + [\#3812](https://github.com/matrix-org/matrix-react-sdk/pull/3812) + * Attempt to fix e2e tests + [\#3811](https://github.com/matrix-org/matrix-react-sdk/pull/3811) + * Add bunch of null-guards and similar to fix React Errors/complaints + [\#3752](https://github.com/matrix-org/matrix-react-sdk/pull/3752) + * Delegate all room alias validation to the RoomAliasField validator + [\#3807](https://github.com/matrix-org/matrix-react-sdk/pull/3807) + * Support filtering and searching for users to invite in DMs + [\#3802](https://github.com/matrix-org/matrix-react-sdk/pull/3802) + * Add suggestions for which users to invite to chat + [\#3801](https://github.com/matrix-org/matrix-react-sdk/pull/3801) + * Use `flex-start` instead of `start` for postcss + [\#3760](https://github.com/matrix-org/matrix-react-sdk/pull/3760) + * Define getLanguageFromBrowser() for LanguageDropdown + [\#3769](https://github.com/matrix-org/matrix-react-sdk/pull/3769) + * Introduce babel's export-default-from plugin to fix build errors + [\#3768](https://github.com/matrix-org/matrix-react-sdk/pull/3768) + * Add a bit of debugging to incorrect components in the Skinner + [\#3770](https://github.com/matrix-org/matrix-react-sdk/pull/3770) + * [BREAKING] Refactor the entire build process for babel@7 and TypeScript + (chunk 1 of many) + [\#3722](https://github.com/matrix-org/matrix-react-sdk/pull/3722) + * Implementation of new potential skinning mechanism + [\#3723](https://github.com/matrix-org/matrix-react-sdk/pull/3723) + Changes in [1.7.6](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v1.7.6) (2020-01-13) =================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v1.7.6-rc.2...v1.7.6) From 4ee2fce1f11946fa48f84eb300bdfa1b195d0009 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 20 Jan 2020 14:34:07 +0000 Subject: [PATCH 037/906] v2.0.0-rc.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d24fcd1777..b607ed04ca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "1.7.6", + "version": "2.0.0-rc.1", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From f77eb078498e1bdd761e176519fb5a5dc884529c Mon Sep 17 00:00:00 2001 From: Zoe Date: Mon, 20 Jan 2020 15:16:41 +0000 Subject: [PATCH 038/906] Verify individual messages via cross-signing Fixes #11880 --- res/css/views/rooms/_EventTile.scss | 21 ++++++++-- res/themes/light/css/_light.scss | 1 + src/components/views/rooms/EventTile.js | 51 +++++++++++++++++++++---- 3 files changed, 61 insertions(+), 12 deletions(-) diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index fbac1e932a..81ba547ff0 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -367,6 +367,11 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { opacity: 1; } +.mx_EventTile_e2eIcon_userVerified { + background-image: url('$(res)/img/e2e/normal.svg'); + opacity: 0.5; +} + .mx_EventTile_e2eIcon_unencrypted { background-image: url('$(res)/img/e2e/warning.svg'); opacity: 1; @@ -415,7 +420,8 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { } .mx_EventTile:hover.mx_EventTile_verified .mx_EventTile_line, -.mx_EventTile:hover.mx_EventTile_unverified .mx_EventTile_line { +.mx_EventTile:hover.mx_EventTile_unverified .mx_EventTile_line, +.mx_EventTile:hover.mx_EventTile_userVerified .mx_EventTile_line { padding-left: 60px; } @@ -427,8 +433,13 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { border-left: $e2e-unverified-color 5px solid; } +.mx_EventTile:hover.mx_EventTile_userVerified .mx_EventTile_line { + border-left: $e2e-userVerified-color 5px solid; +} + .mx_EventTile:hover.mx_EventTile_verified.mx_EventTile_info .mx_EventTile_line, -.mx_EventTile:hover.mx_EventTile_unverified.mx_EventTile_info .mx_EventTile_line { +.mx_EventTile:hover.mx_EventTile_unverified.mx_EventTile_info .mx_EventTile_line, +.mx_EventTile:hover.mx_EventTile_userVerified.mx_EventTile_info .mx_EventTile_line { padding-left: 78px; } @@ -439,14 +450,16 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { // Explicit relationships so that it doesn't apply to nested EventTile components (e.g in Replies) .mx_EventTile:hover.mx_EventTile_verified .mx_EventTile_line > a > .mx_MessageTimestamp, -.mx_EventTile:hover.mx_EventTile_unverified .mx_EventTile_line > a > .mx_MessageTimestamp { +.mx_EventTile:hover.mx_EventTile_unverified .mx_EventTile_line > a > .mx_MessageTimestamp, +.mx_EventTile:hover.mx_EventTile_userVerified .mx_EventTile_line > a > .mx_MessageTimestamp { left: 3px; width: auto; } // Explicit relationships so that it doesn't apply to nested EventTile components (e.g in Replies) .mx_EventTile:hover.mx_EventTile_verified .mx_EventTile_line > .mx_EventTile_e2eIcon, -.mx_EventTile:hover.mx_EventTile_unverified .mx_EventTile_line > .mx_EventTile_e2eIcon { +.mx_EventTile:hover.mx_EventTile_unverified .mx_EventTile_line > .mx_EventTile_e2eIcon, +.mx_EventTile:hover.mx_EventTile_userVerified .mx_EventTile_line > .mx_EventTile_e2eIcon { display: block; left: 41px; } diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss index 288fb3cadc..17b9a344ef 100644 --- a/res/themes/light/css/_light.scss +++ b/res/themes/light/css/_light.scss @@ -224,6 +224,7 @@ $copy-button-url: "$(res)/img/icon_copy_message.svg"; // e2e $e2e-verified-color: #76cfa5; // N.B. *NOT* the same as $accent-color +$e2e-userVerified-color: #e8bf37; $e2e-unverified-color: #e8bf37; $e2e-warning-color: #ba6363; diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index dce4dc8a93..4aefe6929b 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -235,6 +235,7 @@ export default createReactClass({ this._suppressReadReceiptAnimation = false; const client = this.context; client.on("deviceVerificationChanged", this.onDeviceVerificationChanged); + client.on("userTrustStatusChanged", this.onUserVerificationChanged); this.props.mxEvent.on("Event.decrypted", this._onDecrypted); if (this.props.showReactions) { this.props.mxEvent.on("Event.relationsCreated", this._onReactionsCreated); @@ -260,6 +261,7 @@ export default createReactClass({ componentWillUnmount: function() { const client = this.context; client.removeListener("deviceVerificationChanged", this.onDeviceVerificationChanged); + client.removeListener("userTrustStatusChanged", this.onUserVerificationChanged); this.props.mxEvent.removeListener("Event.decrypted", this._onDecrypted); if (this.props.showReactions) { this.props.mxEvent.removeListener("Event.relationsCreated", this._onReactionsCreated); @@ -282,18 +284,42 @@ export default createReactClass({ } }, + onUserVerificationChanged: function(userId, _trustStatus) { + if (userId === this.props.mxEvent.getSender()) { + this._verifyEvent(this.props.mxEvent); + } + }, + _verifyEvent: async function(mxEvent) { if (!mxEvent.isEncrypted()) { return; } + // If we directly trust the device, short-circuit here const verified = await this.context.isEventSenderVerified(mxEvent); + if (verified) { + this.setState({ + verified: "verified" + }, () => { + // Decryption may have caused a change in size + this.props.onHeightChanged(); + }); + return; + } + + const eventSenderTrust = await this.context.checkEventSenderTrust(mxEvent); + if (!eventSenderTrust) { + // We cannot find the device. Instead, we have to verify the user. + const userTrust = await this.context.checkUserTrust(mxEvent.getSender()); + this.setState({ + verified: userTrust.isVerified() ? "user-verified": "warning", + }, this.props.onHeightChanged); // Decryption may have cause a change in size + return; + } + this.setState({ - verified: verified, - }, () => { - // Decryption may have caused a change in size - this.props.onHeightChanged(); - }); + verified: eventSenderTrust.isVerified() ? "verified" : "warning", + }, this.props.onHeightChanged); // Decryption may have caused a change in size }, _propsEqual: function(objA, objB) { @@ -473,8 +499,10 @@ export default createReactClass({ // event is encrypted, display padlock corresponding to whether or not it is verified if (ev.isEncrypted()) { - if (this.state.verified) { + if (this.state.verified === "verified") { return; // no icon for verified + } else if (this.state.verified === "user-verified") { + return (); } else { return (); } @@ -604,8 +632,9 @@ export default createReactClass({ mx_EventTile_last: this.props.last, mx_EventTile_contextual: this.props.contextual, mx_EventTile_actionBarFocused: this.state.actionBarFocused, - mx_EventTile_verified: !isBubbleMessage && this.state.verified === true, - mx_EventTile_unverified: !isBubbleMessage && this.state.verified === false, + mx_EventTile_verified: !isBubbleMessage && this.state.verified === "verified", + mx_EventTile_unverified: !isBubbleMessage && this.state.verified === "warning", + mx_EventTile_userVerified: !isBubbleMessage && this.state.verified === "user-verified", mx_EventTile_bad: isEncryptionFailure, mx_EventTile_emote: msgtype === 'm.emote', mx_EventTile_redacted: isRedacted, @@ -901,6 +930,12 @@ function E2ePadlockUnencrypted(props) { ); } +function E2ePadlockUserVerified(props) { + return ( + + ); +} + class E2ePadlock extends React.Component { static propTypes = { icon: PropTypes.string.isRequired, From 51fb3b494f8a87f28e2b20f9eafe0e96275de924 Mon Sep 17 00:00:00 2001 From: Zoe Date: Mon, 20 Jan 2020 15:25:01 +0000 Subject: [PATCH 039/906] lint and i18n --- src/components/views/rooms/EventTile.js | 2 +- src/i18n/strings/en_EN.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index 4aefe6929b..f2a77935bc 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -299,7 +299,7 @@ export default createReactClass({ const verified = await this.context.isEventSenderVerified(mxEvent); if (verified) { this.setState({ - verified: "verified" + verified: "verified", }, () => { // Decryption may have caused a change in size this.props.onHeightChanged(); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 4af203177c..510c1be0c7 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -906,6 +906,7 @@ "This message cannot be decrypted": "This message cannot be decrypted", "Encrypted by an unverified device": "Encrypted by an unverified device", "Unencrypted": "Unencrypted", + "Encrypted by a deleted device": "Encrypted by a deleted device", "Please select the destination room for this message": "Please select the destination room for this message", "Scroll to bottom of page": "Scroll to bottom of page", "Close preview": "Close preview", From 1b9b30d4ea735798f344d4fbc36655d4f1ff6950 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Mon, 20 Jan 2020 17:42:24 +0100 Subject: [PATCH 040/906] EventIndexPanel: Get more stats for our indexer, not just the size. --- .../views/settings/EventIndexPanel.js | 40 +++++++++++++------ src/i18n/strings/en_EN.json | 18 +++++---- src/indexing/BaseEventIndexManager.js | 13 +++++- src/indexing/EventIndex.js | 27 ++++++++++++- 4 files changed, 74 insertions(+), 24 deletions(-) diff --git a/src/components/views/settings/EventIndexPanel.js b/src/components/views/settings/EventIndexPanel.js index bade2d8735..f8c61e092d 100644 --- a/src/components/views/settings/EventIndexPanel.js +++ b/src/components/views/settings/EventIndexPanel.js @@ -35,6 +35,9 @@ export default class EventIndexPanel extends React.Component { eventIndexSize: 0, crawlingRooms: 0, totalCrawlingRooms: 0, + eventCount: 0, + roomCount: 0, + currentRoom: null, eventIndexingEnabled: SettingsStore.getValueAt(SettingLevel.DEVICE, 'enableCrawling'), crawlerSleepTime: @@ -44,22 +47,35 @@ export default class EventIndexPanel extends React.Component { async componentWillMount(): void { let eventIndexSize = 0; + let roomCount = 0; + let eventCount = 0; let crawlingRooms = 0; let totalCrawlingRooms = 0; + let currentRoom = null; const eventIndex = EventIndexPeg.get(); if (eventIndex !== null) { - eventIndexSize = await eventIndex.indexSize(); + const stats = await eventIndex.getStats(); + eventIndexSize = stats.size; + roomCount = stats.roomCount; + eventCount = stats.eventCount; + const crawledRooms = eventIndex.currentlyCrawledRooms(); crawlingRooms = crawledRooms.crawlingRooms.size; totalCrawlingRooms = crawledRooms.totalRooms.size; + + const room = eventIndex.currentRoom(); + if (room) currentRoom = room.name; } this.setState({ eventIndexSize, crawlingRooms, totalCrawlingRooms, + eventCount, + roomCount, + currentRoom, }); } @@ -82,16 +98,15 @@ export default class EventIndexPanel extends React.Component { let crawlerState; if (!this.state.eventIndexingEnabled) { - crawlerState =
{_t("Message downloader is stopped.")}
; - } else if (this.state.crawlingRooms === 0) { - crawlerState =
{_t("Message downloader is currently idle.")}
; + crawlerState =
{_t("Message search for encrypted rooms is disabled.")}
; + } else if (this.state.currentRoom === null) { + crawlerState =
{_t("Not currently downloading messages for any room.")}
; } else { crawlerState = (
{_t( - "Currently downloading mesages in %(crawlingRooms)s of %(totalRooms)s rooms.", - { crawlingRooms: this.state.crawlingRooms, - totalRooms: this.state.totalCrawlingRooms, - })} + "Downloading mesages for %(currentRoom)s.", + { currentRoom: this.state.currentRoom } + )}
); } @@ -101,13 +116,14 @@ export default class EventIndexPanel extends React.Component {
{_t("Encrypted search")} { - _t( "To enable search in encrypted rooms, Riot needs to run " + - "a background process to download historical messages " + - "from those rooms to your computer.", + _t( "Riot is securely caching encrypted messages locally for them" + + "to appear in search results:" ) }
- {_t("Message disk usage:")} {formatBytes(this.state.eventIndexSize, 0)}
+ {_t("Space used:")} {formatBytes(this.state.eventIndexSize, 0)}
+ {_t("Indexed messages:")} {this.state.eventCount}
+ {_t("Number of rooms:")} {this.state.roomCount}
{crawlerState}
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 1d1636bfb2..a968c145d9 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -554,6 +554,16 @@ "Failed to set display name": "Failed to set display name", "Disable Notifications": "Disable Notifications", "Enable Notifications": "Enable Notifications", + "Message search for encrypted rooms is disabled.": "Message search for encrypted rooms is disabled.", + "Not currently downloading messages for any room.": "Not currently downloading messages for any room.", + "Downloading mesages for %(currentRoom)s.": "Downloading mesages for %(currentRoom)s.", + "Encrypted search": "Encrypted search", + "Riot is securely caching encrypted messages locally for themto appear in search results:": "Riot is securely caching encrypted messages locally for themto appear in search results:", + "Space used:": "Space used:", + "Indexed messages:": "Indexed messages:", + "Number of rooms:": "Number of rooms:", + "Download and index encrypted messages": "Download and index encrypted messages", + "Message downloading sleep time(ms)": "Message downloading sleep time(ms)", "Connecting to integration manager...": "Connecting to integration manager...", "Cannot connect to integration manager": "Cannot connect to integration manager", "The integration manager is offline or it cannot reach your homeserver.": "The integration manager is offline or it cannot reach your homeserver.", @@ -732,14 +742,6 @@ "Start automatically after system login": "Start automatically after system login", "Always show the window menu bar": "Always show the window menu bar", "Show tray icon and minimize window to it on close": "Show tray icon and minimize window to it on close", - "Message downloader is stopped.": "Message downloader is stopped.", - "Message downloader is currently idle.": "Message downloader is currently idle.", - "Currently downloading mesages in %(crawlingRooms)s of %(totalRooms)s rooms.": "Currently downloading mesages in %(crawlingRooms)s of %(totalRooms)s rooms.", - "Encrypted search": "Encrypted search", - "To enable search in encrypted rooms, Riot needs to run a background process to download historical messages from those rooms to your computer.": "To enable search in encrypted rooms, Riot needs to run a background process to download historical messages from those rooms to your computer.", - "Message disk usage:": "Message disk usage:", - "Download and index encrypted messages": "Download and index encrypted messages", - "Message downloading sleep time(ms)": "Message downloading sleep time(ms)", "Preferences": "Preferences", "Composer": "Composer", "Timeline": "Timeline", diff --git a/src/indexing/BaseEventIndexManager.js b/src/indexing/BaseEventIndexManager.js index 733dc05dd6..819b3e65a7 100644 --- a/src/indexing/BaseEventIndexManager.js +++ b/src/indexing/BaseEventIndexManager.js @@ -67,6 +67,12 @@ export interface HistoricEvent { profile: MatrixProfile; } +export interface IndexStats { + size: number; + event_count: number; + room_count: number; +} + /** * Base class for classes that provide platform-specific event indexing. * @@ -118,9 +124,12 @@ export default class BaseEventIndexManager { } /** - * Get the disk usage of the index + * Get statistical information of the index. + * + * @return {Promise} A promise that will resolve to the index + * statistics. */ - async indexSize(): Promise { + async getStats(): Promise { throw new Error("Unimplemented"); } diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 0d7f43b839..d00a0530ba 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -425,9 +425,9 @@ export default class EventIndex { return indexManager.searchEventIndex(searchArgs); } - async indexSize() { + async getStats() { const indexManager = PlatformPeg.get().getEventIndexingManager(); - return indexManager.indexSize(); + return indexManager.getStats(); } currentlyCrawledRooms() { @@ -456,4 +456,27 @@ export default class EventIndex { return {crawlingRooms, totalRooms}; } + + /** + * Get the room that we are currently crawling. + * + * @returns A MatrixRoom that is being currently crawled, null if no room is + * currently being crawled. + */ + currentRoom() { + if (this._currentCheckpoint === null && this.crawlerCheckpoints.length === 0) { + console.log("EventIndex: No current nor any checkpoint"); + return null; + } + + const client = MatrixClientPeg.get(); + + if (this._currentCheckpoint !== null) { + console.log("EventIndex: Current checkpoint available"); + return client.getRoom(this._currentCheckpoint.roomId); + } else { + console.log("EventIndex: No current but have checkpoint available"); + return client.getRoom(this.crawlerCheckpoints[0].roomId); + } + } } From 8de149704e52c4b1872b32efb899bdd5fd0b6707 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Mon, 20 Jan 2020 17:43:55 +0100 Subject: [PATCH 041/906] EventIndexPanel: Dynamically update the indexer stats. --- .../views/settings/EventIndexPanel.js | 25 +++++++++++++++++++ src/indexing/EventIndex.js | 23 ++++++++++++++--- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/components/views/settings/EventIndexPanel.js b/src/components/views/settings/EventIndexPanel.js index f8c61e092d..b777957a3a 100644 --- a/src/components/views/settings/EventIndexPanel.js +++ b/src/components/views/settings/EventIndexPanel.js @@ -45,6 +45,29 @@ export default class EventIndexPanel extends React.Component { }; } + async updateCurrentRoom(room) { + const eventIndex = EventIndexPeg.get(); + const stats = await eventIndex.getStats(); + let currentRoom = null; + + if (room) currentRoom = room.name; + + this.setState({ + eventIndexSize: stats.size, + roomCount: stats.roomCount, + eventCount: stats.eventCount, + currentRoom: currentRoom, + }); + } + + componentWillUnmount(): void { + const eventIndex = EventIndexPeg.get(); + + if (eventIndex !== null) { + eventIndex.removeListener("changedCheckpoint", this.updateCurrentRoom.bind(this)); + } + } + async componentWillMount(): void { let eventIndexSize = 0; let roomCount = 0; @@ -56,6 +79,8 @@ export default class EventIndexPanel extends React.Component { const eventIndex = EventIndexPeg.get(); if (eventIndex !== null) { + eventIndex.on("changedCheckpoint", this.updateCurrentRoom.bind(this)); + const stats = await eventIndex.getStats(); eventIndexSize = stats.size; roomCount = stats.roomCount; diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index d00a0530ba..5676636eed 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -19,6 +19,7 @@ import {MatrixClientPeg} from "../MatrixClientPeg"; import SettingsStore from '../settings/SettingsStore'; import {SettingLevel} from "../settings/SettingsStore"; import {sleep} from "../utils/promise"; +import {EventEmitter} from "events"; /* * Event indexing class that wraps the platform specific event indexing. @@ -35,6 +36,7 @@ export default class EventIndex { this._crawler = null; this._currentCheckpoint = null; this.liveEventsForIndex = new Set(); + this._eventEmitter = new EventEmitter(); } async init() { @@ -185,6 +187,10 @@ export default class EventIndex { indexManager.addEventToIndex(e, profile); } + emitNewCheckpoint() { + this._eventEmitter.emit("changedCheckpoint", this.currentRoom()); + } + async crawlerFunc() { let cancelled = false; @@ -214,7 +220,10 @@ export default class EventIndex { sleepTime = this._crawlerIdleTime; } - this._currentCheckpoint = null; + if (this._currentCheckpoint !== null) { + this._currentCheckpoint = null; + this.emitNewCheckpoint(); + } await sleep(sleepTime); @@ -234,6 +243,7 @@ export default class EventIndex { } this._currentCheckpoint = checkpoint; + this.emitNewCheckpoint(); idle = false; @@ -465,18 +475,23 @@ export default class EventIndex { */ currentRoom() { if (this._currentCheckpoint === null && this.crawlerCheckpoints.length === 0) { - console.log("EventIndex: No current nor any checkpoint"); return null; } const client = MatrixClientPeg.get(); if (this._currentCheckpoint !== null) { - console.log("EventIndex: Current checkpoint available"); return client.getRoom(this._currentCheckpoint.roomId); } else { - console.log("EventIndex: No current but have checkpoint available"); return client.getRoom(this.crawlerCheckpoints[0].roomId); } } + + on(eventName, callback) { + this._eventEmitter.on(eventName, callback); + } + + removeListener(eventName, callback) { + this._eventEmitter.removeListener(eventName, callback); + } } From 12c4e453870f4570aa2cb85631be8efdfc423e97 Mon Sep 17 00:00:00 2001 From: Zoe Date: Mon, 20 Jan 2020 17:14:31 +0000 Subject: [PATCH 042/906] User verified but device deleted isn't a useful state --- res/css/views/rooms/_EventTile.scss | 14 +++++++------- res/themes/light/css/_light.scss | 2 +- src/components/views/rooms/EventTile.js | 14 ++++++-------- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index 81ba547ff0..e54255c4c4 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -367,7 +367,7 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { opacity: 1; } -.mx_EventTile_e2eIcon_userVerified { +.mx_EventTile_e2eIcon_unknown { background-image: url('$(res)/img/e2e/normal.svg'); opacity: 0.5; } @@ -421,7 +421,7 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { .mx_EventTile:hover.mx_EventTile_verified .mx_EventTile_line, .mx_EventTile:hover.mx_EventTile_unverified .mx_EventTile_line, -.mx_EventTile:hover.mx_EventTile_userVerified .mx_EventTile_line { +.mx_EventTile:hover.mx_EventTile_unknown .mx_EventTile_line { padding-left: 60px; } @@ -433,13 +433,13 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { border-left: $e2e-unverified-color 5px solid; } -.mx_EventTile:hover.mx_EventTile_userVerified .mx_EventTile_line { - border-left: $e2e-userVerified-color 5px solid; +.mx_EventTile:hover.mx_EventTile_unknown .mx_EventTile_line { + border-left: $e2e-unknown-color 5px solid; } .mx_EventTile:hover.mx_EventTile_verified.mx_EventTile_info .mx_EventTile_line, .mx_EventTile:hover.mx_EventTile_unverified.mx_EventTile_info .mx_EventTile_line, -.mx_EventTile:hover.mx_EventTile_userVerified.mx_EventTile_info .mx_EventTile_line { +.mx_EventTile:hover.mx_EventTile_unknown.mx_EventTile_info .mx_EventTile_line { padding-left: 78px; } @@ -451,7 +451,7 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { // Explicit relationships so that it doesn't apply to nested EventTile components (e.g in Replies) .mx_EventTile:hover.mx_EventTile_verified .mx_EventTile_line > a > .mx_MessageTimestamp, .mx_EventTile:hover.mx_EventTile_unverified .mx_EventTile_line > a > .mx_MessageTimestamp, -.mx_EventTile:hover.mx_EventTile_userVerified .mx_EventTile_line > a > .mx_MessageTimestamp { +.mx_EventTile:hover.mx_EventTile_unknown .mx_EventTile_line > a > .mx_MessageTimestamp { left: 3px; width: auto; } @@ -459,7 +459,7 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { // Explicit relationships so that it doesn't apply to nested EventTile components (e.g in Replies) .mx_EventTile:hover.mx_EventTile_verified .mx_EventTile_line > .mx_EventTile_e2eIcon, .mx_EventTile:hover.mx_EventTile_unverified .mx_EventTile_line > .mx_EventTile_e2eIcon, -.mx_EventTile:hover.mx_EventTile_userVerified .mx_EventTile_line > .mx_EventTile_e2eIcon { +.mx_EventTile:hover.mx_EventTile_unknown .mx_EventTile_line > .mx_EventTile_e2eIcon { display: block; left: 41px; } diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss index 17b9a344ef..c868c81549 100644 --- a/res/themes/light/css/_light.scss +++ b/res/themes/light/css/_light.scss @@ -224,7 +224,7 @@ $copy-button-url: "$(res)/img/icon_copy_message.svg"; // e2e $e2e-verified-color: #76cfa5; // N.B. *NOT* the same as $accent-color -$e2e-userVerified-color: #e8bf37; +$e2e-unknown-color: #e8bf37; $e2e-unverified-color: #e8bf37; $e2e-warning-color: #ba6363; diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index f2a77935bc..037b080aa3 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -309,10 +309,8 @@ export default createReactClass({ const eventSenderTrust = await this.context.checkEventSenderTrust(mxEvent); if (!eventSenderTrust) { - // We cannot find the device. Instead, we have to verify the user. - const userTrust = await this.context.checkUserTrust(mxEvent.getSender()); this.setState({ - verified: userTrust.isVerified() ? "user-verified": "warning", + verified: "unknown", }, this.props.onHeightChanged); // Decryption may have cause a change in size return; } @@ -501,8 +499,8 @@ export default createReactClass({ if (ev.isEncrypted()) { if (this.state.verified === "verified") { return; // no icon for verified - } else if (this.state.verified === "user-verified") { - return (); + } else if (this.state.verified === "unknown") { + return (); } else { return (); } @@ -634,7 +632,7 @@ export default createReactClass({ mx_EventTile_actionBarFocused: this.state.actionBarFocused, mx_EventTile_verified: !isBubbleMessage && this.state.verified === "verified", mx_EventTile_unverified: !isBubbleMessage && this.state.verified === "warning", - mx_EventTile_userVerified: !isBubbleMessage && this.state.verified === "user-verified", + mx_EventTile_unknown: !isBubbleMessage && this.state.verified === "unknown", mx_EventTile_bad: isEncryptionFailure, mx_EventTile_emote: msgtype === 'm.emote', mx_EventTile_redacted: isRedacted, @@ -930,9 +928,9 @@ function E2ePadlockUnencrypted(props) { ); } -function E2ePadlockUserVerified(props) { +function E2ePadlockUnknown(props) { return ( - + ); } From 8df07334c34ca39898bddf02deb9af96ac0859b1 Mon Sep 17 00:00:00 2001 From: random Date: Mon, 20 Jan 2020 11:00:28 +0000 Subject: [PATCH 043/906] Translated using Weblate (Italian) Currently translated at 100.0% (2035 of 2035 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index bb35bd6d69..a519c138b1 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2055,5 +2055,24 @@ "Key Backup is enabled on your account but has not been set up from this session. To set up secret storage, restore your key backup.": "Il Backup Chiavi è attivo sul tuo account ma non è stato impostato da questa sessione. Per impostare un archivio segreto, ripristina il tuo backup chiavi.", "Restore": "Ripristina", "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup": "L'archivio segreto verrà impostato usando i dettagli esistenti del backup chiavi. La password dell'archivio segreto e la chiave di recupero saranno le stesse del backup chiavi", - "Restore your Key Backup": "Ripristina il tuo Backup Chiavi" + "Restore your Key Backup": "Ripristina il tuo Backup Chiavi", + "New Session": "Nuova sessione", + "New invite dialog": "Nuova finestra di invito", + "Other users may not trust it": "Altri utenti potrebbero non fidarsi", + "Later": "Più tardi", + "Failed to invite the following users to chat: %(csvUsers)s": "Impossibile invitare i seguenti utenti alla chat: %(csvUsers)s", + "We couldn't create your DM. Please check the users you want to invite and try again.": "Impossibile creare il messaggio diretto. Ricontrolla gli utenti che vuoi invitare e riprova.", + "Something went wrong trying to invite the users.": "Qualcosa è andato storto provando ad invitare gli utenti.", + "We couldn't invite those users. Please check the users you want to invite and try again.": "Impossibile invitare quegli utenti. Ricontrolla gli utenti che vuoi invitare e riprova.", + "Recently Direct Messaged": "Contattati direttamente di recente", + "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.": "Se non riesci a trovare qualcuno, chiedi il nome utente (es. @utente:server.it) o condividi questa stanza.", + "Complete security": "Sicurezza completa", + "Verify this session to grant it access to encrypted messages.": "Verifica questa sessione per concederle accesso ai messaggi cifrati.", + "Start": "Inizia", + "Session verified": "Sessione verificata", + "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "La tua sessione ora è verificata. Ha accesso ai tuoi messaggi cifrati e gli altri utenti la vedranno come fidata.", + "Done": "Fatto", + "Without completing security on this device, it won’t have access to encrypted messages.": "Se non completi la sicurezza su questo dispositivo, esso non avrà accesso ai messaggi cifrati.", + "Go Back": "Torna", + "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup.": "L'archivio segreto verrà impostato usando i dettagli del backup chiavi esistente. La password dell'archivio segreto e la chiave di ripristino saranno le stesse del backup chiavi." } From d3ae65698f21950f9c4208441d2f3eff963bae8e Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 20 Jan 2020 15:26:34 +0000 Subject: [PATCH 044/906] Add prepublish script https://github.com/matrix-org/matrix-react-sdk/pull/3723 removed the prepare script which was how the SDK got built before being published. Add it back as a more modern prepublish script. --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index b607ed04ca..bc99e0eeda 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "typings": "./lib/index.d.ts", "matrix_src_main": "./src/index.js", "scripts": { + "prepublish": "yarn build", "i18n": "matrix-gen-i18n", "prunei18n": "matrix-prune-i18n", "diff-i18n": "cp src/i18n/strings/en_EN.json src/i18n/strings/en_EN_orig.json && ./scripts/gen-i18n.js && node scripts/compare-file.js src/i18n/strings/en_EN_orig.json src/i18n/strings/en_EN.json", From befd4e1f5a0f893722858b70280d278c5aa05b6d Mon Sep 17 00:00:00 2001 From: Zoe Date: Mon, 20 Jan 2020 17:25:08 +0000 Subject: [PATCH 045/906] shout more for unknown devices, but keep the tooltip --- res/css/views/rooms/_EventTile.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index e54255c4c4..d292c729dd 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -368,8 +368,8 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { } .mx_EventTile_e2eIcon_unknown { - background-image: url('$(res)/img/e2e/normal.svg'); - opacity: 0.5; + background-image: url('$(res)/img/e2e/warning.svg'); + opacity: 1; } .mx_EventTile_e2eIcon_unencrypted { From 71f96770c6d494b8fd8a08ab304d25dc17d7185c Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 20 Jan 2020 17:27:00 +0000 Subject: [PATCH 046/906] Prepare changelog for v2.0.0-rc.2 --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index eda0e0e911..7630231615 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +Changes in [2.0.0-rc.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v2.0.0-rc.2) (2020-01-20) +============================================================================================================= +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v2.0.0-rc.1...v2.0.0-rc.2) + + * Add prepublish script + [\#3877](https://github.com/matrix-org/matrix-react-sdk/pull/3877) + Changes in [2.0.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v2.0.0-rc.1) (2020-01-20) ============================================================================================================= [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v1.7.6...v2.0.0-rc.1) From 4521ef1a7bed272288bf2e63fe673eeedeb0ea40 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 20 Jan 2020 17:27:00 +0000 Subject: [PATCH 047/906] v2.0.0-rc.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bc99e0eeda..9203b20bfa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "2.0.0-rc.1", + "version": "2.0.0-rc.2", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From 0bcfe5819fd033040429aba0941d450b5477e0ee Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 20 Jan 2020 20:31:36 +0000 Subject: [PATCH 048/906] Integrate handleHomeEnd --- src/accessibility/RovingTabIndex.js | 18 +++++++++++++++--- src/components/views/rooms/RoomList.js | 8 +++----- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/accessibility/RovingTabIndex.js b/src/accessibility/RovingTabIndex.js index 85aa133aa4..2445a47e35 100644 --- a/src/accessibility/RovingTabIndex.js +++ b/src/accessibility/RovingTabIndex.js @@ -23,6 +23,7 @@ import React, { useRef, useReducer, } from "react"; +import PropTypes from "prop-types"; import {Key} from "../Keyboard"; /** @@ -128,7 +129,7 @@ const reducer = (state, action) => { } }; -export const RovingTabIndexProvider = ({children}) => { +export const RovingTabIndexProvider = ({children, handleHomeEnd}) => { const [state, dispatch] = useReducer(reducer, { activeRef: null, refs: [], @@ -136,13 +137,24 @@ export const RovingTabIndexProvider = ({children}) => { const context = useMemo(() => ({state, dispatch}), [state]); + if (handleHomeEnd) { + return + + { children } + + + } + return - {children} + { children } ; }; +RovingTabIndexProvider.propTypes = { + handleHomeEnd: PropTypes.bool, +}; // Helper to handle Home/End to jump to first/last roving-tab-index for widgets such as treeview -export const RovingTabIndexHomeEndHelper = ({children}) => { +export const HomeEndHelper = ({children}) => { const context = useContext(RovingTabIndexContext); const onKeyDown = useCallback((ev) => { diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index a137a36c60..bd563b2f28 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -39,7 +39,7 @@ import * as sdk from "../../../index"; import * as Receipt from "../../../utils/Receipt"; import {Resizer} from '../../../resizer'; import {Layout, Distributor} from '../../../resizer/distributors/roomsublist2'; -import {RovingTabIndexProvider, RovingTabIndexHomeEndHelper} from "../../../accessibility/RovingTabIndex"; +import {RovingTabIndexProvider} from "../../../accessibility/RovingTabIndex"; const HIDE_CONFERENCE_CHANS = true; const STANDARD_TAGS_REGEX = /^(m\.(favourite|lowpriority|server_notice)|im\.vector\.fake\.(invite|recent|direct|archived))$/; @@ -788,10 +788,8 @@ export default createReactClass({ onMouseMove={this.onMouseMove} onMouseLeave={this.onMouseLeave} > - - - { subListComponents } - + + { subListComponents }
); From be6a3821215b699d683cd7a628e583bdaa68d792 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 20 Jan 2020 20:46:12 +0000 Subject: [PATCH 049/906] delint --- src/accessibility/RovingTabIndex.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/accessibility/RovingTabIndex.js b/src/accessibility/RovingTabIndex.js index 2445a47e35..8924815f23 100644 --- a/src/accessibility/RovingTabIndex.js +++ b/src/accessibility/RovingTabIndex.js @@ -142,7 +142,7 @@ export const RovingTabIndexProvider = ({children, handleHomeEnd}) => { { children } - + ; } return From 4e018905fc6ad87e6f75f4fd31fe30a8e96d1699 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 20 Jan 2020 15:17:47 -0700 Subject: [PATCH 050/906] Remove Chrome stuff (not needed for riot-web tests anymore) --- .buildkite/pipeline.yaml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.buildkite/pipeline.yaml b/.buildkite/pipeline.yaml index a8ce1273fb..85aff94069 100644 --- a/.buildkite/pipeline.yaml +++ b/.buildkite/pipeline.yaml @@ -83,12 +83,6 @@ steps: # webpack loves to gorge itself on resources. queue: "medium" command: - # Install chrome - - "echo '--- Installing Chrome'" - - "wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -" - - "sh -c 'echo \"deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main\" >> /etc/apt/sources.list.d/google.list'" - - "apt-get update" - - "apt-get install -y google-chrome-stable" # TODO: Remove hacky chmod for BuildKite - "chmod +x ./scripts/ci/*.sh" - "chmod +x ./scripts/*" @@ -98,8 +92,6 @@ steps: - "yarn build" - "echo '+++ Running Tests'" - "./scripts/ci/riot-unit-tests.sh" - env: - CHROME_BIN: "/usr/bin/google-chrome-stable" plugins: - docker#v3.0.1: image: "node:10" From 62b1dd77a68fdf5cee58fd0f9041a05e9155d0d7 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 20 Jan 2020 16:12:59 -0700 Subject: [PATCH 051/906] Fix layering of the riot-web tests pipeline --- .buildkite/pipeline.yaml | 5 +---- scripts/ci/layered-riot-web.sh | 33 +++++++++++++++++++++++++++++++++ scripts/ci/riot-unit-tests.sh | 7 ++----- scripts/fetchdep.sh | 2 +- 4 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 scripts/ci/layered-riot-web.sh diff --git a/.buildkite/pipeline.yaml b/.buildkite/pipeline.yaml index 85aff94069..100d14e967 100644 --- a/.buildkite/pipeline.yaml +++ b/.buildkite/pipeline.yaml @@ -86,16 +86,13 @@ steps: # TODO: Remove hacky chmod for BuildKite - "chmod +x ./scripts/ci/*.sh" - "chmod +x ./scripts/*" - - "echo '--- Installing Dependencies'" - - "./scripts/ci/install-deps.sh" - - "echo '--- Running initial build steps'" - - "yarn build" - "echo '+++ Running Tests'" - "./scripts/ci/riot-unit-tests.sh" plugins: - docker#v3.0.1: image: "node:10" propagate-environment: true + workdir: "/workdir/matrix-react-sdk" - label: "🌐 i18n" command: diff --git a/scripts/ci/layered-riot-web.sh b/scripts/ci/layered-riot-web.sh new file mode 100644 index 0000000000..2b908be68f --- /dev/null +++ b/scripts/ci/layered-riot-web.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# Creates an environment similar to one that riot-web would expect for +# development. This means going one directory up (and assuming we're in +# a directory like /workdir/matrix-react-sdk) and putting riot-web and +# the js-sdk there. + +cd ../ # Assume we're at something like /workdir/matrix-react-sdk + +# Set up the js-sdk first +matrix-react-sdk/scripts/fetchdep.sh matrix-org matrix-js-sdk +pushd matrix-js-sdk +yarn link +yarn install +#yarn build +popd + +# Now set up the react-sdk +pushd matrix-react-sdk +yarn link matrix-js-sdk +yarn link +yarn install +#yarn build +popd + +# Finally, set up riot-web +matrix-react-sdk/scripts/fetchdep.sh vector-im riot-web +pushd riot-web +yarn link matrix-js-sdk +yarn link matrix-react-sdk +yarn install +yarn build:res +popd diff --git a/scripts/ci/riot-unit-tests.sh b/scripts/ci/riot-unit-tests.sh index 215af13030..7a9ed77793 100755 --- a/scripts/ci/riot-unit-tests.sh +++ b/scripts/ci/riot-unit-tests.sh @@ -6,9 +6,6 @@ set -ev -RIOT_WEB_DIR=riot-web - -scripts/ci/build.sh -pushd "$RIOT_WEB_DIR" +scripts/ci/layered-riot-web.sh +cd ../riot-web yarn test -popd diff --git a/scripts/fetchdep.sh b/scripts/fetchdep.sh index f82752bfc5..f477fd08b8 100755 --- a/scripts/fetchdep.sh +++ b/scripts/fetchdep.sh @@ -17,7 +17,7 @@ clone() { if [ -n "$branch" ] then echo "Trying to use $org/$repo#$branch" - git clone git://github.com/$org/$repo.git $repo --branch "$branch" && exit 0 + git clone git://github.com/$org/$repo.git $repo --branch "$branch" --depth=1 && exit 0 fi } From 3eeeb9c6afbacf46da266675ff17772747a3a47f Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 20 Jan 2020 16:20:02 -0700 Subject: [PATCH 052/906] Remove irrelevant build steps --- scripts/ci/layered-riot-web.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/ci/layered-riot-web.sh b/scripts/ci/layered-riot-web.sh index 2b908be68f..f58794b451 100644 --- a/scripts/ci/layered-riot-web.sh +++ b/scripts/ci/layered-riot-web.sh @@ -12,7 +12,6 @@ matrix-react-sdk/scripts/fetchdep.sh matrix-org matrix-js-sdk pushd matrix-js-sdk yarn link yarn install -#yarn build popd # Now set up the react-sdk @@ -20,7 +19,6 @@ pushd matrix-react-sdk yarn link matrix-js-sdk yarn link yarn install -#yarn build popd # Finally, set up riot-web From 27412ba0b2f342a42652ae6da69d41cfc2a17b03 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 20 Jan 2020 16:23:33 -0700 Subject: [PATCH 053/906] Fix end-to-end test layering too --- .buildkite/pipeline.yaml | 1 + scripts/ci/build.sh | 25 ------------------------- scripts/ci/end-to-end-tests.sh | 10 +++++----- 3 files changed, 6 insertions(+), 30 deletions(-) delete mode 100755 scripts/ci/build.sh diff --git a/.buildkite/pipeline.yaml b/.buildkite/pipeline.yaml index 100d14e967..de61d4e5b9 100644 --- a/.buildkite/pipeline.yaml +++ b/.buildkite/pipeline.yaml @@ -76,6 +76,7 @@ steps: - docker#v3.0.1: image: "matrixdotorg/riotweb-ci-e2etests-env:latest" propagate-environment: true + workdir: "/workdir/matrix-react-sdk" - label: "🔧 Riot Tests" agents: diff --git a/scripts/ci/build.sh b/scripts/ci/build.sh deleted file mode 100755 index 0b1fa23093..0000000000 --- a/scripts/ci/build.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -# -# script which is run by the CI build (after `yarn test`). -# -# clones riot-web develop and runs the tests against our version of react-sdk. - -set -ev - -RIOT_WEB_DIR=riot-web -REACT_SDK_DIR=`pwd` - -yarn link - -scripts/fetchdep.sh vector-im riot-web - -pushd "$RIOT_WEB_DIR" - -yarn link matrix-js-sdk -yarn link matrix-react-sdk - -yarn install - -yarn build - -popd diff --git a/scripts/ci/end-to-end-tests.sh b/scripts/ci/end-to-end-tests.sh index a592888292..9eb3c2bd87 100755 --- a/scripts/ci/end-to-end-tests.sh +++ b/scripts/ci/end-to-end-tests.sh @@ -21,15 +21,15 @@ handle_error() { trap 'handle_error' ERR -RIOT_WEB_DIR=riot-web -REACT_SDK_DIR=`pwd` - echo "--- Building Riot" -scripts/ci/build.sh +scripts/ci/layered-riot-web.sh +cd ../riot-web +yarn build +cd ../matrix-react-sdk # run end to end tests pushd test/end-to-end-tests -ln -s $REACT_SDK_DIR/$RIOT_WEB_DIR riot/riot-web +ln -s ../riot-web riot/riot-web # PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true ./install.sh # CHROME_PATH=$(which google-chrome-stable) ./run.sh echo "--- Install synapse & other dependencies" From 19615d372175e6f7e8f7756e33f236ac41cb626e Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 20 Jan 2020 16:33:13 -0700 Subject: [PATCH 054/906] Disable minification of Riot in end-to-end tests --- scripts/ci/end-to-end-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ci/end-to-end-tests.sh b/scripts/ci/end-to-end-tests.sh index 9eb3c2bd87..cc1e548af9 100755 --- a/scripts/ci/end-to-end-tests.sh +++ b/scripts/ci/end-to-end-tests.sh @@ -25,7 +25,7 @@ trap 'handle_error' ERR echo "--- Building Riot" scripts/ci/layered-riot-web.sh cd ../riot-web -yarn build +CI_PACKAGE=true yarn build cd ../matrix-react-sdk # run end to end tests pushd test/end-to-end-tests From 776b3af6bb46c7a55a121abfffe32dc26efcf772 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 20 Jan 2020 16:33:22 -0700 Subject: [PATCH 055/906] Fix relative pathing on riot-web link --- scripts/ci/end-to-end-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ci/end-to-end-tests.sh b/scripts/ci/end-to-end-tests.sh index cc1e548af9..bae268bbe3 100755 --- a/scripts/ci/end-to-end-tests.sh +++ b/scripts/ci/end-to-end-tests.sh @@ -29,7 +29,7 @@ CI_PACKAGE=true yarn build cd ../matrix-react-sdk # run end to end tests pushd test/end-to-end-tests -ln -s ../riot-web riot/riot-web +ln -s ../../../riot-web riot/riot-web # PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true ./install.sh # CHROME_PATH=$(which google-chrome-stable) ./run.sh echo "--- Install synapse & other dependencies" From 3b2f96bc047bbe221efe216ced07dc927d016d09 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 20 Jan 2020 18:02:54 -0700 Subject: [PATCH 056/906] Try explicitly mapping the directory --- scripts/ci/end-to-end-tests.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/ci/end-to-end-tests.sh b/scripts/ci/end-to-end-tests.sh index bae268bbe3..9bdb512940 100755 --- a/scripts/ci/end-to-end-tests.sh +++ b/scripts/ci/end-to-end-tests.sh @@ -25,11 +25,12 @@ trap 'handle_error' ERR echo "--- Building Riot" scripts/ci/layered-riot-web.sh cd ../riot-web +riot_web_dir=`pwd` CI_PACKAGE=true yarn build cd ../matrix-react-sdk # run end to end tests pushd test/end-to-end-tests -ln -s ../../../riot-web riot/riot-web +ln -s $riot_web_dir riot/riot-web # PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true ./install.sh # CHROME_PATH=$(which google-chrome-stable) ./run.sh echo "--- Install synapse & other dependencies" From 4913d579e37c5bcb0c39d6291fb1e43110c4ffc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 21 Jan 2020 09:24:20 +0100 Subject: [PATCH 057/906] EventIndexPanel: Reword the crawler state if no room is being crawled. --- src/components/views/settings/EventIndexPanel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/settings/EventIndexPanel.js b/src/components/views/settings/EventIndexPanel.js index b777957a3a..b3c75cd336 100644 --- a/src/components/views/settings/EventIndexPanel.js +++ b/src/components/views/settings/EventIndexPanel.js @@ -125,7 +125,7 @@ export default class EventIndexPanel extends React.Component { if (!this.state.eventIndexingEnabled) { crawlerState =
{_t("Message search for encrypted rooms is disabled.")}
; } else if (this.state.currentRoom === null) { - crawlerState =
{_t("Not currently downloading messages for any room.")}
; + crawlerState =
{_t("Not downloading messages for any room.")}
; } else { crawlerState = (
{_t( From 908a00a13dc936d9bab61c165d9fe941999f8924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 21 Jan 2020 10:06:04 +0100 Subject: [PATCH 058/906] EventIndexPanel: Move the panel from the preferences to the security tab. --- src/components/views/settings/EventIndexPanel.js | 14 ++++++++++++-- .../tabs/user/PreferencesUserSettingsTab.js | 4 ---- .../settings/tabs/user/SecurityUserSettingsTab.js | 9 +++++++++ src/i18n/strings/en_EN.json | 5 +++-- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/components/views/settings/EventIndexPanel.js b/src/components/views/settings/EventIndexPanel.js index b3c75cd336..5b8029a09a 100644 --- a/src/components/views/settings/EventIndexPanel.js +++ b/src/components/views/settings/EventIndexPanel.js @@ -138,8 +138,7 @@ export default class EventIndexPanel extends React.Component { if (EventIndexPeg.get() !== null) { eventIndexingSettings = ( -
- {_t("Encrypted search")} +
{ _t( "Riot is securely caching encrypted messages locally for them" + "to appear in search results:" @@ -165,6 +164,17 @@ export default class EventIndexPanel extends React.Component { onChange={this._onCrawlerSleepTimeChange} />
); + } else { + eventIndexingSettings = ( +
+ { + _t( "Riot can't securely cache encrypted messages locally" + + "while running in a web browser. Use Riot Desktop for" + + "encrypted messages to appear in search results." + ) + } +
+ ); } return eventIndexingSettings; diff --git a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js index 5ecafcc5ae..8cbaba037d 100644 --- a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js @@ -144,8 +144,6 @@ export default class PreferencesUserSettingsTab extends React.Component { } render() { - const EventIndexPanel = sdk.getComponent('views.settings.EventIndexPanel'); - let autoLaunchOption = null; if (this.state.autoLaunchSupported) { autoLaunchOption =
{_t("Preferences")}
- -
{_t("Composer")} {this._renderGroup(PreferencesUserSettingsTab.COMPOSER_SETTINGS)} diff --git a/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js b/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js index 5eadfc234a..8ef9983efd 100644 --- a/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js @@ -242,6 +242,7 @@ export default class SecurityUserSettingsTab extends React.Component { render() { const DevicesPanel = sdk.getComponent('views.settings.DevicesPanel'); const SettingsFlag = sdk.getComponent('views.elements.SettingsFlag'); + const EventIndexPanel = sdk.getComponent('views.settings.EventIndexPanel'); const KeyBackupPanel = sdk.getComponent('views.settings.KeyBackupPanel'); const keyBackup = ( @@ -253,6 +254,13 @@ export default class SecurityUserSettingsTab extends React.Component {
); + const eventIndex = ( +
+ {_t("Encrypted search")} + +
+ ); + // XXX: There's no such panel in the current cross-signing designs, but // it's useful to have for testing the feature. If there's no interest // in having advanced details here once all flows are implemented, we @@ -281,6 +289,7 @@ export default class SecurityUserSettingsTab extends React.Component {
{keyBackup} + {eventIndex} {crossSigning} {this._renderCurrentDeviceInfo()}
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index a968c145d9..f78e3594ee 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -555,15 +555,15 @@ "Disable Notifications": "Disable Notifications", "Enable Notifications": "Enable Notifications", "Message search for encrypted rooms is disabled.": "Message search for encrypted rooms is disabled.", - "Not currently downloading messages for any room.": "Not currently downloading messages for any room.", + "Not downloading messages for any room.": "Not downloading messages for any room.", "Downloading mesages for %(currentRoom)s.": "Downloading mesages for %(currentRoom)s.", - "Encrypted search": "Encrypted search", "Riot is securely caching encrypted messages locally for themto appear in search results:": "Riot is securely caching encrypted messages locally for themto appear in search results:", "Space used:": "Space used:", "Indexed messages:": "Indexed messages:", "Number of rooms:": "Number of rooms:", "Download and index encrypted messages": "Download and index encrypted messages", "Message downloading sleep time(ms)": "Message downloading sleep time(ms)", + "Riot can't securely cache encrypted messages locallywhile running in a web browser. Use Riot Desktop forencrypted messages to appear in search results.": "Riot can't securely cache encrypted messages locallywhile running in a web browser. Use Riot Desktop forencrypted messages to appear in search results.", "Connecting to integration manager...": "Connecting to integration manager...", "Cannot connect to integration manager": "Cannot connect to integration manager", "The integration manager is offline or it cannot reach your homeserver.": "The integration manager is offline or it cannot reach your homeserver.", @@ -759,6 +759,7 @@ "Accept all %(invitedRooms)s invites": "Accept all %(invitedRooms)s invites", "Reject all %(invitedRooms)s invites": "Reject all %(invitedRooms)s invites", "Key backup": "Key backup", + "Encrypted search": "Encrypted search", "Cross-signing": "Cross-signing", "Security & Privacy": "Security & Privacy", "Devices": "Devices", From d34f1e52ad1e7d499018f96f6942501c7598b005 Mon Sep 17 00:00:00 2001 From: Zoe Date: Tue, 21 Jan 2020 10:08:53 +0000 Subject: [PATCH 059/906] constants for e2estates --- src/components/views/rooms/EventTile.js | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index 037b080aa3..9c73daaa50 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -66,6 +66,12 @@ const stateEventTileTypes = { 'm.room.related_groups': 'messages.TextualEvent', }; +const E2ESTATE = { + VERIFIED: "verified", + WARNING: "warning", + UNKNOWN: "unknown", +}; + // Add all the Mjolnir stuff to the renderer for (const evType of ALL_RULE_TYPES) { stateEventTileTypes[evType] = 'messages.TextualEvent'; @@ -299,7 +305,7 @@ export default createReactClass({ const verified = await this.context.isEventSenderVerified(mxEvent); if (verified) { this.setState({ - verified: "verified", + verified: E2ESTATE.VERIFIED, }, () => { // Decryption may have caused a change in size this.props.onHeightChanged(); @@ -310,13 +316,13 @@ export default createReactClass({ const eventSenderTrust = await this.context.checkEventSenderTrust(mxEvent); if (!eventSenderTrust) { this.setState({ - verified: "unknown", + verified: E2ESTATE.UNKNOWN, }, this.props.onHeightChanged); // Decryption may have cause a change in size return; } this.setState({ - verified: eventSenderTrust.isVerified() ? "verified" : "warning", + verified: eventSenderTrust.isVerified() ? E2ESTATE.VERIFIED : E2ESTATE.WARNING, }, this.props.onHeightChanged); // Decryption may have caused a change in size }, @@ -497,9 +503,9 @@ export default createReactClass({ // event is encrypted, display padlock corresponding to whether or not it is verified if (ev.isEncrypted()) { - if (this.state.verified === "verified") { + if (this.state.verified === E2ESTATE.VERIFIED) { return; // no icon for verified - } else if (this.state.verified === "unknown") { + } else if (this.state.verified === E2ESTATE.UNKNOWN) { return (); } else { return (); @@ -630,9 +636,9 @@ export default createReactClass({ mx_EventTile_last: this.props.last, mx_EventTile_contextual: this.props.contextual, mx_EventTile_actionBarFocused: this.state.actionBarFocused, - mx_EventTile_verified: !isBubbleMessage && this.state.verified === "verified", - mx_EventTile_unverified: !isBubbleMessage && this.state.verified === "warning", - mx_EventTile_unknown: !isBubbleMessage && this.state.verified === "unknown", + mx_EventTile_verified: !isBubbleMessage && this.state.verified === E2ESTATE.VERIFIED, + mx_EventTile_unverified: !isBubbleMessage && this.state.verified === E2ESTATE.WARNING, + mx_EventTile_unknown: !isBubbleMessage && this.state.verified === E2ESTATE.UNKNOWN, mx_EventTile_bad: isEncryptionFailure, mx_EventTile_emote: msgtype === 'm.emote', mx_EventTile_redacted: isRedacted, From 996d0f1d2074ef76e5c2d111569dd888cb01ab00 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Tue, 21 Jan 2020 08:05:43 +0000 Subject: [PATCH 060/906] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2039 of 2039 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index dbd8319b8a..b459fb9306 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2075,5 +2075,9 @@ "Something went wrong trying to invite the users.": "在嘗試邀請使用者時發生錯誤。", "We couldn't invite those users. Please check the users you want to invite and try again.": "我們無法邀請那些使用者。請檢查您想要邀請的使用者並再試一次。", "Recently Direct Messaged": "最近傳送過直接訊息", - "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.": "如果您找不到某人,請詢問他們的使用者名稱(範例:@user:server.com)或分享此聊天室。" + "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.": "如果您找不到某人,請詢問他們的使用者名稱(範例:@user:server.com)或分享此聊天室。", + "Verify User": "驗證使用者", + "For extra security, verify this user by checking a one-time code on both of your devices.": "為了提高安全性,請透過檢查您兩個裝置上的一次性代碼來驗證此使用者。", + "For maximum security, do this in person.": "為了取得最強的安全性,請親自進行。", + "Start Verification": "開始驗證" } From 961f52924e0c84020b55a3ca45e065541933ec0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Tue, 21 Jan 2020 10:26:12 +0000 Subject: [PATCH 061/906] Translated using Weblate (French) Currently translated at 100.0% (2039 of 2039 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index d1c4f7379c..abe05e9812 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2075,5 +2075,9 @@ "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup.": "Le coffre secret sera configuré en utilisant les détails existants de votre sauvegarde de clés. Votre phrase de passe et votre clé de récupération seront les mêmes que celles de votre sauvegarde de clés.", "New Session": "Nouvelle session", "Other users may not trust it": "D’autres utilisateurs pourraient ne pas lui faire confiance", - "Later": "Plus tard" + "Later": "Plus tard", + "Verify User": "Vérifier l’utilisateur", + "For extra security, verify this user by checking a one-time code on both of your devices.": "Pour une meilleure sécurité, vérifiez cet utilisateur en comparant un code à usage unique sur vos deux appareils.", + "For maximum security, do this in person.": "Pour une sécurité maximale, faites-le en personne.", + "Start Verification": "Commencer la vérification" } From 21dea189855ec027cd4bf8a3f1768aca62f83c52 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Mon, 20 Jan 2020 20:29:42 +0000 Subject: [PATCH 062/906] Translated using Weblate (Hungarian) Currently translated at 100.0% (2039 of 2039 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index e5b9f637f1..c5334c1592 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1156,7 +1156,7 @@ "Show avatars in user and room mentions": "Profilkép mutatása a felhasználó és szoba említéseknél", "Enable big emoji in chat": "Nagy Emojik engedélyezése a csevegésekben", "Send typing notifications": "Gépelés visszajelzés küldése", - "Enable Community Filter Panel": "Közösségi szűrő panel engedélyezése", + "Enable Community Filter Panel": "Közösségi szűrő panel bekapcsolása", "Messages containing my username": "Üzenetek amik a nevemet tartalmazzák", "The other party cancelled the verification.": "A másik fél törölte az ellenőrzést.", "Verified!": "Ellenőrizve!", @@ -2076,5 +2076,9 @@ "Something went wrong trying to invite the users.": "Valami nem sikerült a felhasználók meghívásával.", "We couldn't invite those users. Please check the users you want to invite and try again.": "Ezeket a felhasználókat nem tudtuk meghívni. Ellenőrizd azokat a felhasználókat akiket meg szeretnél hívni és próbáld újra.", "Recently Direct Messaged": "Nemrég küldött Közvetlen Üzenetek", - "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.": "Ha nem találsz valakit, akkor kérdezd meg a felhasználói nevét (pl.: @felhasználó:szerver.com) vagy oszd meg ezt a szobát." + "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.": "Ha nem találsz valakit, akkor kérdezd meg a felhasználói nevét (pl.: @felhasználó:szerver.com) vagy oszd meg ezt a szobát.", + "Verify User": "Felhasználó ellenőrzése", + "For extra security, verify this user by checking a one-time code on both of your devices.": "A biztonság fokozásáért ellenőrizd ezt a felhasználót egy egyszeri kód egyeztetésével mindkettőtök készülékén.", + "For maximum security, do this in person.": "A legnagyobb biztonság érdekében ezt személyesen tedd meg.", + "Start Verification": "Ellenőrzés elindítása" } From 46f2c1f29b3a5ec9551b302a29e9aff317f120a5 Mon Sep 17 00:00:00 2001 From: Makoto Kato Date: Tue, 21 Jan 2020 06:51:42 +0000 Subject: [PATCH 063/906] Translated using Weblate (Japanese) Currently translated at 60.1% (1226 of 2039 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ja/ --- src/i18n/strings/ja.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 55cc8782ef..787dcbc4ca 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -601,7 +601,7 @@ "Copied!": "コピーされました!", "Failed to copy": "コピーに失敗しました", "Add an Integration": "統合を追加する", - "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?": "サードパーティのサイトに移動して、%(integationsUrl)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?": "サードパーティのサイトに移動して、%(integrationsUrl)s で使用するためにアカウントを認証できるようになります。続行しますか?", "Removed or unknown message type": "削除されたまたは未知のメッセージタイプ", "Message removed by %(userId)s": "%(userId)s によってメッセージが削除されました", "Message removed": "メッセージが削除された", @@ -630,7 +630,7 @@ "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "%(roomName)s を %(groupId)s から削除してもよろしいですか?", "Removing a room from the community will also remove it from the community page.": "コミュニティから部屋を削除すると、コミュニティページからもその部屋が削除されます。", "Failed to remove room from community": "コミュニティからの部屋の削除に失敗しました", - "Failed to remove '%(roomName)s' from %(groupId)s": "%(groupName)s から '%(roomName)s' を削除できませんでした", + "Failed to remove '%(roomName)s' from %(groupId)s": "%(groupId)s から '%(roomName)s' を削除できませんでした", "Something went wrong!": "何かが間違っていた!", "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "%(groupId)s の '%(roomName)s' の表示を更新できませんでした。", "Visibility in Room List": "ルームリストの可視性", @@ -668,7 +668,7 @@ "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s が参加しました", "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s が %(count)s 回参加しました", "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s が参加しました", - "%(severalUsers)sleft %(count)s times|other": "%(severalUers)s は %(count)s 回退出しました", + "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s は %(count)s 回退出しました", "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s は退出しました", "%(oneUser)sleft %(count)s times|other": "%(oneUser)s は %(count)s 回退出しました", "%(oneUser)sleft %(count)s times|one": "%(oneUser)s は退出しました", From b5d5f4e13a8291d27479eb01d39e12ab2948ab6f Mon Sep 17 00:00:00 2001 From: catborise Date: Mon, 20 Jan 2020 18:09:12 +0000 Subject: [PATCH 064/906] Translated using Weblate (Turkish) Currently translated at 70.0% (1428 of 2039 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/tr/ --- src/i18n/strings/tr.json | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 81f0522922..1e92d28586 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -1422,5 +1422,23 @@ "Enable Community Filter Panel": "Toluluk Filtre Panelini Aç", "Match system theme": "Sistem temasıyla eşle", "Allow Peer-to-Peer for 1:1 calls": "1:1 çağrılar için eşten-eşe izin ver", - "Missing media permissions, click the button below to request.": "Medya izinleri eksik, alttaki butona tıkayarak talep edin." + "Missing media permissions, click the button below to request.": "Medya izinleri eksik, alttaki butona tıkayarak talep edin.", + "Credits": "Katkıda Bulunanlar", + "Clear cache and reload": "Belleği temizle ve yeniden yükle", + "Customise your experience with experimental labs features. Learn more.": "Deneysel laboratuar özellikler ile deneyiminizi özelleştirebilirsiniz. Daha fazla.", + "Ignored/Blocked": "Yoksayılan/Bloklanan", + "Error adding ignored user/server": "Yoksayılan kullanıcı/sunucu eklenirken hata", + "Error subscribing to list": "Listeye abone olunurken hata", + "Error removing ignored user/server": "Yoksayılan kullanıcı/sunucu silinirken hata", + "Error unsubscribing from list": "Listeden abonelikten çıkılırken hata", + "You are not subscribed to any lists": "Herhangi bir listeye aboneliğiniz bulunmuyor", + "⚠ These settings are meant for advanced users.": "⚠ Bu ayarlar ileri düzey kullanıcılar içindir.", + "Unignore": "Yoksayma", + "This bridge was provisioned by ": "Bu körpü tarafından provize edildi", + "Connected to on ": " ağındaki kanala bağlandı", + "Below is a list of bridges connected to this room.": "Bu odaya bağlanmış köprülerin bir listesi alttadır.", + "Change room avatar": "Oda resmini değiştir", + "Members only (since the point in time of selecting this option)": "Sadece üyeler ( bu seçeneği seçtiğinizden itibaren)", + "Unable to revoke sharing for email address": "E-posta adresi paylaşımı kaldırılamadı", + "Unable to revoke sharing for phone number": "Telefon numarası paylaşımı kaldırılamıyor" } From 6b85284632fad2d83f38d9f71959e8afcac1a76d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 21 Jan 2020 13:20:30 +0100 Subject: [PATCH 065/906] EventIndexPanel: Move the bulk of the event index info into a modal. --- .../dialogs/eventindex/ManageEventIndex.js | 226 ++++++++++++++++++ .../views/settings/EventIndexPanel.js | 93 ++----- src/i18n/strings/en_EN.json | 25 +- 3 files changed, 259 insertions(+), 85 deletions(-) create mode 100644 src/async-components/views/dialogs/eventindex/ManageEventIndex.js diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js new file mode 100644 index 0000000000..23aa61c33a --- /dev/null +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js @@ -0,0 +1,226 @@ +/* +Copyright 2020 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 React from 'react'; +import * as sdk from '../../../../index'; +import {MatrixClientPeg} from '../../../../MatrixClientPeg'; +import PropTypes from 'prop-types'; +import { _t } from '../../../../languageHandler'; + +import SettingsStore, {SettingLevel} from "../../../../settings/SettingsStore"; +import LabelledToggleSwitch from "../../../../components/views/elements/LabelledToggleSwitch"; +import Field from "../../../../components/views/elements/Field"; +import {formatBytes} from "../../../../utils/FormattingUtils"; +import EventIndexPeg from "../../../../indexing/EventIndexPeg"; +import AccessibleButton from "../../../../components/views/elements/AccessibleButton"; + + +/* + * Walks the user through the process of creating an e2e key backup + * on the server. + */ +export default class ManageEventIndex extends React.Component { + static propTypes = { + onFinished: PropTypes.func.isRequired, + } + + constructor(props) { + super(props); + + this.state = { + eventIndexSize: 0, + crawlingRooms: 0, + totalCrawlingRooms: 0, + eventCount: 0, + roomCount: 0, + currentRoom: null, + eventIndexingEnabled: + SettingsStore.getValueAt(SettingLevel.DEVICE, 'enableCrawling'), + crawlerSleepTime: + SettingsStore.getValueAt(SettingLevel.DEVICE, 'crawlerSleepTime'), + }; + + } + + async updateCurrentRoom(room) { + const eventIndex = EventIndexPeg.get(); + const stats = await eventIndex.getStats(); + let currentRoom = null; + + if (room) currentRoom = room.name; + + this.setState({ + eventIndexSize: stats.size, + roomCount: stats.roomCount, + eventCount: stats.eventCount, + currentRoom: currentRoom, + }); + } + + componentWillUnmount(): void { + const eventIndex = EventIndexPeg.get(); + + if (eventIndex !== null) { + eventIndex.removeListener("changedCheckpoint", this.updateCurrentRoom.bind(this)); + } + } + + async componentWillMount(): void { + let eventIndexSize = 0; + let roomCount = 0; + let eventCount = 0; + let crawlingRooms = 0; + let totalCrawlingRooms = 0; + let currentRoom = null; + + const eventIndex = EventIndexPeg.get(); + + if (eventIndex !== null) { + eventIndex.on("changedCheckpoint", this.updateCurrentRoom.bind(this)); + + const stats = await eventIndex.getStats(); + eventIndexSize = stats.size; + roomCount = stats.roomCount; + eventCount = stats.eventCount; + + const crawledRooms = eventIndex.currentlyCrawledRooms(); + crawlingRooms = crawledRooms.crawlingRooms.size; + totalCrawlingRooms = crawledRooms.totalRooms.size; + + const room = eventIndex.currentRoom(); + if (room) currentRoom = room.name; + } + + this.setState({ + eventIndexSize, + crawlingRooms, + totalCrawlingRooms, + eventCount, + roomCount, + currentRoom, + }); + } + + _onEventIndexingEnabledChange = (checked) => { + SettingsStore.setValue("enableCrawling", null, SettingLevel.DEVICE, checked); + + if (checked) EventIndexPeg.start(); + else EventIndexPeg.stop(); + + this.setState({eventIndexingEnabled: checked}); + } + + _onCrawlerSleepTimeChange = (e) => { + this.setState({crawlerSleepTime: e.target.value}); + SettingsStore.setValue("crawlerSleepTime", null, SettingLevel.DEVICE, e.target.value); + } + + _onDisable = () => { + this.props.onFinished(false); + } + + _onDone = () => { + this.props.onFinished(true); + } + + render() { + let eventIndexingSettings = null; + let crawlerState; + + if (!this.state.eventIndexingEnabled) { + crawlerState =
{_t("Message search for encrypted rooms is disabled.")}
; + } else if (this.state.currentRoom === null) { + crawlerState =
{_t("Not downloading messages for any room.")}
; + } else { + crawlerState = ( +
{_t( + "Downloading mesages for %(currentRoom)s.", + { currentRoom: this.state.currentRoom } + )} +
+ ); + } + + if (EventIndexPeg.get() !== null) { + eventIndexingSettings = ( +
+ { + _t( "Riot is securely caching encrypted messages locally for them " + + "to appear in search results:" + ) + } +
+ {_t("Space used:")} {formatBytes(this.state.eventIndexSize, 0)}
+ {_t("Indexed messages:")} {this.state.eventCount}
+ {_t("Number of rooms:")} {this.state.roomCount}
+ {crawlerState}
+
+ + + + +
+ ); + } else { + eventIndexingSettings = ( +
+ { + _t( "Riot can't securely cache encrypted messages locally" + + "while running in a web browser. Use Riot Desktop for" + + "encrypted messages to appear in search results." + ) + } +
+ ); + } + + const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); + let buttons; + + buttons =
+
+ + {_t("Disable")} + + + {_t("Done")} + +
+
; + + return ( + {}} + title={_t("Message search")} + > +
+ {eventIndexingSettings} +
+
+ {buttons} +
+
+ ); + } +} diff --git a/src/components/views/settings/EventIndexPanel.js b/src/components/views/settings/EventIndexPanel.js index 5b8029a09a..fd3facbc6b 100644 --- a/src/components/views/settings/EventIndexPanel.js +++ b/src/components/views/settings/EventIndexPanel.js @@ -21,6 +21,7 @@ import classNames from 'classnames'; import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; import Modal from '../../../Modal'; +import AccessibleButton from "../elements/AccessibleButton"; import SettingsStore, {SettingLevel} from "../../../settings/SettingsStore"; import LabelledToggleSwitch from "../elements/LabelledToggleSwitch"; import Field from "../elements/Field"; @@ -33,30 +34,17 @@ export default class EventIndexPanel extends React.Component { this.state = { eventIndexSize: 0, - crawlingRooms: 0, - totalCrawlingRooms: 0, - eventCount: 0, roomCount: 0, - currentRoom: null, - eventIndexingEnabled: - SettingsStore.getValueAt(SettingLevel.DEVICE, 'enableCrawling'), - crawlerSleepTime: - SettingsStore.getValueAt(SettingLevel.DEVICE, 'crawlerSleepTime'), }; } async updateCurrentRoom(room) { const eventIndex = EventIndexPeg.get(); const stats = await eventIndex.getStats(); - let currentRoom = null; - - if (room) currentRoom = room.name; this.setState({ eventIndexSize: stats.size, roomCount: stats.roomCount, - eventCount: stats.eventCount, - currentRoom: currentRoom, }); } @@ -71,10 +59,6 @@ export default class EventIndexPanel extends React.Component { async componentWillMount(): void { let eventIndexSize = 0; let roomCount = 0; - let eventCount = 0; - let crawlingRooms = 0; - let totalCrawlingRooms = 0; - let currentRoom = null; const eventIndex = EventIndexPeg.get(); @@ -84,84 +68,41 @@ export default class EventIndexPanel extends React.Component { const stats = await eventIndex.getStats(); eventIndexSize = stats.size; roomCount = stats.roomCount; - eventCount = stats.eventCount; - - const crawledRooms = eventIndex.currentlyCrawledRooms(); - crawlingRooms = crawledRooms.crawlingRooms.size; - totalCrawlingRooms = crawledRooms.totalRooms.size; - - const room = eventIndex.currentRoom(); - if (room) currentRoom = room.name; } this.setState({ eventIndexSize, - crawlingRooms, - totalCrawlingRooms, - eventCount, roomCount, - currentRoom, }); } - _onEventIndexingEnabledChange = (checked) => { - SettingsStore.setValue("enableCrawling", null, SettingLevel.DEVICE, checked); + _onManage = async () => { + Modal.createTrackedDialogAsync('Message search', 'Message search', + import('../../../async-components/views/dialogs/eventindex/ManageEventIndex'), + { + onFinished: () => {}, + }, null, /* priority = */ false, /* static = */ true, + ); - if (checked) EventIndexPeg.start(); - else EventIndexPeg.stop(); - - this.setState({eventIndexingEnabled: checked}); - } - - _onCrawlerSleepTimeChange = (e) => { - this.setState({crawlerSleepTime: e.target.value}); - SettingsStore.setValue("crawlerSleepTime", null, SettingLevel.DEVICE, e.target.value); } render() { let eventIndexingSettings = null; - let crawlerState; - - if (!this.state.eventIndexingEnabled) { - crawlerState =
{_t("Message search for encrypted rooms is disabled.")}
; - } else if (this.state.currentRoom === null) { - crawlerState =
{_t("Not downloading messages for any room.")}
; - } else { - crawlerState = ( -
{_t( - "Downloading mesages for %(currentRoom)s.", - { currentRoom: this.state.currentRoom } - )} -
- ); - } if (EventIndexPeg.get() !== null) { eventIndexingSettings = (
- { - _t( "Riot is securely caching encrypted messages locally for them" + - "to appear in search results:" - ) - }
- {_t("Space used:")} {formatBytes(this.state.eventIndexSize, 0)}
- {_t("Indexed messages:")} {this.state.eventCount}
- {_t("Number of rooms:")} {this.state.roomCount}
- {crawlerState}
+ {_t( "Securely cache encrypted messages locally for them " + + "to appear in search results, using ") + } {formatBytes(this.state.eventIndexSize, 0)} + {_t( " to store messages from ")} {this.state.roomCount} {_t("rooms.")} +
+
+ + {_t("Manage")} +
- - - -
); } else { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index f78e3594ee..6b1eda0b0c 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -554,15 +554,10 @@ "Failed to set display name": "Failed to set display name", "Disable Notifications": "Disable Notifications", "Enable Notifications": "Enable Notifications", - "Message search for encrypted rooms is disabled.": "Message search for encrypted rooms is disabled.", - "Not downloading messages for any room.": "Not downloading messages for any room.", - "Downloading mesages for %(currentRoom)s.": "Downloading mesages for %(currentRoom)s.", - "Riot is securely caching encrypted messages locally for themto appear in search results:": "Riot is securely caching encrypted messages locally for themto appear in search results:", - "Space used:": "Space used:", - "Indexed messages:": "Indexed messages:", - "Number of rooms:": "Number of rooms:", - "Download and index encrypted messages": "Download and index encrypted messages", - "Message downloading sleep time(ms)": "Message downloading sleep time(ms)", + "Securely cache encrypted messages locally for them to appear in search results, using ": "Securely cache encrypted messages locally for them to appear in search results, using ", + " to store messages from ": " to store messages from ", + "rooms.": "rooms.", + "Manage": "Manage", "Riot can't securely cache encrypted messages locallywhile running in a web browser. Use Riot Desktop forencrypted messages to appear in search results.": "Riot can't securely cache encrypted messages locallywhile running in a web browser. Use Riot Desktop forencrypted messages to appear in search results.", "Connecting to integration manager...": "Connecting to integration manager...", "Cannot connect to integration manager": "Cannot connect to integration manager", @@ -2040,6 +2035,18 @@ "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "This device has detected that your recovery passphrase and key for Secure Messages have been removed.", "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.", + "Message search for encrypted rooms is disabled.": "Message search for encrypted rooms is disabled.", + "Not downloading messages for any room.": "Not downloading messages for any room.", + "Downloading mesages for %(currentRoom)s.": "Downloading mesages for %(currentRoom)s.", + "Riot is securely caching encrypted messages locally for them to appear in search results:": "Riot is securely caching encrypted messages locally for them to appear in search results:", + "Space used:": "Space used:", + "Indexed messages:": "Indexed messages:", + "Number of rooms:": "Number of rooms:", + "Download and index encrypted messages": "Download and index encrypted messages", + "Message downloading sleep time(ms)": "Message downloading sleep time(ms)", + "Disable or enable": "Disable or enable", + "Disable": "Disable", + "Message search": "Message search", "Failed to set direct chat tag": "Failed to set direct chat tag", "Failed to remove tag %(tagName)s from room": "Failed to remove tag %(tagName)s from room", "Failed to add tag %(tagName)s to room": "Failed to add tag %(tagName)s to room" From 8e26268079ca83954a78336859b679bb0937b533 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 21 Jan 2020 13:38:20 +0100 Subject: [PATCH 066/906] SecurityUserSettingsTab: Rename encrypted search section. --- .../views/settings/tabs/user/SecurityUserSettingsTab.js | 2 +- src/i18n/strings/en_EN.json | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js b/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js index 8ef9983efd..7b22dd15e2 100644 --- a/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js @@ -256,7 +256,7 @@ export default class SecurityUserSettingsTab extends React.Component { const eventIndex = (
- {_t("Encrypted search")} + {_t("Message search")}
); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 6b1eda0b0c..b2ac55ba04 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -754,7 +754,7 @@ "Accept all %(invitedRooms)s invites": "Accept all %(invitedRooms)s invites", "Reject all %(invitedRooms)s invites": "Reject all %(invitedRooms)s invites", "Key backup": "Key backup", - "Encrypted search": "Encrypted search", + "Message search": "Message search", "Cross-signing": "Cross-signing", "Security & Privacy": "Security & Privacy", "Devices": "Devices", @@ -2044,9 +2044,7 @@ "Number of rooms:": "Number of rooms:", "Download and index encrypted messages": "Download and index encrypted messages", "Message downloading sleep time(ms)": "Message downloading sleep time(ms)", - "Disable or enable": "Disable or enable", "Disable": "Disable", - "Message search": "Message search", "Failed to set direct chat tag": "Failed to set direct chat tag", "Failed to remove tag %(tagName)s from room": "Failed to remove tag %(tagName)s from room", "Failed to add tag %(tagName)s to room": "Failed to add tag %(tagName)s to room" From c8a2f6a5a0133a55f324adfcb11fc25af53e6cab Mon Sep 17 00:00:00 2001 From: Zoe Date: Tue, 21 Jan 2020 13:33:16 +0000 Subject: [PATCH 067/906] Move room header shields over the avatar for the room Currently this is calibrated like the lil' DM icon is --- res/css/views/rooms/_RoomHeader.scss | 6 +++++- src/components/views/rooms/RoomHeader.js | 3 +-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/res/css/views/rooms/_RoomHeader.scss b/res/css/views/rooms/_RoomHeader.scss index 45b9733faa..0d92247735 100644 --- a/res/css/views/rooms/_RoomHeader.scss +++ b/res/css/views/rooms/_RoomHeader.scss @@ -19,7 +19,10 @@ limitations under the License. border-bottom: 1px solid $primary-hairline-color; .mx_E2EIcon { - margin: 0 5px; + margin: 0; + position: absolute; + bottom: 0; + right: -5px; } } @@ -171,6 +174,7 @@ limitations under the License. width: 28px; height: 28px; margin: 0 7px; + position: relative; } .mx_RoomHeader_avatar .mx_BaseAvatar_image { diff --git a/src/components/views/rooms/RoomHeader.js b/src/components/views/rooms/RoomHeader.js index 09f3fd489f..15f0daa200 100644 --- a/src/components/views/rooms/RoomHeader.js +++ b/src/components/views/rooms/RoomHeader.js @@ -310,8 +310,7 @@ export default createReactClass({ return (
-
{ roomAvatar }
- { e2eIcon } +
{ roomAvatar }{ e2eIcon }
{ privateIcon } { name } { topicElement } From a0599dedf0b39e66c3ee49f4e772e3380667cd10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 21 Jan 2020 15:45:29 +0100 Subject: [PATCH 068/906] EventIndex: Use the newly exposed TimelineWindow methods. --- src/indexing/EventIndex.js | 29 +++-------------------------- 1 file changed, 3 insertions(+), 26 deletions(-) diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index cb77d92c27..c081440233 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -494,35 +494,12 @@ export default class EventIndex { } paginateTimelineWindow(room, timelineWindow, direction, limit) { - let tl; - - // TODO this is from the js-sdk, this should probably be exposed to - // us through the js-sdk. - const moveWindowCap = (titmelineWindow, timeline, direction, limit) => { - const count = (direction === EventTimeline.BACKWARDS) ? - timeline.retreat(limit) : timeline.advance(limit); - - if (count) { - timelineWindow._eventCount += count; - const excess = timelineWindow._eventCount - timelineWindow._windowLimit; - - if (excess > 0) { - timelineWindow.unpaginate(3, direction !== EventTimeline.BACKWARDS); - } - return true; - } - - return false; - }; - - // TODO these private fields should be somehow exposed in the js-sdk. - if (direction == EventTimeline.BACKWARDS) tl = timelineWindow._start; - else if (direction == EventTimeline.FORWARDS) tl = timelineWindow._end; + const tl = timelineWindow.getTimelineIndex(direction); if (!tl) return Promise.resolve(false); if (tl.pendingPaginate) return tl.pendingPaginate; - if (moveWindowCap(timelineWindow, tl, direction, limit)) { + if (timelineWindow.extend(direction, limit)) { return Promise.resolve(true); } @@ -532,8 +509,8 @@ export default class EventIndex { const ret = await this.populateFileTimeline(timelineSet, timeline.timeline, room, limit, token, direction); - moveWindowCap(timelineWindow, timeline, direction, limit); timeline.pendingPaginate = null; + timelineWindow.extend(direction, limit); return ret; }; From 9c0cf326c1992d4d641c46509cd4534504e656d3 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Tue, 21 Jan 2020 15:12:59 +0000 Subject: [PATCH 069/906] Only show devices and verify actions in E2EE rooms This changes logic to only show the devices list and verify button in E2EE rooms, matching the design. Fixes https://github.com/vector-im/riot-web/issues/11839 --- src/components/views/right_panel/UserInfo.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index a0819be472..b08f07ace4 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -1308,15 +1308,18 @@ const UserInfo = ({user, groupId, roomId, onClose}) => { userTrust.isVerified(); const isMe = user.userId === cli.getUserId(); let verifyButton; - if (!userVerified && !isMe) { + if (isRoomEncrypted && !userVerified && !isMe) { verifyButton = verifyUser(user)}> {_t("Verify")} ; } - const devicesSection = ; + let devicesSection; + if (isRoomEncrypted) { + devicesSection = ; + } const securitySection = (
From 790d2c147203ca390804dbfa8ed14120416ab969 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Tue, 21 Jan 2020 15:30:01 +0000 Subject: [PATCH 070/906] Fix toast icon to prevent clipping This fixes the bottom and right edges of the toast icon, which were getting clipped away. Fixes https://github.com/vector-im/riot-web/issues/11915 --- res/css/structures/_ToastContainer.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/css/structures/_ToastContainer.scss b/res/css/structures/_ToastContainer.scss index 5634a97c53..5b5c49f357 100644 --- a/res/css/structures/_ToastContainer.scss +++ b/res/css/structures/_ToastContainer.scss @@ -51,8 +51,8 @@ limitations under the License. &.mx_Toast_hasIcon { &::after { content: ""; - width: 21px; - height: 20px; + width: 22px; + height: 22px; grid-column: 1; grid-row: 1; mask-size: 100%; From b2aba6db352027c6f7d5db0256e3483eb5a6aded Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 21 Jan 2020 15:32:32 +0000 Subject: [PATCH 071/906] Initial attempt to make toggleInlineFormat paragraph-aware --- src/editor/deserialize.js | 2 +- src/editor/operations.js | 70 +++++++++++---- test/editor/mock.js | 10 +++ test/editor/operations-test.js | 154 +++++++++++++++++++++++++++++++++ test/editor/range-test.js | 12 +-- 5 files changed, 221 insertions(+), 27 deletions(-) create mode 100644 test/editor/operations-test.js diff --git a/src/editor/deserialize.js b/src/editor/deserialize.js index 1fdbf9490c..7ba4c3eda3 100644 --- a/src/editor/deserialize.js +++ b/src/editor/deserialize.js @@ -250,7 +250,7 @@ function parseHtmlMessage(html, partCreator, isQuotedMessage) { } export function parsePlainTextMessage(body, partCreator, isQuotedMessage) { - const lines = body.split("\n"); + const lines = body.split(/\r\n|\r|\n/g); // split on any new-line combination not just \n const parts = lines.reduce((parts, line, i) => { if (isQuotedMessage) { parts.push(partCreator.plain(QUOTE_LINE_PREFIX)); diff --git a/src/editor/operations.js b/src/editor/operations.js index e2661faf59..6bae60e6b8 100644 --- a/src/editor/operations.js +++ b/src/editor/operations.js @@ -104,23 +104,63 @@ export function toggleInlineFormat(range, prefix, suffix = prefix) { const {model, parts} = range; const {partCreator} = model; - const isFormatted = parts.length && - parts[0].text.startsWith(prefix) && - parts[parts.length - 1].text.endsWith(suffix); + // compute paragraph [start, end] indexes + const paragraphIndexes = []; + let startIndex = 0; + // let seenNewlines = 0; + for (let i = 2; i < parts.length; i++) { + // paragraph breaks can be denoted in a multitude of ways, + // - 2 newline parts in sequence + // - newline part, plain(), newline part - if (isFormatted) { - // remove prefix and suffix - const partWithoutPrefix = parts[0].serialize(); - partWithoutPrefix.text = partWithoutPrefix.text.substr(prefix.length); - parts[0] = partCreator.deserializePart(partWithoutPrefix); + const isBlank = part => !part.text || !/\S/.test(part.text); + const isNL = part => part.type === "newline"; - const partWithoutSuffix = parts[parts.length - 1].serialize(); - const suffixPartText = partWithoutSuffix.text; - partWithoutSuffix.text = suffixPartText.substring(0, suffixPartText.length - suffix.length); - parts[parts.length - 1] = partCreator.deserializePart(partWithoutSuffix); - } else { - parts.unshift(partCreator.plain(prefix)); - parts.push(partCreator.plain(suffix)); + // bump startIndex onto the first non-blank after the paragraph ending + if (isBlank(parts[i - 2]) && isNL(parts[i - 1]) && !isNL(parts[i]) && !isBlank(parts[i])) { + startIndex = i; + } + + if (isNL(parts[i - 1]) && isNL(parts[i])) { + paragraphIndexes.push([startIndex, i - 1]); + startIndex = i + 1; + } else if (isNL(parts[i - 2]) && isBlank(parts[i - 1]) && isNL(parts[i])) { + paragraphIndexes.push([startIndex, i - 2]); + startIndex = i + 1; + } } + if (startIndex < parts.length) { + // TODO don't use parts.length here to clean up any trailing cruft + paragraphIndexes.push([startIndex, parts.length]); + } + + // keep track of how many things we have inserted as an offset:=0 + let offset = 0; + paragraphIndexes.forEach(([startIndex, endIndex]) => { + // for each paragraph apply the same rule + const base = startIndex + offset; + const index = endIndex + offset; + + const isFormatted = (index - base > 0) && + parts[base].text.startsWith(prefix) && + parts[index - 1].text.endsWith(suffix); + + if (isFormatted) { + // remove prefix and suffix + const partWithoutPrefix = parts[base].serialize(); + partWithoutPrefix.text = partWithoutPrefix.text.substr(prefix.length); + parts[base] = partCreator.deserializePart(partWithoutPrefix); + + const partWithoutSuffix = parts[index - 1].serialize(); + const suffixPartText = partWithoutSuffix.text; + partWithoutSuffix.text = suffixPartText.substring(0, suffixPartText.length - suffix.length); + parts[index - 1] = partCreator.deserializePart(partWithoutSuffix); + } else { + parts.splice(index, 0, partCreator.plain(suffix)); // splice in the later one first to not change offset + parts.splice(base, 0, partCreator.plain(prefix)); + offset += 2; // offset index to account for the two items we just spliced in + } + }); + replaceRangeAndExpandSelection(range, parts); } diff --git a/test/editor/mock.js b/test/editor/mock.js index bb1a51d14b..6de65cf23d 100644 --- a/test/editor/mock.js +++ b/test/editor/mock.js @@ -67,3 +67,13 @@ export function createPartCreator(completions = []) { }; return new PartCreator(new MockRoom(), new MockClient(), autoCompleteCreator); } + +export function createRenderer() { + const render = (c) => { + render.caret = c; + render.count += 1; + }; + render.count = 0; + render.caret = null; + return render; +} diff --git a/test/editor/operations-test.js b/test/editor/operations-test.js new file mode 100644 index 0000000000..591166759c --- /dev/null +++ b/test/editor/operations-test.js @@ -0,0 +1,154 @@ +/* +Copyright 2020 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 {getLineAndNodePosition} from "../../src/editor/caret"; +import EditorModel from "../../src/editor/model"; +import {createPartCreator, createRenderer} from "./mock"; +import {toggleInlineFormat} from "../../src/editor/operations"; + +describe('editor/operations: formatting operations', () => { + describe('toggleInlineFormat', () => { + it('works for words', () => { + const renderer = createRenderer(); + const pc = createPartCreator(); + const model = new EditorModel([ + pc.plain("hello world!"), + ], pc, renderer); + + const range = model.startRange(model.positionForOffset(6, false), + model.positionForOffset(11, false)); // around "world" + + expect(range.parts[0].text).toBe("world"); + expect(model.serializeParts()).toEqual([{"text": "hello world!", "type": "plain"}]); + toggleInlineFormat(range, "_"); + expect(model.serializeParts()).toEqual([{"text": "hello _world_!", "type": "plain"}]); + }); + + it('works for parts of words', () => { + const renderer = createRenderer(); + const pc = createPartCreator(); + const model = new EditorModel([ + pc.plain("hello world!"), + ], pc, renderer); + + const range = model.startRange(model.positionForOffset(7, false), + model.positionForOffset(10, false)); // around "orl" + + expect(range.parts[0].text).toBe("orl"); + expect(model.serializeParts()).toEqual([{"text": "hello world!", "type": "plain"}]); + toggleInlineFormat(range, "*"); + expect(model.serializeParts()).toEqual([{"text": "hello w*orl*d!", "type": "plain"}]); + }); + + it('works for around pills', () => { + const renderer = createRenderer(); + const pc = createPartCreator(); + const model = new EditorModel([ + pc.plain("hello there "), + pc.atRoomPill("@room"), + pc.plain(", how are you doing?"), + ], pc, renderer); + + const range = model.startRange(model.positionForOffset(6, false), + model.positionForOffset(30, false)); // around "there @room, how are you" + + expect(range.parts.map(p => p.text).join("")).toBe("there @room, how are you"); + expect(model.serializeParts()).toEqual([ + {"text": "hello there ", "type": "plain"}, + {"text": "@room", "type": "at-room-pill"}, + {"text": ", how are you doing?", "type": "plain"}, + ]); + toggleInlineFormat(range, "_"); + expect(model.serializeParts()).toEqual([ + {"text": "hello _there ", "type": "plain"}, + {"text": "@room", "type": "at-room-pill"}, + {"text": ", how are you_ doing?", "type": "plain"}, + ]); + }); + + it('works for a paragraph', () => { + const renderer = createRenderer(); + const pc = createPartCreator(); + const model = new EditorModel([ + pc.plain("hello world,"), + pc.newline(), + pc.plain("how are you doing?"), + ], pc, renderer); + + const range = model.startRange(model.positionForOffset(6, false), + model.positionForOffset(16, false)); // around "world,\nhow" + + expect(range.parts.map(p => p.text).join("")).toBe("world,\nhow"); + expect(model.serializeParts()).toEqual([ + {"text": "hello world,", "type": "plain"}, + {"text": "\n", "type": "newline"}, + {"text": "how are you doing?", "type": "plain"}, + ]); + toggleInlineFormat(range, "**"); + expect(model.serializeParts()).toEqual([ + {"text": "hello **world,", "type": "plain"}, + {"text": "\n", "type": "newline"}, + {"text": "how** are you doing?", "type": "plain"}, + ]); + }); + + it('works for multiple paragraph', () => { + const renderer = createRenderer(); + const pc = createPartCreator(); + const model = new EditorModel([ + pc.plain("hello world,"), + pc.newline(), + pc.plain("how are you doing?"), + pc.newline(), + pc.newline(), + pc.plain("new paragraph"), + ], pc, renderer); + + let range = model.startRange(model.positionForOffset(0, true), + model.getPositionAtEnd()); // select-all + + expect(model.serializeParts()).toEqual([ + {"text": "hello world,", "type": "plain"}, + {"text": "\n", "type": "newline"}, + {"text": "how are you doing?", "type": "plain"}, + {"text": "\n", "type": "newline"}, + {"text": "\n", "type": "newline"}, + {"text": "new paragraph", "type": "plain"}, + ]); + toggleInlineFormat(range, "__"); + expect(model.serializeParts()).toEqual([ + {"text": "__hello world,", "type": "plain"}, + {"text": "\n", "type": "newline"}, + {"text": "how are you doing?__", "type": "plain"}, + {"text": "\n", "type": "newline"}, + {"text": "\n", "type": "newline"}, + {"text": "__new paragraph__", "type": "plain"}, + ]); + range = model.startRange(model.positionForOffset(0, true), + model.getPositionAtEnd()); // select-all + console.log("RANGE", range.parts); + toggleInlineFormat(range, "__"); + expect(model.serializeParts()).toEqual([ + {"text": "hello world,", "type": "plain"}, + {"text": "\n", "type": "newline"}, + {"text": "how are you doing?", "type": "plain"}, + {"text": "\n", "type": "newline"}, + {"text": "\n", "type": "newline"}, + {"text": "new paragraph", "type": "plain"}, + ]); + }); + }); +}); diff --git a/test/editor/range-test.js b/test/editor/range-test.js index 53fb6cb765..b69ed9eb53 100644 --- a/test/editor/range-test.js +++ b/test/editor/range-test.js @@ -15,17 +15,7 @@ limitations under the License. */ import EditorModel from "../../src/editor/model"; -import {createPartCreator} from "./mock"; - -function createRenderer() { - const render = (c) => { - render.caret = c; - render.count += 1; - }; - render.count = 0; - render.caret = null; - return render; -} +import {createPartCreator, createRenderer} from "./mock"; const pillChannel = "#riot-dev:matrix.org"; From 9a530a72f6d27dd67d338533fe3823c880d7ff77 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 21 Jan 2020 15:36:25 +0000 Subject: [PATCH 072/906] delint --- test/editor/operations-test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/editor/operations-test.js b/test/editor/operations-test.js index 591166759c..872cc78bdb 100644 --- a/test/editor/operations-test.js +++ b/test/editor/operations-test.js @@ -14,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {getLineAndNodePosition} from "../../src/editor/caret"; import EditorModel from "../../src/editor/model"; import {createPartCreator, createRenderer} from "./mock"; import {toggleInlineFormat} from "../../src/editor/operations"; From a2892f5b02a8998a7d19985b59f65d246d99c99f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 21 Jan 2020 16:40:32 +0100 Subject: [PATCH 073/906] EventIndex: Fix some lint issues. --- src/components/views/settings/EventIndexPanel.js | 9 +-------- .../settings/tabs/user/PreferencesUserSettingsTab.js | 1 - src/indexing/EventIndex.js | 4 ++-- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/src/components/views/settings/EventIndexPanel.js b/src/components/views/settings/EventIndexPanel.js index fd3facbc6b..8ed4b114e7 100644 --- a/src/components/views/settings/EventIndexPanel.js +++ b/src/components/views/settings/EventIndexPanel.js @@ -15,16 +15,10 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; -import classNames from 'classnames'; -import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; import Modal from '../../../Modal'; import AccessibleButton from "../elements/AccessibleButton"; -import SettingsStore, {SettingLevel} from "../../../settings/SettingsStore"; -import LabelledToggleSwitch from "../elements/LabelledToggleSwitch"; -import Field from "../elements/Field"; import {formatBytes} from "../../../utils/FormattingUtils"; import EventIndexPeg from "../../../indexing/EventIndexPeg"; @@ -83,7 +77,6 @@ export default class EventIndexPanel extends React.Component { onFinished: () => {}, }, null, /* priority = */ false, /* static = */ true, ); - } render() { @@ -111,7 +104,7 @@ export default class EventIndexPanel extends React.Component { { _t( "Riot can't securely cache encrypted messages locally" + "while running in a web browser. Use Riot Desktop for" + - "encrypted messages to appear in search results." + "encrypted messages to appear in search results.", ) }
diff --git a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js index 8cbaba037d..bd1b7c2ca4 100644 --- a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js @@ -23,7 +23,6 @@ import SettingsStore from "../../../../../settings/SettingsStore"; import Field from "../../../elements/Field"; import * as sdk from "../../../../.."; import PlatformPeg from "../../../../../PlatformPeg"; -import {formatBytes} from "../../../../../utils/FormattingUtils"; export default class PreferencesUserSettingsTab extends React.Component { static COMPOSER_SETTINGS = [ diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 5676636eed..435f67447d 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -470,8 +470,8 @@ export default class EventIndex { /** * Get the room that we are currently crawling. * - * @returns A MatrixRoom that is being currently crawled, null if no room is - * currently being crawled. + * @returns {Room} A MatrixRoom that is being currently crawled, null + * if no room is currently being crawled. */ currentRoom() { if (this._currentCheckpoint === null && this.crawlerCheckpoints.length === 0) { From b5e902e1f2f8f3a00fea93adeb7985db3ba13b23 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 21 Jan 2020 15:55:21 +0000 Subject: [PATCH 074/906] Fix escaping commands using double-slash //, e.g //plain sends `/plain` --- src/components/views/rooms/SendMessageComposer.js | 9 +++++++-- src/editor/serialize.js | 12 ++++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/components/views/rooms/SendMessageComposer.js b/src/components/views/rooms/SendMessageComposer.js index c11d940331..c4ae2929af 100644 --- a/src/components/views/rooms/SendMessageComposer.js +++ b/src/components/views/rooms/SendMessageComposer.js @@ -24,6 +24,8 @@ import { containsEmote, stripEmoteCommand, unescapeMessage, + startsWith, + stripPrefix, } from '../../../editor/serialize'; import {CommandPartCreator} from '../../../editor/parts'; import BasicMessageComposer from "./BasicMessageComposer"; @@ -61,6 +63,9 @@ function createMessageContent(model, permalinkCreator) { if (isEmote) { model = stripEmoteCommand(model); } + if (startsWith(model, "//")) { + model = stripPrefix(model, "/"); + } model = unescapeMessage(model); const repliedToEvent = RoomViewStore.getQuotingEvent(); @@ -175,13 +180,13 @@ export default class SendMessageComposer extends React.Component { const parts = this.model.parts; const firstPart = parts[0]; if (firstPart) { - if (firstPart.type === "command") { + if (firstPart.type === "command" && !firstPart.text.startsWith("//")) { return true; } // be extra resilient when somehow the AutocompleteWrapperModel or // CommandPartCreator fails to insert a command part, so we don't send // a command as a message - if (firstPart.text.startsWith("/") && (firstPart.type === "plain" || firstPart.type === "pill-candidate")) { + if (firstPart.text.startsWith("/") && !firstPart.text.startsWith("//") && (firstPart.type === "plain" || firstPart.type === "pill-candidate")) { return true; } } diff --git a/src/editor/serialize.js b/src/editor/serialize.js index a55eed97da..ba380f2809 100644 --- a/src/editor/serialize.js +++ b/src/editor/serialize.js @@ -61,18 +61,26 @@ export function textSerialize(model) { } export function containsEmote(model) { + return startsWith(model, "/me "); +} + +export function startsWith(model, prefix) { const firstPart = model.parts[0]; // part type will be "plain" while editing, // and "command" while composing a message. return firstPart && (firstPart.type === "plain" || firstPart.type === "command") && - firstPart.text.startsWith("/me "); + firstPart.text.startsWith(prefix); } export function stripEmoteCommand(model) { // trim "/me " + return stripPrefix(model, "/me "); +} + +export function stripPrefix(model, prefix) { model = model.clone(); - model.removeText({index: 0, offset: 0}, 4); + model.removeText({index: 0, offset: 0}, prefix.length); return model; } From 47ea453abfbd6ac5ce7f4e474d84eb7c8a3d4083 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 21 Jan 2020 16:58:41 +0100 Subject: [PATCH 075/906] ManageEventIndex: Fix a couple of lint issues. --- .../views/dialogs/eventindex/ManageEventIndex.js | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js index 23aa61c33a..8623856b2e 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js @@ -16,7 +16,6 @@ limitations under the License. import React from 'react'; import * as sdk from '../../../../index'; -import {MatrixClientPeg} from '../../../../MatrixClientPeg'; import PropTypes from 'prop-types'; import { _t } from '../../../../languageHandler'; @@ -52,7 +51,6 @@ export default class ManageEventIndex extends React.Component { crawlerSleepTime: SettingsStore.getValueAt(SettingLevel.DEVICE, 'crawlerSleepTime'), }; - } async updateCurrentRoom(room) { @@ -146,10 +144,8 @@ export default class ManageEventIndex extends React.Component { crawlerState =
{_t("Not downloading messages for any room.")}
; } else { crawlerState = ( -
{_t( - "Downloading mesages for %(currentRoom)s.", - { currentRoom: this.state.currentRoom } - )} +
+ {_t("Downloading mesages for %(currentRoom)s.", { currentRoom: this.state.currentRoom })}
); } @@ -159,7 +155,7 @@ export default class ManageEventIndex extends React.Component {
{ _t( "Riot is securely caching encrypted messages locally for them " + - "to appear in search results:" + "to appear in search results:", ) }
@@ -188,7 +184,7 @@ export default class ManageEventIndex extends React.Component { { _t( "Riot can't securely cache encrypted messages locally" + "while running in a web browser. Use Riot Desktop for" + - "encrypted messages to appear in search results." + "encrypted messages to appear in search results.", ) }
@@ -196,9 +192,7 @@ export default class ManageEventIndex extends React.Component { } const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); - let buttons; - - buttons =
+ const buttons =
{_t("Disable")} From 060938379a7183f7959aa4af436eef775ce6c9d3 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 21 Jan 2020 15:58:51 +0000 Subject: [PATCH 076/906] Fix changes after typing / at pos=0 allowing to cancel command --- src/components/views/rooms/SendMessageComposer.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/views/rooms/SendMessageComposer.js b/src/components/views/rooms/SendMessageComposer.js index c4ae2929af..8de105d84d 100644 --- a/src/components/views/rooms/SendMessageComposer.js +++ b/src/components/views/rooms/SendMessageComposer.js @@ -180,13 +180,14 @@ export default class SendMessageComposer extends React.Component { const parts = this.model.parts; const firstPart = parts[0]; if (firstPart) { - if (firstPart.type === "command" && !firstPart.text.startsWith("//")) { + if (firstPart.type === "command" && firstPart.text.startsWith("/") && !firstPart.text.startsWith("//")) { return true; } // be extra resilient when somehow the AutocompleteWrapperModel or // CommandPartCreator fails to insert a command part, so we don't send // a command as a message - if (firstPart.text.startsWith("/") && !firstPart.text.startsWith("//") && (firstPart.type === "plain" || firstPart.type === "pill-candidate")) { + if (firstPart.text.startsWith("/") && firstPart.text.startsWith("//") && !firstPart.text.startsWith("//") + && (firstPart.type === "plain" || firstPart.type === "pill-candidate")) { return true; } } From b34fe45518fbfff23f92a860a7af653fc383180b Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 21 Jan 2020 16:50:04 +0000 Subject: [PATCH 077/906] First attempt. Has a lag issue due to the async-clear :( --- src/SlashCommands.js | 13 +++---- .../views/rooms/SendMessageComposer.js | 39 +++++++++++++++++-- src/i18n/strings/en_EN.json | 4 +- 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/src/SlashCommands.js b/src/SlashCommands.js index 20b8ba76da..414dd60121 100644 --- a/src/SlashCommands.js +++ b/src/SlashCommands.js @@ -81,6 +81,8 @@ class Command { } run(roomId, args) { + // if it has no runFn then its an ignored/nop command (autocomplete only) e.g `/me` + if (!this.runFn) return; return this.runFn.bind(this)(roomId, args); } @@ -918,12 +920,12 @@ export function processCommandInput(roomId, input) { input = input.replace(/\s+$/, ''); if (input[0] !== '/') return null; // not a command - const bits = input.match(/^(\S+?)( +((.|\n)*))?$/); + const bits = input.match(/^(\S+?)(?: +((.|\n)*))?$/); let cmd; let args; if (bits) { cmd = bits[1].substring(1).toLowerCase(); - args = bits[3]; + args = bits[2]; } else { cmd = input; } @@ -932,11 +934,8 @@ export function processCommandInput(roomId, input) { cmd = aliases[cmd]; } if (CommandMap[cmd]) { - // if it has no runFn then its an ignored/nop command (autocomplete only) e.g `/me` - if (!CommandMap[cmd].runFn) return null; - return CommandMap[cmd].run(roomId, args); - } else { - return reject(_t('Unrecognised command:') + ' ' + input); } + return null; + // return reject(_t('Unrecognised command:') + ' ' + input); } diff --git a/src/components/views/rooms/SendMessageComposer.js b/src/components/views/rooms/SendMessageComposer.js index 8de105d84d..9f3a407402 100644 --- a/src/components/views/rooms/SendMessageComposer.js +++ b/src/components/views/rooms/SendMessageComposer.js @@ -43,6 +43,9 @@ import ContentMessages from '../../../ContentMessages'; import {Key} from "../../../Keyboard"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; +const SEND_ANYWAY = Symbol("send-anyway"); +const UNKNOWN_CMD = Symbol("unknown-cmd"); + function addReplyToMessageContent(content, repliedToEvent, permalinkCreator) { const replyContent = ReplyThread.makeReplyMixIn(repliedToEvent); Object.assign(content, replyContent); @@ -194,7 +197,12 @@ export default class SendMessageComposer extends React.Component { return false; } - async _runSlashCommand() { + /** + * Parses and executes current input as a Slash Command + * @returns {Promise} UNKNOWN_CMD if the command is not known, + * SEND_ANYWAY if the input should be sent as message instead + */ + async _tryRunSlashCommand() { const commandText = this.model.parts.reduce((text, part) => { // use mxid to textify user pills in a command if (part.type === "user-pill") { @@ -236,16 +244,38 @@ export default class SendMessageComposer extends React.Component { } else { console.log("Command success."); } + } else { + const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); + // unknown command, ask the user if they meant to send it as a message + const {finished} = Modal.createTrackedDialog("Unknown command", "", QuestionDialog, { + title: _t("Unknown Command"), + description: _t("Unrecognised command: ") + commandText, + button: _t('Send as message'), + danger: true, + }); + const [sendAnyway] = await finished; + return sendAnyway ? SEND_ANYWAY : UNKNOWN_CMD; } } - _sendMessage() { + async _sendMessage() { if (this.model.isEmpty) { return; } + + let shouldSend = true; + if (!containsEmote(this.model) && this._isSlashCommand()) { - this._runSlashCommand(); - } else { + const resp = await this._tryRunSlashCommand(); + if (resp === UNKNOWN_CMD) { + // unknown command, bail to let the user modify it + return; + } + + shouldSend = resp === SEND_ANYWAY; + } + + if (shouldSend) { const isReply = !!RoomViewStore.getQuotingEvent(); const {roomId} = this.props.room; const content = createMessageContent(this.model, this.props.permalinkCreator); @@ -259,6 +289,7 @@ export default class SendMessageComposer extends React.Component { }); } } + this.sendHistoryManager.save(this.model); // clear composer this.model.reset([]); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index f0eab6b12d..314731a910 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -200,7 +200,6 @@ "Sends the given message coloured as a rainbow": "Sends the given message coloured as a rainbow", "Sends the given emote coloured as a rainbow": "Sends the given emote coloured as a rainbow", "Displays list of commands with usages and descriptions": "Displays list of commands with usages and descriptions", - "Unrecognised command:": "Unrecognised command:", "Reason": "Reason", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepted the invitation for %(displayName)s.", "%(targetName)s accepted an invitation.": "%(targetName)s accepted an invitation.", @@ -1077,6 +1076,9 @@ "Server error": "Server error", "Command error": "Command error", "Server unavailable, overloaded, or something else went wrong.": "Server unavailable, overloaded, or something else went wrong.", + "Unknown Command": "Unknown Command", + "Unrecognised command: ": "Unrecognised command: ", + "Send as message": "Send as message", "Failed to connect to integration manager": "Failed to connect to integration manager", "You don't currently have any stickerpacks enabled": "You don't currently have any stickerpacks enabled", "Add some now": "Add some now", From 9f7df33bc30acaceaa7d1f9d100fbf2de153d8d3 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 21 Jan 2020 16:57:07 +0000 Subject: [PATCH 078/906] re-arrange to split the async task into two and only wait on the user-blocking one --- src/SlashCommands.js | 10 +- .../views/rooms/SendMessageComposer.js | 100 +++++++++--------- 2 files changed, 52 insertions(+), 58 deletions(-) diff --git a/src/SlashCommands.js b/src/SlashCommands.js index 414dd60121..2eb34576ac 100644 --- a/src/SlashCommands.js +++ b/src/SlashCommands.js @@ -907,14 +907,14 @@ const aliases = { /** - * Process the given text for /commands and perform them. + * Process the given text for /commands and return a bound method to perform them. * @param {string} roomId The room in which the command was performed. * @param {string} input The raw text input by the user. - * @return {Object|null} An object with the property 'error' if there was an error + * @return {null|function(): Object} Function returning an object with the property 'error' if there was an error * processing the command, or 'promise' if a request was sent out. * Returns null if the input didn't match a command. */ -export function processCommandInput(roomId, input) { +export function getCommand(roomId, input) { // trim any trailing whitespace, as it can confuse the parser for // IRC-style commands input = input.replace(/\s+$/, ''); @@ -934,8 +934,6 @@ export function processCommandInput(roomId, input) { cmd = aliases[cmd]; } if (CommandMap[cmd]) { - return CommandMap[cmd].run(roomId, args); + return () => CommandMap[cmd].run(roomId, args); } - return null; - // return reject(_t('Unrecognised command:') + ' ' + input); } diff --git a/src/components/views/rooms/SendMessageComposer.js b/src/components/views/rooms/SendMessageComposer.js index 9f3a407402..994c28f531 100644 --- a/src/components/views/rooms/SendMessageComposer.js +++ b/src/components/views/rooms/SendMessageComposer.js @@ -35,7 +35,7 @@ import ReplyThread from "../elements/ReplyThread"; import {parseEvent} from '../../../editor/deserialize'; import {findEditableEvent} from '../../../utils/EventUtils'; import SendHistoryManager from "../../../SendHistoryManager"; -import {processCommandInput} from '../../../SlashCommands'; +import {getCommand} from '../../../SlashCommands'; import * as sdk from '../../../index'; import Modal from '../../../Modal'; import {_t, _td} from '../../../languageHandler'; @@ -197,12 +197,7 @@ export default class SendMessageComposer extends React.Component { return false; } - /** - * Parses and executes current input as a Slash Command - * @returns {Promise} UNKNOWN_CMD if the command is not known, - * SEND_ANYWAY if the input should be sent as message instead - */ - async _tryRunSlashCommand() { + _getSlashCommand() { const commandText = this.model.parts.reduce((text, part) => { // use mxid to textify user pills in a command if (part.type === "user-pill") { @@ -210,51 +205,41 @@ export default class SendMessageComposer extends React.Component { } return text + part.text; }, ""); - const cmd = processCommandInput(this.props.room.roomId, commandText); + return [getCommand(this.props.room.roomId, commandText), commandText]; + } - if (cmd) { - let error = cmd.error; - if (cmd.promise) { - try { - await cmd.promise; - } catch (err) { - error = err; - } + async _runSlashCommand(fn) { + const cmd = fn(); + let error = cmd.error; + if (cmd.promise) { + try { + await cmd.promise; + } catch (err) { + error = err; } - if (error) { - console.error("Command failure: %s", error); - const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - // assume the error is a server error when the command is async - const isServerError = !!cmd.promise; - const title = isServerError ? _td("Server error") : _td("Command error"); + } + if (error) { + console.error("Command failure: %s", error); + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + // assume the error is a server error when the command is async + const isServerError = !!cmd.promise; + const title = isServerError ? _td("Server error") : _td("Command error"); - let errText; - if (typeof error === 'string') { - errText = error; - } else if (error.message) { - errText = error.message; - } else { - errText = _t("Server unavailable, overloaded, or something else went wrong."); - } - - Modal.createTrackedDialog(title, '', ErrorDialog, { - title: _t(title), - description: errText, - }); + let errText; + if (typeof error === 'string') { + errText = error; + } else if (error.message) { + errText = error.message; } else { - console.log("Command success."); + errText = _t("Server unavailable, overloaded, or something else went wrong."); } - } else { - const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); - // unknown command, ask the user if they meant to send it as a message - const {finished} = Modal.createTrackedDialog("Unknown command", "", QuestionDialog, { - title: _t("Unknown Command"), - description: _t("Unrecognised command: ") + commandText, - button: _t('Send as message'), - danger: true, + + Modal.createTrackedDialog(title, '', ErrorDialog, { + title: _t(title), + description: errText, }); - const [sendAnyway] = await finished; - return sendAnyway ? SEND_ANYWAY : UNKNOWN_CMD; + } else { + console.log("Command success."); } } @@ -266,13 +251,24 @@ export default class SendMessageComposer extends React.Component { let shouldSend = true; if (!containsEmote(this.model) && this._isSlashCommand()) { - const resp = await this._tryRunSlashCommand(); - if (resp === UNKNOWN_CMD) { - // unknown command, bail to let the user modify it - return; + const [cmd, commandText] = this._getSlashCommand(); + if (cmd) { + shouldSend = false; + this._runSlashCommand(cmd); + } else { + // ask the user if their unknown command should be sent as a message instead + const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); + // unknown command, ask the user if they meant to send it as a message + const {finished} = Modal.createTrackedDialog("Unknown command", "", QuestionDialog, { + title: _t("Unknown Command"), + description: _t("Unrecognised command: ") + commandText, + button: _t('Send as message'), + danger: true, + }); + const [sendAnyway] = await finished; + // if !sendAnyway bail to let the user edit the composer and try again + if (!sendAnyway) return; } - - shouldSend = resp === SEND_ANYWAY; } if (shouldSend) { From 2480f709b31f9f05270430bf73235c904f029b2c Mon Sep 17 00:00:00 2001 From: Zoe Date: Tue, 21 Jan 2020 17:19:10 +0000 Subject: [PATCH 079/906] E2ESTATE -> E2E_STATE --- src/components/views/rooms/EventTile.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index 9c73daaa50..bcd32d2c9c 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -66,7 +66,7 @@ const stateEventTileTypes = { 'm.room.related_groups': 'messages.TextualEvent', }; -const E2ESTATE = { +const E2E_STATE = { VERIFIED: "verified", WARNING: "warning", UNKNOWN: "unknown", @@ -305,7 +305,7 @@ export default createReactClass({ const verified = await this.context.isEventSenderVerified(mxEvent); if (verified) { this.setState({ - verified: E2ESTATE.VERIFIED, + verified: E2E_STATE.VERIFIED, }, () => { // Decryption may have caused a change in size this.props.onHeightChanged(); @@ -316,13 +316,13 @@ export default createReactClass({ const eventSenderTrust = await this.context.checkEventSenderTrust(mxEvent); if (!eventSenderTrust) { this.setState({ - verified: E2ESTATE.UNKNOWN, + verified: E2E_STATE.UNKNOWN, }, this.props.onHeightChanged); // Decryption may have cause a change in size return; } this.setState({ - verified: eventSenderTrust.isVerified() ? E2ESTATE.VERIFIED : E2ESTATE.WARNING, + verified: eventSenderTrust.isVerified() ? E2E_STATE.VERIFIED : E2E_STATE.WARNING, }, this.props.onHeightChanged); // Decryption may have caused a change in size }, @@ -503,9 +503,9 @@ export default createReactClass({ // event is encrypted, display padlock corresponding to whether or not it is verified if (ev.isEncrypted()) { - if (this.state.verified === E2ESTATE.VERIFIED) { + if (this.state.verified === E2E_STATE.VERIFIED) { return; // no icon for verified - } else if (this.state.verified === E2ESTATE.UNKNOWN) { + } else if (this.state.verified === E2E_STATE.UNKNOWN) { return (); } else { return (); @@ -636,9 +636,9 @@ export default createReactClass({ mx_EventTile_last: this.props.last, mx_EventTile_contextual: this.props.contextual, mx_EventTile_actionBarFocused: this.state.actionBarFocused, - mx_EventTile_verified: !isBubbleMessage && this.state.verified === E2ESTATE.VERIFIED, - mx_EventTile_unverified: !isBubbleMessage && this.state.verified === E2ESTATE.WARNING, - mx_EventTile_unknown: !isBubbleMessage && this.state.verified === E2ESTATE.UNKNOWN, + mx_EventTile_verified: !isBubbleMessage && this.state.verified === E2E_STATE.VERIFIED, + mx_EventTile_unverified: !isBubbleMessage && this.state.verified === E2E_STATE.WARNING, + mx_EventTile_unknown: !isBubbleMessage && this.state.verified === E2E_STATE.UNKNOWN, mx_EventTile_bad: isEncryptionFailure, mx_EventTile_emote: msgtype === 'm.emote', mx_EventTile_redacted: isRedacted, From 931c0885de5db562d24a5c3fc451a4296fbaf69f Mon Sep 17 00:00:00 2001 From: catborise Date: Tue, 21 Jan 2020 17:06:26 +0000 Subject: [PATCH 080/906] Translated using Weblate (Turkish) Currently translated at 70.7% (1440 of 2038 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/tr/ --- src/i18n/strings/tr.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 1e92d28586..5d83ff5b06 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -1440,5 +1440,17 @@ "Change room avatar": "Oda resmini değiştir", "Members only (since the point in time of selecting this option)": "Sadece üyeler ( bu seçeneği seçtiğinizden itibaren)", "Unable to revoke sharing for email address": "E-posta adresi paylaşımı kaldırılamadı", - "Unable to revoke sharing for phone number": "Telefon numarası paylaşımı kaldırılamıyor" + "Unable to revoke sharing for phone number": "Telefon numarası paylaşımı kaldırılamıyor", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Bu sayfadaki oda, kullanıcı veya grup ID si gibi betimleyici bilgiler sunucuya gönderilmeden önce silindi.", + "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Çağrıların sağlıklı bir şekide yapılabilmesi için lütfen anasunucunuzun (%(homeserverDomain)s) yöneticisinden bir TURN sunucusu yapılandırmasını isteyin.", + "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s kullanıcıları isimlerini %(count)s kez değiştirdiler", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s ismini %(count)s kez değiştirdi", + "%(severalUsers)smade no changes %(count)s times|one": "%(severalUsers)s değişiklik yapmadı", + "%(oneUser)smade no changes %(count)s times|other": "%(oneUser)s %(count)s kez değişiklik yapmadı", + "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)s değişiklik yapmadı", + "Room alias": "Oda lakabı", + "Please provide a room alias": "Lütfen bir oda lakabı belirtin", + "This alias is available to use": "Bu lakap kullanmaya uygun", + "This alias is already in use": "Bu lakap zaten kullanımda", + "And %(count)s more...|other": "ve %(count)s kez daha..." } From 33220c2d7230c999b0f65158a66affdd87e756a1 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 21 Jan 2020 10:53:17 -0700 Subject: [PATCH 081/906] Ensure generated files are present for riot-web tests --- scripts/ci/riot-unit-tests.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/ci/riot-unit-tests.sh b/scripts/ci/riot-unit-tests.sh index 7a9ed77793..337c0fe6c3 100755 --- a/scripts/ci/riot-unit-tests.sh +++ b/scripts/ci/riot-unit-tests.sh @@ -8,4 +8,5 @@ set -ev scripts/ci/layered-riot-web.sh cd ../riot-web +yarn build:genfiles # so the tests can run. Faster version of `build` yarn test From a8df058ea6f7e55e2b8f1bbddc171a46777febe8 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 21 Jan 2020 17:54:27 +0000 Subject: [PATCH 082/906] tidy up, improve wording on modal --- .../views/rooms/SendMessageComposer.js | 23 +++++++++++++------ src/i18n/strings/en_EN.json | 4 +++- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/components/views/rooms/SendMessageComposer.js b/src/components/views/rooms/SendMessageComposer.js index 994c28f531..7870699fec 100644 --- a/src/components/views/rooms/SendMessageComposer.js +++ b/src/components/views/rooms/SendMessageComposer.js @@ -43,9 +43,6 @@ import ContentMessages from '../../../ContentMessages'; import {Key} from "../../../Keyboard"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; -const SEND_ANYWAY = Symbol("send-anyway"); -const UNKNOWN_CMD = Symbol("unknown-cmd"); - function addReplyToMessageContent(content, repliedToEvent, permalinkCreator) { const replyContent = ReplyThread.makeReplyMixIn(repliedToEvent); Object.assign(content, replyContent); @@ -256,14 +253,26 @@ export default class SendMessageComposer extends React.Component { shouldSend = false; this._runSlashCommand(cmd); } else { - // ask the user if their unknown command should be sent as a message instead + // ask the user if their unknown command should be sent as a message const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); - // unknown command, ask the user if they meant to send it as a message const {finished} = Modal.createTrackedDialog("Unknown command", "", QuestionDialog, { title: _t("Unknown Command"), - description: _t("Unrecognised command: ") + commandText, + description:
+

+ { _t("Unrecognised command: %(commandText)s", {commandText}) } +

+

+ { _t("You can use /help to list available commands. Did you mean to send this as a message?", {}, { + code: t => { t }, + }) } +

+

+ { _t("Protip: Begin your message with // to start it with a slash.", {}, { + code: t => { t }, + }) } +

+
, button: _t('Send as message'), - danger: true, }); const [sendAnyway] = await finished; // if !sendAnyway bail to let the user edit the composer and try again diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 314731a910..da4111aec8 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1077,7 +1077,9 @@ "Command error": "Command error", "Server unavailable, overloaded, or something else went wrong.": "Server unavailable, overloaded, or something else went wrong.", "Unknown Command": "Unknown Command", - "Unrecognised command: ": "Unrecognised command: ", + "Unrecognised command: %(commandText)s": "Unrecognised command: %(commandText)s", + "You can use /help to list available commands. Did you mean to send this as a message?": "You can use /help to list available commands. Did you mean to send this as a message?", + "Protip: Begin your message with // to start it with a slash.": "Protip: Begin your message with // to start it with a slash.", "Send as message": "Send as message", "Failed to connect to integration manager": "Failed to connect to integration manager", "You don't currently have any stickerpacks enabled": "You don't currently have any stickerpacks enabled", From e455aa474d652c1f66228ea4e2e2f8b69f2a796b Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 21 Jan 2020 17:58:53 +0000 Subject: [PATCH 083/906] improve copy further --- src/components/views/rooms/SendMessageComposer.js | 2 +- src/i18n/strings/en_EN.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/rooms/SendMessageComposer.js b/src/components/views/rooms/SendMessageComposer.js index 7870699fec..4402a034f6 100644 --- a/src/components/views/rooms/SendMessageComposer.js +++ b/src/components/views/rooms/SendMessageComposer.js @@ -267,7 +267,7 @@ export default class SendMessageComposer extends React.Component { }) }

- { _t("Protip: Begin your message with // to start it with a slash.", {}, { + { _t("Hint: Begin your message with // to start it with a slash.", {}, { code: t => { t }, }) }

diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index da4111aec8..a3c56e5973 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1079,7 +1079,7 @@ "Unknown Command": "Unknown Command", "Unrecognised command: %(commandText)s": "Unrecognised command: %(commandText)s", "You can use /help to list available commands. Did you mean to send this as a message?": "You can use /help to list available commands. Did you mean to send this as a message?", - "Protip: Begin your message with // to start it with a slash.": "Protip: Begin your message with // to start it with a slash.", + "Hint: Begin your message with // to start it with a slash.": "Hint: Begin your message with // to start it with a slash.", "Send as message": "Send as message", "Failed to connect to integration manager": "Failed to connect to integration manager", "You don't currently have any stickerpacks enabled": "You don't currently have any stickerpacks enabled", From 708f62784fbf7c46e2105e255faa28f6d1fd5879 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 21 Jan 2020 10:59:33 -0700 Subject: [PATCH 084/906] Consistency Co-Authored-By: J. Ryan Stinnett --- scripts/fetchdep.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/fetchdep.sh b/scripts/fetchdep.sh index f477fd08b8..0142305797 100755 --- a/scripts/fetchdep.sh +++ b/scripts/fetchdep.sh @@ -17,7 +17,7 @@ clone() { if [ -n "$branch" ] then echo "Trying to use $org/$repo#$branch" - git clone git://github.com/$org/$repo.git $repo --branch "$branch" --depth=1 && exit 0 + git clone git://github.com/$org/$repo.git $repo --branch "$branch" --depth 1 && exit 0 fi } From 7b26067397e5bc1870c725968778bde83c6b0b34 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 21 Jan 2020 18:03:01 +0000 Subject: [PATCH 085/906] delint --- src/components/views/rooms/SendMessageComposer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/rooms/SendMessageComposer.js b/src/components/views/rooms/SendMessageComposer.js index 4402a034f6..c4970c4570 100644 --- a/src/components/views/rooms/SendMessageComposer.js +++ b/src/components/views/rooms/SendMessageComposer.js @@ -262,7 +262,8 @@ export default class SendMessageComposer extends React.Component { { _t("Unrecognised command: %(commandText)s", {commandText}) }

- { _t("You can use /help to list available commands. Did you mean to send this as a message?", {}, { + { _t("You can use /help to list available commands. " + + "Did you mean to send this as a message?", {}, { code: t => { t }, }) }

From b2fc4a1c4de9251284c392c3d1efe3ae06fd222c Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Tue, 21 Jan 2020 18:41:43 +0000 Subject: [PATCH 086/906] Style bridge settings tab according to design Signed-off-by: Half-Shot --- .../views/dialogs/_RoomSettingsDialog.scss | 58 ++++++- .../views/dialogs/RoomSettingsDialog.js | 7 +- .../settings/tabs/room/BridgeSettingsTab.js | 156 ++++++++++-------- src/i18n/strings/en_EN.json | 11 +- 4 files changed, 144 insertions(+), 88 deletions(-) diff --git a/res/css/views/dialogs/_RoomSettingsDialog.scss b/res/css/views/dialogs/_RoomSettingsDialog.scss index aa66e97f9e..0e8deb018e 100644 --- a/res/css/views/dialogs/_RoomSettingsDialog.scss +++ b/res/css/views/dialogs/_RoomSettingsDialog.scss @@ -63,9 +63,59 @@ limitations under the License. .mx_RoomSettingsDialog_BridgeList li { list-style-type: none; padding: 5px; - margin-bottom: 5px; - border-width: 1px 0px; - border-color: #dee1f3; - border-style: solid; + margin-bottom: 8px; + border-width: 1px 1px; + border-color: $primary-hairline-color; + border-radius: 5px; + + .protocol-icon { + float: left; + margin-right: 30px; + img { + border-radius: 5px; + border-width: 1px 1px; + border-color: $primary-hairline-color; + border-style: solid; + } + span { + /* Correct letter placement */ + left: auto; + } + } + + h3 { + margin-top: 0; + margin-bottom: 4px; + font-size: 16pt; + } + + .column-icon { + float: left; + } + + .column-data { + display: inline-block; + width: 85%; + } + + .workspace-channel-details { + margin-top: 0; + color: $primary-fg-color; + } + + .metadata { + color: $muted-fg-color; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin-bottom: 0; + } + + .metadata.visible { + overflow-y: visible; + text-overflow: ellipsis; + white-space: normal; + } + } diff --git a/src/components/views/dialogs/RoomSettingsDialog.js b/src/components/views/dialogs/RoomSettingsDialog.js index a99141870b..76faf60eef 100644 --- a/src/components/views/dialogs/RoomSettingsDialog.js +++ b/src/components/views/dialogs/RoomSettingsDialog.js @@ -54,9 +54,6 @@ export default class RoomSettingsDialog extends React.Component { _getTabs() { const tabs = []; - const featureFlag = SettingsStore.isFeatureEnabled("feature_bridge_state"); - const shouldShowBridgeIcon = featureFlag && - BridgeSettingsTab.getBridgeStateEvents(this.props.roomId).length > 0; tabs.push(new Tab( _td("General"), @@ -79,9 +76,9 @@ export default class RoomSettingsDialog extends React.Component { , )); - if (shouldShowBridgeIcon) { + if (SettingsStore.isFeatureEnabled("feature_bridge_state")) { tabs.push(new Tab( - _td("Bridge Info"), + _td("Bridges"), "mx_RoomSettingsDialog_bridgesIcon", , )); diff --git a/src/components/views/settings/tabs/room/BridgeSettingsTab.js b/src/components/views/settings/tabs/room/BridgeSettingsTab.js index 19c19d3bc6..8090cf7d4d 100644 --- a/src/components/views/settings/tabs/room/BridgeSettingsTab.js +++ b/src/components/views/settings/tabs/room/BridgeSettingsTab.js @@ -33,6 +33,21 @@ export default class BridgeSettingsTab extends React.Component { roomId: PropTypes.string.isRequired, }; + constructor() { + super(); + + this.state = { + showMoreCard: null, + }; + } + + + _showMoreDetails(eventId) { + this.setState({ + showMoreCard: eventId, + }); + } + _renderBridgeCard(event, room) { const content = event.getContent(); if (!content || !content.channel || !content.protocol) { @@ -45,90 +60,59 @@ export default class BridgeSettingsTab extends React.Component { let creator = null; if (content.creator) { - creator =

{ _t("This bridge was provisioned by ", {}, { + creator = _t("This bridge was provisioned by .", {}, { user: , - })}

; + }); } - const bot = (

{_t("This bridge is managed by .", {}, { + const bot = _t("This bridge is managed by .", {}, { user: , - })}

); - let channelLink = channelName; - if (channel.external_url) { - channelLink = {channelName}; - } - - let networkLink = networkName; - if (network && network.external_url) { - networkLink = {networkName}; - } - - const chanAndNetworkInfo = ( - _t("Bridged into , on ", {}, { - channelLink, - networkLink, - protocolName, - }) - ); - - let networkIcon = null; - if (networkName && network.avatar) { - const avatarUrl = getHttpUriForMxc( - MatrixClientPeg.get().getHomeserverUrl(), - network.avatar, 32, 32, "crop", - ); - networkIcon = ; - } - - let channelIcon = null; - if (channel.avatar) { - const avatarUrl = getHttpUriForMxc( - MatrixClientPeg.get().getHomeserverUrl(), - channel.avatar, 32, 32, "crop", - ); - channelIcon = ; - } - - const heading = _t("Connected to on ", { }, { - channelIcon, - channelName, - networkName, - networkIcon, }); - return (
  • -
    -

    {heading}

    -

    {_t("Connected via %(protocolName)s", { protocolName })}

    -
    - {creator} - {bot} -

    {chanAndNetworkInfo}

    -
    + const avatarUrl = network.avatar ? getHttpUriForMxc( + MatrixClientPeg.get().getHomeserverUrl(), + network.avatar, 32, 32, "crop", + ) : null; + + const networkIcon = ; + + const workspaceChannelDetails = _t("Workspace: %(networkName)s Channel: %(channelName)s", { + networkName, + channelName, + }); + const id = event.getId(); + const isVisible = this.state.showMoreCard === id; + const metadataClassname = "metadata " + (isVisible ? "visible" : ""); + return (
  • +
    + {networkIcon} +
    +
    +

    {protocolName}

    +

    + {workspaceChannelDetails} +

    +

    + {creator} {bot} +

    + this._showMoreDetails(isVisible ? null : id)}>Show { isVisible ? "less" : "more" }
  • ); } @@ -151,14 +135,40 @@ export default class BridgeSettingsTab extends React.Component { const client = MatrixClientPeg.get(); const room = client.getRoom(this.props.roomId); + let content = null; + + if (bridgeEvents.length > 0) { + content =
    +

    {_t( + "This room is bridging messages to the following platforms. " + + "Learn more.", {}, + { + // TODO: We don't have this link yet: this will prevent the translators + // having to re-translate the string when we do. + a: sub => '', + }, + )}

    +
      + { bridgeEvents.map((event) => this._renderBridgeCard(event, room)) } +
    +
    + } else { + content =

    {_t( + "This room isn’t bridging messages to any platforms. " + + "Learn more.", {}, + { + // TODO: We don't have this link yet: this will prevent the translators + // having to re-translate the string when we do. + a: sub => '', + }, + )}

    + } + return (
    -
    {_t("Bridge Info")}
    +
    {_t("Bridges")}
    -

    { _t("Below is a list of bridges connected to this room.") }

    -
      - { bridgeEvents.map((event) => this._renderBridgeCard(event, room)) } -
    + {content}
    ); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index f0eab6b12d..e4ab764989 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -781,13 +781,12 @@ "Room version:": "Room version:", "Developer options": "Developer options", "Open Devtools": "Open Devtools", - "This bridge was provisioned by ": "This bridge was provisioned by ", + "This bridge was provisioned by .": "This bridge was provisioned by .", "This bridge is managed by .": "This bridge is managed by .", - "Bridged into , on ": "Bridged into , on ", - "Connected to on ": "Connected to on ", - "Connected via %(protocolName)s": "Connected via %(protocolName)s", - "Bridge Info": "Bridge Info", - "Below is a list of bridges connected to this room.": "Below is a list of bridges connected to this room.", + "Workspace: %(networkName)s Channel: %(channelName)s": "Workspace: %(networkName)s Channel: %(channelName)s", + "This room is bridging messages to the following platforms. Learn more.": "This room is bridging messages to the following platforms. Learn more.", + "This room isn’t bridging messages to any platforms. Learn more.": "This room isn’t bridging messages to any platforms. Learn more.", + "Bridges": "Bridges", "Room Addresses": "Room Addresses", "Publish this room to the public in %(domain)s's room directory?": "Publish this room to the public in %(domain)s's room directory?", "URL Previews": "URL Previews", From 2c6fe780123e2cdffdb65961f282c7afb8e06156 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 22 Jan 2020 10:36:20 +0000 Subject: [PATCH 087/906] Fix roving room list for resizer and ff tabstop a11y --- src/accessibility/RovingTabIndex.js | 70 ++++++++----------- src/components/structures/RoomSubList.js | 4 -- .../views/groups/GroupInviteTile.js | 3 +- src/components/views/rooms/RoomList.js | 27 +++---- src/components/views/rooms/RoomTile.js | 3 +- 5 files changed, 48 insertions(+), 59 deletions(-) diff --git a/src/accessibility/RovingTabIndex.js b/src/accessibility/RovingTabIndex.js index 8924815f23..38f2594baf 100644 --- a/src/accessibility/RovingTabIndex.js +++ b/src/accessibility/RovingTabIndex.js @@ -129,7 +129,7 @@ const reducer = (state, action) => { } }; -export const RovingTabIndexProvider = ({children, handleHomeEnd}) => { +export const RovingTabIndexProvider = ({children, handleHomeEnd, onKeyDown}) => { const [state, dispatch] = useReducer(reducer, { activeRef: null, refs: [], @@ -137,53 +137,43 @@ export const RovingTabIndexProvider = ({children, handleHomeEnd}) => { const context = useMemo(() => ({state, dispatch}), [state]); - if (handleHomeEnd) { - return - - { children } - - ; - } - - return - { children } - ; -}; -RovingTabIndexProvider.propTypes = { - handleHomeEnd: PropTypes.bool, -}; - -// Helper to handle Home/End to jump to first/last roving-tab-index for widgets such as treeview -export const HomeEndHelper = ({children}) => { - const context = useContext(RovingTabIndexContext); - - const onKeyDown = useCallback((ev) => { - // check if we actually have any items - if (context.state.refs.length <= 0) return; - - let handled = true; - switch (ev.key) { - case Key.HOME: - // move focus to first item - context.state.refs[0].current.focus(); - break; - case Key.END: - // move focus to last item - context.state.refs[context.state.refs.length - 1].current.focus(); - break; - default: - handled = false; + const onKeyDownHandler = useCallback((ev) => { + let handled = false; + if (handleHomeEnd) { + // check if we actually have any items + switch (ev.key) { + case Key.HOME: + handled = true; + // move focus to first item + if (context.state.refs.length > 0) { + context.state.refs[0].current.focus(); + } + break; + case Key.END: + handled = true; + // move focus to last item + if (context.state.refs.length > 0) { + context.state.refs[context.state.refs.length - 1].current.focus(); + } + break; + } } if (handled) { ev.preventDefault(); ev.stopPropagation(); + } else if (onKeyDown) { + return onKeyDown(ev); } }, [context.state]); - return
    - { children } -
    ; + return + { children({onKeyDownHandler}) } + ; +}; +RovingTabIndexProvider.propTypes = { + handleHomeEnd: PropTypes.bool, + onKeyDown: PropTypes.func, }; // Hook to register a roving tab index diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js index 2d41abf902..600b418fe0 100644 --- a/src/components/structures/RoomSubList.js +++ b/src/components/structures/RoomSubList.js @@ -142,10 +142,6 @@ export default class RoomSubList extends React.PureComponent { onHeaderKeyDown = (ev) => { switch (ev.key) { - case Key.TAB: - // Prevent LeftPanel handling Tab if focus is on the sublist header itself - ev.stopPropagation(); - break; case Key.ARROW_LEFT: // On ARROW_LEFT collapse the room sublist if (!this.state.hidden && !this.props.forceExpand) { diff --git a/src/components/views/groups/GroupInviteTile.js b/src/components/views/groups/GroupInviteTile.js index 3b15c6ff41..91c930525d 100644 --- a/src/components/views/groups/GroupInviteTile.js +++ b/src/components/views/groups/GroupInviteTile.js @@ -128,7 +128,8 @@ export default createReactClass({ 'mx_RoomTile_badgeShown': this.state.badgeHover || isMenuDisplayed, }); - const label =
    + // XXX: this is a workaround for Firefox giving this div a tabstop :( [tabIndex] + const label =
    { groupName }
    ; diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index bd563b2f28..ee3100b535 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -777,21 +777,22 @@ export default createReactClass({ const subListComponents = this._mapSubListProps(subLists); - const {resizeNotifier, collapsed, searchFilter, ConferenceHandler, ...props} = this.props; // eslint-disable-line + const {resizeNotifier, collapsed, searchFilter, ConferenceHandler, onKeyDown, ...props} = this.props; // eslint-disable-line return ( -
    - + + {({onKeyDownHandler}) =>
    { subListComponents } - -
    +
    } + ); }, }); diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index 3b13001225..f4f5fa10fc 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -353,7 +353,8 @@ export default createReactClass({ }); subtextLabel = subtext ? { subtext } : null; - label =
    { name }
    ; + // XXX: this is a workaround for Firefox giving this div a tabstop :( [tabIndex] + label =
    { name }
    ; } else if (this.state.hover) { const Tooltip = sdk.getComponent("elements.Tooltip"); tooltip = ; From 37fb500e22aeb4762cef90ca8ca4f28eead57fa6 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 22 Jan 2020 10:41:10 +0000 Subject: [PATCH 088/906] fix useCallback dependencies, delint --- src/accessibility/RovingTabIndex.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/accessibility/RovingTabIndex.js b/src/accessibility/RovingTabIndex.js index 38f2594baf..b481f08fe2 100644 --- a/src/accessibility/RovingTabIndex.js +++ b/src/accessibility/RovingTabIndex.js @@ -165,7 +165,7 @@ export const RovingTabIndexProvider = ({children, handleHomeEnd, onKeyDown}) => } else if (onKeyDown) { return onKeyDown(ev); } - }, [context.state]); + }, [context.state, onKeyDown, handleHomeEnd]); return { children({onKeyDownHandler}) } From d211372740588bdac1ad740111d28183180d5e8b Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 22 Jan 2020 10:44:02 +0000 Subject: [PATCH 089/906] UI to bootsrap SSSS from key backup --- .../CreateSecretStorageDialog.js | 130 ++++++++++++++---- .../views/elements/DialogButtons.js | 17 ++- src/i18n/strings/en_EN.json | 6 +- 3 files changed, 123 insertions(+), 30 deletions(-) diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 01b9c9c7c8..7d1b82681b 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -1,6 +1,6 @@ /* Copyright 2018, 2019 New Vector Ltd -Copyright 2019 The Matrix.org Foundation C.I.C. +Copyright 2019, 2020 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. @@ -70,9 +70,15 @@ export default class CreateSecretStorageDialog extends React.PureComponent { setPassPhrase: false, backupInfo: null, backupSigStatus: null, + // does the server offer a UI auth flow with just m.login.password + // for /keys/device_signing/upload? + canUploadKeysWithPasswordOnly: null, + accountPassword: '', + accountPasswordCorrect: null, }; this._fetchBackupInfo(); + this._queryKeyUploadAuth(); } componentWillUnmount() { @@ -96,11 +102,32 @@ export default class CreateSecretStorageDialog extends React.PureComponent { }); } + async _queryKeyUploadAuth() { + try { + await MatrixClientPeg.get().uploadDeviceSigningKeys(null, {}); + // We should never get here: the server should always require + // UI auth to upload device signing keys. If we do, we upload + // no keys which would be a no-op. + console.log("uploadDeviceSigningKeys unexpectedly succeeded without UI auth!"); + } catch (error) { + if (!error.data.flows) { + console.log("uploadDeviceSigningKeys advertised no flows!"); + } + const canUploadKeysWithPasswordOnly = error.data.flows.some(f => { + return f.stages.length === 1 && f.stages[0] === 'm.login.password'; + }); + this.setState({ + canUploadKeysWithPasswordOnly, + }); + } + } + _collectRecoveryKeyNode = (n) => { this._recoveryKeyNode = n; } - _onMigrateNextClick = () => { + _onMigrateFormSubmit = (e) => { + e.preventDefault(); this._bootstrapSecretStorage(); } @@ -127,29 +154,46 @@ export default class CreateSecretStorageDialog extends React.PureComponent { }); } + _doBootstrapUIAuth = async (makeRequest) => { + if (this.state.canUploadKeysWithPasswordOnly) { + await makeRequest({ + type: 'm.login.password', + identifier: { + type: 'm.id.user', + user: MatrixClientPeg.get().getUserId(), + }, + // https://github.com/matrix-org/synapse/issues/5665 + user: MatrixClientPeg.get().getUserId(), + password: this.state.accountPassword, + }); + } else { + const InteractiveAuthDialog = sdk.getComponent("dialogs.InteractiveAuthDialog"); + const { finished } = Modal.createTrackedDialog( + 'Cross-signing keys dialog', '', InteractiveAuthDialog, + { + title: _t("Send cross-signing keys to homeserver"), + matrixClient: MatrixClientPeg.get(), + makeRequest, + }, + ); + const [confirmed] = await finished; + if (!confirmed) { + throw new Error("Cross-signing key upload auth canceled"); + } + } + } + _bootstrapSecretStorage = async () => { this.setState({ phase: PHASE_STORING, error: null, }); + const cli = MatrixClientPeg.get(); + try { - const InteractiveAuthDialog = sdk.getComponent("dialogs.InteractiveAuthDialog"); await cli.bootstrapSecretStorage({ - authUploadDeviceSigningKeys: async (makeRequest) => { - const { finished } = Modal.createTrackedDialog( - 'Cross-signing keys dialog', '', InteractiveAuthDialog, - { - title: _t("Send cross-signing keys to homeserver"), - matrixClient: MatrixClientPeg.get(), - makeRequest, - }, - ); - const [confirmed] = await finished; - if (!confirmed) { - throw new Error("Cross-signing key upload auth canceled"); - } - }, + authUploadDeviceSigningKeys: this._doBootstrapUIAuth, createSecretStorageKey: async () => this._keyInfo, keyBackupInfo: this.state.backupInfo, }); @@ -157,7 +201,14 @@ export default class CreateSecretStorageDialog extends React.PureComponent { phase: PHASE_DONE, }); } catch (e) { - this.setState({ error: e }); + if (this.state.canUploadKeysWithPasswordOnly && e.httpStatus === 401 && e.data.flows) { + this.setState({ + accountPasswordCorrect: false, + phase: PHASE_MIGRATE, + }); + } else { + this.setState({ error: e }); + } console.error("Error bootstrapping secret storage", e); } } @@ -285,6 +336,12 @@ export default class CreateSecretStorageDialog extends React.PureComponent { return this.state.zxcvbnResult && this.state.zxcvbnResult.score >= PASSWORD_MIN_SCORE; } + _onAccountPasswordChange = (e) => { + this.setState({ + accountPassword: e.target.value, + }); + } + _renderPhaseRestoreKeyBackup() { const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); return
    @@ -309,18 +366,41 @@ export default class CreateSecretStorageDialog extends React.PureComponent { // it automatically. // https://github.com/vector-im/riot-web/issues/11696 const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); - return
    + const Field = sdk.getComponent('views.elements.Field'); + + let authPrompt; + if (this.state.canUploadKeysWithPasswordOnly) { + authPrompt =
    +
    {_t("Enter your account password to confirm the upgrade:")}
    +
    +
    ; + } else { + authPrompt =

    + {_t("You'll need to authenticate with the server to confirm the upgrade.")} +

    ; + } + + return

    {_t( - "Secret Storage will be set up using your existing key backup details. " + - "Your secret storage passphrase and recovery key will be the same as " + - "they were for your key backup.", + "Upgrade this device to allow it to verify other devices, " + + "granting them access to encrypted messages and marking them " + + "as trusted for other users.", )}

    +
    {authPrompt}
    -
    ; + ; } _renderPhasePassPhrase() { @@ -564,7 +644,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { case PHASE_RESTORE_KEY_BACKUP: return _t('Restore your Key Backup'); case PHASE_MIGRATE: - return _t('Migrate from Key Backup'); + return _t('Upgrade your encryption'); case PHASE_PASSPHRASE: return _t('Secure your encrypted messages with a passphrase'); case PHASE_PASSPHRASE_CONFIRM: diff --git a/src/components/views/elements/DialogButtons.js b/src/components/views/elements/DialogButtons.js index 4e47e73052..7b37fdb4eb 100644 --- a/src/components/views/elements/DialogButtons.js +++ b/src/components/views/elements/DialogButtons.js @@ -34,8 +34,11 @@ export default createReactClass({ // A node to insert into the cancel button instead of default "Cancel" cancelButton: PropTypes.node, + // If true, make the primary button a form submit button (input type="submit") + primaryIsSubmit: PropTypes.bool, + // onClick handler for the primary button. - onPrimaryButtonClick: PropTypes.func.isRequired, + onPrimaryButtonClick: PropTypes.func, // should there be a cancel button? default: true hasCancel: PropTypes.bool, @@ -70,15 +73,23 @@ export default createReactClass({ } let cancelButton; if (this.props.cancelButton || this.props.hasCancel) { - cancelButton = ; } + return (
    { cancelButton } { this.props.children } - ; describe("RovingTabIndex", () => { it("RovingTabIndexProvider renders children as expected", () => { const wrapper = mount( -
    Test
    + {() =>
    Test
    }
    ); expect(wrapper.text()).toBe("Test"); expect(wrapper.html()).toBe('
    Test
    '); @@ -55,9 +55,11 @@ describe("RovingTabIndex", () => { it("RovingTabIndexProvider works as expected with useRovingTabIndex", () => { const wrapper = mount( - { button1 } - { button2 } - { button3 } + {() => + { button1 } + { button2 } + { button3 } + } ); // should begin with 0th being active @@ -95,13 +97,15 @@ describe("RovingTabIndex", () => { it("RovingTabIndexProvider works as expected with RovingTabIndexWrapper", () => { const wrapper = mount( - { button1 } - { button2 } - - {({onFocus, isActive, ref}) => - - } - + {() => + { button1 } + { button2 } + + {({onFocus, isActive, ref}) => + + } + + } ); // should begin with 0th being active From 644d68d836b085cccac8d06cea1ee416894970cc Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 22 Jan 2020 10:59:50 +0000 Subject: [PATCH 091/906] Update copy in bootstrap success dialog phase --- .../dialogs/secretstorage/CreateSecretStorageDialog.js | 10 +++++++--- src/i18n/strings/en_EN.json | 6 ++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 7d1b82681b..d75126687c 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -613,7 +613,11 @@ export default class CreateSecretStorageDialog extends React.PureComponent { const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); return

    {_t( - "Your access to encrypted messages is now protected.", + "This device can now verify other devices, granting them access " + + "to encrypted messages and marking them as trusted for other users.", + )}

    +

    {_t( + "Verify other users in their profile.", )}

    {content} diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 3aad50f45e..29ce36a814 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1998,7 +1998,8 @@ "Print it and store it somewhere safe": "Print it and store it somewhere safe", "Save it on a USB key or backup drive": "Save it on a USB key or backup drive", "Copy it to your personal cloud storage": "Copy it to your personal cloud storage", - "Your access to encrypted messages is now protected.": "Your access to encrypted messages is now protected.", + "This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.", + "Verify other users in their profile.": "Verify other users in their profile.", "Without setting up secret storage, you won't be able to restore your access to encrypted messages or your cross-signing identity for verifying other devices if you log out or use another device.": "Without setting up secret storage, you won't be able to restore your access to encrypted messages or your cross-signing identity for verifying other devices if you log out or use another device.", "Set up secret storage": "Set up secret storage", "Restore your Key Backup": "Restore your Key Backup", @@ -2008,7 +2009,7 @@ "Recovery key": "Recovery key", "Keep it safe": "Keep it safe", "Storing secrets...": "Storing secrets...", - "Success!": "Success!", + "Encryption upgraded": "Encryption upgraded", "Unable to set up secret storage": "Unable to set up secret storage", "Retry": "Retry", "We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.": "We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.", @@ -2020,6 +2021,7 @@ "Set up Secure Message Recovery": "Set up Secure Message Recovery", "Secure your backup with a passphrase": "Secure your backup with a passphrase", "Starting backup...": "Starting backup...", + "Success!": "Success!", "Create Key Backup": "Create Key Backup", "Unable to create key backup": "Unable to create key backup", "Without setting up Secure Message Recovery, you'll lose your secure message history when you log out.": "Without setting up Secure Message Recovery, you'll lose your secure message history when you log out.", From fc724cfe709ec046db13283e2fd8bf91646bb017 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 22 Jan 2020 11:05:25 +0000 Subject: [PATCH 092/906] fix tests some moar --- test/accessibility/RovingTabIndex-test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/accessibility/RovingTabIndex-test.js b/test/accessibility/RovingTabIndex-test.js index e7d7a0977d..8be4a2976c 100644 --- a/test/accessibility/RovingTabIndex-test.js +++ b/test/accessibility/RovingTabIndex-test.js @@ -47,7 +47,7 @@ const button4 = ; describe("RovingTabIndex", () => { it("RovingTabIndexProvider renders children as expected", () => { const wrapper = mount( - {() =>
    Test
    } + {() =>
    Test
    }
    ); expect(wrapper.text()).toBe("Test"); expect(wrapper.html()).toBe('
    Test
    '); @@ -82,14 +82,14 @@ describe("RovingTabIndex", () => { // update the children, it should remain on the same button wrapper.setProps({ - children: [button1, button4, button2, button3], + children: () => [button1, button4, button2, button3], }); wrapper.update(); checkTabIndexes(wrapper.find("button"), [-1, -1, 0, -1]); // update the children, remove the active button, it should move to the next one wrapper.setProps({ - children: [button1, button4, button3], + children: () => [button1, button4, button3], }); wrapper.update(); checkTabIndexes(wrapper.find("button"), [-1, -1, 0]); From 85ee6bd51f06be795c1e596f353de422a9f21083 Mon Sep 17 00:00:00 2001 From: Zoe Date: Wed, 22 Jan 2020 11:17:54 +0000 Subject: [PATCH 093/906] Don't warn on unverified users; ensured behavior stays the same with flags off --- src/components/views/rooms/EventTile.js | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index bcd32d2c9c..634b77c9e1 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -70,6 +70,7 @@ const E2E_STATE = { VERIFIED: "verified", WARNING: "warning", UNKNOWN: "unknown", + NORMAL: "normal", }; // Add all the Mjolnir stuff to the renderer @@ -313,6 +314,22 @@ export default createReactClass({ return; } + // If cross-signing is off, the old behaviour is to scream at the user + // as if they've done something wrong, which they haven't + if (!SettingsStore.isFeatureEnabled("feature_cross_signing")) { + this.setState({ + verified: E2E_STATE.WARNING, + }, this.props.onHeightChanged); + return; + } + + if (!this.context.checkUserTrust(mxEvent.getSender()).isCrossSigningVerified()) { + this.setState({ + verified: E2E_STATE.NORMAL, + }, this.props.onHeightChanged); + return; + } + const eventSenderTrust = await this.context.checkEventSenderTrust(mxEvent); if (!eventSenderTrust) { this.setState({ @@ -503,7 +520,9 @@ export default createReactClass({ // event is encrypted, display padlock corresponding to whether or not it is verified if (ev.isEncrypted()) { - if (this.state.verified === E2E_STATE.VERIFIED) { + if (this.state.verified === E2E_STATE.NORMAL) { + return; // no icon if we've not even cross-signed the user + } else if (this.state.verified === E2E_STATE.VERIFIED) { return; // no icon for verified } else if (this.state.verified === E2E_STATE.UNKNOWN) { return (); From 78f7622fc59e3a393f9485e82fd5c8da179065db Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Wed, 22 Jan 2020 01:55:12 +0000 Subject: [PATCH 094/906] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2039 of 2039 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index b459fb9306..694d5e3d84 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2079,5 +2079,6 @@ "Verify User": "驗證使用者", "For extra security, verify this user by checking a one-time code on both of your devices.": "為了提高安全性,請透過檢查您兩個裝置上的一次性代碼來驗證此使用者。", "For maximum security, do this in person.": "為了取得最強的安全性,請親自進行。", - "Start Verification": "開始驗證" + "Start Verification": "開始驗證", + "Encrypted by a deleted device": "被已刪除的裝置加密" } From d92ddebe5a1a8f5b24c40800e1fdaae5fbec7910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Wed, 22 Jan 2020 07:34:43 +0000 Subject: [PATCH 095/906] Translated using Weblate (French) Currently translated at 100.0% (2039 of 2039 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index abe05e9812..8fda9e458e 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2079,5 +2079,6 @@ "Verify User": "Vérifier l’utilisateur", "For extra security, verify this user by checking a one-time code on both of your devices.": "Pour une meilleure sécurité, vérifiez cet utilisateur en comparant un code à usage unique sur vos deux appareils.", "For maximum security, do this in person.": "Pour une sécurité maximale, faites-le en personne.", - "Start Verification": "Commencer la vérification" + "Start Verification": "Commencer la vérification", + "Encrypted by a deleted device": "Chiffré par un appareil supprimé" } From e923fdb1498e5cf3effcdbf2da3101510042dde1 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Tue, 21 Jan 2020 20:54:31 +0000 Subject: [PATCH 096/906] Translated using Weblate (Hungarian) Currently translated at 100.0% (2039 of 2039 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index c5334c1592..f6c85e1674 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -2080,5 +2080,6 @@ "Verify User": "Felhasználó ellenőrzése", "For extra security, verify this user by checking a one-time code on both of your devices.": "A biztonság fokozásáért ellenőrizd ezt a felhasználót egy egyszeri kód egyeztetésével mindkettőtök készülékén.", "For maximum security, do this in person.": "A legnagyobb biztonság érdekében ezt személyesen tedd meg.", - "Start Verification": "Ellenőrzés elindítása" + "Start Verification": "Ellenőrzés elindítása", + "Encrypted by a deleted device": "Egy már törölt eszköz titkosította" } From 5571164fe0c842fce6b0701b8f54622a0e09e52e Mon Sep 17 00:00:00 2001 From: random Date: Wed, 22 Jan 2020 11:29:25 +0000 Subject: [PATCH 097/906] Translated using Weblate (Italian) Currently translated at 100.0% (2039 of 2039 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index a519c138b1..d6ebc985fb 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2074,5 +2074,10 @@ "Done": "Fatto", "Without completing security on this device, it won’t have access to encrypted messages.": "Se non completi la sicurezza su questo dispositivo, esso non avrà accesso ai messaggi cifrati.", "Go Back": "Torna", - "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup.": "L'archivio segreto verrà impostato usando i dettagli del backup chiavi esistente. La password dell'archivio segreto e la chiave di ripristino saranno le stesse del backup chiavi." + "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup.": "L'archivio segreto verrà impostato usando i dettagli del backup chiavi esistente. La password dell'archivio segreto e la chiave di ripristino saranno le stesse del backup chiavi.", + "Encrypted by a deleted device": "Cifrato da un dispositivo eliminato", + "Verify User": "Verifica utente", + "For extra security, verify this user by checking a one-time code on both of your devices.": "Per maggiore sicurezza, verifica questo utente controllando un codice univoco sui vostri dispositivi.", + "For maximum security, do this in person.": "Per massima sicurezza, fatelo di persona.", + "Start Verification": "Inizia la verifica" } From e98269822cb5c48bfc692e1845734a340f5094db Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 22 Jan 2020 11:44:47 +0000 Subject: [PATCH 098/906] Add icon to bootstrap dialogs --- res/css/_common.scss | 8 ++++++++ .../secretstorage/CreateSecretStorageDialog.js | 10 ++++++++-- src/components/views/dialogs/BaseDialog.js | 11 +++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/res/css/_common.scss b/res/css/_common.scss index 51d985efb7..abc57a95ed 100644 --- a/res/css/_common.scss +++ b/res/css/_common.scss @@ -338,6 +338,14 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { margin-bottom: 10px; } +.mx_Dialog_titleImage { + vertical-align: middle; + width: 25px; + height: 25px; + margin-left: -2px; + margin-right: 4px; +} + .mx_Dialog_title { font-size: 22px; line-height: 36px; diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index d75126687c..a56a1ee905 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -155,7 +155,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { } _doBootstrapUIAuth = async (makeRequest) => { - if (this.state.canUploadKeysWithPasswordOnly) { + if (this.state.canUploadKeysWithPasswordOnly && this.state.accountPassword) { await makeRequest({ type: 'm.login.password', identifier: { @@ -664,7 +664,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { case PHASE_DONE: return _t('Encryption upgraded'); default: - return null; + return ''; } } @@ -719,10 +719,16 @@ export default class CreateSecretStorageDialog extends React.PureComponent { } } + let headerImage; + if (this._titleForPhase(this.state.phase)) { + headerImage = require("../../../../../res/img/e2e/normal.svg"); + } + return (
    diff --git a/src/components/views/dialogs/BaseDialog.js b/src/components/views/dialogs/BaseDialog.js index 19f22a15ad..9238024b60 100644 --- a/src/components/views/dialogs/BaseDialog.js +++ b/src/components/views/dialogs/BaseDialog.js @@ -65,6 +65,9 @@ export default createReactClass({ // Title for the dialog. title: PropTypes.node.isRequired, + // Path to an icon to put in the header + headerImage: PropTypes.string, + // children should be the content of the dialog children: PropTypes.node, @@ -110,6 +113,13 @@ export default createReactClass({ ); } + let headerImage; + if (this.props.headerImage) { + headerImage = ; + } + return (
    + {headerImage} { this.props.title }
    { this.props.headerButton } From e1e53f567f93ab044f24bc195d40fa4046acd2fb Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 22 Jan 2020 11:56:27 +0000 Subject: [PATCH 099/906] add more tests --- .../views/rooms/SendMessageComposer.js | 3 +- .../views/rooms/SendMessageComposer-test.js | 83 +++++++++++++++++++ test/editor/mock.js | 10 +++ test/editor/model-test.js | 12 +-- 4 files changed, 96 insertions(+), 12 deletions(-) create mode 100644 test/components/views/rooms/SendMessageComposer-test.js diff --git a/src/components/views/rooms/SendMessageComposer.js b/src/components/views/rooms/SendMessageComposer.js index c4970c4570..a857e40f55 100644 --- a/src/components/views/rooms/SendMessageComposer.js +++ b/src/components/views/rooms/SendMessageComposer.js @@ -58,7 +58,8 @@ function addReplyToMessageContent(content, repliedToEvent, permalinkCreator) { } } -function createMessageContent(model, permalinkCreator) { +// exported for tests +export function createMessageContent(model, permalinkCreator) { const isEmote = containsEmote(model); if (isEmote) { model = stripEmoteCommand(model); diff --git a/test/components/views/rooms/SendMessageComposer-test.js b/test/components/views/rooms/SendMessageComposer-test.js new file mode 100644 index 0000000000..d5a143a1fb --- /dev/null +++ b/test/components/views/rooms/SendMessageComposer-test.js @@ -0,0 +1,83 @@ +/* +Copyright 2020 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 RoomViewStore from "../../../../src/stores/RoomViewStore"; +import {createMessageContent} from "../../../../src/components/views/rooms/SendMessageComposer"; +import EditorModel from "../../../../src/editor/model"; +import {createPartCreator, createRenderer} from "../../../editor/mock"; + +jest.mock("../../../../src/stores/RoomViewStore"); + +describe('', () => { + describe("createMessageContent", () => { + RoomViewStore.getQuotingEvent.mockReturnValue(false); + const permalinkCreator = jest.fn(); + + it("sends plaintext messages correctly", () => { + const model = new EditorModel([], createPartCreator(), createRenderer()); + model.update("hello world", "insertText", {offset: 11, atNodeEnd: true}); + + const content = createMessageContent(model, permalinkCreator); + + expect(content).toEqual({ + body: "hello world", + msgtype: "m.text", + }); + }); + + it("sends markdown messages correctly", () => { + const model = new EditorModel([], createPartCreator(), createRenderer()); + model.update("hello *world*", "insertText", {offset: 13, atNodeEnd: true}); + + const content = createMessageContent(model, permalinkCreator); + + expect(content).toEqual({ + body: "hello *world*", + msgtype: "m.text", + format: "org.matrix.custom.html", + formatted_body: "hello world", + }); + }); + + it("strips /me from messages and marks them as m.emote accordingly", () => { + const model = new EditorModel([], createPartCreator(), createRenderer()); + model.update("/me blinks __quickly__", "insertText", {offset: 22, atNodeEnd: true}); + + const content = createMessageContent(model, permalinkCreator); + + expect(content).toEqual({ + body: "blinks __quickly__", + msgtype: "m.emote", + format: "org.matrix.custom.html", + formatted_body: "blinks quickly", + }); + }); + + it("allows sending double-slash escaped slash commands correctly", () => { + const model = new EditorModel([], createPartCreator(), createRenderer()); + model.update("//dev/null is my favourite place", "insertText", {offset: 32, atNodeEnd: true}); + + const content = createMessageContent(model, permalinkCreator); + + expect(content).toEqual({ + body: "/dev/null is my favourite place", + msgtype: "m.text", + }); + }); + }); +}); + + diff --git a/test/editor/mock.js b/test/editor/mock.js index bb1a51d14b..6de65cf23d 100644 --- a/test/editor/mock.js +++ b/test/editor/mock.js @@ -67,3 +67,13 @@ export function createPartCreator(completions = []) { }; return new PartCreator(new MockRoom(), new MockClient(), autoCompleteCreator); } + +export function createRenderer() { + const render = (c) => { + render.caret = c; + render.count += 1; + }; + render.count = 0; + render.caret = null; + return render; +} diff --git a/test/editor/model-test.js b/test/editor/model-test.js index 826dde3d68..2a3584d508 100644 --- a/test/editor/model-test.js +++ b/test/editor/model-test.js @@ -15,17 +15,7 @@ limitations under the License. */ import EditorModel from "../../src/editor/model"; -import {createPartCreator} from "./mock"; - -function createRenderer() { - const render = (c) => { - render.caret = c; - render.count += 1; - }; - render.count = 0; - render.caret = null; - return render; -} +import {createPartCreator, createRenderer} from "./mock"; describe('editor/model', function() { describe('plain text manipulation', function() { From 832da062cccc814fe5748e60a9c71f03290a6eff Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 22 Jan 2020 13:37:27 +0000 Subject: [PATCH 100/906] Improve trailing spurious breaks + tests --- src/editor/deserialize.js | 2 +- src/editor/operations.js | 16 +++++--- test/editor/operations-test.js | 67 ++++++++++++++++++++++++++-------- 3 files changed, 63 insertions(+), 22 deletions(-) diff --git a/src/editor/deserialize.js b/src/editor/deserialize.js index 7ba4c3eda3..190963f357 100644 --- a/src/editor/deserialize.js +++ b/src/editor/deserialize.js @@ -250,7 +250,7 @@ function parseHtmlMessage(html, partCreator, isQuotedMessage) { } export function parsePlainTextMessage(body, partCreator, isQuotedMessage) { - const lines = body.split(/\r\n|\r|\n/g); // split on any new-line combination not just \n + const lines = body.split(/\r\n|\r|\n/g); // split on any new-line combination not just \n, collapses \r\n const parts = lines.reduce((parts, line, i) => { if (isQuotedMessage) { parts.push(partCreator.plain(QUOTE_LINE_PREFIX)); diff --git a/src/editor/operations.js b/src/editor/operations.js index 6bae60e6b8..d0115d9ca7 100644 --- a/src/editor/operations.js +++ b/src/editor/operations.js @@ -100,6 +100,10 @@ export function formatRangeAsCode(range) { replaceRangeAndExpandSelection(range, parts); } +// parts helper methods +const isBlank = part => !part.text || !/\S/.test(part.text); +const isNL = part => part.type === "newline"; + export function toggleInlineFormat(range, prefix, suffix = prefix) { const {model, parts} = range; const {partCreator} = model; @@ -113,14 +117,12 @@ export function toggleInlineFormat(range, prefix, suffix = prefix) { // - 2 newline parts in sequence // - newline part, plain(), newline part - const isBlank = part => !part.text || !/\S/.test(part.text); - const isNL = part => part.type === "newline"; - // bump startIndex onto the first non-blank after the paragraph ending if (isBlank(parts[i - 2]) && isNL(parts[i - 1]) && !isNL(parts[i]) && !isBlank(parts[i])) { startIndex = i; } + // if at a paragraph break, store the indexes of the paragraph if (isNL(parts[i - 1]) && isNL(parts[i])) { paragraphIndexes.push([startIndex, i - 1]); startIndex = i + 1; @@ -129,9 +131,11 @@ export function toggleInlineFormat(range, prefix, suffix = prefix) { startIndex = i + 1; } } - if (startIndex < parts.length) { - // TODO don't use parts.length here to clean up any trailing cruft - paragraphIndexes.push([startIndex, parts.length]); + + const lastNonEmptyPart = parts.map(isBlank).lastIndexOf(false); + // If we have not yet included the final paragraph then add it now + if (startIndex <= lastNonEmptyPart) { + paragraphIndexes.push([startIndex, lastNonEmptyPart + 1]); } // keep track of how many things we have inserted as an offset:=0 diff --git a/test/editor/operations-test.js b/test/editor/operations-test.js index 872cc78bdb..90a9812306 100644 --- a/test/editor/operations-test.js +++ b/test/editor/operations-test.js @@ -18,6 +18,8 @@ import EditorModel from "../../src/editor/model"; import {createPartCreator, createRenderer} from "./mock"; import {toggleInlineFormat} from "../../src/editor/operations"; +const SERIALIZED_NEWLINE = {"text": "\n", "type": "newline"}; + describe('editor/operations: formatting operations', () => { describe('toggleInlineFormat', () => { it('works for words', () => { @@ -93,17 +95,54 @@ describe('editor/operations: formatting operations', () => { expect(range.parts.map(p => p.text).join("")).toBe("world,\nhow"); expect(model.serializeParts()).toEqual([ {"text": "hello world,", "type": "plain"}, - {"text": "\n", "type": "newline"}, + SERIALIZED_NEWLINE, {"text": "how are you doing?", "type": "plain"}, ]); toggleInlineFormat(range, "**"); expect(model.serializeParts()).toEqual([ {"text": "hello **world,", "type": "plain"}, - {"text": "\n", "type": "newline"}, + SERIALIZED_NEWLINE, {"text": "how** are you doing?", "type": "plain"}, ]); }); + it('works for a paragraph with spurious breaks around it in selected range', () => { + const renderer = createRenderer(); + const pc = createPartCreator(); + const model = new EditorModel([ + pc.newline(), + pc.newline(), + pc.plain("hello world,"), + pc.newline(), + pc.plain("how are you doing?"), + pc.newline(), + pc.newline(), + ], pc, renderer); + + const range = model.startRange(model.positionForOffset(0, false), model.getPositionAtEnd()); // select-all + + expect(range.parts.map(p => p.text).join("")).toBe("\n\nhello world,\nhow are you doing?\n\n"); + expect(model.serializeParts()).toEqual([ + SERIALIZED_NEWLINE, + SERIALIZED_NEWLINE, + {"text": "hello world,", "type": "plain"}, + SERIALIZED_NEWLINE, + {"text": "how are you doing?", "type": "plain"}, + SERIALIZED_NEWLINE, + SERIALIZED_NEWLINE, + ]); + toggleInlineFormat(range, "**"); + expect(model.serializeParts()).toEqual([ + SERIALIZED_NEWLINE, + SERIALIZED_NEWLINE, + {"text": "**hello world,", "type": "plain"}, + SERIALIZED_NEWLINE, + {"text": "how are you doing?**", "type": "plain"}, + SERIALIZED_NEWLINE, + SERIALIZED_NEWLINE, + ]); + }); + it('works for multiple paragraph', () => { const renderer = createRenderer(); const pc = createPartCreator(); @@ -116,36 +155,34 @@ describe('editor/operations: formatting operations', () => { pc.plain("new paragraph"), ], pc, renderer); - let range = model.startRange(model.positionForOffset(0, true), - model.getPositionAtEnd()); // select-all + let range = model.startRange(model.positionForOffset(0, true), model.getPositionAtEnd()); // select-all expect(model.serializeParts()).toEqual([ {"text": "hello world,", "type": "plain"}, - {"text": "\n", "type": "newline"}, + SERIALIZED_NEWLINE, {"text": "how are you doing?", "type": "plain"}, - {"text": "\n", "type": "newline"}, - {"text": "\n", "type": "newline"}, + SERIALIZED_NEWLINE, + SERIALIZED_NEWLINE, {"text": "new paragraph", "type": "plain"}, ]); toggleInlineFormat(range, "__"); expect(model.serializeParts()).toEqual([ {"text": "__hello world,", "type": "plain"}, - {"text": "\n", "type": "newline"}, + SERIALIZED_NEWLINE, {"text": "how are you doing?__", "type": "plain"}, - {"text": "\n", "type": "newline"}, - {"text": "\n", "type": "newline"}, + SERIALIZED_NEWLINE, + SERIALIZED_NEWLINE, {"text": "__new paragraph__", "type": "plain"}, ]); - range = model.startRange(model.positionForOffset(0, true), - model.getPositionAtEnd()); // select-all + range = model.startRange(model.positionForOffset(0, true), model.getPositionAtEnd()); // select-all console.log("RANGE", range.parts); toggleInlineFormat(range, "__"); expect(model.serializeParts()).toEqual([ {"text": "hello world,", "type": "plain"}, - {"text": "\n", "type": "newline"}, + SERIALIZED_NEWLINE, {"text": "how are you doing?", "type": "plain"}, - {"text": "\n", "type": "newline"}, - {"text": "\n", "type": "newline"}, + SERIALIZED_NEWLINE, + SERIALIZED_NEWLINE, {"text": "new paragraph", "type": "plain"}, ]); }); From fbb65f068a6bb8d153ef65310ec52b886cfdc5ee Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 22 Jan 2020 14:07:16 +0000 Subject: [PATCH 101/906] Support admin configurable message when reporting content This adds support for an admin-configured message in config.json to be shown in the report content dialog to allow linking to community rules, etc. Fixes https://github.com/vector-im/riot-web/issues/11992 --- src/components/views/dialogs/ReportEventDialog.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/components/views/dialogs/ReportEventDialog.js b/src/components/views/dialogs/ReportEventDialog.js index e77bb0693b..2442bc2f95 100644 --- a/src/components/views/dialogs/ReportEventDialog.js +++ b/src/components/views/dialogs/ReportEventDialog.js @@ -20,6 +20,8 @@ import { _t } from '../../../languageHandler'; import PropTypes from "prop-types"; import {MatrixEvent} from "matrix-js-sdk"; import {MatrixClientPeg} from "../../../MatrixClientPeg"; +import SdkConfig from '../../../SdkConfig'; +import Markdown from '../../../Markdown'; /* * A dialog for reporting an event. @@ -95,6 +97,15 @@ export default class ReportEventDialog extends PureComponent { ); } + const adminMessageMD = + SdkConfig.get().reportEvent && + SdkConfig.get().reportEvent.adminMessageMD; + let adminMessage; + if (adminMessageMD) { + const html = new Markdown(adminMessageMD).toHTML(); + adminMessage =

    ; + } + return ( - + {adminMessage} Date: Wed, 22 Jan 2020 14:15:17 +0000 Subject: [PATCH 102/906] Change prepublish script to prepare prepublish is deprecated (prepare also runs for git checkouts, and lib will need to be built in this case). --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index aa2cf8bf8b..8f49eed4b5 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "typings": "./lib/index.d.ts", "matrix_src_main": "./src/index.js", "scripts": { - "prepublish": "yarn build", + "prepare": "yarn build", "i18n": "matrix-gen-i18n", "prunei18n": "matrix-prune-i18n", "diff-i18n": "cp src/i18n/strings/en_EN.json src/i18n/strings/en_EN_orig.json && ./scripts/gen-i18n.js && node scripts/compare-file.js src/i18n/strings/en_EN_orig.json src/i18n/strings/en_EN.json", From 516dd25797f4ad5c8fb53a6471ef65cf212879a7 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 22 Jan 2020 14:24:10 +0000 Subject: [PATCH 103/906] fix typo in fallback codepath --- src/components/views/rooms/SendMessageComposer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/rooms/SendMessageComposer.js b/src/components/views/rooms/SendMessageComposer.js index a857e40f55..6a60037036 100644 --- a/src/components/views/rooms/SendMessageComposer.js +++ b/src/components/views/rooms/SendMessageComposer.js @@ -187,7 +187,7 @@ export default class SendMessageComposer extends React.Component { // be extra resilient when somehow the AutocompleteWrapperModel or // CommandPartCreator fails to insert a command part, so we don't send // a command as a message - if (firstPart.text.startsWith("/") && firstPart.text.startsWith("//") && !firstPart.text.startsWith("//") + if (firstPart.text.startsWith("/") && !firstPart.text.startsWith("//") && (firstPart.type === "plain" || firstPart.type === "pill-candidate")) { return true; } From 088b1ea6285b544108cb4e122aced3449ab14082 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 22 Jan 2020 15:03:48 +0000 Subject: [PATCH 104/906] Retry end-to-end tests automatically once if they fail, flakey flake --- .buildkite/pipeline.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.buildkite/pipeline.yaml b/.buildkite/pipeline.yaml index de61d4e5b9..747625ae6e 100644 --- a/.buildkite/pipeline.yaml +++ b/.buildkite/pipeline.yaml @@ -77,6 +77,10 @@ steps: image: "matrixdotorg/riotweb-ci-e2etests-env:latest" propagate-environment: true workdir: "/workdir/matrix-react-sdk" + retry: + automatic: + - exit_status: 1 # retry end-to-end tests once as Puppeteer sometimes fails + - limit: 1 - label: "🔧 Riot Tests" agents: From e3a28e3e449a451a85710de272d32d26b47fab56 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 22 Jan 2020 15:05:25 +0000 Subject: [PATCH 105/906] Remove the react-sdk version I'm not sure if there was ever a point where this did work and we had 'dist' and 'gitHead' properties in our package.json but I can't find any trace of them now and I'm sick of this just being there syaing '' all the time. --- .../views/settings/tabs/user/HelpUserSettingsTab.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/components/views/settings/tabs/user/HelpUserSettingsTab.js b/src/components/views/settings/tabs/user/HelpUserSettingsTab.js index ab71de86b9..99b94d47f2 100644 --- a/src/components/views/settings/tabs/user/HelpUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/HelpUserSettingsTab.js @@ -26,10 +26,6 @@ import Modal from "../../../../../Modal"; import * as sdk from "../../../../../"; import PlatformPeg from "../../../../../PlatformPeg"; -// if this looks like a release, use the 'version' from package.json; else use -// the git sha. Prepend version with v, to look like riot-web version -const REACT_SDK_VERSION = 'dist' in packageJson ? packageJson.version : packageJson.gitHead || ''; - // Simple method to help prettify GH Release Tags and Commit Hashes. const semVerRegex = /^v?(\d+\.\d+\.\d+(?:-rc.+)?)(?:-(?:\d+-g)?([0-9a-fA-F]+))?(?:-dirty)?$/i; const ghVersionLabel = function(repo, token='') { @@ -188,9 +184,6 @@ export default class HelpUserSettingsTab extends React.Component { ); } - const reactSdkVersion = REACT_SDK_VERSION !== '' - ? ghVersionLabel('matrix-org/matrix-react-sdk', REACT_SDK_VERSION) - : REACT_SDK_VERSION; const vectorVersion = this.state.vectorVersion ? ghVersionLabel('vector-im/riot-web', this.state.vectorVersion) : 'unknown'; @@ -243,7 +236,6 @@ export default class HelpUserSettingsTab extends React.Component {

    {_t("Versions")}
    - {_t("matrix-react-sdk version:")} {reactSdkVersion}
    {_t("riot-web version:")} {vectorVersion}
    {_t("olm version:")} {olmVersion}
    {updateButton} From d04ba40efe49ef31f757e823a99f44fc9650e9ff Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 22 Jan 2020 15:05:40 +0000 Subject: [PATCH 106/906] fix syntax --- .buildkite/pipeline.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.buildkite/pipeline.yaml b/.buildkite/pipeline.yaml index 747625ae6e..f5f63b647a 100644 --- a/.buildkite/pipeline.yaml +++ b/.buildkite/pipeline.yaml @@ -80,7 +80,7 @@ steps: retry: automatic: - exit_status: 1 # retry end-to-end tests once as Puppeteer sometimes fails - - limit: 1 + limit: 1 - label: "🔧 Riot Tests" agents: From 735ba4fd33d7fcdfb5e6e36141176f20f99395dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Wed, 22 Jan 2020 16:11:54 +0100 Subject: [PATCH 107/906] EventIndex: Correctly populate events on initial fill requests. --- src/components/structures/FilePanel.js | 2 +- src/indexing/EventIndex.js | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/components/structures/FilePanel.js b/src/components/structures/FilePanel.js index 71e8143f0a..c96f8770ad 100644 --- a/src/components/structures/FilePanel.js +++ b/src/components/structures/FilePanel.js @@ -98,7 +98,7 @@ const FilePanel = createReactClass({ if (client.isRoomEncrypted(roomId) && eventIndex !== null) { const timeline = timelineSet.getLiveTimeline(); - await eventIndex.populateFileTimeline(timelineSet, timeline, room, 1); + await eventIndex.populateFileTimeline(timelineSet, timeline, room, 10); } this.setState({ timelineSet: timelineSet }); diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index c081440233..93c640cf8e 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -476,6 +476,16 @@ export default class EventIndex { fromEvent = null, direction = EventTimeline.BACKWARDS) { const matrixEvents = await this.loadFileEvents(room, limit, fromEvent, direction); + // If this is a normal fill request, not a pagination request, we need + // to get our events in the BACKWARDS direction but populate them in the + // forwards direction. + // This needs to happen because a fill request might come with an + // exisitng timeline e.g. if you close and re-open the FilePanel. + if (fromEvent === null) { + matrixEvents.reverse(); + direction = direction == EventTimeline.BACKWARDS ? EventTimeline.FORWARDS: EventTimeline.BACKWARDS; + } + // Add the events to the live timeline of the file panel. matrixEvents.forEach(e => { if (!timelineSet.eventIdToTimeline(e.getId())) { From c04872dd9b6974e334dca1286a69c422bc8ccaf9 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 22 Jan 2020 15:12:38 +0000 Subject: [PATCH 108/906] i18n --- src/i18n/strings/en_EN.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 4daf7cd29e..d19cbb9bfd 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -687,7 +687,6 @@ "Clear cache and reload": "Clear cache and reload", "FAQ": "FAQ", "Versions": "Versions", - "matrix-react-sdk version:": "matrix-react-sdk version:", "riot-web version:": "riot-web version:", "olm version:": "olm version:", "Homeserver is": "Homeserver is", From 7e52eb9f65374ffcb0bc9cba99ea8c3d16ecd51b Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 22 Jan 2020 15:16:41 +0000 Subject: [PATCH 109/906] Unused import --- src/components/views/settings/tabs/user/HelpUserSettingsTab.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/views/settings/tabs/user/HelpUserSettingsTab.js b/src/components/views/settings/tabs/user/HelpUserSettingsTab.js index 99b94d47f2..a245c7c7b9 100644 --- a/src/components/views/settings/tabs/user/HelpUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/HelpUserSettingsTab.js @@ -21,7 +21,6 @@ import {MatrixClientPeg} from "../../../../../MatrixClientPeg"; import AccessibleButton from "../../../elements/AccessibleButton"; import SdkConfig from "../../../../../SdkConfig"; import createRoom from "../../../../../createRoom"; -import packageJson from "../../../../../../package.json"; import Modal from "../../../../../Modal"; import * as sdk from "../../../../../"; import PlatformPeg from "../../../../../PlatformPeg"; From f917c2faea6fabd118bbf08251b9e341c793c740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Wed, 22 Jan 2020 16:21:11 +0100 Subject: [PATCH 110/906] FilePanel: Listen for live events and add them to an open FilePanel. --- src/components/structures/FilePanel.js | 57 ++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/src/components/structures/FilePanel.js b/src/components/structures/FilePanel.js index c96f8770ad..a25f8babd1 100644 --- a/src/components/structures/FilePanel.js +++ b/src/components/structures/FilePanel.js @@ -30,6 +30,7 @@ import { _t } from '../../languageHandler'; */ const FilePanel = createReactClass({ displayName: 'FilePanel', + decryptingEvents: new Set(), propTypes: { roomId: PropTypes.string.isRequired, @@ -41,8 +42,64 @@ const FilePanel = createReactClass({ }; }, + onRoomTimeline (ev, room, toStartOfTimeline, removed, data) { + if (room.roomId !== this.props.roomId) return; + if (toStartOfTimeline || !data || !data.liveEvent || ev.isRedacted()) return; + + if (ev.isBeingDecrypted()) { + this.decryptingEvents.add(ev.getId()); + } else { + this.addEncryptedLiveEvent(ev); + } + }, + + onEventDecrypted (ev, err) { + if (ev.getRoomId() !== this.props.roomId) return; + const eventId = ev.getId(); + + if (!this.decryptingEvents.delete(eventId)) return; + if (err) return; + + this.addEncryptedLiveEvent(ev); + }, + + addEncryptedLiveEvent(ev, toStartOfTimeline) { + if (!this.state.timelineSet) return; + + const timeline = this.state.timelineSet.getLiveTimeline(); + if (ev.getType() !== "m.room.message") return; + if (["m.file", "m.image", "m.video", "m.audio"].indexOf(ev.getContent().msgtype) == -1) { + return; + } + + if (!this.state.timelineSet.eventIdToTimeline(ev.getId())) { + this.state.timelineSet.addEventToTimeline(ev, timeline, false); + } + }, + async componentDidMount() { + const client = MatrixClientPeg.get(); + await this.updateTimelineSet(this.props.roomId); + + if (!MatrixClientPeg.get().isRoomEncrypted(this.props.roomId)) return; + + if (EventIndexPeg.get() !== null) { + client.on('Room.timeline', this.onRoomTimeline.bind(this)); + client.on('Event.decrypted', this.onEventDecrypted.bind(this)); + } + }, + + componentWillUnmount() { + const client = MatrixClientPeg.get(); + if (client === null) return; + + if (!MatrixClientPeg.get().isRoomEncrypted(this.props.roomId)) return; + + if (EventIndexPeg.get() !== null) { + client.removeListener('Room.timeline', this.onRoomTimeline.bind(this)); + client.removeListener('Event.decrypted', this.onEventDecrypted.bind(this)); + } }, async fetchFileEventsServer(room) { From c5e8753b0535d898961e4e8a0d3d469a86d39fe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Wed, 22 Jan 2020 16:26:40 +0100 Subject: [PATCH 111/906] FilePanel: Don't import the whole of the js-sdk. --- src/components/structures/FilePanel.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/structures/FilePanel.js b/src/components/structures/FilePanel.js index a25f8babd1..7ee86436a5 100644 --- a/src/components/structures/FilePanel.js +++ b/src/components/structures/FilePanel.js @@ -19,7 +19,7 @@ import React from 'react'; import createReactClass from 'create-react-class'; import PropTypes from 'prop-types'; -import Matrix from 'matrix-js-sdk'; +import {Filter} from 'matrix-js-sdk'; import * as sdk from '../../index'; import {MatrixClientPeg} from '../../MatrixClientPeg'; import EventIndexPeg from "../../indexing/EventIndexPeg"; @@ -105,7 +105,7 @@ const FilePanel = createReactClass({ async fetchFileEventsServer(room) { const client = MatrixClientPeg.get(); - const filter = new Matrix.Filter(client.credentials.userId); + const filter = new Filter(client.credentials.userId); filter.setDefinition( { "room": { From c3418df9197ba46b9275f22e600997ae089f26f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Wed, 22 Jan 2020 16:31:49 +0100 Subject: [PATCH 112/906] FilePanel: Remove whitespace before two function definitions. --- src/components/structures/FilePanel.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/structures/FilePanel.js b/src/components/structures/FilePanel.js index 7ee86436a5..e03c587e61 100644 --- a/src/components/structures/FilePanel.js +++ b/src/components/structures/FilePanel.js @@ -42,7 +42,7 @@ const FilePanel = createReactClass({ }; }, - onRoomTimeline (ev, room, toStartOfTimeline, removed, data) { + onRoomTimeline(ev, room, toStartOfTimeline, removed, data) { if (room.roomId !== this.props.roomId) return; if (toStartOfTimeline || !data || !data.liveEvent || ev.isRedacted()) return; @@ -53,7 +53,7 @@ const FilePanel = createReactClass({ } }, - onEventDecrypted (ev, err) { + onEventDecrypted(ev, err) { if (ev.getRoomId() !== this.props.roomId) return; const eventId = ev.getId(); From 33b5d42c0687185ca02c1661e22e4d49dfcdb867 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 22 Jan 2020 15:34:17 +0000 Subject: [PATCH 113/906] Be consistent about our settings svg, free the other one --- res/css/structures/_GroupView.scss | 2 +- res/img/icons-settings-room.svg | 6 ------ src/components/views/context_menus/RoomTileContextMenu.js | 2 +- 3 files changed, 2 insertions(+), 8 deletions(-) delete mode 100644 res/img/icons-settings-room.svg diff --git a/res/css/structures/_GroupView.scss b/res/css/structures/_GroupView.scss index 4ec53a3c9a..517b8b1922 100644 --- a/res/css/structures/_GroupView.scss +++ b/res/css/structures/_GroupView.scss @@ -63,7 +63,7 @@ limitations under the License. } .mx_GroupHeader_editButton::before { - mask-image: url('$(res)/img/icons-settings-room.svg'); + mask-image: url('$(res)/img/feather-customised/settings.svg'); } .mx_GroupHeader_shareButton::before { diff --git a/res/img/icons-settings-room.svg b/res/img/icons-settings-room.svg deleted file mode 100644 index 421eefdefa..0000000000 --- a/res/img/icons-settings-room.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/components/views/context_menus/RoomTileContextMenu.js b/src/components/views/context_menus/RoomTileContextMenu.js index 6e2bd8ebf5..2d8dec29c7 100644 --- a/src/components/views/context_menus/RoomTileContextMenu.js +++ b/src/components/views/context_menus/RoomTileContextMenu.js @@ -306,7 +306,7 @@ export default createReactClass({ return (
    - + { _t('Settings') }
    From 9706114bb571a903fd607838229717fe767fe465 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 22 Jan 2020 16:54:31 +0000 Subject: [PATCH 114/906] move E2E_STATE to E2EIcon to simplify imports --- src/components/views/rooms/E2EIcon.js | 18 +++++++++++++----- src/components/views/rooms/EventTile.js | 8 +------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/components/views/rooms/E2EIcon.js b/src/components/views/rooms/E2EIcon.js index 545d1fd7ed..6ee20023ff 100644 --- a/src/components/views/rooms/E2EIcon.js +++ b/src/components/views/rooms/E2EIcon.js @@ -14,22 +14,30 @@ See the License for the specific language governing permissions and limitations under the License. */ +import React from "react"; import classNames from 'classnames'; import { _t } from '../../../languageHandler'; import AccessibleButton from '../elements/AccessibleButton'; import SettingsStore from '../../../settings/SettingsStore'; +export const E2E_STATE = { + VERIFIED: "verified", + WARNING: "warning", + UNKNOWN: "unknown", + NORMAL: "normal", +}; + export default function(props) { - const { isUser } = props; - const isNormal = props.status === "normal"; - const isWarning = props.status === "warning"; - const isVerified = props.status === "verified"; + const { isUser, status, className } = props; + const isNormal = status === E2E_STATE.NORMAL; + const isWarning = status === E2E_STATE.WARNING; + const isVerified = status === E2E_STATE.VERIFIED; const e2eIconClasses = classNames({ mx_E2EIcon: true, mx_E2EIcon_warning: isWarning, mx_E2EIcon_normal: isNormal, mx_E2EIcon_verified: isVerified, - }, props.className); + }, className); let e2eTitle; const crossSigning = SettingsStore.isFeatureEnabled("feature_cross_signing"); diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index 634b77c9e1..940515f02e 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -33,6 +33,7 @@ import {MatrixClientPeg} from '../../../MatrixClientPeg'; import {ALL_RULE_TYPES} from "../../../mjolnir/BanList"; import * as ObjectUtils from "../../../ObjectUtils"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; +import {E2E_STATE} from "./E2EIcon"; const eventTileTypes = { 'm.room.message': 'messages.MessageEvent', @@ -66,13 +67,6 @@ const stateEventTileTypes = { 'm.room.related_groups': 'messages.TextualEvent', }; -const E2E_STATE = { - VERIFIED: "verified", - WARNING: "warning", - UNKNOWN: "unknown", - NORMAL: "normal", -}; - // Add all the Mjolnir stuff to the renderer for (const evType of ALL_RULE_TYPES) { stateEventTileTypes[evType] = 'messages.TextualEvent'; From b7d1c17ad1453c237e99e3bd87d1fdb722bb01d7 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 22 Jan 2020 16:56:27 +0000 Subject: [PATCH 115/906] simple optimization to bail out of check on first failure --- src/components/structures/RoomView.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 9b02f6d503..23d3002faa 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -812,10 +812,10 @@ export default createReactClass({ /* Check all verified user devices. */ for (const userId of verified) { const devices = await cli.getStoredDevicesForUser(userId); - const allDevicesVerified = devices.every(({deviceId}) => { - return cli.checkDeviceTrust(userId, deviceId).isVerified(); + const anyDeviceNotVerified = devices.some(({deviceId}) => { + return !cli.checkDeviceTrust(userId, deviceId).isVerified(); }); - if (!allDevicesVerified) { + if (anyDeviceNotVerified) { this.setState({ e2eStatus: "warning", }); From 78654cc69308641142b355ad601a7fd071ed8b8f Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 22 Jan 2020 18:08:39 +0000 Subject: [PATCH 116/906] Updated visuals for cross-signing bootstrap * Use Fields rather than plain inputs * Update padding & alignment to match designs * Add Skip buttons * Update copy as per designs Part of https://github.com/vector-im/riot-web/issues/11902 Based on https://github.com/matrix-org/matrix-react-sdk/pull/3897 --- .../_CreateSecretStorageDialog.scss | 20 ++--- .../CreateSecretStorageDialog.js | 88 ++++++++++--------- src/i18n/strings/en_EN.json | 18 ++-- 3 files changed, 65 insertions(+), 61 deletions(-) diff --git a/res/css/views/dialogs/secretstorage/_CreateSecretStorageDialog.scss b/res/css/views/dialogs/secretstorage/_CreateSecretStorageDialog.scss index 5899abdf73..ed5aaa05a3 100644 --- a/res/css/views/dialogs/secretstorage/_CreateSecretStorageDialog.scss +++ b/res/css/views/dialogs/secretstorage/_CreateSecretStorageDialog.scss @@ -1,6 +1,6 @@ /* Copyright 2018 New Vector Ltd -Copyright 2019 The Matrix.org Foundation C.I.C. +Copyright 2019, 2020 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,7 +22,7 @@ limitations under the License. .mx_CreateSecretStorageDialog_primaryContainer { /* FIXME: plinth colour in new theme(s). background-color: $accent-color; */ - padding: 20px; + padding-top: 20px; } .mx_CreateSecretStorageDialog_primaryContainer::after { @@ -36,9 +36,13 @@ limitations under the License. align-items: flex-start; } +.mx_Field.mx_CreateSecretStorageDialog_passPhraseField { + margin-top: 0px; +} + .mx_CreateSecretStorageDialog_passPhraseHelp { flex: 1; - height: 85px; + height: 64px; margin-left: 20px; font-size: 80%; } @@ -47,16 +51,8 @@ limitations under the License. width: 100%; } -.mx_CreateSecretStorageDialog_passPhraseInput { - flex: none; - width: 250px; - border: 1px solid $accent-color; - border-radius: 5px; - padding: 10px; - margin-bottom: 1em; -} - .mx_CreateSecretStorageDialog_passPhraseMatch { + width: 200px; margin-left: 20px; } diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index a56a1ee905..e3516d1245 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -405,6 +405,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { _renderPhasePassPhrase() { const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); + const Field = sdk.getComponent('views.elements.Field'); let strengthMeter; let helpText; @@ -430,39 +431,39 @@ export default class CreateSecretStorageDialog extends React.PureComponent { return

    {_t( - "Warning: You should only set up secret storage from a trusted computer.", {}, - { b: sub => {sub} }, + "Set up encryption on this device to allow it to verify other devices, " + + "granting them access to encrypted messages and marking them as trusted for other users.", )}

    {_t( - "We'll use secret storage to optionally store an encrypted copy of " + - "your cross-signing identity for verifying other devices and message " + - "keys on our server. Protect your access to encrypted messages with a " + - "passphrase to keep it secure.", + "Secure your encryption keys with a passphrase. For maximum security " + + "this should be different to your account password:" )}

    -

    {_t("For maximum security, this should be different from your account password.")}

    -
    -
    - -
    - {strengthMeter} - {helpText} -
    +
    + +
    + {strengthMeter} + {helpText}
    - + > + +
    {_t("Advanced")} @@ -475,6 +476,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { _renderPhasePassPhraseConfirm() { const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); + const Field = sdk.getComponent('views.elements.Field'); let matchText; if (this.state.passPhraseConfirm === this.state.passPhrase) { @@ -492,7 +494,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { let passPhraseMatch = null; if (matchText) { - passPhraseMatch =
    + passPhraseMatch =
    {matchText}
    @@ -504,28 +506,32 @@ export default class CreateSecretStorageDialog extends React.PureComponent { const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); return

    {_t( - "Please enter your passphrase a second time to confirm.", + "Enter your passphrase a second time to confirm it.", )}

    -
    -
    -
    - -
    +
    + +
    {passPhraseMatch}
    - + > + +
    ; } @@ -650,9 +656,9 @@ export default class CreateSecretStorageDialog extends React.PureComponent { case PHASE_MIGRATE: return _t('Upgrade your encryption'); case PHASE_PASSPHRASE: - return _t('Secure your encrypted messages with a passphrase'); + return _t('Set up encryption'); case PHASE_PASSPHRASE_CONFIRM: - return _t('Confirm your passphrase'); + return _t('Confirm passphrase'); case PHASE_OPTOUT_CONFIRM: return _t('Warning!'); case PHASE_SHOWKEY: diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 29ce36a814..a49a8269df 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1976,16 +1976,15 @@ "You'll need to authenticate with the server to confirm the upgrade.": "You'll need to authenticate with the server to confirm the upgrade.", "Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.", "Great! This passphrase looks strong enough.": "Great! This passphrase looks strong enough.", - "Warning: You should only set up secret storage from a trusted computer.": "Warning: You should only set up secret storage from a trusted computer.", - "We'll use secret storage to optionally store an encrypted copy of your cross-signing identity for verifying other devices and message keys on our server. Protect your access to encrypted messages with a passphrase to keep it secure.": "We'll use secret storage to optionally store an encrypted copy of your cross-signing identity for verifying other devices and message keys on our server. Protect your access to encrypted messages with a passphrase to keep it secure.", - "For maximum security, this should be different from your account password.": "For maximum security, this should be different from your account password.", - "Enter a passphrase...": "Enter a passphrase...", + "Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.", + "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:", + "Enter a passphrase": "Enter a passphrase", "Set up with a recovery key": "Set up with a recovery key", "That matches!": "That matches!", "That doesn't match.": "That doesn't match.", "Go back to set it again.": "Go back to set it again.", - "Please enter your passphrase a second time to confirm.": "Please enter your passphrase a second time to confirm.", - "Repeat your passphrase...": "Repeat your passphrase...", + "Enter your passphrase a second time to confirm it.": "Enter your passphrase a second time to confirm it.", + "Confirm your passphrase": "Confirm your passphrase", "As a safety net, you can use it to restore your access to encrypted messages if you forget your passphrase.": "As a safety net, you can use it to restore your access to encrypted messages if you forget your passphrase.", "As a safety net, you can use it to restore your access to encrypted messages.": "As a safety net, you can use it to restore your access to encrypted messages.", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.", @@ -2004,8 +2003,7 @@ "Set up secret storage": "Set up secret storage", "Restore your Key Backup": "Restore your Key Backup", "Upgrade your encryption": "Upgrade your encryption", - "Secure your encrypted messages with a passphrase": "Secure your encrypted messages with a passphrase", - "Confirm your passphrase": "Confirm your passphrase", + "Set up encryption": "Set up encryption", "Recovery key": "Recovery key", "Keep it safe": "Keep it safe", "Storing secrets...": "Storing secrets...", @@ -2013,7 +2011,11 @@ "Unable to set up secret storage": "Unable to set up secret storage", "Retry": "Retry", "We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.": "We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.", + "For maximum security, this should be different from your account password.": "For maximum security, this should be different from your account password.", + "Enter a passphrase...": "Enter a passphrase...", "Set up with a Recovery Key": "Set up with a Recovery Key", + "Please enter your passphrase a second time to confirm.": "Please enter your passphrase a second time to confirm.", + "Repeat your passphrase...": "Repeat your passphrase...", "As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.": "As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.", "As a safety net, you can use it to restore your encrypted message history.": "As a safety net, you can use it to restore your encrypted message history.", "Your keys are being backed up (the first backup could take a few minutes).": "Your keys are being backed up (the first backup could take a few minutes).", From 30b0663eb0aa96974e84c89365e4dd8340d66e28 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 22 Jan 2020 18:15:35 +0000 Subject: [PATCH 117/906] lint --- .../views/dialogs/secretstorage/CreateSecretStorageDialog.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index e3516d1245..932f6e30e4 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -436,7 +436,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { )}

    {_t( "Secure your encryption keys with a passphrase. For maximum security " + - "this should be different to your account password:" + "this should be different to your account password:", )}

    From cf5673be17de09afecc33450fb5b769ed967ab0d Mon Sep 17 00:00:00 2001 From: Szimszon Date: Wed, 22 Jan 2020 16:04:17 +0000 Subject: [PATCH 118/906] Translated using Weblate (Hungarian) Currently translated at 100.0% (2042 of 2042 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index f6c85e1674..fa7528a397 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -2081,5 +2081,10 @@ "For extra security, verify this user by checking a one-time code on both of your devices.": "A biztonság fokozásáért ellenőrizd ezt a felhasználót egy egyszeri kód egyeztetésével mindkettőtök készülékén.", "For maximum security, do this in person.": "A legnagyobb biztonság érdekében ezt személyesen tedd meg.", "Start Verification": "Ellenőrzés elindítása", - "Encrypted by a deleted device": "Egy már törölt eszköz titkosította" + "Encrypted by a deleted device": "Egy már törölt eszköz titkosította", + "Unknown Command": "Ismeretlen Parancs", + "Unrecognised command: %(commandText)s": "Ismeretlen parancs: %(commandText)s", + "You can use /help to list available commands. Did you mean to send this as a message?": "Használhatod a /help-et az elérhető parancsok kilistázásához. Ezt üzenetként akartad küldeni?", + "Hint: Begin your message with // to start it with a slash.": "Tipp: Ez üzenetedet kezd ezzel: //, ha perjellel szeretnéd kezdeni.", + "Send as message": "Üzenet küldése" } From 78ed8019d49426ee0c80406cc281f256a7b93cf1 Mon Sep 17 00:00:00 2001 From: catborise Date: Wed, 22 Jan 2020 18:29:10 +0000 Subject: [PATCH 119/906] Translated using Weblate (Turkish) Currently translated at 72.6% (1482 of 2042 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/tr/ --- src/i18n/strings/tr.json | 46 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 5d83ff5b06..21ccf03a46 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -1452,5 +1452,49 @@ "Please provide a room alias": "Lütfen bir oda lakabı belirtin", "This alias is available to use": "Bu lakap kullanmaya uygun", "This alias is already in use": "Bu lakap zaten kullanımda", - "And %(count)s more...|other": "ve %(count)s kez daha..." + "And %(count)s more...|other": "ve %(count)s kez daha...", + "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.": "Alternatif olarak,turn.matrix.org adresindeki herkese açık sunucuyu kullanmayı deneyebilirsiniz. Fakat bu güvenilir olmayabilir. IP adresiniz bu sunucu ile paylaşılacaktır. Ayarlardan yönetebilirsiniz.", + "An error ocurred whilst trying to remove the widget from the room": "Görsel bileşen odadan silinmeye çalışılırken bir hata oluştu", + "Minimize apps": "Uygulamaları küçült", + "Maximize apps": "Uygulamaları büyült", + "Popout widget": "Görsel bileşeni göster", + "Please create a new issue on GitHub so that we can investigate this bug.": "Lütfen GitHub’da Yeni bir talep oluşturun ki bu hatayı inceleyebilelim.", + "Rotate counter-clockwise": "Saat yönünün tersine döndür", + "Language Dropdown": "Dil Listesi", + "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s, %(count)s kez ayrıldı", + "%(oneUser)sleft %(count)s times|other": "%(oneUser)s %(count)s kez ayrıldı", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s %(count)s kez katılıp ve ayrıldı", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s %(count)s kez katıldı ve ayrıldı", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s ayrıldı ve yeniden katıldı", + "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s %(count)s kez davetlerini reddetti", + "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s davetlerini reddetti", + "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)s davetlerini reddetti", + "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)s davetlerini geri çekti", + "%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)s davetini %(count)s kez geri çekti", + "%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)s davetini geri çekti", + "were banned %(count)s times|other": "%(count)s kez yasaklandı", + "were banned %(count)s times|one": "yasaklandı", + "was banned %(count)s times|other": "%(count)s kez yasaklandı", + "was banned %(count)s times|one": "yasaklandı", + "were unbanned %(count)s times|other": "%(count)s kez yasak kaldırıldı", + "were unbanned %(count)s times|one": "yasak kaldırıldı", + "was unbanned %(count)s times|other": "%(count)s kez yasak kaldırıldı", + "was unbanned %(count)s times|one": "yasak kaldırıldı", + "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s resimlerini değiştirdiler", + "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)s %(count)s kez resmini değiştirdi", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s resmini değiştirdi", + "%(severalUsers)smade no changes %(count)s times|other": "%(severalUsers)s %(count)s kez hiç bir değişiklik yapmadı", + "Try using one of the following valid address types: %(validTypesList)s.": "Takip eden geçerli adres tiplerinden birini kullanmayı deneyin: %(validTypesList)s.", + "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "E-posta ile davet etmek için bir kimlik sunucusu kullan. Varsayılanı kullan (%(defaultIdentityServerName)s ya da Ayarlar kullanarak yönetin.", + "Use an identity server to invite by email. Manage in Settings.": "E-posta ile davet için bir kimlik sunucu kullan. Ayarlar dan yönet.", + "The following users may not exist": "Belirtilen kullanıcılar mevcut olmayabilir", + "Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?": "Altta belirtilen Matrix ID li profiller bulunamıyor - Onları yinede davet etmek ister misiniz?", + "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Lütfen neyin yanlış gittiğini bize bildirin ya da en güzeli problemi tanımlayan bir GitHub talebi oluşturun.", + "Before submitting logs, you must create a GitHub issue to describe your problem.": "Logları göndermeden önce, probleminizi betimleyen bir GitHub talebi oluşturun.", + "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Topluluk ID leri sadece a-z, 0-9 ya da '=_-./' karakterlerini içerebilir", + "Set a room alias to easily share your room with other people.": "Odanızı diğer kişilerle kolayca paylaşabilmek için bir oda lakabı ayarların.", + "Create a public room": "Halka açık bir oda oluşturun", + "Make this room public": "Bu odayı halka açık yap", + "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 Riot to do this": "Sohbet tarihçesini kaybetmemek için, çıkmadan önce odanızın anahtarlarını dışarıya aktarın. Bunu yapabilmek için Riotun daha yeni sürümü gerekli. Ulaşmak için geri gitmeye ihtiyacınız var", + "Continue With Encryption Disabled": "Şifreleme Kapalı Şekilde Devam Et" } From a504faa2f6f80fa879d46e10009c45e4474aa257 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 22 Jan 2020 22:08:34 +0000 Subject: [PATCH 120/906] Treat links as external in report content admin message This marks all the links in the report content admin message (in Markdown format) as external so they open in a new tab. --- src/Markdown.js | 20 ++++++++++++++++++- .../views/dialogs/ReportEventDialog.js | 2 +- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/Markdown.js b/src/Markdown.js index acfea52100..437ceec88b 100644 --- a/src/Markdown.js +++ b/src/Markdown.js @@ -91,7 +91,7 @@ export default class Markdown { return true; } - toHTML() { + toHTML({ externalLinks = false } = {}) { const renderer = new commonmark.HtmlRenderer({ safe: false, @@ -125,6 +125,24 @@ export default class Markdown { } }; + renderer.link = function(node, entering) { + const attrs = this.attrs(node); + if (entering) { + attrs.push(['href', this.esc(node.destination)]); + if (node.title) { + attrs.push(['title', this.esc(node.title)]); + } + // Modified link behaviour to treat them all as external and + // thus opening in a new tab. + if (externalLinks) { + attrs.push(['target', '_blank']); + attrs.push(['rel', 'noopener']); + } + this.tag('a', attrs); + } else { + this.tag('/a'); + } + }; renderer.html_inline = html_if_tag_allowed; diff --git a/src/components/views/dialogs/ReportEventDialog.js b/src/components/views/dialogs/ReportEventDialog.js index 2442bc2f95..99853582dd 100644 --- a/src/components/views/dialogs/ReportEventDialog.js +++ b/src/components/views/dialogs/ReportEventDialog.js @@ -102,7 +102,7 @@ export default class ReportEventDialog extends PureComponent { SdkConfig.get().reportEvent.adminMessageMD; let adminMessage; if (adminMessageMD) { - const html = new Markdown(adminMessageMD).toHTML(); + const html = new Markdown(adminMessageMD).toHTML({ externalLinks: true }); adminMessage =

    ; } From 054ebb9458ec5fe79d0ec958d8daef2ac919c26d Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 22 Jan 2020 21:07:29 -0700 Subject: [PATCH 121/906] Fix scrollable area and padding in user lists dialog --- res/css/views/dialogs/_InviteDialog.scss | 15 +++++++++++++++ src/components/views/dialogs/InviteDialog.js | 8 +++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/res/css/views/dialogs/_InviteDialog.scss b/res/css/views/dialogs/_InviteDialog.scss index 221ad7d48c..71fab50339 100644 --- a/res/css/views/dialogs/_InviteDialog.scss +++ b/res/css/views/dialogs/_InviteDialog.scss @@ -210,4 +210,19 @@ limitations under the License. .mx_InviteDialog { // Prevent the dialog from jumping around randomly when elements change. height: 590px; + padding-left: 20px; // the design wants some padding on the left +} + +.mx_InviteDialog_userSections { + margin-top: 10px; + overflow-y: auto; + padding-right: 45px; + height: 455px; // mx_InviteDialog's height minus some for the upper elements +} + +// Right margin for the design. We could apply this to the whole dialog, but then the scrollbar +// for the user section gets weird. +.mx_InviteDialog_helpText, +.mx_InviteDialog_addressBar { + margin-right: 45px; } diff --git a/src/components/views/dialogs/InviteDialog.js b/src/components/views/dialogs/InviteDialog.js index 703b0b5121..cb4f123cea 100644 --- a/src/components/views/dialogs/InviteDialog.js +++ b/src/components/views/dialogs/InviteDialog.js @@ -970,7 +970,7 @@ export default class InviteDialog extends React.PureComponent { title={title} >

    -

    {helpText}

    +

    {helpText}

    {this._renderEditor()}
    @@ -987,8 +987,10 @@ export default class InviteDialog extends React.PureComponent {
    {this._renderIdentityServerWarning()}
    {this.state.errorText}
    - {this._renderSection('recents')} - {this._renderSection('suggestions')} +
    + {this._renderSection('recents')} + {this._renderSection('suggestions')} +
    ); From 139b5663fe4015934d3833bdfe0cdf9b4e756ada Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 22 Jan 2020 21:14:53 -0700 Subject: [PATCH 122/906] Remove user lists feature flag, making it the default Fixes https://github.com/vector-im/riot-web/issues/11201 --- src/RoomInvite.js | 156 +++------------------------------------ src/settings/Settings.js | 6 -- 2 files changed, 12 insertions(+), 150 deletions(-) diff --git a/src/RoomInvite.js b/src/RoomInvite.js index 2eccf69b0f..839d677069 100644 --- a/src/RoomInvite.js +++ b/src/RoomInvite.js @@ -20,13 +20,8 @@ import React from 'react'; import {MatrixClientPeg} from './MatrixClientPeg'; import MultiInviter from './utils/MultiInviter'; import Modal from './Modal'; -import { getAddressType } from './UserAddress'; -import createRoom from './createRoom'; import * as sdk from './'; -import dis from './dispatcher'; -import DMRoomMap from './utils/DMRoomMap'; import { _t } from './languageHandler'; -import SettingsStore from "./settings/SettingsStore"; import {KIND_DM, KIND_INVITE} from "./components/views/dialogs/InviteDialog"; /** @@ -44,64 +39,21 @@ export function inviteMultipleToRoom(roomId, addrs) { } export function showStartChatInviteDialog() { - if (SettingsStore.isFeatureEnabled("feature_ftue_dms")) { - // This new dialog handles the room creation internally - we don't need to worry about it. - const InviteDialog = sdk.getComponent("dialogs.InviteDialog"); - Modal.createTrackedDialog( - 'Start DM', '', InviteDialog, {kind: KIND_DM}, - /*className=*/null, /*isPriority=*/false, /*isStatic=*/true, - ); - return; - } - - const AddressPickerDialog = sdk.getComponent("dialogs.AddressPickerDialog"); - - Modal.createTrackedDialog('Start a chat', '', AddressPickerDialog, { - title: _t('Start a chat'), - description: _t("Who would you like to communicate with?"), - placeholder: (validAddressTypes) => { - // The set of valid address type can be mutated inside the dialog - // when you first have no IS but agree to use one in the dialog. - if (validAddressTypes.includes('email')) { - return _t("Email, name or Matrix ID"); - } - return _t("Name or Matrix ID"); - }, - validAddressTypes: ['mx-user-id', 'email'], - button: _t("Start Chat"), - onFinished: _onStartDmFinished, - }, /*className=*/null, /*isPriority=*/false, /*isStatic=*/true); + // This dialog handles the room creation internally - we don't need to worry about it. + const InviteDialog = sdk.getComponent("dialogs.InviteDialog"); + Modal.createTrackedDialog( + 'Start DM', '', InviteDialog, {kind: KIND_DM}, + /*className=*/null, /*isPriority=*/false, /*isStatic=*/true, + ); } export function showRoomInviteDialog(roomId) { - if (SettingsStore.isFeatureEnabled("feature_ftue_dms")) { - // This new dialog handles the room creation internally - we don't need to worry about it. - const InviteDialog = sdk.getComponent("dialogs.InviteDialog"); - Modal.createTrackedDialog( - 'Invite Users', '', InviteDialog, {kind: KIND_INVITE, roomId}, - /*className=*/null, /*isPriority=*/false, /*isStatic=*/true, - ); - return; - } - - const AddressPickerDialog = sdk.getComponent("dialogs.AddressPickerDialog"); - - Modal.createTrackedDialog('Chat Invite', '', AddressPickerDialog, { - title: _t('Invite new room members'), - button: _t('Send Invites'), - placeholder: (validAddressTypes) => { - // The set of valid address type can be mutated inside the dialog - // when you first have no IS but agree to use one in the dialog. - if (validAddressTypes.includes('email')) { - return _t("Email, name or Matrix ID"); - } - return _t("Name or Matrix ID"); - }, - validAddressTypes: ['mx-user-id', 'email'], - onFinished: (shouldInvite, addrs) => { - _onRoomInviteFinished(roomId, shouldInvite, addrs); - }, - }, /*className=*/null, /*isPriority=*/false, /*isStatic=*/true); + // This dialog handles the room creation internally - we don't need to worry about it. + const InviteDialog = sdk.getComponent("dialogs.InviteDialog"); + Modal.createTrackedDialog( + 'Invite Users', '', InviteDialog, {kind: KIND_INVITE, roomId}, + /*className=*/null, /*isPriority=*/false, /*isStatic=*/true, + ); } /** @@ -122,60 +74,6 @@ export function isValid3pidInvite(event) { return true; } -// TODO: Canonical DMs replaces this -function _onStartDmFinished(shouldInvite, addrs) { - if (!shouldInvite) return; - - const addrTexts = addrs.map((addr) => addr.address); - - if (_isDmChat(addrTexts)) { - const rooms = _getDirectMessageRooms(addrTexts[0]); - if (rooms.length > 0) { - // A Direct Message room already exists for this user, so reuse it - dis.dispatch({ - action: 'view_room', - room_id: rooms[0], - should_peek: false, - joining: false, - }); - } else { - // Start a new DM chat - createRoom({dmUserId: addrTexts[0]}).catch((err) => { - const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - Modal.createTrackedDialog('Failed to start chat', '', ErrorDialog, { - title: _t("Failed to start chat"), - description: ((err && err.message) ? err.message : _t("Operation failed")), - }); - }); - } - } else if (addrTexts.length === 1) { - // Start a new DM chat - createRoom({dmUserId: addrTexts[0]}).catch((err) => { - const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - Modal.createTrackedDialog('Failed to start chat', '', ErrorDialog, { - title: _t("Failed to start chat"), - description: ((err && err.message) ? err.message : _t("Operation failed")), - }); - }); - } else { - // Start multi user chat - let room; - createRoom().then((roomId) => { - room = MatrixClientPeg.get().getRoom(roomId); - return inviteMultipleToRoom(roomId, addrTexts); - }).then((result) => { - return _showAnyInviteErrors(result.states, room, result.inviter); - }).catch((err) => { - console.error(err.stack); - const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - Modal.createTrackedDialog('Failed to invite', '', ErrorDialog, { - title: _t("Failed to invite"), - description: ((err && err.message) ? err.message : _t("Operation failed")), - }); - }); - } -} - export function inviteUsersToRoom(roomId, userIds) { return inviteMultipleToRoom(roomId, userIds).then((result) => { const room = MatrixClientPeg.get().getRoom(roomId); @@ -190,24 +88,6 @@ export function inviteUsersToRoom(roomId, userIds) { }); } -function _onRoomInviteFinished(roomId, shouldInvite, addrs) { - if (!shouldInvite) return; - - const addrTexts = addrs.map((addr) => addr.address); - - // Invite new users to a room - inviteUsersToRoom(roomId, addrTexts); -} - -// TODO: Immutable DMs replaces this -function _isDmChat(addrTexts) { - if (addrTexts.length === 1 && getAddressType(addrTexts[0]) === 'mx-user-id') { - return true; - } else { - return false; - } -} - function _showAnyInviteErrors(addrs, room, inviter) { // Show user any errors const failedUsers = Object.keys(addrs).filter(a => addrs[a] === 'error'); @@ -243,15 +123,3 @@ function _showAnyInviteErrors(addrs, room, inviter) { return addrs; } - -function _getDirectMessageRooms(addr) { - const dmRoomMap = new DMRoomMap(MatrixClientPeg.get()); - const dmRooms = dmRoomMap.getDMRoomsForUserId(addr); - const rooms = dmRooms.filter((dmRoom) => { - const room = MatrixClientPeg.get().getRoom(dmRoom); - if (room) { - return room.getMyMembership() === 'join'; - } - }); - return rooms; -} diff --git a/src/settings/Settings.js b/src/settings/Settings.js index eacf63e55d..e908861821 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -128,12 +128,6 @@ export const SETTINGS = { supportedLevels: LEVELS_FEATURE, default: false, }, - "feature_ftue_dms": { - isFeature: true, - displayName: _td("New invite dialog"), - supportedLevels: LEVELS_FEATURE, - default: false, - }, "feature_presence_in_room_list": { isFeature: true, displayName: _td("Show a presence dot next to DMs in the room list"), From a196ecc8911fc951ac18ab6ed28c2a7426f7bc99 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 22 Jan 2020 21:17:40 -0700 Subject: [PATCH 123/906] Fix i18n --- src/i18n/strings/en_EN.json | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index d19cbb9bfd..6a68c70d56 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -121,15 +121,8 @@ "Moderator": "Moderator", "Admin": "Admin", "Custom (%(level)s)": "Custom (%(level)s)", - "Start a chat": "Start a chat", - "Who would you like to communicate with?": "Who would you like to communicate with?", - "Email, name or Matrix ID": "Email, name or Matrix ID", - "Start Chat": "Start Chat", - "Invite new room members": "Invite new room members", - "Send Invites": "Send Invites", - "Failed to start chat": "Failed to start chat", - "Operation failed": "Operation failed", "Failed to invite": "Failed to invite", + "Operation failed": "Operation failed", "Failed to invite users to the room:": "Failed to invite users to the room:", "Failed to invite the following users to the %(roomName)s room:": "Failed to invite the following users to the %(roomName)s room:", "You need to be logged in.": "You need to be logged in.", @@ -372,7 +365,6 @@ "Render simple counters in room header": "Render simple counters in room header", "Multiple integration managers": "Multiple integration managers", "Try out new ways to ignore people (experimental)": "Try out new ways to ignore people (experimental)", - "New invite dialog": "New invite dialog", "Show a presence dot next to DMs in the room list": "Show a presence dot next to DMs in the room list", "Enable cross-signing to verify per-user instead of per-device (in development)": "Enable cross-signing to verify per-user instead of per-device (in development)", "Enable local event indexing and E2EE search (requires restart)": "Enable local event indexing and E2EE search (requires restart)", @@ -943,6 +935,7 @@ "Invite": "Invite", "Share Link to User": "Share Link to User", "User Options": "User Options", + "Start a chat": "Start a chat", "Direct chats": "Direct chats", "Remove recent messages": "Remove recent messages", "Unmute": "Unmute", From e41f94bdb79273fda94fafe8fdd7c6556e488707 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 22 Jan 2020 22:33:50 -0700 Subject: [PATCH 124/906] Try to populate user IDs even when the server's directory fails us Fixes https://github.com/vector-im/riot-web/issues/11943 --- src/components/views/dialogs/InviteDialog.js | 25 +++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/components/views/dialogs/InviteDialog.js b/src/components/views/dialogs/InviteDialog.js index 703b0b5121..effb887fc9 100644 --- a/src/components/views/dialogs/InviteDialog.js +++ b/src/components/views/dialogs/InviteDialog.js @@ -586,13 +586,36 @@ export default class InviteDialog extends React.PureComponent { clearTimeout(this._debounceTimer); } this._debounceTimer = setTimeout(async () => { - MatrixClientPeg.get().searchUserDirectory({term}).then(r => { + MatrixClientPeg.get().searchUserDirectory({term}).then(async r => { if (term !== this.state.filterText) { // Discard the results - we were probably too slow on the server-side to make // these results useful. This is a race we want to avoid because we could overwrite // more accurate results. return; } + + if (!r.results) r.results = []; + + // While we're here, try and autocomplete a search result for the mxid itself + // if there's no matches (and the input looks like a mxid). + if (term[0] === '@' && term.indexOf(':') > 1 && r.results.length === 0) { + try { + const profile = await MatrixClientPeg.get().getProfileInfo(term); + if (profile) { + // If we have a profile, we have enough information to assume that + // the mxid can be invited - add it to the list + r.results.push({ + user_id: term, + display_name: profile['displayname'], + avatar_url: profile['avatar_url'], + }); + } + } catch (e) { + console.warn("Non-fatal error trying to make an invite for a user ID"); + console.warn(e); + } + } + this.setState({ serverResultsMixin: r.results.map(u => ({ userId: u.user_id, From 65450e893c9862ef2ef7cdaeb22267bd19f3d731 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 22 Jan 2020 22:40:02 -0700 Subject: [PATCH 125/906] Try and fix e2e tests for new invite dialog --- test/end-to-end-tests/src/usecases/invite.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/end-to-end-tests/src/usecases/invite.js b/test/end-to-end-tests/src/usecases/invite.js index 6bee5dfd6f..75ebc61a88 100644 --- a/test/end-to-end-tests/src/usecases/invite.js +++ b/test/end-to-end-tests/src/usecases/invite.js @@ -31,10 +31,11 @@ module.exports = async function invite(session, userId) { } const inviteButton = await session.query(".mx_MemberList_invite"); await inviteButton.click(); - const inviteTextArea = await session.query(".mx_AddressPickerDialog textarea"); + const inviteTextArea = await session.query(".mx_InviteDialog_editor textarea"); await inviteTextArea.type(userId); - await inviteTextArea.press("Enter"); - const confirmButton = await session.query(".mx_Dialog_primary"); + const selectUserItem = await session.query(".mx_InviteDialog_roomTile"); + await selectUserItem.click(); + const confirmButton = await session.query(".mx_InviteDialog_goButton"); await confirmButton.click(); session.log.done(); }; From 4627e3b2825c5b547d1ccfe249ac74b75d5497d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Thu, 23 Jan 2020 11:02:44 +0100 Subject: [PATCH 126/906] EventIndex: Refactor out the addInitialCheckpoints method. --- src/indexing/EventIndex.js | 94 +++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 435f67447d..09abb5d209 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -70,62 +70,62 @@ export default class EventIndex { client.removeListener('Room.timelineReset', this.onTimelineReset); } + /** Get crawler checkpoints for the encrypted rooms and store them in the index. + */ + async addInitialCheckpoints() { + const indexManager = PlatformPeg.get().getEventIndexingManager(); + const client = MatrixClientPeg.get(); + const rooms = client.getRooms(); + + const isRoomEncrypted = (room) => { + return client.isRoomEncrypted(room.roomId); + }; + + // We only care to crawl the encrypted rooms, non-encrypted. + // rooms can use the search provided by the homeserver. + const encryptedRooms = rooms.filter(isRoomEncrypted); + + console.log("EventIndex: Adding initial crawler checkpoints"); + + // Gather the prev_batch tokens and create checkpoints for + // our message crawler. + await Promise.all(encryptedRooms.map(async (room) => { + const timeline = room.getLiveTimeline(); + const token = timeline.getPaginationToken("b"); + + console.log("EventIndex: Got token for indexer", + room.roomId, token); + + const backCheckpoint = { + roomId: room.roomId, + token: token, + direction: "b", + }; + + const forwardCheckpoint = { + roomId: room.roomId, + token: token, + direction: "f", + }; + + await indexManager.addCrawlerCheckpoint(backCheckpoint); + await indexManager.addCrawlerCheckpoint(forwardCheckpoint); + this.crawlerCheckpoints.push(backCheckpoint); + this.crawlerCheckpoints.push(forwardCheckpoint); + })); + } + onSync = async (state, prevState, data) => { const indexManager = PlatformPeg.get().getEventIndexingManager(); if (prevState === "PREPARED" && state === "SYNCING") { - const addInitialCheckpoints = async () => { - const client = MatrixClientPeg.get(); - const rooms = client.getRooms(); - - const isRoomEncrypted = (room) => { - return client.isRoomEncrypted(room.roomId); - }; - - // We only care to crawl the encrypted rooms, non-encrypted. - // rooms can use the search provided by the homeserver. - const encryptedRooms = rooms.filter(isRoomEncrypted); - - console.log("EventIndex: Adding initial crawler checkpoints"); - - // Gather the prev_batch tokens and create checkpoints for - // our message crawler. - await Promise.all(encryptedRooms.map(async (room) => { - const timeline = room.getLiveTimeline(); - const token = timeline.getPaginationToken("b"); - - console.log("EventIndex: Got token for indexer", - room.roomId, token); - - const backCheckpoint = { - roomId: room.roomId, - token: token, - direction: "b", - }; - - const forwardCheckpoint = { - roomId: room.roomId, - token: token, - direction: "f", - }; - - await indexManager.addCrawlerCheckpoint(backCheckpoint); - await indexManager.addCrawlerCheckpoint(forwardCheckpoint); - this.crawlerCheckpoints.push(backCheckpoint); - this.crawlerCheckpoints.push(forwardCheckpoint); - })); - }; - // If our indexer is empty we're most likely running Riot the // first time with indexing support or running it with an // initial sync. Add checkpoints to crawl our encrypted rooms. const eventIndexWasEmpty = await indexManager.isEventIndexEmpty(); - if (eventIndexWasEmpty) await addInitialCheckpoints(); + if (eventIndexWasEmpty) await this.addInitialCheckpoints(); - // Start our crawler. - if (SettingsStore.getValueAt(SettingLevel.DEVICE, 'enableCrawling')) { - this.startCrawler(); - } + this.startCrawler(); return; } From c0b713240427315475c000bc8c769f608d252043 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 23 Jan 2020 10:18:08 +0000 Subject: [PATCH 127/906] Different copy on done screen if we setup from scratch --- .../dialogs/secretstorage/CreateSecretStorageDialog.js | 7 ++++++- src/i18n/strings/en_EN.json | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 932f6e30e4..8fd881fc32 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -75,6 +75,9 @@ export default class CreateSecretStorageDialog extends React.PureComponent { canUploadKeysWithPasswordOnly: null, accountPassword: '', accountPasswordCorrect: null, + // set if we are 'upgrading' encryption (making an SSSS store from + // an existing key backup secret). + doingUpgrade: null, }; this._fetchBackupInfo(); @@ -99,6 +102,8 @@ export default class CreateSecretStorageDialog extends React.PureComponent { phase, backupInfo, backupSigStatus, + // remember this after this phase so we can use appropriate copy + doingUpgrade: phase === PHASE_MIGRATE, }); } @@ -668,7 +673,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { case PHASE_STORING: return _t('Storing secrets...'); case PHASE_DONE: - return _t('Encryption upgraded'); + return this.state.doingUpgrade ? _t('Encryption upgraded') : _t('Encryption setup complete'); default: return ''; } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index a49a8269df..22c09b5ae6 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2008,6 +2008,7 @@ "Keep it safe": "Keep it safe", "Storing secrets...": "Storing secrets...", "Encryption upgraded": "Encryption upgraded", + "Encryption setup complete": "Encryption setup complete", "Unable to set up secret storage": "Unable to set up secret storage", "Retry": "Retry", "We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.": "We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.", From 5fd121d2afdf7b18ebff311b2221539a492fd20b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Thu, 23 Jan 2020 11:44:56 +0100 Subject: [PATCH 128/906] ManageEventIndex: Remove the unused stats. --- .../dialogs/eventindex/ManageEventIndex.js | 10 ------- src/indexing/EventIndex.js | 27 ------------------- 2 files changed, 37 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js index 8623856b2e..d9a0cdcb5d 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js @@ -41,8 +41,6 @@ export default class ManageEventIndex extends React.Component { this.state = { eventIndexSize: 0, - crawlingRooms: 0, - totalCrawlingRooms: 0, eventCount: 0, roomCount: 0, currentRoom: null, @@ -80,8 +78,6 @@ export default class ManageEventIndex extends React.Component { let eventIndexSize = 0; let roomCount = 0; let eventCount = 0; - let crawlingRooms = 0; - let totalCrawlingRooms = 0; let currentRoom = null; const eventIndex = EventIndexPeg.get(); @@ -94,18 +90,12 @@ export default class ManageEventIndex extends React.Component { roomCount = stats.roomCount; eventCount = stats.eventCount; - const crawledRooms = eventIndex.currentlyCrawledRooms(); - crawlingRooms = crawledRooms.crawlingRooms.size; - totalCrawlingRooms = crawledRooms.totalRooms.size; - const room = eventIndex.currentRoom(); if (room) currentRoom = room.name; } this.setState({ eventIndexSize, - crawlingRooms, - totalCrawlingRooms, eventCount, roomCount, currentRoom, diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 09abb5d209..a10f4aff71 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -440,33 +440,6 @@ export default class EventIndex { return indexManager.getStats(); } - currentlyCrawledRooms() { - const crawlingRooms = new Set(); - const totalRooms = new Set(); - - this.crawlerCheckpoints.forEach((checkpoint, index) => { - crawlingRooms.add(checkpoint.roomId); - }); - - if (this._currentCheckpoint !== null) { - crawlingRooms.add(this._currentCheckpoint.roomId); - } - - const client = MatrixClientPeg.get(); - const rooms = client.getRooms(); - - const isRoomEncrypted = (room) => { - return client.isRoomEncrypted(room.roomId); - }; - - const encryptedRooms = rooms.filter(isRoomEncrypted); - encryptedRooms.forEach((room, index) => { - totalRooms.add(room.roomId); - }); - - return {crawlingRooms, totalRooms}; - } - /** * Get the room that we are currently crawling. * From d68db74efe9bfb6952fe268ed53f97d9f305293c Mon Sep 17 00:00:00 2001 From: Zoe Date: Tue, 21 Jan 2020 17:17:40 +0000 Subject: [PATCH 129/906] Room list reflects encryption state --- res/css/views/rooms/_RoomHeader.scss | 4 +- res/css/views/rooms/_RoomTile.scss | 13 ++++ src/components/structures/RoomView.js | 1 + src/components/views/rooms/RoomTile.js | 101 +++++++++++++++++++++++++ 4 files changed, 118 insertions(+), 1 deletion(-) diff --git a/res/css/views/rooms/_RoomHeader.scss b/res/css/views/rooms/_RoomHeader.scss index 0d92247735..a235a47fdd 100644 --- a/res/css/views/rooms/_RoomHeader.scss +++ b/res/css/views/rooms/_RoomHeader.scss @@ -22,7 +22,9 @@ limitations under the License. margin: 0; position: absolute; bottom: 0; - right: -5px; + right: -1px; + height: 10px; + width: 10px } } diff --git a/res/css/views/rooms/_RoomTile.scss b/res/css/views/rooms/_RoomTile.scss index db2c09f6f1..a36d781669 100644 --- a/res/css/views/rooms/_RoomTile.scss +++ b/res/css/views/rooms/_RoomTile.scss @@ -98,6 +98,19 @@ limitations under the License. z-index: 2; } +// Note we match .mx_E2EIcon to make sure this matches more tightly than just +// .mx_E2EIcon on its own +.mx_RoomTile_e2eIcon.mx_E2EIcon { + height: 10px; + width: 10px; + display: block; + position: absolute; + bottom: -0px; + right: -1px; + z-index: 1; + margin: 0; +} + .mx_RoomTile_name { font-size: 14px; padding: 0 6px; diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 9b02f6d503..f10c98dd98 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -796,6 +796,7 @@ export default createReactClass({ return; } + // Duplication betwen here and _updateE2eStatus in RoomTile /* At this point, the user has encryption on and cross-signing on */ const e2eMembers = await room.getEncryptionTargetMembers(); const verified = []; diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index f4f5fa10fc..c277433a5c 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -33,6 +33,8 @@ import RoomViewStore from '../../../stores/RoomViewStore'; import SettingsStore from "../../../settings/SettingsStore"; import {_t} from "../../../languageHandler"; import {RovingTabIndexWrapper} from "../../../accessibility/RovingTabIndex"; +import E2EIcon from './E2EIcon'; +import rate_limited_func from '../../../ratelimitedfunc'; export default createReactClass({ displayName: 'RoomTile', @@ -70,6 +72,7 @@ export default createReactClass({ notificationCount: this.props.room.getUnreadNotificationCount(), selected: this.props.room.roomId === RoomViewStore.getRoomId(), statusMessage: this._getStatusMessage(), + e2eStatus: null, }); }, @@ -102,6 +105,85 @@ export default createReactClass({ return statusUser._unstable_statusMessage; }, + onRoomStateMember: function(ev, state, member) { + // we only care about leaving users + // because trust state will change if someone joins a megolm session anyway + if (member.membership !== "leave") { + return; + } + // ignore members in other rooms + if (member.roomId !== this.props.room.roomId) { + return; + } + + this._updateE2eStatus(); + }, + + onUserVerificationChanged: function(userId, _trustStatus) { + if (!this.props.room.getMember(userId)) { + // Not in this room + return; + } + this._updateE2eStatus(); + }, + + onRoomTimeline: function(ev, room) { + if (!room) return; + if (room.roomId != this.props.room.roomId) return; + console.warn("e2e onRoomTimeline"); + if (ev.getType() !== "m.room.encryption") return; + console.warn("e2e onRoomTimeline ENCRYPTION"); + MatrixClientPeg.get().removeListener("Room.timeline", this.onRoomTimeline); + this.onFindingRoomToBeEncrypted(); + }, + + onFindingRoomToBeEncrypted: function () { + const cli = MatrixClientPeg.get(); + cli.on("RoomState.members", this.onRoomStateMember); + cli.on("userTrustStatusChanged", this.onUserVerificationChanged); + + this._updateE2eStatus(); + }, + + _updateE2eStatus: async function() { + const cli = MatrixClientPeg.get(); + if (!cli.isRoomEncrypted(this.props.room.roomId)) { + return; + } + if (!SettingsStore.isFeatureEnabled("feature_cross_signing")) { + return; + } + + // Duplication between here and _updateE2eStatus in RoomView + const e2eMembers = await this.props.room.getEncryptionTargetMembers(); + const verified = []; + const unverified = []; + e2eMembers.map(({userId}) => userId) + .filter((userId) => userId !== cli.getUserId()) + .forEach((userId) => { + (cli.checkUserTrust(userId).isCrossSigningVerified() ? + verified : unverified).push(userId) + }); + + /* Check all verified user devices. */ + for (const userId of verified) { + const devices = await cli.getStoredDevicesForUser(userId); + const allDevicesVerified = devices.every(({deviceId}) => { + return cli.checkDeviceTrust(userId, deviceId).isVerified(); + }); + if (!allDevicesVerified) { + this.setState({ + e2eStatus: "warning", + }); + return; + } + } + + this.setState({ + e2eStatus: unverified.length === 0 ? "verified" : "normal", + }); + }, + onRoomName: function(room) { if (room !== this.props.room) return; this.setState({ @@ -151,10 +233,19 @@ export default createReactClass({ }, componentDidMount: function() { + /* We bind here rather than in the definition because otherwise we wind up with the + method only being callable once every 500ms across all instances, which would be wrong */ + this._updateE2eStatus = rate_limited_func(this._updateE2eStatus, 500); + const cli = MatrixClientPeg.get(); cli.on("accountData", this.onAccountData); cli.on("Room.name", this.onRoomName); cli.on("RoomState.events", this.onJoinRule); + if (cli.isRoomEncrypted(this.props.room.roomId)) { + this.onFindingRoomToBeEncrypted(); + } else { + cli.on("Room.timeline", this.onRoomTimeline); + } ActiveRoomObserver.addListener(this.props.room.roomId, this._onActiveRoomChange); this.dispatcherRef = dis.register(this.onAction); @@ -172,6 +263,9 @@ export default createReactClass({ MatrixClientPeg.get().removeListener("accountData", this.onAccountData); MatrixClientPeg.get().removeListener("Room.name", this.onRoomName); cli.removeListener("RoomState.events", this.onJoinRule); + cli.removeListener("RoomState.members", this.onRoomStateMember); + cli.removeListener("userTrustStatusChanged", this.onUserVerificationChanged); + cli.removeListener("Room.timeline", this.onRoomTimeline); } ActiveRoomObserver.removeListener(this.props.room.roomId, this._onActiveRoomChange); dis.unregister(this.dispatcherRef); @@ -433,6 +527,12 @@ export default createReactClass({ privateIcon =
    ; } + let e2eIcon = null; + // For now, skip the icon for DMs. Possibly we want to move the DM icon elsewhere? + if (!dmUserId && this.state.e2eStatus) { + e2eIcon = + } + return {({onFocus, isActive, ref}) => @@ -453,6 +553,7 @@ export default createReactClass({
    { dmIndicator } + { e2eIcon }
    { privateIcon } From 8218962c37308c472989372e5343fb1f63e113f2 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Thu, 23 Jan 2020 03:45:50 +0000 Subject: [PATCH 130/906] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2042 of 2042 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 694d5e3d84..03fbe6f61b 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2080,5 +2080,10 @@ "For extra security, verify this user by checking a one-time code on both of your devices.": "為了提高安全性,請透過檢查您兩個裝置上的一次性代碼來驗證此使用者。", "For maximum security, do this in person.": "為了取得最強的安全性,請親自進行。", "Start Verification": "開始驗證", - "Encrypted by a deleted device": "被已刪除的裝置加密" + "Encrypted by a deleted device": "被已刪除的裝置加密", + "Unknown Command": "未知的指令", + "Unrecognised command: %(commandText)s": "無法識別的指令:%(commandText)s", + "You can use /help to list available commands. Did you mean to send this as a message?": "您可以使用 /help 來列出可用的指令。您是要傳送此訊息嗎?", + "Hint: Begin your message with // to start it with a slash.": "提示:以 // 開頭讓您的訊息傳送時可以用斜線開頭。", + "Send as message": "以訊息傳送" } From f7ca8a1b845a1ea133a5b715b598f8c3c8323fec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Thu, 23 Jan 2020 08:11:37 +0000 Subject: [PATCH 131/906] Translated using Weblate (French) Currently translated at 100.0% (2042 of 2042 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 8fda9e458e..472cd02e6f 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2080,5 +2080,10 @@ "For extra security, verify this user by checking a one-time code on both of your devices.": "Pour une meilleure sécurité, vérifiez cet utilisateur en comparant un code à usage unique sur vos deux appareils.", "For maximum security, do this in person.": "Pour une sécurité maximale, faites-le en personne.", "Start Verification": "Commencer la vérification", - "Encrypted by a deleted device": "Chiffré par un appareil supprimé" + "Encrypted by a deleted device": "Chiffré par un appareil supprimé", + "Unknown Command": "Commande inconnue", + "Unrecognised command: %(commandText)s": "Commande non reconnue : %(commandText)s", + "You can use /help to list available commands. Did you mean to send this as a message?": "Vous pouvez utiliser /help pour obtenir la liste des commandes disponibles. Vouliez-vous envoyer un message ?", + "Hint: Begin your message with // to start it with a slash.": "Astuce : Votre message doit démarrer par // pour commencer par une barre oblique.", + "Send as message": "Envoyer comme message" } From 5d8249507cd685402ce2612d5b94565548022dd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Mesk=C3=B3?= Date: Thu, 23 Jan 2020 10:11:27 +0000 Subject: [PATCH 132/906] Translated using Weblate (Hungarian) Currently translated at 100.0% (2042 of 2042 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index fa7528a397..da2c015335 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -138,7 +138,7 @@ "Failed to toggle moderator status": "Moderátor státuszt nem sikerült átállítani", "Failed to unban": "Kizárás visszavonása sikertelen", "Failed to upload profile picture!": "Profil kép feltöltése sikertelen!", - "Failed to verify email address: make sure you clicked the link in the email": "E-mail cím ellenőrzése sikertelen: ellenőrizd, hogy az e-mailnél lévő linkre rákattintottál", + "Failed to verify email address: make sure you clicked the link in the email": "E-mail cím ellenőrzése sikertelen: ellenőrizd, hogy az e-mailben lévő hivatkozásra kattintottál", "Failure to create room": "Szoba létrehozása sikertelen", "Favourites": "Kedvencek", "Fill screen": "Képernyő kitöltése", @@ -355,7 +355,7 @@ "You need to be able to invite users to do that.": "Hogy ezt csinálhasd meg kell tudnod hívni felhasználókat.", "You need to be logged in.": "Be kell jelentkezz.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ez az e-mail cím, úgy néz ki, nincs összekötve a Matrix azonosítóval ezen a Matrix szerveren.", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "A jelszavadat sikeresen megváltoztattuk. Nem kapsz \"push\" értesítéseket amíg a többi eszközön vissza nem jelentkezel", + "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "A jelszavadat sikeresen megváltoztattuk. Addig nem fogsz leküldéses értesítéseket kapni, amíg a többi eszközön vissza nem jelentkezel", "You seem to be in a call, are you sure you want to quit?": "Úgy tűnik hívásban vagy, biztosan kilépsz?", "You seem to be uploading files, are you sure you want to quit?": "Úgy tűnik fájlokat töltesz fel, biztosan kilépsz?", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Nem leszel képes visszavonni ezt a változtatást mivel a felhasználót ugyanarra a szintre emeled amin te vagy.", @@ -451,7 +451,7 @@ "Username available": "Szabad felhasználói név", "Username not available": "A felhasználói név foglalt", "Something went wrong!": "Valami tönkrement!", - "If you already have a Matrix account you can log in instead.": "Ha már van Matrix fiókod akkor beléphetsz helyette.", + "If you already have a Matrix account you can log in instead.": "Ha már van Matrix fiókod, akkor beléphetsz helyette.", "Your browser does not support the required cryptography extensions": "A böngésződ nem támogatja a szükséges titkosítási kiterjesztést", "Not a valid Riot keyfile": "Nem érvényes Riot kulcsfájl", "Authentication check failed: incorrect password?": "Azonosítás sikertelen: hibás jelszó?", @@ -929,7 +929,7 @@ "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "A %(homeserverDomain)s szerver használatának folytatásához el kell olvasnod és el kell fogadnod az általános szerződési feltételeket.", "Review terms and conditions": "Általános Szerződési Feltételek elolvasása", "To continue, please enter your password:": "Folytatáshoz add meg a jelszavad:", - "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.": "Ez végleg használhatatlanná teszi a fiókodat. Ezután nem fogsz tudni bejelentkezni, és más sem tud majd ezzel az azonosítóval fiókot létrehozni. Minden szobából amibe beléptél ki fogsz lépni, és törölni fogja minden fiók adatod az \"identity\" szerverről. Ez a művelet visszafordíthatatlan.", + "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.": "Ez végleg használhatatlanná teszi a fiókodat. Ezután nem fogsz tudni bejelentkezni, és más sem tud majd ezzel az azonosítóval fiókot létrehozni. Minden szobából amibe beléptél ki fogsz lépni, és törölni fogja minden fiók adatod az személyazonosságod biztosító szerverről. Ez a művelet visszafordíthatatlan.", "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.": "A fiókod felfüggesztése nem jelenti alapértelmezetten azt, hogy az általad küldött üzenetek elfelejtődnek. Ha törölni szeretnéd az általad küldött üzeneteket, pipáld be a jelölőnégyzetet alul.", "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.": "Az üzenetek láthatósága a Matrix-ban hasonlít az emailhez. Az általad küldött üzenet törlése azt jelenti, hogy nem osztjuk meg új-, vagy vendég felhasználóval de a már regisztrált felhasználók akik már hozzáfértek az üzenethez továbbra is elérik a saját másolatukat.", "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)": "Kérlek töröld az összes általam küldött üzenetet amikor a fiókomat felfüggesztem (Figyelem: ez azt eredményezheti, hogy a jövőbeni felhasználók csak részleges beszélgetést látnak majd)", @@ -1053,7 +1053,7 @@ "Print it and store it somewhere safe": "Nyomtad ki és tárold biztonságos helyen", "Save it on a USB key or backup drive": "Mentsd el egy Pendrive-ra vagy a biztonsági mentésekhez", "Copy it to your personal cloud storage": "Másold fel a személyes felhődbe", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "A Biztonságos Üzenet Visszaállítás beállítása nélkül ha kijelentkezel vagy másik eszközt használsz, akkor nem tudod visszaállítani a régi titkosított üzeneteidet.", + "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "A Biztonságos üzenet-visszaállítás beállítása nélkül ha kijelentkezel vagy másik eszközt használsz, akkor nem tudod visszaállítani a régi titkosított üzeneteidet.", "Set up Secure Message Recovery": "Biztonságos Üzenet Visszaállítás beállítása", "Keep it safe": "Tartsd biztonságban", "Create Key Backup": "Kulcs mentés készítése", From ee33c7cd627bdc378d1760f288d0b027f94bf6f1 Mon Sep 17 00:00:00 2001 From: Zoe Date: Thu, 23 Jan 2020 11:09:52 +0000 Subject: [PATCH 133/906] lint --- src/components/views/rooms/RoomTile.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index c277433a5c..6ad7bc3f2d 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -34,6 +34,7 @@ import SettingsStore from "../../../settings/SettingsStore"; import {_t} from "../../../languageHandler"; import {RovingTabIndexWrapper} from "../../../accessibility/RovingTabIndex"; import E2EIcon from './E2EIcon'; +// eslint-disable-next-line camelcase import rate_limited_func from '../../../ratelimitedfunc'; export default createReactClass({ @@ -137,7 +138,7 @@ export default createReactClass({ this.onFindingRoomToBeEncrypted(); }, - onFindingRoomToBeEncrypted: function () { + onFindingRoomToBeEncrypted: function() { const cli = MatrixClientPeg.get(); cli.on("RoomState.members", this.onRoomStateMember); cli.on("userTrustStatusChanged", this.onUserVerificationChanged); @@ -162,7 +163,7 @@ export default createReactClass({ .filter((userId) => userId !== cli.getUserId()) .forEach((userId) => { (cli.checkUserTrust(userId).isCrossSigningVerified() ? - verified : unverified).push(userId) + verified : unverified).push(userId); }); /* Check all verified user devices. */ @@ -530,7 +531,7 @@ export default createReactClass({ let e2eIcon = null; // For now, skip the icon for DMs. Possibly we want to move the DM icon elsewhere? if (!dmUserId && this.state.e2eStatus) { - e2eIcon = + e2eIcon = ; } return From a409b9b96fe706e02d88c8956886be0d103da794 Mon Sep 17 00:00:00 2001 From: Zoe Date: Thu, 23 Jan 2020 11:14:01 +0000 Subject: [PATCH 134/906] whoops, left some printfs --- src/components/views/rooms/RoomTile.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index 6ad7bc3f2d..0b50d85ff6 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -131,9 +131,7 @@ export default createReactClass({ onRoomTimeline: function(ev, room) { if (!room) return; if (room.roomId != this.props.room.roomId) return; - console.warn("e2e onRoomTimeline"); if (ev.getType() !== "m.room.encryption") return; - console.warn("e2e onRoomTimeline ENCRYPTION"); MatrixClientPeg.get().removeListener("Room.timeline", this.onRoomTimeline); this.onFindingRoomToBeEncrypted(); }, From 13bb719a890818e15ea14959fb5fdcab55cf54bc Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 23 Jan 2020 11:22:22 +0000 Subject: [PATCH 135/906] Add comment for operations loop --- src/editor/operations.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/editor/operations.js b/src/editor/operations.js index d0115d9ca7..d677d7016c 100644 --- a/src/editor/operations.js +++ b/src/editor/operations.js @@ -111,7 +111,7 @@ export function toggleInlineFormat(range, prefix, suffix = prefix) { // compute paragraph [start, end] indexes const paragraphIndexes = []; let startIndex = 0; - // let seenNewlines = 0; + // start at i=2 because we look at i and up to two parts behind to detect paragraph breaks at their end for (let i = 2; i < parts.length; i++) { // paragraph breaks can be denoted in a multitude of ways, // - 2 newline parts in sequence From 0d545ed3359a665860354e750c114bffbf36b425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Thu, 23 Jan 2020 11:47:49 +0100 Subject: [PATCH 136/906] EventIndexPeg: Small refactor and change the init logic. This changes the way the event index is initialized, if it's disabled in the settings it will not be initialized at all, before only the crawler loop was not being started. --- src/indexing/EventIndexPeg.js | 57 +++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/src/indexing/EventIndexPeg.js b/src/indexing/EventIndexPeg.js index a63756ab4e..c8c8cbefe9 100644 --- a/src/indexing/EventIndexPeg.js +++ b/src/indexing/EventIndexPeg.js @@ -21,17 +21,19 @@ limitations under the License. import PlatformPeg from "../PlatformPeg"; import EventIndex from "../indexing/EventIndex"; -import SettingsStore from '../settings/SettingsStore'; +import SettingsStore, {SettingLevel} from '../settings/SettingsStore'; class EventIndexPeg { constructor() { this.index = null; + this._supportIsInstalled = false; } /** - * Create a new EventIndex and initialize it if the platform supports it. + * Initialize the EventIndexPeg and if event indexing is enabled initialize + * the event index. * - * @return {Promise} A promise that will resolve to true if an + * @return {Promise} A promise that will resolve to true if an * EventIndex was successfully initialized, false otherwise. */ async init() { @@ -40,12 +42,32 @@ class EventIndexPeg { } const indexManager = PlatformPeg.get().getEventIndexingManager(); - if (!indexManager || await indexManager.supportsEventIndexing() !== true) { - console.log("EventIndex: Platform doesn't support event indexing,", - "not initializing."); + if (!indexManager) { + console.log("EventIndex: Platform doesn't support event indexing, not initializing."); return false; } + this._supportIsInstalled = await indexManager.supportsEventIndexing(); + + if (!this.supportIsInstalled()) { + console.log("EventIndex: Event indexing isn't installed for the platform, not initializing."); + return false; + } + + if (!SettingsStore.getValueAt(SettingLevel.DEVICE, 'enableEventIndexing')) { + console.log("EventIndex: Event indexing is disabled, not initializing"); + return false; + } + + return this.initEventIndex(); + } + + /* Initialize the event index. + * + * @returns {boolean} True if the event index was succesfully initialized, + * false otherwise. + */ + async initEventIndex() { const index = new EventIndex(); try { @@ -60,6 +82,29 @@ class EventIndexPeg { return true; } + /** + * Check if the current platform has support for event indexing. + * + * @return {boolean} True if it has support, false otherwise. Note that this + * does not mean that support is installed. + */ + platformHasSupport(): boolean { + return PlatformPeg.get().getEventIndexingManager() !== null; + } + + /** + * Check if event indexing support is installed for the platfrom. + * + * Event indexing might require additional optional modules to be installed, + * this tells us if those are installed. Note that this should only be + * called after the init() method was called. + * + * @return {boolean} True if support is installed, false otherwise. + */ + supportIsInstalled(): boolean { + return this._supportIsInstalled; + } + /** * Get the current event index. * From 9bee024da71b7faa06b3c1cec379b0c692d9b895 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Thu, 23 Jan 2020 12:24:06 +0100 Subject: [PATCH 137/906] ManageEventIndex: Remove some useless divs and add the enable case. --- .../dialogs/eventindex/ManageEventIndex.js | 69 ++++++++++--------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js index d9a0cdcb5d..754d1b8516 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js @@ -116,7 +116,11 @@ export default class ManageEventIndex extends React.Component { SettingsStore.setValue("crawlerSleepTime", null, SettingLevel.DEVICE, e.target.value); } - _onDisable = () => { + _onDisable = async () => { + this.props.onFinished(false); + } + + _onEnable = async () => { this.props.onFinished(false); } @@ -126,17 +130,16 @@ export default class ManageEventIndex extends React.Component { render() { let eventIndexingSettings = null; + let buttons; let crawlerState; if (!this.state.eventIndexingEnabled) { - crawlerState =
    {_t("Message search for encrypted rooms is disabled.")}
    ; + crawlerState = _t("Message search for encrypted rooms is disabled."); } else if (this.state.currentRoom === null) { - crawlerState =
    {_t("Not downloading messages for any room.")}
    ; + crawlerState = _t("Not downloading messages for any room."); } else { crawlerState = ( -
    - {_t("Downloading mesages for %(currentRoom)s.", { currentRoom: this.state.currentRoom })} -
    + _t("Downloading mesages for %(currentRoom)s.", { currentRoom: this.state.currentRoom }) ); } @@ -154,18 +157,30 @@ export default class ManageEventIndex extends React.Component { {_t("Number of rooms:")} {this.state.roomCount}
    {crawlerState}
    +
    + ); - - - + buttons = ( +
    + + {_t("Disable")} + + + {_t("Done")} + +
    + ); + } else if (!this.state.eventIndexingEnabled && this.state.eventIndexingInstalled) { + eventIndexingSettings = ( +
    + {_t( "Securely cache encrypted messages locally for them to appear in search results.")} +
    + ); + buttons = ( +
    + + {_t("Enable")} +
    ); } else { @@ -182,28 +197,14 @@ export default class ManageEventIndex extends React.Component { } const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); - const buttons =
    -
    - - {_t("Disable")} - - - {_t("Done")} - -
    -
    ; return ( {}} + onFinished={this.props.onFinished} title={_t("Message search")} > -
    - {eventIndexingSettings} -
    -
    - {buttons} -
    + {eventIndexingSettings} + {buttons}
    ); } From 4953f32cbae89967bfbea894a8d25740a3b7124a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Thu, 23 Jan 2020 12:24:54 +0100 Subject: [PATCH 138/906] ManageEventIndex: Rename the enable crawler setting. --- .../views/dialogs/eventindex/ManageEventIndex.js | 2 +- src/settings/Settings.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js index 754d1b8516..76e41fe4b8 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js @@ -45,7 +45,7 @@ export default class ManageEventIndex extends React.Component { roomCount: 0, currentRoom: null, eventIndexingEnabled: - SettingsStore.getValueAt(SettingLevel.DEVICE, 'enableCrawling'), + SettingsStore.getValueAt(SettingLevel.DEVICE, 'enableEventIndexing'), crawlerSleepTime: SettingsStore.getValueAt(SettingLevel.DEVICE, 'crawlerSleepTime'), }; diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 817adcfc4d..68b26dbae1 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -491,9 +491,9 @@ export const SETTINGS = { displayName: _td("How long should the crawler wait between requests"), default: 3000, }, - "enableCrawling": { + "enableEventIndexing": { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, - displayName: _td("How long should the crawler wait between requests"), + displayName: _td("Enable message search in encrypted rooms"), default: true, }, }; From 6c3ac2d0c4585798ba82b913b6ac42b87129c42c Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 23 Jan 2020 11:50:59 +0000 Subject: [PATCH 139/906] Add Reject & Ignore user button to invites view --- src/components/structures/RoomView.js | 39 +++++++++++++++++++- src/components/views/rooms/RoomPreviewBar.js | 14 ++++++- src/i18n/strings/en_EN.json | 1 + 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 9b02f6d503..b3dafc4acd 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -1367,6 +1367,41 @@ export default createReactClass({ }); }, + onRejectAndIgnoreClick: async function() { + this.setState({ + rejecting: true, + }); + + const cli = MatrixClientPeg.get(); + try { + const myMember = this.state.room.getMember(cli.getUserId()); + const inviteEvent = myMember.events.member; + const ignoredUsers = MatrixClientPeg.get().getIgnoredUsers(); + ignoredUsers.push(inviteEvent.getSender()); // de-duped internally in the js-sdk + cli.setIgnoredUsers(ignoredUsers); + + cli.leave(this.state.roomId); + dis.dispatch({ action: 'view_next_room' }); + this.setState({ + rejecting: false, + }); + } catch (error) { + console.error("Failed to reject invite: %s", error); + + const msg = error.message ? error.message : JSON.stringify(error); + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + Modal.createTrackedDialog('Failed to reject invite', '', ErrorDialog, { + title: _t("Failed to reject invite"), + description: msg, + }); + + self.setState({ + rejecting: false, + rejectError: error, + }); + } + }, + onRejectThreepidInviteButtonClicked: function(ev) { // We can reject 3pid invites in the same way that we accept them, // using /leave rather than /join. In the short term though, we @@ -1671,9 +1706,11 @@ export default createReactClass({ return (
    - + { _t("Reject & Ignore user") } + + ); + } break; } case MessageCase.ViewingRoom: { @@ -505,8 +516,6 @@ export default createReactClass({ } } - const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); - let subTitleElements; if (subTitle) { if (!Array.isArray(subTitle)) { @@ -554,6 +563,7 @@ export default createReactClass({
    { secondaryButton } + { extraComponents } { primaryButton }
    diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 2e92cbd282..9acbfbd1f3 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1046,6 +1046,7 @@ "Do you want to join %(roomName)s?": "Do you want to join %(roomName)s?", " invited you": " invited you", "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?", "%(roomName)s can't be previewed. Do you want to join it?": "%(roomName)s can't be previewed. Do you want to join it?", "%(roomName)s does not exist.": "%(roomName)s does not exist.", From 873952a83e9ac886606a733415c30f1f1d8c9cdd Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 23 Jan 2020 11:51:31 +0000 Subject: [PATCH 140/906] delint --- src/components/views/rooms/RoomPreviewBar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/rooms/RoomPreviewBar.js b/src/components/views/rooms/RoomPreviewBar.js index e9d752a80f..9af06190f7 100644 --- a/src/components/views/rooms/RoomPreviewBar.js +++ b/src/components/views/rooms/RoomPreviewBar.js @@ -477,7 +477,7 @@ export default createReactClass({ extraComponents.push( { _t("Reject & Ignore user") } - + , ); } break; From 1747a621189d909c643247206d88399f76f0fa1b Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 23 Jan 2020 11:55:08 +0000 Subject: [PATCH 141/906] add missing awaits --- src/components/structures/RoomView.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index b3dafc4acd..3f438ea909 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -1378,9 +1378,9 @@ export default createReactClass({ const inviteEvent = myMember.events.member; const ignoredUsers = MatrixClientPeg.get().getIgnoredUsers(); ignoredUsers.push(inviteEvent.getSender()); // de-duped internally in the js-sdk - cli.setIgnoredUsers(ignoredUsers); + await cli.setIgnoredUsers(ignoredUsers); - cli.leave(this.state.roomId); + await cli.leave(this.state.roomId); dis.dispatch({ action: 'view_next_room' }); this.setState({ rejecting: false, From 30bfd4046d9eb135217688ddab9a8db962b6d55e Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 23 Jan 2020 12:27:25 +0000 Subject: [PATCH 142/906] improve spacing of buttons on RoomPreviewBar --- res/css/views/rooms/_RoomPreviewBar.scss | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/res/css/views/rooms/_RoomPreviewBar.scss b/res/css/views/rooms/_RoomPreviewBar.scss index c7d03e3523..85b6916226 100644 --- a/res/css/views/rooms/_RoomPreviewBar.scss +++ b/res/css/views/rooms/_RoomPreviewBar.scss @@ -117,12 +117,17 @@ limitations under the License. .mx_RoomPreviewBar_actions { flex-direction: column-reverse; .mx_AccessibleButton { - padding: 7px 50px;//extra wide + padding: 7px 50px; //extra wide } & > * { margin-top: 12px; } + .mx_AccessibleButton.mx_AccessibleButton_kind_primary { + // to account for the padding of the primary button which causes inconsistent look between + // subsequent secondary (text) buttons + margin-bottom: 7px; + } } } From 947ea9823d6bb22ea57ed854e4e5ace81673bb0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Thu, 23 Jan 2020 13:32:27 +0100 Subject: [PATCH 143/906] Settings: Remove the crawler sleep time setting. --- .../views/dialogs/eventindex/ManageEventIndex.js | 16 ---------------- src/indexing/EventIndex.js | 3 ++- src/settings/Settings.js | 5 ----- 3 files changed, 2 insertions(+), 22 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js index 76e41fe4b8..be7df25381 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js @@ -46,8 +46,6 @@ export default class ManageEventIndex extends React.Component { currentRoom: null, eventIndexingEnabled: SettingsStore.getValueAt(SettingLevel.DEVICE, 'enableEventIndexing'), - crawlerSleepTime: - SettingsStore.getValueAt(SettingLevel.DEVICE, 'crawlerSleepTime'), }; } @@ -102,20 +100,6 @@ export default class ManageEventIndex extends React.Component { }); } - _onEventIndexingEnabledChange = (checked) => { - SettingsStore.setValue("enableCrawling", null, SettingLevel.DEVICE, checked); - - if (checked) EventIndexPeg.start(); - else EventIndexPeg.stop(); - - this.setState({eventIndexingEnabled: checked}); - } - - _onCrawlerSleepTimeChange = (e) => { - this.setState({crawlerSleepTime: e.target.value}); - SettingsStore.setValue("crawlerSleepTime", null, SettingLevel.DEVICE, e.target.value); - } - _onDisable = async () => { this.props.onFinished(false); } diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index a10f4aff71..6d38f1683f 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -30,6 +30,7 @@ export default class EventIndex { // The time in ms that the crawler will wait loop iterations if there // have not been any checkpoints to consume in the last iteration. this._crawlerIdleTime = 5000; + this._crawlerSleepTime = 3000; // The maximum number of events our crawler should fetch in a single // crawl. this._eventsPerCrawl = 100; @@ -211,7 +212,7 @@ export default class EventIndex { // This is a low priority task and we don't want to spam our // homeserver with /messages requests so we set a hefty timeout // here. - let sleepTime = SettingsStore.getValueAt(SettingLevel.DEVICE, 'crawlerSleepTime'); + let sleepTime = this._crawlerSleepTime; // Don't let the user configure a lower sleep time than 100 ms. sleepTime = Math.max(sleepTime, 100); diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 68b26dbae1..44f38f232f 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -486,11 +486,6 @@ export const SETTINGS = { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, default: RIGHT_PANEL_PHASES.GroupMemberList, }, - "crawlerSleepTime": { - supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, - displayName: _td("How long should the crawler wait between requests"), - default: 3000, - }, "enableEventIndexing": { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, displayName: _td("Enable message search in encrypted rooms"), From 4aa0658ac8e36f671fc6d715091cfc392e311ebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Thu, 23 Jan 2020 13:33:09 +0100 Subject: [PATCH 144/906] SecurityUserSettingsTab: Put the event index settings behind the feature flag. --- .../settings/tabs/user/SecurityUserSettingsTab.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js b/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js index 7b22dd15e2..eb5f346714 100644 --- a/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js @@ -254,12 +254,15 @@ export default class SecurityUserSettingsTab extends React.Component {
    ); - const eventIndex = ( -
    - {_t("Message search")} - -
    - ); + let eventIndex; + if (SettingsStore.isFeatureEnabled("feature_event_indexing")) { + eventIndex = ( +
    + {_t("Message search")} + +
    + ); + } // XXX: There's no such panel in the current cross-signing designs, but // it's useful to have for testing the feature. If there's no interest From 64c4ad2eb9474dbacd681954682f677fb97d71cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Thu, 23 Jan 2020 13:33:55 +0100 Subject: [PATCH 145/906] ManageEventIndex: Hook up the disable event index button. --- .../dialogs/eventindex/DisableEventIndex.js | 74 +++++++++++++++++++ .../dialogs/eventindex/ManageEventIndex.js | 6 +- src/i18n/strings/en_EN.json | 8 +- 3 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 src/async-components/views/dialogs/eventindex/DisableEventIndex.js diff --git a/src/async-components/views/dialogs/eventindex/DisableEventIndex.js b/src/async-components/views/dialogs/eventindex/DisableEventIndex.js new file mode 100644 index 0000000000..159f8b3d95 --- /dev/null +++ b/src/async-components/views/dialogs/eventindex/DisableEventIndex.js @@ -0,0 +1,74 @@ +/* +Copyright 2020 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 React from 'react'; +import * as sdk from '../../../../index'; +import PropTypes from 'prop-types'; +import { _t } from '../../../../languageHandler'; + +import SettingsStore, {SettingLevel} from "../../../../settings/SettingsStore"; +import LabelledToggleSwitch from "../../../../components/views/elements/LabelledToggleSwitch"; +import Field from "../../../../components/views/elements/Field"; +import {formatBytes} from "../../../../utils/FormattingUtils"; +import EventIndexPeg from "../../../../indexing/EventIndexPeg"; +import AccessibleButton from "../../../../components/views/elements/AccessibleButton"; + + +/* + * Walks the user through the process of creating an e2e key backup + * on the server. + */ +export default class ManageEventIndex extends React.Component { + static propTypes = { + onFinished: PropTypes.func.isRequired, + } + + constructor(props) { + super(props); + + this.state = { + eventIndexingEnabled: + SettingsStore.getValueAt(SettingLevel.DEVICE, 'enableEventIndexing'), + }; + } + + _onDisable = async () => { + const eventIndex = EventIndexPeg.get(); + await SettingsStore.setValue('enableEventIndexing', null, SettingLevel.DEVICE, false); + await EventIndexPeg.deleteEventIndex(); + this.props.onFinished(true); + } + + render() { + const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); + const DialogButtons = sdk.getComponent("views.elements.DialogButtons"); + + return ( + + {_t("If disabled, messages form encrypted rooms won't appear in search results")} + + + ); + } +} diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js index be7df25381..cf0e2bccc6 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js @@ -19,6 +19,7 @@ import * as sdk from '../../../../index'; import PropTypes from 'prop-types'; import { _t } from '../../../../languageHandler'; +import Modal from '../../../../Modal'; import SettingsStore, {SettingLevel} from "../../../../settings/SettingsStore"; import LabelledToggleSwitch from "../../../../components/views/elements/LabelledToggleSwitch"; import Field from "../../../../components/views/elements/Field"; @@ -101,7 +102,10 @@ export default class ManageEventIndex extends React.Component { } _onDisable = async () => { - this.props.onFinished(false); + Modal.createTrackedDialogAsync("Disable message search", "Disable message search", + import("./DisableEventIndex"), + null, null, /* priority = */ false, /* static = */ true, + ); } _onEnable = async () => { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index b2ac55ba04..31ba5581f3 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -416,6 +416,7 @@ "Send read receipts for messages (requires compatible homeserver to disable)": "Send read receipts for messages (requires compatible homeserver to disable)", "Show previews/thumbnails for images": "Show previews/thumbnails for images", "How long should the crawler wait between requests": "How long should the crawler wait between requests", + "Enable message search in encrypted rooms": "Enable message search in encrypted rooms", "Collecting app version information": "Collecting app version information", "Collecting logs": "Collecting logs", "Uploading report": "Uploading report", @@ -2035,6 +2036,8 @@ "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "This device has detected that your recovery passphrase and key for Secure Messages have been removed.", "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.", + "If disabled, messages form encrypted rooms won't appear in search results": "If disabled, messages form encrypted rooms won't appear in search results", + "Disable": "Disable", "Message search for encrypted rooms is disabled.": "Message search for encrypted rooms is disabled.", "Not downloading messages for any room.": "Not downloading messages for any room.", "Downloading mesages for %(currentRoom)s.": "Downloading mesages for %(currentRoom)s.", @@ -2042,9 +2045,8 @@ "Space used:": "Space used:", "Indexed messages:": "Indexed messages:", "Number of rooms:": "Number of rooms:", - "Download and index encrypted messages": "Download and index encrypted messages", - "Message downloading sleep time(ms)": "Message downloading sleep time(ms)", - "Disable": "Disable", + "Securely cache encrypted messages locally for them to appear in search results.": "Securely cache encrypted messages locally for them to appear in search results.", + "Enable": "Enable", "Failed to set direct chat tag": "Failed to set direct chat tag", "Failed to remove tag %(tagName)s from room": "Failed to remove tag %(tagName)s from room", "Failed to add tag %(tagName)s to room": "Failed to add tag %(tagName)s to room" From 78e1d1674f15d99a182158fcb73974284512e8c3 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 23 Jan 2020 13:00:17 +0000 Subject: [PATCH 146/906] reactor E2EIcon for reusability --- src/components/views/rooms/E2EIcon.js | 100 +++++++++++++------------- 1 file changed, 48 insertions(+), 52 deletions(-) diff --git a/src/components/views/rooms/E2EIcon.js b/src/components/views/rooms/E2EIcon.js index 6ee20023ff..36f230f472 100644 --- a/src/components/views/rooms/E2EIcon.js +++ b/src/components/views/rooms/E2EIcon.js @@ -15,8 +15,10 @@ limitations under the License. */ import React from "react"; +import PropTypes from "prop-types"; import classNames from 'classnames'; -import { _t } from '../../../languageHandler'; + +import {_t, _td} from '../../../languageHandler'; import AccessibleButton from '../elements/AccessibleButton'; import SettingsStore from '../../../settings/SettingsStore'; @@ -27,71 +29,65 @@ export const E2E_STATE = { NORMAL: "normal", }; -export default function(props) { - const { isUser, status, className } = props; - const isNormal = status === E2E_STATE.NORMAL; - const isWarning = status === E2E_STATE.WARNING; - const isVerified = status === E2E_STATE.VERIFIED; +const crossSigningUserTitles = { + [E2E_STATE.WARNING]: _td("This user has not verified all of their devices."), + [E2E_STATE.NORMAL]: _td("You have not verified this user. This user has verified all of their devices."), + [E2E_STATE.VERIFIED]: _td("You have verified this user. This user has verified all of their devices."), +}; +const crossSigningRoomTitles = { + [E2E_STATE.WARNING]: _td("Some users in this encrypted room are not verified by you or they have not verified " + + "their own devices."), + [E2E_STATE.VERIFIED]: _td("All users in this encrypted room are verified by you and they have verified their " + + "own devices."), +}; +const legacyUserTitles = { + [E2E_STATE.WARNING]: _td("Some devices for this user are not trusted"), + [E2E_STATE.VERIFIED]: _td("All devices for this user are trusted"), +}; +const legacyRoomTitles = { + [E2E_STATE.WARNING]: _td("Some devices in this encrypted room are not trusted"), + [E2E_STATE.VERIFIED]: _td("All devices in this encrypted room are trusted"), +}; + +const E2EIcon = ({isUser, status, className, size, onClick}) => { const e2eIconClasses = classNames({ mx_E2EIcon: true, - mx_E2EIcon_warning: isWarning, - mx_E2EIcon_normal: isNormal, - mx_E2EIcon_verified: isVerified, + mx_E2EIcon_warning: status === E2E_STATE.WARNING, + mx_E2EIcon_normal: status === E2E_STATE.NORMAL, + mx_E2EIcon_verified: status === E2E_STATE.VERIFIED, }, className); - let e2eTitle; + let e2eTitle; const crossSigning = SettingsStore.isFeatureEnabled("feature_cross_signing"); if (crossSigning && isUser) { - if (isWarning) { - e2eTitle = _t( - "This user has not verified all of their devices.", - ); - } else if (isNormal) { - e2eTitle = _t( - "You have not verified this user. " + - "This user has verified all of their devices.", - ); - } else if (isVerified) { - e2eTitle = _t( - "You have verified this user. " + - "This user has verified all of their devices.", - ); - } + e2eTitle = crossSigningUserTitles[status]; } else if (crossSigning && !isUser) { - if (isWarning) { - e2eTitle = _t( - "Some users in this encrypted room are not verified by you or " + - "they have not verified their own devices.", - ); - } else if (isVerified) { - e2eTitle = _t( - "All users in this encrypted room are verified by you and " + - "they have verified their own devices.", - ); - } + e2eTitle = crossSigningRoomTitles[status]; } else if (!crossSigning && isUser) { - if (isWarning) { - e2eTitle = _t("Some devices for this user are not trusted"); - } else if (isVerified) { - e2eTitle = _t("All devices for this user are trusted"); - } + e2eTitle = legacyUserTitles[status]; } else if (!crossSigning && !isUser) { - if (isWarning) { - e2eTitle = _t("Some devices in this encrypted room are not trusted"); - } else if (isVerified) { - e2eTitle = _t("All devices in this encrypted room are trusted"); - } + e2eTitle = legacyRoomTitles[status]; } let style = null; - if (props.size) { - style = {width: `${props.size}px`, height: `${props.size}px`}; + if (size) { + style = {width: `${size}px`, height: `${size}px`}; } - const icon = (
    ); - if (props.onClick) { - return ({ icon }); + const icon = (
    ); + if (onClick) { + return ({ icon }); } else { return icon; } -} +}; + +E2EIcon.propTypes = { + isUser: PropTypes.bool, + status: PropTypes.oneOf(Object.values(E2E_STATE)), + className: PropTypes.string, + size: PropTypes.number, + onClick: PropTypes.func, +}; + +export default E2EIcon; From c251031dfbf2d432e6818f4c70c0f228f9a15eaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Thu, 23 Jan 2020 14:25:47 +0100 Subject: [PATCH 147/906] DisableEventIndex: Return back to the user settings after disabling. --- .../views/dialogs/eventindex/DisableEventIndex.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/async-components/views/dialogs/eventindex/DisableEventIndex.js b/src/async-components/views/dialogs/eventindex/DisableEventIndex.js index 159f8b3d95..3dcbeab454 100644 --- a/src/async-components/views/dialogs/eventindex/DisableEventIndex.js +++ b/src/async-components/views/dialogs/eventindex/DisableEventIndex.js @@ -17,6 +17,7 @@ limitations under the License. import React from 'react'; import * as sdk from '../../../../index'; import PropTypes from 'prop-types'; +import dis from "../../../../dispatcher"; import { _t } from '../../../../languageHandler'; import SettingsStore, {SettingLevel} from "../../../../settings/SettingsStore"; @@ -49,7 +50,8 @@ export default class ManageEventIndex extends React.Component { const eventIndex = EventIndexPeg.get(); await SettingsStore.setValue('enableEventIndexing', null, SettingLevel.DEVICE, false); await EventIndexPeg.deleteEventIndex(); - this.props.onFinished(true); + this.props.onFinished(); + dis.dispatch({ action: 'view_user_settings' }); } render() { From 5ac37c8694f8f42c6cadef7225195b35eaea5cd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Thu, 23 Jan 2020 14:26:35 +0100 Subject: [PATCH 148/906] ManageEventIndex: Remove the enable button, that one goes somewhere else. --- .../dialogs/eventindex/ManageEventIndex.js | 86 ++++++------------- 1 file changed, 25 insertions(+), 61 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js index cf0e2bccc6..76fee228bf 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js @@ -45,8 +45,6 @@ export default class ManageEventIndex extends React.Component { eventCount: 0, roomCount: 0, currentRoom: null, - eventIndexingEnabled: - SettingsStore.getValueAt(SettingLevel.DEVICE, 'enableEventIndexing'), }; } @@ -108,22 +106,14 @@ export default class ManageEventIndex extends React.Component { ); } - _onEnable = async () => { - this.props.onFinished(false); - } - _onDone = () => { this.props.onFinished(true); } render() { - let eventIndexingSettings = null; - let buttons; let crawlerState; - if (!this.state.eventIndexingEnabled) { - crawlerState = _t("Message search for encrypted rooms is disabled."); - } else if (this.state.currentRoom === null) { + if (this.state.currentRoom === null) { crawlerState = _t("Not downloading messages for any room."); } else { crawlerState = ( @@ -131,58 +121,32 @@ export default class ManageEventIndex extends React.Component { ); } - if (EventIndexPeg.get() !== null) { - eventIndexingSettings = ( -
    - { - _t( "Riot is securely caching encrypted messages locally for them " + - "to appear in search results:", - ) - } -
    - {_t("Space used:")} {formatBytes(this.state.eventIndexSize, 0)}
    - {_t("Indexed messages:")} {this.state.eventCount}
    - {_t("Number of rooms:")} {this.state.roomCount}
    - {crawlerState}
    -
    + const eventIndexingSettings = ( +
    + { + _t( "Riot is securely caching encrypted messages locally for them " + + "to appear in search results:", + ) + } +
    + {_t("Space used:")} {formatBytes(this.state.eventIndexSize, 0)}
    + {_t("Indexed messages:")} {this.state.eventCount}
    + {_t("Number of rooms:")} {this.state.roomCount}
    + {crawlerState}
    - ); +
    + ); - buttons = ( -
    - - {_t("Disable")} - - - {_t("Done")} - -
    - ); - } else if (!this.state.eventIndexingEnabled && this.state.eventIndexingInstalled) { - eventIndexingSettings = ( -
    - {_t( "Securely cache encrypted messages locally for them to appear in search results.")} -
    - ); - buttons = ( -
    - - {_t("Enable")} - -
    - ); - } else { - eventIndexingSettings = ( -
    - { - _t( "Riot can't securely cache encrypted messages locally" + - "while running in a web browser. Use Riot Desktop for" + - "encrypted messages to appear in search results.", - ) - } -
    - ); - } + const buttons = ( +
    + + {_t("Disable")} + + + {_t("Done")} + +
    + ); const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); From 981acec0d2030efabec4cf4959aab352f0637c58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Thu, 23 Jan 2020 14:27:46 +0100 Subject: [PATCH 149/906] EventIndexPanel: Show the enable button if event indexing is disabled. --- .../views/settings/EventIndexPanel.js | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/components/views/settings/EventIndexPanel.js b/src/components/views/settings/EventIndexPanel.js index 8ed4b114e7..7cd0dbe753 100644 --- a/src/components/views/settings/EventIndexPanel.js +++ b/src/components/views/settings/EventIndexPanel.js @@ -18,6 +18,7 @@ import React from 'react'; import { _t } from '../../../languageHandler'; import Modal from '../../../Modal'; +import SettingsStore, {SettingLevel} from "../../../settings/SettingsStore"; import AccessibleButton from "../elements/AccessibleButton"; import {formatBytes} from "../../../utils/FormattingUtils"; import EventIndexPeg from "../../../indexing/EventIndexPeg"; @@ -29,6 +30,8 @@ export default class EventIndexPanel extends React.Component { this.state = { eventIndexSize: 0, roomCount: 0, + eventIndexingEnabled: + SettingsStore.getValueAt(SettingLevel.DEVICE, 'enableEventIndexing'), }; } @@ -51,10 +54,15 @@ export default class EventIndexPanel extends React.Component { } async componentWillMount(): void { + this.updateState(); + } + + async updateState() { let eventIndexSize = 0; let roomCount = 0; const eventIndex = EventIndexPeg.get(); + const eventIndexingEnabled = SettingsStore.getValueAt(SettingLevel.DEVICE, 'enableEventIndexing'); if (eventIndex !== null) { eventIndex.on("changedCheckpoint", this.updateCurrentRoom.bind(this)); @@ -67,6 +75,7 @@ export default class EventIndexPanel extends React.Component { this.setState({ eventIndexSize, roomCount, + eventIndexingEnabled, }); } @@ -79,6 +88,14 @@ export default class EventIndexPanel extends React.Component { ); } + _onEnable = async () => { + await EventIndexPeg.initEventIndex(); + await EventIndexPeg.get().addInitialCheckpoints(); + await EventIndexPeg.get().startCrawler(); + await SettingsStore.setValue('enableEventIndexing', null, SettingLevel.DEVICE, true); + await this.updateState(); + } + render() { let eventIndexingSettings = null; @@ -98,12 +115,25 @@ export default class EventIndexPanel extends React.Component {
    ); + } else if (!this.state.eventIndexingEnabled && EventIndexPeg.supportIsInstalled()) { + eventIndexingSettings = ( +
    +
    + {_t( "Securely cache encrypted messages locally for them to appear in search results.")} +
    +
    + + {_t("Enable")} + +
    +
    + ); } else { eventIndexingSettings = (
    { - _t( "Riot can't securely cache encrypted messages locally" + - "while running in a web browser. Use Riot Desktop for" + + _t( "Riot can't securely cache encrypted messages locally " + + "while running in a web browser. Use Riot Desktop for " + "encrypted messages to appear in search results.", ) } From c25c1878b884d04e832c047c90d24acc3212a26a Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 23 Jan 2020 13:54:28 +0000 Subject: [PATCH 150/906] Move control of room initial state into createRoom This changes `createRoom` so it has more control of the room's initial state, and appends state for different features, rather resetting the entire state array. This makes room for also controlling encryption state in the next change. --- src/components/structures/MatrixChat.js | 4 ++-- src/components/views/dialogs/CreateRoomDialog.js | 9 +++++---- src/createRoom.js | 14 +++++++++----- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 3ac8a93e3d..9afc79811d 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -961,9 +961,9 @@ export default createReactClass({ const CreateRoomDialog = sdk.getComponent('dialogs.CreateRoomDialog'); const modal = Modal.createTrackedDialog('Create Room', '', CreateRoomDialog); - const [shouldCreate, createOpts] = await modal.finished; + const [shouldCreate, opts] = await modal.finished; if (shouldCreate) { - createRoom({createOpts}); + createRoom(opts); } }, diff --git a/src/components/views/dialogs/CreateRoomDialog.js b/src/components/views/dialogs/CreateRoomDialog.js index 288074a891..9380226381 100644 --- a/src/components/views/dialogs/CreateRoomDialog.js +++ b/src/components/views/dialogs/CreateRoomDialog.js @@ -1,5 +1,6 @@ /* Copyright 2017 Michael Telatynski <7t3chguy@gmail.com> +Copyright 2020 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. @@ -44,13 +45,13 @@ export default createReactClass({ }, _roomCreateOptions() { - const createOpts = {}; + const opts = {}; + const createOpts = opts.createOpts = {}; createOpts.name = this.state.name; if (this.state.isPublic) { createOpts.visibility = "public"; createOpts.preset = "public_chat"; - // to prevent createRoom from enabling guest access - createOpts['initial_state'] = []; + opts.guestAccess = false; const {alias} = this.state; const localPart = alias.substr(1, alias.indexOf(":") - 1); createOpts['room_alias_name'] = localPart; @@ -61,7 +62,7 @@ export default createReactClass({ if (this.state.noFederate) { createOpts.creation_content = {'m.federate': false}; } - return createOpts; + return opts; }, componentDidMount() { diff --git a/src/createRoom.js b/src/createRoom.js index cde9e8b03e..0fa8b1b241 100644 --- a/src/createRoom.js +++ b/src/createRoom.js @@ -1,6 +1,6 @@ /* Copyright 2015, 2016 OpenMarket Ltd -Copyright 2019 The Matrix.org Foundation C.I.C. +Copyright 2019, 2020 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. @@ -32,6 +32,8 @@ import {getAddressType} from "./UserAddress"; * @param {object=} opts.createOpts set of options to pass to createRoom call. * @param {bool=} opts.spinner True to show a modal spinner while the room is created. * Default: True + * @param {bool=} opts.guestAccess Whether to enable guest access. + * Default: True * * @returns {Promise} which resolves to the room id, or null if the * action was aborted or failed. @@ -39,6 +41,7 @@ import {getAddressType} from "./UserAddress"; export default function createRoom(opts) { opts = opts || {}; if (opts.spinner === undefined) opts.spinner = true; + if (opts.guestAccess === undefined) opts.guestAccess = true; const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); const Loader = sdk.getComponent("elements.Spinner"); @@ -80,15 +83,16 @@ export default function createRoom(opts) { // Allow guests by default since the room is private and they'd // need an invite. This means clicking on a 3pid invite email can // actually drop you right in to a chat. - createOpts.initial_state = createOpts.initial_state || [ - { + createOpts.initial_state = createOpts.initial_state || []; + if (opts.guestAccess) { + createOpts.initial_state.push({ content: { guest_access: 'can_join', }, type: 'm.room.guest_access', state_key: '', - }, - ]; + }); + } let modal; if (opts.spinner) modal = Modal.createDialog(Loader, null, 'mx_Dialog_spinner'); From 2b16b650fed350ccfca1730a4407d7100d88e408 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 23 Jan 2020 14:05:38 +0000 Subject: [PATCH 151/906] Add encryption option to createRoom --- src/createRoom.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/createRoom.js b/src/createRoom.js index 0fa8b1b241..c25b618dc6 100644 --- a/src/createRoom.js +++ b/src/createRoom.js @@ -34,6 +34,8 @@ import {getAddressType} from "./UserAddress"; * Default: True * @param {bool=} opts.guestAccess Whether to enable guest access. * Default: True + * @param {bool=} opts.encryption Whether to enable encryption. + * Default: False * * @returns {Promise} which resolves to the room id, or null if the * action was aborted or failed. @@ -42,6 +44,7 @@ export default function createRoom(opts) { opts = opts || {}; if (opts.spinner === undefined) opts.spinner = true; if (opts.guestAccess === undefined) opts.guestAccess = true; + if (opts.encryption === undefined) opts.encryption = false; const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); const Loader = sdk.getComponent("elements.Spinner"); @@ -80,17 +83,28 @@ export default function createRoom(opts) { opts.andView = true; } + createOpts.initial_state = createOpts.initial_state || []; + // Allow guests by default since the room is private and they'd // need an invite. This means clicking on a 3pid invite email can // actually drop you right in to a chat. - createOpts.initial_state = createOpts.initial_state || []; if (opts.guestAccess) { createOpts.initial_state.push({ + type: 'm.room.guest_access', + state_key: '', content: { guest_access: 'can_join', }, - type: 'm.room.guest_access', + }); + } + + if (opts.encryption) { + createOpts.initial_state.push({ + type: 'm.room.encryption', state_key: '', + content: { + algorithm: 'm.megolm.v1.aes-sha2', + }, }); } From 3073ce55883dc96b2ed88ad1e586920a4fd2f4b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Thu, 23 Jan 2020 15:05:40 +0100 Subject: [PATCH 152/906] DisableEventIndex: Set the correct button kind and add a spinner. --- .../dialogs/eventindex/DisableEventIndex.js | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/DisableEventIndex.js b/src/async-components/views/dialogs/eventindex/DisableEventIndex.js index 3dcbeab454..6d0f9a43e8 100644 --- a/src/async-components/views/dialogs/eventindex/DisableEventIndex.js +++ b/src/async-components/views/dialogs/eventindex/DisableEventIndex.js @@ -41,12 +41,15 @@ export default class ManageEventIndex extends React.Component { super(props); this.state = { - eventIndexingEnabled: - SettingsStore.getValueAt(SettingLevel.DEVICE, 'enableEventIndexing'), + disabling: false, }; } _onDisable = async () => { + this.setState({ + disabling: true, + }); + const eventIndex = EventIndexPeg.get(); await SettingsStore.setValue('enableEventIndexing', null, SettingLevel.DEVICE, false); await EventIndexPeg.deleteEventIndex(); @@ -64,12 +67,15 @@ export default class ManageEventIndex extends React.Component { title={_t("Are you sure?")} > {_t("If disabled, messages form encrypted rooms won't appear in search results")} - +
    + + {_t("Cancel")} + + + {_t("Disable")} + + {this.state.enabling ? :
    } +
    ); } From 251661388a9dee3d3f9ce394820ebb3fbd607513 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Thu, 23 Jan 2020 15:06:10 +0100 Subject: [PATCH 153/906] ManageEventIndex: Set the button kind to danger. --- .../views/dialogs/eventindex/ManageEventIndex.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js index 76fee228bf..b53b4810aa 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js @@ -139,7 +139,7 @@ export default class ManageEventIndex extends React.Component { const buttons = (
    - + {_t("Disable")} From a5a149933a0dd98e7ca86d08a382a9ff6b0cc48b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Thu, 23 Jan 2020 15:06:38 +0100 Subject: [PATCH 154/906] EventIndexPanel: Add a spinner when the index is being enabled. --- .../views/settings/EventIndexPanel.js | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/components/views/settings/EventIndexPanel.js b/src/components/views/settings/EventIndexPanel.js index 7cd0dbe753..f93ab489c7 100644 --- a/src/components/views/settings/EventIndexPanel.js +++ b/src/components/views/settings/EventIndexPanel.js @@ -17,6 +17,7 @@ limitations under the License. import React from 'react'; import { _t } from '../../../languageHandler'; +import * as sdk from '../../../index'; import Modal from '../../../Modal'; import SettingsStore, {SettingLevel} from "../../../settings/SettingsStore"; import AccessibleButton from "../elements/AccessibleButton"; @@ -28,6 +29,7 @@ export default class EventIndexPanel extends React.Component { super(); this.state = { + enabling: false, eventIndexSize: 0, roomCount: 0, eventIndexingEnabled: @@ -58,11 +60,12 @@ export default class EventIndexPanel extends React.Component { } async updateState() { - let eventIndexSize = 0; - let roomCount = 0; - const eventIndex = EventIndexPeg.get(); const eventIndexingEnabled = SettingsStore.getValueAt(SettingLevel.DEVICE, 'enableEventIndexing'); + const enabling = false; + + let eventIndexSize = 0; + let roomCount = 0; if (eventIndex !== null) { eventIndex.on("changedCheckpoint", this.updateCurrentRoom.bind(this)); @@ -73,6 +76,7 @@ export default class EventIndexPanel extends React.Component { } this.setState({ + enabling, eventIndexSize, roomCount, eventIndexingEnabled, @@ -89,6 +93,10 @@ export default class EventIndexPanel extends React.Component { } _onEnable = async () => { + this.setState({ + enabling: true, + }); + await EventIndexPeg.initEventIndex(); await EventIndexPeg.get().addInitialCheckpoints(); await EventIndexPeg.get().startCrawler(); @@ -98,6 +106,7 @@ export default class EventIndexPanel extends React.Component { render() { let eventIndexingSettings = null; + const InlineSpinner = sdk.getComponent('elements.InlineSpinner'); if (EventIndexPeg.get() !== null) { eventIndexingSettings = ( @@ -119,12 +128,15 @@ export default class EventIndexPanel extends React.Component { eventIndexingSettings = (
    - {_t( "Securely cache encrypted messages locally for them to appear in search results.")} + {_t( "Securely cache encrypted messages locally for them to " + + "appear in search results.")}
    - + {_t("Enable")} + {this.state.enabling ? :
    }
    ); From 381fe95f67919457cd1cdfa75ba7dd895dd69b16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Thu, 23 Jan 2020 15:22:26 +0100 Subject: [PATCH 155/906] EventIndex: Fix some lint errors. --- .../views/dialogs/eventindex/DisableEventIndex.js | 6 +----- .../views/dialogs/eventindex/ManageEventIndex.js | 3 --- src/indexing/EventIndex.js | 2 -- 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/DisableEventIndex.js b/src/async-components/views/dialogs/eventindex/DisableEventIndex.js index 6d0f9a43e8..064f55edc0 100644 --- a/src/async-components/views/dialogs/eventindex/DisableEventIndex.js +++ b/src/async-components/views/dialogs/eventindex/DisableEventIndex.js @@ -21,9 +21,6 @@ import dis from "../../../../dispatcher"; import { _t } from '../../../../languageHandler'; import SettingsStore, {SettingLevel} from "../../../../settings/SettingsStore"; -import LabelledToggleSwitch from "../../../../components/views/elements/LabelledToggleSwitch"; -import Field from "../../../../components/views/elements/Field"; -import {formatBytes} from "../../../../utils/FormattingUtils"; import EventIndexPeg from "../../../../indexing/EventIndexPeg"; import AccessibleButton from "../../../../components/views/elements/AccessibleButton"; @@ -50,7 +47,6 @@ export default class ManageEventIndex extends React.Component { disabling: true, }); - const eventIndex = EventIndexPeg.get(); await SettingsStore.setValue('enableEventIndexing', null, SettingLevel.DEVICE, false); await EventIndexPeg.deleteEventIndex(); this.props.onFinished(); @@ -59,7 +55,7 @@ export default class ManageEventIndex extends React.Component { render() { const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); - const DialogButtons = sdk.getComponent("views.elements.DialogButtons"); + const InlineSpinner = sdk.getComponent('elements.InlineSpinner'); return ( Date: Thu, 23 Jan 2020 15:32:43 +0100 Subject: [PATCH 156/906] Update the translation file. --- src/i18n/strings/en_EN.json | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 31ba5581f3..3973ae442e 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -415,7 +415,6 @@ "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)", "Send read receipts for messages (requires compatible homeserver to disable)": "Send read receipts for messages (requires compatible homeserver to disable)", "Show previews/thumbnails for images": "Show previews/thumbnails for images", - "How long should the crawler wait between requests": "How long should the crawler wait between requests", "Enable message search in encrypted rooms": "Enable message search in encrypted rooms", "Collecting app version information": "Collecting app version information", "Collecting logs": "Collecting logs", @@ -559,7 +558,9 @@ " to store messages from ": " to store messages from ", "rooms.": "rooms.", "Manage": "Manage", - "Riot can't securely cache encrypted messages locallywhile running in a web browser. Use Riot Desktop forencrypted messages to appear in search results.": "Riot can't securely cache encrypted messages locallywhile running in a web browser. Use Riot Desktop forencrypted messages to appear in search results.", + "Securely cache encrypted messages locally for them to appear in search results.": "Securely cache encrypted messages locally for them to appear in search results.", + "Enable": "Enable", + "Riot can't securely cache encrypted messages locally while running in a web browser. Use Riot Desktop for encrypted messages to appear in search results.": "Riot can't securely cache encrypted messages locally while running in a web browser. Use Riot Desktop for encrypted messages to appear in search results.", "Connecting to integration manager...": "Connecting to integration manager...", "Cannot connect to integration manager": "Cannot connect to integration manager", "The integration manager is offline or it cannot reach your homeserver.": "The integration manager is offline or it cannot reach your homeserver.", @@ -2038,15 +2039,12 @@ "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.", "If disabled, messages form encrypted rooms won't appear in search results": "If disabled, messages form encrypted rooms won't appear in search results", "Disable": "Disable", - "Message search for encrypted rooms is disabled.": "Message search for encrypted rooms is disabled.", "Not downloading messages for any room.": "Not downloading messages for any room.", "Downloading mesages for %(currentRoom)s.": "Downloading mesages for %(currentRoom)s.", "Riot is securely caching encrypted messages locally for them to appear in search results:": "Riot is securely caching encrypted messages locally for them to appear in search results:", "Space used:": "Space used:", "Indexed messages:": "Indexed messages:", "Number of rooms:": "Number of rooms:", - "Securely cache encrypted messages locally for them to appear in search results.": "Securely cache encrypted messages locally for them to appear in search results.", - "Enable": "Enable", "Failed to set direct chat tag": "Failed to set direct chat tag", "Failed to remove tag %(tagName)s from room": "Failed to remove tag %(tagName)s from room", "Failed to add tag %(tagName)s to room": "Failed to add tag %(tagName)s to room" From 74b08ea4895a581ebb16a83a470e170213f7b24f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 23 Jan 2020 14:38:17 +0000 Subject: [PATCH 157/906] Clean up E2EIcon for better maintainability --- src/components/views/rooms/E2EIcon.js | 13 +++---- src/hooks/useSettings.js | 52 +++++++++++++++++++++++++++ src/i18n/strings/en_EN.json | 5 +-- 3 files changed, 62 insertions(+), 8 deletions(-) create mode 100644 src/hooks/useSettings.js diff --git a/src/components/views/rooms/E2EIcon.js b/src/components/views/rooms/E2EIcon.js index 36f230f472..7ac3b5af2d 100644 --- a/src/components/views/rooms/E2EIcon.js +++ b/src/components/views/rooms/E2EIcon.js @@ -1,5 +1,6 @@ /* Copyright 2019 New Vector Ltd +Copyright 2020 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. @@ -20,7 +21,7 @@ import classNames from 'classnames'; import {_t, _td} from '../../../languageHandler'; import AccessibleButton from '../elements/AccessibleButton'; -import SettingsStore from '../../../settings/SettingsStore'; +import {useFeatureEnabled} from "../../../hooks/useSettings"; export const E2E_STATE = { VERIFIED: "verified", @@ -35,11 +36,11 @@ const crossSigningUserTitles = { [E2E_STATE.VERIFIED]: _td("You have verified this user. This user has verified all of their devices."), }; const crossSigningRoomTitles = { - [E2E_STATE.WARNING]: _td("Some users in this encrypted room are not verified by you or they have not verified " + - "their own devices."), - [E2E_STATE.VERIFIED]: _td("All users in this encrypted room are verified by you and they have verified their " + - "own devices."), + [E2E_STATE.WARNING]: _td("Someone is using an unknown device"), + [E2E_STATE.NORMAL]: _td("This room is end-to-end encrypted"), + [E2E_STATE.VERIFIED]: _td("Everyone in this room is verified"), }; + const legacyUserTitles = { [E2E_STATE.WARNING]: _td("Some devices for this user are not trusted"), [E2E_STATE.VERIFIED]: _td("All devices for this user are trusted"), @@ -58,7 +59,7 @@ const E2EIcon = ({isUser, status, className, size, onClick}) => { }, className); let e2eTitle; - const crossSigning = SettingsStore.isFeatureEnabled("feature_cross_signing"); + const crossSigning = useFeatureEnabled("feature_cross_signing"); if (crossSigning && isUser) { e2eTitle = crossSigningUserTitles[status]; } else if (crossSigning && !isUser) { diff --git a/src/hooks/useSettings.js b/src/hooks/useSettings.js new file mode 100644 index 0000000000..151a6369de --- /dev/null +++ b/src/hooks/useSettings.js @@ -0,0 +1,52 @@ +/* +Copyright 2020 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 {useEffect, useState} from "react"; +import SettingsStore from '../settings/SettingsStore'; + +// Hook to fetch the value of a setting and dynamically update when it changes +export const useSettingValue = (settingName, roomId = null, excludeDefault = false) => { + const [value, setValue] = useState(SettingsStore.getValue(settingName, roomId, excludeDefault)); + + useEffect(() => { + const ref = SettingsStore.watchSetting(settingName, roomId, () => { + setValue(SettingsStore.getValue(settingName, roomId, excludeDefault)); + }); + // clean-up + return () => { + SettingsStore.unwatchSetting(ref); + }; + }, [settingName, roomId, excludeDefault]); + + return value; +}; + +// Hook to fetch whether a feature is enabled and dynamically update when that changes +export const useFeatureEnabled = (featureName, roomId = null) => { + const [enabled, setEnabled] = useState(SettingsStore.isFeatureEnabled(featureName, roomId)); + + useEffect(() => { + const ref = SettingsStore.watchSetting(featureName, roomId, () => { + setEnabled(SettingsStore.isFeatureEnabled(featureName, roomId)); + }); + // clean-up + return () => { + SettingsStore.unwatchSetting(ref); + }; + }, [featureName, roomId]); + + return enabled; +}; diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index d19cbb9bfd..fb2898ae3d 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -884,8 +884,9 @@ "This user has not verified all of their devices.": "This user has not verified all of their devices.", "You have not verified this user. This user has verified all of their devices.": "You have not verified this user. This user has verified all of their devices.", "You have verified this user. This user has verified all of their devices.": "You have verified this user. This user has verified all of their devices.", - "Some users in this encrypted room are not verified by you or they have not verified their own devices.": "Some users in this encrypted room are not verified by you or they have not verified their own devices.", - "All users in this encrypted room are verified by you and they have verified their own devices.": "All users in this encrypted room are verified by you and they have verified their own devices.", + "Someone is using an unknown device": "Someone is using an unknown device", + "This room is end-to-end encrypted": "This room is end-to-end encrypted", + "Everyone in this room is verified": "Everyone in this room is verified", "Some devices for this user are not trusted": "Some devices for this user are not trusted", "All devices for this user are trusted": "All devices for this user are trusted", "Some devices in this encrypted room are not trusted": "Some devices in this encrypted room are not trusted", From 662b34c8dbc2196b4061f08c8555c2a1e02cf5a2 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 23 Jan 2020 14:38:39 +0000 Subject: [PATCH 158/906] Update MessageComposer placeholder and e2e icon size --- res/css/views/rooms/_MessageComposer.scss | 2 + src/components/views/rooms/MessageComposer.js | 46 ++++++++++--------- src/i18n/strings/en_EN.json | 4 +- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/res/css/views/rooms/_MessageComposer.scss b/res/css/views/rooms/_MessageComposer.scss index 5efca51844..fae9d0dfe3 100644 --- a/res/css/views/rooms/_MessageComposer.scss +++ b/res/css/views/rooms/_MessageComposer.scss @@ -76,6 +76,8 @@ limitations under the License. left: 60px; margin-right: 0; // Counteract the E2EIcon class margin-left: 3px; // Counteract the E2EIcon class + width: 12px; + height: 12px; } .mx_MessageComposer_noperm_error { diff --git a/src/components/views/rooms/MessageComposer.js b/src/components/views/rooms/MessageComposer.js index 8d36f02d02..53e10fa750 100644 --- a/src/components/views/rooms/MessageComposer.js +++ b/src/components/views/rooms/MessageComposer.js @@ -26,6 +26,7 @@ import Stickerpicker from './Stickerpicker'; import { makeRoomPermalink } from '../../../utils/permalinks/Permalinks'; import ContentMessages from '../../../ContentMessages'; import E2EIcon from './E2EIcon'; +import SettingsStore from "../../../settings/SettingsStore"; function ComposerAvatar(props) { const MemberStatusMessageAvatar = sdk.getComponent('avatars.MemberStatusMessageAvatar'); @@ -168,7 +169,6 @@ export default class MessageComposer extends React.Component { constructor(props) { super(props); this.onInputStateChanged = this.onInputStateChanged.bind(this); - this.onEvent = this.onEvent.bind(this); this._onRoomStateEvents = this._onRoomStateEvents.bind(this); this._onRoomViewStoreUpdate = this._onRoomViewStoreUpdate.bind(this); this._onTombstoneClick = this._onTombstoneClick.bind(this); @@ -182,11 +182,6 @@ export default class MessageComposer extends React.Component { } componentDidMount() { - // N.B. using 'event' rather than 'RoomEvents' otherwise the crypto handler - // for 'event' fires *after* 'RoomEvent', and our room won't have yet been - // marked as encrypted. - // XXX: fragile as all hell - fixme somehow, perhaps with a dedicated Room.encryption event or something. - MatrixClientPeg.get().on("event", this.onEvent); MatrixClientPeg.get().on("RoomState.events", this._onRoomStateEvents); this._roomStoreToken = RoomViewStore.addListener(this._onRoomViewStoreUpdate); this._waitForOwnMember(); @@ -210,7 +205,6 @@ export default class MessageComposer extends React.Component { componentWillUnmount() { if (MatrixClientPeg.get()) { - MatrixClientPeg.get().removeListener("event", this.onEvent); MatrixClientPeg.get().removeListener("RoomState.events", this._onRoomStateEvents); } if (this._roomStoreToken) { @@ -218,13 +212,6 @@ export default class MessageComposer extends React.Component { } } - onEvent(event) { - if (event.getType() !== 'm.room.encryption') return; - if (event.getRoomId() !== this.props.room.roomId) return; - // TODO: put (encryption state??) in state - this.forceUpdate(); - } - _onRoomStateEvents(ev, state) { if (ev.getRoomId() !== this.props.room.roomId) return; @@ -282,18 +269,33 @@ export default class MessageComposer extends React.Component { } renderPlaceholderText() { - const roomIsEncrypted = MatrixClientPeg.get().isRoomEncrypted(this.props.room.roomId); - if (this.state.isQuoting) { - if (roomIsEncrypted) { - return _t('Send an encrypted reply…'); + if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (this.state.isQuoting) { + if (this.props.e2eStatus) { + return _t('Send an encrypted reply…'); + } else { + return _t('Send a reply…'); + } } else { - return _t('Send a reply (unencrypted)…'); + if (this.props.e2eStatus) { + return _t('Send an encrypted message…'); + } else { + return _t('Send a message…'); + } } } else { - if (roomIsEncrypted) { - return _t('Send an encrypted message…'); + if (this.state.isQuoting) { + if (this.props.e2eStatus) { + return _t('Send an encrypted reply…'); + } else { + return _t('Send a reply (unencrypted)…'); + } } else { - return _t('Send a message (unencrypted)…'); + if (this.props.e2eStatus) { + return _t('Send an encrypted message…'); + } else { + return _t('Send a message (unencrypted)…'); + } } } } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index fb2898ae3d..20707a4f29 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -962,8 +962,10 @@ "Hangup": "Hangup", "Upload file": "Upload file", "Send an encrypted reply…": "Send an encrypted reply…", - "Send a reply (unencrypted)…": "Send a reply (unencrypted)…", + "Send a reply…": "Send a reply…", "Send an encrypted message…": "Send an encrypted message…", + "Send a message…": "Send a message…", + "Send a reply (unencrypted)…": "Send a reply (unencrypted)…", "Send a message (unencrypted)…": "Send a message (unencrypted)…", "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.", From e9dccd1460935cd8e68fe8f9595223cc7ebac4ba Mon Sep 17 00:00:00 2001 From: Zoe Date: Thu, 23 Jan 2020 14:44:57 +0000 Subject: [PATCH 159/906] moving icons exactly one pixel to the right and one pixel down --- res/css/views/rooms/_RoomHeader.scss | 4 ++-- res/css/views/rooms/_RoomTile.scss | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/res/css/views/rooms/_RoomHeader.scss b/res/css/views/rooms/_RoomHeader.scss index a235a47fdd..6bfcd437c1 100644 --- a/res/css/views/rooms/_RoomHeader.scss +++ b/res/css/views/rooms/_RoomHeader.scss @@ -21,8 +21,8 @@ limitations under the License. .mx_E2EIcon { margin: 0; position: absolute; - bottom: 0; - right: -1px; + bottom: -1px; + right: -2px; height: 10px; width: 10px } diff --git a/res/css/views/rooms/_RoomTile.scss b/res/css/views/rooms/_RoomTile.scss index a36d781669..376f4370e3 100644 --- a/res/css/views/rooms/_RoomTile.scss +++ b/res/css/views/rooms/_RoomTile.scss @@ -105,8 +105,8 @@ limitations under the License. width: 10px; display: block; position: absolute; - bottom: -0px; - right: -1px; + bottom: -1px; + right: -2px; z-index: 1; margin: 0; } From 604e244265df6a4637cdb772ea779dd066f3d137 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 23 Jan 2020 14:53:41 +0000 Subject: [PATCH 160/906] Attempt to fix Safari + VoiceOver misunderstanding the timeline list --- src/components/structures/ScrollPanel.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/structures/ScrollPanel.js b/src/components/structures/ScrollPanel.js index bc7c400949..5121dd3f9d 100644 --- a/src/components/structures/ScrollPanel.js +++ b/src/components/structures/ScrollPanel.js @@ -877,11 +877,14 @@ export default createReactClass({ // TODO: the classnames on the div and ol could do with being updated to // reflect the fact that we don't necessarily contain a list of messages. // it's not obvious why we have a separate div and ol anyway. + + // give the
      an explicit role=list because Safari+VoiceOver seems to think an ordered-list with + // list-style-type: none; is no longer a list return (
      -
        +
          { this.props.children }
      From 8a523fbb594174f54608691cf3c172e6b2ba8364 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 23 Jan 2020 15:53:54 +0100 Subject: [PATCH 161/906] remove this log line, so we can remove the .event property this is likely the error Dave hit last week, because there was no .request event set yet for some other reasons that have been fixed already (the event being put in the wrong map, theirs instead of us) in the VerificationRequest object. --- src/components/structures/MatrixChat.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 3ac8a93e3d..cc5695cf31 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1453,7 +1453,6 @@ export default createReactClass({ if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { cli.on("crypto.verification.request", request => { - console.log(`MatrixChat got a .request ${request.channel.transactionId}`, request.event.getRoomId()); if (request.pending) { ToastStore.sharedInstance().addOrReplaceToast({ key: 'verifreq_' + request.channel.transactionId, From 1e25b32ba395f3bf714241f6f5eab202a2a49c31 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 23 Jan 2020 16:00:55 +0000 Subject: [PATCH 162/906] Enable encryption in DMs with device keys When the cross-signing lab is enabled, this changes DMs to use encryption as long as all invited users have uploaded device keys (which we're using as a proxy for "has some client that understands E2E"). Fixes https://github.com/vector-im/riot-web/issues/12005 --- src/components/views/dialogs/InviteDialog.js | 24 +++++++++++++++++--- src/components/views/right_panel/UserInfo.js | 24 +++++++++++++++++--- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/components/views/dialogs/InviteDialog.js b/src/components/views/dialogs/InviteDialog.js index 703b0b5121..fde21791e7 100644 --- a/src/components/views/dialogs/InviteDialog.js +++ b/src/components/views/dialogs/InviteDialog.js @@ -33,6 +33,7 @@ import Modal from "../../../Modal"; import {humanizeTime} from "../../../utils/humanize"; import createRoom from "../../../createRoom"; import {inviteMultipleToRoom} from "../../../RoomInvite"; +import SettingsStore from '../../../settings/SettingsStore'; export const KIND_DM = "dm"; export const KIND_INVITE = "invite"; @@ -493,7 +494,7 @@ export default class InviteDialog extends React.PureComponent { return false; } - _startDm = () => { + _startDm = async () => { this.setState({busy: true}); const targetIds = this.state.targets.map(t => t.userId); @@ -510,14 +511,31 @@ export default class InviteDialog extends React.PureComponent { return; } + const createRoomOptions = {}; + + if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { + // Check whether all users have uploaded device keys before. + // If so, enable encryption in the new room. + const client = MatrixClientPeg.get(); + const usersToDevicesMap = await client.downloadKeys(targetIds); + const allHaveDeviceKeys = Object.values(usersToDevicesMap).every(devices => { + // `devices` is an object of the form { deviceId: deviceInfo, ... }. + return Object.keys(devices).length > 0; + }); + if (allHaveDeviceKeys) { + createRoomOptions.encryption = true; + } + } + // Check if it's a traditional DM and create the room if required. // TODO: [Canonical DMs] Remove this check and instead just create the multi-person DM let createRoomPromise = Promise.resolve(); if (targetIds.length === 1) { - createRoomPromise = createRoom({dmUserId: targetIds[0]}); + createRoomOptions.dmUserId = targetIds[0]; + createRoomPromise = createRoom(createRoomOptions); } else { // Create a boring room and try to invite the targets manually. - createRoomPromise = createRoom().then(roomId => { + createRoomPromise = createRoom(createRoomOptions).then(roomId => { return inviteMultipleToRoom(roomId, targetIds); }).then(result => { if (this._shouldAbortAfterInviteError(result)) { diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index b08f07ace4..01d0002801 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -82,7 +82,7 @@ const _getE2EStatus = (cli, userId, devices) => { return "warning"; }; -function openDMForUser(matrixClient, userId) { +async function openDMForUser(matrixClient, userId) { const dmRooms = DMRoomMap.shared().getDMRoomsForUserId(userId); const lastActiveRoom = dmRooms.reduce((lastActiveRoom, roomId) => { const room = matrixClient.getRoom(roomId); @@ -100,9 +100,27 @@ function openDMForUser(matrixClient, userId) { action: 'view_room', room_id: lastActiveRoom.roomId, }); - } else { - createRoom({dmUserId: userId}); + return; } + + const createRoomOptions = { + dmUserId: userId, + }; + + if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { + // Check whether all users have uploaded device keys before. + // If so, enable encryption in the new room. + const usersToDevicesMap = await matrixClient.downloadKeys([userId]); + const allHaveDeviceKeys = Object.values(usersToDevicesMap).every(devices => { + // `devices` is an object of the form { deviceId: deviceInfo, ... }. + return Object.keys(devices).length > 0; + }); + if (allHaveDeviceKeys) { + createRoomOptions.encryption = true; + } + } + + createRoom(createRoomOptions); } function useIsEncrypted(cli, room) { From 237a0ed07121992faecff207d783c0c63634b260 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 23 Jan 2020 16:09:32 +0000 Subject: [PATCH 163/906] Make the entire User Info scrollable, sticky close button --- res/css/views/right_panel/_UserInfo.scss | 22 +++++--- src/components/views/right_panel/UserInfo.js | 57 ++++++++++---------- 2 files changed, 43 insertions(+), 36 deletions(-) diff --git a/res/css/views/right_panel/_UserInfo.scss b/res/css/views/right_panel/_UserInfo.scss index e87fe06a94..d2d9d12c6d 100644 --- a/res/css/views/right_panel/_UserInfo.scss +++ b/res/css/views/right_panel/_UserInfo.scss @@ -23,15 +23,23 @@ limitations under the License. font-size: 12px; .mx_UserInfo_cancel { - height: 16px; - width: 16px; - padding: 10px 0 10px 10px; cursor: pointer; - mask-image: url('$(res)/img/minimise.svg'); - mask-repeat: no-repeat; - mask-position: 16px center; - background-color: $rightpanel-button-color; position: absolute; + top: 0; + border-radius: 4px; + background-color: $dark-panel-bg-color; + margin: 9px; + z-index: 1; // render on top of the right panel + + div { + height: 16px; + width: 16px; + padding: 4px; + mask-image: url('$(res)/img/minimise.svg'); + mask-repeat: no-repeat; + mask-position: 7px center; + background-color: $rightpanel-button-color; + } } h2 { diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index b08f07ace4..31431d56a4 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -1219,10 +1219,9 @@ const UserInfo = ({user, groupId, roomId, onClose}) => { let closeButton; if (onClose) { - closeButton = ; + closeButton = +
      + ; } const memberDetails = ( @@ -1338,32 +1337,32 @@ const UserInfo = ({user, groupId, roomId, onClose}) => { return (
      - { closeButton } - { avatarElement } - -
      -
      -
      -

      - { e2eIcon } - { displayName } -

      -
      -
      { user.userId }
      -
      - {presenceLabel} - {statusLabel} -
      -
      -
      - - { memberDetails &&
      -
      - { memberDetails } -
      -
      } - + { closeButton } + { avatarElement } + +
      +
      +
      +

      + { e2eIcon } + { displayName } +

      +
      +
      { user.userId }
      +
      + {presenceLabel} + {statusLabel} +
      +
      +
      + + { memberDetails &&
      +
      + { memberDetails } +
      +
      } + { securitySection } Date: Thu, 23 Jan 2020 18:14:08 +0000 Subject: [PATCH 164/906] Remove riot logo from the security setup screens With a little faff to make the rounded borders consistent again --- res/css/views/auth/_AuthBody.scss | 4 ++++ .../structures/auth/CompleteSecurity.js | 3 +-- src/components/views/auth/AuthBody.js | 18 +++++++++++++++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/res/css/views/auth/_AuthBody.scss b/res/css/views/auth/_AuthBody.scss index b05629003e..d342de6d75 100644 --- a/res/css/views/auth/_AuthBody.scss +++ b/res/css/views/auth/_AuthBody.scss @@ -95,6 +95,10 @@ limitations under the License. } } +.mx_AuthBody_noHeader { + border-radius: 4px; +} + .mx_AuthBody_editServerDetails { padding-left: 1em; font-size: 12px; diff --git a/src/components/structures/auth/CompleteSecurity.js b/src/components/structures/auth/CompleteSecurity.js index b64f368908..982360e8c1 100644 --- a/src/components/structures/auth/CompleteSecurity.js +++ b/src/components/structures/auth/CompleteSecurity.js @@ -161,8 +161,7 @@ export default class CompleteSecurity extends React.Component { return ( - - +

      {icon} {title} diff --git a/src/components/views/auth/AuthBody.js b/src/components/views/auth/AuthBody.js index 9a078efb52..db5c941b20 100644 --- a/src/components/views/auth/AuthBody.js +++ b/src/components/views/auth/AuthBody.js @@ -17,10 +17,26 @@ limitations under the License. 'use strict'; import React from 'react'; +import PropTypes from 'prop-types'; + +import classnames from 'classnames'; export default class AuthBody extends React.PureComponent { + static PropTypes = { + header: PropTypes.bool, + }; + + static defaultProps = { + header: true, + }; + render() { - return
      + const classes = { + 'mx_AuthBody': true, + 'mx_AuthBody_noHeader': !this.props.header, + }; + + return
      { this.props.children }
      ; } From a3026277c1c03a929f95308bcfd97b26cca83067 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 23 Jan 2020 18:24:03 +0000 Subject: [PATCH 165/906] Unused variable --- src/components/structures/auth/CompleteSecurity.js | 1 - src/components/views/settings/KeyBackupPanel.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/structures/auth/CompleteSecurity.js b/src/components/structures/auth/CompleteSecurity.js index 982360e8c1..d2cea9b00a 100644 --- a/src/components/structures/auth/CompleteSecurity.js +++ b/src/components/structures/auth/CompleteSecurity.js @@ -74,7 +74,6 @@ export default class CompleteSecurity extends React.Component { render() { const AuthPage = sdk.getComponent("auth.AuthPage"); - const AuthHeader = sdk.getComponent("auth.AuthHeader"); const AuthBody = sdk.getComponent("auth.AuthBody"); const AccessibleButton = sdk.getComponent("elements.AccessibleButton"); diff --git a/src/components/views/settings/KeyBackupPanel.js b/src/components/views/settings/KeyBackupPanel.js index fd166782d8..cd8cdfa5d9 100644 --- a/src/components/views/settings/KeyBackupPanel.js +++ b/src/components/views/settings/KeyBackupPanel.js @@ -127,7 +127,7 @@ export default class KeyBackupPanel extends React.PureComponent { Modal.createTrackedDialogAsync('Key Backup', 'Key Backup', import('../../../async-components/views/dialogs/keybackup/CreateKeyBackupDialog'), { - secureSecretStorage: SettingsStore.isFeatureEnabled("feature_cross_signing"), + secureSecretStorage: false, onFinished: () => { this._loadBackupStatus(); }, From 74b678d0ff4444f1522c68b5e68628659628f9b5 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 23 Jan 2020 19:19:12 +0000 Subject: [PATCH 166/906] Only say the session is verified if it is now verified --- src/components/structures/auth/CompleteSecurity.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/structures/auth/CompleteSecurity.js b/src/components/structures/auth/CompleteSecurity.js index b64f368908..741306a68b 100644 --- a/src/components/structures/auth/CompleteSecurity.js +++ b/src/components/structures/auth/CompleteSecurity.js @@ -44,9 +44,12 @@ export default class CompleteSecurity extends React.Component { await accessSecretStorage(async () => { await cli.checkOwnCrossSigningTrust(); }); - this.setState({ - phase: PHASE_DONE, - }); + + if (cli.getCrossSigningId()) { + this.setState({ + phase: PHASE_DONE, + }); + } } catch (e) { // this will throw if the user hits cancel, so ignore } From 4cff50a11e0e4d4a7c008ac38835010e63aacff4 Mon Sep 17 00:00:00 2001 From: catborise Date: Thu, 23 Jan 2020 18:29:15 +0000 Subject: [PATCH 167/906] Translated using Weblate (Turkish) Currently translated at 72.9% (1494 of 2050 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/tr/ --- src/i18n/strings/tr.json | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 21ccf03a46..2656b00593 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -1496,5 +1496,19 @@ "Create a public room": "Halka açık bir oda oluşturun", "Make this room public": "Bu odayı halka açık yap", "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 Riot to do this": "Sohbet tarihçesini kaybetmemek için, çıkmadan önce odanızın anahtarlarını dışarıya aktarın. Bunu yapabilmek için Riotun daha yeni sürümü gerekli. Ulaşmak için geri gitmeye ihtiyacınız var", - "Continue With Encryption Disabled": "Şifreleme Kapalı Şekilde Devam Et" + "Continue With Encryption Disabled": "Şifreleme Kapalı Şekilde Devam Et", + "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "%(fileName)s dosyası anasunucunun yükleme boyutu limitini aşıyor", + "Double check that your server supports the room version chosen and try again.": "Seçtiğiniz oda sürümünün sunucunuz tarafından desteklenip desteklenmediğini iki kez kontrol edin ve yeniden deneyin.", + "Changes your avatar in this current room only": "Sadece bu odadaki resminizi değiştirin", + "Please supply a https:// or http:// widget URL": "Lütfen bir https:// ya da http:// olarak bir görsel bileşen URL i belirtin", + "Sends the given emote coloured as a rainbow": "Verilen ifadeyi bir gökkuşağı gibi renklendirilmiş olarak gönderin", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s ekran adını %(displayName)s olarak değiştirdi.", + "%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s odayı adresi bilen herkesin girebileceği şekilde halka açık hale getirdi.", + "%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s katılma kuralını %(rule)s şeklinde değiştirdi", + "%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s misafir erişim kuralını %(rule)s şeklinde değiştirdi", + "%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s bu odanın ana adresini %(address)s olarak ayarladı.", + "%(senderName)s placed a voice call.": "%(senderName)s bir çağrı yaptı.", + "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s bir çağrı başlattı. (Bu tarayıcı tarafından desteklenmiyor)", + "%(senderName)s placed a video call.": "%(senderName)s bir görüntülü çağrı yaptı.", + "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s bir görüntülü çağrı yaptı. (bu tarayıcı tarafından desteklenmiyor)" } From 6fc647c3d969aff9bba47e209e2b48bbebfc91a6 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 23 Jan 2020 14:59:52 -0700 Subject: [PATCH 168/906] Don't list every single alias when there's many --- src/TextForEvent.js | 24 ++++++++++++++++++++++++ src/i18n/strings/en_EN.json | 3 +++ 2 files changed, 27 insertions(+) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index a0d088affb..6a2744109b 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -275,6 +275,8 @@ function textForRoomAliasesEvent(ev) { // This feels a bit overkill though, and it's not clear the i18n really needs it // so instead it's landing as a simple textual event. + const maxShown = 3; + const senderName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); const oldAliases = ev.getPrevContent().aliases || []; const newAliases = ev.getContent().aliases || []; @@ -287,18 +289,40 @@ function textForRoomAliasesEvent(ev) { } if (addedAliases.length && !removedAliases.length) { + if (addedAliases.length > maxShown) { + return _t("%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room", { + senderName: senderName, + count: addedAliases.length - maxShown, + addedAddresses: addedAliases.slice(0, maxShown).join(', '), + }); + } return _t('%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.', { senderName: senderName, count: addedAliases.length, addedAddresses: addedAliases.join(', '), }); } else if (!addedAliases.length && removedAliases.length) { + if (removedAliases.length > maxShown) { + return _t("%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room", { + senderName: senderName, + count: removedAliases.length - maxShown, + removedAddresses: removedAliases.slice(0, maxShown).join(', '), + }); + } return _t('%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.', { senderName: senderName, count: removedAliases.length, removedAddresses: removedAliases.join(', '), }); } else { + const combined = addedAliases.length + removedAliases.length; + if (combined > maxShown) { + return _t("%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room", { + senderName: senderName, + countAdded: addedAliases.length, + countRemoved: removedAliases.length, + }); + } return _t( '%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.', { senderName: senderName, diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 9060279e54..c86640132a 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -235,10 +235,13 @@ "%(senderDisplayName)s disabled flair for %(groups)s in this room.": "%(senderDisplayName)s disabled flair for %(groups)s in this room.", "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sent an image.", + "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room", "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s added %(addedAddresses)s as addresses for this room.", "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s added %(addedAddresses)s as an address for this room.", + "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room", "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s removed %(removedAddresses)s as addresses for this room.", "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s removed %(removedAddresses)s as an address for this room.", + "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room", "%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.", "%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s set the main address for this room to %(address)s.", "%(senderName)s removed the main address for this room.": "%(senderName)s removed the main address for this room.", From 1ac82a9f165c145c12ea796eb29968a97e37a510 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 23 Jan 2020 14:59:52 -0700 Subject: [PATCH 169/906] Revert "Don't list every single alias when there's many" This reverts commit 6fc647c3d969aff9bba47e209e2b48bbebfc91a6. --- src/TextForEvent.js | 24 ------------------------ src/i18n/strings/en_EN.json | 3 --- 2 files changed, 27 deletions(-) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index 6a2744109b..a0d088affb 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -275,8 +275,6 @@ function textForRoomAliasesEvent(ev) { // This feels a bit overkill though, and it's not clear the i18n really needs it // so instead it's landing as a simple textual event. - const maxShown = 3; - const senderName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); const oldAliases = ev.getPrevContent().aliases || []; const newAliases = ev.getContent().aliases || []; @@ -289,40 +287,18 @@ function textForRoomAliasesEvent(ev) { } if (addedAliases.length && !removedAliases.length) { - if (addedAliases.length > maxShown) { - return _t("%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room", { - senderName: senderName, - count: addedAliases.length - maxShown, - addedAddresses: addedAliases.slice(0, maxShown).join(', '), - }); - } return _t('%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.', { senderName: senderName, count: addedAliases.length, addedAddresses: addedAliases.join(', '), }); } else if (!addedAliases.length && removedAliases.length) { - if (removedAliases.length > maxShown) { - return _t("%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room", { - senderName: senderName, - count: removedAliases.length - maxShown, - removedAddresses: removedAliases.slice(0, maxShown).join(', '), - }); - } return _t('%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.', { senderName: senderName, count: removedAliases.length, removedAddresses: removedAliases.join(', '), }); } else { - const combined = addedAliases.length + removedAliases.length; - if (combined > maxShown) { - return _t("%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room", { - senderName: senderName, - countAdded: addedAliases.length, - countRemoved: removedAliases.length, - }); - } return _t( '%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.', { senderName: senderName, diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index c86640132a..9060279e54 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -235,13 +235,10 @@ "%(senderDisplayName)s disabled flair for %(groups)s in this room.": "%(senderDisplayName)s disabled flair for %(groups)s in this room.", "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sent an image.", - "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room", "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s added %(addedAddresses)s as addresses for this room.", "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s added %(addedAddresses)s as an address for this room.", - "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room", "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s removed %(removedAddresses)s as addresses for this room.", "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s removed %(removedAddresses)s as an address for this room.", - "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room", "%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.", "%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s set the main address for this room to %(address)s.", "%(senderName)s removed the main address for this room.": "%(senderName)s removed the main address for this room.", From 18f8f8858c92d11806bf08d5c1125f562f7871b2 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 23 Jan 2020 14:59:52 -0700 Subject: [PATCH 170/906] Don't list every single alias when there's many --- src/TextForEvent.js | 24 ++++++++++++++++++++++++ src/i18n/strings/en_EN.json | 3 +++ 2 files changed, 27 insertions(+) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index a0d088affb..6a2744109b 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -275,6 +275,8 @@ function textForRoomAliasesEvent(ev) { // This feels a bit overkill though, and it's not clear the i18n really needs it // so instead it's landing as a simple textual event. + const maxShown = 3; + const senderName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); const oldAliases = ev.getPrevContent().aliases || []; const newAliases = ev.getContent().aliases || []; @@ -287,18 +289,40 @@ function textForRoomAliasesEvent(ev) { } if (addedAliases.length && !removedAliases.length) { + if (addedAliases.length > maxShown) { + return _t("%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room", { + senderName: senderName, + count: addedAliases.length - maxShown, + addedAddresses: addedAliases.slice(0, maxShown).join(', '), + }); + } return _t('%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.', { senderName: senderName, count: addedAliases.length, addedAddresses: addedAliases.join(', '), }); } else if (!addedAliases.length && removedAliases.length) { + if (removedAliases.length > maxShown) { + return _t("%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room", { + senderName: senderName, + count: removedAliases.length - maxShown, + removedAddresses: removedAliases.slice(0, maxShown).join(', '), + }); + } return _t('%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.', { senderName: senderName, count: removedAliases.length, removedAddresses: removedAliases.join(', '), }); } else { + const combined = addedAliases.length + removedAliases.length; + if (combined > maxShown) { + return _t("%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room", { + senderName: senderName, + countAdded: addedAliases.length, + countRemoved: removedAliases.length, + }); + } return _t( '%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.', { senderName: senderName, diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 9060279e54..c86640132a 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -235,10 +235,13 @@ "%(senderDisplayName)s disabled flair for %(groups)s in this room.": "%(senderDisplayName)s disabled flair for %(groups)s in this room.", "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sent an image.", + "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room", "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s added %(addedAddresses)s as addresses for this room.", "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s added %(addedAddresses)s as an address for this room.", + "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room", "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s removed %(removedAddresses)s as addresses for this room.", "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s removed %(removedAddresses)s as an address for this room.", + "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room", "%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.", "%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s set the main address for this room to %(address)s.", "%(senderName)s removed the main address for this room.": "%(senderName)s removed the main address for this room.", From 6f6d149a7077064cfa953b33e9ec02891f55dd13 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 23 Jan 2020 14:59:52 -0700 Subject: [PATCH 171/906] Don't list every single alias when there's many --- src/TextForEvent.js | 24 ++++++++++++++++++++++++ src/i18n/strings/en_EN.json | 3 +++ 2 files changed, 27 insertions(+) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index a0d088affb..6a2744109b 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -275,6 +275,8 @@ function textForRoomAliasesEvent(ev) { // This feels a bit overkill though, and it's not clear the i18n really needs it // so instead it's landing as a simple textual event. + const maxShown = 3; + const senderName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); const oldAliases = ev.getPrevContent().aliases || []; const newAliases = ev.getContent().aliases || []; @@ -287,18 +289,40 @@ function textForRoomAliasesEvent(ev) { } if (addedAliases.length && !removedAliases.length) { + if (addedAliases.length > maxShown) { + return _t("%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room", { + senderName: senderName, + count: addedAliases.length - maxShown, + addedAddresses: addedAliases.slice(0, maxShown).join(', '), + }); + } return _t('%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.', { senderName: senderName, count: addedAliases.length, addedAddresses: addedAliases.join(', '), }); } else if (!addedAliases.length && removedAliases.length) { + if (removedAliases.length > maxShown) { + return _t("%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room", { + senderName: senderName, + count: removedAliases.length - maxShown, + removedAddresses: removedAliases.slice(0, maxShown).join(', '), + }); + } return _t('%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.', { senderName: senderName, count: removedAliases.length, removedAddresses: removedAliases.join(', '), }); } else { + const combined = addedAliases.length + removedAliases.length; + if (combined > maxShown) { + return _t("%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room", { + senderName: senderName, + countAdded: addedAliases.length, + countRemoved: removedAliases.length, + }); + } return _t( '%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.', { senderName: senderName, diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 4af203177c..853cd1f744 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -236,10 +236,13 @@ "%(senderDisplayName)s disabled flair for %(groups)s in this room.": "%(senderDisplayName)s disabled flair for %(groups)s in this room.", "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sent an image.", + "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room", "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s added %(addedAddresses)s as addresses for this room.", "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s added %(addedAddresses)s as an address for this room.", + "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room", "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s removed %(removedAddresses)s as addresses for this room.", "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s removed %(removedAddresses)s as an address for this room.", + "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room", "%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.", "%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s set the main address for this room to %(address)s.", "%(senderName)s removed the main address for this room.": "%(senderName)s removed the main address for this room.", From 4aa3be9b42698e5b963c02494379ac60b9d67e8b Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 23 Jan 2020 15:38:06 -0700 Subject: [PATCH 172/906] Move & upgrade babel runtime into dependencies (like it wants) https://babeljs.io/docs/en/babel-runtime --- package.json | 4 ++-- yarn.lock | 42 +++++++++++++++++++++++++++++++++++------- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 8f49eed4b5..0c1d66058a 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "test:e2e": "./test/end-to-end-tests/run.sh --riot-url http://localhost:8080" }, "dependencies": { + "@babel/runtime": "^7.8.3", "blueimp-canvas-to-blob": "^3.5.0", "browser-encrypt-attachment": "^0.3.0", "browser-request": "^0.3.3", @@ -108,13 +109,12 @@ "@babel/plugin-proposal-numeric-separator": "^7.7.4", "@babel/plugin-proposal-object-rest-spread": "^7.7.4", "@babel/plugin-transform-flow-comments": "^7.7.4", - "@babel/plugin-transform-runtime": "^7.7.6", + "@babel/plugin-transform-runtime": "^7.8.3", "@babel/preset-env": "^7.7.6", "@babel/preset-flow": "^7.7.4", "@babel/preset-react": "^7.7.4", "@babel/preset-typescript": "^7.7.4", "@babel/register": "^7.7.4", - "@babel/runtime": "^7.7.6", "@peculiar/webcrypto": "^1.0.22", "babel-eslint": "^10.0.3", "babel-jest": "^24.9.0", diff --git a/yarn.lock b/yarn.lock index 0177629cd8..576cd019ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -211,6 +211,13 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-module-imports@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" + integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== + dependencies: + "@babel/types" "^7.8.3" + "@babel/helper-module-transforms@^7.7.4", "@babel/helper-module-transforms@^7.7.5": version "7.7.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.5.tgz#d044da7ffd91ec967db25cd6748f704b6b244835" @@ -235,6 +242,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== +"@babel/helper-plugin-utils@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" + integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== + "@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" @@ -735,13 +747,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-runtime@^7.7.6": - version "7.7.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.7.6.tgz#4f2b548c88922fb98ec1c242afd4733ee3e12f61" - integrity sha512-tajQY+YmXR7JjTwRvwL4HePqoL3DYxpYXIHKVvrOIvJmeHe2y1w4tz5qz9ObUDC9m76rCzIMPyn4eERuwA4a4A== +"@babel/plugin-transform-runtime@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz#c0153bc0a5375ebc1f1591cb7eea223adea9f169" + integrity sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ== dependencies: - "@babel/helper-module-imports" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" resolve "^1.8.1" semver "^5.5.1" @@ -894,7 +906,7 @@ pirates "^4.0.0" source-map-support "^0.5.16" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.7.6": +"@babel/runtime@^7.0.0": version "7.7.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.6.tgz#d18c511121aff1b4f2cd1d452f1bac9601dd830f" integrity sha512-BWAJxpNVa0QlE5gZdWjSxXtemZyZ9RmrmVozxt3NUXeZhVIJ5ANyqmMc0JDrivBZyxUuQvFxlvH4OWWOogGfUw== @@ -908,6 +920,13 @@ dependencies: regenerator-runtime "^0.13.2" +"@babel/runtime@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.3.tgz#0811944f73a6c926bb2ad35e918dcc1bfab279f1" + integrity sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w== + dependencies: + regenerator-runtime "^0.13.2" + "@babel/template@^7.4.0", "@babel/template@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" @@ -941,6 +960,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" + integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@cnakazawa/watch@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" From a330ee186aafd758cc4f6ed274b92f7afe764c65 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 23 Jan 2020 15:38:06 -0700 Subject: [PATCH 173/906] Move & upgrade babel runtime into dependencies (like it wants) https://babeljs.io/docs/en/babel-runtime --- package.json | 4 ++-- yarn.lock | 42 +++++++++++++++++++++++++++++++++++------- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 9203b20bfa..dc619e50ef 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "test:e2e": "./test/end-to-end-tests/run.sh --riot-url http://localhost:8080" }, "dependencies": { + "@babel/runtime": "^7.8.3", "blueimp-canvas-to-blob": "^3.5.0", "browser-encrypt-attachment": "^0.3.0", "browser-request": "^0.3.3", @@ -108,13 +109,12 @@ "@babel/plugin-proposal-numeric-separator": "^7.7.4", "@babel/plugin-proposal-object-rest-spread": "^7.7.4", "@babel/plugin-transform-flow-comments": "^7.7.4", - "@babel/plugin-transform-runtime": "^7.7.6", + "@babel/plugin-transform-runtime": "^7.8.3", "@babel/preset-env": "^7.7.6", "@babel/preset-flow": "^7.7.4", "@babel/preset-react": "^7.7.4", "@babel/preset-typescript": "^7.7.4", "@babel/register": "^7.7.4", - "@babel/runtime": "^7.7.6", "@peculiar/webcrypto": "^1.0.22", "babel-eslint": "^10.0.3", "babel-jest": "^24.9.0", diff --git a/yarn.lock b/yarn.lock index 808721a188..75c5af6a1d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -211,6 +211,13 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-module-imports@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" + integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== + dependencies: + "@babel/types" "^7.8.3" + "@babel/helper-module-transforms@^7.7.4", "@babel/helper-module-transforms@^7.7.5": version "7.7.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.5.tgz#d044da7ffd91ec967db25cd6748f704b6b244835" @@ -235,6 +242,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== +"@babel/helper-plugin-utils@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" + integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== + "@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" @@ -735,13 +747,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-runtime@^7.7.6": - version "7.7.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.7.6.tgz#4f2b548c88922fb98ec1c242afd4733ee3e12f61" - integrity sha512-tajQY+YmXR7JjTwRvwL4HePqoL3DYxpYXIHKVvrOIvJmeHe2y1w4tz5qz9ObUDC9m76rCzIMPyn4eERuwA4a4A== +"@babel/plugin-transform-runtime@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz#c0153bc0a5375ebc1f1591cb7eea223adea9f169" + integrity sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ== dependencies: - "@babel/helper-module-imports" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" resolve "^1.8.1" semver "^5.5.1" @@ -894,7 +906,7 @@ pirates "^4.0.0" source-map-support "^0.5.16" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.7.6": +"@babel/runtime@^7.0.0": version "7.7.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.6.tgz#d18c511121aff1b4f2cd1d452f1bac9601dd830f" integrity sha512-BWAJxpNVa0QlE5gZdWjSxXtemZyZ9RmrmVozxt3NUXeZhVIJ5ANyqmMc0JDrivBZyxUuQvFxlvH4OWWOogGfUw== @@ -908,6 +920,13 @@ dependencies: regenerator-runtime "^0.13.2" +"@babel/runtime@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.3.tgz#0811944f73a6c926bb2ad35e918dcc1bfab279f1" + integrity sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w== + dependencies: + regenerator-runtime "^0.13.2" + "@babel/template@^7.4.0", "@babel/template@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" @@ -941,6 +960,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" + integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@cnakazawa/watch@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" From 915c4efeacbfa03dd6e20d66512d71bcf0e14db1 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 23 Jan 2020 15:53:32 -0700 Subject: [PATCH 174/906] Ensure a plaintext version of the composer ends up on the clipboard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes https://github.com/vector-im/riot-web/issues/12018 --- src/components/views/rooms/BasicMessageComposer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/views/rooms/BasicMessageComposer.js b/src/components/views/rooms/BasicMessageComposer.js index 73c3d961ee..d2b6f8cbc8 100644 --- a/src/components/views/rooms/BasicMessageComposer.js +++ b/src/components/views/rooms/BasicMessageComposer.js @@ -209,6 +209,7 @@ export default class BasicMessageEditor extends React.Component { const range = getRangeForSelection(this._editorRef, model, selection); const selectedParts = range.parts.map(p => p.serialize()); event.clipboardData.setData("application/x-riot-composer", JSON.stringify(selectedParts)); + event.clipboardData.setData("text/plain", text); // so plain copy/paste works if (type === "cut") { // Remove the text, updating the model as appropriate this._modifiedFlag = true; From 6adfa35445e3514c1f2323674949bce242b50da4 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 23 Jan 2020 15:53:32 -0700 Subject: [PATCH 175/906] Ensure a plaintext version of the composer ends up on the clipboard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes https://github.com/vector-im/riot-web/issues/12018 --- src/components/views/rooms/BasicMessageComposer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/views/rooms/BasicMessageComposer.js b/src/components/views/rooms/BasicMessageComposer.js index 94904242c3..3c67b4ed60 100644 --- a/src/components/views/rooms/BasicMessageComposer.js +++ b/src/components/views/rooms/BasicMessageComposer.js @@ -208,6 +208,7 @@ export default class BasicMessageEditor extends React.Component { const range = getRangeForSelection(this._editorRef, model, selection); const selectedParts = range.parts.map(p => p.serialize()); event.clipboardData.setData("application/x-riot-composer", JSON.stringify(selectedParts)); + event.clipboardData.setData("text/plain", text); // so plain copy/paste works if (type === "cut") { // Remove the text, updating the model as appropriate this._modifiedFlag = true; From c22bfa84b7498635916ad4afc8ce2f16f530bef3 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 23 Jan 2020 16:29:55 -0700 Subject: [PATCH 176/906] Hide password section if you can't change your password Fixes https://github.com/vector-im/riot-web/issues/11950 --- .../tabs/user/GeneralUserSettingsTab.js | 18 +++++++++++++++--- src/i18n/strings/en_EN.json | 2 +- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js b/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js index b9eaa3efa3..1325a1c583 100644 --- a/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js @@ -70,7 +70,12 @@ export default class GeneralUserSettingsTab extends React.Component { const cli = MatrixClientPeg.get(); const serverSupportsSeparateAddAndBind = await cli.doesServerSupportSeparateAddAndBind(); - this.setState({serverSupportsSeparateAddAndBind}); + + const capabilities = await cli.getCapabilities(); // this is cached + const changePasswordCap = capabilities['m.change_password']; + const canChangePassword = changePasswordCap && changePasswordCap['enabled'] === false; + + this.setState({serverSupportsSeparateAddAndBind, canChangePassword}); this._getThreepidState(); } @@ -280,7 +285,7 @@ export default class GeneralUserSettingsTab extends React.Component { const PhoneNumbers = sdk.getComponent("views.settings.account.PhoneNumbers"); const Spinner = sdk.getComponent("views.elements.Spinner"); - const passwordChangeForm = ( + let passwordChangeForm = ( ; } + let passwordChangeText = _t("Set a new account password..."); + if (!this.state.canChangePassword) { + // Just don't show anything if you can't do anything. + passwordChangeText = null; + passwordChangeForm = null; + } + return (
      {_t("Account")}

      - {_t("Set a new account password...")} + {passwordChangeText}

      {passwordChangeForm} {threepidSection} diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index c86640132a..099b64dd49 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -665,8 +665,8 @@ "Profile": "Profile", "Email addresses": "Email addresses", "Phone numbers": "Phone numbers", - "Account": "Account", "Set a new account password...": "Set a new account password...", + "Account": "Account", "Language and region": "Language and region", "Theme": "Theme", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.", From 1394331133c7aedcd8de471422fdcd35b855b922 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 23 Jan 2020 16:33:33 -0700 Subject: [PATCH 177/906] Fix booleans --- .../views/settings/tabs/user/GeneralUserSettingsTab.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js b/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js index 1325a1c583..2d56df6be4 100644 --- a/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js @@ -73,7 +73,11 @@ export default class GeneralUserSettingsTab extends React.Component { const capabilities = await cli.getCapabilities(); // this is cached const changePasswordCap = capabilities['m.change_password']; - const canChangePassword = changePasswordCap && changePasswordCap['enabled'] === false; + + // You can change your password so long as the capability isn't explicitly disabled. The implicit + // behaviour is you can change your password when the capability is missing or has not-false as + // the enabled flag value. + const canChangePassword = !changePasswordCap || changePasswordCap['enabled'] !== false; this.setState({serverSupportsSeparateAddAndBind, canChangePassword}); From b5f22001b13292768ede9a20a275892e904f1433 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 23 Jan 2020 17:22:39 -0700 Subject: [PATCH 178/906] Fix copy --- src/components/views/dialogs/InviteDialog.js | 2 +- src/i18n/strings/en_EN.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/dialogs/InviteDialog.js b/src/components/views/dialogs/InviteDialog.js index a96028e71b..54a067d716 100644 --- a/src/components/views/dialogs/InviteDialog.js +++ b/src/components/views/dialogs/InviteDialog.js @@ -985,7 +985,7 @@ export default class InviteDialog extends React.PureComponent { title = _t("Direct Messages"); helpText = _t( - "If you can't find someone, ask them for their username, or share your " + + "If you can't find someone, ask them for their username, share your " + "username (%(userId)s) or profile link.", {userId}, {a: (sub) => {sub}}, diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 099b64dd49..e59805ccd7 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1472,7 +1472,7 @@ "Recently Direct Messaged": "Recently Direct Messaged", "Show more": "Show more", "Direct Messages": "Direct Messages", - "If you can't find someone, ask them for their username, or share your username (%(userId)s) or profile link.": "If you can't find someone, ask them for their username, or share your username (%(userId)s) or profile link.", + "If you can't find someone, ask them for their username, share your username (%(userId)s) or profile link.": "If you can't find someone, ask them for their username, share your username (%(userId)s) or profile link.", "Go": "Go", "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.": "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.", "You added a new device '%(displayName)s', which is requesting encryption keys.": "You added a new device '%(displayName)s', which is requesting encryption keys.", From 442ab9f30170743c26523ca867ac9d2821a979e4 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 23 Jan 2020 17:27:37 -0700 Subject: [PATCH 179/906] Clear the filter when a suggestion is accepted/added --- src/components/views/dialogs/InviteDialog.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/components/views/dialogs/InviteDialog.js b/src/components/views/dialogs/InviteDialog.js index 54a067d716..42319b1842 100644 --- a/src/components/views/dialogs/InviteDialog.js +++ b/src/components/views/dialogs/InviteDialog.js @@ -713,11 +713,16 @@ export default class InviteDialog extends React.PureComponent { }; _toggleMember = (member: Member) => { + let filterText = this.state.filterText; const targets = this.state.targets.map(t => t); // cheap clone for mutation const idx = targets.indexOf(member); - if (idx >= 0) targets.splice(idx, 1); - else targets.push(member); - this.setState({targets}); + if (idx >= 0) { + targets.splice(idx, 1); + } else { + targets.push(member); + filterText = ""; // clear the filter when the user accepts a suggestion + } + this.setState({targets, filterText}); }; _removeMember = (member: Member) => { @@ -917,7 +922,7 @@ export default class InviteDialog extends React.PureComponent { key={"input"} rows={1} onChange={this._updateFilter} - defaultValue={this.state.filterText} + value={this.state.filterText} ref={this._editorRef} onPaste={this._onPaste} /> From 32f9a4e6231cefbdb9790afcfcd10d2ab5f56ea9 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 23 Jan 2020 17:35:36 -0700 Subject: [PATCH 180/906] Add some debugging around the recently DM'd users The suggestions are relatively stable, but the recents have some issues. Adding logging to the suggestions would also destroy the console log with thousands of messages whereas recents aren't too bad. --- src/components/views/dialogs/InviteDialog.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/components/views/dialogs/InviteDialog.js b/src/components/views/dialogs/InviteDialog.js index 42319b1842..de11dbf9fa 100644 --- a/src/components/views/dialogs/InviteDialog.js +++ b/src/components/views/dialogs/InviteDialog.js @@ -338,19 +338,31 @@ export default class InviteDialog extends React.PureComponent { const recents = []; for (const userId in rooms) { // Filter out user IDs that are already in the room / should be excluded - if (excludedTargetIds.includes(userId)) continue; + if (excludedTargetIds.includes(userId)) { + console.warn(`[Invite:Recents] Excluding ${userId} from recents`); + continue; + } const room = rooms[userId]; const member = room.getMember(userId); - if (!member) continue; // just skip people who don't have memberships for some reason + if (!member) { + // just skip people who don't have memberships for some reason + console.warn(`[Invite:Recents] ${userId} is missing a member object in their own DM (${room.roomId})`); + continue; + } const lastEventTs = room.timeline && room.timeline.length ? room.timeline[room.timeline.length - 1].getTs() : 0; - if (!lastEventTs) continue; // something weird is going on with this room + if (!lastEventTs) { + // something weird is going on with this room + console.warn(`[Invite:Recents] ${userId} (${room.roomId}) has a weird last timestamp: ${lastEventTs}`); + continue; + } recents.push({userId, user: member, lastActive: lastEventTs}); } + if (!recents) console.warn("[Invite:Recents] No recents to suggest!"); // Sort the recents by last active to save us time later recents.sort((a, b) => b.lastActive - a.lastActive); From 1ec746c01411dafa8b2554d8463e2ec5bcd204eb Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 17 Jan 2020 19:53:33 -0700 Subject: [PATCH 181/906] Add verification with QR codes --- src/MatrixClientPeg.js | 2 +- .../elements/crypto/VerificationQRCode.js | 59 +++++++++++++++++++ .../views/right_panel/VerificationPanel.js | 22 ++++++- 3 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 src/components/views/elements/crypto/VerificationQRCode.js diff --git a/src/MatrixClientPeg.js b/src/MatrixClientPeg.js index dbc570c872..450bec8e77 100644 --- a/src/MatrixClientPeg.js +++ b/src/MatrixClientPeg.js @@ -217,7 +217,7 @@ class _MatrixClientPeg { timelineSupport: true, forceTURN: !SettingsStore.getValue('webRtcAllowPeerToPeer', false), fallbackICEServerAllowed: !!SettingsStore.getValue('fallbackICEServerAllowed'), - verificationMethods: [verificationMethods.SAS], + verificationMethods: [verificationMethods.SAS, verificationMethods.QR_CODE_SHOW], unstableClientRelationAggregation: true, identityServer: new IdentityAuthClient(), }; diff --git a/src/components/views/elements/crypto/VerificationQRCode.js b/src/components/views/elements/crypto/VerificationQRCode.js new file mode 100644 index 0000000000..c49dd3faf5 --- /dev/null +++ b/src/components/views/elements/crypto/VerificationQRCode.js @@ -0,0 +1,59 @@ +/* +Copyright 2020 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 React from "react"; +import PropTypes from "prop-types"; +import {replaceableComponent} from "../../../../utils/replaceableComponent"; +import * as qs from "qs"; +import QRCode from "qrcode-react"; + +@replaceableComponent("views.elements.crypto.VerificationQRCode") +export default class VerificationQRCode extends React.PureComponent { + static propTypes = { + // Common for all kinds of QR codes + keys: PropTypes.array.isRequired, // array of [Key ID, Key] pairs + action: PropTypes.string.isRequired, + keyholderUserId: PropTypes.string.isRequired, + + // User verification use case only + secret: PropTypes.string, + otherUserKey: PropTypes.string, + verificationKey: PropTypes.string, + verificationAlgorithms: PropTypes.array, + requestEventId: PropTypes.string, + }; + + static defaultProps = { + action: "verify", + }; + + render() { + const query = { + request: this.props.requestEventId, + action: this.props.action, + verification_algorithms: this.props.verificationAlgorithms, + verification_key: this.props.verificationKey, + other_user_key: this.props.otherUserKey, + }; + for (const key of this.props.keys) { + query[`key_${key[0]}`] = key[1]; + } + + const uri = `https://matrix.to/#/${this.props.keyholderUserId}?${qs.stringify(query)}`; + + return + } +} diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 0d28e1568f..a2038087fc 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -17,6 +17,9 @@ limitations under the License. import React from 'react'; import * as sdk from '../../../index'; import {verificationMethods} from 'matrix-js-sdk/src/crypto'; +import VerificationQRCode from "../elements/crypto/VerificationQRCode"; +import {VerificationRequest} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; +import {MatrixClientPeg} from "../../../MatrixClientPeg"; export default class VerificationPanel extends React.PureComponent { constructor(props) { @@ -36,15 +39,30 @@ export default class VerificationPanel extends React.PureComponent { renderStatus() { const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); const Spinner = sdk.getComponent('elements.Spinner'); - const {request} = this.props; + const {request: req} = this.props; + const request: VerificationRequest = req; if (request.requested) { return (

      Waiting for {request.otherUserId} to accept ...

      ); } else if (request.ready) { + const qrCodeKeys = [ + [MatrixClientPeg.get().getDeviceId(), MatrixClientPeg.get().getDeviceEd25519Key()], + [MatrixClientPeg.get().getCrossSigningId(), MatrixClientPeg.get().getCrossSigningKey("master")], + ]; + // TODO: Await a bunch of this + const otherCrossSigning = MatrixClientPeg.get().getStoredCrossSigningForUser(request.otherUserId); + const otherUserKey = otherCrossSigning ? otherCrossSigning.getCrossSigningKey("master") : null; + const qrCode = ; const verifyButton = Verify by emoji ; - return (

      {request.otherUserId} is ready, start {verifyButton}

      ); + return (

      {request.otherUserId} is ready, start {verifyButton} or have them scan: {qrCode}

      ); } else if (request.started) { if (this.state.sasWaitingForOtherParty) { return

      Waiting for {request.otherUserId} to confirm ...

      ; From 586a240e41721651ae661abb216de865504672bd Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 20 Jan 2020 23:10:35 -0700 Subject: [PATCH 182/906] Don't use private keys for QR code --- src/components/views/right_panel/VerificationPanel.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index a2038087fc..34f7538b1c 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -45,17 +45,15 @@ export default class VerificationPanel extends React.PureComponent { if (request.requested) { return (

      Waiting for {request.otherUserId} to accept ...

      ); } else if (request.ready) { + const keyId = `ed25519:${MatrixClientPeg.get().getCrossSigningId()}`; const qrCodeKeys = [ [MatrixClientPeg.get().getDeviceId(), MatrixClientPeg.get().getDeviceEd25519Key()], - [MatrixClientPeg.get().getCrossSigningId(), MatrixClientPeg.get().getCrossSigningKey("master")], + [keyId, MatrixClientPeg.get().getCrossSigningId()], ]; - // TODO: Await a bunch of this - const otherCrossSigning = MatrixClientPeg.get().getStoredCrossSigningForUser(request.otherUserId); - const otherUserKey = otherCrossSigning ? otherCrossSigning.getCrossSigningKey("master") : null; const qrCode = ; From b682e7d908a8e6b3c84a0e77977604bd85709bf6 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 23 Jan 2020 20:05:32 -0700 Subject: [PATCH 183/906] Generate a QR code for apps to scan --- .../elements/crypto/VerificationQRCode.js | 8 ++--- .../views/right_panel/VerificationPanel.js | 32 +++++++++++-------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/components/views/elements/crypto/VerificationQRCode.js b/src/components/views/elements/crypto/VerificationQRCode.js index c49dd3faf5..fa4031da9f 100644 --- a/src/components/views/elements/crypto/VerificationQRCode.js +++ b/src/components/views/elements/crypto/VerificationQRCode.js @@ -24,15 +24,13 @@ import QRCode from "qrcode-react"; export default class VerificationQRCode extends React.PureComponent { static propTypes = { // Common for all kinds of QR codes - keys: PropTypes.array.isRequired, // array of [Key ID, Key] pairs + keys: PropTypes.array.isRequired, // array of [Key ID, Base64 Key] pairs action: PropTypes.string.isRequired, keyholderUserId: PropTypes.string.isRequired, // User verification use case only secret: PropTypes.string, - otherUserKey: PropTypes.string, - verificationKey: PropTypes.string, - verificationAlgorithms: PropTypes.array, + otherUserKey: PropTypes.string, // Base64 key being verified requestEventId: PropTypes.string, }; @@ -44,8 +42,6 @@ export default class VerificationQRCode extends React.PureComponent { const query = { request: this.props.requestEventId, action: this.props.action, - verification_algorithms: this.props.verificationAlgorithms, - verification_key: this.props.verificationKey, other_user_key: this.props.otherUserKey, }; for (const key of this.props.keys) { diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 34f7538b1c..d0c3d2df10 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -45,22 +45,28 @@ export default class VerificationPanel extends React.PureComponent { if (request.requested) { return (

      Waiting for {request.otherUserId} to accept ...

      ); } else if (request.ready) { - const keyId = `ed25519:${MatrixClientPeg.get().getCrossSigningId()}`; - const qrCodeKeys = [ - [MatrixClientPeg.get().getDeviceId(), MatrixClientPeg.get().getDeviceEd25519Key()], - [keyId, MatrixClientPeg.get().getCrossSigningId()], - ]; - const qrCode = ; const verifyButton = Verify by emoji ; - return (

      {request.otherUserId} is ready, start {verifyButton} or have them scan: {qrCode}

      ); + + if (request.requestEvent && request.requestEvent.getId()) { + const keyId = `ed25519:${MatrixClientPeg.get().getCrossSigningId()}`; + const qrCodeKeys = [ + [MatrixClientPeg.get().getDeviceId(), MatrixClientPeg.get().getDeviceEd25519Key()], + [keyId, MatrixClientPeg.get().getCrossSigningId()], + ]; + const crossSigningInfo = MatrixClientPeg.get().getStoredCrossSigningForUser(request.otherUserId); + const qrCode = ; + return (

      {request.otherUserId} is ready, start {verifyButton} or have them scan: {qrCode}

      ); + } + + return (

      {request.otherUserId} is ready, start {verifyButton}

      ); } else if (request.started) { if (this.state.sasWaitingForOtherParty) { return

      Waiting for {request.otherUserId} to confirm ...

      ; From ebcc4d573bacac10c991db7df788cc28b1b73a8a Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 23 Jan 2020 20:10:31 -0700 Subject: [PATCH 184/906] Add trace logging to figure out which component is causing weird events For https://github.com/vector-im/riot-web/issues/11120 --- src/components/views/rooms/EventTile.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index 634b77c9e1..155ed19821 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -578,6 +578,7 @@ export default createReactClass({ console.error("EventTile attempted to get relations for an event without an ID"); // Use event's special `toJSON` method to log key data. console.log(JSON.stringify(this.props.mxEvent, null, 4)); + console.trace("Stacktrace for https://github.com/vector-im/riot-web/issues/11120"); } return this.props.getRelationsForEvent(eventId, "m.annotation", "m.reaction"); }, From 0ce9da5d365d4b2e1490206233c8ecfa6dc01eed Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 23 Jan 2020 20:12:24 -0700 Subject: [PATCH 185/906] Appease the linter --- src/components/views/elements/crypto/VerificationQRCode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/elements/crypto/VerificationQRCode.js b/src/components/views/elements/crypto/VerificationQRCode.js index fa4031da9f..9026e51096 100644 --- a/src/components/views/elements/crypto/VerificationQRCode.js +++ b/src/components/views/elements/crypto/VerificationQRCode.js @@ -50,6 +50,6 @@ export default class VerificationQRCode extends React.PureComponent { const uri = `https://matrix.to/#/${this.props.keyholderUserId}?${qs.stringify(query)}`; - return + return ; } } From b7e680ba5154935f3f8a394ceaeeb0bda307c29b Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 23 Jan 2020 20:14:27 -0700 Subject: [PATCH 186/906] Fix key ID --- src/components/views/right_panel/VerificationPanel.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index d0c3d2df10..a29546c8f7 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -50,10 +50,9 @@ export default class VerificationPanel extends React.PureComponent { ; if (request.requestEvent && request.requestEvent.getId()) { - const keyId = `ed25519:${MatrixClientPeg.get().getCrossSigningId()}`; const qrCodeKeys = [ [MatrixClientPeg.get().getDeviceId(), MatrixClientPeg.get().getDeviceEd25519Key()], - [keyId, MatrixClientPeg.get().getCrossSigningId()], + [MatrixClientPeg.get().getCrossSigningId(), MatrixClientPeg.get().getCrossSigningId()], ]; const crossSigningInfo = MatrixClientPeg.get().getStoredCrossSigningForUser(request.otherUserId); const qrCode = Date: Thu, 23 Jan 2020 20:19:17 -0700 Subject: [PATCH 187/906] Actually add the secret to the QR code url --- src/components/views/elements/crypto/VerificationQRCode.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/views/elements/crypto/VerificationQRCode.js b/src/components/views/elements/crypto/VerificationQRCode.js index 9026e51096..1cb5647317 100644 --- a/src/components/views/elements/crypto/VerificationQRCode.js +++ b/src/components/views/elements/crypto/VerificationQRCode.js @@ -43,6 +43,7 @@ export default class VerificationQRCode extends React.PureComponent { request: this.props.requestEventId, action: this.props.action, other_user_key: this.props.otherUserKey, + secret: this.props.secret, }; for (const key of this.props.keys) { query[`key_${key[0]}`] = key[1]; From 86a098fcd983d546b18f1a1eba9e2d1e1f1e6f4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 09:35:31 +0100 Subject: [PATCH 188/906] DisableEventIndex: Remove a blank line and rewrite a doc comment. --- .../views/dialogs/eventindex/DisableEventIndex.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/DisableEventIndex.js b/src/async-components/views/dialogs/eventindex/DisableEventIndex.js index 064f55edc0..5720c26e40 100644 --- a/src/async-components/views/dialogs/eventindex/DisableEventIndex.js +++ b/src/async-components/views/dialogs/eventindex/DisableEventIndex.js @@ -24,10 +24,8 @@ import SettingsStore, {SettingLevel} from "../../../../settings/SettingsStore"; import EventIndexPeg from "../../../../indexing/EventIndexPeg"; import AccessibleButton from "../../../../components/views/elements/AccessibleButton"; - /* - * Walks the user through the process of creating an e2e key backup - * on the server. + * Allows the user to disable the Event Index. */ export default class ManageEventIndex extends React.Component { static propTypes = { From d30fd3eac04ecedd1bbd8dda8b0a38b49f77444d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 09:39:56 +0100 Subject: [PATCH 189/906] DisableEventIndex: Rename the class. --- .../views/dialogs/eventindex/DisableEventIndex.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/async-components/views/dialogs/eventindex/DisableEventIndex.js b/src/async-components/views/dialogs/eventindex/DisableEventIndex.js index 5720c26e40..820bcbe047 100644 --- a/src/async-components/views/dialogs/eventindex/DisableEventIndex.js +++ b/src/async-components/views/dialogs/eventindex/DisableEventIndex.js @@ -27,7 +27,7 @@ import AccessibleButton from "../../../../components/views/elements/AccessibleBu /* * Allows the user to disable the Event Index. */ -export default class ManageEventIndex extends React.Component { +export default class DisableEventIndexDialog extends React.Component { static propTypes = { onFinished: PropTypes.func.isRequired, } From 4ea2d4f90eff09481a75366740274cecb5326b0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 09:45:29 +0100 Subject: [PATCH 190/906] ManageEventIndex: Rewrite the docs and rename the dialog class. --- .../views/dialogs/eventindex/ManageEventIndex.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js index d0f3c2cf50..5d75f9b168 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js @@ -24,12 +24,10 @@ import {formatBytes} from "../../../../utils/FormattingUtils"; import EventIndexPeg from "../../../../indexing/EventIndexPeg"; import AccessibleButton from "../../../../components/views/elements/AccessibleButton"; - /* - * Walks the user through the process of creating an e2e key backup - * on the server. + * Allows the user to introspect the event index state and disable it. */ -export default class ManageEventIndex extends React.Component { +export default class ManageEventIndexDialog extends React.Component { static propTypes = { onFinished: PropTypes.func.isRequired, } From f763ae3c7bec35d78097249e58859cb55bfaadda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 09:50:58 +0100 Subject: [PATCH 191/906] DisableEventIndex: Rename the file to contain the Dialog suffix. --- .../{DisableEventIndex.js => DisableEventIndexDialog.js} | 0 .../views/dialogs/eventindex/ManageEventIndex.js | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/async-components/views/dialogs/eventindex/{DisableEventIndex.js => DisableEventIndexDialog.js} (100%) diff --git a/src/async-components/views/dialogs/eventindex/DisableEventIndex.js b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js similarity index 100% rename from src/async-components/views/dialogs/eventindex/DisableEventIndex.js rename to src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js index 5d75f9b168..c9c4fc8ae6 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndex.js @@ -96,7 +96,7 @@ export default class ManageEventIndexDialog extends React.Component { _onDisable = async () => { Modal.createTrackedDialogAsync("Disable message search", "Disable message search", - import("./DisableEventIndex"), + import("./DisableEventIndexDialog"), null, null, /* priority = */ false, /* static = */ true, ); } From 93facca47963ce17ae706f80150333a98ff4dfbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 09:54:46 +0100 Subject: [PATCH 192/906] ManageEventIndex: Rename the file to contain the Dialog suffix. --- .../{ManageEventIndex.js => ManageEventIndexDialog.js} | 0 src/components/views/settings/EventIndexPanel.js | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/async-components/views/dialogs/eventindex/{ManageEventIndex.js => ManageEventIndexDialog.js} (100%) diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndex.js b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js similarity index 100% rename from src/async-components/views/dialogs/eventindex/ManageEventIndex.js rename to src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js diff --git a/src/components/views/settings/EventIndexPanel.js b/src/components/views/settings/EventIndexPanel.js index f93ab489c7..785ce2a4ca 100644 --- a/src/components/views/settings/EventIndexPanel.js +++ b/src/components/views/settings/EventIndexPanel.js @@ -85,7 +85,7 @@ export default class EventIndexPanel extends React.Component { _onManage = async () => { Modal.createTrackedDialogAsync('Message search', 'Message search', - import('../../../async-components/views/dialogs/eventindex/ManageEventIndex'), + import('../../../async-components/views/dialogs/eventindex/ManageEventIndexDialog'), { onFinished: () => {}, }, null, /* priority = */ false, /* static = */ true, From b59863781f703997058ab8bd4af9acab349d8e8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 09:58:17 +0100 Subject: [PATCH 193/906] DisableEventIndexDialog: Fix a typo. --- .../views/dialogs/eventindex/DisableEventIndexDialog.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js index 820bcbe047..7f46b54f65 100644 --- a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js +++ b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js @@ -60,7 +60,7 @@ export default class DisableEventIndexDialog extends React.Component { onFinished={this.props.onFinished} title={_t("Are you sure?")} > - {_t("If disabled, messages form encrypted rooms won't appear in search results")} + {_t("If disabled, messages from encrypted rooms won't appear in search results.")}
      {_t("Cancel")} From 72a58d0c2c274ee6b7a874205e3a8ee13ade4f21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 09:59:26 +0100 Subject: [PATCH 194/906] DisableEventIndexDialog: Properly indent the content of the BaseDialog. --- .../eventindex/DisableEventIndexDialog.js | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js index 7f46b54f65..7097ffb3bf 100644 --- a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js +++ b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js @@ -60,16 +60,16 @@ export default class DisableEventIndexDialog extends React.Component { onFinished={this.props.onFinished} title={_t("Are you sure?")} > - {_t("If disabled, messages from encrypted rooms won't appear in search results.")} -
      - - {_t("Cancel")} - - - {_t("Disable")} - - {this.state.enabling ? :
      } -
      + {_t("If disabled, messages from encrypted rooms won't appear in search results.")} +
      + + {_t("Cancel")} + + + {_t("Disable")} + + {this.state.enabling ? :
      } +
      ); } From cd4e75c378d748d6cf42acf2fb0b43e6328b1ed1 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 24 Jan 2020 09:36:22 +0000 Subject: [PATCH 195/906] Unnecessary blank line --- src/components/views/auth/AuthBody.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/views/auth/AuthBody.js b/src/components/views/auth/AuthBody.js index db5c941b20..fe20d76afb 100644 --- a/src/components/views/auth/AuthBody.js +++ b/src/components/views/auth/AuthBody.js @@ -18,7 +18,6 @@ limitations under the License. import React from 'react'; import PropTypes from 'prop-types'; - import classnames from 'classnames'; export default class AuthBody extends React.PureComponent { From 99252e08b0eb3800b9aa79be9e000f803b04aeb0 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 24 Jan 2020 09:37:43 +0000 Subject: [PATCH 196/906] Unintentional commit --- src/components/views/settings/KeyBackupPanel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/settings/KeyBackupPanel.js b/src/components/views/settings/KeyBackupPanel.js index cd8cdfa5d9..fd166782d8 100644 --- a/src/components/views/settings/KeyBackupPanel.js +++ b/src/components/views/settings/KeyBackupPanel.js @@ -127,7 +127,7 @@ export default class KeyBackupPanel extends React.PureComponent { Modal.createTrackedDialogAsync('Key Backup', 'Key Backup', import('../../../async-components/views/dialogs/keybackup/CreateKeyBackupDialog'), { - secureSecretStorage: false, + secureSecretStorage: SettingsStore.isFeatureEnabled("feature_cross_signing"), onFinished: () => { this._loadBackupStatus(); }, From 169852adec208ce8451072ff9a08c5e9021920b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Fri, 24 Jan 2020 08:23:03 +0000 Subject: [PATCH 197/906] Translated using Weblate (French) Currently translated at 100.0% (2053 of 2053 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 472cd02e6f..5d02717b0c 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2085,5 +2085,22 @@ "Unrecognised command: %(commandText)s": "Commande non reconnue : %(commandText)s", "You can use /help to list available commands. Did you mean to send this as a message?": "Vous pouvez utiliser /help pour obtenir la liste des commandes disponibles. Vouliez-vous envoyer un message ?", "Hint: Begin your message with // to start it with a slash.": "Astuce : Votre message doit démarrer par // pour commencer par une barre oblique.", - "Send as message": "Envoyer comme message" + "Send as message": "Envoyer comme message", + "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s a ajouté %(addedAddresses)s et %(count)s autres adresses à ce salon", + "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s a supprimé %(removedAddresses)s et %(count)s autres adresses de ce salon", + "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s a supprimé %(countRemoved)s et ajouté %(countAdded)s adresses à ce salon", + "Reject & Ignore user": "Rejeter et ignorer l’utilisateur", + "Enter your account password to confirm the upgrade:": "Saisissez le mot de passe de votre compte pour confirmer la mise à niveau :", + "You'll need to authenticate with the server to confirm the upgrade.": "Vous devrez vous identifier avec le serveur pour confirmer la mise à niveau.", + "Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Mettez à niveau cet appareil pour lui permettre de vérifier d’autres appareils, qui pourront alors accéder aux messages chiffrés et seront vus comme fiables par les autres utilisateurs.", + "Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Configurez le chiffrement sur cet appareil pour lui permettre de vérifier d’autres appareils, qui pourront alors accéder aux messages chiffrés et seront vus comme fiables par les autres utilisateurs.", + "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Sécurisez vos clés de chiffrement avec une phrase de passe. Pour une sécurité maximale, elle devrait être différente du mot de passe de votre compte :", + "Enter a passphrase": "Saisissez une phrase de passe", + "Enter your passphrase a second time to confirm it.": "Saisissez votre phrase de passe une seconde fois pour la confirmer.", + "This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Cet appareil peut à présent vérifier d’autres appareils, qui pourront alors accéder aux messages chiffrés et seront vus comme fiables par les autres utilisateurs.", + "Verify other users in their profile.": "Vérifiez d’autres utilisateurs dans leur profil.", + "Upgrade your encryption": "Mettre à niveau votre chiffrement", + "Set up encryption": "Configurer le chiffrement", + "Encryption upgraded": "Chiffrement mis à niveau", + "Encryption setup complete": "Configuration du chiffrement terminé" } From cba7764784e1b60365cfcac0ea8f5ea3310dcaa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 11:00:28 +0100 Subject: [PATCH 198/906] DisableEventIndexDialog: Use the DialogButtons element for the buttons. --- .../eventindex/DisableEventIndexDialog.js | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js index 7097ffb3bf..2e0f97c705 100644 --- a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js +++ b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js @@ -53,7 +53,8 @@ export default class DisableEventIndexDialog extends React.Component { render() { const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); - const InlineSpinner = sdk.getComponent('elements.InlineSpinner'); + const Spinner = sdk.getComponent('elements.Spinner'); + const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); return ( {_t("If disabled, messages from encrypted rooms won't appear in search results.")} -
      - - {_t("Cancel")} - - - {_t("Disable")} - - {this.state.enabling ? :
      } -
      + {this.state.disabling ? :
      } + + ); } From 71024d14188cb70965eb69b64c7f8fcf384a39eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 11:03:40 +0100 Subject: [PATCH 199/906] ManageEventIndexDialog: Properly indent the content of the BaseDialog. --- .../views/dialogs/eventindex/ManageEventIndexDialog.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js index c9c4fc8ae6..f435cf050f 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js @@ -150,8 +150,8 @@ export default class ManageEventIndexDialog extends React.Component { onFinished={this.props.onFinished} title={_t("Message search")} > - {eventIndexingSettings} - {buttons} + {eventIndexingSettings} + {buttons} ); } From 128c0b73004e27cb6d5ff16da01f48a99785d72b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 11:11:53 +0100 Subject: [PATCH 200/906] ManageEventIndexDialog: Use formatCount to format the message and room count. --- .../views/dialogs/eventindex/ManageEventIndexDialog.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js index f435cf050f..a8fc7dce3a 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js @@ -20,7 +20,7 @@ import PropTypes from 'prop-types'; import { _t } from '../../../../languageHandler'; import Modal from '../../../../Modal'; -import {formatBytes} from "../../../../utils/FormattingUtils"; +import {formatBytes, formatCount} from "../../../../utils/FormattingUtils"; import EventIndexPeg from "../../../../indexing/EventIndexPeg"; import AccessibleButton from "../../../../components/views/elements/AccessibleButton"; @@ -125,8 +125,8 @@ export default class ManageEventIndexDialog extends React.Component { }
      {_t("Space used:")} {formatBytes(this.state.eventIndexSize, 0)}
      - {_t("Indexed messages:")} {this.state.eventCount}
      - {_t("Number of rooms:")} {this.state.roomCount}
      + {_t("Indexed messages:")} {formatCount(this.state.eventCount)}
      + {_t("Number of rooms:")} {formatCount(this.state.roomCount)}
      {crawlerState}
      From b72ab57e1b33d443b40a56e73645044233a736f5 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 24 Jan 2020 10:13:03 +0000 Subject: [PATCH 201/906] add to --- src/components/views/rooms/E2EIcon.js | 40 +++++++++++++++++++++------ 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/components/views/rooms/E2EIcon.js b/src/components/views/rooms/E2EIcon.js index 7ac3b5af2d..df5fe204d4 100644 --- a/src/components/views/rooms/E2EIcon.js +++ b/src/components/views/rooms/E2EIcon.js @@ -15,13 +15,14 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React from "react"; +import React, {useState} from "react"; import PropTypes from "prop-types"; import classNames from 'classnames'; import {_t, _td} from '../../../languageHandler'; -import AccessibleButton from '../elements/AccessibleButton'; import {useFeatureEnabled} from "../../../hooks/useSettings"; +import AccessibleButton from "../elements/AccessibleButton"; +import Tooltip from "../elements/Tooltip"; export const E2E_STATE = { VERIFIED: "verified", @@ -51,7 +52,9 @@ const legacyRoomTitles = { }; const E2EIcon = ({isUser, status, className, size, onClick}) => { - const e2eIconClasses = classNames({ + const [hover, setHover] = useState(false); + + const classes = classNames({ mx_E2EIcon: true, mx_E2EIcon_warning: status === E2E_STATE.WARNING, mx_E2EIcon_normal: status === E2E_STATE.NORMAL, @@ -70,17 +73,36 @@ const E2EIcon = ({isUser, status, className, size, onClick}) => { e2eTitle = legacyRoomTitles[status]; } - let style = null; + let style; if (size) { style = {width: `${size}px`, height: `${size}px`}; } - const icon = (
      ); - if (onClick) { - return ({ icon }); - } else { - return icon; + const onMouseOver = () => setHover(true); + const onMouseOut = () => setHover(false); + + let tip; + if (hover) { + tip = ; } + + if (onClick) { + return ( + + { tip } + + ); + } + + return
      + { tip } +
      ; }; E2EIcon.propTypes = { From 660240e2c047a964f2556cd2d63145f15ddc963e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 11:13:09 +0100 Subject: [PATCH 202/906] EventIndexPanel: Use formatCount to format the room count. --- src/components/views/settings/EventIndexPanel.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/settings/EventIndexPanel.js b/src/components/views/settings/EventIndexPanel.js index 785ce2a4ca..13063d9305 100644 --- a/src/components/views/settings/EventIndexPanel.js +++ b/src/components/views/settings/EventIndexPanel.js @@ -21,7 +21,7 @@ import * as sdk from '../../../index'; import Modal from '../../../Modal'; import SettingsStore, {SettingLevel} from "../../../settings/SettingsStore"; import AccessibleButton from "../elements/AccessibleButton"; -import {formatBytes} from "../../../utils/FormattingUtils"; +import {formatBytes, formatCount} from "../../../utils/FormattingUtils"; import EventIndexPeg from "../../../indexing/EventIndexPeg"; export default class EventIndexPanel extends React.Component { @@ -115,7 +115,7 @@ export default class EventIndexPanel extends React.Component { {_t( "Securely cache encrypted messages locally for them " + "to appear in search results, using ") } {formatBytes(this.state.eventIndexSize, 0)} - {_t( " to store messages from ")} {this.state.roomCount} {_t("rooms.")} + {_t( " to store messages from ")} {formatCount(this.state.roomCount)} {_t("rooms.")}
      From d9e933c915534456fead4641841e5b5ff9632a51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 11:15:57 +0100 Subject: [PATCH 203/906] EventIndex: Style fixes for the docstrings. --- src/indexing/EventIndex.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index d466c6acba..53f47148b9 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -69,7 +69,8 @@ export default class EventIndex { client.removeListener('Room.timelineReset', this.onTimelineReset); } - /** Get crawler checkpoints for the encrypted rooms and store them in the index. + /** + * Get crawler checkpoints for the encrypted rooms and store them in the index. */ async addInitialCheckpoints() { const indexManager = PlatformPeg.get().getEventIndexingManager(); @@ -80,7 +81,7 @@ export default class EventIndex { return client.isRoomEncrypted(room.roomId); }; - // We only care to crawl the encrypted rooms, non-encrypted. + // We only care to crawl the encrypted rooms, non-encrypted // rooms can use the search provided by the homeserver. const encryptedRooms = rooms.filter(isRoomEncrypted); From 825b6f7b7d6848b4963dcbfc335c829779dfd40e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 11:16:49 +0100 Subject: [PATCH 204/906] EventIndexPeg: Style fix for a docstring. --- src/indexing/EventIndexPeg.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/indexing/EventIndexPeg.js b/src/indexing/EventIndexPeg.js index c8c8cbefe9..067aea3a7f 100644 --- a/src/indexing/EventIndexPeg.js +++ b/src/indexing/EventIndexPeg.js @@ -62,7 +62,8 @@ class EventIndexPeg { return this.initEventIndex(); } - /* Initialize the event index. + /** + * Initialize the event index. * * @returns {boolean} True if the event index was succesfully initialized, * false otherwise. From 6f919eaeec0aaf96bd5cea50e9a714f3b2c023d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 11:27:56 +0100 Subject: [PATCH 205/906] DisableEventIndexDialog: Use the correct spinner. --- .../views/dialogs/eventindex/DisableEventIndexDialog.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js index 2e0f97c705..f031c5a11f 100644 --- a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js +++ b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js @@ -62,7 +62,7 @@ export default class DisableEventIndexDialog extends React.Component { title={_t("Are you sure?")} > {_t("If disabled, messages from encrypted rooms won't appear in search results.")} - {this.state.disabling ? :
      } + {this.state.disabling ? :
      } Date: Fri, 24 Jan 2020 11:28:33 +0100 Subject: [PATCH 206/906] EventIndex: Subclass the event emitter instead of putting one in a property. --- src/indexing/EventIndex.js | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 53f47148b9..85e75cfc82 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -22,8 +22,9 @@ import {EventEmitter} from "events"; /* * Event indexing class that wraps the platform specific event indexing. */ -export default class EventIndex { +export default class EventIndex extends EventEmitter { constructor() { + super(); this.crawlerCheckpoints = []; // The time in ms that the crawler will wait loop iterations if there // have not been any checkpoints to consume in the last iteration. @@ -35,7 +36,6 @@ export default class EventIndex { this._crawler = null; this._currentCheckpoint = null; this.liveEventsForIndex = new Set(); - this._eventEmitter = new EventEmitter(); } async init() { @@ -188,7 +188,7 @@ export default class EventIndex { } emitNewCheckpoint() { - this._eventEmitter.emit("changedCheckpoint", this.currentRoom()); + this.emit("changedCheckpoint", this.currentRoom()); } async crawlerFunc() { @@ -459,12 +459,4 @@ export default class EventIndex { return client.getRoom(this.crawlerCheckpoints[0].roomId); } } - - on(eventName, callback) { - this._eventEmitter.on(eventName, callback); - } - - removeListener(eventName, callback) { - this._eventEmitter.removeListener(eventName, callback); - } } From ffe5d411db9a7ae02ead2f5e78a8741be08ec5d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 11:44:56 +0100 Subject: [PATCH 207/906] EventIndexPanel: Add a link to the download page of Riot Desktop. --- src/components/views/settings/EventIndexPanel.js | 8 ++++++-- src/i18n/strings/en_EN.json | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/components/views/settings/EventIndexPanel.js b/src/components/views/settings/EventIndexPanel.js index 13063d9305..a6f21fa114 100644 --- a/src/components/views/settings/EventIndexPanel.js +++ b/src/components/views/settings/EventIndexPanel.js @@ -145,8 +145,12 @@ export default class EventIndexPanel extends React.Component {
      { _t( "Riot can't securely cache encrypted messages locally " + - "while running in a web browser. Use Riot Desktop for " + - "encrypted messages to appear in search results.", + "while running in a web browser. Use Riot Desktop " + + "for encrypted messages to appear in search results.", + {}, + { + 'riotLink': (sub) => {sub}, + } ) }
      diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 3973ae442e..fceb299131 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -560,7 +560,7 @@ "Manage": "Manage", "Securely cache encrypted messages locally for them to appear in search results.": "Securely cache encrypted messages locally for them to appear in search results.", "Enable": "Enable", - "Riot can't securely cache encrypted messages locally while running in a web browser. Use Riot Desktop for encrypted messages to appear in search results.": "Riot can't securely cache encrypted messages locally while running in a web browser. Use Riot Desktop for encrypted messages to appear in search results.", + "Riot can't securely cache encrypted messages locally while running in a web browser. Use Riot Desktop for encrypted messages to appear in search results.": "Riot can't securely cache encrypted messages locally while running in a web browser. Use Riot Desktop for encrypted messages to appear in search results.", "Connecting to integration manager...": "Connecting to integration manager...", "Cannot connect to integration manager": "Cannot connect to integration manager", "The integration manager is offline or it cannot reach your homeserver.": "The integration manager is offline or it cannot reach your homeserver.", @@ -2037,7 +2037,7 @@ "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "This device has detected that your recovery passphrase and key for Secure Messages have been removed.", "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.", - "If disabled, messages form encrypted rooms won't appear in search results": "If disabled, messages form encrypted rooms won't appear in search results", + "If disabled, messages from encrypted rooms won't appear in search results.": "If disabled, messages from encrypted rooms won't appear in search results.", "Disable": "Disable", "Not downloading messages for any room.": "Not downloading messages for any room.", "Downloading mesages for %(currentRoom)s.": "Downloading mesages for %(currentRoom)s.", From 0c3d507455bbf77d956e2f6c303e08ef6d9d8c2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 11:46:46 +0100 Subject: [PATCH 208/906] EventIndex: Cancel the crawler early after a message request. If we're cancelling the crawler nowadays this means that we're likely deleting the index. Processing these messages is wasted effort in that case so break early. --- src/indexing/EventIndex.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 85e75cfc82..723d516a29 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -266,6 +266,11 @@ export default class EventIndex extends EventEmitter { continue; } + if (cancelled) { + this.crawlerCheckpoints.push(checkpoint); + break; + } + if (res.chunk.length === 0) { console.log("EventIndex: Done with the checkpoint", checkpoint); // We got to the start/end of our timeline, lets just From ee133a9c715559e33c058c58ce8776574816fafb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 11:56:19 +0100 Subject: [PATCH 209/906] DisableEventIndexDialog: Remove an unused import. --- .../views/dialogs/eventindex/DisableEventIndexDialog.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js index f031c5a11f..c2b7e2933e 100644 --- a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js +++ b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js @@ -22,7 +22,6 @@ import { _t } from '../../../../languageHandler'; import SettingsStore, {SettingLevel} from "../../../../settings/SettingsStore"; import EventIndexPeg from "../../../../indexing/EventIndexPeg"; -import AccessibleButton from "../../../../components/views/elements/AccessibleButton"; /* * Allows the user to disable the Event Index. From 029369a04bd08f2fdb8944ff72be50e79050784a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 11:56:43 +0100 Subject: [PATCH 210/906] EventIndexPanel: Small style fix. --- src/components/views/settings/EventIndexPanel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/settings/EventIndexPanel.js b/src/components/views/settings/EventIndexPanel.js index a6f21fa114..5edc25bbab 100644 --- a/src/components/views/settings/EventIndexPanel.js +++ b/src/components/views/settings/EventIndexPanel.js @@ -150,7 +150,7 @@ export default class EventIndexPanel extends React.Component { {}, { 'riotLink': (sub) => {sub}, - } + }, ) }
      From 2483337e8993463f87be946b078ffa08a6f514ca Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 24 Jan 2020 11:57:57 +0100 Subject: [PATCH 211/906] don't use removed .event property anymore on verification request --- .../messages/MKeyVerificationConclusion.js | 2 +- .../views/messages/MKeyVerificationRequest.js | 10 +++--- .../views/toasts/VerificationRequestToast.js | 33 +++++++++---------- src/utils/KeyVerificationStateObserver.js | 7 ++-- 4 files changed, 25 insertions(+), 27 deletions(-) diff --git a/src/components/views/messages/MKeyVerificationConclusion.js b/src/components/views/messages/MKeyVerificationConclusion.js index f51b97786b..a17dcd8ab0 100644 --- a/src/components/views/messages/MKeyVerificationConclusion.js +++ b/src/components/views/messages/MKeyVerificationConclusion.js @@ -93,7 +93,7 @@ export default class MKeyVerificationConclusion extends React.Component { } if (title) { - const subtitle = userLabelForEventRoom(request.otherUserId, mxEvent); + const subtitle = userLabelForEventRoom(request.otherUserId, mxEvent.getRoomId()); const classes = classNames("mx_EventTile_bubble", "mx_KeyVerification", "mx_KeyVerification_icon", { mx_KeyVerification_icon_verified: request.done, }); diff --git a/src/components/views/messages/MKeyVerificationRequest.js b/src/components/views/messages/MKeyVerificationRequest.js index ae793556d8..8caff322aa 100644 --- a/src/components/views/messages/MKeyVerificationRequest.js +++ b/src/components/views/messages/MKeyVerificationRequest.js @@ -85,7 +85,7 @@ export default class MKeyVerificationRequest extends React.Component { if (userId === myUserId) { return _t("You accepted"); } else { - return _t("%(name)s accepted", {name: getNameForEventRoom(userId, this.props.mxEvent)}); + return _t("%(name)s accepted", {name: getNameForEventRoom(userId, this.props.mxEvent.getRoomId())}); } } @@ -95,7 +95,7 @@ export default class MKeyVerificationRequest extends React.Component { if (userId === myUserId) { return _t("You cancelled"); } else { - return _t("%(name)s cancelled", {name: getNameForEventRoom(userId, this.props.mxEvent)}); + return _t("%(name)s cancelled", {name: getNameForEventRoom(userId, this.props.mxEvent.getRoomId())}); } } @@ -129,9 +129,9 @@ export default class MKeyVerificationRequest extends React.Component { if (!request.initiatedByMe) { title = (
      { - _t("%(name)s wants to verify", {name: getNameForEventRoom(request.requestingUserId, mxEvent)})}
      ); + _t("%(name)s wants to verify", {name: getNameForEventRoom(request.requestingUserId, mxEvent.getRoomId())})}
      ); subtitle = (
      { - userLabelForEventRoom(request.requestingUserId, mxEvent)}
      ); + userLabelForEventRoom(request.requestingUserId, mxEvent.getRoomId())}
      ); if (request.requested && !request.observeOnly) { stateNode = (
      @@ -142,7 +142,7 @@ export default class MKeyVerificationRequest extends React.Component { title = (
      { _t("You sent a verification request")}
      ); subtitle = (
      { - userLabelForEventRoom(request.receivingUserId, mxEvent)}
      ); + userLabelForEventRoom(request.receivingUserId, mxEvent.getRoomId())}
      ); } if (title) { diff --git a/src/components/views/toasts/VerificationRequestToast.js b/src/components/views/toasts/VerificationRequestToast.js index 479a3e3f93..274085c0fd 100644 --- a/src/components/views/toasts/VerificationRequestToast.js +++ b/src/components/views/toasts/VerificationRequestToast.js @@ -65,22 +65,21 @@ export default class VerificationRequestToast extends React.PureComponent { accept = async () => { ToastStore.sharedInstance().dismissToast(this.props.toastKey); const {request} = this.props; - const {event} = request; // no room id for to_device requests - if (event.getRoomId()) { - dis.dispatch({ - action: 'view_room', - room_id: event.getRoomId(), - should_peek: false, - }); - } try { - await request.accept(); - dis.dispatch({ - action: "set_right_panel_phase", - phase: RIGHT_PANEL_PHASES.EncryptionPanel, - refireParams: {verificationRequest: request}, - }); + if (request.channel.roomId) { + dis.dispatch({ + action: 'view_room', + room_id: request.channel.roomId, + should_peek: false, + }); + await request.accept(); + dis.dispatch({ + action: "set_right_panel_phase", + phase: RIGHT_PANEL_PHASES.EncryptionPanel, + refireParams: {verificationRequest: request}, + }); + } } catch (err) { console.error(err.message); } @@ -89,13 +88,13 @@ export default class VerificationRequestToast extends React.PureComponent { render() { const FormButton = sdk.getComponent("elements.FormButton"); const {request} = this.props; - const {event} = request; const userId = request.otherUserId; - let nameLabel = event.getRoomId() ? userLabelForEventRoom(userId, event) : userId; + const roomId = request.channel.roomId; + let nameLabel = roomId ? userLabelForEventRoom(userId, roomId) : userId; // for legacy to_device verification requests if (nameLabel === userId) { const client = MatrixClientPeg.get(); - const user = client.getUser(event.getSender()); + const user = client.getUser(userId); if (user && user.displayName) { nameLabel = _t("%(name)s (%(userId)s)", {name: user.displayName, userId}); } diff --git a/src/utils/KeyVerificationStateObserver.js b/src/utils/KeyVerificationStateObserver.js index 1a35319186..7da532109c 100644 --- a/src/utils/KeyVerificationStateObserver.js +++ b/src/utils/KeyVerificationStateObserver.js @@ -17,16 +17,15 @@ limitations under the License. import {MatrixClientPeg} from '../MatrixClientPeg'; import { _t } from '../languageHandler'; -export function getNameForEventRoom(userId, mxEvent) { - const roomId = mxEvent.getRoomId(); +export function getNameForEventRoom(userId, roomId) { const client = MatrixClientPeg.get(); const room = client.getRoom(roomId); const member = room.getMember(userId); return member ? member.name : userId; } -export function userLabelForEventRoom(userId, mxEvent) { - const name = getNameForEventRoom(userId, mxEvent); +export function userLabelForEventRoom(userId, roomId) { + const name = getNameForEventRoom(userId, roomId); if (name !== userId) { return _t("%(name)s (%(userId)s)", {name, userId}); } else { From 512bd4b0b2afb62d50cf6bb179b6bc8b619887c2 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 24 Jan 2020 11:59:17 +0100 Subject: [PATCH 212/906] show to_device verification in dialog, not right panel this also makes it work again, as the VerificationPanel doens't know how to deal with requests that are already in PHASE_STARTED, which was breaking verifying your own devices. --- src/components/views/toasts/VerificationRequestToast.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/components/views/toasts/VerificationRequestToast.js b/src/components/views/toasts/VerificationRequestToast.js index 274085c0fd..f912984486 100644 --- a/src/components/views/toasts/VerificationRequestToast.js +++ b/src/components/views/toasts/VerificationRequestToast.js @@ -23,6 +23,7 @@ import {RIGHT_PANEL_PHASES} from "../../../stores/RightPanelStorePhases"; import {userLabelForEventRoom} from "../../../utils/KeyVerificationStateObserver"; import dis from "../../../dispatcher"; import ToastStore from "../../../stores/ToastStore"; +import Modal from "../../../Modal"; export default class VerificationRequestToast extends React.PureComponent { constructor(props) { @@ -79,6 +80,12 @@ export default class VerificationRequestToast extends React.PureComponent { phase: RIGHT_PANEL_PHASES.EncryptionPanel, refireParams: {verificationRequest: request}, }); + } else if (request.channel.deviceId && request.verifier) { + // show to_device verifications in dialog still + const IncomingSasDialog = sdk.getComponent("views.dialogs.IncomingSasDialog"); + Modal.createTrackedDialog('Incoming Verification', '', IncomingSasDialog, { + verifier: request.verifier, + }, null, /* priority = */ false, /* static = */ true); } } catch (err) { console.error(err.message); From 395c82b1e5042e915cf3d1184ace4d23ea2ad240 Mon Sep 17 00:00:00 2001 From: Zoe Date: Fri, 24 Jan 2020 11:04:40 +0000 Subject: [PATCH 213/906] Update src/components/structures/RoomView.js Co-Authored-By: J. Ryan Stinnett --- src/components/structures/RoomView.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index f10c98dd98..4c88f533f0 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -796,7 +796,7 @@ export default createReactClass({ return; } - // Duplication betwen here and _updateE2eStatus in RoomTile + // Duplication between here and _updateE2eStatus in RoomTile /* At this point, the user has encryption on and cross-signing on */ const e2eMembers = await room.getEncryptionTargetMembers(); const verified = []; From ecfecfe559e2eda9c8cc326913a5103d19fb9ea0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 12:07:03 +0100 Subject: [PATCH 214/906] EventIndex: Fix a small style issue. --- src/indexing/EventIndex.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 93c640cf8e..2b432ab1a1 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -172,7 +172,7 @@ export default class EventIndex { } const jsonEvent = ev.toJSON(); - const e = ev.isEncrypted() ? jsonEvent.decrypted: jsonEvent; + const e = ev.isEncrypted() ? jsonEvent.decrypted : jsonEvent; const profile = { displayname: ev.sender.rawDisplayName, @@ -308,7 +308,7 @@ export default class EventIndex { // consume. const events = filteredEvents.map((ev) => { const jsonEvent = ev.toJSON(); - const e = ev.isEncrypted() ? jsonEvent.decrypted: jsonEvent; + const e = ev.isEncrypted() ? jsonEvent.decrypted : jsonEvent; let profile = {}; if (e.sender in profiles) profile = profiles[e.sender]; From 6cce65a2a59544ef21b77744856ad2875abfb1ad Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 24 Jan 2020 12:08:47 +0100 Subject: [PATCH 215/906] fix lint --- src/components/views/messages/MKeyVerificationRequest.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/messages/MKeyVerificationRequest.js b/src/components/views/messages/MKeyVerificationRequest.js index 8caff322aa..49f871d16e 100644 --- a/src/components/views/messages/MKeyVerificationRequest.js +++ b/src/components/views/messages/MKeyVerificationRequest.js @@ -128,8 +128,9 @@ export default class MKeyVerificationRequest extends React.Component { } if (!request.initiatedByMe) { + const name = getNameForEventRoom(request.requestingUserId, mxEvent.getRoomId()); title = (
      { - _t("%(name)s wants to verify", {name: getNameForEventRoom(request.requestingUserId, mxEvent.getRoomId())})}
      ); + _t("%(name)s wants to verify", {name})}
      ); subtitle = (
      { userLabelForEventRoom(request.requestingUserId, mxEvent.getRoomId())}
      ); if (request.requested && !request.observeOnly) { From 210616c737bdc93fd421c75ec8e554779f4af7fb Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 24 Jan 2020 11:45:39 +0000 Subject: [PATCH 216/906] Phase 1, split out UserInfo into a generic Pane, use for EncInfo --- res/css/views/right_panel/_UserInfo.scss | 17 +- src/components/structures/RightPanel.js | 13 +- .../views/right_panel/EncryptionInfo.js | 18 +- .../views/right_panel/EncryptionPanel.js | 25 +- src/components/views/right_panel/UserInfo.js | 248 +++++++++--------- src/i18n/strings/en_EN.json | 3 +- 6 files changed, 191 insertions(+), 133 deletions(-) diff --git a/res/css/views/right_panel/_UserInfo.scss b/res/css/views/right_panel/_UserInfo.scss index d2d9d12c6d..57ffd4982e 100644 --- a/res/css/views/right_panel/_UserInfo.scss +++ b/res/css/views/right_panel/_UserInfo.scss @@ -49,12 +49,17 @@ limitations under the License. } .mx_UserInfo_container { - padding: 0 16px 16px 16px; + padding: 8px 16px; + } + + .mx_UserInfo_separator { border-bottom: 1px solid lightgray; } .mx_UserInfo_memberDetailsContainer { + padding-top: 0; padding-bottom: 0; + margin-bottom: 8px; } .mx_RoomTile_nameContainer { @@ -204,10 +209,9 @@ limitations under the License. padding-bottom: 16px; } - .mx_UserInfo_scrollContainer .mx_UserInfo_container { + .mx_UserInfo_scrollContainer:not(.mx_UserInfo_separator) { padding-top: 16px; padding-bottom: 0; - border-bottom: none; > :not(h3) { margin-left: 8px; @@ -264,3 +268,10 @@ limitations under the License. margin: 16px 0; } } + +.mx_UserInfo.mx_UserInfo_smallAvatar { + .mx_UserInfo_avatar > div { + max-width: 72px; + margin: 0 auto; + } +} diff --git a/src/components/structures/RightPanel.js b/src/components/structures/RightPanel.js index dca89d0c35..c01a3709e7 100644 --- a/src/components/structures/RightPanel.js +++ b/src/components/structures/RightPanel.js @@ -238,7 +238,18 @@ export default class RightPanel extends React.Component { } else if (this.state.phase === RIGHT_PANEL_PHASES.FilePanel) { panel = ; } else if (this.state.phase === RIGHT_PANEL_PHASES.EncryptionPanel) { - panel = ; + const onClose = () => { + dis.dispatch({ + action: "view_user", + member: this.state.member, + }); + }; + panel = ( + + ); } const classes = classNames("mx_RightPanel", "mx_fadable", { diff --git a/src/components/views/right_panel/EncryptionInfo.js b/src/components/views/right_panel/EncryptionInfo.js index 5770e9b086..2d265967ae 100644 --- a/src/components/views/right_panel/EncryptionInfo.js +++ b/src/components/views/right_panel/EncryptionInfo.js @@ -21,11 +21,17 @@ import {_t} from "../../../languageHandler"; export default class EncryptionInfo extends React.PureComponent { render() { const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); - return (
      -

      {_t("Verify User")}

      -

      {_t("For extra security, verify this user by checking a one-time code on both of your devices.")}

      -

      {_t("For maximum security, do this in person.")}

      - {_t("Start Verification")} -
      ); + return ( +
      +

      {_t("Verify User")}

      +
      +

      {_t("For extra security, verify this user by checking a one-time code on both of your devices.")}

      +

      {_t("For maximum security, do this in person.")}

      + + {_t("Start Verification")} + +
      +
      + ); } } diff --git a/src/components/views/right_panel/EncryptionPanel.js b/src/components/views/right_panel/EncryptionPanel.js index 4b3473935a..a1008543e4 100644 --- a/src/components/views/right_panel/EncryptionPanel.js +++ b/src/components/views/right_panel/EncryptionPanel.js @@ -1,5 +1,5 @@ /* -Copyright 2019 The Matrix.org Foundation C.I.C. +Copyright 2019, 2020 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. @@ -19,6 +19,8 @@ import EncryptionInfo from "./EncryptionInfo"; import VerificationPanel from "./VerificationPanel"; import {MatrixClientPeg} from "../../../MatrixClientPeg"; import {ensureDMExists} from "../../../createRoom"; +import {UserInfoPane} from "./UserInfo"; +import {_t} from "../../../languageHandler"; export default class EncryptionPanel extends React.PureComponent { constructor(props) { @@ -27,15 +29,30 @@ export default class EncryptionPanel extends React.PureComponent { } render() { + let content; const request = this.props.verificationRequest || this.state.verificationRequest; const {member} = this.props; if (request) { - return ; + content = ; } else if (member) { - return ; + content = ; } else { - return

      Not a member nor request, not sure what to render

      ; + content =

      Not a member nor request, not sure what to render

      ; } + + return ( + +
      +

      {_t("Encryption")}

      +
      +

      {_t("Messages in this room are end-to-end encrypted.")}

      +

      {_t("Your messages are secured and only you and the recipient have the unique keys to unlock them.")}

      +
      +
      + + { content } +
      + ); } _onStartVerification = async () => { diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index 051f92cc9c..a31e9a6ce0 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -59,7 +59,7 @@ const _disambiguateDevices = (devices) => { } }; -const _getE2EStatus = (cli, userId, devices) => { +export const getE2EStatus = (cli, userId, devices) => { if (!SettingsStore.isFeatureEnabled("feature_cross_signing")) { const hasUnverifiedDevice = devices.some((device) => device.isUnverified()); return hasUnverifiedDevice ? "warning" : "verified"; @@ -1047,6 +1047,117 @@ const PowerLevelEditor = ({user, room, roomPermissions, onFinished}) => { ); }; +export const UserInfoPane = ({children, className, onClose, e2eStatus, member}) => { + const cli = useContext(MatrixClientContext); + + let closeButton; + if (onClose) { + closeButton = +
      + ; + } + + let presenceState; + let presenceLastActiveAgo; + let presenceCurrentlyActive; + let statusMessage; + + if (member instanceof RoomMember && member.user) { + presenceState = member.user.presence; + presenceLastActiveAgo = member.user.lastActiveAgo; + presenceCurrentlyActive = member.user.currentlyActive; + + if (SettingsStore.isFeatureEnabled("feature_custom_status")) { + statusMessage = member.user._unstable_statusMessage; + } + } + + const enablePresenceByHsUrl = SdkConfig.get()["enable_presence_by_hs_url"]; + let showPresence = true; + if (enablePresenceByHsUrl && enablePresenceByHsUrl[cli.baseUrl] !== undefined) { + showPresence = enablePresenceByHsUrl[cli.baseUrl]; + } + + let presenceLabel = null; + if (showPresence) { + const PresenceLabel = sdk.getComponent('rooms.PresenceLabel'); + presenceLabel = ; + } + + let statusLabel = null; + if (statusMessage) { + statusLabel = { statusMessage }; + } + + const onMemberAvatarClick = useCallback(() => { + const avatarUrl = member.getMxcAvatarUrl ? member.getMxcAvatarUrl() : member.avatarUrl; + if (!avatarUrl) return; + + const httpUrl = cli.mxcUrlToHttp(avatarUrl); + const ImageView = sdk.getComponent("elements.ImageView"); + const params = { + src: httpUrl, + name: member.name, + }; + + Modal.createDialog(ImageView, params, "mx_Dialog_lightbox"); + }, [cli, member]); + + const MemberAvatar = sdk.getComponent('avatars.MemberAvatar'); + const avatarElement = ( +
      +
      +
      + +
      +
      +
      + ); + + let e2eIcon; + if (e2eStatus) { + e2eIcon = ; + } + + const displayName = member.name || member.displayname; + + return ( +
      + + { closeButton } + { avatarElement } + +
      +
      +
      +

      + { e2eIcon } + { displayName } +

      +
      +
      { member.userId }
      +
      + {presenceLabel} + {statusLabel} +
      +
      +
      + + { children } +
      +
      + ); +}; + const UserInfo = ({user, groupId, roomId, onClose}) => { const cli = useContext(MatrixClientContext); @@ -1117,20 +1228,6 @@ const UserInfo = ({user, groupId, roomId, onClose}) => { } }, [cli, user.userId]); - const onMemberAvatarClick = useCallback(() => { - const avatarUrl = member.getMxcAvatarUrl ? member.getMxcAvatarUrl() : member.avatarUrl; - if (!avatarUrl) return; - - const httpUrl = cli.mxcUrlToHttp(avatarUrl); - const ImageView = sdk.getComponent("elements.ImageView"); - const params = { - src: httpUrl, - name: member.name, - }; - - Modal.createDialog(ImageView, params, "mx_Dialog_lightbox"); - }, [cli, member]); - let synapseDeactivateButton; let spinner; @@ -1180,68 +1277,6 @@ const UserInfo = ({user, groupId, roomId, onClose}) => { spinner = ; } - const displayName = member.name || member.displayname; - - let presenceState; - let presenceLastActiveAgo; - let presenceCurrentlyActive; - let statusMessage; - - if (member instanceof RoomMember && member.user) { - presenceState = member.user.presence; - presenceLastActiveAgo = member.user.lastActiveAgo; - presenceCurrentlyActive = member.user.currentlyActive; - - if (SettingsStore.isFeatureEnabled("feature_custom_status")) { - statusMessage = member.user._unstable_statusMessage; - } - } - - const enablePresenceByHsUrl = SdkConfig.get()["enable_presence_by_hs_url"]; - let showPresence = true; - if (enablePresenceByHsUrl && enablePresenceByHsUrl[cli.baseUrl] !== undefined) { - showPresence = enablePresenceByHsUrl[cli.baseUrl]; - } - - let presenceLabel = null; - if (showPresence) { - const PresenceLabel = sdk.getComponent('rooms.PresenceLabel'); - presenceLabel = ; - } - - let statusLabel = null; - if (statusMessage) { - statusLabel = { statusMessage }; - } - - // const avatarUrl = user.getMxcAvatarUrl ? user.getMxcAvatarUrl() : user.avatarUrl; - const MemberAvatar = sdk.getComponent('avatars.MemberAvatar'); - const avatarElement = ( -
      -
      -
      - -
      -
      -
      - ); - - let closeButton; - if (onClose) { - closeButton = -
      - ; - } - const memberDetails = ( {
      ); - let e2eIcon; + let e2eStatus; if (isRoomEncrypted && devices) { - const e2eStatus = _getE2EStatus(cli, user.userId, devices); - e2eIcon = ; + e2eStatus = getE2EStatus(cli, user.userId, devices); } - return ( -
      - - { closeButton } - { avatarElement } + return + { memberDetails && +
      +
      + { memberDetails } +
      +
      } -
      -
      -
      -

      - { e2eIcon } - { displayName } -

      -
      -
      { user.userId }
      -
      - {presenceLabel} - {statusLabel} -
      -
      -
      + { securitySection } + - { memberDetails &&
      -
      - { memberDetails } -
      -
      } + { adminToolsContainer } - { securitySection } - - - { adminToolsContainer } - - { spinner } -
      -
      - ); + { spinner } + ; }; UserInfo.propTypes = { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 099b64dd49..c99b22f421 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1128,6 +1128,8 @@ "For extra security, verify this user by checking a one-time code on both of your devices.": "For extra security, verify this user by checking a one-time code on both of your devices.", "For maximum security, do this in person.": "For maximum security, do this in person.", "Start Verification": "Start Verification", + "Messages in this room are end-to-end encrypted.": "Messages in this room are end-to-end encrypted.", + "Your messages are secured and only you and the recipient have the unique keys to unlock them.": "Your messages are secured and only you and the recipient have the unique keys to unlock them.", "Members": "Members", "Files": "Files", "Trusted": "Trusted", @@ -1144,7 +1146,6 @@ "%(role)s in %(roomName)s": "%(role)s in %(roomName)s", "This client does not support end-to-end encryption.": "This client does not support end-to-end encryption.", "Messages in this room are not end-to-end encrypted.": "Messages in this room are not end-to-end encrypted.", - "Messages in this room are end-to-end encrypted.": "Messages in this room are end-to-end encrypted.", "Security": "Security", "Sunday": "Sunday", "Monday": "Monday", From a6fcbcacf68d0d01ead7edaad9ad33dbbd1dfbcb Mon Sep 17 00:00:00 2001 From: Zoe Date: Fri, 24 Jan 2020 12:04:08 +0000 Subject: [PATCH 217/906] Seperates out the padlock icon, and adds a tooltip Fixes https://github.com/vector-im/riot-web/issues/11840 --- res/css/_components.scss | 1 + res/css/views/rooms/_InviteOnlyIcon.scss | 38 +++++++++++++++ res/css/views/rooms/_RoomHeader.scss | 21 -------- res/css/views/rooms/_RoomTile.scss | 25 +--------- src/components/views/rooms/InviteOnlyIcon.js | 51 ++++++++++++++++++++ src/components/views/rooms/RoomHeader.js | 12 +++-- src/components/views/rooms/RoomTile.js | 6 ++- src/i18n/strings/en_EN.json | 1 + 8 files changed, 103 insertions(+), 52 deletions(-) create mode 100644 res/css/views/rooms/_InviteOnlyIcon.scss create mode 100644 src/components/views/rooms/InviteOnlyIcon.js diff --git a/res/css/_components.scss b/res/css/_components.scss index 60f749de9c..07e92bdc7b 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -148,6 +148,7 @@ @import "./views/rooms/_AuxPanel.scss"; @import "./views/rooms/_BasicMessageComposer.scss"; @import "./views/rooms/_E2EIcon.scss"; +@import "./views/rooms/_InviteOnlyIcon.scss"; @import "./views/rooms/_EditMessageComposer.scss"; @import "./views/rooms/_EntityTile.scss"; @import "./views/rooms/_EventTile.scss"; diff --git a/res/css/views/rooms/_InviteOnlyIcon.scss b/res/css/views/rooms/_InviteOnlyIcon.scss new file mode 100644 index 0000000000..e70586bb73 --- /dev/null +++ b/res/css/views/rooms/_InviteOnlyIcon.scss @@ -0,0 +1,38 @@ +/* +Copyright 2020 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. +*/ + +.mx_InviteOnlyIcon { + width: 12px; + height: 12px; + position: relative; + display: block !important; + // Align the padlock with unencrypted room names + margin-left: 6px; + + &::before { + background-color: $roomtile-name-color; + mask-image: url('$(res)/img/feather-customised/lock-solid.svg'); + mask-position: center; + mask-repeat: no-repeat; + mask-size: contain; + content: ''; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + } +} diff --git a/res/css/views/rooms/_RoomHeader.scss b/res/css/views/rooms/_RoomHeader.scss index 6bfcd437c1..0ac2e99b97 100644 --- a/res/css/views/rooms/_RoomHeader.scss +++ b/res/css/views/rooms/_RoomHeader.scss @@ -269,24 +269,3 @@ limitations under the License. .mx_RoomHeader_pinsIndicatorUnread { background-color: $pinned-unread-color; } - -.mx_RoomHeader_PrivateIcon.mx_RoomHeader_isPrivate { - width: 12px; - height: 12px; - position: relative; - display: block !important; - - &::before { - background-color: $roomtile-name-color; - mask-image: url('$(res)/img/feather-customised/lock-solid.svg'); - mask-position: center; - mask-repeat: no-repeat; - mask-size: contain; - content: ''; - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - } -} diff --git a/res/css/views/rooms/_RoomTile.scss b/res/css/views/rooms/_RoomTile.scss index 376f4370e3..a24fdf2629 100644 --- a/res/css/views/rooms/_RoomTile.scss +++ b/res/css/views/rooms/_RoomTile.scss @@ -215,30 +215,7 @@ limitations under the License. flex: 1; } -.mx_RoomTile.mx_RoomTile.mx_RoomTile_isPrivate .mx_RoomTile_name { +.mx_InviteOnlyIcon + .mx_RoomTile_nameContainer .mx_RoomTile_name { // Scoot the padding in a bit from 6px to make it look better padding-left: 3px; } - -.mx_RoomTile.mx_RoomTile_isPrivate .mx_RoomTile_PrivateIcon { - width: 12px; - height: 12px; - position: relative; - display: block !important; - // Align the padlock with unencrypted room names - margin-left: 6px; - - &::before { - background-color: $roomtile-name-color; - mask-image: url('$(res)/img/feather-customised/lock-solid.svg'); - mask-position: center; - mask-repeat: no-repeat; - mask-size: contain; - content: ''; - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - } -} diff --git a/src/components/views/rooms/InviteOnlyIcon.js b/src/components/views/rooms/InviteOnlyIcon.js new file mode 100644 index 0000000000..5afaa7f0f2 --- /dev/null +++ b/src/components/views/rooms/InviteOnlyIcon.js @@ -0,0 +1,51 @@ +/* +Copyright 2020 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 React from 'react'; +import { _t } from '../../../languageHandler'; +import * as sdk from '../../../index'; + +export default class InviteOnlyIcon extends React.Component { + constructor() { + super(); + + this.state = { + hover: false, + }; + } + + onHoverStart = () => { + this.setState({hover: true}); + }; + + onHoverEnd = () => { + this.setState({hover: false}); + }; + + render() { + const Tooltip = sdk.getComponent("elements.Tooltip"); + let tooltip; + if (this.state.hover) { + tooltip = ; + } + return (
      + { tooltip } +
      ); + } +} diff --git a/src/components/views/rooms/RoomHeader.js b/src/components/views/rooms/RoomHeader.js index 15f0daa200..8a427e1c06 100644 --- a/src/components/views/rooms/RoomHeader.js +++ b/src/components/views/rooms/RoomHeader.js @@ -32,6 +32,7 @@ import {CancelButton} from './SimpleRoomHeader'; import SettingsStore from "../../../settings/SettingsStore"; import RoomHeaderButtons from '../right_panel/RoomHeaderButtons'; import E2EIcon from './E2EIcon'; +import InviteOnlyIcon from './InviteOnlyIcon'; export default createReactClass({ displayName: 'RoomHeader', @@ -162,11 +163,12 @@ export default createReactClass({ const joinRules = this.props.room && this.props.room.currentState.getStateEvents("m.room.join_rules", ""); const joinRule = joinRules && joinRules.getContent().join_rule; - const joinRuleClass = classNames("mx_RoomHeader_PrivateIcon", - {"mx_RoomHeader_isPrivate": joinRule === "invite"}); - const privateIcon = SettingsStore.isFeatureEnabled("feature_cross_signing") ? -
      : - undefined; + let privateIcon; + if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { + if (joinRule == "invite") { + privateIcon = ; + } + } if (this.props.onCancelClick) { cancelButton = ; diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index 0b50d85ff6..4e1a4c7b23 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -34,6 +34,7 @@ import SettingsStore from "../../../settings/SettingsStore"; import {_t} from "../../../languageHandler"; import {RovingTabIndexWrapper} from "../../../accessibility/RovingTabIndex"; import E2EIcon from './E2EIcon'; +import InviteOnlyIcon from './InviteOnlyIcon'; // eslint-disable-next-line camelcase import rate_limited_func from '../../../ratelimitedfunc'; @@ -411,7 +412,6 @@ export default createReactClass({ 'mx_RoomTile_noBadges': !badges, 'mx_RoomTile_transparent': this.props.transparent, 'mx_RoomTile_hasSubtext': subtext && !this.props.collapsed, - 'mx_RoomTile_isPrivate': this.state.joinRule == "invite" && !dmUserId, }); const avatarClasses = classNames({ @@ -523,7 +523,9 @@ export default createReactClass({ let privateIcon = null; if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { - privateIcon =
      ; + if (this.state.joinRule == "invite" && !dmUserId) { + privateIcon = ; + } } let e2eIcon = null; diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 099b64dd49..456d48a94c 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -908,6 +908,7 @@ "Unencrypted": "Unencrypted", "Encrypted by a deleted device": "Encrypted by a deleted device", "Please select the destination room for this message": "Please select the destination room for this message", + "Invite only": "Invite only", "Scroll to bottom of page": "Scroll to bottom of page", "Close preview": "Close preview", "device id: ": "device id: ", From 688f7029d292dcbcaace4eefeec28837e2978041 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 24 Jan 2020 12:28:03 +0000 Subject: [PATCH 218/906] Split AsyncWrapper out from Modal So we can use it outside of modals & dialogs --- src/AsyncWrapper.js | 93 +++++++++++++++++++++++++++++++++++++++++++++ src/Modal.js | 77 +------------------------------------ 2 files changed, 95 insertions(+), 75 deletions(-) create mode 100644 src/AsyncWrapper.js diff --git a/src/AsyncWrapper.js b/src/AsyncWrapper.js new file mode 100644 index 0000000000..63b856a882 --- /dev/null +++ b/src/AsyncWrapper.js @@ -0,0 +1,93 @@ +/* +Copyright 2015, 2016 OpenMarket Ltd +Copyright 2020 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 createReactClass from 'create-react-class'; +import Analytics from './Analytics'; +import * as sdk from './index'; +import PropTypes from 'prop-types'; +import { _t } from './languageHandler'; + +/** + * Wrap an asynchronous loader function with a react component which shows a + * spinner until the real component loads. + */ +export default createReactClass({ + propTypes: { + /** A promise which resolves with the real component + */ + prom: PropTypes.object.isRequired, + }, + + getInitialState: function() { + return { + component: null, + error: null, + }; + }, + + componentWillMount: function() { + this._unmounted = false; + // XXX: temporary logging to try to diagnose + // https://github.com/vector-im/riot-web/issues/3148 + console.log('Starting load of AsyncWrapper for modal'); + this.props.prom.then((result) => { + if (this._unmounted) { + return; + } + // Take the 'default' member if it's there, then we support + // passing in just an import()ed module, since ES6 async import + // always returns a module *namespace*. + const component = result.default ? result.default : result; + this.setState({component}); + }).catch((e) => { + console.warn('AsyncWrapper promise failed', e); + this.setState({error: e}); + }); + }, + + componentWillUnmount: function() { + this._unmounted = true; + }, + + _onWrapperCancelClick: function() { + this.props.onFinished(false); + }, + + render: function() { + if (this.state.component) { + const Component = this.state.component; + return ; + } else if (this.state.error) { + const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); + const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); + return + {_t("Unable to load! Check your network connectivity and try again.")} + + ; + } else { + // show a spinner until the component is loaded. + const Spinner = sdk.getComponent("elements.Spinner"); + return ; + } + }, +}); + diff --git a/src/Modal.js b/src/Modal.js index 29d3af2e74..b6215b2b5a 100644 --- a/src/Modal.js +++ b/src/Modal.js @@ -17,87 +17,14 @@ limitations under the License. import React from 'react'; import ReactDOM from 'react-dom'; -import PropTypes from 'prop-types'; -import createReactClass from 'create-react-class'; import Analytics from './Analytics'; -import * as sdk from './index'; import dis from './dispatcher'; -import { _t } from './languageHandler'; -import {defer} from "./utils/promise"; +import {defer} from './utils/promise'; +import AsyncWrapper from './AsyncWrapper'; const DIALOG_CONTAINER_ID = "mx_Dialog_Container"; const STATIC_DIALOG_CONTAINER_ID = "mx_Dialog_StaticContainer"; -/** - * Wrap an asynchronous loader function with a react component which shows a - * spinner until the real component loads. - */ -const AsyncWrapper = createReactClass({ - propTypes: { - /** A promise which resolves with the real component - */ - prom: PropTypes.object.isRequired, - }, - - getInitialState: function() { - return { - component: null, - error: null, - }; - }, - - componentWillMount: function() { - this._unmounted = false; - // XXX: temporary logging to try to diagnose - // https://github.com/vector-im/riot-web/issues/3148 - console.log('Starting load of AsyncWrapper for modal'); - this.props.prom.then((result) => { - if (this._unmounted) { - return; - } - // Take the 'default' member if it's there, then we support - // passing in just an import()ed module, since ES6 async import - // always returns a module *namespace*. - const component = result.default ? result.default : result; - this.setState({component}); - }).catch((e) => { - console.warn('AsyncWrapper promise failed', e); - this.setState({error: e}); - }); - }, - - componentWillUnmount: function() { - this._unmounted = true; - }, - - _onWrapperCancelClick: function() { - this.props.onFinished(false); - }, - - render: function() { - if (this.state.component) { - const Component = this.state.component; - return ; - } else if (this.state.error) { - const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); - const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); - return - {_t("Unable to load! Check your network connectivity and try again.")} - - ; - } else { - // show a spinner until the component is loaded. - const Spinner = sdk.getComponent("elements.Spinner"); - return ; - } - }, -}); - class ModalManager { constructor() { this._counter = 0; From dbf1c9a02a4550fba98930f51d6058e4566ada47 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 24 Jan 2020 12:34:03 +0000 Subject: [PATCH 219/906] Apparently i18n... --- src/i18n/strings/en_EN.json | 6 +- src/i18n/strings/en_EN.json.orig | 2040 ++++++++++++++++++++++++++++++ 2 files changed, 2043 insertions(+), 3 deletions(-) create mode 100644 src/i18n/strings/en_EN.json.orig diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 099b64dd49..610f1546e7 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -21,6 +21,9 @@ "Analytics": "Analytics", "The information being sent to us to help make Riot.im better includes:": "The information being sent to us to help make Riot.im better includes:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.", + "Error": "Error", + "Unable to load! Check your network connectivity and try again.": "Unable to load! Check your network connectivity and try again.", + "Dismiss": "Dismiss", "Call Failed": "Call Failed", "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.", "Review Devices": "Review Devices", @@ -105,9 +108,6 @@ "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.": "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.", "Only continue if you trust the owner of the server.": "Only continue if you trust the owner of the server.", "Trust": "Trust", - "Error": "Error", - "Unable to load! Check your network connectivity and try again.": "Unable to load! Check your network connectivity and try again.", - "Dismiss": "Dismiss", "Riot does not have permission to send you notifications - please check your browser settings": "Riot does not have permission to send you notifications - please check your browser settings", "Riot was not given permission to send notifications - please try again": "Riot was not given permission to send notifications - please try again", "Unable to enable Notifications": "Unable to enable Notifications", diff --git a/src/i18n/strings/en_EN.json.orig b/src/i18n/strings/en_EN.json.orig new file mode 100644 index 0000000000..f0eab6b12d --- /dev/null +++ b/src/i18n/strings/en_EN.json.orig @@ -0,0 +1,2040 @@ +{ + "This email address is already in use": "This email address is already in use", + "This phone number is already in use": "This phone number is already in use", + "Add Email Address": "Add Email Address", + "Failed to verify email address: make sure you clicked the link in the email": "Failed to verify email address: make sure you clicked the link in the email", + "Add Phone Number": "Add Phone Number", + "The platform you're on": "The platform you're on", + "The version of Riot.im": "The version of Riot.im", + "Whether or not you're logged in (we don't record your username)": "Whether or not you're logged in (we don't record your username)", + "Your language of choice": "Your language of choice", + "Which officially provided instance you are using, if any": "Which officially provided instance you are using, if any", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Whether or not you're using the Richtext mode of the Rich Text Editor", + "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)", + "Your homeserver's URL": "Your homeserver's URL", + "Your identity server's URL": "Your identity server's URL", + "e.g. %(exampleValue)s": "e.g. %(exampleValue)s", + "Every page you use in the app": "Every page you use in the app", + "e.g. ": "e.g. ", + "Your User Agent": "Your User Agent", + "Your device resolution": "Your device resolution", + "Analytics": "Analytics", + "The information being sent to us to help make Riot.im better includes:": "The information being sent to us to help make Riot.im better includes:", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.", + "Call Failed": "Call Failed", + "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.", + "Review Devices": "Review Devices", + "Call Anyway": "Call Anyway", + "Answer Anyway": "Answer Anyway", + "Call": "Call", + "Answer": "Answer", + "Call Timeout": "Call Timeout", + "The remote side failed to pick up": "The remote side failed to pick up", + "Call failed due to misconfigured server": "Call failed due to misconfigured server", + "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.", + "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.": "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.", + "Try using turn.matrix.org": "Try using turn.matrix.org", + "OK": "OK", + "Unable to capture screen": "Unable to capture screen", + "Existing Call": "Existing Call", + "You are already in a call.": "You are already in a call.", + "VoIP is unsupported": "VoIP is unsupported", + "You cannot place VoIP calls in this browser.": "You cannot place VoIP calls in this browser.", + "You cannot place a call with yourself.": "You cannot place a call with yourself.", + "Could not connect to the integration server": "Could not connect to the integration server", + "A conference call could not be started because the integrations server is not available": "A conference call could not be started because the integrations server is not available", + "Call in Progress": "Call in Progress", + "A call is currently being placed!": "A call is currently being placed!", + "A call is already in progress!": "A call is already in progress!", + "Permission Required": "Permission Required", + "You do not have permission to start a conference call in this room": "You do not have permission to start a conference call in this room", + "Replying With Files": "Replying With Files", + "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "At this time it is not possible to reply with a file. Would you like to upload this file without replying?", + "Continue": "Continue", + "The file '%(fileName)s' failed to upload.": "The file '%(fileName)s' failed to upload.", + "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "The file '%(fileName)s' exceeds this homeserver's size limit for uploads", + "Upload Failed": "Upload Failed", + "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", + "The server does not support the room version specified.": "The server does not support the room version specified.", + "Failure to create room": "Failure to create room", + "Send cross-signing keys to homeserver": "Send cross-signing keys to homeserver", + "Send anyway": "Send anyway", + "Send": "Send", + "Sun": "Sun", + "Mon": "Mon", + "Tue": "Tue", + "Wed": "Wed", + "Thu": "Thu", + "Fri": "Fri", + "Sat": "Sat", + "Jan": "Jan", + "Feb": "Feb", + "Mar": "Mar", + "Apr": "Apr", + "May": "May", + "Jun": "Jun", + "Jul": "Jul", + "Aug": "Aug", + "Sep": "Sep", + "Oct": "Oct", + "Nov": "Nov", + "Dec": "Dec", + "PM": "PM", + "AM": "AM", + "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s", + "New Session": "New Session", + "Who would you like to add to this community?": "Who would you like to add to this community?", + "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID", + "Invite new community members": "Invite new community members", + "Name or Matrix ID": "Name or Matrix ID", + "Invite to Community": "Invite to Community", + "Which rooms would you like to add to this community?": "Which rooms would you like to add to this community?", + "Show these rooms to non-members on the community page and room list?": "Show these rooms to non-members on the community page and room list?", + "Add rooms to the community": "Add rooms to the community", + "Room name or alias": "Room name or alias", + "Add to community": "Add to community", + "Failed to invite the following users to %(groupId)s:": "Failed to invite the following users to %(groupId)s:", + "Failed to invite users to community": "Failed to invite users to community", + "Failed to invite users to %(groupId)s": "Failed to invite users to %(groupId)s", + "Failed to add the following rooms to %(groupId)s:": "Failed to add the following rooms to %(groupId)s:", + "Unnamed Room": "Unnamed Room", + "Identity server has no terms of service": "Identity server has no terms of service", + "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.": "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.", + "Only continue if you trust the owner of the server.": "Only continue if you trust the owner of the server.", + "Trust": "Trust", + "Error": "Error", + "Unable to load! Check your network connectivity and try again.": "Unable to load! Check your network connectivity and try again.", + "Dismiss": "Dismiss", + "Riot does not have permission to send you notifications - please check your browser settings": "Riot does not have permission to send you notifications - please check your browser settings", + "Riot was not given permission to send notifications - please try again": "Riot was not given permission to send notifications - please try again", + "Unable to enable Notifications": "Unable to enable Notifications", + "This email address was not found": "This email address was not found", + "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Your email address does not appear to be associated with a Matrix ID on this Homeserver.", + "Registration Required": "Registration Required", + "You need to register to do this. Would you like to register now?": "You need to register to do this. Would you like to register now?", + "Register": "Register", + "Default": "Default", + "Restricted": "Restricted", + "Moderator": "Moderator", + "Admin": "Admin", + "Custom (%(level)s)": "Custom (%(level)s)", + "Start a chat": "Start a chat", + "Who would you like to communicate with?": "Who would you like to communicate with?", + "Email, name or Matrix ID": "Email, name or Matrix ID", + "Start Chat": "Start Chat", + "Invite new room members": "Invite new room members", + "Send Invites": "Send Invites", + "Failed to start chat": "Failed to start chat", + "Operation failed": "Operation failed", + "Failed to invite": "Failed to invite", + "Failed to invite users to the room:": "Failed to invite users to the room:", + "Failed to invite the following users to the %(roomName)s room:": "Failed to invite the following users to the %(roomName)s room:", + "You need to be logged in.": "You need to be logged in.", + "You need to be able to invite users to do that.": "You need to be able to invite users to do that.", + "Unable to create widget.": "Unable to create widget.", + "Missing roomId.": "Missing roomId.", + "Failed to send request.": "Failed to send request.", + "This room is not recognised.": "This room is not recognised.", + "Power level must be positive integer.": "Power level must be positive integer.", + "You are not in this room.": "You are not in this room.", + "You do not have permission to do that in this room.": "You do not have permission to do that in this room.", + "Missing room_id in request": "Missing room_id in request", + "Room %(roomId)s not visible": "Room %(roomId)s not visible", + "Missing user_id in request": "Missing user_id in request", + "Messages": "Messages", + "Actions": "Actions", + "Advanced": "Advanced", + "Other": "Other", + "Usage": "Usage", + "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Prepends ¯\\_(ツ)_/¯ to a plain-text message", + "Sends a message as plain text, without interpreting it as markdown": "Sends a message as plain text, without interpreting it as markdown", + "Searches DuckDuckGo for results": "Searches DuckDuckGo for results", + "/ddg is not a command": "/ddg is not a command", + "To use it, just wait for autocomplete results to load and tab through them.": "To use it, just wait for autocomplete results to load and tab through them.", + "Upgrades a room to a new version": "Upgrades a room to a new version", + "You do not have the required permissions to use this command.": "You do not have the required permissions to use this command.", + "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 your display nickname": "Changes your display nickname", + "Changes your display nickname in the current room only": "Changes your display nickname in the current room only", + "Changes the avatar of the current room": "Changes the avatar of the current room", + "Changes your avatar in this current room only": "Changes your avatar in this current room only", + "Changes your avatar in all rooms": "Changes your avatar in all rooms", + "Gets or sets the room topic": "Gets or sets the room topic", + "This room has no topic.": "This room has no topic.", + "Sets the room name": "Sets the room name", + "Invites user with given id to current room": "Invites user with given id to current room", + "Use an identity server": "Use an identity server", + "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.", + "Use an identity server to invite by email. Manage in Settings.": "Use an identity server to invite by email. Manage in Settings.", + "Joins room with given alias": "Joins room with given alias", + "Leave room": "Leave room", + "Unrecognised room alias:": "Unrecognised room alias:", + "Kicks user with given id": "Kicks user with given id", + "Bans user with given id": "Bans user with given id", + "Unbans user with given ID": "Unbans user with given ID", + "Ignores a user, hiding their messages from you": "Ignores a user, hiding their messages from you", + "Ignored user": "Ignored user", + "You are now ignoring %(userId)s": "You are now ignoring %(userId)s", + "Stops ignoring a user, showing their messages going forward": "Stops ignoring a user, showing their messages going forward", + "Unignored user": "Unignored user", + "You are no longer ignoring %(userId)s": "You are no longer ignoring %(userId)s", + "Define the power level of a user": "Define the power level of a user", + "Deops user with given id": "Deops user with given id", + "Opens the Developer Tools dialog": "Opens the Developer Tools dialog", + "Adds a custom widget by URL to the room": "Adds a custom widget by URL to the room", + "Please supply a https:// or http:// widget URL": "Please supply a https:// or http:// widget URL", + "You cannot modify widgets in this room.": "You cannot modify widgets in this room.", + "Verifies a user, device, and pubkey tuple": "Verifies a user, device, and pubkey tuple", + "Unknown (user, device) pair:": "Unknown (user, device) pair:", + "Device already verified!": "Device already verified!", + "WARNING: Device already verified, but keys do NOT MATCH!": "WARNING: Device already verified, but keys do NOT MATCH!", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!", + "Verified key": "Verified key", + "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.", + "Displays action": "Displays action", + "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", + "Sends the given message coloured as a rainbow": "Sends the given message coloured as a rainbow", + "Sends the given emote coloured as a rainbow": "Sends the given emote coloured as a rainbow", + "Displays list of commands with usages and descriptions": "Displays list of commands with usages and descriptions", + "Unrecognised command:": "Unrecognised command:", + "Reason": "Reason", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepted the invitation for %(displayName)s.", + "%(targetName)s accepted an invitation.": "%(targetName)s accepted an invitation.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s requested a VoIP conference.", + "%(senderName)s invited %(targetName)s.": "%(senderName)s invited %(targetName)s.", + "%(senderName)s banned %(targetName)s.": "%(senderName)s banned %(targetName)s.", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s changed their display name to %(displayName)s.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s set their display name to %(displayName)s.", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removed their display name (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s removed their profile picture.", + "%(senderName)s changed their profile picture.": "%(senderName)s changed their profile picture.", + "%(senderName)s set a profile picture.": "%(senderName)s set a profile picture.", + "%(senderName)s made no change.": "%(senderName)s made no change.", + "VoIP conference started.": "VoIP conference started.", + "%(targetName)s joined the room.": "%(targetName)s joined the room.", + "VoIP conference finished.": "VoIP conference finished.", + "%(targetName)s rejected the invitation.": "%(targetName)s rejected the invitation.", + "%(targetName)s left the room.": "%(targetName)s left the room.", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s unbanned %(targetName)s.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s withdrew %(targetName)s's invitation.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s kicked %(targetName)s.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s changed the topic to \"%(topic)s\".", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s removed the room name.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s changed the room name to %(roomName)s.", + "%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s upgraded this room.", + "%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s made the room public to whoever knows the link.", + "%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s made the room invite only.", + "%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s changed the join rule to %(rule)s", + "%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s has allowed guests to join the room.", + "%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s has prevented guests from joining the room.", + "%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s changed guest access to %(rule)s", + "%(senderDisplayName)s enabled flair for %(groups)s in this room.": "%(senderDisplayName)s enabled flair for %(groups)s in this room.", + "%(senderDisplayName)s disabled flair for %(groups)s in this room.": "%(senderDisplayName)s disabled flair for %(groups)s in this room.", + "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.", + "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sent an image.", + "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s added %(addedAddresses)s as addresses for this room.", + "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s added %(addedAddresses)s as an address for this room.", + "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s removed %(removedAddresses)s as addresses for this room.", + "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s removed %(removedAddresses)s as an address for this room.", + "%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.", + "%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s set the main address for this room to %(address)s.", + "%(senderName)s removed the main address for this room.": "%(senderName)s removed the main address for this room.", + "Someone": "Someone", + "(not supported by this browser)": "(not supported by this browser)", + "%(senderName)s answered the call.": "%(senderName)s answered the call.", + "(could not connect media)": "(could not connect media)", + "(no answer)": "(no answer)", + "(unknown failure: %(reason)s)": "(unknown failure: %(reason)s)", + "%(senderName)s ended the call.": "%(senderName)s ended the call.", + "%(senderName)s placed a voice call.": "%(senderName)s placed a voice call.", + "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s placed a voice call. (not supported by this browser)", + "%(senderName)s placed a video call.": "%(senderName)s placed a video call.", + "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s placed a video call. (not supported by this browser)", + "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s made future room history visible to all room members, from the point they are invited.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s made future room history visible to all room members, from the point they joined.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s made future room history visible to all room members.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s made future room history visible to anyone.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s made future room history visible to unknown (%(visibility)s).", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s changed the power level of %(powerLevelDiffText)s.", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.", + "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s widget modified by %(senderName)s", + "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s widget added by %(senderName)s", + "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s widget removed by %(senderName)s", + "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s removed the rule banning users matching %(glob)s", + "%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s removed the rule banning rooms matching %(glob)s", + "%(senderName)s removed the rule banning servers matching %(glob)s": "%(senderName)s removed the rule banning servers matching %(glob)s", + "%(senderName)s removed a ban rule matching %(glob)s": "%(senderName)s removed a ban rule matching %(glob)s", + "%(senderName)s updated an invalid ban rule": "%(senderName)s updated an invalid ban rule", + "%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s": "%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s", + "%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s", + "%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s", + "%(senderName)s updated a ban rule matching %(glob)s for %(reason)s": "%(senderName)s updated a ban rule matching %(glob)s for %(reason)s", + "%(senderName)s created a rule banning users matching %(glob)s for %(reason)s": "%(senderName)s created a rule banning users matching %(glob)s for %(reason)s", + "%(senderName)s created a rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s created a rule banning rooms matching %(glob)s for %(reason)s", + "%(senderName)s created a rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s created a rule banning servers matching %(glob)s for %(reason)s", + "%(senderName)s created a ban rule matching %(glob)s for %(reason)s": "%(senderName)s created a ban rule matching %(glob)s for %(reason)s", + "%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s", + "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s", + "%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s", + "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s", + "Light theme": "Light theme", + "Dark theme": "Dark theme", + "%(displayName)s is typing …": "%(displayName)s is typing …", + "%(names)s and %(count)s others are typing …|other": "%(names)s and %(count)s others are typing …", + "%(names)s and %(count)s others are typing …|one": "%(names)s and one other is typing …", + "%(names)s and %(lastPerson)s are typing …": "%(names)s and %(lastPerson)s are typing …", + "Cannot reach homeserver": "Cannot reach homeserver", + "Ensure you have a stable internet connection, or get in touch with the server admin": "Ensure you have a stable internet connection, or get in touch with the server admin", + "Your Riot is misconfigured": "Your Riot is misconfigured", + "Ask your Riot admin to check your config for incorrect or duplicate entries.": "Ask your Riot admin to check your config for incorrect or duplicate entries.", + "Cannot reach identity server": "Cannot reach identity server", + "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.": "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.", + "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.": "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.", + "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.": "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.", + "No homeserver URL provided": "No homeserver URL provided", + "Unexpected error resolving homeserver configuration": "Unexpected error resolving homeserver configuration", + "Unexpected error resolving identity server configuration": "Unexpected error resolving identity server configuration", + "The message you are trying to send is too large.": "The message you are trying to send is too large.", + "This homeserver has hit its Monthly Active User limit.": "This homeserver has hit its Monthly Active User limit.", + "This homeserver has exceeded one of its resource limits.": "This homeserver has exceeded one of its resource limits.", + "Please contact your service administrator to continue using the service.": "Please contact your service administrator to continue using the service.", + "Unable to connect to Homeserver. Retrying...": "Unable to connect to Homeserver. Retrying...", + "%(items)s and %(count)s others|other": "%(items)s and %(count)s others", + "%(items)s and %(count)s others|one": "%(items)s and one other", + "%(items)s and %(lastItem)s": "%(items)s and %(lastItem)s", + "a few seconds ago": "a few seconds ago", + "about a minute ago": "about a minute ago", + "%(num)s minutes ago": "%(num)s minutes ago", + "about an hour ago": "about an hour ago", + "%(num)s hours ago": "%(num)s hours ago", + "about a day ago": "about a day ago", + "%(num)s days ago": "%(num)s days ago", + "a few seconds from now": "a few seconds from now", + "about a minute from now": "about a minute from now", + "%(num)s minutes from now": "%(num)s minutes from now", + "about an hour from now": "about an hour from now", + "%(num)s hours from now": "%(num)s hours from now", + "about a day from now": "about a day from now", + "%(num)s days from now": "%(num)s days from now", + "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", + "Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions", + "Not a valid Riot keyfile": "Not a valid Riot keyfile", + "Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?", + "Unrecognised address": "Unrecognised address", + "You do not have permission to invite people to this room.": "You do not have permission to invite people to this room.", + "User %(userId)s is already in the room": "User %(userId)s is already in the room", + "User %(user_id)s does not exist": "User %(user_id)s does not exist", + "User %(user_id)s may or may not exist": "User %(user_id)s may or may not exist", + "The user must be unbanned before they can be invited.": "The user must be unbanned before they can be invited.", + "The user's homeserver does not support the version of the room.": "The user's homeserver does not support the version of the room.", + "Unknown server error": "Unknown server error", + "Use a few words, avoid common phrases": "Use a few words, avoid common phrases", + "No need for symbols, digits, or uppercase letters": "No need for symbols, digits, or uppercase letters", + "Use a longer keyboard pattern with more turns": "Use a longer keyboard pattern with more turns", + "Avoid repeated words and characters": "Avoid repeated words and characters", + "Avoid sequences": "Avoid sequences", + "Avoid recent years": "Avoid recent years", + "Avoid years that are associated with you": "Avoid years that are associated with you", + "Avoid dates and years that are associated with you": "Avoid dates and years that are associated with you", + "Capitalization doesn't help very much": "Capitalization doesn't help very much", + "All-uppercase is almost as easy to guess as all-lowercase": "All-uppercase is almost as easy to guess as all-lowercase", + "Reversed words aren't much harder to guess": "Reversed words aren't much harder to guess", + "Predictable substitutions like '@' instead of 'a' don't help very much": "Predictable substitutions like '@' instead of 'a' don't help very much", + "Add another word or two. Uncommon words are better.": "Add another word or two. Uncommon words are better.", + "Repeats like \"aaa\" are easy to guess": "Repeats like \"aaa\" are easy to guess", + "Repeats like \"abcabcabc\" are only slightly harder to guess than \"abc\"": "Repeats like \"abcabcabc\" are only slightly harder to guess than \"abc\"", + "Sequences like abc or 6543 are easy to guess": "Sequences like abc or 6543 are easy to guess", + "Recent years are easy to guess": "Recent years are easy to guess", + "Dates are often easy to guess": "Dates are often easy to guess", + "This is a top-10 common password": "This is a top-10 common password", + "This is a top-100 common password": "This is a top-100 common password", + "This is a very common password": "This is a very common password", + "This is similar to a commonly used password": "This is similar to a commonly used password", + "A word by itself is easy to guess": "A word by itself is easy to guess", + "Names and surnames by themselves are easy to guess": "Names and surnames by themselves are easy to guess", + "Common names and surnames are easy to guess": "Common names and surnames are easy to guess", + "Straight rows of keys are easy to guess": "Straight rows of keys are easy to guess", + "Short keyboard patterns are easy to guess": "Short keyboard patterns are easy to guess", + "There was an error joining the room": "There was an error joining the room", + "Sorry, your homeserver is too old to participate in this room.": "Sorry, your homeserver is too old to participate in this room.", + "Please contact your homeserver administrator.": "Please contact your homeserver administrator.", + "Failed to join room": "Failed to join room", + "Message Pinning": "Message Pinning", + "Custom user status messages": "Custom user status messages", + "Group & filter rooms by custom tags (refresh to apply changes)": "Group & filter rooms by custom tags (refresh to apply changes)", + "Render simple counters in room header": "Render simple counters in room header", + "Multiple integration managers": "Multiple integration managers", + "Try out new ways to ignore people (experimental)": "Try out new ways to ignore people (experimental)", + "New invite dialog": "New invite dialog", + "Show a presence dot next to DMs in the room list": "Show a presence dot next to DMs in the room list", + "Enable cross-signing to verify per-user instead of per-device (in development)": "Enable cross-signing to verify per-user instead of per-device (in development)", + "Enable local event indexing and E2EE search (requires restart)": "Enable local event indexing and E2EE search (requires restart)", + "Show info about bridges in room settings": "Show info about bridges in room settings", + "Enable Emoji suggestions while typing": "Enable Emoji suggestions while typing", + "Use compact timeline layout": "Use compact timeline layout", + "Show a placeholder for removed messages": "Show a placeholder for removed messages", + "Show join/leave messages (invites/kicks/bans unaffected)": "Show join/leave messages (invites/kicks/bans unaffected)", + "Show avatar changes": "Show avatar changes", + "Show display name changes": "Show display name changes", + "Show read receipts sent by other users": "Show read receipts sent by other users", + "Show timestamps in 12 hour format (e.g. 2:30pm)": "Show timestamps in 12 hour format (e.g. 2:30pm)", + "Always show message timestamps": "Always show message timestamps", + "Autoplay GIFs and videos": "Autoplay GIFs and videos", + "Always show encryption icons": "Always show encryption icons", + "Show a reminder to enable Secure Message Recovery in encrypted rooms": "Show a reminder to enable Secure Message Recovery in encrypted rooms", + "Enable automatic language detection for syntax highlighting": "Enable automatic language detection for syntax highlighting", + "Show avatars in user and room mentions": "Show avatars in user and room mentions", + "Enable big emoji in chat": "Enable big emoji in chat", + "Send typing notifications": "Send typing notifications", + "Automatically replace plain text Emoji": "Automatically replace plain text Emoji", + "Mirror local video feed": "Mirror local video feed", + "Enable Community Filter Panel": "Enable Community Filter Panel", + "Match system theme": "Match system theme", + "Allow Peer-to-Peer for 1:1 calls": "Allow Peer-to-Peer for 1:1 calls", + "Send analytics data": "Send analytics data", + "Never send encrypted messages to unverified devices from this device": "Never send encrypted messages to unverified devices from this device", + "Never send encrypted messages to unverified devices in this room from this device": "Never send encrypted messages to unverified devices in this room from this device", + "Enable inline URL previews by default": "Enable inline URL previews by default", + "Enable URL previews for this room (only affects you)": "Enable URL previews for this room (only affects you)", + "Enable URL previews by default for participants in this room": "Enable URL previews by default for participants in this room", + "Room Colour": "Room Colour", + "Enable widget screenshots on supported widgets": "Enable widget screenshots on supported widgets", + "Prompt before sending invites to potentially invalid matrix IDs": "Prompt before sending invites to potentially invalid matrix IDs", + "Show developer tools": "Show developer tools", + "Order rooms in the room list by most important first instead of most recent": "Order rooms in the room list by most important first instead of most recent", + "Show recently visited rooms above the room list": "Show recently visited rooms above the room list", + "Show hidden events in timeline": "Show hidden events in timeline", + "Low bandwidth mode": "Low bandwidth mode", + "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)", + "Send read receipts for messages (requires compatible homeserver to disable)": "Send read receipts for messages (requires compatible homeserver to disable)", + "Show previews/thumbnails for images": "Show previews/thumbnails for images", + "Collecting app version information": "Collecting app version information", + "Collecting logs": "Collecting logs", + "Uploading report": "Uploading report", + "Waiting for response from server": "Waiting for response from server", + "Messages containing my display name": "Messages containing my display name", + "Messages containing my username": "Messages containing my username", + "Messages containing @room": "Messages containing @room", + "Messages in one-to-one chats": "Messages in one-to-one chats", + "Encrypted messages in one-to-one chats": "Encrypted messages in one-to-one chats", + "Messages in group chats": "Messages in group chats", + "Encrypted messages in group chats": "Encrypted messages in group chats", + "When I'm invited to a room": "When I'm invited to a room", + "Call invitation": "Call invitation", + "Messages sent by bot": "Messages sent by bot", + "When rooms are upgraded": "When rooms are upgraded", + "My Ban List": "My Ban List", + "This is your list of users/servers you have blocked - don't leave the room!": "This is your list of users/servers you have blocked - don't leave the room!", + "Active call (%(roomName)s)": "Active call (%(roomName)s)", + "unknown caller": "unknown caller", + "Incoming voice call from %(name)s": "Incoming voice call from %(name)s", + "Incoming video call from %(name)s": "Incoming video call from %(name)s", + "Incoming call from %(name)s": "Incoming call from %(name)s", + "Decline": "Decline", + "Accept": "Accept", + "The other party cancelled the verification.": "The other party cancelled the verification.", + "Verified!": "Verified!", + "You've successfully verified this user.": "You've successfully verified this user.", + "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.", + "Got It": "Got It", + "Verify this user by confirming the following emoji appear on their screen.": "Verify this user by confirming the following emoji appear on their screen.", + "Verify this user by confirming the following number appears on their screen.": "Verify this user by confirming the following number appears on their screen.", + "Unable to find a supported verification method.": "Unable to find a supported verification method.", + "Cancel": "Cancel", + "For maximum security, we recommend you do this in person or use another trusted means of communication.": "For maximum security, we recommend you do this in person or use another trusted means of communication.", + "Dog": "Dog", + "Cat": "Cat", + "Lion": "Lion", + "Horse": "Horse", + "Unicorn": "Unicorn", + "Pig": "Pig", + "Elephant": "Elephant", + "Rabbit": "Rabbit", + "Panda": "Panda", + "Rooster": "Rooster", + "Penguin": "Penguin", + "Turtle": "Turtle", + "Fish": "Fish", + "Octopus": "Octopus", + "Butterfly": "Butterfly", + "Flower": "Flower", + "Tree": "Tree", + "Cactus": "Cactus", + "Mushroom": "Mushroom", + "Globe": "Globe", + "Moon": "Moon", + "Cloud": "Cloud", + "Fire": "Fire", + "Banana": "Banana", + "Apple": "Apple", + "Strawberry": "Strawberry", + "Corn": "Corn", + "Pizza": "Pizza", + "Cake": "Cake", + "Heart": "Heart", + "Smiley": "Smiley", + "Robot": "Robot", + "Hat": "Hat", + "Glasses": "Glasses", + "Spanner": "Spanner", + "Santa": "Santa", + "Thumbs up": "Thumbs up", + "Umbrella": "Umbrella", + "Hourglass": "Hourglass", + "Clock": "Clock", + "Gift": "Gift", + "Light bulb": "Light bulb", + "Book": "Book", + "Pencil": "Pencil", + "Paperclip": "Paperclip", + "Scissors": "Scissors", + "Lock": "Lock", + "Key": "Key", + "Hammer": "Hammer", + "Telephone": "Telephone", + "Flag": "Flag", + "Train": "Train", + "Bicycle": "Bicycle", + "Aeroplane": "Aeroplane", + "Rocket": "Rocket", + "Trophy": "Trophy", + "Ball": "Ball", + "Guitar": "Guitar", + "Trumpet": "Trumpet", + "Bell": "Bell", + "Anchor": "Anchor", + "Headphones": "Headphones", + "Folder": "Folder", + "Pin": "Pin", + "Other users may not trust it": "Other users may not trust it", + "Later": "Later", + "Verify": "Verify", + "Decline (%(counter)s)": "Decline (%(counter)s)", + "Accept to continue:": "Accept to continue:", + "Upload": "Upload", + "Remove": "Remove", + "Failed to upload profile picture!": "Failed to upload profile picture!", + "Upload new:": "Upload new:", + "No display name": "No display name", + "New passwords don't match": "New passwords don't match", + "Passwords can't be empty": "Passwords can't be empty", + "Warning!": "Warning!", + "Changing password will currently reset any end-to-end encryption keys on all devices, 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 devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.", + "Export E2E room keys": "Export E2E room keys", + "Do you want to set an email address?": "Do you want to set an email address?", + "Current password": "Current password", + "Password": "Password", + "New Password": "New Password", + "Confirm password": "Confirm password", + "Change Password": "Change Password", + "Cross-signing and secret storage are enabled.": "Cross-signing and secret storage are enabled.", + "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this device.": "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this device.", + "Cross-signing and secret storage are not yet set up.": "Cross-signing and secret storage are not yet set up.", + "Bootstrap cross-signing and secret storage": "Bootstrap cross-signing and secret storage", + "Cross-signing public keys:": "Cross-signing public keys:", + "on device": "on device", + "not found": "not found", + "Cross-signing private keys:": "Cross-signing private keys:", + "in secret storage": "in secret storage", + "Secret storage public key:": "Secret storage public key:", + "in account data": "in account data", + "Your homeserver does not support device management.": "Your homeserver does not support device management.", + "Unable to load device list": "Unable to load device list", + "Authentication": "Authentication", + "Delete %(count)s devices|other": "Delete %(count)s devices", + "Delete %(count)s devices|one": "Delete device", + "ID": "ID", + "Public Name": "Public Name", + "Last seen": "Last seen", + "Failed to set display name": "Failed to set display name", + "Disable Notifications": "Disable Notifications", + "Enable Notifications": "Enable Notifications", + "Connecting to integration manager...": "Connecting to integration manager...", + "Cannot connect to integration manager": "Cannot connect to integration manager", + "The integration manager is offline or it cannot reach your homeserver.": "The integration manager is offline or it cannot reach your homeserver.", + "Delete Backup": "Delete Backup", + "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.", + "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.", + "Unable to load key backup status": "Unable to load key backup status", + "Restore from Backup": "Restore from Backup", + "This device is backing up your keys. ": "This device is backing up your keys. ", + "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.", + "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.", + "Connect this device to Key Backup": "Connect this device to Key Backup", + "not stored": "not stored", + "Backing up %(sessionsRemaining)s keys...": "Backing up %(sessionsRemaining)s keys...", + "All keys backed up": "All keys backed up", + "Backup has a valid signature from this user": "Backup has a valid signature from this user", + "Backup has a invalid signature from this user": "Backup has a invalid signature from this user", + "Backup has a signature from unknown user with ID %(deviceId)s": "Backup has a signature from unknown user with ID %(deviceId)s", + "Backup has a signature from unknown device with ID %(deviceId)s": "Backup has a signature from unknown device with ID %(deviceId)s", + "Backup has a valid signature from this device": "Backup has a valid signature from this device", + "Backup has an invalid signature from this device": "Backup has an invalid signature from this device", + "Backup has a valid signature from verified device ": "Backup has a valid signature from verified device ", + "Backup has a valid signature from unverified device ": "Backup has a valid signature from unverified device ", + "Backup has an invalid signature from verified device ": "Backup has an invalid signature from verified device ", + "Backup has an invalid signature from unverified device ": "Backup has an invalid signature from unverified device ", + "Backup is not signed by any of your devices": "Backup is not signed by any of your devices", + "This backup is trusted because it has been restored on this device": "This backup is trusted because it has been restored on this device", + "Backup key stored in secret storage, but this feature is not enabled on this device. Please enable cross-signing in Labs to modify key backup state.": "Backup key stored in secret storage, but this feature is not enabled on this device. Please enable cross-signing in Labs to modify key backup state.", + "Backup version: ": "Backup version: ", + "Algorithm: ": "Algorithm: ", + "Backup key stored: ": "Backup key stored: ", + "Your keys are not being backed up from this device.": "Your keys are not being backed up from this device.", + "Back up your keys before signing out to avoid losing them.": "Back up your keys before signing out to avoid losing them.", + "Start using Key Backup": "Start using Key Backup", + "Error saving email notification preferences": "Error saving email notification preferences", + "An error occurred whilst saving your email notification preferences.": "An error occurred whilst saving your email notification preferences.", + "Keywords": "Keywords", + "Enter keywords separated by a comma:": "Enter keywords separated by a comma:", + "Failed to change settings": "Failed to change settings", + "Can't update user notification settings": "Can't update user notification settings", + "Failed to update keywords": "Failed to update keywords", + "Messages containing keywords": "Messages containing keywords", + "Notify for all other messages/rooms": "Notify for all other messages/rooms", + "Notify me for anything else": "Notify me for anything else", + "Enable notifications for this account": "Enable notifications for this account", + "Clear notifications": "Clear notifications", + "All notifications are currently disabled for all targets.": "All notifications are currently disabled for all targets.", + "Add an email address to configure email notifications": "Add an email address to configure email notifications", + "Enable email notifications": "Enable email notifications", + "Notifications on the following keywords follow rules which can’t be displayed here:": "Notifications on the following keywords follow rules which can’t be displayed here:", + "Unable to fetch notification target list": "Unable to fetch notification target list", + "Notification targets": "Notification targets", + "Advanced notification settings": "Advanced notification settings", + "There are advanced notifications which are not shown here": "There are advanced notifications which are not shown here", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply", + "Enable desktop notifications for this device": "Enable desktop notifications for this device", + "Show message in desktop notification": "Show message in desktop notification", + "Enable audible notifications for this device": "Enable audible notifications for this device", + "Off": "Off", + "On": "On", + "Noisy": "Noisy", + "Upgrade to your own domain": "Upgrade to your own domain", + "Display Name": "Display Name", + "Profile picture": "Profile picture", + "Save": "Save", + "Identity Server URL must be HTTPS": "Identity Server URL must be HTTPS", + "Not a valid Identity Server (status code %(code)s)": "Not a valid Identity Server (status code %(code)s)", + "Could not connect to Identity Server": "Could not connect to Identity Server", + "Checking server": "Checking server", + "Change identity server": "Change identity server", + "Disconnect from the identity server and connect to instead?": "Disconnect from the identity server and connect to instead?", + "Terms of service not accepted or the identity server is invalid.": "Terms of service not accepted or the identity server is invalid.", + "The identity server you have chosen does not have any terms of service.": "The identity server you have chosen does not have any terms of service.", + "Disconnect identity server": "Disconnect identity server", + "Disconnect from the identity server ?": "Disconnect from the identity server ?", + "Disconnect": "Disconnect", + "You should remove your personal data from identity server before disconnecting. Unfortunately, identity server is currently offline or cannot be reached.": "You should remove your personal data from identity server before disconnecting. Unfortunately, identity server is currently offline or cannot be reached.", + "You should:": "You should:", + "check your browser plugins for anything that might block the identity server (such as Privacy Badger)": "check your browser plugins for anything that might block the identity server (such as Privacy Badger)", + "contact the administrators of identity server ": "contact the administrators of identity server ", + "wait and try again later": "wait and try again later", + "Disconnect anyway": "Disconnect anyway", + "You are still sharing your personal data on the identity server .": "You are still sharing your personal data on the identity server .", + "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.", + "Go back": "Go back", + "Identity Server (%(server)s)": "Identity Server (%(server)s)", + "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.", + "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.", + "Identity Server": "Identity Server", + "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.", + "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.", + "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.", + "Do not use an identity server": "Do not use an identity server", + "Enter a new identity server": "Enter a new identity server", + "Change": "Change", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Use an Integration Manager to manage bots, widgets, and sticker packs.", + "Manage integrations": "Manage integrations", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.", + "Flair": "Flair", + "Failed to change password. Is your password correct?": "Failed to change password. Is your password correct?", + "Success": "Success", + "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them", + "Profile": "Profile", + "Email addresses": "Email addresses", + "Phone numbers": "Phone numbers", + "Account": "Account", + "Set a new account password...": "Set a new account password...", + "Language and region": "Language and region", + "Theme": "Theme", + "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.", + "Account management": "Account management", + "Deactivating your account is a permanent action - be careful!": "Deactivating your account is a permanent action - be careful!", + "Deactivate Account": "Deactivate Account", + "Warning": "Warning", + "General": "General", + "Discovery": "Discovery", + "Deactivate account": "Deactivate account", + "Legal": "Legal", + "Credits": "Credits", + "For help with using Riot, click here.": "For help with using Riot, click here.", + "For help with using Riot, click here or start a chat with our bot using the button below.": "For help with using Riot, click here or start a chat with our bot using the button below.", + "Chat with Riot Bot": "Chat with Riot Bot", + "Check for update": "Check for update", + "Help & About": "Help & About", + "Bug reporting": "Bug reporting", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. 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.": "If you've submitted a bug via GitHub, debug logs can help us track down the problem. 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.", + "Submit debug logs": "Submit debug logs", + "Clear cache and reload": "Clear cache and reload", + "FAQ": "FAQ", + "Versions": "Versions", + "matrix-react-sdk version:": "matrix-react-sdk version:", + "riot-web version:": "riot-web version:", + "olm version:": "olm version:", + "Homeserver is": "Homeserver is", + "Identity Server is": "Identity Server is", + "Access Token:": "Access Token:", + "click to reveal": "click to reveal", + "Labs": "Labs", + "Customise your experience with experimental labs features. Learn more.": "Customise your experience with experimental labs features. Learn more.", + "Ignored/Blocked": "Ignored/Blocked", + "Error adding ignored user/server": "Error adding ignored user/server", + "Something went wrong. Please try again or view your console for hints.": "Something went wrong. Please try again or view your console for hints.", + "Error subscribing to list": "Error subscribing to list", + "Please verify the room ID or alias and try again.": "Please verify the room ID or alias and try again.", + "Error removing ignored user/server": "Error removing ignored user/server", + "Error unsubscribing from list": "Error unsubscribing from list", + "Please try again or view your console for hints.": "Please try again or view your console for hints.", + "None": "None", + "Ban list rules - %(roomName)s": "Ban list rules - %(roomName)s", + "Server rules": "Server rules", + "User rules": "User rules", + "Close": "Close", + "You have not ignored anyone.": "You have not ignored anyone.", + "You are currently ignoring:": "You are currently ignoring:", + "You are not subscribed to any lists": "You are not subscribed to any lists", + "Unsubscribe": "Unsubscribe", + "View rules": "View rules", + "You are currently subscribed to:": "You are currently subscribed to:", + "Ignored users": "Ignored users", + "⚠ These settings are meant for advanced users.": "⚠ These settings are meant for advanced users.", + "Add users and servers you want to ignore here. Use asterisks to have Riot match any characters. For example, @bot:* would ignore all users that have the name 'bot' on any server.": "Add users and servers you want to ignore here. Use asterisks to have Riot match any characters. For example, @bot:* would ignore all users that have the name 'bot' on any server.", + "Ignoring people is done through ban lists which contain rules for who to ban. Subscribing to a ban list means the users/servers blocked by that list will be hidden from you.": "Ignoring people is done through ban lists which contain rules for who to ban. Subscribing to a ban list means the users/servers blocked by that list will be hidden from you.", + "Personal ban list": "Personal ban list", + "Your personal ban list holds all the users/servers you personally don't want to see messages from. After ignoring your first user/server, a new room will show up in your room list named 'My Ban List' - stay in this room to keep the ban list in effect.": "Your personal ban list holds all the users/servers you personally don't want to see messages from. After ignoring your first user/server, a new room will show up in your room list named 'My Ban List' - stay in this room to keep the ban list in effect.", + "Server or user ID to ignore": "Server or user ID to ignore", + "eg: @bot:* or example.org": "eg: @bot:* or example.org", + "Ignore": "Ignore", + "Subscribed lists": "Subscribed lists", + "Subscribing to a ban list will cause you to join it!": "Subscribing to a ban list will cause you to join it!", + "If this isn't what you want, please use a different tool to ignore users.": "If this isn't what you want, please use a different tool to ignore users.", + "Room ID or alias of ban list": "Room ID or alias of ban list", + "Subscribe": "Subscribe", + "Notifications": "Notifications", + "Start automatically after system login": "Start automatically after system login", + "Always show the window menu bar": "Always show the window menu bar", + "Show tray icon and minimize window to it on close": "Show tray icon and minimize window to it on close", + "Preferences": "Preferences", + "Composer": "Composer", + "Timeline": "Timeline", + "Room list": "Room list", + "Autocomplete delay (ms)": "Autocomplete delay (ms)", + "Read Marker lifetime (ms)": "Read Marker lifetime (ms)", + "Read Marker off-screen lifetime (ms)": "Read Marker off-screen lifetime (ms)", + "Unignore": "Unignore", + "": "", + "Import E2E room keys": "Import E2E room keys", + "Cryptography": "Cryptography", + "Device ID:": "Device ID:", + "Device key:": "Device key:", + "Bulk options": "Bulk options", + "Accept all %(invitedRooms)s invites": "Accept all %(invitedRooms)s invites", + "Reject all %(invitedRooms)s invites": "Reject all %(invitedRooms)s invites", + "Key backup": "Key backup", + "Cross-signing": "Cross-signing", + "Security & Privacy": "Security & Privacy", + "Devices": "Devices", + "A device's public name is visible to people you communicate with": "A device's public name is visible to people you communicate with", + "Riot collects anonymous analytics to allow us to improve the application.": "Riot collects anonymous analytics to allow us to improve the application.", + "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.", + "Learn more about how we use analytics.": "Learn more about how we use analytics.", + "No media permissions": "No media permissions", + "You may need to manually permit Riot to access your microphone/webcam": "You may need to manually permit Riot to access your microphone/webcam", + "Missing media permissions, click the button below to request.": "Missing media permissions, click the button below to request.", + "Request media permissions": "Request media permissions", + "No Audio Outputs detected": "No Audio Outputs detected", + "No Microphones detected": "No Microphones detected", + "No Webcams detected": "No Webcams detected", + "Default Device": "Default Device", + "Audio Output": "Audio Output", + "Microphone": "Microphone", + "Camera": "Camera", + "Voice & Video": "Voice & Video", + "This room is not accessible by remote Matrix servers": "This room is not accessible by remote Matrix servers", + "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.": "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.", + "Upgrade this room to the recommended room version": "Upgrade this room to the recommended room version", + "this room": "this room", + "View older messages in %(roomName)s.": "View older messages in %(roomName)s.", + "Room information": "Room information", + "Internal room ID:": "Internal room ID:", + "Room version": "Room version", + "Room version:": "Room version:", + "Developer options": "Developer options", + "Open Devtools": "Open Devtools", + "This bridge was provisioned by ": "This bridge was provisioned by ", + "This bridge is managed by .": "This bridge is managed by .", + "Bridged into , on ": "Bridged into , on ", + "Connected to on ": "Connected to on ", + "Connected via %(protocolName)s": "Connected via %(protocolName)s", + "Bridge Info": "Bridge Info", + "Below is a list of bridges connected to this room.": "Below is a list of bridges connected to this room.", + "Room Addresses": "Room Addresses", + "Publish this room to the public in %(domain)s's room directory?": "Publish this room to the public in %(domain)s's room directory?", + "URL Previews": "URL Previews", + "Uploaded sound": "Uploaded sound", + "Sounds": "Sounds", + "Notification sound": "Notification sound", + "Reset": "Reset", + "Set a new custom sound": "Set a new custom sound", + "Browse": "Browse", + "Change room avatar": "Change room avatar", + "Change room name": "Change room name", + "Change main address for the room": "Change main address for the room", + "Change history visibility": "Change history visibility", + "Change permissions": "Change permissions", + "Change topic": "Change topic", + "Upgrade the room": "Upgrade the room", + "Enable room encryption": "Enable room encryption", + "Modify widgets": "Modify widgets", + "Failed to unban": "Failed to unban", + "Unban": "Unban", + "Banned by %(displayName)s": "Banned by %(displayName)s", + "Error changing power level requirement": "Error changing power level requirement", + "An error occurred changing the room's power level requirements. Ensure you have sufficient permissions and try again.": "An error occurred changing the room's power level requirements. Ensure you have sufficient permissions and try again.", + "Error changing power level": "Error changing power level", + "An error occurred changing the user's power level. Ensure you have sufficient permissions and try again.": "An error occurred changing the user's power level. Ensure you have sufficient permissions and try again.", + "Default role": "Default role", + "Send messages": "Send messages", + "Invite users": "Invite users", + "Change settings": "Change settings", + "Kick users": "Kick users", + "Ban users": "Ban users", + "Remove messages": "Remove messages", + "Notify everyone": "Notify everyone", + "No users have specific privileges in this room": "No users have specific privileges in this room", + "Privileged Users": "Privileged Users", + "Muted Users": "Muted Users", + "Banned users": "Banned users", + "Send %(eventType)s events": "Send %(eventType)s events", + "Roles & Permissions": "Roles & Permissions", + "Permissions": "Permissions", + "Select the roles required to change various parts of the room": "Select the roles required to change various parts of the room", + "Enable encryption?": "Enable encryption?", + "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.": "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.", + "Guests cannot join this room even if explicitly invited.": "Guests cannot join this room even if explicitly invited.", + "Click here to fix": "Click here to fix", + "To link to this room, please add an alias.": "To link to this room, please add an alias.", + "Only people who have been invited": "Only people who have been invited", + "Anyone who knows the room's link, apart from guests": "Anyone who knows the room's link, apart from guests", + "Anyone who knows the room's link, including guests": "Anyone who knows the room's link, including guests", + "Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.": "Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.", + "Anyone": "Anyone", + "Members only (since the point in time of selecting this option)": "Members only (since the point in time of selecting this option)", + "Members only (since they were invited)": "Members only (since they were invited)", + "Members only (since they joined)": "Members only (since they joined)", + "Encryption": "Encryption", + "Once enabled, encryption cannot be disabled.": "Once enabled, encryption cannot be disabled.", + "Encrypted": "Encrypted", + "Who can access this room?": "Who can access this room?", + "Who can read history?": "Who can read history?", + "Unable to revoke sharing for email address": "Unable to revoke sharing for email address", + "Unable to share email address": "Unable to share email address", + "Your email address hasn't been verified yet": "Your email address hasn't been verified yet", + "Click the link in the email you received to verify and then click continue again.": "Click the link in the email you received to verify and then click continue again.", + "Unable to verify email address.": "Unable to verify email address.", + "Verify the link in your inbox": "Verify the link in your inbox", + "Complete": "Complete", + "Revoke": "Revoke", + "Share": "Share", + "Discovery options will appear once you have added an email above.": "Discovery options will appear once you have added an email above.", + "Unable to revoke sharing for phone number": "Unable to revoke sharing for phone number", + "Unable to share phone number": "Unable to share phone number", + "Unable to verify phone number.": "Unable to verify phone number.", + "Incorrect verification code": "Incorrect verification code", + "Please enter verification code sent via text.": "Please enter verification code sent via text.", + "Verification code": "Verification code", + "Discovery options will appear once you have added a phone number above.": "Discovery options will appear once you have added a phone number above.", + "Unable to remove contact information": "Unable to remove contact information", + "Remove %(email)s?": "Remove %(email)s?", + "Invalid Email Address": "Invalid Email Address", + "This doesn't appear to be a valid email address": "This doesn't appear to be a valid email address", + "Unable to add email address": "Unable to add email address", + "Add": "Add", + "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.", + "Email Address": "Email Address", + "Remove %(phone)s?": "Remove %(phone)s?", + "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.", + "Phone Number": "Phone Number", + "Cannot add any more widgets": "Cannot add any more widgets", + "The maximum permitted number of widgets have already been added to this room.": "The maximum permitted number of widgets have already been added to this room.", + "Add a widget": "Add a widget", + "Drop File Here": "Drop File Here", + "Drop file here to upload": "Drop file here to upload", + " (unsupported)": " (unsupported)", + "Join as voice or video.": "Join as voice or video.", + "Ongoing conference call%(supportedText)s.": "Ongoing conference call%(supportedText)s.", + "This user has not verified all of their devices.": "This user has not verified all of their devices.", + "You have not verified this user. This user has verified all of their devices.": "You have not verified this user. This user has verified all of their devices.", + "You have verified this user. This user has verified all of their devices.": "You have verified this user. This user has verified all of their devices.", + "Some users in this encrypted room are not verified by you or they have not verified their own devices.": "Some users in this encrypted room are not verified by you or they have not verified their own devices.", + "All users in this encrypted room are verified by you and they have verified their own devices.": "All users in this encrypted room are verified by you and they have verified their own devices.", + "Some devices for this user are not trusted": "Some devices for this user are not trusted", + "All devices for this user are trusted": "All devices for this user are trusted", + "Some devices in this encrypted room are not trusted": "Some devices in this encrypted room are not trusted", + "All devices in this encrypted room are trusted": "All devices in this encrypted room are trusted", + "Edit message": "Edit message", + "This event could not be displayed": "This event could not be displayed", + "%(senderName)s sent an image": "%(senderName)s sent an image", + "%(senderName)s sent a video": "%(senderName)s sent a video", + "%(senderName)s uploaded a file": "%(senderName)s uploaded a file", + "Your key share request has been sent - please check your other devices for key share requests.": "Your key share request has been sent - please check your other devices for key share requests.", + "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "If your other devices do not have the key for this message you will not be able to decrypt them.", + "Key request sent.": "Key request sent.", + "Re-request encryption keys from your other devices.": "Re-request encryption keys from your other devices.", + "This message cannot be decrypted": "This message cannot be decrypted", + "Encrypted by an unverified device": "Encrypted by an unverified device", + "Unencrypted": "Unencrypted", + "Please select the destination room for this message": "Please select the destination room for this message", + "Scroll to bottom of page": "Scroll to bottom of page", + "Close preview": "Close preview", + "device id: ": "device id: ", + "Disinvite": "Disinvite", + "Kick": "Kick", + "Disinvite this user?": "Disinvite this user?", + "Kick this user?": "Kick this user?", + "Failed to kick": "Failed to kick", + "Ban": "Ban", + "Unban this user?": "Unban this user?", + "Ban this user?": "Ban this user?", + "Failed to ban user": "Failed to ban user", + "No recent messages by %(user)s found": "No recent messages by %(user)s found", + "Try scrolling up in the timeline to see if there are any earlier ones.": "Try scrolling up in the timeline to see if there are any earlier ones.", + "Remove recent messages by %(user)s": "Remove recent messages by %(user)s", + "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|other": "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?", + "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|one": "You are about to remove 1 message by %(user)s. This cannot be undone. Do you wish to continue?", + "For a large amount of messages, this might take some time. Please don't refresh your client in the meantime.": "For a large amount of messages, this might take some time. Please don't refresh your client in the meantime.", + "Remove %(count)s messages|other": "Remove %(count)s messages", + "Remove %(count)s messages|one": "Remove 1 message", + "Demote yourself?": "Demote yourself?", + "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.": "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.", + "Demote": "Demote", + "Failed to mute user": "Failed to mute user", + "Failed to toggle moderator status": "Failed to toggle moderator status", + "Deactivate user?": "Deactivate user?", + "Deactivating this user will log them out and prevent them from logging back in. Additionally, they will leave all the rooms they are in. This action cannot be reversed. Are you sure you want to deactivate this user?": "Deactivating this user will log them out and prevent them from logging back in. Additionally, they will leave all the rooms they are in. This action cannot be reversed. Are you sure you want to deactivate this user?", + "Deactivate user": "Deactivate user", + "Failed to deactivate user": "Failed to deactivate user", + "Failed to change power level": "Failed to change power level", + "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.", + "Are you sure?": "Are you sure?", + "No devices with registered encryption keys": "No devices with registered encryption keys", + "Jump to read receipt": "Jump to read receipt", + "Mention": "Mention", + "Invite": "Invite", + "Share Link to User": "Share Link to User", + "User Options": "User Options", + "Direct chats": "Direct chats", + "Remove recent messages": "Remove recent messages", + "Unmute": "Unmute", + "Mute": "Mute", + "Revoke Moderator": "Revoke Moderator", + "Make Moderator": "Make Moderator", + "Admin Tools": "Admin Tools", + "and %(count)s others...|other": "and %(count)s others...", + "and %(count)s others...|one": "and one other...", + "Invite to this room": "Invite to this room", + "Invited": "Invited", + "Filter room members": "Filter room members", + "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (power %(powerLevelNumber)s)", + "Voice call": "Voice call", + "Video call": "Video call", + "Hangup": "Hangup", + "Upload file": "Upload file", + "Send an encrypted reply…": "Send an encrypted reply…", + "Send a reply (unencrypted)…": "Send a reply (unencrypted)…", + "Send an encrypted message…": "Send an encrypted message…", + "Send a message (unencrypted)…": "Send a message (unencrypted)…", + "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", + "Bold": "Bold", + "Italics": "Italics", + "Strikethrough": "Strikethrough", + "Code block": "Code block", + "Quote": "Quote", + "No pinned messages.": "No pinned messages.", + "Loading...": "Loading...", + "Pinned Messages": "Pinned Messages", + "Unpin Message": "Unpin Message", + "Jump to message": "Jump to message", + "%(duration)ss": "%(duration)ss", + "%(duration)sm": "%(duration)sm", + "%(duration)sh": "%(duration)sh", + "%(duration)sd": "%(duration)sd", + "Online for %(duration)s": "Online for %(duration)s", + "Idle for %(duration)s": "Idle for %(duration)s", + "Offline for %(duration)s": "Offline for %(duration)s", + "Unknown for %(duration)s": "Unknown for %(duration)s", + "Online": "Online", + "Idle": "Idle", + "Offline": "Offline", + "Unknown": "Unknown", + "Seen by %(userName)s at %(dateTime)s": "Seen by %(userName)s at %(dateTime)s", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Seen by %(displayName)s (%(userName)s) at %(dateTime)s", + "Replying": "Replying", + "Direct Chat": "Direct Chat", + "Room %(name)s": "Room %(name)s", + "Recent rooms": "Recent rooms", + "No rooms to show": "No rooms to show", + "Unnamed room": "Unnamed room", + "World readable": "World readable", + "Guests can join": "Guests can join", + "(~%(count)s results)|other": "(~%(count)s results)", + "(~%(count)s results)|one": "(~%(count)s result)", + "Join Room": "Join Room", + "Settings": "Settings", + "Forget room": "Forget room", + "Search": "Search", + "Share room": "Share room", + "Community Invites": "Community Invites", + "Invites": "Invites", + "Favourites": "Favourites", + "People": "People", + "Start chat": "Start chat", + "Rooms": "Rooms", + "Low priority": "Low priority", + "Historical": "Historical", + "System Alerts": "System Alerts", + "This room": "This room", + "Joining room …": "Joining room …", + "Loading …": "Loading …", + "Rejecting invite …": "Rejecting invite …", + "Join the conversation with an account": "Join the conversation with an account", + "Sign Up": "Sign Up", + "Sign In": "Sign In", + "Loading room preview": "Loading room preview", + "You were kicked from %(roomName)s by %(memberName)s": "You were kicked from %(roomName)s by %(memberName)s", + "Reason: %(reason)s": "Reason: %(reason)s", + "Forget this room": "Forget this room", + "Re-join": "Re-join", + "You were banned from %(roomName)s by %(memberName)s": "You were banned from %(roomName)s by %(memberName)s", + "Something went wrong with your invite to %(roomName)s": "Something went wrong with your invite to %(roomName)s", + "An error (%(errcode)s) was returned while trying to validate your invite. You could try to pass this information on to a room admin.": "An error (%(errcode)s) was returned while trying to validate your invite. You could try to pass this information on to a room admin.", + "unknown error code": "unknown error code", + "You can only join it with a working invite.": "You can only join it with a working invite.", + "Try to join anyway": "Try to join anyway", + "You can still join it because this is a public room.": "You can still join it because this is a public room.", + "Join the discussion": "Join the discussion", + "This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "This invite to %(roomName)s was sent to %(email)s which is not associated with your account", + "Link this email with your account in Settings to receive invites directly in Riot.": "Link this email with your account in Settings to receive invites directly in Riot.", + "This invite to %(roomName)s was sent to %(email)s": "This invite to %(roomName)s was sent to %(email)s", + "Use an identity server in Settings to receive invites directly in Riot.": "Use an identity server in Settings to receive invites directly in Riot.", + "Share this email in Settings to receive invites directly in Riot.": "Share this email in Settings to receive invites directly in Riot.", + "Do you want to chat with %(user)s?": "Do you want to chat with %(user)s?", + " wants to chat": " wants to chat", + "Start chatting": "Start chatting", + "Do you want to join %(roomName)s?": "Do you want to join %(roomName)s?", + " invited you": " invited you", + "Reject": "Reject", + "You're previewing %(roomName)s. Want to join it?": "You're previewing %(roomName)s. Want to join it?", + "%(roomName)s can't be previewed. Do you want to join it?": "%(roomName)s can't be previewed. Do you want to join it?", + "%(roomName)s does not exist.": "%(roomName)s does not exist.", + "This room doesn't exist. Are you sure you're at the right place?": "This room doesn't exist. Are you sure you're at the right place?", + "%(roomName)s is not accessible at this time.": "%(roomName)s is not accessible at this time.", + "Try again later, or ask a room admin to check if you have access.": "Try again later, or ask a room admin to check if you have access.", + "%(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 was returned while trying to access the room. If you think you're seeing this message in error, please submit a bug report.", + "Never lose encrypted messages": "Never lose encrypted messages", + "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.", + "Securely back up your keys to avoid losing them. Learn more.": "Securely back up your keys to avoid losing them. Learn more.", + "Not now": "Not now", + "Don't ask me again": "Don't ask me again", + "Options": "Options", + "%(count)s unread messages including mentions.|other": "%(count)s unread messages including mentions.", + "%(count)s unread messages including mentions.|one": "1 unread mention.", + "%(count)s unread messages.|other": "%(count)s unread messages.", + "%(count)s unread messages.|one": "1 unread message.", + "Unread mentions.": "Unread mentions.", + "Unread messages.": "Unread messages.", + "Add a topic": "Add a topic", + "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.", + "This room has already been upgraded.": "This room has already been upgraded.", + "This room is running room version , which this homeserver has marked as unstable.": "This room is running room version , which this homeserver has marked as unstable.", + "Only room administrators will see this warning": "Only room administrators will see this warning", + "This Room": "This Room", + "All Rooms": "All Rooms", + "Search…": "Search…", + "Server error": "Server error", + "Command error": "Command error", + "Server unavailable, overloaded, or something else went wrong.": "Server unavailable, overloaded, or something else went wrong.", + "Failed to connect to integration manager": "Failed to connect to integration manager", + "You don't currently have any stickerpacks enabled": "You don't currently have any stickerpacks enabled", + "Add some now": "Add some now", + "Stickerpack": "Stickerpack", + "Hide Stickers": "Hide Stickers", + "Show Stickers": "Show Stickers", + "Failed to revoke invite": "Failed to revoke invite", + "Could not revoke the invite. The server may be experiencing a temporary problem or you do not have sufficient permissions to revoke the invite.": "Could not revoke the invite. The server may be experiencing a temporary problem or you do not have sufficient permissions to revoke the invite.", + "Revoke invite": "Revoke invite", + "Invited by %(sender)s": "Invited by %(sender)s", + "Jump to first unread message.": "Jump to first unread message.", + "Error updating main address": "Error updating main address", + "There was an error updating the room's main address. It may not be allowed by the server or a temporary failure occurred.": "There was an error updating the room's main address. It may not be allowed by the server or a temporary failure occurred.", + "Error creating alias": "Error creating alias", + "There was an error creating that alias. It may not be allowed by the server or a temporary failure occurred.": "There was an error creating that alias. It may not be allowed by the server or a temporary failure occurred.", + "Error removing alias": "Error removing alias", + "There was an error removing that alias. It may no longer exist or a temporary error occurred.": "There was an error removing that alias. It may no longer exist or a temporary error occurred.", + "Main address": "Main address", + "not specified": "not specified", + "Remote addresses for this room:": "Remote addresses for this room:", + "Local addresses for this room:": "Local addresses for this room:", + "This room has no local addresses": "This room has no local addresses", + "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", + "Error updating flair": "Error updating flair", + "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.", + "Invalid community ID": "Invalid community ID", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", + "Showing flair for these communities:": "Showing flair for these communities:", + "This room is not showing flair for any communities": "This room is not showing flair for any communities", + "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", + "Room Name": "Room Name", + "Room Topic": "Room Topic", + "Room avatar": "Room avatar", + "You have enabled URL previews by default.": "You have enabled URL previews by default.", + "You have disabled URL previews by default.": "You have disabled URL previews by default.", + "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", + "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", + "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 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.", + "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.": "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.", + "Verify User": "Verify User", + "For extra security, verify this user by checking a one-time code on both of your devices.": "For extra security, verify this user by checking a one-time code on both of your devices.", + "For maximum security, do this in person.": "For maximum security, do this in person.", + "Start Verification": "Start Verification", + "Members": "Members", + "Files": "Files", + "Trusted": "Trusted", + "Not trusted": "Not trusted", + "Hide verified sessions": "Hide verified sessions", + "%(count)s verified sessions|other": "%(count)s verified sessions", + "%(count)s verified sessions|one": "1 verified session", + "Direct message": "Direct message", + "Remove from community": "Remove from community", + "Disinvite this user from community?": "Disinvite this user from community?", + "Remove this user from community?": "Remove this user from community?", + "Failed to withdraw invitation": "Failed to withdraw invitation", + "Failed to remove user from community": "Failed to remove user from community", + "%(role)s in %(roomName)s": "%(role)s in %(roomName)s", + "This client does not support end-to-end encryption.": "This client does not support end-to-end encryption.", + "Messages in this room are not end-to-end encrypted.": "Messages in this room are not end-to-end encrypted.", + "Messages in this room are end-to-end encrypted.": "Messages in this room are end-to-end encrypted.", + "Security": "Security", + "Sunday": "Sunday", + "Monday": "Monday", + "Tuesday": "Tuesday", + "Wednesday": "Wednesday", + "Thursday": "Thursday", + "Friday": "Friday", + "Saturday": "Saturday", + "Today": "Today", + "Yesterday": "Yesterday", + "View Source": "View Source", + "Error decrypting audio": "Error decrypting audio", + "React": "React", + "Reply": "Reply", + "Edit": "Edit", + "Message Actions": "Message Actions", + "Attachment": "Attachment", + "Error decrypting attachment": "Error decrypting attachment", + "Decrypt %(text)s": "Decrypt %(text)s", + "Download %(text)s": "Download %(text)s", + "Invalid file%(extra)s": "Invalid file%(extra)s", + "Error decrypting image": "Error decrypting image", + "Show image": "Show image", + "You have ignored this user, so their message is hidden. Show anyways.": "You have ignored this user, so their message is hidden. Show anyways.", + "You verified %(name)s": "You verified %(name)s", + "You cancelled verifying %(name)s": "You cancelled verifying %(name)s", + "%(name)s cancelled verifying": "%(name)s cancelled verifying", + "You accepted": "You accepted", + "%(name)s accepted": "%(name)s accepted", + "You cancelled": "You cancelled", + "%(name)s cancelled": "%(name)s cancelled", + "%(name)s wants to verify": "%(name)s wants to verify", + "You sent a verification request": "You sent a verification request", + "Error decrypting video": "Error decrypting video", + "Show all": "Show all", + "Reactions": "Reactions", + " reacted with %(content)s": " reacted with %(content)s", + "reacted with %(shortName)s": "reacted with %(shortName)s", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s changed the avatar for %(roomName)s", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removed the room avatar.", + "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s changed the room avatar to ", + "This room is a continuation of another conversation.": "This room is a continuation of another conversation.", + "Click here to see older messages.": "Click here to see older messages.", + "Copied!": "Copied!", + "Failed to copy": "Failed to copy", + "Add an Integration": "Add an Integration", + "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?": "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?", + "Edited at %(date)s. Click to view edits.": "Edited at %(date)s. Click to view edits.", + "edited": "edited", + "Removed or unknown message type": "Removed or unknown message type", + "Message removed by %(userId)s": "Message removed by %(userId)s", + "Message removed": "Message removed", + "Failed to load group members": "Failed to load group members", + "Filter community members": "Filter community members", + "Invite to this community": "Invite to this community", + "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Are you sure you want to remove '%(roomName)s' from %(groupId)s?", + "Removing a room from the community will also remove it from the community page.": "Removing a room from the community will also remove it from the community page.", + "Failed to remove room from community": "Failed to remove room from community", + "Failed to remove '%(roomName)s' from %(groupId)s": "Failed to remove '%(roomName)s' from %(groupId)s", + "Something went wrong!": "Something went wrong!", + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "The visibility of '%(roomName)s' in %(groupId)s could not be updated.", + "Visibility in Room List": "Visibility in Room List", + "Visible to everyone": "Visible to everyone", + "Only visible to community members": "Only visible to community members", + "Add rooms to this community": "Add rooms to this community", + "Filter community rooms": "Filter community rooms", + "Something went wrong when trying to get your communities.": "Something went wrong when trying to get your communities.", + "Display your community flair in rooms configured to show it.": "Display your community flair in rooms configured to show it.", + "You're not currently a member of any communities.": "You're not currently a member of any communities.", + "Please help improve Riot.im by sending anonymous usage data. This will use a cookie (please see our Cookie Policy).": "Please help improve Riot.im by sending anonymous usage data. This will use a cookie (please see our Cookie Policy).", + "Please help improve Riot.im by sending anonymous usage data. This will use a cookie.": "Please help improve Riot.im by sending anonymous usage data. This will use a cookie.", + "Yes, I want to help!": "Yes, I want to help!", + "You are not receiving desktop notifications": "You are not receiving desktop notifications", + "Enable them now": "Enable them now", + "What's New": "What's New", + "Update": "Update", + "What's new?": "What's new?", + "A new version of Riot is available.": "A new version of Riot is available.", + "To return to your account in future you need to set a password": "To return to your account in future you need to set a password", + "Set Password": "Set Password", + "Please contact your service administrator to get this limit increased.": "Please contact your service administrator to get this limit increased.", + "This homeserver has hit its Monthly Active User limit so some users will not be able to log in.": "This homeserver has hit its Monthly Active User limit so some users will not be able to log in.", + "This homeserver has exceeded one of its resource limits so some users will not be able to log in.": "This homeserver has exceeded one of its resource limits so some users will not be able to log in.", + "Error encountered (%(errorDetail)s).": "Error encountered (%(errorDetail)s).", + "Checking for an update...": "Checking for an update...", + "No update available.": "No update available.", + "Downloading update...": "Downloading update...", + "Frequently Used": "Frequently Used", + "Smileys & People": "Smileys & People", + "Animals & Nature": "Animals & Nature", + "Food & Drink": "Food & Drink", + "Activities": "Activities", + "Travel & Places": "Travel & Places", + "Objects": "Objects", + "Symbols": "Symbols", + "Flags": "Flags", + "Quick Reactions": "Quick Reactions", + "Cancel search": "Cancel search", + "Unknown Address": "Unknown Address", + "Any of the following data may be shared:": "Any of the following data may be shared:", + "Your display name": "Your display name", + "Your avatar URL": "Your avatar URL", + "Your user ID": "Your user ID", + "Your theme": "Your theme", + "Riot URL": "Riot URL", + "Room ID": "Room ID", + "Widget ID": "Widget ID", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Using this widget may share data with %(widgetDomain)s & your Integration Manager.", + "Using this widget may share data with %(widgetDomain)s.": "Using this widget may share data with %(widgetDomain)s.", + "Widgets do not use message encryption.": "Widgets do not use message encryption.", + "Widget added by": "Widget added by", + "This widget may use cookies.": "This widget may use cookies.", + "Delete Widget": "Delete Widget", + "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?", + "Delete widget": "Delete widget", + "Failed to remove widget": "Failed to remove widget", + "An error ocurred whilst trying to remove the widget from the room": "An error ocurred whilst trying to remove the widget from the room", + "Minimize apps": "Minimize apps", + "Maximize apps": "Maximize apps", + "Popout widget": "Popout widget", + "More options": "More options", + "Create new room": "Create new room", + "Unblacklist": "Unblacklist", + "Blacklist": "Blacklist", + "Unverify": "Unverify", + "Verify...": "Verify...", + "Join": "Join", + "No results": "No results", + "Yes": "Yes", + "No": "No", + "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", + "Communities": "Communities", + "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", + "Language Dropdown": "Language Dropdown", + "Manage Integrations": "Manage Integrations", + "%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)sjoined %(count)s times", + "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)sjoined", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)sjoined %(count)s times", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)sjoined", + "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)sleft %(count)s times", + "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)sleft", + "%(oneUser)sleft %(count)s times|other": "%(oneUser)sleft %(count)s times", + "%(oneUser)sleft %(count)s times|one": "%(oneUser)sleft", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)sjoined and left %(count)s times", + "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)sjoined and left", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)sjoined and left %(count)s times", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)sjoined and left", + "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)sleft and rejoined %(count)s times", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)sleft and rejoined", + "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)sleft and rejoined %(count)s times", + "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)sleft and rejoined", + "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)srejected their invitations %(count)s times", + "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)srejected their invitations", + "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)srejected their invitation %(count)s times", + "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)srejected their invitation", + "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)shad their invitations withdrawn %(count)s times", + "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)shad their invitations withdrawn", + "%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)shad their invitation withdrawn %(count)s times", + "%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)shad their invitation withdrawn", + "were invited %(count)s times|other": "were invited %(count)s times", + "were invited %(count)s times|one": "were invited", + "was invited %(count)s times|other": "was invited %(count)s times", + "was invited %(count)s times|one": "was invited", + "were banned %(count)s times|other": "were banned %(count)s times", + "were banned %(count)s times|one": "were banned", + "was banned %(count)s times|other": "was banned %(count)s times", + "was banned %(count)s times|one": "was banned", + "were unbanned %(count)s times|other": "were unbanned %(count)s times", + "were unbanned %(count)s times|one": "were unbanned", + "was unbanned %(count)s times|other": "was unbanned %(count)s times", + "was unbanned %(count)s times|one": "was unbanned", + "were kicked %(count)s times|other": "were kicked %(count)s times", + "were kicked %(count)s times|one": "were kicked", + "was kicked %(count)s times|other": "was kicked %(count)s times", + "was kicked %(count)s times|one": "was kicked", + "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)schanged their name %(count)s times", + "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)schanged their name", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)schanged their name %(count)s times", + "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)schanged their name", + "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)schanged their avatar %(count)s times", + "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)schanged their avatar", + "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)schanged their avatar %(count)s times", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)schanged their avatar", + "%(severalUsers)smade no changes %(count)s times|other": "%(severalUsers)smade no changes %(count)s times", + "%(severalUsers)smade no changes %(count)s times|one": "%(severalUsers)smade no changes", + "%(oneUser)smade no changes %(count)s times|other": "%(oneUser)smade no changes %(count)s times", + "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)smade no changes", + "Power level": "Power level", + "Custom level": "Custom level", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.", + "In reply to ": "In reply to ", + "Room alias": "Room alias", + "e.g. my-room": "e.g. my-room", + "Some characters not allowed": "Some characters not allowed", + "Please provide a room alias": "Please provide a room alias", + "This alias is available to use": "This alias is available to use", + "This alias is already in use": "This alias is already in use", + "Room directory": "Room directory", + "And %(count)s more...|other": "And %(count)s more...", + "ex. @bob:example.com": "ex. @bob:example.com", + "Add User": "Add User", + "Matrix ID": "Matrix ID", + "Matrix Room ID": "Matrix Room ID", + "email address": "email address", + "That doesn't look like a valid email address": "That doesn't look like a valid email address", + "You have entered an invalid address.": "You have entered an invalid address.", + "Try using one of the following valid address types: %(validTypesList)s.": "Try using one of the following valid address types: %(validTypesList)s.", + "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.", + "Use an identity server to invite by email. Manage in Settings.": "Use an identity server to invite by email. Manage in Settings.", + "The following users may not exist": "The following users may not exist", + "Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?": "Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?", + "Invite anyway and never warn me again": "Invite anyway and never warn me again", + "Invite anyway": "Invite anyway", + "Close dialog": "Close dialog", + "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.", + "Preparing to send logs": "Preparing to send logs", + "Logs sent": "Logs sent", + "Thank you!": "Thank you!", + "Failed to send logs: ": "Failed to send logs: ", + "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.": "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.", + "Before submitting logs, you must create a GitHub issue to describe your problem.": "Before submitting logs, you must create a GitHub issue to describe your problem.", + "GitHub issue": "GitHub issue", + "Notes": "Notes", + "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.": "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.", + "Send logs": "Send logs", + "Unable to load commit detail: %(msg)s": "Unable to load commit detail: %(msg)s", + "Unavailable": "Unavailable", + "Changelog": "Changelog", + "You cannot delete this message. (%(code)s)": "You cannot delete this message. (%(code)s)", + "Removing…": "Removing…", + "Confirm Removal": "Confirm Removal", + "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.", + "Clear all data on this device?": "Clear all data on this device?", + "Clearing all data from this device is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Clearing all data from this device is permanent. Encrypted messages will be lost unless their keys have been backed up.", + "Clear all data": "Clear all data", + "Community IDs cannot be empty.": "Community IDs cannot be empty.", + "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Community IDs may only contain characters a-z, 0-9, or '=_-./'", + "Something went wrong whilst creating your community": "Something went wrong whilst creating your community", + "Create Community": "Create Community", + "Community Name": "Community Name", + "Example": "Example", + "Community ID": "Community ID", + "example": "example", + "Create": "Create", + "Please enter a name for the room": "Please enter a name for the room", + "Set a room alias to easily share your room with other people.": "Set a room alias to easily share your room with other people.", + "This room is private, and can only be joined by invitation.": "This room is private, and can only be joined by invitation.", + "Create a public room": "Create a public room", + "Create a private room": "Create a private room", + "Name": "Name", + "Topic (optional)": "Topic (optional)", + "Make this room public": "Make this room public", + "Hide advanced": "Hide advanced", + "Show advanced": "Show advanced", + "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)", + "Create Room": "Create Room", + "Sign out": "Sign out", + "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 Riot to do this": "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 Riot to do this", + "You've previously used a newer version of Riot on %(host)s. To use this version again with end to end encryption, you will need to sign out and back in again. ": "You've previously used a newer version of Riot on %(host)s. To use this version again with end to end encryption, you will need to sign out and back in again. ", + "Incompatible Database": "Incompatible Database", + "Continue With Encryption Disabled": "Continue With Encryption Disabled", + "Unknown error": "Unknown error", + "Incorrect password": "Incorrect password", + "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.": "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.", + "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.": "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.", + "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.": "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.", + "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)": "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)", + "To continue, please enter your password:": "To continue, please enter your password:", + "Verify device": "Verify device", + "Use Legacy Verification (for older clients)": "Use Legacy Verification (for older clients)", + "Verify by comparing a short text string.": "Verify by comparing a short text string.", + "Begin Verifying": "Begin Verifying", + "Waiting for partner to accept...": "Waiting for partner to accept...", + "Nothing appearing? Not all clients support interactive verification yet. .": "Nothing appearing? Not all clients support interactive verification yet. .", + "Waiting for %(userId)s to confirm...": "Waiting for %(userId)s to confirm...", + "To verify that this device can be trusted, please check that the key you see in User Settings on that device matches the key below:": "To verify that this device can be trusted, please check that the key you see in User Settings on that device matches the key below:", + "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:", + "Use two-way text verification": "Use two-way text verification", + "Device name": "Device name", + "Device ID": "Device ID", + "Device key": "Device key", + "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.", + "I verify that the keys match": "I verify that the keys match", + "Back": "Back", + "Send Custom Event": "Send Custom Event", + "You must specify an event type!": "You must specify an event type!", + "Event sent!": "Event sent!", + "Failed to send custom event.": "Failed to send custom event.", + "Event Type": "Event Type", + "State Key": "State Key", + "Event Content": "Event Content", + "Send Account Data": "Send Account Data", + "Filter results": "Filter results", + "Explore Room State": "Explore Room State", + "Explore Account Data": "Explore Account Data", + "View Servers in Room": "View Servers in Room", + "Toolbox": "Toolbox", + "Developer Tools": "Developer Tools", + "An error has occurred.": "An error has occurred.", + "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.", + "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.", + "Waiting for partner to confirm...": "Waiting for partner to confirm...", + "Incoming Verification Request": "Incoming Verification Request", + "Integrations are disabled": "Integrations are disabled", + "Enable 'Manage Integrations' in Settings to do this.": "Enable 'Manage Integrations' in Settings to do this.", + "Integrations not allowed": "Integrations not allowed", + "Your Riot doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Your Riot doesn't allow you to use an Integration Manager to do this. Please contact an admin.", + "Failed to invite the following users to chat: %(csvUsers)s": "Failed to invite the following users to chat: %(csvUsers)s", + "We couldn't create your DM. Please check the users you want to invite and try again.": "We couldn't create your DM. Please check the users you want to invite and try again.", + "Something went wrong trying to invite the users.": "Something went wrong trying to invite the users.", + "We couldn't invite those users. Please check the users you want to invite and try again.": "We couldn't invite those users. Please check the users you want to invite and try again.", + "Failed to find the following users": "Failed to find the following users", + "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s", + "Recent Conversations": "Recent Conversations", + "Suggestions": "Suggestions", + "Recently Direct Messaged": "Recently Direct Messaged", + "Show more": "Show more", + "Direct Messages": "Direct Messages", + "If you can't find someone, ask them for their username, or share your username (%(userId)s) or profile link.": "If you can't find someone, ask them for their username, or share your username (%(userId)s) or profile link.", + "Go": "Go", + "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.": "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.", + "You added a new device '%(displayName)s', which is requesting encryption keys.": "You added a new device '%(displayName)s', which is requesting encryption keys.", + "Your unverified device '%(displayName)s' is requesting encryption keys.": "Your unverified device '%(displayName)s' is requesting encryption keys.", + "Start verification": "Start verification", + "Share without verifying": "Share without verifying", + "Ignore request": "Ignore request", + "Loading device info...": "Loading device info...", + "Encryption key request": "Encryption key request", + "You've previously used Riot 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, Riot needs to resync your account.": "You've previously used Riot 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, Riot needs to resync your account.", + "If the other version of Riot is still open in another tab, please close it as using Riot on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "If the other version of Riot is still open in another tab, please close it as using Riot on the same host with both lazy loading enabled and disabled simultaneously will cause issues.", + "Incompatible local cache": "Incompatible local cache", + "Clear cache and resync": "Clear cache and resync", + "Riot now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!": "Riot now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!", + "Updating Riot": "Updating Riot", + "I don't want my encrypted messages": "I don't want my encrypted messages", + "Manually export keys": "Manually export keys", + "You'll lose access to your encrypted messages": "You'll lose access to your encrypted messages", + "Are you sure you want to sign out?": "Are you sure you want to sign out?", + "Your homeserver doesn't seem to support this feature.": "Your homeserver doesn't seem to support this feature.", + "Message edits": "Message edits", + "If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.": "If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.", + "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.", + "Report bugs & give feedback": "Report bugs & give feedback", + "Please fill why you're reporting.": "Please fill why you're reporting.", + "Report Content to Your Homeserver Administrator": "Report Content to Your Homeserver Administrator", + "Reporting this message will send its unique 'event ID' to the administrator of your homeserver. If messages in this room are encrypted, your homeserver administrator will not be able to read the message text or view any files or images.": "Reporting this message will send its unique 'event ID' to the administrator of your homeserver. If messages in this room are encrypted, your homeserver administrator will not be able to read the message text or view any files or images.", + "Send report": "Send report", + "Room Settings - %(roomName)s": "Room Settings - %(roomName)s", + "Failed to upgrade room": "Failed to upgrade room", + "The room upgrade could not be completed": "The room upgrade could not be completed", + "Upgrade this room to version %(version)s": "Upgrade this room to version %(version)s", + "Upgrade Room Version": "Upgrade Room Version", + "Upgrading this room requires closing down the current instance of the room and creating a new room in its place. To give room members the best possible experience, we will:": "Upgrading this room requires closing down the current instance of the room and creating a new room in its place. To give room members the best possible experience, we will:", + "Create a new room with the same name, description and avatar": "Create a new room with the same name, description and avatar", + "Update any local room aliases to point to the new room": "Update any local room aliases to point to the new room", + "Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Stop users from speaking in the old version of the room, and post a message advising users to move to the new room", + "Put a link back to the old room at the start of the new room so people can see old messages": "Put a link back to the old room at the start of the new room so people can see old messages", + "Automatically invite users": "Automatically invite users", + "Upgrade private room": "Upgrade private room", + "Upgrade public room": "Upgrade public room", + "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.": "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.", + "This usually only affects how the room is processed on the server. If you're having problems with your Riot, please report a bug.": "This usually only affects how the room is processed on the server. If you're having problems with your Riot, please report a bug.", + "You'll upgrade this room from to .": "You'll upgrade this room from to .", + "Upgrade": "Upgrade", + "Sign out and remove encryption keys?": "Sign out and remove encryption keys?", + "Clear Storage and Sign Out": "Clear Storage and Sign Out", + "Send Logs": "Send Logs", + "Refresh": "Refresh", + "Unable to restore session": "Unable to restore session", + "We encountered an error trying to restore your previous session.": "We encountered an error trying to restore your previous session.", + "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.", + "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.", + "Verification Pending": "Verification Pending", + "Please check your email and click on the link it contains. Once this is done, click continue.": "Please check your email and click on the link it contains. Once this is done, click continue.", + "Email address": "Email address", + "This will allow you to reset your password and receive notifications.": "This will allow you to reset your password and receive notifications.", + "Skip": "Skip", + "A username can only contain lower case letters, numbers and '=_-./'": "A username can only contain lower case letters, numbers and '=_-./'", + "Username not available": "Username not available", + "Username invalid: %(errMessage)s": "Username invalid: %(errMessage)s", + "An error occurred: %(error_string)s": "An error occurred: %(error_string)s", + "Checking...": "Checking...", + "Username available": "Username available", + "To get started, please pick a username!": "To get started, please pick a username!", + "This will be your account name on the homeserver, or you can pick a different server.": "This will be your account name on the homeserver, or you can pick a different server.", + "If you already have a Matrix account you can log in instead.": "If you already have a Matrix account you can log in instead.", + "You have successfully set a password!": "You have successfully set a password!", + "You have successfully set a password and an email address!": "You have successfully set a password and an email address!", + "You can now return to your account after signing out, and sign in on other devices.": "You can now return to your account after signing out, and sign in on other devices.", + "Remember, you can always set an email address in user settings if you change your mind.": "Remember, you can always set an email address in user settings if you change your mind.", + "(HTTP status %(httpStatus)s)": "(HTTP status %(httpStatus)s)", + "Please set a password!": "Please set a password!", + "This will allow you to return to your account after signing out, and sign in on other devices.": "This will allow you to return to your account after signing out, and sign in on other devices.", + "Share Room": "Share Room", + "Link to most recent message": "Link to most recent message", + "Share User": "Share User", + "Share Community": "Share Community", + "Share Room Message": "Share Room Message", + "Link to selected message": "Link to selected message", + "COPY": "COPY", + "Command Help": "Command Help", + "To help us prevent this in future, please send us logs.": "To help us prevent this in future, please send us logs.", + "Missing session data": "Missing session data", + "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.", + "Your browser likely removed this data when running low on disk space.": "Your browser likely removed this data when running low on disk space.", + "Integration Manager": "Integration Manager", + "Find others by phone or email": "Find others by phone or email", + "Be found by phone or email": "Be found by phone or email", + "Use bots, bridges, widgets and sticker packs": "Use bots, bridges, widgets and sticker packs", + "Terms of Service": "Terms of Service", + "To continue you need to accept the terms of this service.": "To continue you need to accept the terms of this service.", + "Service": "Service", + "Summary": "Summary", + "Document": "Document", + "Next": "Next", + "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.", + "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.", + "Room contains unknown devices": "Room contains unknown devices", + "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contains devices that you haven't seen before.", + "Unknown devices": "Unknown devices", + "Upload files (%(current)s of %(total)s)": "Upload files (%(current)s of %(total)s)", + "Upload files": "Upload files", + "Upload all": "Upload all", + "This file is too large to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.": "This file is too large to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.", + "These files are too large to upload. The file size limit is %(limit)s.": "These files are too large to upload. The file size limit is %(limit)s.", + "Some files are too large to be uploaded. The file size limit is %(limit)s.": "Some files are too large to be uploaded. The file size limit is %(limit)s.", + "Upload %(count)s other files|other": "Upload %(count)s other files", + "Upload %(count)s other files|one": "Upload %(count)s other file", + "Cancel All": "Cancel All", + "Upload Error": "Upload Error", + "A widget would like to verify your identity": "A widget would like to verify your identity", + "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.": "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.", + "Remember my selection for this widget": "Remember my selection for this widget", + "Allow": "Allow", + "Deny": "Deny", + "Enter secret storage passphrase": "Enter secret storage passphrase", + "Unable to access secret storage. Please verify that you entered the correct passphrase.": "Unable to access secret storage. Please verify that you entered the correct passphrase.", + "Warning: You should only access secret storage from a trusted computer.": "Warning: You should only access secret storage from a trusted computer.", + "Access your secure message history and your cross-signing identity for verifying other devices by entering your passphrase.": "Access your secure message history and your cross-signing identity for verifying other devices by entering your passphrase.", + "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.": "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.", + "Enter secret storage recovery key": "Enter secret storage recovery key", + "This looks like a valid recovery key!": "This looks like a valid recovery key!", + "Unable to access secret storage. Please verify that you entered the correct recovery key.": "Unable to access secret storage. Please verify that you entered the correct recovery key.", + "Not a valid recovery key": "Not a valid recovery key", + "Access your secure message history and your cross-signing identity for verifying other devices by entering your recovery key.": "Access your secure message history and your cross-signing identity for verifying other devices by entering your recovery key.", + "If you've forgotten your recovery key you can .": "If you've forgotten your recovery key you can .", + "Unable to load backup status": "Unable to load backup status", + "Recovery Key Mismatch": "Recovery Key Mismatch", + "Backup could not be decrypted with this key: please verify that you entered the correct recovery key.": "Backup could not be decrypted with this key: please verify that you entered the correct recovery key.", + "Incorrect Recovery Passphrase": "Incorrect Recovery Passphrase", + "Backup could not be decrypted with this passphrase: please verify that you entered the correct recovery passphrase.": "Backup could not be decrypted with this passphrase: please verify that you entered the correct recovery passphrase.", + "Unable to restore backup": "Unable to restore backup", + "No backup found!": "No backup found!", + "Backup Restored": "Backup Restored", + "Failed to decrypt %(failedCount)s sessions!": "Failed to decrypt %(failedCount)s sessions!", + "Restored %(sessionCount)s session keys": "Restored %(sessionCount)s session keys", + "Enter Recovery Passphrase": "Enter Recovery Passphrase", + "Warning: you should only set up key backup from a trusted computer.": "Warning: you should only set up key backup from a trusted computer.", + "Access your secure message history and set up secure messaging by entering your recovery passphrase.": "Access your secure message history and set up secure messaging by entering your recovery passphrase.", + "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options": "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options", + "Enter Recovery Key": "Enter Recovery Key", + "Warning: You should only set up key backup from a trusted computer.": "Warning: You should only set up key backup from a trusted computer.", + "Access your secure message history and set up secure messaging by entering your recovery key.": "Access your secure message history and set up secure messaging by entering your recovery key.", + "If you've forgotten your recovery key you can ": "If you've forgotten your recovery key you can ", + "Private Chat": "Private Chat", + "Public Chat": "Public Chat", + "Custom": "Custom", + "Alias (optional)": "Alias (optional)", + "Reject invitation": "Reject invitation", + "Are you sure you want to reject the invitation?": "Are you sure you want to reject the invitation?", + "Unable to reject invite": "Unable to reject invite", + "Resend": "Resend", + "Resend edit": "Resend edit", + "Resend %(unsentCount)s reaction(s)": "Resend %(unsentCount)s reaction(s)", + "Resend removal": "Resend removal", + "Cancel Sending": "Cancel Sending", + "Forward Message": "Forward Message", + "Pin Message": "Pin Message", + "View Decrypted Source": "View Decrypted Source", + "Unhide Preview": "Unhide Preview", + "Share Permalink": "Share Permalink", + "Share Message": "Share Message", + "Source URL": "Source URL", + "Collapse Reply Thread": "Collapse Reply Thread", + "End-to-end encryption information": "End-to-end encryption information", + "Report Content": "Report Content", + "Failed to set Direct Message status of room": "Failed to set Direct Message status of room", + "Failed to forget room %(errCode)s": "Failed to forget room %(errCode)s", + "Notification settings": "Notification settings", + "All messages (noisy)": "All messages (noisy)", + "All messages": "All messages", + "Mentions only": "Mentions only", + "Leave": "Leave", + "Forget": "Forget", + "Favourite": "Favourite", + "Low Priority": "Low Priority", + "Clear status": "Clear status", + "Update status": "Update status", + "Set status": "Set status", + "Set a new status...": "Set a new status...", + "View Community": "View Community", + "Hide": "Hide", + "Home": "Home", + "Sign in": "Sign in", + "Help": "Help", + "Reload": "Reload", + "Take picture": "Take picture", + "Remove for everyone": "Remove for everyone", + "Remove for me": "Remove for me", + "User Status": "User Status", + "powered by Matrix": "powered by Matrix", + "This homeserver would like to make sure you are not a robot.": "This homeserver would like to make sure you are not a robot.", + "Country Dropdown": "Country Dropdown", + "Custom Server Options": "Custom Server Options", + "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use this app with an existing Matrix account on a different homeserver.": "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use this app with an existing Matrix account on a different homeserver.", + "To continue, please enter your password.": "To continue, please enter your password.", + "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.": "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.", + "Please review and accept all of the homeserver's policies": "Please review and accept all of the homeserver's policies", + "Please review and accept the policies of this homeserver:": "Please review and accept the policies of this homeserver:", + "An email has been sent to %(emailAddress)s": "An email has been sent to %(emailAddress)s", + "Please check your email to continue registration.": "Please check your email to continue registration.", + "Token incorrect": "Token incorrect", + "A text message has been sent to %(msisdn)s": "A text message has been sent to %(msisdn)s", + "Please enter the code it contains:": "Please enter the code it contains:", + "Code": "Code", + "Submit": "Submit", + "Start authentication": "Start authentication", + "Unable to validate homeserver/identity server": "Unable to validate homeserver/identity server", + "Your Modular server": "Your Modular server", + "Enter the location of your Modular homeserver. It may use your own domain name or be a subdomain of modular.im.": "Enter the location of your Modular homeserver. It may use your own domain name or be a subdomain of modular.im.", + "Server Name": "Server Name", + "The email field must not be blank.": "The email field must not be blank.", + "The username field must not be blank.": "The username field must not be blank.", + "The phone number field must not be blank.": "The phone number field must not be blank.", + "The password field must not be blank.": "The password field must not be blank.", + "Email": "Email", + "Username": "Username", + "Phone": "Phone", + "Not sure of your password? Set a new one": "Not sure of your password? Set a new one", + "Sign in with": "Sign in with", + "No identity server is configured so you cannot add an email address in order to reset your password in the future.": "No identity server is configured so you cannot add an email address in order to reset your password in the future.", + "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "If you don't specify an email address, you won't be able to reset your password. Are you sure?", + "Use an email address to recover your account": "Use an email address to recover your account", + "Enter email address (required on this homeserver)": "Enter email address (required on this homeserver)", + "Doesn't look like a valid email address": "Doesn't look like a valid email address", + "Enter password": "Enter password", + "Password is allowed, but unsafe": "Password is allowed, but unsafe", + "Nice, strong password!": "Nice, strong password!", + "Keep going...": "Keep going...", + "Passwords don't match": "Passwords don't match", + "Other users can invite you to rooms using your contact details": "Other users can invite you to rooms using your contact details", + "Enter phone number (required on this homeserver)": "Enter phone number (required on this homeserver)", + "Doesn't look like a valid phone number": "Doesn't look like a valid phone number", + "Use lowercase letters, numbers, dashes and underscores only": "Use lowercase letters, numbers, dashes and underscores only", + "Enter username": "Enter username", + "Email (optional)": "Email (optional)", + "Confirm": "Confirm", + "Phone (optional)": "Phone (optional)", + "Create your Matrix account on %(serverName)s": "Create your Matrix account on %(serverName)s", + "Create your Matrix account on ": "Create your Matrix account on ", + "Set an email for account recovery. Use email or phone to optionally be discoverable by existing contacts.": "Set an email for account recovery. Use email or phone to optionally be discoverable by existing contacts.", + "Set an email for account recovery. Use email to optionally be discoverable by existing contacts.": "Set an email for account recovery. Use email to optionally be discoverable by existing contacts.", + "Enter your custom homeserver URL What does this mean?": "Enter your custom homeserver URL What does this mean?", + "Homeserver URL": "Homeserver URL", + "Enter your custom identity server URL What does this mean?": "Enter your custom identity server URL What does this mean?", + "Identity Server URL": "Identity Server URL", + "Other servers": "Other servers", + "Free": "Free", + "Join millions for free on the largest public server": "Join millions for free on the largest public server", + "Premium": "Premium", + "Premium hosting for organisations Learn more": "Premium hosting for organisations Learn more", + "Find other public servers or use a custom server": "Find other public servers or use a custom server", + "Sign in to your Matrix account on %(serverName)s": "Sign in to your Matrix account on %(serverName)s", + "Sign in to your Matrix account on ": "Sign in to your Matrix account on ", + "Sorry, your browser is not able to run Riot.": "Sorry, your browser is not able to run Riot.", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.", + "Please install Chrome, Firefox, or Safari for the best experience.": "Please install Chrome, Firefox, or Safari for the best experience.", + "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!": "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!", + "I understand the risks and wish to continue": "I understand the risks and wish to continue", + "Couldn't load page": "Couldn't load page", + "You must register to use this functionality": "You must register to use this functionality", + "You must join the room to see its files": "You must join the room to see its files", + "There are no visible files in this room": "There are no visible files in this room", + "

      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 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", + "Add rooms to the community summary": "Add rooms to the community summary", + "Which rooms would you like to add to this summary?": "Which rooms would you like to add to this summary?", + "Add to summary": "Add to summary", + "Failed to add the following rooms to the summary of %(groupId)s:": "Failed to add the following rooms to the summary of %(groupId)s:", + "Add a Room": "Add a Room", + "Failed to remove the room from the summary of %(groupId)s": "Failed to remove the room from the summary of %(groupId)s", + "The room '%(roomName)s' could not be removed from the summary.": "The room '%(roomName)s' could not be removed from the summary.", + "Add users to the community summary": "Add users to the community summary", + "Who would you like to add to this summary?": "Who would you like to add to this summary?", + "Failed to add the following users to the summary of %(groupId)s:": "Failed to add the following users to the summary of %(groupId)s:", + "Add a User": "Add a User", + "Failed to remove a user from the summary of %(groupId)s": "Failed to remove a user from the summary of %(groupId)s", + "The user '%(displayName)s' could not be removed from the summary.": "The user '%(displayName)s' could not be removed from the summary.", + "Failed to upload image": "Failed to upload image", + "Failed to update community": "Failed to update community", + "Unable to accept invite": "Unable to accept invite", + "Unable to join community": "Unable to join community", + "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.", + "Leave Community": "Leave Community", + "Leave %(groupName)s?": "Leave %(groupName)s?", + "Unable to leave community": "Unable to leave community", + "Community Settings": "Community Settings", + "Want more than a community? Get your own server": "Want more than a community? Get your own server", + "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.", + "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.", + "Featured Rooms:": "Featured Rooms:", + "Featured Users:": "Featured Users:", + "%(inviter)s has invited you to join this community": "%(inviter)s has invited you to join this community", + "Join this community": "Join this community", + "Leave this community": "Leave this community", + "You are an administrator of this community": "You are an administrator of this community", + "You are a member of this community": "You are a member of this community", + "Who can join this community?": "Who can join this community?", + "Everyone": "Everyone", + "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!": "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!", + "Long Description (HTML)": "Long Description (HTML)", + "Upload avatar": "Upload avatar", + "Description": "Description", + "Community %(groupId)s not found": "Community %(groupId)s not found", + "This homeserver does not support communities": "This homeserver does not support communities", + "Failed to load %(groupId)s": "Failed to load %(groupId)s", + "Explore": "Explore", + "Filter": "Filter", + "Filter rooms…": "Filter rooms…", + "Failed to reject invitation": "Failed to reject invitation", + "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 room '%(roomName)s'?": "Are you sure you want to leave the room '%(roomName)s'?", + "Failed to leave room": "Failed to leave room", + "Can't leave Server Notices room": "Can't leave Server Notices room", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "This room is used for important messages from the Homeserver, so you cannot leave it.", + "Signed Out": "Signed Out", + "For security, this session has been signed out. Please sign in again.": "For security, this session has been signed out. Please sign in again.", + "Terms and Conditions": "Terms and Conditions", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.", + "Review terms and conditions": "Review terms and conditions", + "Old cryptography data detected": "Old cryptography data detected", + "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.", + "Verification Request": "Verification Request", + "Logout": "Logout", + "%(creator)s created and configured the room.": "%(creator)s created and configured the room.", + "Your Communities": "Your Communities", + "Did you know: you can use communities to filter your Riot.im experience!": "Did you know: you can use communities to filter your Riot.im experience!", + "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.", + "Error whilst fetching joined communities": "Error whilst fetching joined communities", + "Create a new community": "Create a new community", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.", + "You have no visible notifications": "You have no visible notifications", + "Riot failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.": "Riot failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.", + "Riot failed to get the public room list.": "Riot failed to get the public room list.", + "The homeserver may be unavailable or overloaded.": "The homeserver may be unavailable or overloaded.", + "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Delete the room alias %(alias)s and remove %(name)s from the directory?", + "Remove %(name)s from the directory?": "Remove %(name)s from the directory?", + "Remove from Directory": "Remove from Directory", + "remove %(name)s from the directory.": "remove %(name)s from the directory.", + "delete the alias.": "delete the alias.", + "The server may be unavailable or overloaded": "The server may be unavailable or overloaded", + "Unable to join network": "Unable to join network", + "Riot does not know how to join a room on this network": "Riot does not know how to join a room on this network", + "Room not found": "Room not found", + "Couldn't find a matching Matrix room": "Couldn't find a matching Matrix room", + "Fetching third party location failed": "Fetching third party location failed", + "Unable to look up room ID from server": "Unable to look up room ID from server", + "Preview": "Preview", + "View": "View", + "Find a room…": "Find a room…", + "Find a room… (e.g. %(exampleRoom)s)": "Find a room… (e.g. %(exampleRoom)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.", + "Explore rooms": "Explore rooms", + "Message not sent due to unknown devices being present": "Message not sent due to unknown devices being present", + "Show devices, send anyway or cancel.": "Show devices, send anyway or cancel.", + "You can't send any messages until you review and agree to our terms and conditions.": "You can't send any messages until you review and agree to our terms and conditions.", + "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.": "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.", + "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.": "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.", + "%(count)s of your messages have not been sent.|other": "Some of your messages have not been sent.", + "%(count)s of your messages have not been sent.|one": "Your message was not sent.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Resend all or cancel all now. You can also select individual messages to resend or cancel.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Resend message or cancel message now.", + "Connectivity to the server has been lost.": "Connectivity to the server has been lost.", + "Sent messages will be stored until your connection has returned.": "Sent messages will be stored until your connection has returned.", + "Active call": "Active call", + "There's no one else here! Would you like to invite others or stop warning about the empty room?": "There's no one else here! Would you like to invite others or stop warning about the empty room?", + "Jump to first unread room.": "Jump to first unread room.", + "Jump to first invite.": "Jump to first invite.", + "Add room": "Add room", + "You seem to be uploading files, are you sure you want to quit?": "You seem to be uploading files, are you sure you want to quit?", + "You seem to be in a call, are you sure you want to quit?": "You seem to be in a call, are you sure you want to quit?", + "Search failed": "Search failed", + "Server may be unavailable, overloaded, or search timed out :(": "Server may be unavailable, overloaded, or search timed out :(", + "No more results": "No more results", + "Unknown room %(roomId)s": "Unknown room %(roomId)s", + "Room": "Room", + "Failed to reject invite": "Failed to reject invite", + "You have %(count)s unread notifications in a prior version of this room.|other": "You have %(count)s unread notifications in a prior version of this room.", + "You have %(count)s unread notifications in a prior version of this room.|one": "You have %(count)s unread notification in a prior version of this room.", + "Fill screen": "Fill screen", + "Click to unmute video": "Click to unmute video", + "Click to mute video": "Click to mute video", + "Click to unmute audio": "Click to unmute audio", + "Click to mute audio": "Click to mute audio", + "Clear filter": "Clear filter", + "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.", + "Tried to load a specific point in this room's timeline, but was unable to find it.": "Tried to load a specific point in this room's timeline, but was unable to find it.", + "Failed to load timeline position": "Failed to load timeline position", + " (1/%(totalCount)s)": " (1/%(totalCount)s)", + "Guest": "Guest", + "Your profile": "Your profile", + "Uploading %(filename)s and %(count)s others|other": "Uploading %(filename)s and %(count)s others", + "Uploading %(filename)s and %(count)s others|zero": "Uploading %(filename)s", + "Uploading %(filename)s and %(count)s others|one": "Uploading %(filename)s and %(count)s other", + "Could not load user profile": "Could not load user profile", + "Complete security": "Complete security", + "Verify this session to grant it access to encrypted messages.": "Verify this session to grant it access to encrypted messages.", + "Start": "Start", + "Session verified": "Session verified", + "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.", + "Done": "Done", + "Without completing security on this device, it won’t have access to encrypted messages.": "Without completing security on this device, it won’t have access to encrypted messages.", + "Go Back": "Go Back", + "Failed to send email": "Failed to send email", + "The email address linked to your account must be entered.": "The email address linked to your account must be entered.", + "A new password must be entered.": "A new password must be entered.", + "New passwords must match each other.": "New passwords must match each other.", + "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.", + "Your Matrix account on %(serverName)s": "Your Matrix account on %(serverName)s", + "Your Matrix account on ": "Your Matrix account on ", + "No identity server is configured: add one in server settings to reset your password.": "No identity server is configured: add one in server settings to reset your password.", + "Sign in instead": "Sign in instead", + "A verification email will be sent to your inbox to confirm setting your new password.": "A verification email will be sent to your inbox to confirm setting your new password.", + "Send Reset Email": "Send Reset Email", + "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.", + "I have verified my email address": "I have verified my email address", + "Your password has been reset.": "Your password has been reset.", + "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.", + "Return to login screen": "Return to login screen", + "Set a new password": "Set a new password", + "Invalid homeserver discovery response": "Invalid homeserver discovery response", + "Failed to get autodiscovery configuration from server": "Failed to get autodiscovery configuration from server", + "Invalid base_url for m.homeserver": "Invalid base_url for m.homeserver", + "Homeserver URL does not appear to be a valid Matrix homeserver": "Homeserver URL does not appear to be a valid Matrix homeserver", + "Invalid identity server discovery response": "Invalid identity server discovery response", + "Invalid base_url for m.identity_server": "Invalid base_url for m.identity_server", + "Identity server URL does not appear to be a valid identity server": "Identity server URL does not appear to be a valid identity server", + "General failure": "General failure", + "This homeserver does not support login using email address.": "This homeserver does not support login using email address.", + "Please contact your service administrator to continue using this service.": "Please contact your service administrator to continue using this service.", + "This account has been deactivated.": "This account has been deactivated.", + "Incorrect username and/or password.": "Incorrect username and/or password.", + "Please note you are logging into the %(hs)s server, not matrix.org.": "Please note you are logging into the %(hs)s server, not matrix.org.", + "Failed to perform homeserver discovery": "Failed to perform homeserver discovery", + "The phone number entered looks invalid": "The phone number entered looks invalid", + "This homeserver doesn't offer any login flows which are supported by this client.": "This homeserver doesn't offer any login flows which are supported by this client.", + "Error: Problem communicating with the given homeserver.": "Error: Problem communicating with the given homeserver.", + "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.", + "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.", + "Sign in with single sign-on": "Sign in with single sign-on", + "Create account": "Create account", + "Failed to fetch avatar URL": "Failed to fetch avatar URL", + "Set a display name:": "Set a display name:", + "Upload an avatar:": "Upload an avatar:", + "Registration has been disabled on this homeserver.": "Registration has been disabled on this homeserver.", + "Unable to query for supported registration methods.": "Unable to query for supported registration methods.", + "This server does not support authentication with a phone number.": "This server does not support authentication with a phone number.", + "Your new account (%(newAccountId)s) is registered, but you're already logged into a different account (%(loggedInUserId)s).": "Your new account (%(newAccountId)s) is registered, but you're already logged into a different account (%(loggedInUserId)s).", + "Continue with previous account": "Continue with previous account", + "Log in to your new account.": "Log in to your new account.", + "You can now close this window or log in to your new account.": "You can now close this window or log in to your new account.", + "Registration Successful": "Registration Successful", + "Create your account": "Create your account", + "Failed to re-authenticate due to a homeserver problem": "Failed to re-authenticate due to a homeserver problem", + "Failed to re-authenticate": "Failed to re-authenticate", + "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.": "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.", + "Enter your password to sign in and regain access to your account.": "Enter your password to sign in and regain access to your account.", + "Forgotten your password?": "Forgotten your password?", + "Sign in and regain access to your account.": "Sign in and regain access to your account.", + "You cannot sign in to your account. Please contact your homeserver admin for more information.": "You cannot sign in to your account. Please contact your homeserver admin for more information.", + "You're signed out": "You're signed out", + "Clear personal data": "Clear personal data", + "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.": "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.", + "Commands": "Commands", + "Command Autocomplete": "Command Autocomplete", + "Community Autocomplete": "Community Autocomplete", + "Results from DuckDuckGo": "Results from DuckDuckGo", + "DuckDuckGo Results": "DuckDuckGo Results", + "Emoji": "Emoji", + "Emoji Autocomplete": "Emoji Autocomplete", + "Notify the whole room": "Notify the whole room", + "Room Notification": "Room Notification", + "Notification Autocomplete": "Notification Autocomplete", + "Room Autocomplete": "Room Autocomplete", + "Users": "Users", + "User Autocomplete": "User Autocomplete", + "unknown device": "unknown device", + "NOT verified": "NOT verified", + "Blacklisted": "Blacklisted", + "verified": "verified", + "Verification": "Verification", + "Ed25519 fingerprint": "Ed25519 fingerprint", + "User ID": "User ID", + "Curve25519 identity key": "Curve25519 identity key", + "none": "none", + "Claimed Ed25519 fingerprint key": "Claimed Ed25519 fingerprint key", + "Algorithm": "Algorithm", + "unencrypted": "unencrypted", + "Decryption error": "Decryption error", + "Session ID": "Session ID", + "Event information": "Event information", + "Sender device information": "Sender device information", + "Passphrases must match": "Passphrases must match", + "Passphrase must not be empty": "Passphrase must not be empty", + "Export room keys": "Export room keys", + "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.", + "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.", + "Enter passphrase": "Enter passphrase", + "Confirm passphrase": "Confirm passphrase", + "Export": "Export", + "Import room keys": "Import room keys", + "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.", + "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.", + "File to import": "File to import", + "Import": "Import", + "Key Backup is enabled on your account but has not been set up from this session. To set up secret storage, restore your key backup.": "Key Backup is enabled on your account but has not been set up from this session. To set up secret storage, restore your key backup.", + "Restore": "Restore", + "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup.": "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup.", + "Great! This passphrase looks strong enough.": "Great! This passphrase looks strong enough.", + "Warning: You should only set up secret storage from a trusted computer.": "Warning: You should only set up secret storage from a trusted computer.", + "We'll use secret storage to optionally store an encrypted copy of your cross-signing identity for verifying other devices and message keys on our server. Protect your access to encrypted messages with a passphrase to keep it secure.": "We'll use secret storage to optionally store an encrypted copy of your cross-signing identity for verifying other devices and message keys on our server. Protect your access to encrypted messages with a passphrase to keep it secure.", + "For maximum security, this should be different from your account password.": "For maximum security, this should be different from your account password.", + "Enter a passphrase...": "Enter a passphrase...", + "Set up with a recovery key": "Set up with a recovery key", + "That matches!": "That matches!", + "That doesn't match.": "That doesn't match.", + "Go back to set it again.": "Go back to set it again.", + "Please enter your passphrase a second time to confirm.": "Please enter your passphrase a second time to confirm.", + "Repeat your passphrase...": "Repeat your passphrase...", + "As a safety net, you can use it to restore your access to encrypted messages if you forget your passphrase.": "As a safety net, you can use it to restore your access to encrypted messages if you forget your passphrase.", + "As a safety net, you can use it to restore your access to encrypted messages.": "As a safety net, you can use it to restore your access to encrypted messages.", + "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.", + "Keep your recovery key somewhere very secure, like a password manager (or a safe).": "Keep your recovery key somewhere very secure, like a password manager (or a safe).", + "Your Recovery Key": "Your Recovery Key", + "Copy to clipboard": "Copy to clipboard", + "Download": "Download", + "Your recovery key has been copied to your clipboard, paste it to:": "Your recovery key has been copied to your clipboard, paste it to:", + "Your recovery key is in your Downloads folder.": "Your recovery key is in your Downloads folder.", + "Print it and store it somewhere safe": "Print it and store it somewhere safe", + "Save it on a USB key or backup drive": "Save it on a USB key or backup drive", + "Copy it to your personal cloud storage": "Copy it to your personal cloud storage", + "Your access to encrypted messages is now protected.": "Your access to encrypted messages is now protected.", + "Without setting up secret storage, you won't be able to restore your access to encrypted messages or your cross-signing identity for verifying other devices if you log out or use another device.": "Without setting up secret storage, you won't be able to restore your access to encrypted messages or your cross-signing identity for verifying other devices if you log out or use another device.", + "Set up secret storage": "Set up secret storage", + "Restore your Key Backup": "Restore your Key Backup", + "Migrate from Key Backup": "Migrate from Key Backup", + "Secure your encrypted messages with a passphrase": "Secure your encrypted messages with a passphrase", + "Confirm your passphrase": "Confirm your passphrase", + "Recovery key": "Recovery key", + "Keep it safe": "Keep it safe", + "Storing secrets...": "Storing secrets...", + "Success!": "Success!", + "Unable to set up secret storage": "Unable to set up secret storage", + "Retry": "Retry", + "We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.": "We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.", + "Set up with a Recovery Key": "Set up with a Recovery Key", + "As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.": "As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.", + "As a safety net, you can use it to restore your encrypted message history.": "As a safety net, you can use it to restore your encrypted message history.", + "Your keys are being backed up (the first backup could take a few minutes).": "Your keys are being backed up (the first backup could take a few minutes).", + "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.", + "Set up Secure Message Recovery": "Set up Secure Message Recovery", + "Secure your backup with a passphrase": "Secure your backup with a passphrase", + "Starting backup...": "Starting backup...", + "Create Key Backup": "Create Key Backup", + "Unable to create key backup": "Unable to create key backup", + "Without setting up Secure Message Recovery, you'll lose your secure message history when you log out.": "Without setting up Secure Message Recovery, you'll lose your secure message history when you log out.", + "If you don't want to set this up now, you can later in Settings.": "If you don't want to set this up now, you can later in Settings.", + "Set up": "Set up", + "Don't ask again": "Don't ask again", + "New Recovery Method": "New Recovery Method", + "A new recovery passphrase and key for Secure Messages have been detected.": "A new recovery passphrase and key for Secure Messages have been detected.", + "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.": "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.", + "This device is encrypting history using the new recovery method.": "This device is encrypting history using the new recovery method.", + "Go to Settings": "Go to Settings", + "Set up Secure Messages": "Set up Secure Messages", + "Recovery Method Removed": "Recovery Method Removed", + "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "This device has detected that your recovery passphrase and key for Secure Messages have been removed.", + "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.", + "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.", + "Failed to set direct chat tag": "Failed to set direct chat tag", + "Failed to remove tag %(tagName)s from room": "Failed to remove tag %(tagName)s from room", + "Failed to add tag %(tagName)s to room": "Failed to add tag %(tagName)s to room" +} From c5ecd83bc18bc59382be69cff459dfc81347c1e3 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 24 Jan 2020 12:34:50 +0000 Subject: [PATCH 220/906] remove .orig file --- src/i18n/strings/en_EN.json.orig | 2040 ------------------------------ 1 file changed, 2040 deletions(-) delete mode 100644 src/i18n/strings/en_EN.json.orig diff --git a/src/i18n/strings/en_EN.json.orig b/src/i18n/strings/en_EN.json.orig deleted file mode 100644 index f0eab6b12d..0000000000 --- a/src/i18n/strings/en_EN.json.orig +++ /dev/null @@ -1,2040 +0,0 @@ -{ - "This email address is already in use": "This email address is already in use", - "This phone number is already in use": "This phone number is already in use", - "Add Email Address": "Add Email Address", - "Failed to verify email address: make sure you clicked the link in the email": "Failed to verify email address: make sure you clicked the link in the email", - "Add Phone Number": "Add Phone Number", - "The platform you're on": "The platform you're on", - "The version of Riot.im": "The version of Riot.im", - "Whether or not you're logged in (we don't record your username)": "Whether or not you're logged in (we don't record your username)", - "Your language of choice": "Your language of choice", - "Which officially provided instance you are using, if any": "Which officially provided instance you are using, if any", - "Whether or not you're using the Richtext mode of the Rich Text Editor": "Whether or not you're using the Richtext mode of the Rich Text Editor", - "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)", - "Your homeserver's URL": "Your homeserver's URL", - "Your identity server's URL": "Your identity server's URL", - "e.g. %(exampleValue)s": "e.g. %(exampleValue)s", - "Every page you use in the app": "Every page you use in the app", - "e.g. ": "e.g. ", - "Your User Agent": "Your User Agent", - "Your device resolution": "Your device resolution", - "Analytics": "Analytics", - "The information being sent to us to help make Riot.im better includes:": "The information being sent to us to help make Riot.im better includes:", - "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.", - "Call Failed": "Call Failed", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.", - "Review Devices": "Review Devices", - "Call Anyway": "Call Anyway", - "Answer Anyway": "Answer Anyway", - "Call": "Call", - "Answer": "Answer", - "Call Timeout": "Call Timeout", - "The remote side failed to pick up": "The remote side failed to pick up", - "Call failed due to misconfigured server": "Call failed due to misconfigured server", - "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.", - "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.": "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.", - "Try using turn.matrix.org": "Try using turn.matrix.org", - "OK": "OK", - "Unable to capture screen": "Unable to capture screen", - "Existing Call": "Existing Call", - "You are already in a call.": "You are already in a call.", - "VoIP is unsupported": "VoIP is unsupported", - "You cannot place VoIP calls in this browser.": "You cannot place VoIP calls in this browser.", - "You cannot place a call with yourself.": "You cannot place a call with yourself.", - "Could not connect to the integration server": "Could not connect to the integration server", - "A conference call could not be started because the integrations server is not available": "A conference call could not be started because the integrations server is not available", - "Call in Progress": "Call in Progress", - "A call is currently being placed!": "A call is currently being placed!", - "A call is already in progress!": "A call is already in progress!", - "Permission Required": "Permission Required", - "You do not have permission to start a conference call in this room": "You do not have permission to start a conference call in this room", - "Replying With Files": "Replying With Files", - "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "At this time it is not possible to reply with a file. Would you like to upload this file without replying?", - "Continue": "Continue", - "The file '%(fileName)s' failed to upload.": "The file '%(fileName)s' failed to upload.", - "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "The file '%(fileName)s' exceeds this homeserver's size limit for uploads", - "Upload Failed": "Upload Failed", - "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", - "The server does not support the room version specified.": "The server does not support the room version specified.", - "Failure to create room": "Failure to create room", - "Send cross-signing keys to homeserver": "Send cross-signing keys to homeserver", - "Send anyway": "Send anyway", - "Send": "Send", - "Sun": "Sun", - "Mon": "Mon", - "Tue": "Tue", - "Wed": "Wed", - "Thu": "Thu", - "Fri": "Fri", - "Sat": "Sat", - "Jan": "Jan", - "Feb": "Feb", - "Mar": "Mar", - "Apr": "Apr", - "May": "May", - "Jun": "Jun", - "Jul": "Jul", - "Aug": "Aug", - "Sep": "Sep", - "Oct": "Oct", - "Nov": "Nov", - "Dec": "Dec", - "PM": "PM", - "AM": "AM", - "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", - "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(time)s", - "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s", - "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s", - "New Session": "New Session", - "Who would you like to add to this community?": "Who would you like to add to this community?", - "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID", - "Invite new community members": "Invite new community members", - "Name or Matrix ID": "Name or Matrix ID", - "Invite to Community": "Invite to Community", - "Which rooms would you like to add to this community?": "Which rooms would you like to add to this community?", - "Show these rooms to non-members on the community page and room list?": "Show these rooms to non-members on the community page and room list?", - "Add rooms to the community": "Add rooms to the community", - "Room name or alias": "Room name or alias", - "Add to community": "Add to community", - "Failed to invite the following users to %(groupId)s:": "Failed to invite the following users to %(groupId)s:", - "Failed to invite users to community": "Failed to invite users to community", - "Failed to invite users to %(groupId)s": "Failed to invite users to %(groupId)s", - "Failed to add the following rooms to %(groupId)s:": "Failed to add the following rooms to %(groupId)s:", - "Unnamed Room": "Unnamed Room", - "Identity server has no terms of service": "Identity server has no terms of service", - "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.": "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.", - "Only continue if you trust the owner of the server.": "Only continue if you trust the owner of the server.", - "Trust": "Trust", - "Error": "Error", - "Unable to load! Check your network connectivity and try again.": "Unable to load! Check your network connectivity and try again.", - "Dismiss": "Dismiss", - "Riot does not have permission to send you notifications - please check your browser settings": "Riot does not have permission to send you notifications - please check your browser settings", - "Riot was not given permission to send notifications - please try again": "Riot was not given permission to send notifications - please try again", - "Unable to enable Notifications": "Unable to enable Notifications", - "This email address was not found": "This email address was not found", - "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Your email address does not appear to be associated with a Matrix ID on this Homeserver.", - "Registration Required": "Registration Required", - "You need to register to do this. Would you like to register now?": "You need to register to do this. Would you like to register now?", - "Register": "Register", - "Default": "Default", - "Restricted": "Restricted", - "Moderator": "Moderator", - "Admin": "Admin", - "Custom (%(level)s)": "Custom (%(level)s)", - "Start a chat": "Start a chat", - "Who would you like to communicate with?": "Who would you like to communicate with?", - "Email, name or Matrix ID": "Email, name or Matrix ID", - "Start Chat": "Start Chat", - "Invite new room members": "Invite new room members", - "Send Invites": "Send Invites", - "Failed to start chat": "Failed to start chat", - "Operation failed": "Operation failed", - "Failed to invite": "Failed to invite", - "Failed to invite users to the room:": "Failed to invite users to the room:", - "Failed to invite the following users to the %(roomName)s room:": "Failed to invite the following users to the %(roomName)s room:", - "You need to be logged in.": "You need to be logged in.", - "You need to be able to invite users to do that.": "You need to be able to invite users to do that.", - "Unable to create widget.": "Unable to create widget.", - "Missing roomId.": "Missing roomId.", - "Failed to send request.": "Failed to send request.", - "This room is not recognised.": "This room is not recognised.", - "Power level must be positive integer.": "Power level must be positive integer.", - "You are not in this room.": "You are not in this room.", - "You do not have permission to do that in this room.": "You do not have permission to do that in this room.", - "Missing room_id in request": "Missing room_id in request", - "Room %(roomId)s not visible": "Room %(roomId)s not visible", - "Missing user_id in request": "Missing user_id in request", - "Messages": "Messages", - "Actions": "Actions", - "Advanced": "Advanced", - "Other": "Other", - "Usage": "Usage", - "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Prepends ¯\\_(ツ)_/¯ to a plain-text message", - "Sends a message as plain text, without interpreting it as markdown": "Sends a message as plain text, without interpreting it as markdown", - "Searches DuckDuckGo for results": "Searches DuckDuckGo for results", - "/ddg is not a command": "/ddg is not a command", - "To use it, just wait for autocomplete results to load and tab through them.": "To use it, just wait for autocomplete results to load and tab through them.", - "Upgrades a room to a new version": "Upgrades a room to a new version", - "You do not have the required permissions to use this command.": "You do not have the required permissions to use this command.", - "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 your display nickname": "Changes your display nickname", - "Changes your display nickname in the current room only": "Changes your display nickname in the current room only", - "Changes the avatar of the current room": "Changes the avatar of the current room", - "Changes your avatar in this current room only": "Changes your avatar in this current room only", - "Changes your avatar in all rooms": "Changes your avatar in all rooms", - "Gets or sets the room topic": "Gets or sets the room topic", - "This room has no topic.": "This room has no topic.", - "Sets the room name": "Sets the room name", - "Invites user with given id to current room": "Invites user with given id to current room", - "Use an identity server": "Use an identity server", - "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.", - "Use an identity server to invite by email. Manage in Settings.": "Use an identity server to invite by email. Manage in Settings.", - "Joins room with given alias": "Joins room with given alias", - "Leave room": "Leave room", - "Unrecognised room alias:": "Unrecognised room alias:", - "Kicks user with given id": "Kicks user with given id", - "Bans user with given id": "Bans user with given id", - "Unbans user with given ID": "Unbans user with given ID", - "Ignores a user, hiding their messages from you": "Ignores a user, hiding their messages from you", - "Ignored user": "Ignored user", - "You are now ignoring %(userId)s": "You are now ignoring %(userId)s", - "Stops ignoring a user, showing their messages going forward": "Stops ignoring a user, showing their messages going forward", - "Unignored user": "Unignored user", - "You are no longer ignoring %(userId)s": "You are no longer ignoring %(userId)s", - "Define the power level of a user": "Define the power level of a user", - "Deops user with given id": "Deops user with given id", - "Opens the Developer Tools dialog": "Opens the Developer Tools dialog", - "Adds a custom widget by URL to the room": "Adds a custom widget by URL to the room", - "Please supply a https:// or http:// widget URL": "Please supply a https:// or http:// widget URL", - "You cannot modify widgets in this room.": "You cannot modify widgets in this room.", - "Verifies a user, device, and pubkey tuple": "Verifies a user, device, and pubkey tuple", - "Unknown (user, device) pair:": "Unknown (user, device) pair:", - "Device already verified!": "Device already verified!", - "WARNING: Device already verified, but keys do NOT MATCH!": "WARNING: Device already verified, but keys do NOT MATCH!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!", - "Verified key": "Verified key", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.", - "Displays action": "Displays action", - "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", - "Sends the given message coloured as a rainbow": "Sends the given message coloured as a rainbow", - "Sends the given emote coloured as a rainbow": "Sends the given emote coloured as a rainbow", - "Displays list of commands with usages and descriptions": "Displays list of commands with usages and descriptions", - "Unrecognised command:": "Unrecognised command:", - "Reason": "Reason", - "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepted the invitation for %(displayName)s.", - "%(targetName)s accepted an invitation.": "%(targetName)s accepted an invitation.", - "%(senderName)s requested a VoIP conference.": "%(senderName)s requested a VoIP conference.", - "%(senderName)s invited %(targetName)s.": "%(senderName)s invited %(targetName)s.", - "%(senderName)s banned %(targetName)s.": "%(senderName)s banned %(targetName)s.", - "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s changed their display name to %(displayName)s.", - "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s set their display name to %(displayName)s.", - "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removed their display name (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s removed their profile picture.", - "%(senderName)s changed their profile picture.": "%(senderName)s changed their profile picture.", - "%(senderName)s set a profile picture.": "%(senderName)s set a profile picture.", - "%(senderName)s made no change.": "%(senderName)s made no change.", - "VoIP conference started.": "VoIP conference started.", - "%(targetName)s joined the room.": "%(targetName)s joined the room.", - "VoIP conference finished.": "VoIP conference finished.", - "%(targetName)s rejected the invitation.": "%(targetName)s rejected the invitation.", - "%(targetName)s left the room.": "%(targetName)s left the room.", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s unbanned %(targetName)s.", - "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s withdrew %(targetName)s's invitation.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s kicked %(targetName)s.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s changed the topic to \"%(topic)s\".", - "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s removed the room name.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s changed the room name to %(roomName)s.", - "%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s upgraded this room.", - "%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s made the room public to whoever knows the link.", - "%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s made the room invite only.", - "%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s changed the join rule to %(rule)s", - "%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s has allowed guests to join the room.", - "%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s has prevented guests from joining the room.", - "%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s changed guest access to %(rule)s", - "%(senderDisplayName)s enabled flair for %(groups)s in this room.": "%(senderDisplayName)s enabled flair for %(groups)s in this room.", - "%(senderDisplayName)s disabled flair for %(groups)s in this room.": "%(senderDisplayName)s disabled flair for %(groups)s in this room.", - "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.", - "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sent an image.", - "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s added %(addedAddresses)s as addresses for this room.", - "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s added %(addedAddresses)s as an address for this room.", - "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s removed %(removedAddresses)s as addresses for this room.", - "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s removed %(removedAddresses)s as an address for this room.", - "%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.", - "%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s set the main address for this room to %(address)s.", - "%(senderName)s removed the main address for this room.": "%(senderName)s removed the main address for this room.", - "Someone": "Someone", - "(not supported by this browser)": "(not supported by this browser)", - "%(senderName)s answered the call.": "%(senderName)s answered the call.", - "(could not connect media)": "(could not connect media)", - "(no answer)": "(no answer)", - "(unknown failure: %(reason)s)": "(unknown failure: %(reason)s)", - "%(senderName)s ended the call.": "%(senderName)s ended the call.", - "%(senderName)s placed a voice call.": "%(senderName)s placed a voice call.", - "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s placed a voice call. (not supported by this browser)", - "%(senderName)s placed a video call.": "%(senderName)s placed a video call.", - "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s placed a video call. (not supported by this browser)", - "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s made future room history visible to all room members, from the point they are invited.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s made future room history visible to all room members, from the point they joined.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s made future room history visible to all room members.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s made future room history visible to anyone.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s made future room history visible to unknown (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).", - "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s changed the power level of %(powerLevelDiffText)s.", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.", - "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s widget modified by %(senderName)s", - "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s widget added by %(senderName)s", - "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s widget removed by %(senderName)s", - "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s removed the rule banning users matching %(glob)s", - "%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s removed the rule banning rooms matching %(glob)s", - "%(senderName)s removed the rule banning servers matching %(glob)s": "%(senderName)s removed the rule banning servers matching %(glob)s", - "%(senderName)s removed a ban rule matching %(glob)s": "%(senderName)s removed a ban rule matching %(glob)s", - "%(senderName)s updated an invalid ban rule": "%(senderName)s updated an invalid ban rule", - "%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s": "%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s", - "%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s", - "%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s", - "%(senderName)s updated a ban rule matching %(glob)s for %(reason)s": "%(senderName)s updated a ban rule matching %(glob)s for %(reason)s", - "%(senderName)s created a rule banning users matching %(glob)s for %(reason)s": "%(senderName)s created a rule banning users matching %(glob)s for %(reason)s", - "%(senderName)s created a rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s created a rule banning rooms matching %(glob)s for %(reason)s", - "%(senderName)s created a rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s created a rule banning servers matching %(glob)s for %(reason)s", - "%(senderName)s created a ban rule matching %(glob)s for %(reason)s": "%(senderName)s created a ban rule matching %(glob)s for %(reason)s", - "%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s", - "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s", - "%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s", - "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s", - "Light theme": "Light theme", - "Dark theme": "Dark theme", - "%(displayName)s is typing …": "%(displayName)s is typing …", - "%(names)s and %(count)s others are typing …|other": "%(names)s and %(count)s others are typing …", - "%(names)s and %(count)s others are typing …|one": "%(names)s and one other is typing …", - "%(names)s and %(lastPerson)s are typing …": "%(names)s and %(lastPerson)s are typing …", - "Cannot reach homeserver": "Cannot reach homeserver", - "Ensure you have a stable internet connection, or get in touch with the server admin": "Ensure you have a stable internet connection, or get in touch with the server admin", - "Your Riot is misconfigured": "Your Riot is misconfigured", - "Ask your Riot admin to check your config for incorrect or duplicate entries.": "Ask your Riot admin to check your config for incorrect or duplicate entries.", - "Cannot reach identity server": "Cannot reach identity server", - "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.": "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.", - "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.": "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.", - "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.": "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.", - "No homeserver URL provided": "No homeserver URL provided", - "Unexpected error resolving homeserver configuration": "Unexpected error resolving homeserver configuration", - "Unexpected error resolving identity server configuration": "Unexpected error resolving identity server configuration", - "The message you are trying to send is too large.": "The message you are trying to send is too large.", - "This homeserver has hit its Monthly Active User limit.": "This homeserver has hit its Monthly Active User limit.", - "This homeserver has exceeded one of its resource limits.": "This homeserver has exceeded one of its resource limits.", - "Please contact your service administrator to continue using the service.": "Please contact your service administrator to continue using the service.", - "Unable to connect to Homeserver. Retrying...": "Unable to connect to Homeserver. Retrying...", - "%(items)s and %(count)s others|other": "%(items)s and %(count)s others", - "%(items)s and %(count)s others|one": "%(items)s and one other", - "%(items)s and %(lastItem)s": "%(items)s and %(lastItem)s", - "a few seconds ago": "a few seconds ago", - "about a minute ago": "about a minute ago", - "%(num)s minutes ago": "%(num)s minutes ago", - "about an hour ago": "about an hour ago", - "%(num)s hours ago": "%(num)s hours ago", - "about a day ago": "about a day ago", - "%(num)s days ago": "%(num)s days ago", - "a few seconds from now": "a few seconds from now", - "about a minute from now": "about a minute from now", - "%(num)s minutes from now": "%(num)s minutes from now", - "about an hour from now": "about an hour from now", - "%(num)s hours from now": "%(num)s hours from now", - "about a day from now": "about a day from now", - "%(num)s days from now": "%(num)s days from now", - "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", - "Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions", - "Not a valid Riot keyfile": "Not a valid Riot keyfile", - "Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?", - "Unrecognised address": "Unrecognised address", - "You do not have permission to invite people to this room.": "You do not have permission to invite people to this room.", - "User %(userId)s is already in the room": "User %(userId)s is already in the room", - "User %(user_id)s does not exist": "User %(user_id)s does not exist", - "User %(user_id)s may or may not exist": "User %(user_id)s may or may not exist", - "The user must be unbanned before they can be invited.": "The user must be unbanned before they can be invited.", - "The user's homeserver does not support the version of the room.": "The user's homeserver does not support the version of the room.", - "Unknown server error": "Unknown server error", - "Use a few words, avoid common phrases": "Use a few words, avoid common phrases", - "No need for symbols, digits, or uppercase letters": "No need for symbols, digits, or uppercase letters", - "Use a longer keyboard pattern with more turns": "Use a longer keyboard pattern with more turns", - "Avoid repeated words and characters": "Avoid repeated words and characters", - "Avoid sequences": "Avoid sequences", - "Avoid recent years": "Avoid recent years", - "Avoid years that are associated with you": "Avoid years that are associated with you", - "Avoid dates and years that are associated with you": "Avoid dates and years that are associated with you", - "Capitalization doesn't help very much": "Capitalization doesn't help very much", - "All-uppercase is almost as easy to guess as all-lowercase": "All-uppercase is almost as easy to guess as all-lowercase", - "Reversed words aren't much harder to guess": "Reversed words aren't much harder to guess", - "Predictable substitutions like '@' instead of 'a' don't help very much": "Predictable substitutions like '@' instead of 'a' don't help very much", - "Add another word or two. Uncommon words are better.": "Add another word or two. Uncommon words are better.", - "Repeats like \"aaa\" are easy to guess": "Repeats like \"aaa\" are easy to guess", - "Repeats like \"abcabcabc\" are only slightly harder to guess than \"abc\"": "Repeats like \"abcabcabc\" are only slightly harder to guess than \"abc\"", - "Sequences like abc or 6543 are easy to guess": "Sequences like abc or 6543 are easy to guess", - "Recent years are easy to guess": "Recent years are easy to guess", - "Dates are often easy to guess": "Dates are often easy to guess", - "This is a top-10 common password": "This is a top-10 common password", - "This is a top-100 common password": "This is a top-100 common password", - "This is a very common password": "This is a very common password", - "This is similar to a commonly used password": "This is similar to a commonly used password", - "A word by itself is easy to guess": "A word by itself is easy to guess", - "Names and surnames by themselves are easy to guess": "Names and surnames by themselves are easy to guess", - "Common names and surnames are easy to guess": "Common names and surnames are easy to guess", - "Straight rows of keys are easy to guess": "Straight rows of keys are easy to guess", - "Short keyboard patterns are easy to guess": "Short keyboard patterns are easy to guess", - "There was an error joining the room": "There was an error joining the room", - "Sorry, your homeserver is too old to participate in this room.": "Sorry, your homeserver is too old to participate in this room.", - "Please contact your homeserver administrator.": "Please contact your homeserver administrator.", - "Failed to join room": "Failed to join room", - "Message Pinning": "Message Pinning", - "Custom user status messages": "Custom user status messages", - "Group & filter rooms by custom tags (refresh to apply changes)": "Group & filter rooms by custom tags (refresh to apply changes)", - "Render simple counters in room header": "Render simple counters in room header", - "Multiple integration managers": "Multiple integration managers", - "Try out new ways to ignore people (experimental)": "Try out new ways to ignore people (experimental)", - "New invite dialog": "New invite dialog", - "Show a presence dot next to DMs in the room list": "Show a presence dot next to DMs in the room list", - "Enable cross-signing to verify per-user instead of per-device (in development)": "Enable cross-signing to verify per-user instead of per-device (in development)", - "Enable local event indexing and E2EE search (requires restart)": "Enable local event indexing and E2EE search (requires restart)", - "Show info about bridges in room settings": "Show info about bridges in room settings", - "Enable Emoji suggestions while typing": "Enable Emoji suggestions while typing", - "Use compact timeline layout": "Use compact timeline layout", - "Show a placeholder for removed messages": "Show a placeholder for removed messages", - "Show join/leave messages (invites/kicks/bans unaffected)": "Show join/leave messages (invites/kicks/bans unaffected)", - "Show avatar changes": "Show avatar changes", - "Show display name changes": "Show display name changes", - "Show read receipts sent by other users": "Show read receipts sent by other users", - "Show timestamps in 12 hour format (e.g. 2:30pm)": "Show timestamps in 12 hour format (e.g. 2:30pm)", - "Always show message timestamps": "Always show message timestamps", - "Autoplay GIFs and videos": "Autoplay GIFs and videos", - "Always show encryption icons": "Always show encryption icons", - "Show a reminder to enable Secure Message Recovery in encrypted rooms": "Show a reminder to enable Secure Message Recovery in encrypted rooms", - "Enable automatic language detection for syntax highlighting": "Enable automatic language detection for syntax highlighting", - "Show avatars in user and room mentions": "Show avatars in user and room mentions", - "Enable big emoji in chat": "Enable big emoji in chat", - "Send typing notifications": "Send typing notifications", - "Automatically replace plain text Emoji": "Automatically replace plain text Emoji", - "Mirror local video feed": "Mirror local video feed", - "Enable Community Filter Panel": "Enable Community Filter Panel", - "Match system theme": "Match system theme", - "Allow Peer-to-Peer for 1:1 calls": "Allow Peer-to-Peer for 1:1 calls", - "Send analytics data": "Send analytics data", - "Never send encrypted messages to unverified devices from this device": "Never send encrypted messages to unverified devices from this device", - "Never send encrypted messages to unverified devices in this room from this device": "Never send encrypted messages to unverified devices in this room from this device", - "Enable inline URL previews by default": "Enable inline URL previews by default", - "Enable URL previews for this room (only affects you)": "Enable URL previews for this room (only affects you)", - "Enable URL previews by default for participants in this room": "Enable URL previews by default for participants in this room", - "Room Colour": "Room Colour", - "Enable widget screenshots on supported widgets": "Enable widget screenshots on supported widgets", - "Prompt before sending invites to potentially invalid matrix IDs": "Prompt before sending invites to potentially invalid matrix IDs", - "Show developer tools": "Show developer tools", - "Order rooms in the room list by most important first instead of most recent": "Order rooms in the room list by most important first instead of most recent", - "Show recently visited rooms above the room list": "Show recently visited rooms above the room list", - "Show hidden events in timeline": "Show hidden events in timeline", - "Low bandwidth mode": "Low bandwidth mode", - "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)", - "Send read receipts for messages (requires compatible homeserver to disable)": "Send read receipts for messages (requires compatible homeserver to disable)", - "Show previews/thumbnails for images": "Show previews/thumbnails for images", - "Collecting app version information": "Collecting app version information", - "Collecting logs": "Collecting logs", - "Uploading report": "Uploading report", - "Waiting for response from server": "Waiting for response from server", - "Messages containing my display name": "Messages containing my display name", - "Messages containing my username": "Messages containing my username", - "Messages containing @room": "Messages containing @room", - "Messages in one-to-one chats": "Messages in one-to-one chats", - "Encrypted messages in one-to-one chats": "Encrypted messages in one-to-one chats", - "Messages in group chats": "Messages in group chats", - "Encrypted messages in group chats": "Encrypted messages in group chats", - "When I'm invited to a room": "When I'm invited to a room", - "Call invitation": "Call invitation", - "Messages sent by bot": "Messages sent by bot", - "When rooms are upgraded": "When rooms are upgraded", - "My Ban List": "My Ban List", - "This is your list of users/servers you have blocked - don't leave the room!": "This is your list of users/servers you have blocked - don't leave the room!", - "Active call (%(roomName)s)": "Active call (%(roomName)s)", - "unknown caller": "unknown caller", - "Incoming voice call from %(name)s": "Incoming voice call from %(name)s", - "Incoming video call from %(name)s": "Incoming video call from %(name)s", - "Incoming call from %(name)s": "Incoming call from %(name)s", - "Decline": "Decline", - "Accept": "Accept", - "The other party cancelled the verification.": "The other party cancelled the verification.", - "Verified!": "Verified!", - "You've successfully verified this user.": "You've successfully verified this user.", - "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.", - "Got It": "Got It", - "Verify this user by confirming the following emoji appear on their screen.": "Verify this user by confirming the following emoji appear on their screen.", - "Verify this user by confirming the following number appears on their screen.": "Verify this user by confirming the following number appears on their screen.", - "Unable to find a supported verification method.": "Unable to find a supported verification method.", - "Cancel": "Cancel", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "For maximum security, we recommend you do this in person or use another trusted means of communication.", - "Dog": "Dog", - "Cat": "Cat", - "Lion": "Lion", - "Horse": "Horse", - "Unicorn": "Unicorn", - "Pig": "Pig", - "Elephant": "Elephant", - "Rabbit": "Rabbit", - "Panda": "Panda", - "Rooster": "Rooster", - "Penguin": "Penguin", - "Turtle": "Turtle", - "Fish": "Fish", - "Octopus": "Octopus", - "Butterfly": "Butterfly", - "Flower": "Flower", - "Tree": "Tree", - "Cactus": "Cactus", - "Mushroom": "Mushroom", - "Globe": "Globe", - "Moon": "Moon", - "Cloud": "Cloud", - "Fire": "Fire", - "Banana": "Banana", - "Apple": "Apple", - "Strawberry": "Strawberry", - "Corn": "Corn", - "Pizza": "Pizza", - "Cake": "Cake", - "Heart": "Heart", - "Smiley": "Smiley", - "Robot": "Robot", - "Hat": "Hat", - "Glasses": "Glasses", - "Spanner": "Spanner", - "Santa": "Santa", - "Thumbs up": "Thumbs up", - "Umbrella": "Umbrella", - "Hourglass": "Hourglass", - "Clock": "Clock", - "Gift": "Gift", - "Light bulb": "Light bulb", - "Book": "Book", - "Pencil": "Pencil", - "Paperclip": "Paperclip", - "Scissors": "Scissors", - "Lock": "Lock", - "Key": "Key", - "Hammer": "Hammer", - "Telephone": "Telephone", - "Flag": "Flag", - "Train": "Train", - "Bicycle": "Bicycle", - "Aeroplane": "Aeroplane", - "Rocket": "Rocket", - "Trophy": "Trophy", - "Ball": "Ball", - "Guitar": "Guitar", - "Trumpet": "Trumpet", - "Bell": "Bell", - "Anchor": "Anchor", - "Headphones": "Headphones", - "Folder": "Folder", - "Pin": "Pin", - "Other users may not trust it": "Other users may not trust it", - "Later": "Later", - "Verify": "Verify", - "Decline (%(counter)s)": "Decline (%(counter)s)", - "Accept to continue:": "Accept to continue:", - "Upload": "Upload", - "Remove": "Remove", - "Failed to upload profile picture!": "Failed to upload profile picture!", - "Upload new:": "Upload new:", - "No display name": "No display name", - "New passwords don't match": "New passwords don't match", - "Passwords can't be empty": "Passwords can't be empty", - "Warning!": "Warning!", - "Changing password will currently reset any end-to-end encryption keys on all devices, 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 devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.", - "Export E2E room keys": "Export E2E room keys", - "Do you want to set an email address?": "Do you want to set an email address?", - "Current password": "Current password", - "Password": "Password", - "New Password": "New Password", - "Confirm password": "Confirm password", - "Change Password": "Change Password", - "Cross-signing and secret storage are enabled.": "Cross-signing and secret storage are enabled.", - "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this device.": "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this device.", - "Cross-signing and secret storage are not yet set up.": "Cross-signing and secret storage are not yet set up.", - "Bootstrap cross-signing and secret storage": "Bootstrap cross-signing and secret storage", - "Cross-signing public keys:": "Cross-signing public keys:", - "on device": "on device", - "not found": "not found", - "Cross-signing private keys:": "Cross-signing private keys:", - "in secret storage": "in secret storage", - "Secret storage public key:": "Secret storage public key:", - "in account data": "in account data", - "Your homeserver does not support device management.": "Your homeserver does not support device management.", - "Unable to load device list": "Unable to load device list", - "Authentication": "Authentication", - "Delete %(count)s devices|other": "Delete %(count)s devices", - "Delete %(count)s devices|one": "Delete device", - "ID": "ID", - "Public Name": "Public Name", - "Last seen": "Last seen", - "Failed to set display name": "Failed to set display name", - "Disable Notifications": "Disable Notifications", - "Enable Notifications": "Enable Notifications", - "Connecting to integration manager...": "Connecting to integration manager...", - "Cannot connect to integration manager": "Cannot connect to integration manager", - "The integration manager is offline or it cannot reach your homeserver.": "The integration manager is offline or it cannot reach your homeserver.", - "Delete Backup": "Delete Backup", - "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.", - "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.", - "Unable to load key backup status": "Unable to load key backup status", - "Restore from Backup": "Restore from Backup", - "This device is backing up your keys. ": "This device is backing up your keys. ", - "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.", - "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.", - "Connect this device to Key Backup": "Connect this device to Key Backup", - "not stored": "not stored", - "Backing up %(sessionsRemaining)s keys...": "Backing up %(sessionsRemaining)s keys...", - "All keys backed up": "All keys backed up", - "Backup has a valid signature from this user": "Backup has a valid signature from this user", - "Backup has a invalid signature from this user": "Backup has a invalid signature from this user", - "Backup has a signature from unknown user with ID %(deviceId)s": "Backup has a signature from unknown user with ID %(deviceId)s", - "Backup has a signature from unknown device with ID %(deviceId)s": "Backup has a signature from unknown device with ID %(deviceId)s", - "Backup has a valid signature from this device": "Backup has a valid signature from this device", - "Backup has an invalid signature from this device": "Backup has an invalid signature from this device", - "Backup has a valid signature from verified device ": "Backup has a valid signature from verified device ", - "Backup has a valid signature from unverified device ": "Backup has a valid signature from unverified device ", - "Backup has an invalid signature from verified device ": "Backup has an invalid signature from verified device ", - "Backup has an invalid signature from unverified device ": "Backup has an invalid signature from unverified device ", - "Backup is not signed by any of your devices": "Backup is not signed by any of your devices", - "This backup is trusted because it has been restored on this device": "This backup is trusted because it has been restored on this device", - "Backup key stored in secret storage, but this feature is not enabled on this device. Please enable cross-signing in Labs to modify key backup state.": "Backup key stored in secret storage, but this feature is not enabled on this device. Please enable cross-signing in Labs to modify key backup state.", - "Backup version: ": "Backup version: ", - "Algorithm: ": "Algorithm: ", - "Backup key stored: ": "Backup key stored: ", - "Your keys are not being backed up from this device.": "Your keys are not being backed up from this device.", - "Back up your keys before signing out to avoid losing them.": "Back up your keys before signing out to avoid losing them.", - "Start using Key Backup": "Start using Key Backup", - "Error saving email notification preferences": "Error saving email notification preferences", - "An error occurred whilst saving your email notification preferences.": "An error occurred whilst saving your email notification preferences.", - "Keywords": "Keywords", - "Enter keywords separated by a comma:": "Enter keywords separated by a comma:", - "Failed to change settings": "Failed to change settings", - "Can't update user notification settings": "Can't update user notification settings", - "Failed to update keywords": "Failed to update keywords", - "Messages containing keywords": "Messages containing keywords", - "Notify for all other messages/rooms": "Notify for all other messages/rooms", - "Notify me for anything else": "Notify me for anything else", - "Enable notifications for this account": "Enable notifications for this account", - "Clear notifications": "Clear notifications", - "All notifications are currently disabled for all targets.": "All notifications are currently disabled for all targets.", - "Add an email address to configure email notifications": "Add an email address to configure email notifications", - "Enable email notifications": "Enable email notifications", - "Notifications on the following keywords follow rules which can’t be displayed here:": "Notifications on the following keywords follow rules which can’t be displayed here:", - "Unable to fetch notification target list": "Unable to fetch notification target list", - "Notification targets": "Notification targets", - "Advanced notification settings": "Advanced notification settings", - "There are advanced notifications which are not shown here": "There are advanced notifications which are not shown here", - "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply", - "Enable desktop notifications for this device": "Enable desktop notifications for this device", - "Show message in desktop notification": "Show message in desktop notification", - "Enable audible notifications for this device": "Enable audible notifications for this device", - "Off": "Off", - "On": "On", - "Noisy": "Noisy", - "Upgrade to your own domain": "Upgrade to your own domain", - "Display Name": "Display Name", - "Profile picture": "Profile picture", - "Save": "Save", - "Identity Server URL must be HTTPS": "Identity Server URL must be HTTPS", - "Not a valid Identity Server (status code %(code)s)": "Not a valid Identity Server (status code %(code)s)", - "Could not connect to Identity Server": "Could not connect to Identity Server", - "Checking server": "Checking server", - "Change identity server": "Change identity server", - "Disconnect from the identity server and connect to instead?": "Disconnect from the identity server and connect to instead?", - "Terms of service not accepted or the identity server is invalid.": "Terms of service not accepted or the identity server is invalid.", - "The identity server you have chosen does not have any terms of service.": "The identity server you have chosen does not have any terms of service.", - "Disconnect identity server": "Disconnect identity server", - "Disconnect from the identity server ?": "Disconnect from the identity server ?", - "Disconnect": "Disconnect", - "You should remove your personal data from identity server before disconnecting. Unfortunately, identity server is currently offline or cannot be reached.": "You should remove your personal data from identity server before disconnecting. Unfortunately, identity server is currently offline or cannot be reached.", - "You should:": "You should:", - "check your browser plugins for anything that might block the identity server (such as Privacy Badger)": "check your browser plugins for anything that might block the identity server (such as Privacy Badger)", - "contact the administrators of identity server ": "contact the administrators of identity server ", - "wait and try again later": "wait and try again later", - "Disconnect anyway": "Disconnect anyway", - "You are still sharing your personal data on the identity server .": "You are still sharing your personal data on the identity server .", - "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.", - "Go back": "Go back", - "Identity Server (%(server)s)": "Identity Server (%(server)s)", - "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.", - "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.", - "Identity Server": "Identity Server", - "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.", - "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.", - "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.", - "Do not use an identity server": "Do not use an identity server", - "Enter a new identity server": "Enter a new identity server", - "Change": "Change", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Use an Integration Manager to manage bots, widgets, and sticker packs.", - "Manage integrations": "Manage integrations", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.", - "Flair": "Flair", - "Failed to change password. Is your password correct?": "Failed to change password. Is your password correct?", - "Success": "Success", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them", - "Profile": "Profile", - "Email addresses": "Email addresses", - "Phone numbers": "Phone numbers", - "Account": "Account", - "Set a new account password...": "Set a new account password...", - "Language and region": "Language and region", - "Theme": "Theme", - "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.", - "Account management": "Account management", - "Deactivating your account is a permanent action - be careful!": "Deactivating your account is a permanent action - be careful!", - "Deactivate Account": "Deactivate Account", - "Warning": "Warning", - "General": "General", - "Discovery": "Discovery", - "Deactivate account": "Deactivate account", - "Legal": "Legal", - "Credits": "Credits", - "For help with using Riot, click here.": "For help with using Riot, click here.", - "For help with using Riot, click here or start a chat with our bot using the button below.": "For help with using Riot, click here or start a chat with our bot using the button below.", - "Chat with Riot Bot": "Chat with Riot Bot", - "Check for update": "Check for update", - "Help & About": "Help & About", - "Bug reporting": "Bug reporting", - "If you've submitted a bug via GitHub, debug logs can help us track down the problem. 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.": "If you've submitted a bug via GitHub, debug logs can help us track down the problem. 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.", - "Submit debug logs": "Submit debug logs", - "Clear cache and reload": "Clear cache and reload", - "FAQ": "FAQ", - "Versions": "Versions", - "matrix-react-sdk version:": "matrix-react-sdk version:", - "riot-web version:": "riot-web version:", - "olm version:": "olm version:", - "Homeserver is": "Homeserver is", - "Identity Server is": "Identity Server is", - "Access Token:": "Access Token:", - "click to reveal": "click to reveal", - "Labs": "Labs", - "Customise your experience with experimental labs features. Learn more.": "Customise your experience with experimental labs features. Learn more.", - "Ignored/Blocked": "Ignored/Blocked", - "Error adding ignored user/server": "Error adding ignored user/server", - "Something went wrong. Please try again or view your console for hints.": "Something went wrong. Please try again or view your console for hints.", - "Error subscribing to list": "Error subscribing to list", - "Please verify the room ID or alias and try again.": "Please verify the room ID or alias and try again.", - "Error removing ignored user/server": "Error removing ignored user/server", - "Error unsubscribing from list": "Error unsubscribing from list", - "Please try again or view your console for hints.": "Please try again or view your console for hints.", - "None": "None", - "Ban list rules - %(roomName)s": "Ban list rules - %(roomName)s", - "Server rules": "Server rules", - "User rules": "User rules", - "Close": "Close", - "You have not ignored anyone.": "You have not ignored anyone.", - "You are currently ignoring:": "You are currently ignoring:", - "You are not subscribed to any lists": "You are not subscribed to any lists", - "Unsubscribe": "Unsubscribe", - "View rules": "View rules", - "You are currently subscribed to:": "You are currently subscribed to:", - "Ignored users": "Ignored users", - "⚠ These settings are meant for advanced users.": "⚠ These settings are meant for advanced users.", - "Add users and servers you want to ignore here. Use asterisks to have Riot match any characters. For example, @bot:* would ignore all users that have the name 'bot' on any server.": "Add users and servers you want to ignore here. Use asterisks to have Riot match any characters. For example, @bot:* would ignore all users that have the name 'bot' on any server.", - "Ignoring people is done through ban lists which contain rules for who to ban. Subscribing to a ban list means the users/servers blocked by that list will be hidden from you.": "Ignoring people is done through ban lists which contain rules for who to ban. Subscribing to a ban list means the users/servers blocked by that list will be hidden from you.", - "Personal ban list": "Personal ban list", - "Your personal ban list holds all the users/servers you personally don't want to see messages from. After ignoring your first user/server, a new room will show up in your room list named 'My Ban List' - stay in this room to keep the ban list in effect.": "Your personal ban list holds all the users/servers you personally don't want to see messages from. After ignoring your first user/server, a new room will show up in your room list named 'My Ban List' - stay in this room to keep the ban list in effect.", - "Server or user ID to ignore": "Server or user ID to ignore", - "eg: @bot:* or example.org": "eg: @bot:* or example.org", - "Ignore": "Ignore", - "Subscribed lists": "Subscribed lists", - "Subscribing to a ban list will cause you to join it!": "Subscribing to a ban list will cause you to join it!", - "If this isn't what you want, please use a different tool to ignore users.": "If this isn't what you want, please use a different tool to ignore users.", - "Room ID or alias of ban list": "Room ID or alias of ban list", - "Subscribe": "Subscribe", - "Notifications": "Notifications", - "Start automatically after system login": "Start automatically after system login", - "Always show the window menu bar": "Always show the window menu bar", - "Show tray icon and minimize window to it on close": "Show tray icon and minimize window to it on close", - "Preferences": "Preferences", - "Composer": "Composer", - "Timeline": "Timeline", - "Room list": "Room list", - "Autocomplete delay (ms)": "Autocomplete delay (ms)", - "Read Marker lifetime (ms)": "Read Marker lifetime (ms)", - "Read Marker off-screen lifetime (ms)": "Read Marker off-screen lifetime (ms)", - "Unignore": "Unignore", - "": "", - "Import E2E room keys": "Import E2E room keys", - "Cryptography": "Cryptography", - "Device ID:": "Device ID:", - "Device key:": "Device key:", - "Bulk options": "Bulk options", - "Accept all %(invitedRooms)s invites": "Accept all %(invitedRooms)s invites", - "Reject all %(invitedRooms)s invites": "Reject all %(invitedRooms)s invites", - "Key backup": "Key backup", - "Cross-signing": "Cross-signing", - "Security & Privacy": "Security & Privacy", - "Devices": "Devices", - "A device's public name is visible to people you communicate with": "A device's public name is visible to people you communicate with", - "Riot collects anonymous analytics to allow us to improve the application.": "Riot collects anonymous analytics to allow us to improve the application.", - "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.", - "Learn more about how we use analytics.": "Learn more about how we use analytics.", - "No media permissions": "No media permissions", - "You may need to manually permit Riot to access your microphone/webcam": "You may need to manually permit Riot to access your microphone/webcam", - "Missing media permissions, click the button below to request.": "Missing media permissions, click the button below to request.", - "Request media permissions": "Request media permissions", - "No Audio Outputs detected": "No Audio Outputs detected", - "No Microphones detected": "No Microphones detected", - "No Webcams detected": "No Webcams detected", - "Default Device": "Default Device", - "Audio Output": "Audio Output", - "Microphone": "Microphone", - "Camera": "Camera", - "Voice & Video": "Voice & Video", - "This room is not accessible by remote Matrix servers": "This room is not accessible by remote Matrix servers", - "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.": "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.", - "Upgrade this room to the recommended room version": "Upgrade this room to the recommended room version", - "this room": "this room", - "View older messages in %(roomName)s.": "View older messages in %(roomName)s.", - "Room information": "Room information", - "Internal room ID:": "Internal room ID:", - "Room version": "Room version", - "Room version:": "Room version:", - "Developer options": "Developer options", - "Open Devtools": "Open Devtools", - "This bridge was provisioned by ": "This bridge was provisioned by ", - "This bridge is managed by .": "This bridge is managed by .", - "Bridged into , on ": "Bridged into , on ", - "Connected to on ": "Connected to on ", - "Connected via %(protocolName)s": "Connected via %(protocolName)s", - "Bridge Info": "Bridge Info", - "Below is a list of bridges connected to this room.": "Below is a list of bridges connected to this room.", - "Room Addresses": "Room Addresses", - "Publish this room to the public in %(domain)s's room directory?": "Publish this room to the public in %(domain)s's room directory?", - "URL Previews": "URL Previews", - "Uploaded sound": "Uploaded sound", - "Sounds": "Sounds", - "Notification sound": "Notification sound", - "Reset": "Reset", - "Set a new custom sound": "Set a new custom sound", - "Browse": "Browse", - "Change room avatar": "Change room avatar", - "Change room name": "Change room name", - "Change main address for the room": "Change main address for the room", - "Change history visibility": "Change history visibility", - "Change permissions": "Change permissions", - "Change topic": "Change topic", - "Upgrade the room": "Upgrade the room", - "Enable room encryption": "Enable room encryption", - "Modify widgets": "Modify widgets", - "Failed to unban": "Failed to unban", - "Unban": "Unban", - "Banned by %(displayName)s": "Banned by %(displayName)s", - "Error changing power level requirement": "Error changing power level requirement", - "An error occurred changing the room's power level requirements. Ensure you have sufficient permissions and try again.": "An error occurred changing the room's power level requirements. Ensure you have sufficient permissions and try again.", - "Error changing power level": "Error changing power level", - "An error occurred changing the user's power level. Ensure you have sufficient permissions and try again.": "An error occurred changing the user's power level. Ensure you have sufficient permissions and try again.", - "Default role": "Default role", - "Send messages": "Send messages", - "Invite users": "Invite users", - "Change settings": "Change settings", - "Kick users": "Kick users", - "Ban users": "Ban users", - "Remove messages": "Remove messages", - "Notify everyone": "Notify everyone", - "No users have specific privileges in this room": "No users have specific privileges in this room", - "Privileged Users": "Privileged Users", - "Muted Users": "Muted Users", - "Banned users": "Banned users", - "Send %(eventType)s events": "Send %(eventType)s events", - "Roles & Permissions": "Roles & Permissions", - "Permissions": "Permissions", - "Select the roles required to change various parts of the room": "Select the roles required to change various parts of the room", - "Enable encryption?": "Enable encryption?", - "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.": "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.", - "Guests cannot join this room even if explicitly invited.": "Guests cannot join this room even if explicitly invited.", - "Click here to fix": "Click here to fix", - "To link to this room, please add an alias.": "To link to this room, please add an alias.", - "Only people who have been invited": "Only people who have been invited", - "Anyone who knows the room's link, apart from guests": "Anyone who knows the room's link, apart from guests", - "Anyone who knows the room's link, including guests": "Anyone who knows the room's link, including guests", - "Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.": "Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.", - "Anyone": "Anyone", - "Members only (since the point in time of selecting this option)": "Members only (since the point in time of selecting this option)", - "Members only (since they were invited)": "Members only (since they were invited)", - "Members only (since they joined)": "Members only (since they joined)", - "Encryption": "Encryption", - "Once enabled, encryption cannot be disabled.": "Once enabled, encryption cannot be disabled.", - "Encrypted": "Encrypted", - "Who can access this room?": "Who can access this room?", - "Who can read history?": "Who can read history?", - "Unable to revoke sharing for email address": "Unable to revoke sharing for email address", - "Unable to share email address": "Unable to share email address", - "Your email address hasn't been verified yet": "Your email address hasn't been verified yet", - "Click the link in the email you received to verify and then click continue again.": "Click the link in the email you received to verify and then click continue again.", - "Unable to verify email address.": "Unable to verify email address.", - "Verify the link in your inbox": "Verify the link in your inbox", - "Complete": "Complete", - "Revoke": "Revoke", - "Share": "Share", - "Discovery options will appear once you have added an email above.": "Discovery options will appear once you have added an email above.", - "Unable to revoke sharing for phone number": "Unable to revoke sharing for phone number", - "Unable to share phone number": "Unable to share phone number", - "Unable to verify phone number.": "Unable to verify phone number.", - "Incorrect verification code": "Incorrect verification code", - "Please enter verification code sent via text.": "Please enter verification code sent via text.", - "Verification code": "Verification code", - "Discovery options will appear once you have added a phone number above.": "Discovery options will appear once you have added a phone number above.", - "Unable to remove contact information": "Unable to remove contact information", - "Remove %(email)s?": "Remove %(email)s?", - "Invalid Email Address": "Invalid Email Address", - "This doesn't appear to be a valid email address": "This doesn't appear to be a valid email address", - "Unable to add email address": "Unable to add email address", - "Add": "Add", - "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.", - "Email Address": "Email Address", - "Remove %(phone)s?": "Remove %(phone)s?", - "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.", - "Phone Number": "Phone Number", - "Cannot add any more widgets": "Cannot add any more widgets", - "The maximum permitted number of widgets have already been added to this room.": "The maximum permitted number of widgets have already been added to this room.", - "Add a widget": "Add a widget", - "Drop File Here": "Drop File Here", - "Drop file here to upload": "Drop file here to upload", - " (unsupported)": " (unsupported)", - "Join as voice or video.": "Join as voice or video.", - "Ongoing conference call%(supportedText)s.": "Ongoing conference call%(supportedText)s.", - "This user has not verified all of their devices.": "This user has not verified all of their devices.", - "You have not verified this user. This user has verified all of their devices.": "You have not verified this user. This user has verified all of their devices.", - "You have verified this user. This user has verified all of their devices.": "You have verified this user. This user has verified all of their devices.", - "Some users in this encrypted room are not verified by you or they have not verified their own devices.": "Some users in this encrypted room are not verified by you or they have not verified their own devices.", - "All users in this encrypted room are verified by you and they have verified their own devices.": "All users in this encrypted room are verified by you and they have verified their own devices.", - "Some devices for this user are not trusted": "Some devices for this user are not trusted", - "All devices for this user are trusted": "All devices for this user are trusted", - "Some devices in this encrypted room are not trusted": "Some devices in this encrypted room are not trusted", - "All devices in this encrypted room are trusted": "All devices in this encrypted room are trusted", - "Edit message": "Edit message", - "This event could not be displayed": "This event could not be displayed", - "%(senderName)s sent an image": "%(senderName)s sent an image", - "%(senderName)s sent a video": "%(senderName)s sent a video", - "%(senderName)s uploaded a file": "%(senderName)s uploaded a file", - "Your key share request has been sent - please check your other devices for key share requests.": "Your key share request has been sent - please check your other devices for key share requests.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "If your other devices do not have the key for this message you will not be able to decrypt them.", - "Key request sent.": "Key request sent.", - "Re-request encryption keys from your other devices.": "Re-request encryption keys from your other devices.", - "This message cannot be decrypted": "This message cannot be decrypted", - "Encrypted by an unverified device": "Encrypted by an unverified device", - "Unencrypted": "Unencrypted", - "Please select the destination room for this message": "Please select the destination room for this message", - "Scroll to bottom of page": "Scroll to bottom of page", - "Close preview": "Close preview", - "device id: ": "device id: ", - "Disinvite": "Disinvite", - "Kick": "Kick", - "Disinvite this user?": "Disinvite this user?", - "Kick this user?": "Kick this user?", - "Failed to kick": "Failed to kick", - "Ban": "Ban", - "Unban this user?": "Unban this user?", - "Ban this user?": "Ban this user?", - "Failed to ban user": "Failed to ban user", - "No recent messages by %(user)s found": "No recent messages by %(user)s found", - "Try scrolling up in the timeline to see if there are any earlier ones.": "Try scrolling up in the timeline to see if there are any earlier ones.", - "Remove recent messages by %(user)s": "Remove recent messages by %(user)s", - "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|other": "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?", - "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|one": "You are about to remove 1 message by %(user)s. This cannot be undone. Do you wish to continue?", - "For a large amount of messages, this might take some time. Please don't refresh your client in the meantime.": "For a large amount of messages, this might take some time. Please don't refresh your client in the meantime.", - "Remove %(count)s messages|other": "Remove %(count)s messages", - "Remove %(count)s messages|one": "Remove 1 message", - "Demote yourself?": "Demote yourself?", - "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.": "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.", - "Demote": "Demote", - "Failed to mute user": "Failed to mute user", - "Failed to toggle moderator status": "Failed to toggle moderator status", - "Deactivate user?": "Deactivate user?", - "Deactivating this user will log them out and prevent them from logging back in. Additionally, they will leave all the rooms they are in. This action cannot be reversed. Are you sure you want to deactivate this user?": "Deactivating this user will log them out and prevent them from logging back in. Additionally, they will leave all the rooms they are in. This action cannot be reversed. Are you sure you want to deactivate this user?", - "Deactivate user": "Deactivate user", - "Failed to deactivate user": "Failed to deactivate user", - "Failed to change power level": "Failed to change power level", - "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.", - "Are you sure?": "Are you sure?", - "No devices with registered encryption keys": "No devices with registered encryption keys", - "Jump to read receipt": "Jump to read receipt", - "Mention": "Mention", - "Invite": "Invite", - "Share Link to User": "Share Link to User", - "User Options": "User Options", - "Direct chats": "Direct chats", - "Remove recent messages": "Remove recent messages", - "Unmute": "Unmute", - "Mute": "Mute", - "Revoke Moderator": "Revoke Moderator", - "Make Moderator": "Make Moderator", - "Admin Tools": "Admin Tools", - "and %(count)s others...|other": "and %(count)s others...", - "and %(count)s others...|one": "and one other...", - "Invite to this room": "Invite to this room", - "Invited": "Invited", - "Filter room members": "Filter room members", - "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (power %(powerLevelNumber)s)", - "Voice call": "Voice call", - "Video call": "Video call", - "Hangup": "Hangup", - "Upload file": "Upload file", - "Send an encrypted reply…": "Send an encrypted reply…", - "Send a reply (unencrypted)…": "Send a reply (unencrypted)…", - "Send an encrypted message…": "Send an encrypted message…", - "Send a message (unencrypted)…": "Send a message (unencrypted)…", - "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", - "Bold": "Bold", - "Italics": "Italics", - "Strikethrough": "Strikethrough", - "Code block": "Code block", - "Quote": "Quote", - "No pinned messages.": "No pinned messages.", - "Loading...": "Loading...", - "Pinned Messages": "Pinned Messages", - "Unpin Message": "Unpin Message", - "Jump to message": "Jump to message", - "%(duration)ss": "%(duration)ss", - "%(duration)sm": "%(duration)sm", - "%(duration)sh": "%(duration)sh", - "%(duration)sd": "%(duration)sd", - "Online for %(duration)s": "Online for %(duration)s", - "Idle for %(duration)s": "Idle for %(duration)s", - "Offline for %(duration)s": "Offline for %(duration)s", - "Unknown for %(duration)s": "Unknown for %(duration)s", - "Online": "Online", - "Idle": "Idle", - "Offline": "Offline", - "Unknown": "Unknown", - "Seen by %(userName)s at %(dateTime)s": "Seen by %(userName)s at %(dateTime)s", - "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Seen by %(displayName)s (%(userName)s) at %(dateTime)s", - "Replying": "Replying", - "Direct Chat": "Direct Chat", - "Room %(name)s": "Room %(name)s", - "Recent rooms": "Recent rooms", - "No rooms to show": "No rooms to show", - "Unnamed room": "Unnamed room", - "World readable": "World readable", - "Guests can join": "Guests can join", - "(~%(count)s results)|other": "(~%(count)s results)", - "(~%(count)s results)|one": "(~%(count)s result)", - "Join Room": "Join Room", - "Settings": "Settings", - "Forget room": "Forget room", - "Search": "Search", - "Share room": "Share room", - "Community Invites": "Community Invites", - "Invites": "Invites", - "Favourites": "Favourites", - "People": "People", - "Start chat": "Start chat", - "Rooms": "Rooms", - "Low priority": "Low priority", - "Historical": "Historical", - "System Alerts": "System Alerts", - "This room": "This room", - "Joining room …": "Joining room …", - "Loading …": "Loading …", - "Rejecting invite …": "Rejecting invite …", - "Join the conversation with an account": "Join the conversation with an account", - "Sign Up": "Sign Up", - "Sign In": "Sign In", - "Loading room preview": "Loading room preview", - "You were kicked from %(roomName)s by %(memberName)s": "You were kicked from %(roomName)s by %(memberName)s", - "Reason: %(reason)s": "Reason: %(reason)s", - "Forget this room": "Forget this room", - "Re-join": "Re-join", - "You were banned from %(roomName)s by %(memberName)s": "You were banned from %(roomName)s by %(memberName)s", - "Something went wrong with your invite to %(roomName)s": "Something went wrong with your invite to %(roomName)s", - "An error (%(errcode)s) was returned while trying to validate your invite. You could try to pass this information on to a room admin.": "An error (%(errcode)s) was returned while trying to validate your invite. You could try to pass this information on to a room admin.", - "unknown error code": "unknown error code", - "You can only join it with a working invite.": "You can only join it with a working invite.", - "Try to join anyway": "Try to join anyway", - "You can still join it because this is a public room.": "You can still join it because this is a public room.", - "Join the discussion": "Join the discussion", - "This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "This invite to %(roomName)s was sent to %(email)s which is not associated with your account", - "Link this email with your account in Settings to receive invites directly in Riot.": "Link this email with your account in Settings to receive invites directly in Riot.", - "This invite to %(roomName)s was sent to %(email)s": "This invite to %(roomName)s was sent to %(email)s", - "Use an identity server in Settings to receive invites directly in Riot.": "Use an identity server in Settings to receive invites directly in Riot.", - "Share this email in Settings to receive invites directly in Riot.": "Share this email in Settings to receive invites directly in Riot.", - "Do you want to chat with %(user)s?": "Do you want to chat with %(user)s?", - " wants to chat": " wants to chat", - "Start chatting": "Start chatting", - "Do you want to join %(roomName)s?": "Do you want to join %(roomName)s?", - " invited you": " invited you", - "Reject": "Reject", - "You're previewing %(roomName)s. Want to join it?": "You're previewing %(roomName)s. Want to join it?", - "%(roomName)s can't be previewed. Do you want to join it?": "%(roomName)s can't be previewed. Do you want to join it?", - "%(roomName)s does not exist.": "%(roomName)s does not exist.", - "This room doesn't exist. Are you sure you're at the right place?": "This room doesn't exist. Are you sure you're at the right place?", - "%(roomName)s is not accessible at this time.": "%(roomName)s is not accessible at this time.", - "Try again later, or ask a room admin to check if you have access.": "Try again later, or ask a room admin to check if you have access.", - "%(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 was returned while trying to access the room. If you think you're seeing this message in error, please submit a bug report.", - "Never lose encrypted messages": "Never lose encrypted messages", - "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.", - "Securely back up your keys to avoid losing them. Learn more.": "Securely back up your keys to avoid losing them. Learn more.", - "Not now": "Not now", - "Don't ask me again": "Don't ask me again", - "Options": "Options", - "%(count)s unread messages including mentions.|other": "%(count)s unread messages including mentions.", - "%(count)s unread messages including mentions.|one": "1 unread mention.", - "%(count)s unread messages.|other": "%(count)s unread messages.", - "%(count)s unread messages.|one": "1 unread message.", - "Unread mentions.": "Unread mentions.", - "Unread messages.": "Unread messages.", - "Add a topic": "Add a topic", - "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.", - "This room has already been upgraded.": "This room has already been upgraded.", - "This room is running room version , which this homeserver has marked as unstable.": "This room is running room version , which this homeserver has marked as unstable.", - "Only room administrators will see this warning": "Only room administrators will see this warning", - "This Room": "This Room", - "All Rooms": "All Rooms", - "Search…": "Search…", - "Server error": "Server error", - "Command error": "Command error", - "Server unavailable, overloaded, or something else went wrong.": "Server unavailable, overloaded, or something else went wrong.", - "Failed to connect to integration manager": "Failed to connect to integration manager", - "You don't currently have any stickerpacks enabled": "You don't currently have any stickerpacks enabled", - "Add some now": "Add some now", - "Stickerpack": "Stickerpack", - "Hide Stickers": "Hide Stickers", - "Show Stickers": "Show Stickers", - "Failed to revoke invite": "Failed to revoke invite", - "Could not revoke the invite. The server may be experiencing a temporary problem or you do not have sufficient permissions to revoke the invite.": "Could not revoke the invite. The server may be experiencing a temporary problem or you do not have sufficient permissions to revoke the invite.", - "Revoke invite": "Revoke invite", - "Invited by %(sender)s": "Invited by %(sender)s", - "Jump to first unread message.": "Jump to first unread message.", - "Error updating main address": "Error updating main address", - "There was an error updating the room's main address. It may not be allowed by the server or a temporary failure occurred.": "There was an error updating the room's main address. It may not be allowed by the server or a temporary failure occurred.", - "Error creating alias": "Error creating alias", - "There was an error creating that alias. It may not be allowed by the server or a temporary failure occurred.": "There was an error creating that alias. It may not be allowed by the server or a temporary failure occurred.", - "Error removing alias": "Error removing alias", - "There was an error removing that alias. It may no longer exist or a temporary error occurred.": "There was an error removing that alias. It may no longer exist or a temporary error occurred.", - "Main address": "Main address", - "not specified": "not specified", - "Remote addresses for this room:": "Remote addresses for this room:", - "Local addresses for this room:": "Local addresses for this room:", - "This room has no local addresses": "This room has no local addresses", - "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", - "Error updating flair": "Error updating flair", - "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.", - "Invalid community ID": "Invalid community ID", - "'%(groupId)s' is not a valid community ID": "'%(groupId)s' is not a valid community ID", - "Showing flair for these communities:": "Showing flair for these communities:", - "This room is not showing flair for any communities": "This room is not showing flair for any communities", - "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", - "Room Name": "Room Name", - "Room Topic": "Room Topic", - "Room avatar": "Room avatar", - "You have enabled URL previews by default.": "You have enabled URL previews by default.", - "You have disabled URL previews by default.": "You have disabled URL previews by default.", - "URL previews are enabled by default for participants in this room.": "URL previews are enabled by default for participants in this room.", - "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", - "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 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.", - "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.": "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.", - "Verify User": "Verify User", - "For extra security, verify this user by checking a one-time code on both of your devices.": "For extra security, verify this user by checking a one-time code on both of your devices.", - "For maximum security, do this in person.": "For maximum security, do this in person.", - "Start Verification": "Start Verification", - "Members": "Members", - "Files": "Files", - "Trusted": "Trusted", - "Not trusted": "Not trusted", - "Hide verified sessions": "Hide verified sessions", - "%(count)s verified sessions|other": "%(count)s verified sessions", - "%(count)s verified sessions|one": "1 verified session", - "Direct message": "Direct message", - "Remove from community": "Remove from community", - "Disinvite this user from community?": "Disinvite this user from community?", - "Remove this user from community?": "Remove this user from community?", - "Failed to withdraw invitation": "Failed to withdraw invitation", - "Failed to remove user from community": "Failed to remove user from community", - "%(role)s in %(roomName)s": "%(role)s in %(roomName)s", - "This client does not support end-to-end encryption.": "This client does not support end-to-end encryption.", - "Messages in this room are not end-to-end encrypted.": "Messages in this room are not end-to-end encrypted.", - "Messages in this room are end-to-end encrypted.": "Messages in this room are end-to-end encrypted.", - "Security": "Security", - "Sunday": "Sunday", - "Monday": "Monday", - "Tuesday": "Tuesday", - "Wednesday": "Wednesday", - "Thursday": "Thursday", - "Friday": "Friday", - "Saturday": "Saturday", - "Today": "Today", - "Yesterday": "Yesterday", - "View Source": "View Source", - "Error decrypting audio": "Error decrypting audio", - "React": "React", - "Reply": "Reply", - "Edit": "Edit", - "Message Actions": "Message Actions", - "Attachment": "Attachment", - "Error decrypting attachment": "Error decrypting attachment", - "Decrypt %(text)s": "Decrypt %(text)s", - "Download %(text)s": "Download %(text)s", - "Invalid file%(extra)s": "Invalid file%(extra)s", - "Error decrypting image": "Error decrypting image", - "Show image": "Show image", - "You have ignored this user, so their message is hidden. Show anyways.": "You have ignored this user, so their message is hidden. Show anyways.", - "You verified %(name)s": "You verified %(name)s", - "You cancelled verifying %(name)s": "You cancelled verifying %(name)s", - "%(name)s cancelled verifying": "%(name)s cancelled verifying", - "You accepted": "You accepted", - "%(name)s accepted": "%(name)s accepted", - "You cancelled": "You cancelled", - "%(name)s cancelled": "%(name)s cancelled", - "%(name)s wants to verify": "%(name)s wants to verify", - "You sent a verification request": "You sent a verification request", - "Error decrypting video": "Error decrypting video", - "Show all": "Show all", - "Reactions": "Reactions", - " reacted with %(content)s": " reacted with %(content)s", - "reacted with %(shortName)s": "reacted with %(shortName)s", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s changed the avatar for %(roomName)s", - "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removed the room avatar.", - "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s changed the room avatar to ", - "This room is a continuation of another conversation.": "This room is a continuation of another conversation.", - "Click here to see older messages.": "Click here to see older messages.", - "Copied!": "Copied!", - "Failed to copy": "Failed to copy", - "Add an Integration": "Add an Integration", - "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?": "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?", - "Edited at %(date)s. Click to view edits.": "Edited at %(date)s. Click to view edits.", - "edited": "edited", - "Removed or unknown message type": "Removed or unknown message type", - "Message removed by %(userId)s": "Message removed by %(userId)s", - "Message removed": "Message removed", - "Failed to load group members": "Failed to load group members", - "Filter community members": "Filter community members", - "Invite to this community": "Invite to this community", - "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Are you sure you want to remove '%(roomName)s' from %(groupId)s?", - "Removing a room from the community will also remove it from the community page.": "Removing a room from the community will also remove it from the community page.", - "Failed to remove room from community": "Failed to remove room from community", - "Failed to remove '%(roomName)s' from %(groupId)s": "Failed to remove '%(roomName)s' from %(groupId)s", - "Something went wrong!": "Something went wrong!", - "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "The visibility of '%(roomName)s' in %(groupId)s could not be updated.", - "Visibility in Room List": "Visibility in Room List", - "Visible to everyone": "Visible to everyone", - "Only visible to community members": "Only visible to community members", - "Add rooms to this community": "Add rooms to this community", - "Filter community rooms": "Filter community rooms", - "Something went wrong when trying to get your communities.": "Something went wrong when trying to get your communities.", - "Display your community flair in rooms configured to show it.": "Display your community flair in rooms configured to show it.", - "You're not currently a member of any communities.": "You're not currently a member of any communities.", - "Please help improve Riot.im by sending anonymous usage data. This will use a cookie (please see our Cookie Policy).": "Please help improve Riot.im by sending anonymous usage data. This will use a cookie (please see our Cookie Policy).", - "Please help improve Riot.im by sending anonymous usage data. This will use a cookie.": "Please help improve Riot.im by sending anonymous usage data. This will use a cookie.", - "Yes, I want to help!": "Yes, I want to help!", - "You are not receiving desktop notifications": "You are not receiving desktop notifications", - "Enable them now": "Enable them now", - "What's New": "What's New", - "Update": "Update", - "What's new?": "What's new?", - "A new version of Riot is available.": "A new version of Riot is available.", - "To return to your account in future you need to set a password": "To return to your account in future you need to set a password", - "Set Password": "Set Password", - "Please contact your service administrator to get this limit increased.": "Please contact your service administrator to get this limit increased.", - "This homeserver has hit its Monthly Active User limit so some users will not be able to log in.": "This homeserver has hit its Monthly Active User limit so some users will not be able to log in.", - "This homeserver has exceeded one of its resource limits so some users will not be able to log in.": "This homeserver has exceeded one of its resource limits so some users will not be able to log in.", - "Error encountered (%(errorDetail)s).": "Error encountered (%(errorDetail)s).", - "Checking for an update...": "Checking for an update...", - "No update available.": "No update available.", - "Downloading update...": "Downloading update...", - "Frequently Used": "Frequently Used", - "Smileys & People": "Smileys & People", - "Animals & Nature": "Animals & Nature", - "Food & Drink": "Food & Drink", - "Activities": "Activities", - "Travel & Places": "Travel & Places", - "Objects": "Objects", - "Symbols": "Symbols", - "Flags": "Flags", - "Quick Reactions": "Quick Reactions", - "Cancel search": "Cancel search", - "Unknown Address": "Unknown Address", - "Any of the following data may be shared:": "Any of the following data may be shared:", - "Your display name": "Your display name", - "Your avatar URL": "Your avatar URL", - "Your user ID": "Your user ID", - "Your theme": "Your theme", - "Riot URL": "Riot URL", - "Room ID": "Room ID", - "Widget ID": "Widget ID", - "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "Using this widget may share data with %(widgetDomain)s & your Integration Manager.", - "Using this widget may share data with %(widgetDomain)s.": "Using this widget may share data with %(widgetDomain)s.", - "Widgets do not use message encryption.": "Widgets do not use message encryption.", - "Widget added by": "Widget added by", - "This widget may use cookies.": "This widget may use cookies.", - "Delete Widget": "Delete Widget", - "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?", - "Delete widget": "Delete widget", - "Failed to remove widget": "Failed to remove widget", - "An error ocurred whilst trying to remove the widget from the room": "An error ocurred whilst trying to remove the widget from the room", - "Minimize apps": "Minimize apps", - "Maximize apps": "Maximize apps", - "Popout widget": "Popout widget", - "More options": "More options", - "Create new room": "Create new room", - "Unblacklist": "Unblacklist", - "Blacklist": "Blacklist", - "Unverify": "Unverify", - "Verify...": "Verify...", - "Join": "Join", - "No results": "No results", - "Yes": "Yes", - "No": "No", - "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", - "Communities": "Communities", - "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", - "Language Dropdown": "Language Dropdown", - "Manage Integrations": "Manage Integrations", - "%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s", - "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)sjoined %(count)s times", - "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)sjoined", - "%(oneUser)sjoined %(count)s times|other": "%(oneUser)sjoined %(count)s times", - "%(oneUser)sjoined %(count)s times|one": "%(oneUser)sjoined", - "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)sleft %(count)s times", - "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)sleft", - "%(oneUser)sleft %(count)s times|other": "%(oneUser)sleft %(count)s times", - "%(oneUser)sleft %(count)s times|one": "%(oneUser)sleft", - "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)sjoined and left %(count)s times", - "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)sjoined and left", - "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)sjoined and left %(count)s times", - "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)sjoined and left", - "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)sleft and rejoined %(count)s times", - "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)sleft and rejoined", - "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)sleft and rejoined %(count)s times", - "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)sleft and rejoined", - "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)srejected their invitations %(count)s times", - "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)srejected their invitations", - "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)srejected their invitation %(count)s times", - "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)srejected their invitation", - "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)shad their invitations withdrawn %(count)s times", - "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)shad their invitations withdrawn", - "%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)shad their invitation withdrawn %(count)s times", - "%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)shad their invitation withdrawn", - "were invited %(count)s times|other": "were invited %(count)s times", - "were invited %(count)s times|one": "were invited", - "was invited %(count)s times|other": "was invited %(count)s times", - "was invited %(count)s times|one": "was invited", - "were banned %(count)s times|other": "were banned %(count)s times", - "were banned %(count)s times|one": "were banned", - "was banned %(count)s times|other": "was banned %(count)s times", - "was banned %(count)s times|one": "was banned", - "were unbanned %(count)s times|other": "were unbanned %(count)s times", - "were unbanned %(count)s times|one": "were unbanned", - "was unbanned %(count)s times|other": "was unbanned %(count)s times", - "was unbanned %(count)s times|one": "was unbanned", - "were kicked %(count)s times|other": "were kicked %(count)s times", - "were kicked %(count)s times|one": "were kicked", - "was kicked %(count)s times|other": "was kicked %(count)s times", - "was kicked %(count)s times|one": "was kicked", - "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)schanged their name %(count)s times", - "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)schanged their name", - "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)schanged their name %(count)s times", - "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)schanged their name", - "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)schanged their avatar %(count)s times", - "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)schanged their avatar", - "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)schanged their avatar %(count)s times", - "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)schanged their avatar", - "%(severalUsers)smade no changes %(count)s times|other": "%(severalUsers)smade no changes %(count)s times", - "%(severalUsers)smade no changes %(count)s times|one": "%(severalUsers)smade no changes", - "%(oneUser)smade no changes %(count)s times|other": "%(oneUser)smade no changes %(count)s times", - "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)smade no changes", - "Power level": "Power level", - "Custom level": "Custom level", - "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.", - "In reply to ": "In reply to ", - "Room alias": "Room alias", - "e.g. my-room": "e.g. my-room", - "Some characters not allowed": "Some characters not allowed", - "Please provide a room alias": "Please provide a room alias", - "This alias is available to use": "This alias is available to use", - "This alias is already in use": "This alias is already in use", - "Room directory": "Room directory", - "And %(count)s more...|other": "And %(count)s more...", - "ex. @bob:example.com": "ex. @bob:example.com", - "Add User": "Add User", - "Matrix ID": "Matrix ID", - "Matrix Room ID": "Matrix Room ID", - "email address": "email address", - "That doesn't look like a valid email address": "That doesn't look like a valid email address", - "You have entered an invalid address.": "You have entered an invalid address.", - "Try using one of the following valid address types: %(validTypesList)s.": "Try using one of the following valid address types: %(validTypesList)s.", - "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.", - "Use an identity server to invite by email. Manage in Settings.": "Use an identity server to invite by email. Manage in Settings.", - "The following users may not exist": "The following users may not exist", - "Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?": "Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?", - "Invite anyway and never warn me again": "Invite anyway and never warn me again", - "Invite anyway": "Invite anyway", - "Close dialog": "Close dialog", - "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.", - "Preparing to send logs": "Preparing to send logs", - "Logs sent": "Logs sent", - "Thank you!": "Thank you!", - "Failed to send logs: ": "Failed to send logs: ", - "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.": "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.", - "Before submitting logs, you must create a GitHub issue to describe your problem.": "Before submitting logs, you must create a GitHub issue to describe your problem.", - "GitHub issue": "GitHub issue", - "Notes": "Notes", - "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.": "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.", - "Send logs": "Send logs", - "Unable to load commit detail: %(msg)s": "Unable to load commit detail: %(msg)s", - "Unavailable": "Unavailable", - "Changelog": "Changelog", - "You cannot delete this message. (%(code)s)": "You cannot delete this message. (%(code)s)", - "Removing…": "Removing…", - "Confirm Removal": "Confirm Removal", - "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.", - "Clear all data on this device?": "Clear all data on this device?", - "Clearing all data from this device is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Clearing all data from this device is permanent. Encrypted messages will be lost unless their keys have been backed up.", - "Clear all data": "Clear all data", - "Community IDs cannot be empty.": "Community IDs cannot be empty.", - "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Community IDs may only contain characters a-z, 0-9, or '=_-./'", - "Something went wrong whilst creating your community": "Something went wrong whilst creating your community", - "Create Community": "Create Community", - "Community Name": "Community Name", - "Example": "Example", - "Community ID": "Community ID", - "example": "example", - "Create": "Create", - "Please enter a name for the room": "Please enter a name for the room", - "Set a room alias to easily share your room with other people.": "Set a room alias to easily share your room with other people.", - "This room is private, and can only be joined by invitation.": "This room is private, and can only be joined by invitation.", - "Create a public room": "Create a public room", - "Create a private room": "Create a private room", - "Name": "Name", - "Topic (optional)": "Topic (optional)", - "Make this room public": "Make this room public", - "Hide advanced": "Hide advanced", - "Show advanced": "Show advanced", - "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)", - "Create Room": "Create Room", - "Sign out": "Sign out", - "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 Riot to do this": "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 Riot to do this", - "You've previously used a newer version of Riot on %(host)s. To use this version again with end to end encryption, you will need to sign out and back in again. ": "You've previously used a newer version of Riot on %(host)s. To use this version again with end to end encryption, you will need to sign out and back in again. ", - "Incompatible Database": "Incompatible Database", - "Continue With Encryption Disabled": "Continue With Encryption Disabled", - "Unknown error": "Unknown error", - "Incorrect password": "Incorrect password", - "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.": "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.", - "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.": "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.", - "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.": "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.", - "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)": "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)", - "To continue, please enter your password:": "To continue, please enter your password:", - "Verify device": "Verify device", - "Use Legacy Verification (for older clients)": "Use Legacy Verification (for older clients)", - "Verify by comparing a short text string.": "Verify by comparing a short text string.", - "Begin Verifying": "Begin Verifying", - "Waiting for partner to accept...": "Waiting for partner to accept...", - "Nothing appearing? Not all clients support interactive verification yet. .": "Nothing appearing? Not all clients support interactive verification yet. .", - "Waiting for %(userId)s to confirm...": "Waiting for %(userId)s to confirm...", - "To verify that this device can be trusted, please check that the key you see in User Settings on that device matches the key below:": "To verify that this device can be trusted, please check that the key you see in User Settings on that device matches the key below:", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:", - "Use two-way text verification": "Use two-way text verification", - "Device name": "Device name", - "Device ID": "Device ID", - "Device key": "Device key", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.", - "I verify that the keys match": "I verify that the keys match", - "Back": "Back", - "Send Custom Event": "Send Custom Event", - "You must specify an event type!": "You must specify an event type!", - "Event sent!": "Event sent!", - "Failed to send custom event.": "Failed to send custom event.", - "Event Type": "Event Type", - "State Key": "State Key", - "Event Content": "Event Content", - "Send Account Data": "Send Account Data", - "Filter results": "Filter results", - "Explore Room State": "Explore Room State", - "Explore Account Data": "Explore Account Data", - "View Servers in Room": "View Servers in Room", - "Toolbox": "Toolbox", - "Developer Tools": "Developer Tools", - "An error has occurred.": "An error has occurred.", - "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.", - "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.", - "Waiting for partner to confirm...": "Waiting for partner to confirm...", - "Incoming Verification Request": "Incoming Verification Request", - "Integrations are disabled": "Integrations are disabled", - "Enable 'Manage Integrations' in Settings to do this.": "Enable 'Manage Integrations' in Settings to do this.", - "Integrations not allowed": "Integrations not allowed", - "Your Riot doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Your Riot doesn't allow you to use an Integration Manager to do this. Please contact an admin.", - "Failed to invite the following users to chat: %(csvUsers)s": "Failed to invite the following users to chat: %(csvUsers)s", - "We couldn't create your DM. Please check the users you want to invite and try again.": "We couldn't create your DM. Please check the users you want to invite and try again.", - "Something went wrong trying to invite the users.": "Something went wrong trying to invite the users.", - "We couldn't invite those users. Please check the users you want to invite and try again.": "We couldn't invite those users. Please check the users you want to invite and try again.", - "Failed to find the following users": "Failed to find the following users", - "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s", - "Recent Conversations": "Recent Conversations", - "Suggestions": "Suggestions", - "Recently Direct Messaged": "Recently Direct Messaged", - "Show more": "Show more", - "Direct Messages": "Direct Messages", - "If you can't find someone, ask them for their username, or share your username (%(userId)s) or profile link.": "If you can't find someone, ask them for their username, or share your username (%(userId)s) or profile link.", - "Go": "Go", - "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.": "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "You added a new device '%(displayName)s', which is requesting encryption keys.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Your unverified device '%(displayName)s' is requesting encryption keys.", - "Start verification": "Start verification", - "Share without verifying": "Share without verifying", - "Ignore request": "Ignore request", - "Loading device info...": "Loading device info...", - "Encryption key request": "Encryption key request", - "You've previously used Riot 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, Riot needs to resync your account.": "You've previously used Riot 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, Riot needs to resync your account.", - "If the other version of Riot is still open in another tab, please close it as using Riot on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "If the other version of Riot is still open in another tab, please close it as using Riot on the same host with both lazy loading enabled and disabled simultaneously will cause issues.", - "Incompatible local cache": "Incompatible local cache", - "Clear cache and resync": "Clear cache and resync", - "Riot now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!": "Riot now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!", - "Updating Riot": "Updating Riot", - "I don't want my encrypted messages": "I don't want my encrypted messages", - "Manually export keys": "Manually export keys", - "You'll lose access to your encrypted messages": "You'll lose access to your encrypted messages", - "Are you sure you want to sign out?": "Are you sure you want to sign out?", - "Your homeserver doesn't seem to support this feature.": "Your homeserver doesn't seem to support this feature.", - "Message edits": "Message edits", - "If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.": "If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.", - "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.", - "Report bugs & give feedback": "Report bugs & give feedback", - "Please fill why you're reporting.": "Please fill why you're reporting.", - "Report Content to Your Homeserver Administrator": "Report Content to Your Homeserver Administrator", - "Reporting this message will send its unique 'event ID' to the administrator of your homeserver. If messages in this room are encrypted, your homeserver administrator will not be able to read the message text or view any files or images.": "Reporting this message will send its unique 'event ID' to the administrator of your homeserver. If messages in this room are encrypted, your homeserver administrator will not be able to read the message text or view any files or images.", - "Send report": "Send report", - "Room Settings - %(roomName)s": "Room Settings - %(roomName)s", - "Failed to upgrade room": "Failed to upgrade room", - "The room upgrade could not be completed": "The room upgrade could not be completed", - "Upgrade this room to version %(version)s": "Upgrade this room to version %(version)s", - "Upgrade Room Version": "Upgrade Room Version", - "Upgrading this room requires closing down the current instance of the room and creating a new room in its place. To give room members the best possible experience, we will:": "Upgrading this room requires closing down the current instance of the room and creating a new room in its place. To give room members the best possible experience, we will:", - "Create a new room with the same name, description and avatar": "Create a new room with the same name, description and avatar", - "Update any local room aliases to point to the new room": "Update any local room aliases to point to the new room", - "Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Stop users from speaking in the old version of the room, and post a message advising users to move to the new room", - "Put a link back to the old room at the start of the new room so people can see old messages": "Put a link back to the old room at the start of the new room so people can see old messages", - "Automatically invite users": "Automatically invite users", - "Upgrade private room": "Upgrade private room", - "Upgrade public room": "Upgrade public room", - "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.": "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.", - "This usually only affects how the room is processed on the server. If you're having problems with your Riot, please report a bug.": "This usually only affects how the room is processed on the server. If you're having problems with your Riot, please report a bug.", - "You'll upgrade this room from to .": "You'll upgrade this room from to .", - "Upgrade": "Upgrade", - "Sign out and remove encryption keys?": "Sign out and remove encryption keys?", - "Clear Storage and Sign Out": "Clear Storage and Sign Out", - "Send Logs": "Send Logs", - "Refresh": "Refresh", - "Unable to restore session": "Unable to restore session", - "We encountered an error trying to restore your previous session.": "We encountered an error trying to restore your previous session.", - "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.", - "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.", - "Verification Pending": "Verification Pending", - "Please check your email and click on the link it contains. Once this is done, click continue.": "Please check your email and click on the link it contains. Once this is done, click continue.", - "Email address": "Email address", - "This will allow you to reset your password and receive notifications.": "This will allow you to reset your password and receive notifications.", - "Skip": "Skip", - "A username can only contain lower case letters, numbers and '=_-./'": "A username can only contain lower case letters, numbers and '=_-./'", - "Username not available": "Username not available", - "Username invalid: %(errMessage)s": "Username invalid: %(errMessage)s", - "An error occurred: %(error_string)s": "An error occurred: %(error_string)s", - "Checking...": "Checking...", - "Username available": "Username available", - "To get started, please pick a username!": "To get started, please pick a username!", - "This will be your account name on the homeserver, or you can pick a different server.": "This will be your account name on the homeserver, or you can pick a different server.", - "If you already have a Matrix account you can log in instead.": "If you already have a Matrix account you can log in instead.", - "You have successfully set a password!": "You have successfully set a password!", - "You have successfully set a password and an email address!": "You have successfully set a password and an email address!", - "You can now return to your account after signing out, and sign in on other devices.": "You can now return to your account after signing out, and sign in on other devices.", - "Remember, you can always set an email address in user settings if you change your mind.": "Remember, you can always set an email address in user settings if you change your mind.", - "(HTTP status %(httpStatus)s)": "(HTTP status %(httpStatus)s)", - "Please set a password!": "Please set a password!", - "This will allow you to return to your account after signing out, and sign in on other devices.": "This will allow you to return to your account after signing out, and sign in on other devices.", - "Share Room": "Share Room", - "Link to most recent message": "Link to most recent message", - "Share User": "Share User", - "Share Community": "Share Community", - "Share Room Message": "Share Room Message", - "Link to selected message": "Link to selected message", - "COPY": "COPY", - "Command Help": "Command Help", - "To help us prevent this in future, please send us logs.": "To help us prevent this in future, please send us logs.", - "Missing session data": "Missing session data", - "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.", - "Your browser likely removed this data when running low on disk space.": "Your browser likely removed this data when running low on disk space.", - "Integration Manager": "Integration Manager", - "Find others by phone or email": "Find others by phone or email", - "Be found by phone or email": "Be found by phone or email", - "Use bots, bridges, widgets and sticker packs": "Use bots, bridges, widgets and sticker packs", - "Terms of Service": "Terms of Service", - "To continue you need to accept the terms of this service.": "To continue you need to accept the terms of this service.", - "Service": "Service", - "Summary": "Summary", - "Document": "Document", - "Next": "Next", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.", - "Room contains unknown devices": "Room contains unknown devices", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contains devices that you haven't seen before.", - "Unknown devices": "Unknown devices", - "Upload files (%(current)s of %(total)s)": "Upload files (%(current)s of %(total)s)", - "Upload files": "Upload files", - "Upload all": "Upload all", - "This file is too large to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.": "This file is too large to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.", - "These files are too large to upload. The file size limit is %(limit)s.": "These files are too large to upload. The file size limit is %(limit)s.", - "Some files are too large to be uploaded. The file size limit is %(limit)s.": "Some files are too large to be uploaded. The file size limit is %(limit)s.", - "Upload %(count)s other files|other": "Upload %(count)s other files", - "Upload %(count)s other files|one": "Upload %(count)s other file", - "Cancel All": "Cancel All", - "Upload Error": "Upload Error", - "A widget would like to verify your identity": "A widget would like to verify your identity", - "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.": "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.", - "Remember my selection for this widget": "Remember my selection for this widget", - "Allow": "Allow", - "Deny": "Deny", - "Enter secret storage passphrase": "Enter secret storage passphrase", - "Unable to access secret storage. Please verify that you entered the correct passphrase.": "Unable to access secret storage. Please verify that you entered the correct passphrase.", - "Warning: You should only access secret storage from a trusted computer.": "Warning: You should only access secret storage from a trusted computer.", - "Access your secure message history and your cross-signing identity for verifying other devices by entering your passphrase.": "Access your secure message history and your cross-signing identity for verifying other devices by entering your passphrase.", - "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.": "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.", - "Enter secret storage recovery key": "Enter secret storage recovery key", - "This looks like a valid recovery key!": "This looks like a valid recovery key!", - "Unable to access secret storage. Please verify that you entered the correct recovery key.": "Unable to access secret storage. Please verify that you entered the correct recovery key.", - "Not a valid recovery key": "Not a valid recovery key", - "Access your secure message history and your cross-signing identity for verifying other devices by entering your recovery key.": "Access your secure message history and your cross-signing identity for verifying other devices by entering your recovery key.", - "If you've forgotten your recovery key you can .": "If you've forgotten your recovery key you can .", - "Unable to load backup status": "Unable to load backup status", - "Recovery Key Mismatch": "Recovery Key Mismatch", - "Backup could not be decrypted with this key: please verify that you entered the correct recovery key.": "Backup could not be decrypted with this key: please verify that you entered the correct recovery key.", - "Incorrect Recovery Passphrase": "Incorrect Recovery Passphrase", - "Backup could not be decrypted with this passphrase: please verify that you entered the correct recovery passphrase.": "Backup could not be decrypted with this passphrase: please verify that you entered the correct recovery passphrase.", - "Unable to restore backup": "Unable to restore backup", - "No backup found!": "No backup found!", - "Backup Restored": "Backup Restored", - "Failed to decrypt %(failedCount)s sessions!": "Failed to decrypt %(failedCount)s sessions!", - "Restored %(sessionCount)s session keys": "Restored %(sessionCount)s session keys", - "Enter Recovery Passphrase": "Enter Recovery Passphrase", - "Warning: you should only set up key backup from a trusted computer.": "Warning: you should only set up key backup from a trusted computer.", - "Access your secure message history and set up secure messaging by entering your recovery passphrase.": "Access your secure message history and set up secure messaging by entering your recovery passphrase.", - "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options": "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options", - "Enter Recovery Key": "Enter Recovery Key", - "Warning: You should only set up key backup from a trusted computer.": "Warning: You should only set up key backup from a trusted computer.", - "Access your secure message history and set up secure messaging by entering your recovery key.": "Access your secure message history and set up secure messaging by entering your recovery key.", - "If you've forgotten your recovery key you can ": "If you've forgotten your recovery key you can ", - "Private Chat": "Private Chat", - "Public Chat": "Public Chat", - "Custom": "Custom", - "Alias (optional)": "Alias (optional)", - "Reject invitation": "Reject invitation", - "Are you sure you want to reject the invitation?": "Are you sure you want to reject the invitation?", - "Unable to reject invite": "Unable to reject invite", - "Resend": "Resend", - "Resend edit": "Resend edit", - "Resend %(unsentCount)s reaction(s)": "Resend %(unsentCount)s reaction(s)", - "Resend removal": "Resend removal", - "Cancel Sending": "Cancel Sending", - "Forward Message": "Forward Message", - "Pin Message": "Pin Message", - "View Decrypted Source": "View Decrypted Source", - "Unhide Preview": "Unhide Preview", - "Share Permalink": "Share Permalink", - "Share Message": "Share Message", - "Source URL": "Source URL", - "Collapse Reply Thread": "Collapse Reply Thread", - "End-to-end encryption information": "End-to-end encryption information", - "Report Content": "Report Content", - "Failed to set Direct Message status of room": "Failed to set Direct Message status of room", - "Failed to forget room %(errCode)s": "Failed to forget room %(errCode)s", - "Notification settings": "Notification settings", - "All messages (noisy)": "All messages (noisy)", - "All messages": "All messages", - "Mentions only": "Mentions only", - "Leave": "Leave", - "Forget": "Forget", - "Favourite": "Favourite", - "Low Priority": "Low Priority", - "Clear status": "Clear status", - "Update status": "Update status", - "Set status": "Set status", - "Set a new status...": "Set a new status...", - "View Community": "View Community", - "Hide": "Hide", - "Home": "Home", - "Sign in": "Sign in", - "Help": "Help", - "Reload": "Reload", - "Take picture": "Take picture", - "Remove for everyone": "Remove for everyone", - "Remove for me": "Remove for me", - "User Status": "User Status", - "powered by Matrix": "powered by Matrix", - "This homeserver would like to make sure you are not a robot.": "This homeserver would like to make sure you are not a robot.", - "Country Dropdown": "Country Dropdown", - "Custom Server Options": "Custom Server Options", - "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use this app with an existing Matrix account on a different homeserver.": "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use this app with an existing Matrix account on a different homeserver.", - "To continue, please enter your password.": "To continue, please enter your password.", - "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.": "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.", - "Please review and accept all of the homeserver's policies": "Please review and accept all of the homeserver's policies", - "Please review and accept the policies of this homeserver:": "Please review and accept the policies of this homeserver:", - "An email has been sent to %(emailAddress)s": "An email has been sent to %(emailAddress)s", - "Please check your email to continue registration.": "Please check your email to continue registration.", - "Token incorrect": "Token incorrect", - "A text message has been sent to %(msisdn)s": "A text message has been sent to %(msisdn)s", - "Please enter the code it contains:": "Please enter the code it contains:", - "Code": "Code", - "Submit": "Submit", - "Start authentication": "Start authentication", - "Unable to validate homeserver/identity server": "Unable to validate homeserver/identity server", - "Your Modular server": "Your Modular server", - "Enter the location of your Modular homeserver. It may use your own domain name or be a subdomain of modular.im.": "Enter the location of your Modular homeserver. It may use your own domain name or be a subdomain of modular.im.", - "Server Name": "Server Name", - "The email field must not be blank.": "The email field must not be blank.", - "The username field must not be blank.": "The username field must not be blank.", - "The phone number field must not be blank.": "The phone number field must not be blank.", - "The password field must not be blank.": "The password field must not be blank.", - "Email": "Email", - "Username": "Username", - "Phone": "Phone", - "Not sure of your password? Set a new one": "Not sure of your password? Set a new one", - "Sign in with": "Sign in with", - "No identity server is configured so you cannot add an email address in order to reset your password in the future.": "No identity server is configured so you cannot add an email address in order to reset your password in the future.", - "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "If you don't specify an email address, you won't be able to reset your password. Are you sure?", - "Use an email address to recover your account": "Use an email address to recover your account", - "Enter email address (required on this homeserver)": "Enter email address (required on this homeserver)", - "Doesn't look like a valid email address": "Doesn't look like a valid email address", - "Enter password": "Enter password", - "Password is allowed, but unsafe": "Password is allowed, but unsafe", - "Nice, strong password!": "Nice, strong password!", - "Keep going...": "Keep going...", - "Passwords don't match": "Passwords don't match", - "Other users can invite you to rooms using your contact details": "Other users can invite you to rooms using your contact details", - "Enter phone number (required on this homeserver)": "Enter phone number (required on this homeserver)", - "Doesn't look like a valid phone number": "Doesn't look like a valid phone number", - "Use lowercase letters, numbers, dashes and underscores only": "Use lowercase letters, numbers, dashes and underscores only", - "Enter username": "Enter username", - "Email (optional)": "Email (optional)", - "Confirm": "Confirm", - "Phone (optional)": "Phone (optional)", - "Create your Matrix account on %(serverName)s": "Create your Matrix account on %(serverName)s", - "Create your Matrix account on ": "Create your Matrix account on ", - "Set an email for account recovery. Use email or phone to optionally be discoverable by existing contacts.": "Set an email for account recovery. Use email or phone to optionally be discoverable by existing contacts.", - "Set an email for account recovery. Use email to optionally be discoverable by existing contacts.": "Set an email for account recovery. Use email to optionally be discoverable by existing contacts.", - "Enter your custom homeserver URL What does this mean?": "Enter your custom homeserver URL What does this mean?", - "Homeserver URL": "Homeserver URL", - "Enter your custom identity server URL What does this mean?": "Enter your custom identity server URL What does this mean?", - "Identity Server URL": "Identity Server URL", - "Other servers": "Other servers", - "Free": "Free", - "Join millions for free on the largest public server": "Join millions for free on the largest public server", - "Premium": "Premium", - "Premium hosting for organisations Learn more": "Premium hosting for organisations Learn more", - "Find other public servers or use a custom server": "Find other public servers or use a custom server", - "Sign in to your Matrix account on %(serverName)s": "Sign in to your Matrix account on %(serverName)s", - "Sign in to your Matrix account on ": "Sign in to your Matrix account on ", - "Sorry, your browser is not able to run Riot.": "Sorry, your browser is not able to run Riot.", - "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.", - "Please install Chrome, Firefox, or Safari for the best experience.": "Please install Chrome, Firefox, or Safari for the best experience.", - "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!": "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!", - "I understand the risks and wish to continue": "I understand the risks and wish to continue", - "Couldn't load page": "Couldn't load page", - "You must register to use this functionality": "You must register to use this functionality", - "You must join the room to see its files": "You must join the room to see its files", - "There are no visible files in this room": "There are no visible files in this room", - "

      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 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", - "Add rooms to the community summary": "Add rooms to the community summary", - "Which rooms would you like to add to this summary?": "Which rooms would you like to add to this summary?", - "Add to summary": "Add to summary", - "Failed to add the following rooms to the summary of %(groupId)s:": "Failed to add the following rooms to the summary of %(groupId)s:", - "Add a Room": "Add a Room", - "Failed to remove the room from the summary of %(groupId)s": "Failed to remove the room from the summary of %(groupId)s", - "The room '%(roomName)s' could not be removed from the summary.": "The room '%(roomName)s' could not be removed from the summary.", - "Add users to the community summary": "Add users to the community summary", - "Who would you like to add to this summary?": "Who would you like to add to this summary?", - "Failed to add the following users to the summary of %(groupId)s:": "Failed to add the following users to the summary of %(groupId)s:", - "Add a User": "Add a User", - "Failed to remove a user from the summary of %(groupId)s": "Failed to remove a user from the summary of %(groupId)s", - "The user '%(displayName)s' could not be removed from the summary.": "The user '%(displayName)s' could not be removed from the summary.", - "Failed to upload image": "Failed to upload image", - "Failed to update community": "Failed to update community", - "Unable to accept invite": "Unable to accept invite", - "Unable to join community": "Unable to join community", - "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.", - "Leave Community": "Leave Community", - "Leave %(groupName)s?": "Leave %(groupName)s?", - "Unable to leave community": "Unable to leave community", - "Community Settings": "Community Settings", - "Want more than a community? Get your own server": "Want more than a community? Get your own server", - "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.", - "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.", - "Featured Rooms:": "Featured Rooms:", - "Featured Users:": "Featured Users:", - "%(inviter)s has invited you to join this community": "%(inviter)s has invited you to join this community", - "Join this community": "Join this community", - "Leave this community": "Leave this community", - "You are an administrator of this community": "You are an administrator of this community", - "You are a member of this community": "You are a member of this community", - "Who can join this community?": "Who can join this community?", - "Everyone": "Everyone", - "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!": "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!", - "Long Description (HTML)": "Long Description (HTML)", - "Upload avatar": "Upload avatar", - "Description": "Description", - "Community %(groupId)s not found": "Community %(groupId)s not found", - "This homeserver does not support communities": "This homeserver does not support communities", - "Failed to load %(groupId)s": "Failed to load %(groupId)s", - "Explore": "Explore", - "Filter": "Filter", - "Filter rooms…": "Filter rooms…", - "Failed to reject invitation": "Failed to reject invitation", - "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 room '%(roomName)s'?": "Are you sure you want to leave the room '%(roomName)s'?", - "Failed to leave room": "Failed to leave room", - "Can't leave Server Notices room": "Can't leave Server Notices room", - "This room is used for important messages from the Homeserver, so you cannot leave it.": "This room is used for important messages from the Homeserver, so you cannot leave it.", - "Signed Out": "Signed Out", - "For security, this session has been signed out. Please sign in again.": "For security, this session has been signed out. Please sign in again.", - "Terms and Conditions": "Terms and Conditions", - "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.", - "Review terms and conditions": "Review terms and conditions", - "Old cryptography data detected": "Old cryptography data detected", - "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.", - "Verification Request": "Verification Request", - "Logout": "Logout", - "%(creator)s created and configured the room.": "%(creator)s created and configured the room.", - "Your Communities": "Your Communities", - "Did you know: you can use communities to filter your Riot.im experience!": "Did you know: you can use communities to filter your Riot.im experience!", - "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.", - "Error whilst fetching joined communities": "Error whilst fetching joined communities", - "Create a new community": "Create a new community", - "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.", - "You have no visible notifications": "You have no visible notifications", - "Riot failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.": "Riot failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.", - "Riot failed to get the public room list.": "Riot failed to get the public room list.", - "The homeserver may be unavailable or overloaded.": "The homeserver may be unavailable or overloaded.", - "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Delete the room alias %(alias)s and remove %(name)s from the directory?", - "Remove %(name)s from the directory?": "Remove %(name)s from the directory?", - "Remove from Directory": "Remove from Directory", - "remove %(name)s from the directory.": "remove %(name)s from the directory.", - "delete the alias.": "delete the alias.", - "The server may be unavailable or overloaded": "The server may be unavailable or overloaded", - "Unable to join network": "Unable to join network", - "Riot does not know how to join a room on this network": "Riot does not know how to join a room on this network", - "Room not found": "Room not found", - "Couldn't find a matching Matrix room": "Couldn't find a matching Matrix room", - "Fetching third party location failed": "Fetching third party location failed", - "Unable to look up room ID from server": "Unable to look up room ID from server", - "Preview": "Preview", - "View": "View", - "Find a room…": "Find a room…", - "Find a room… (e.g. %(exampleRoom)s)": "Find a room… (e.g. %(exampleRoom)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.", - "Explore rooms": "Explore rooms", - "Message not sent due to unknown devices being present": "Message not sent due to unknown devices being present", - "Show devices, send anyway or cancel.": "Show devices, send anyway or cancel.", - "You can't send any messages until you review and agree to our terms and conditions.": "You can't send any messages until you review and agree to our terms and conditions.", - "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.": "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.", - "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.": "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.", - "%(count)s of your messages have not been sent.|other": "Some of your messages have not been sent.", - "%(count)s of your messages have not been sent.|one": "Your message was not sent.", - "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Resend all or cancel all now. You can also select individual messages to resend or cancel.", - "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Resend message or cancel message now.", - "Connectivity to the server has been lost.": "Connectivity to the server has been lost.", - "Sent messages will be stored until your connection has returned.": "Sent messages will be stored until your connection has returned.", - "Active call": "Active call", - "There's no one else here! Would you like to invite others or stop warning about the empty room?": "There's no one else here! Would you like to invite others or stop warning about the empty room?", - "Jump to first unread room.": "Jump to first unread room.", - "Jump to first invite.": "Jump to first invite.", - "Add room": "Add room", - "You seem to be uploading files, are you sure you want to quit?": "You seem to be uploading files, are you sure you want to quit?", - "You seem to be in a call, are you sure you want to quit?": "You seem to be in a call, are you sure you want to quit?", - "Search failed": "Search failed", - "Server may be unavailable, overloaded, or search timed out :(": "Server may be unavailable, overloaded, or search timed out :(", - "No more results": "No more results", - "Unknown room %(roomId)s": "Unknown room %(roomId)s", - "Room": "Room", - "Failed to reject invite": "Failed to reject invite", - "You have %(count)s unread notifications in a prior version of this room.|other": "You have %(count)s unread notifications in a prior version of this room.", - "You have %(count)s unread notifications in a prior version of this room.|one": "You have %(count)s unread notification in a prior version of this room.", - "Fill screen": "Fill screen", - "Click to unmute video": "Click to unmute video", - "Click to mute video": "Click to mute video", - "Click to unmute audio": "Click to unmute audio", - "Click to mute audio": "Click to mute audio", - "Clear filter": "Clear filter", - "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.", - "Tried to load a specific point in this room's timeline, but was unable to find it.": "Tried to load a specific point in this room's timeline, but was unable to find it.", - "Failed to load timeline position": "Failed to load timeline position", - " (1/%(totalCount)s)": " (1/%(totalCount)s)", - "Guest": "Guest", - "Your profile": "Your profile", - "Uploading %(filename)s and %(count)s others|other": "Uploading %(filename)s and %(count)s others", - "Uploading %(filename)s and %(count)s others|zero": "Uploading %(filename)s", - "Uploading %(filename)s and %(count)s others|one": "Uploading %(filename)s and %(count)s other", - "Could not load user profile": "Could not load user profile", - "Complete security": "Complete security", - "Verify this session to grant it access to encrypted messages.": "Verify this session to grant it access to encrypted messages.", - "Start": "Start", - "Session verified": "Session verified", - "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.", - "Done": "Done", - "Without completing security on this device, it won’t have access to encrypted messages.": "Without completing security on this device, it won’t have access to encrypted messages.", - "Go Back": "Go Back", - "Failed to send email": "Failed to send email", - "The email address linked to your account must be entered.": "The email address linked to your account must be entered.", - "A new password must be entered.": "A new password must be entered.", - "New passwords must match each other.": "New passwords must match each other.", - "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.", - "Your Matrix account on %(serverName)s": "Your Matrix account on %(serverName)s", - "Your Matrix account on ": "Your Matrix account on ", - "No identity server is configured: add one in server settings to reset your password.": "No identity server is configured: add one in server settings to reset your password.", - "Sign in instead": "Sign in instead", - "A verification email will be sent to your inbox to confirm setting your new password.": "A verification email will be sent to your inbox to confirm setting your new password.", - "Send Reset Email": "Send Reset Email", - "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.", - "I have verified my email address": "I have verified my email address", - "Your password has been reset.": "Your password has been reset.", - "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.", - "Return to login screen": "Return to login screen", - "Set a new password": "Set a new password", - "Invalid homeserver discovery response": "Invalid homeserver discovery response", - "Failed to get autodiscovery configuration from server": "Failed to get autodiscovery configuration from server", - "Invalid base_url for m.homeserver": "Invalid base_url for m.homeserver", - "Homeserver URL does not appear to be a valid Matrix homeserver": "Homeserver URL does not appear to be a valid Matrix homeserver", - "Invalid identity server discovery response": "Invalid identity server discovery response", - "Invalid base_url for m.identity_server": "Invalid base_url for m.identity_server", - "Identity server URL does not appear to be a valid identity server": "Identity server URL does not appear to be a valid identity server", - "General failure": "General failure", - "This homeserver does not support login using email address.": "This homeserver does not support login using email address.", - "Please contact your service administrator to continue using this service.": "Please contact your service administrator to continue using this service.", - "This account has been deactivated.": "This account has been deactivated.", - "Incorrect username and/or password.": "Incorrect username and/or password.", - "Please note you are logging into the %(hs)s server, not matrix.org.": "Please note you are logging into the %(hs)s server, not matrix.org.", - "Failed to perform homeserver discovery": "Failed to perform homeserver discovery", - "The phone number entered looks invalid": "The phone number entered looks invalid", - "This homeserver doesn't offer any login flows which are supported by this client.": "This homeserver doesn't offer any login flows which are supported by this client.", - "Error: Problem communicating with the given homeserver.": "Error: Problem communicating with the given homeserver.", - "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.", - "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.", - "Sign in with single sign-on": "Sign in with single sign-on", - "Create account": "Create account", - "Failed to fetch avatar URL": "Failed to fetch avatar URL", - "Set a display name:": "Set a display name:", - "Upload an avatar:": "Upload an avatar:", - "Registration has been disabled on this homeserver.": "Registration has been disabled on this homeserver.", - "Unable to query for supported registration methods.": "Unable to query for supported registration methods.", - "This server does not support authentication with a phone number.": "This server does not support authentication with a phone number.", - "Your new account (%(newAccountId)s) is registered, but you're already logged into a different account (%(loggedInUserId)s).": "Your new account (%(newAccountId)s) is registered, but you're already logged into a different account (%(loggedInUserId)s).", - "Continue with previous account": "Continue with previous account", - "Log in to your new account.": "Log in to your new account.", - "You can now close this window or log in to your new account.": "You can now close this window or log in to your new account.", - "Registration Successful": "Registration Successful", - "Create your account": "Create your account", - "Failed to re-authenticate due to a homeserver problem": "Failed to re-authenticate due to a homeserver problem", - "Failed to re-authenticate": "Failed to re-authenticate", - "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.": "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.", - "Enter your password to sign in and regain access to your account.": "Enter your password to sign in and regain access to your account.", - "Forgotten your password?": "Forgotten your password?", - "Sign in and regain access to your account.": "Sign in and regain access to your account.", - "You cannot sign in to your account. Please contact your homeserver admin for more information.": "You cannot sign in to your account. Please contact your homeserver admin for more information.", - "You're signed out": "You're signed out", - "Clear personal data": "Clear personal data", - "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.": "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.", - "Commands": "Commands", - "Command Autocomplete": "Command Autocomplete", - "Community Autocomplete": "Community Autocomplete", - "Results from DuckDuckGo": "Results from DuckDuckGo", - "DuckDuckGo Results": "DuckDuckGo Results", - "Emoji": "Emoji", - "Emoji Autocomplete": "Emoji Autocomplete", - "Notify the whole room": "Notify the whole room", - "Room Notification": "Room Notification", - "Notification Autocomplete": "Notification Autocomplete", - "Room Autocomplete": "Room Autocomplete", - "Users": "Users", - "User Autocomplete": "User Autocomplete", - "unknown device": "unknown device", - "NOT verified": "NOT verified", - "Blacklisted": "Blacklisted", - "verified": "verified", - "Verification": "Verification", - "Ed25519 fingerprint": "Ed25519 fingerprint", - "User ID": "User ID", - "Curve25519 identity key": "Curve25519 identity key", - "none": "none", - "Claimed Ed25519 fingerprint key": "Claimed Ed25519 fingerprint key", - "Algorithm": "Algorithm", - "unencrypted": "unencrypted", - "Decryption error": "Decryption error", - "Session ID": "Session ID", - "Event information": "Event information", - "Sender device information": "Sender device information", - "Passphrases must match": "Passphrases must match", - "Passphrase must not be empty": "Passphrase must not be empty", - "Export room keys": "Export room keys", - "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.", - "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.", - "Enter passphrase": "Enter passphrase", - "Confirm passphrase": "Confirm passphrase", - "Export": "Export", - "Import room keys": "Import room keys", - "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.", - "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.", - "File to import": "File to import", - "Import": "Import", - "Key Backup is enabled on your account but has not been set up from this session. To set up secret storage, restore your key backup.": "Key Backup is enabled on your account but has not been set up from this session. To set up secret storage, restore your key backup.", - "Restore": "Restore", - "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup.": "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup.", - "Great! This passphrase looks strong enough.": "Great! This passphrase looks strong enough.", - "Warning: You should only set up secret storage from a trusted computer.": "Warning: You should only set up secret storage from a trusted computer.", - "We'll use secret storage to optionally store an encrypted copy of your cross-signing identity for verifying other devices and message keys on our server. Protect your access to encrypted messages with a passphrase to keep it secure.": "We'll use secret storage to optionally store an encrypted copy of your cross-signing identity for verifying other devices and message keys on our server. Protect your access to encrypted messages with a passphrase to keep it secure.", - "For maximum security, this should be different from your account password.": "For maximum security, this should be different from your account password.", - "Enter a passphrase...": "Enter a passphrase...", - "Set up with a recovery key": "Set up with a recovery key", - "That matches!": "That matches!", - "That doesn't match.": "That doesn't match.", - "Go back to set it again.": "Go back to set it again.", - "Please enter your passphrase a second time to confirm.": "Please enter your passphrase a second time to confirm.", - "Repeat your passphrase...": "Repeat your passphrase...", - "As a safety net, you can use it to restore your access to encrypted messages if you forget your passphrase.": "As a safety net, you can use it to restore your access to encrypted messages if you forget your passphrase.", - "As a safety net, you can use it to restore your access to encrypted messages.": "As a safety net, you can use it to restore your access to encrypted messages.", - "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.", - "Keep your recovery key somewhere very secure, like a password manager (or a safe).": "Keep your recovery key somewhere very secure, like a password manager (or a safe).", - "Your Recovery Key": "Your Recovery Key", - "Copy to clipboard": "Copy to clipboard", - "Download": "Download", - "Your recovery key has been copied to your clipboard, paste it to:": "Your recovery key has been copied to your clipboard, paste it to:", - "Your recovery key is in your Downloads folder.": "Your recovery key is in your Downloads folder.", - "Print it and store it somewhere safe": "Print it and store it somewhere safe", - "Save it on a USB key or backup drive": "Save it on a USB key or backup drive", - "Copy it to your personal cloud storage": "Copy it to your personal cloud storage", - "Your access to encrypted messages is now protected.": "Your access to encrypted messages is now protected.", - "Without setting up secret storage, you won't be able to restore your access to encrypted messages or your cross-signing identity for verifying other devices if you log out or use another device.": "Without setting up secret storage, you won't be able to restore your access to encrypted messages or your cross-signing identity for verifying other devices if you log out or use another device.", - "Set up secret storage": "Set up secret storage", - "Restore your Key Backup": "Restore your Key Backup", - "Migrate from Key Backup": "Migrate from Key Backup", - "Secure your encrypted messages with a passphrase": "Secure your encrypted messages with a passphrase", - "Confirm your passphrase": "Confirm your passphrase", - "Recovery key": "Recovery key", - "Keep it safe": "Keep it safe", - "Storing secrets...": "Storing secrets...", - "Success!": "Success!", - "Unable to set up secret storage": "Unable to set up secret storage", - "Retry": "Retry", - "We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.": "We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.", - "Set up with a Recovery Key": "Set up with a Recovery Key", - "As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.": "As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.", - "As a safety net, you can use it to restore your encrypted message history.": "As a safety net, you can use it to restore your encrypted message history.", - "Your keys are being backed up (the first backup could take a few minutes).": "Your keys are being backed up (the first backup could take a few minutes).", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.", - "Set up Secure Message Recovery": "Set up Secure Message Recovery", - "Secure your backup with a passphrase": "Secure your backup with a passphrase", - "Starting backup...": "Starting backup...", - "Create Key Backup": "Create Key Backup", - "Unable to create key backup": "Unable to create key backup", - "Without setting up Secure Message Recovery, you'll lose your secure message history when you log out.": "Without setting up Secure Message Recovery, you'll lose your secure message history when you log out.", - "If you don't want to set this up now, you can later in Settings.": "If you don't want to set this up now, you can later in Settings.", - "Set up": "Set up", - "Don't ask again": "Don't ask again", - "New Recovery Method": "New Recovery Method", - "A new recovery passphrase and key for Secure Messages have been detected.": "A new recovery passphrase and key for Secure Messages have been detected.", - "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.": "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.", - "This device is encrypting history using the new recovery method.": "This device is encrypting history using the new recovery method.", - "Go to Settings": "Go to Settings", - "Set up Secure Messages": "Set up Secure Messages", - "Recovery Method Removed": "Recovery Method Removed", - "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "This device has detected that your recovery passphrase and key for Secure Messages have been removed.", - "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.", - "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.", - "Failed to set direct chat tag": "Failed to set direct chat tag", - "Failed to remove tag %(tagName)s from room": "Failed to remove tag %(tagName)s from room", - "Failed to add tag %(tagName)s to room": "Failed to add tag %(tagName)s to room" -} From 590ff29e60bac1283c15c512a7afc5089e60de94 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 24 Jan 2020 13:15:57 +0000 Subject: [PATCH 221/906] Unused import --- src/AsyncWrapper.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/AsyncWrapper.js b/src/AsyncWrapper.js index 63b856a882..b7b81688e1 100644 --- a/src/AsyncWrapper.js +++ b/src/AsyncWrapper.js @@ -16,7 +16,6 @@ limitations under the License. */ import createReactClass from 'create-react-class'; -import Analytics from './Analytics'; import * as sdk from './index'; import PropTypes from 'prop-types'; import { _t } from './languageHandler'; From 66768416a628c10c0c80ecc7e0099c36e9b8a89b Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 24 Jan 2020 14:20:48 +0100 Subject: [PATCH 222/906] dont assume the room exist ... not sure why though --- src/utils/KeyVerificationStateObserver.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/KeyVerificationStateObserver.js b/src/utils/KeyVerificationStateObserver.js index 7da532109c..a29d2ea1aa 100644 --- a/src/utils/KeyVerificationStateObserver.js +++ b/src/utils/KeyVerificationStateObserver.js @@ -20,7 +20,7 @@ import { _t } from '../languageHandler'; export function getNameForEventRoom(userId, roomId) { const client = MatrixClientPeg.get(); const room = client.getRoom(roomId); - const member = room.getMember(userId); + const member = room && room.getMember(userId); return member ? member.name : userId; } From 3534cd42023882785cc83c6222a1e478302f8131 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 14:23:43 +0100 Subject: [PATCH 223/906] FilePanel: Add comments to explain what's going on with the event index. --- src/components/structures/FilePanel.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/components/structures/FilePanel.js b/src/components/structures/FilePanel.js index e03c587e61..4c02f925fc 100644 --- a/src/components/structures/FilePanel.js +++ b/src/components/structures/FilePanel.js @@ -30,6 +30,8 @@ import { _t } from '../../languageHandler'; */ const FilePanel = createReactClass({ displayName: 'FilePanel', + // This is used to track if a decrypted event was a live event and should be + // added to the timeline. decryptingEvents: new Set(), propTypes: { @@ -84,6 +86,14 @@ const FilePanel = createReactClass({ if (!MatrixClientPeg.get().isRoomEncrypted(this.props.roomId)) return; + // The timelineSets filter makes sure that encrypted events that contain + // URLs never get added to the timeline, even if they are live events. + // These methods are here to manually listen for such events and add + // them despite the filter's best efforts. + // + // We do this only for encrypted rooms and if an event index exists, + // this could be made more general in the future or the filter logic + // could be fixed. if (EventIndexPeg.get() !== null) { client.on('Room.timeline', this.onRoomTimeline.bind(this)); client.on('Event.decrypted', this.onEventDecrypted.bind(this)); @@ -133,6 +143,10 @@ const FilePanel = createReactClass({ const room = client.getRoom(roomId); + // We override the pagination request for encrypted rooms so that we ask + // the event index to fulfill the pagination request. Asking the server + // to paginate won't ever work since the server can't correctly filter + // out events containing URLs if (client.isRoomEncrypted(roomId) && eventIndex !== null) { return eventIndex.paginateTimelineWindow(room, timelineWindow, direction, limit); } else { @@ -153,6 +167,15 @@ const FilePanel = createReactClass({ try { timelineSet = await this.fetchFileEventsServer(room); + // If this room is encrypted the file panel won't be populated + // correctly since the defined filter doesn't support encrypted + // events and the server can't check if encrypted events contain + // URLs. + // + // This is where our event index comes into place, we ask the + // event index to populate the timelineSet for us. This call + // will add 10 events to the live timeline of the set. More can + // be requested using pagination. if (client.isRoomEncrypted(roomId) && eventIndex !== null) { const timeline = timelineSet.getLiveTimeline(); await eventIndex.populateFileTimeline(timelineSet, timeline, room, 10); From 37f289b120ff23752204fd6a98b47b79b648df67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 14:24:25 +0100 Subject: [PATCH 224/906] EventIndex: Add docstrings for the FilePanel methods. --- src/indexing/EventIndex.js | 72 +++++++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 2b432ab1a1..b6e29c455d 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -407,6 +407,27 @@ export default class EventIndex { return indexManager.searchEventIndex(searchArgs); } + /** + * Load events that contain URLs from the event index. + * + * @param {Room} room The room for which we should fetch events containing + * URLs + * + * @param {number} limit The maximum number of events to fetch. + * + * @param {string} fromEvent From which event should we continue fetching + * events from the index. This is only needed if we're continuing to fill + * the timeline, e.g. if we're paginating. This needs to be set to a event + * id of an event that was previously fetched with this function. + * + * @param {string} direction The direction in which we will continue + * fetching events. EventTimeline.BACKWARDS to continue fetching events that + * are older than the event given in fromEvent, EventTimeline.FORWARDS to + * fetch newer events. + * + * @returns {Promise} Resolves to an array of events that + * contain URLs. + */ async loadFileEvents(room, limit = 10, fromEvent = null, direction = EventTimeline.BACKWARDS) { const client = MatrixClientPeg.get(); const indexManager = PlatformPeg.get().getEventIndexingManager(); @@ -472,6 +493,33 @@ export default class EventIndex { return matrixEvents; } + /** + * Fill a timeline with events that contain URLs. + * + * @param {TimelineSet} timelineSet The TimelineSet the Timeline belongs to, + * used to check if we're adding duplicate events. + * + * @param {Timeline} timeline The Timeline which should be filed with + * events. + * + * @param {Room} room The room for which we should fetch events containing + * URLs + * + * @param {number} limit The maximum number of events to fetch. + * + * @param {string} fromEvent From which event should we continue fetching + * events from the index. This is only needed if we're continuing to fill + * the timeline, e.g. if we're paginating. This needs to be set to a event + * id of an event that was previously fetched with this function. + * + * @param {string} direction The direction in which we will continue + * fetching events. EventTimeline.BACKWARDS to continue fetching events that + * are older than the event given in fromEvent, EventTimeline.FORWARDS to + * fetch newer events. + * + * @returns {Promise} Resolves to true if events were added to the + * timeline, false otherwise. + */ async populateFileTimeline(timelineSet, timeline, room, limit = 10, fromEvent = null, direction = EventTimeline.BACKWARDS) { const matrixEvents = await this.loadFileEvents(room, limit, fromEvent, direction); @@ -486,7 +534,7 @@ export default class EventIndex { direction = direction == EventTimeline.BACKWARDS ? EventTimeline.FORWARDS: EventTimeline.BACKWARDS; } - // Add the events to the live timeline of the file panel. + // Add the events to the timeline of the file panel. matrixEvents.forEach(e => { if (!timelineSet.eventIdToTimeline(e.getId())) { timelineSet.addEventToTimeline(e, timeline, direction == EventTimeline.BACKWARDS); @@ -503,6 +551,28 @@ export default class EventIndex { } } + /** + * Emulate a TimelineWindow pagination() request with the event index as the event source + * + * Might not fetch events from the index if the timeline already contains + * events that the window isn't showing. + * + * @param {Room} room The room for which we should fetch events containing + * URLs + * + * @param {TimelineWindow} timelineWindow The timeline window that should be + * populated with new events. + * + * @param {string} direction The direction in which we should paginate. + * EventTimeline.BACKWARDS to paginate back, EventTimeline.FORWARDS to + * paginate forwards. + * + * @param {number} limit The maximum number of events to fetch while + * paginating. + * + * @returns {Promise} Resolves to a boolean which is true if more + * events were successfully retrieved. + */ paginateTimelineWindow(room, timelineWindow, direction, limit) { const tl = timelineWindow.getTimelineIndex(direction); From 6ebeb0a376f9fab634f48c731b82740e5921af11 Mon Sep 17 00:00:00 2001 From: random Date: Fri, 24 Jan 2020 13:30:03 +0000 Subject: [PATCH 225/906] Translated using Weblate (Italian) Currently translated at 98.7% (2031 of 2057 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index d6ebc985fb..6a021e8ab7 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2079,5 +2079,7 @@ "Verify User": "Verifica utente", "For extra security, verify this user by checking a one-time code on both of your devices.": "Per maggiore sicurezza, verifica questo utente controllando un codice univoco sui vostri dispositivi.", "For maximum security, do this in person.": "Per massima sicurezza, fatelo di persona.", - "Start Verification": "Inizia la verifica" + "Start Verification": "Inizia la verifica", + "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s ha aggiunto %(addedAddresses)s e %(count)s altri indirizzi a questa stanza", + "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s ha rimosso %(removedAddresses)s e %(count)s altri indirizzi da questa stanza" } From be98f24051f212f5b9d7cda96aba00f697b019ff Mon Sep 17 00:00:00 2001 From: random Date: Fri, 24 Jan 2020 13:31:06 +0000 Subject: [PATCH 226/906] Translated using Weblate (Italian) Currently translated at 98.8% (2032 of 2057 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 6a021e8ab7..c9a6c27221 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2081,5 +2081,6 @@ "For maximum security, do this in person.": "Per massima sicurezza, fatelo di persona.", "Start Verification": "Inizia la verifica", "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s ha aggiunto %(addedAddresses)s e %(count)s altri indirizzi a questa stanza", - "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s ha rimosso %(removedAddresses)s e %(count)s altri indirizzi da questa stanza" + "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s ha rimosso %(removedAddresses)s e %(count)s altri indirizzi da questa stanza", + "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s ha rimosso %(countRemoved)s e aggiunto %(countAdded)s indirizzi a questa stanza" } From 75da5b7944ded503a50b099a2a467abec3c40858 Mon Sep 17 00:00:00 2001 From: Zoe Date: Fri, 24 Jan 2020 12:59:46 +0000 Subject: [PATCH 227/906] Design pass for room icons --- src/components/views/rooms/RoomList.js | 2 +- src/components/views/rooms/RoomTile.js | 6 +++--- src/i18n/strings/en_EN.json | 3 +-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index ee3100b535..f41400ecfc 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -719,7 +719,7 @@ export default createReactClass({ }, { list: this.state.lists['im.vector.fake.direct'], - label: _t('People'), + label: _t('Direct Messages'), tagName: "im.vector.fake.direct", order: "recent", incomingCall: incomingCallIfTaggedAs('im.vector.fake.direct'), diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index 0b50d85ff6..c546b7503e 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -478,7 +478,8 @@ export default createReactClass({ let dmIndicator; let dmOnline; - if (dmUserId) { + // If we can place a shield, do that instead + if (dmUserId && !this.state.e2eStatus) { dmIndicator = ; } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 099b64dd49..1d5f534a36 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1012,7 +1012,7 @@ "Community Invites": "Community Invites", "Invites": "Invites", "Favourites": "Favourites", - "People": "People", + "Direct Messages": "Direct Messages", "Start chat": "Start chat", "Rooms": "Rooms", "Low priority": "Low priority", @@ -1471,7 +1471,6 @@ "Suggestions": "Suggestions", "Recently Direct Messaged": "Recently Direct Messaged", "Show more": "Show more", - "Direct Messages": "Direct Messages", "If you can't find someone, ask them for their username, or share your username (%(userId)s) or profile link.": "If you can't find someone, ask them for their username, or share your username (%(userId)s) or profile link.", "Go": "Go", "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.": "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.", From a46646105f29cb68714e0c0794136b452b37833d Mon Sep 17 00:00:00 2001 From: random Date: Fri, 24 Jan 2020 13:31:48 +0000 Subject: [PATCH 228/906] Translated using Weblate (Italian) Currently translated at 100.0% (2057 of 2057 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index c9a6c27221..c8844fb2bb 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2082,5 +2082,30 @@ "Start Verification": "Inizia la verifica", "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s ha aggiunto %(addedAddresses)s e %(count)s altri indirizzi a questa stanza", "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s ha rimosso %(removedAddresses)s e %(count)s altri indirizzi da questa stanza", - "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s ha rimosso %(countRemoved)s e aggiunto %(countAdded)s indirizzi a questa stanza" + "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s ha rimosso %(countRemoved)s e aggiunto %(countAdded)s indirizzi a questa stanza", + "Someone is using an unknown device": "Qualcuno sta usando un dispositivo sconosciuto", + "This room is end-to-end encrypted": "Questa stanza è cifrata end-to-end", + "Everyone in this room is verified": "Tutti in questa stanza sono verificati", + "Invite only": "Solo a invito", + "Send a reply…": "Invia risposta…", + "Send a message…": "Invia un messaggio…", + "Reject & Ignore user": "Rifiuta e ignora l'utente", + "Unknown Command": "Comando sconosciuto", + "Unrecognised command: %(commandText)s": "Comando non riconosciuto: %(commandText)s", + "You can use /help to list available commands. Did you mean to send this as a message?": "Puoi usare /help per elencare i comandi disponibili. Volevo forse inviarlo come messaggio?", + "Hint: Begin your message with // to start it with a slash.": "Suggerimento: anteponi al tuo messaggio // per farlo iniziare con uno slash.", + "Send as message": "Invia come messaggio", + "Enter your account password to confirm the upgrade:": "Inserisci la password del tuo account per confermare l'aggiornamento:", + "You'll need to authenticate with the server to confirm the upgrade.": "Dovrai autenticarti con il server per confermare l'aggiornamento.", + "Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Aggiorna il dispositivo per consentirgli di verificare altri dispositivi, dando loro accesso ai messaggi cifrati e contrassegnandoli come fidati per gli altri utenti.", + "Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Imposta la cifratura sul dispositivo per consentirgli di verificare altri dispositivi, dando loro accesso ai messaggi cifrati e contrassegnandoli come fidati per gli altri utenti.", + "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Proteggi le chiavi di cifratura con una password. Per massima sicurezza questa dovrebbe essere diversa da quella del tuo account:", + "Enter a passphrase": "Inserisci una password", + "Enter your passphrase a second time to confirm it.": "Inserisci di nuovo la tua password per confermarla.", + "This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Questo dispositivo ora può verificare altri dispositivi, dando loro accesso ai messaggi cifrati e contrassegnandoli come fidati per gli altri utenti.", + "Verify other users in their profile.": "Verifica gli altri utenti nel loro profilo.", + "Upgrade your encryption": "Aggiorna la tua cifratura", + "Set up encryption": "Imposta la cifratura", + "Encryption upgraded": "Cifratura aggiornata", + "Encryption setup complete": "Impostazione cifratura completata" } From 098d09792215d4a1922a906e05e0ca23dc26d685 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 24 Jan 2020 14:03:31 +0000 Subject: [PATCH 229/906] Re-enable stylelint on CI --- .buildkite/pipeline.yaml | 8 ++++++++ res/css/views/rooms/_RoomHeader.scss | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.buildkite/pipeline.yaml b/.buildkite/pipeline.yaml index f5f63b647a..1e08d2cd3b 100644 --- a/.buildkite/pipeline.yaml +++ b/.buildkite/pipeline.yaml @@ -25,6 +25,14 @@ steps: plugins: - docker#v3.0.1: image: "node:12" + - label: ":stylelint: Style Lint" + command: + - "echo '--- Install'" + - "yarn install --ignore-scripts" + - "yarn lint:style" + plugins: + - docker#v3.0.1: + image: "node:12" - label: ":jest: Tests" agents: diff --git a/res/css/views/rooms/_RoomHeader.scss b/res/css/views/rooms/_RoomHeader.scss index 0ac2e99b97..6f0377b29c 100644 --- a/res/css/views/rooms/_RoomHeader.scss +++ b/res/css/views/rooms/_RoomHeader.scss @@ -24,7 +24,7 @@ limitations under the License. bottom: -1px; right: -2px; height: 10px; - width: 10px + width: 10px; } } From 5536384866eb72aa61500fcbd844b61c0b7a00d3 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 24 Jan 2020 14:21:28 +0000 Subject: [PATCH 230/906] Do less unnecessary work on CI We were checking out & installing the develop js-sdk explicitly in cases where we didn't need it at all. We were babeling the src folder many, many times over (in some cases twice in the same job) and never using the output at all. --- .buildkite/pipeline.yaml | 43 ++++++++++++++------------------------ scripts/ci/install-deps.sh | 4 ++-- 2 files changed, 18 insertions(+), 29 deletions(-) diff --git a/.buildkite/pipeline.yaml b/.buildkite/pipeline.yaml index 1e08d2cd3b..39bba6637a 100644 --- a/.buildkite/pipeline.yaml +++ b/.buildkite/pipeline.yaml @@ -2,7 +2,8 @@ steps: - label: ":eslint: JS Lint" command: - "echo '--- Install js-sdk'" - - "./scripts/ci/install-deps.sh" + - "./scripts/ci/install-deps.sh --ignore-scripts" + - "echo '+++ Lint" - "yarn lint:js" plugins: - docker#v3.0.1: @@ -10,8 +11,9 @@ steps: - label: ":eslint: TS Lint" command: - - "echo '--- Install js-sdk'" - - "./scripts/ci/install-deps.sh" + - "echo '--- Install" + - "yarn install --ignore-scripts" + - "echo '+++ Lint" - "yarn lint:ts" plugins: - docker#v3.0.1: @@ -19,8 +21,9 @@ steps: - label: ":eslint: Types Lint" command: - - "echo '--- Install js-sdk'" - - "./scripts/ci/install-deps.sh" + - "echo '--- Install" + - "yarn install --ignore-scripts" + - "echo '+++ Lint" - "yarn lint:types" plugins: - docker#v3.0.1: @@ -41,13 +44,10 @@ steps: queue: "medium" command: - "echo '--- Install js-sdk'" - # TODO: Remove hacky chmod for BuildKite - - "chmod +x ./scripts/ci/*.sh" - - "chmod +x ./scripts/*" - - "echo '--- Installing Dependencies'" - - "./scripts/ci/install-deps.sh" - - "echo '--- Running initial build steps'" - - "yarn build" + # We don't use the babel-ed output for anything so we can --ignore-scripts + # to save transpiling the files. We run the transpile step explicitly in + # the 'build' job. + - "./scripts/ci/install-deps.sh --ignore-scripts" - "echo '+++ Running Tests'" - "yarn test" plugins: @@ -56,10 +56,8 @@ steps: - label: "🛠 Build" command: - - "echo '--- Install js-sdk'" - - "./scripts/ci/install-deps.sh" - - "echo '+++ Building Project'" - - "yarn build" + - "echo '+++ Install & Build'" + - "yarn install" plugins: - docker#v3.0.1: image: "node:12" @@ -70,14 +68,8 @@ steps: # e2e tests otherwise take +-8min queue: "xlarge" command: - # TODO: Remove hacky chmod for BuildKite - - "echo '--- Setup'" - - "chmod +x ./scripts/ci/*.sh" - - "chmod +x ./scripts/*" - "echo '--- Install js-sdk'" - - "./scripts/ci/install-deps.sh" - - "echo '--- Running initial build steps'" - - "yarn build" + - "./scripts/ci/install-deps.sh --ignore-scripts" - "echo '+++ Running Tests'" - "./scripts/ci/end-to-end-tests.sh" plugins: @@ -96,9 +88,6 @@ steps: # webpack loves to gorge itself on resources. queue: "medium" command: - # TODO: Remove hacky chmod for BuildKite - - "chmod +x ./scripts/ci/*.sh" - - "chmod +x ./scripts/*" - "echo '+++ Running Tests'" - "./scripts/ci/riot-unit-tests.sh" plugins: @@ -110,7 +99,7 @@ steps: - label: "🌐 i18n" command: - "echo '--- Fetching Dependencies'" - - "yarn install" + - "yarn install --ignore-scripts" - "echo '+++ Testing i18n output'" - "yarn diff-i18n" plugins: diff --git a/scripts/ci/install-deps.sh b/scripts/ci/install-deps.sh index a2e2e59a45..14b5fc5393 100755 --- a/scripts/ci/install-deps.sh +++ b/scripts/ci/install-deps.sh @@ -6,9 +6,9 @@ scripts/fetchdep.sh matrix-org matrix-js-sdk pushd matrix-js-sdk yarn link -yarn install +yarn install $@ yarn build popd yarn link matrix-js-sdk -yarn install +yarn install $@ From 97d55f63a362194ce5d9cc6d9bb92f78e1c63157 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 15:25:27 +0100 Subject: [PATCH 231/906] DisableEventIndexDialog: Remove the incorrect class on the dialog. --- .../views/dialogs/eventindex/DisableEventIndexDialog.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js index c2b7e2933e..81920eab7a 100644 --- a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js +++ b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js @@ -56,10 +56,7 @@ export default class DisableEventIndexDialog extends React.Component { const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); return ( - + {_t("If disabled, messages from encrypted rooms won't appear in search results.")} {this.state.disabling ? :
      } Date: Fri, 24 Jan 2020 15:26:24 +0100 Subject: [PATCH 232/906] DisableEventIndexDialog: Use a self-closing tag for the buttons. --- .../views/dialogs/eventindex/DisableEventIndexDialog.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js index 81920eab7a..13278217de 100644 --- a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js +++ b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js @@ -65,8 +65,7 @@ export default class DisableEventIndexDialog extends React.Component { primaryButtonClass="danger" onCancel={this.props.onFinished} disabled={this.state.disabling} - > - + /> ); } From 47999c2e468ea98ec5ea99c527b48b7ac54c3fb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 15:26:54 +0100 Subject: [PATCH 233/906] EventIndexPanel: Add a separate message for the case where Seshat is missing. --- src/components/views/settings/EventIndexPanel.js | 16 ++++++++++++++++ src/i18n/strings/en_EN.json | 1 + 2 files changed, 17 insertions(+) diff --git a/src/components/views/settings/EventIndexPanel.js b/src/components/views/settings/EventIndexPanel.js index 5edc25bbab..321f45699b 100644 --- a/src/components/views/settings/EventIndexPanel.js +++ b/src/components/views/settings/EventIndexPanel.js @@ -140,6 +140,22 @@ export default class EventIndexPanel extends React.Component {
      ); + } else if (EventIndexPeg.platformHasSupport() && !EventIndexPeg.supportIsInstalled()) { + eventIndexingSettings = ( +
      + { + _t( "Riot is missing some components required for securely " + + "caching encrypted messages locally. If you'd like to " + + "experiment with this feature, build a custom Riot Desktop " + + "with search components added.", + {}, + { + 'nativeLink': (sub) => {sub}, + }, + ) + } +
      + ); } else { eventIndexingSettings = (
      diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index fceb299131..419aecd528 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -560,6 +560,7 @@ "Manage": "Manage", "Securely cache encrypted messages locally for them to appear in search results.": "Securely cache encrypted messages locally for them to appear in search results.", "Enable": "Enable", + "Riot is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom Riot Desktop with search components added.": "Riot is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom Riot Desktop with search components added.", "Riot can't securely cache encrypted messages locally while running in a web browser. Use Riot Desktop for encrypted messages to appear in search results.": "Riot can't securely cache encrypted messages locally while running in a web browser. Use Riot Desktop for encrypted messages to appear in search results.", "Connecting to integration manager...": "Connecting to integration manager...", "Cannot connect to integration manager": "Cannot connect to integration manager", From 57ee99d6f797115d051914d8513b262ca50441e2 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 24 Jan 2020 14:30:41 +0000 Subject: [PATCH 234/906] chmod --- scripts/ci/layered-riot-web.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 scripts/ci/layered-riot-web.sh diff --git a/scripts/ci/layered-riot-web.sh b/scripts/ci/layered-riot-web.sh old mode 100644 new mode 100755 From 19c49eedec75ce21e7ecc982ec209b6b4203b2bc Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 24 Jan 2020 14:36:12 +0000 Subject: [PATCH 235/906] reskindex for tests --- .buildkite/pipeline.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.buildkite/pipeline.yaml b/.buildkite/pipeline.yaml index 39bba6637a..7dbb959dea 100644 --- a/.buildkite/pipeline.yaml +++ b/.buildkite/pipeline.yaml @@ -48,6 +48,7 @@ steps: # to save transpiling the files. We run the transpile step explicitly in # the 'build' job. - "./scripts/ci/install-deps.sh --ignore-scripts" + - "yarn run reskindex" - "echo '+++ Running Tests'" - "yarn test" plugins: From de5c47960c8a34f7412dcf0c836349348378e65a Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 24 Jan 2020 14:51:11 +0000 Subject: [PATCH 236/906] quotes --- .buildkite/pipeline.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.buildkite/pipeline.yaml b/.buildkite/pipeline.yaml index 7dbb959dea..698ce43c93 100644 --- a/.buildkite/pipeline.yaml +++ b/.buildkite/pipeline.yaml @@ -3,7 +3,7 @@ steps: command: - "echo '--- Install js-sdk'" - "./scripts/ci/install-deps.sh --ignore-scripts" - - "echo '+++ Lint" + - "echo '+++ Lint'" - "yarn lint:js" plugins: - docker#v3.0.1: @@ -13,7 +13,7 @@ steps: command: - "echo '--- Install" - "yarn install --ignore-scripts" - - "echo '+++ Lint" + - "echo '+++ Lint'" - "yarn lint:ts" plugins: - docker#v3.0.1: @@ -21,9 +21,9 @@ steps: - label: ":eslint: Types Lint" command: - - "echo '--- Install" + - "echo '--- Install'" - "yarn install --ignore-scripts" - - "echo '+++ Lint" + - "echo '+++ Lint'" - "yarn lint:types" plugins: - docker#v3.0.1: From b17f38856ca5f49efe593aa92755583cdc5058c9 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 24 Jan 2020 14:56:00 +0000 Subject: [PATCH 237/906] More quote failing --- .buildkite/pipeline.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.buildkite/pipeline.yaml b/.buildkite/pipeline.yaml index 698ce43c93..842ea091fb 100644 --- a/.buildkite/pipeline.yaml +++ b/.buildkite/pipeline.yaml @@ -11,7 +11,7 @@ steps: - label: ":eslint: TS Lint" command: - - "echo '--- Install" + - "echo '--- Install'" - "yarn install --ignore-scripts" - "echo '+++ Lint'" - "yarn lint:ts" From 26aaa58e3cc2c05ceeb239a753747cde6f720d34 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 24 Jan 2020 14:58:46 +0000 Subject: [PATCH 238/906] Comments are great --- .buildkite/pipeline.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.buildkite/pipeline.yaml b/.buildkite/pipeline.yaml index 842ea091fb..4bc69a76bd 100644 --- a/.buildkite/pipeline.yaml +++ b/.buildkite/pipeline.yaml @@ -1,6 +1,7 @@ steps: - label: ":eslint: JS Lint" command: + # We fetch the develop js-sdk to get our latest eslint rules - "echo '--- Install js-sdk'" - "./scripts/ci/install-deps.sh --ignore-scripts" - "echo '+++ Lint'" From 2d8477aaa69ac35c451c8a47691a0372cb635175 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 16:13:55 +0100 Subject: [PATCH 239/906] FormattingUtils: Add a formatCountLong method. --- src/utils/FormattingUtils.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/utils/FormattingUtils.js b/src/utils/FormattingUtils.js index 9016d62cfb..b932214530 100644 --- a/src/utils/FormattingUtils.js +++ b/src/utils/FormattingUtils.js @@ -30,6 +30,15 @@ export function formatCount(count) { return (count / 1000000000).toFixed(1) + "B"; // 10B is enough for anyone, right? :S } +/** + * Format a count showing the whole number but making it a bit more readable. + * e.g: 1000 => 1,000 + */ +export function formatCountLong(count) { + const formatter = new Intl.NumberFormat(); + return formatter.format(count) +} + /** * format a size in bytes into a human readable form * e.g: 1024 -> 1.00 KB From ddea7415c7bd954343efc98322a00326b5c1d2c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 16:15:06 +0100 Subject: [PATCH 240/906] EventIndexPanel: Use formatCountLong to format the event and room counts. --- .../views/dialogs/eventindex/ManageEventIndexDialog.js | 6 +++--- src/components/views/settings/EventIndexPanel.js | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js index a8fc7dce3a..66cd89f4ab 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js @@ -20,7 +20,7 @@ import PropTypes from 'prop-types'; import { _t } from '../../../../languageHandler'; import Modal from '../../../../Modal'; -import {formatBytes, formatCount} from "../../../../utils/FormattingUtils"; +import {formatBytes, formatCountLong} from "../../../../utils/FormattingUtils"; import EventIndexPeg from "../../../../indexing/EventIndexPeg"; import AccessibleButton from "../../../../components/views/elements/AccessibleButton"; @@ -125,8 +125,8 @@ export default class ManageEventIndexDialog extends React.Component { }
      {_t("Space used:")} {formatBytes(this.state.eventIndexSize, 0)}
      - {_t("Indexed messages:")} {formatCount(this.state.eventCount)}
      - {_t("Number of rooms:")} {formatCount(this.state.roomCount)}
      + {_t("Indexed messages:")} {formatCountLong(this.state.eventCount)}
      + {_t("Number of rooms:")} {formatCountLong(this.state.roomCount)}
      {crawlerState}
      diff --git a/src/components/views/settings/EventIndexPanel.js b/src/components/views/settings/EventIndexPanel.js index 321f45699b..851f86f3d4 100644 --- a/src/components/views/settings/EventIndexPanel.js +++ b/src/components/views/settings/EventIndexPanel.js @@ -21,7 +21,7 @@ import * as sdk from '../../../index'; import Modal from '../../../Modal'; import SettingsStore, {SettingLevel} from "../../../settings/SettingsStore"; import AccessibleButton from "../elements/AccessibleButton"; -import {formatBytes, formatCount} from "../../../utils/FormattingUtils"; +import {formatBytes, formatCountLong} from "../../../utils/FormattingUtils"; import EventIndexPeg from "../../../indexing/EventIndexPeg"; export default class EventIndexPanel extends React.Component { @@ -115,7 +115,8 @@ export default class EventIndexPanel extends React.Component { {_t( "Securely cache encrypted messages locally for them " + "to appear in search results, using ") } {formatBytes(this.state.eventIndexSize, 0)} - {_t( " to store messages from ")} {formatCount(this.state.roomCount)} {_t("rooms.")} + {_t( " to store messages from ")} + {formatCountLong(this.state.roomCount)} {_t("rooms.")}
      From cd225943ea7a504d8e9ff09eefa6aa098514ee2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 16:22:09 +0100 Subject: [PATCH 241/906] EventIndexPanel: Shorten a overly long line. --- src/components/views/settings/EventIndexPanel.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/views/settings/EventIndexPanel.js b/src/components/views/settings/EventIndexPanel.js index 851f86f3d4..479a995bc8 100644 --- a/src/components/views/settings/EventIndexPanel.js +++ b/src/components/views/settings/EventIndexPanel.js @@ -142,6 +142,12 @@ export default class EventIndexPanel extends React.Component {
      ); } else if (EventIndexPeg.platformHasSupport() && !EventIndexPeg.supportIsInstalled()) { + const nativeLink = ( + "https://github.com/vector-im/riot-web/blob/develop/" + + "docs/native-node-modules.md#" + + "adding-seshat-for-search-in-e2e-encrypted-rooms" + ); + eventIndexingSettings = (
      { @@ -151,7 +157,7 @@ export default class EventIndexPanel extends React.Component { "with search components added.", {}, { - 'nativeLink': (sub) => {sub}, + 'nativeLink': (sub) => {sub}, }, ) } From 5d3b916a89bb0c04b38fa24a5e360c93ff178d9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 16:46:46 +0100 Subject: [PATCH 242/906] DialogButtons: Allow setting the cancel button class with a prop. --- src/components/views/elements/DialogButtons.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/views/elements/DialogButtons.js b/src/components/views/elements/DialogButtons.js index 4e47e73052..2cb25d9c9c 100644 --- a/src/components/views/elements/DialogButtons.js +++ b/src/components/views/elements/DialogButtons.js @@ -40,6 +40,10 @@ export default createReactClass({ // should there be a cancel button? default: true hasCancel: PropTypes.bool, + // The class of the cancel button, only used if a cancel button is + // enabled + cancelButtonClass: PropTypes.node, + // onClick handler for the cancel button. onCancel: PropTypes.func, @@ -69,8 +73,10 @@ export default createReactClass({ primaryButtonClassName += " " + this.props.primaryButtonClass; } let cancelButton; + if (this.props.cancelButton || this.props.hasCancel) { - cancelButton = ; } From 3208ac60c7b6ea453448ada43e08441a371d6758 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 16:47:29 +0100 Subject: [PATCH 243/906] ManageEventIndexDialog: Override the Disable button class to be danger. --- .../eventindex/ManageEventIndexDialog.js | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js index 66cd89f4ab..5f6f4985da 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js @@ -132,18 +132,8 @@ export default class ManageEventIndexDialog extends React.Component {
      ); - const buttons = ( -
      - - {_t("Disable")} - - - {_t("Done")} - -
      - ); - const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); + const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); return ( {eventIndexingSettings} - {buttons} + ); } From 9f3e5ab1db15b0aa4cf6d45528e9a0f2323f85a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 24 Jan 2020 16:52:26 +0100 Subject: [PATCH 244/906] ManageEventIndexDialog: Remove an unused import. --- .../views/dialogs/eventindex/ManageEventIndexDialog.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js index 5f6f4985da..5c82cc0391 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js @@ -22,7 +22,6 @@ import { _t } from '../../../../languageHandler'; import Modal from '../../../../Modal'; import {formatBytes, formatCountLong} from "../../../../utils/FormattingUtils"; import EventIndexPeg from "../../../../indexing/EventIndexPeg"; -import AccessibleButton from "../../../../components/views/elements/AccessibleButton"; /* * Allows the user to introspect the event index state and disable it. From abc2808b62d1cacb94d7a4e2403c5ee5f74faab8 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 24 Jan 2020 08:57:03 -0700 Subject: [PATCH 245/906] Fix i18n post-merge --- src/i18n/strings/en_EN.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 3c758ecbfb..eb06518c7a 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1475,7 +1475,6 @@ "Suggestions": "Suggestions", "Recently Direct Messaged": "Recently Direct Messaged", "Show more": "Show more", - "Direct Messages": "Direct Messages", "If you can't find someone, ask them for their username, share your username (%(userId)s) or profile link.": "If you can't find someone, ask them for their username, share your username (%(userId)s) or profile link.", "Go": "Go", "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.": "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.", From 7a5e172b88c959f94051db1f6d7424cf0ef8108f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 24 Jan 2020 16:16:46 +0000 Subject: [PATCH 246/906] Apply a huge part of the decorations and copy --- res/css/_components.scss | 2 + .../views/right_panel/_EncryptionInfo.scss | 24 + res/css/views/right_panel/_UserInfo.scss | 6 +- .../views/right_panel/_VerificationPanel.scss | 21 + src/components/structures/RightPanel.js | 25 +- .../views/messages/MKeyVerificationRequest.js | 3 +- .../views/right_panel/EncryptionInfo.js | 68 +- .../views/right_panel/EncryptionPanel.js | 72 +- src/components/views/right_panel/UserInfo.js | 619 ++++++++++-------- .../views/right_panel/VerificationPanel.js | 85 ++- .../views/toasts/VerificationRequestToast.js | 6 +- .../views/verification/VerificationShowSas.js | 55 +- src/i18n/strings/en_EN.json | 18 +- 13 files changed, 586 insertions(+), 418 deletions(-) create mode 100644 res/css/views/right_panel/_EncryptionInfo.scss create mode 100644 res/css/views/right_panel/_VerificationPanel.scss diff --git a/res/css/_components.scss b/res/css/_components.scss index 60f749de9c..e19050dc7e 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -140,7 +140,9 @@ @import "./views/messages/_TextualEvent.scss"; @import "./views/messages/_UnknownBody.scss"; @import "./views/messages/_ViewSourceEvent.scss"; +@import "./views/right_panel/_EncryptionInfo.scss"; @import "./views/right_panel/_UserInfo.scss"; +@import "./views/right_panel/_VerificationPanel.scss"; @import "./views/room_settings/_AliasSettings.scss"; @import "./views/room_settings/_ColorSettings.scss"; @import "./views/rooms/_AppsDrawer.scss"; diff --git a/res/css/views/right_panel/_EncryptionInfo.scss b/res/css/views/right_panel/_EncryptionInfo.scss new file mode 100644 index 0000000000..386eef8e7f --- /dev/null +++ b/res/css/views/right_panel/_EncryptionInfo.scss @@ -0,0 +1,24 @@ +/* +Copyright 2020 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. +*/ + +.mx_UserInfo { + .mx_EncryptionInfo_spinner { + .mx_Spinner { + margin-top: 25px; + margin-bottom: 15px; + } + } +} diff --git a/res/css/views/right_panel/_UserInfo.scss b/res/css/views/right_panel/_UserInfo.scss index 57ffd4982e..8aad5240aa 100644 --- a/res/css/views/right_panel/_UserInfo.scss +++ b/res/css/views/right_panel/_UserInfo.scss @@ -81,6 +81,7 @@ limitations under the License. .mx_UserInfo_avatar > div { max-width: 30vh; margin: 0 auto; + transition: 1s; } .mx_UserInfo_avatar > div > div { @@ -260,11 +261,6 @@ limitations under the License. .mx_UserInfo_verify { display: block; - background-color: $accent-color; - color: $accent-fg-color; - border-radius: 4px; - padding: 7px 1.5em; - text-align: center; margin: 16px 0; } } diff --git a/res/css/views/right_panel/_VerificationPanel.scss b/res/css/views/right_panel/_VerificationPanel.scss new file mode 100644 index 0000000000..84a82c9a5c --- /dev/null +++ b/res/css/views/right_panel/_VerificationPanel.scss @@ -0,0 +1,21 @@ +/* +Copyright 2020 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. +*/ + +.mx_UserInfo { + .mx_VerificationPanel_verified_section .mx_E2EIcon { + margin: 0 auto; + } +} diff --git a/src/components/structures/RightPanel.js b/src/components/structures/RightPanel.js index c01a3709e7..2188bda4f2 100644 --- a/src/components/structures/RightPanel.js +++ b/src/components/structures/RightPanel.js @@ -169,7 +169,6 @@ export default class RightPanel extends React.Component { const MemberList = sdk.getComponent('rooms.MemberList'); const MemberInfo = sdk.getComponent('rooms.MemberInfo'); const UserInfo = sdk.getComponent('right_panel.UserInfo'); - const EncryptionPanel = sdk.getComponent('right_panel.EncryptionPanel'); const ThirdPartyMemberInfo = sdk.getComponent('rooms.ThirdPartyMemberInfo'); const NotificationPanel = sdk.getComponent('structures.NotificationPanel'); const FilePanel = sdk.getComponent('structures.FilePanel'); @@ -187,19 +186,22 @@ export default class RightPanel extends React.Component { panel = ; } else if (this.state.phase === RIGHT_PANEL_PHASES.GroupRoomList) { panel = ; - } else if (this.state.phase === RIGHT_PANEL_PHASES.RoomMemberInfo) { + } else if (this.state.phase === RIGHT_PANEL_PHASES.RoomMemberInfo || + this.state.phase === RIGHT_PANEL_PHASES.EncryptionPanel) { if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { const onClose = () => { dis.dispatch({ action: "view_user", - member: null, + member: this.state.phase === RIGHT_PANEL_PHASES.EncryptionPanel ? this.state.member : null, }); }; panel = ; } else { panel = ; @@ -215,7 +217,7 @@ export default class RightPanel extends React.Component { }); }; panel = ; @@ -237,19 +239,6 @@ export default class RightPanel extends React.Component { panel = ; } else if (this.state.phase === RIGHT_PANEL_PHASES.FilePanel) { panel = ; - } else if (this.state.phase === RIGHT_PANEL_PHASES.EncryptionPanel) { - const onClose = () => { - dis.dispatch({ - action: "view_user", - member: this.state.member, - }); - }; - panel = ( - - ); } const classes = classNames("mx_RightPanel", "mx_fadable", { diff --git a/src/components/views/messages/MKeyVerificationRequest.js b/src/components/views/messages/MKeyVerificationRequest.js index ae793556d8..474ff7becb 100644 --- a/src/components/views/messages/MKeyVerificationRequest.js +++ b/src/components/views/messages/MKeyVerificationRequest.js @@ -45,10 +45,11 @@ export default class MKeyVerificationRequest extends React.Component { _openRequest = () => { const {verificationRequest} = this.props.mxEvent; + const member = MatrixClientPeg.get().getUser(verificationRequest.otherUserId); dis.dispatch({ action: "set_right_panel_phase", phase: RIGHT_PANEL_PHASES.EncryptionPanel, - refireParams: {verificationRequest}, + refireParams: {verificationRequest, member}, }); }; diff --git a/src/components/views/right_panel/EncryptionInfo.js b/src/components/views/right_panel/EncryptionInfo.js index 2d265967ae..8868c30053 100644 --- a/src/components/views/right_panel/EncryptionInfo.js +++ b/src/components/views/right_panel/EncryptionInfo.js @@ -1,5 +1,5 @@ /* -Copyright 2019 The Matrix.org Foundation C.I.C. +Copyright 2019, 2020 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. @@ -14,24 +14,58 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React from 'react'; -import * as sdk from '../../../index'; +import React from "react"; +import PropTypes from "prop-types"; + +import * as sdk from "../../../index"; import {_t} from "../../../languageHandler"; -export default class EncryptionInfo extends React.PureComponent { - render() { +export const PendingActionSpinner = ({text}) => { + const Spinner = sdk.getComponent('elements.Spinner'); + return
      + + { text } +
      ; +}; + +const EncryptionInfo = ({pending, member, onStartVerification}) => { + let content; + if (pending) { + const text = _t("Waiting for %(displayName)s to accept…", { + displayName: member.displayName || member.name || member.userId, + }); + content = ; + } else { const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); - return ( -
      -

      {_t("Verify User")}

      -
      -

      {_t("For extra security, verify this user by checking a one-time code on both of your devices.")}

      -

      {_t("For maximum security, do this in person.")}

      - - {_t("Start Verification")} - -
      -
      + content = ( + + {_t("Start Verification")} + ); } -} + + return +
      +

      {_t("Encryption")}

      +
      +

      {_t("Messages in this room are end-to-end encrypted.")}

      +

      {_t("Your messages are secured and only you and the recipient have the unique keys to unlock them.")}

      +
      +
      +
      +

      {_t("Verify User")}

      +
      +

      {_t("For extra security, verify this user by checking a one-time code on both of your devices.")}

      +

      {_t("For maximum security, do this in person.")}

      + { content } +
      +
      +
      ; +}; +EncryptionInfo.propTypes = { + member: PropTypes.object.isRequired, + onStartVerification: PropTypes.func.isRequired, + request: PropTypes.object, +}; + +export default EncryptionInfo; diff --git a/src/components/views/right_panel/EncryptionPanel.js b/src/components/views/right_panel/EncryptionPanel.js index a1008543e4..dfb145f61d 100644 --- a/src/components/views/right_panel/EncryptionPanel.js +++ b/src/components/views/right_panel/EncryptionPanel.js @@ -14,52 +14,42 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React from 'react'; +import React, {useCallback, useEffect, useState} from 'react'; + import EncryptionInfo from "./EncryptionInfo"; import VerificationPanel from "./VerificationPanel"; import {MatrixClientPeg} from "../../../MatrixClientPeg"; import {ensureDMExists} from "../../../createRoom"; -import {UserInfoPane} from "./UserInfo"; -import {_t} from "../../../languageHandler"; +import {useEventEmitter} from "../../../hooks/useEventEmitter"; -export default class EncryptionPanel extends React.PureComponent { - constructor(props) { - super(props); - this.state = {}; +const EncryptionPanel = ({verificationRequest, member}) => { + const [request, setRequest] = useState(verificationRequest); + useEffect(() => { + setRequest(verificationRequest); + }, [verificationRequest]); + + const [pending, setPending] = useState(false); + const changeHandler = useCallback(() => { + setPending(request && request.requested); + }, [request]); + useEventEmitter(request, "change", changeHandler); + useEffect(changeHandler, [changeHandler]); + + const onStartVerification = useCallback(async () => { + const cli = MatrixClientPeg.get(); + const roomId = await ensureDMExists(cli, member.userId); + const verificationRequest = await cli.requestVerificationDM(member.userId, roomId); + setRequest(verificationRequest); + }, [member.userId]); + + if (!request || pending) { + return ; + } else { + return ; } +}; +EncryptionPanel.propTypes = { - render() { - let content; - const request = this.props.verificationRequest || this.state.verificationRequest; - const {member} = this.props; - if (request) { - content = ; - } else if (member) { - content = ; - } else { - content =

      Not a member nor request, not sure what to render

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

      {_t("Encryption")}

      -
      -

      {_t("Messages in this room are end-to-end encrypted.")}

      -

      {_t("Your messages are secured and only you and the recipient have the unique keys to unlock them.")}

      -
      -
      - - { content } -
      - ); - } - - _onStartVerification = async () => { - const client = MatrixClientPeg.get(); - const {member} = this.props; - const roomId = await ensureDMExists(client, member.userId); - const verificationRequest = await client.requestVerificationDM(member.userId, roomId); - this.setState({verificationRequest}); - }; -} +export default EncryptionPanel; diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index a31e9a6ce0..41dbe49cc8 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -41,6 +41,7 @@ import {useEventEmitter} from "../../../hooks/useEventEmitter"; import {textualPowerLevel} from '../../../Roles'; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import {RIGHT_PANEL_PHASES} from "../../../stores/RightPanelStorePhases"; +import EncryptionPanel from "./EncryptionPanel"; const _disambiguateDevices = (devices) => { const names = Object.create(null); @@ -1047,7 +1048,256 @@ const PowerLevelEditor = ({user, room, roomPermissions, onFinished}) => { ); }; -export const UserInfoPane = ({children, className, onClose, e2eStatus, member}) => { +export const useDevices = (userId) => { + const cli = useContext(MatrixClientContext); + + // undefined means yet to be loaded, null means failed to load, otherwise list of devices + const [devices, setDevices] = useState(undefined); + // Download device lists + useEffect(() => { + setDevices(undefined); + + let cancelled = false; + + async function _downloadDeviceList() { + try { + await cli.downloadKeys([userId], true); + const devices = await cli.getStoredDevicesForUser(userId); + + if (cancelled) { + // we got cancelled - presumably a different user now + return; + } + + _disambiguateDevices(devices); + setDevices(devices); + } catch (err) { + setDevices(null); + } + } + _downloadDeviceList(); + + // Handle being unmounted + return () => { + cancelled = true; + }; + }, [cli, userId]); + + // Listen to changes + useEffect(() => { + let cancel = false; + const onDeviceVerificationChanged = (_userId, device) => { + if (_userId === userId) { + // no need to re-download the whole thing; just update our copy of the list. + + // Promise.resolve to handle transition from static result to promise; can be removed in future + Promise.resolve(cli.getStoredDevicesForUser(userId)).then((devices) => { + if (cancel) return; + console.log("setDevices 2", devices); + setDevices(devices); + }); + } + }; + cli.on("deviceVerificationChanged", onDeviceVerificationChanged); + // Handle being unmounted + return () => { + cancel = true; + cli.removeListener("deviceVerificationChanged", onDeviceVerificationChanged); + }; + }, [cli, userId]); + + return devices; +}; + +const BasicUserInfo = ({room, member, groupId, devices, isRoomEncrypted}) => { + const cli = useContext(MatrixClientContext); + + const powerLevels = useRoomPowerLevels(cli, room); + // Load whether or not we are a Synapse Admin + const isSynapseAdmin = useIsSynapseAdmin(cli); + + // Check whether the user is ignored + const [isIgnored, setIsIgnored] = useState(cli.isUserIgnored(member.userId)); + // Recheck if the user or client changes + useEffect(() => { + setIsIgnored(cli.isUserIgnored(member.userId)); + }, [cli, member.userId]); + // Recheck also if we receive new accountData m.ignored_user_list + const accountDataHandler = useCallback((ev) => { + if (ev.getType() === "m.ignored_user_list") { + setIsIgnored(cli.isUserIgnored(member.userId)); + } + }, [cli, member.userId]); + useEventEmitter(cli, "accountData", accountDataHandler); + + // Count of how many operations are currently in progress, if > 0 then show a Spinner + const [pendingUpdateCount, setPendingUpdateCount] = useState(0); + const startUpdating = useCallback(() => { + setPendingUpdateCount(pendingUpdateCount + 1); + }, [pendingUpdateCount]); + const stopUpdating = useCallback(() => { + setPendingUpdateCount(pendingUpdateCount - 1); + }, [pendingUpdateCount]); + + const roomPermissions = useRoomPermissions(cli, room, member); + + const onSynapseDeactivate = useCallback(async () => { + const QuestionDialog = sdk.getComponent('views.dialogs.QuestionDialog'); + const {finished} = Modal.createTrackedDialog('Synapse User Deactivation', '', QuestionDialog, { + title: _t("Deactivate user?"), + description: +
      { _t( + "Deactivating this user will log them out and prevent them from logging back in. Additionally, " + + "they will leave all the rooms they are in. This action cannot be reversed. Are you sure you " + + "want to deactivate this user?", + ) }
      , + button: _t("Deactivate user"), + danger: true, + }); + + const [accepted] = await finished; + if (!accepted) return; + try { + await cli.deactivateSynapseUser(member.userId); + } catch (err) { + console.error("Failed to deactivate user"); + console.error(err); + + const ErrorDialog = sdk.getComponent('dialogs.ErrorDialog'); + Modal.createTrackedDialog('Failed to deactivate Synapse user', '', ErrorDialog, { + title: _t('Failed to deactivate user'), + description: ((err && err.message) ? err.message : _t("Operation failed")), + }); + } + }, [cli, member.userId]); + + let synapseDeactivateButton; + let spinner; + + // We don't need a perfect check here, just something to pass as "probably not our homeserver". If + // someone does figure out how to bypass this check the worst that happens is an error. + // FIXME this should be using cli instead of MatrixClientPeg.matrixClient + if (isSynapseAdmin && member.userId.endsWith(`:${MatrixClientPeg.getHomeserverName()}`)) { + synapseDeactivateButton = ( + + {_t("Deactivate user")} + + ); + } + + let adminToolsContainer; + if (room && member.roomId) { + adminToolsContainer = ( + + { synapseDeactivateButton } + + ); + } else if (groupId) { + adminToolsContainer = ( + + { synapseDeactivateButton } + + ); + } else if (synapseDeactivateButton) { + adminToolsContainer = ( + + { synapseDeactivateButton } + + ); + } + + if (pendingUpdateCount > 0) { + const Loader = sdk.getComponent("elements.Spinner"); + spinner = ; + } + + const memberDetails = ( + + ); + + // only display the devices list if our client supports E2E + const _enableDevices = cli.isCryptoEnabled(); + + let text; + if (!isRoomEncrypted) { + if (!_enableDevices) { + text = _t("This client does not support end-to-end encryption."); + } else if (room) { + text = _t("Messages in this room are not end-to-end encrypted."); + } else { + // TODO what to render for GroupMember + } + } else { + text = _t("Messages in this room are end-to-end encrypted."); + } + + const userTrust = cli.checkUserTrust(member.userId); + const userVerified = SettingsStore.isFeatureEnabled("feature_cross_signing") ? + userTrust.isCrossSigningVerified() : + userTrust.isVerified(); + const isMe = member.userId === cli.getUserId(); + let verifyButton; + if (isRoomEncrypted && !userVerified && !isMe) { + verifyButton = ( + verifyUser(member)}> + {_t("Verify")} + + ); + } + + let devicesSection; + if (isRoomEncrypted) { + devicesSection = ; + } + + const securitySection = ( +
      +

      { _t("Security") }

      +

      { text }

      + { verifyButton } + { devicesSection } +
      + ); + + return + { memberDetails && +
      +
      + { memberDetails } +
      +
      } + + { securitySection } + + + { adminToolsContainer } + + { spinner } +
      ; +}; + +const UserInfoHeader = ({onClose, member, e2eStatus}) => { const cli = useContext(MatrixClientContext); let closeButton; @@ -1057,6 +1307,38 @@ export const UserInfoPane = ({children, className, onClose, e2eStatus, member})
      ; } + const onMemberAvatarClick = useCallback(() => { + const avatarUrl = member.getMxcAvatarUrl ? member.getMxcAvatarUrl() : member.avatarUrl; + if (!avatarUrl) return; + + const httpUrl = cli.mxcUrlToHttp(avatarUrl); + const ImageView = sdk.getComponent("elements.ImageView"); + const params = { + src: httpUrl, + name: member.name, + }; + + Modal.createDialog(ImageView, params, "mx_Dialog_lightbox"); + }, [cli, member]); + + const MemberAvatar = sdk.getComponent('avatars.MemberAvatar'); + const avatarElement = ( +
      +
      +
      + +
      +
      +
      + ); + let presenceState; let presenceLastActiveAgo; let presenceCurrentlyActive; @@ -1091,74 +1373,35 @@ export const UserInfoPane = ({children, className, onClose, e2eStatus, member}) statusLabel = { statusMessage }; } - const onMemberAvatarClick = useCallback(() => { - const avatarUrl = member.getMxcAvatarUrl ? member.getMxcAvatarUrl() : member.avatarUrl; - if (!avatarUrl) return; - - const httpUrl = cli.mxcUrlToHttp(avatarUrl); - const ImageView = sdk.getComponent("elements.ImageView"); - const params = { - src: httpUrl, - name: member.name, - }; - - Modal.createDialog(ImageView, params, "mx_Dialog_lightbox"); - }, [cli, member]); - - const MemberAvatar = sdk.getComponent('avatars.MemberAvatar'); - const avatarElement = ( -
      -
      -
      - -
      -
      -
      - ); - let e2eIcon; if (e2eStatus) { e2eIcon = ; } const displayName = member.name || member.displayname; + return + { closeButton } + { avatarElement } - return ( -
      - - { closeButton } - { avatarElement } - -
      -
      -
      -

      - { e2eIcon } - { displayName } -

      -
      -
      { member.userId }
      -
      - {presenceLabel} - {statusLabel} -
      -
      +
      +
      +
      +

      + { e2eIcon } + { displayName } +

      - - { children } - +
      { member.userId }
      +
      + {presenceLabel} + {statusLabel} +
      +
      - ); + ; }; -const UserInfo = ({user, groupId, roomId, onClose}) => { +const UserInfo = ({user, groupId, roomId, onClose, phase=RIGHT_PANEL_PHASES.RoomMemberInfo, ...props}) => { const cli = useContext(MatrixClientContext); // Load room if we are given a room id and memoize it @@ -1166,246 +1409,46 @@ const UserInfo = ({user, groupId, roomId, onClose}) => { // fetch latest room member if we have a room, so we don't show historical information, falling back to user const member = useMemo(() => room ? (room.getMember(user.userId) || user) : user, [room, user]); - // only display the devices list if our client supports E2E - const _enableDevices = cli.isCryptoEnabled(); - - const powerLevels = useRoomPowerLevels(cli, room); - // Load whether or not we are a Synapse Admin - const isSynapseAdmin = useIsSynapseAdmin(cli); - - // Check whether the user is ignored - const [isIgnored, setIsIgnored] = useState(cli.isUserIgnored(user.userId)); - // Recheck if the user or client changes - useEffect(() => { - setIsIgnored(cli.isUserIgnored(user.userId)); - }, [cli, user.userId]); - // Recheck also if we receive new accountData m.ignored_user_list - const accountDataHandler = useCallback((ev) => { - if (ev.getType() === "m.ignored_user_list") { - setIsIgnored(cli.isUserIgnored(user.userId)); - } - }, [cli, user.userId]); - useEventEmitter(cli, "accountData", accountDataHandler); - - // Count of how many operations are currently in progress, if > 0 then show a Spinner - const [pendingUpdateCount, setPendingUpdateCount] = useState(0); - const startUpdating = useCallback(() => { - setPendingUpdateCount(pendingUpdateCount + 1); - }, [pendingUpdateCount]); - const stopUpdating = useCallback(() => { - setPendingUpdateCount(pendingUpdateCount - 1); - }, [pendingUpdateCount]); - - const roomPermissions = useRoomPermissions(cli, room, member); - - const onSynapseDeactivate = useCallback(async () => { - const QuestionDialog = sdk.getComponent('views.dialogs.QuestionDialog'); - const {finished} = Modal.createTrackedDialog('Synapse User Deactivation', '', QuestionDialog, { - title: _t("Deactivate user?"), - description: -
      { _t( - "Deactivating this user will log them out and prevent them from logging back in. Additionally, " + - "they will leave all the rooms they are in. This action cannot be reversed. Are you sure you " + - "want to deactivate this user?", - ) }
      , - button: _t("Deactivate user"), - danger: true, - }); - - const [accepted] = await finished; - if (!accepted) return; - try { - await cli.deactivateSynapseUser(user.userId); - } catch (err) { - console.error("Failed to deactivate user"); - console.error(err); - - const ErrorDialog = sdk.getComponent('dialogs.ErrorDialog'); - Modal.createTrackedDialog('Failed to deactivate Synapse user', '', ErrorDialog, { - title: _t('Failed to deactivate user'), - description: ((err && err.message) ? err.message : _t("Operation failed")), - }); - } - }, [cli, user.userId]); - - let synapseDeactivateButton; - let spinner; - - // We don't need a perfect check here, just something to pass as "probably not our homeserver". If - // someone does figure out how to bypass this check the worst that happens is an error. - // FIXME this should be using cli instead of MatrixClientPeg.matrixClient - if (isSynapseAdmin && user.userId.endsWith(`:${MatrixClientPeg.getHomeserverName()}`)) { - synapseDeactivateButton = ( - - {_t("Deactivate user")} - - ); - } - - let adminToolsContainer; - if (room && member.roomId) { - adminToolsContainer = ( - - { synapseDeactivateButton } - - ); - } else if (groupId) { - adminToolsContainer = ( - - { synapseDeactivateButton } - - ); - } else if (synapseDeactivateButton) { - adminToolsContainer = ( - - { synapseDeactivateButton } - - ); - } - - if (pendingUpdateCount > 0) { - const Loader = sdk.getComponent("elements.Spinner"); - spinner = ; - } - - const memberDetails = ( - - ); - const isRoomEncrypted = useIsEncrypted(cli, room); - // undefined means yet to be loaded, null means failed to load, otherwise list of devices - const [devices, setDevices] = useState(undefined); - // Download device lists - useEffect(() => { - setDevices(undefined); - - let cancelled = false; - - async function _downloadDeviceList() { - try { - await cli.downloadKeys([user.userId], true); - const devices = await cli.getStoredDevicesForUser(user.userId); - - if (cancelled) { - // we got cancelled - presumably a different user now - return; - } - - _disambiguateDevices(devices); - setDevices(devices); - } catch (err) { - setDevices(null); - } - } - _downloadDeviceList(); - - // Handle being unmounted - return () => { - cancelled = true; - }; - }, [cli, user.userId]); - - // Listen to changes - useEffect(() => { - let cancel = false; - const onDeviceVerificationChanged = (_userId, device) => { - if (_userId === user.userId) { - // no need to re-download the whole thing; just update our copy of the list. - - // Promise.resolve to handle transition from static result to promise; can be removed in future - Promise.resolve(cli.getStoredDevicesForUser(user.userId)).then((devices) => { - if (cancel) return; - setDevices(devices); - }); - } - }; - cli.on("deviceVerificationChanged", onDeviceVerificationChanged); - // Handle being unmounted - return () => { - cancel = true; - cli.removeListener("deviceVerificationChanged", onDeviceVerificationChanged); - }; - }, [cli, user.userId]); - - let text; - if (!isRoomEncrypted) { - if (!_enableDevices) { - text = _t("This client does not support end-to-end encryption."); - } else if (room) { - text = _t("Messages in this room are not end-to-end encrypted."); - } else { - // TODO what to render for GroupMember - } - } else { - text = _t("Messages in this room are end-to-end encrypted."); - } - - const userTrust = cli.checkUserTrust(user.userId); - const userVerified = SettingsStore.isFeatureEnabled("feature_cross_signing") ? - userTrust.isCrossSigningVerified() : - userTrust.isVerified(); - const isMe = user.userId === cli.getUserId(); - let verifyButton; - if (isRoomEncrypted && !userVerified && !isMe) { - verifyButton = verifyUser(user)}> - {_t("Verify")} - ; - } - - let devicesSection; - if (isRoomEncrypted) { - devicesSection = ; - } - - const securitySection = ( -
      -

      { _t("Security") }

      -

      { text }

      - { verifyButton } - { devicesSection } -
      - ); + const devices = useDevices(user.userId); let e2eStatus; if (isRoomEncrypted && devices) { e2eStatus = getE2EStatus(cli, user.userId, devices); } - return - { memberDetails && -
      -
      - { memberDetails } -
      -
      } + const classes = ["mx_UserInfo"]; - { securitySection } - + let content; + switch (phase) { + case RIGHT_PANEL_PHASES.RoomMemberInfo: + case RIGHT_PANEL_PHASES.GroupMemberInfo: + content = ( + + ); + break; + case RIGHT_PANEL_PHASES.EncryptionPanel: + classes.push("mx_UserInfo_smallAvatar"); + content = ( + + ); + break; + } - { adminToolsContainer } + return ( +
      + + - { spinner } - ; + { content } + +
      + ); }; UserInfo.propTypes = { diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 0d28e1568f..a66ecd34fb 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -1,5 +1,5 @@ /* -Copyright 2019 The Matrix.org Foundation C.I.C. +Copyright 2019, 2020 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. @@ -15,8 +15,11 @@ limitations under the License. */ import React from 'react'; + import * as sdk from '../../../index'; import {verificationMethods} from 'matrix-js-sdk/src/crypto'; +import {_t} from "../../../languageHandler"; +import E2EIcon from "../rooms/E2EIcon"; export default class VerificationPanel extends React.PureComponent { constructor(props) { @@ -25,46 +28,81 @@ export default class VerificationPanel extends React.PureComponent { this._hasVerifier = !!props.request.verifier; } - render() { - return
      + renderQRPhase() { + const {member} = this.props; + // TODO change the button into a spinner when on click + const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); + return
      - { this.renderStatus() } +

      Verify by scanning

      +

      {_t("Ask %(displayName)s to scan your code, or open your camera to scan theirs:", { + displayName: member.displayName || member.name || member.userId, + }, { + a: t => { t }, + })}

      +
      QR Code
      -
      ; + +
      +

      Verify by emoji

      +

      {_t("If you can't scan the code above, verify by comparing unique emoji.")}

      + + {_t("Verify by emoji")} + +
      + ; } - renderStatus() { - const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); - const Spinner = sdk.getComponent('elements.Spinner'); - const {request} = this.props; + renderVerifiedPhase() { + const {member} = this.props; - if (request.requested) { - return (

      Waiting for {request.otherUserId} to accept ...

      ); - } else if (request.ready) { - const verifyButton = - Verify by emoji - ; - return (

      {request.otherUserId} is ready, start {verifyButton}

      ); + const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); + return ( +
      +

      Verified

      +

      {_t("You've successfully verified %(displayName)s!", { + displayName: member.displayName || member.name || member.userId, + })}

      + +

      Verify all users in a room to ensure it's secure.

      + + {_t("Got it")} + +
      + ); + } + + render() { + const {member, request} = this.props; + + const displayName = member.displayName || member.name || member.userId; + + if (request.ready) { + return this.renderQRPhase(); } else if (request.started) { - if (this.state.sasWaitingForOtherParty) { - return

      Waiting for {request.otherUserId} to confirm ...

      ; - } else if (this.state.sasEvent) { + if (this.state.sasEvent) { const VerificationShowSas = sdk.getComponent('views.verification.VerificationShowSas'); - return (
      + // TODO implement "mismatch" vs "cancelled" + return
      +

      Compare emoji

      -
      ); +
      ; } else { return (

      Setting up SAS verification...

      ); } } else if (request.done) { - return

      verified {request.otherUserId}!!

      ; + return this.renderVerifiedPhase(); } else if (request.cancelled) { + // TODO check if this matches target + // TODO should this be a MODAL? return

      cancelled by {request.cancellingUserId}!

      ; } + return null; } _startSAS = async () => { @@ -79,7 +117,6 @@ export default class VerificationPanel extends React.PureComponent { }; _onSasMatchesClick = () => { - this.setState({sasWaitingForOtherParty: true}); this.state.sasEvent.confirm(); }; @@ -106,7 +143,7 @@ export default class VerificationPanel extends React.PureComponent { request.verifier.removeListener('show_sas', this._onVerifierShowSas); } this._hasVerifier = !!request.verifier; - this.forceUpdate(); + this.forceUpdate(); // TODO fix this }; componentDidMount() { diff --git a/src/components/views/toasts/VerificationRequestToast.js b/src/components/views/toasts/VerificationRequestToast.js index 479a3e3f93..769e0d36d0 100644 --- a/src/components/views/toasts/VerificationRequestToast.js +++ b/src/components/views/toasts/VerificationRequestToast.js @@ -76,10 +76,14 @@ export default class VerificationRequestToast extends React.PureComponent { } try { await request.accept(); + const cli = MatrixClientPeg.get(); dis.dispatch({ action: "set_right_panel_phase", phase: RIGHT_PANEL_PHASES.EncryptionPanel, - refireParams: {verificationRequest: request}, + refireParams: { + verificationRequest: request, + member: cli.getUser(request.otherUserId), + }, }); } catch (err) { console.error(err.message); diff --git a/src/components/views/verification/VerificationShowSas.js b/src/components/views/verification/VerificationShowSas.js index 8f39457689..693a3769a0 100644 --- a/src/components/views/verification/VerificationShowSas.js +++ b/src/components/views/verification/VerificationShowSas.js @@ -18,6 +18,8 @@ import React from 'react'; import PropTypes from 'prop-types'; import * as sdk from '../../../index'; import { _t, _td } from '../../../languageHandler'; +import {PendingActionSpinner} from "../right_panel/EncryptionInfo"; +import AccessibleButton from "../elements/AccessibleButton"; function capFirst(s) { return s.charAt(0).toUpperCase() + s.slice(1); @@ -25,18 +27,26 @@ function capFirst(s) { export default class VerificationShowSas extends React.Component { static propTypes = { + displayName: PropTypes.string.isRequired, onDone: PropTypes.func.isRequired, onCancel: PropTypes.func.isRequired, sas: PropTypes.object.isRequired, + }; + + constructor(props) { + super(props); + + this.state = { + pending: false, + }; } - constructor() { - super(); - } + onMatchClick = () => { + this.setState({ pending: true }); + this.props.onDone(); + }; render() { - const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); - let sasDisplay; let sasCaption; if (this.props.sas.emoji) { @@ -69,26 +79,33 @@ export default class VerificationShowSas extends React.Component { } else { return
      {_t("Unable to find a supported verification method.")} - + + {_t('Cancel')} +
      ; } + let confirm; + if (this.state.pending) { + const {displayName} = this.props; + const text = _t("Waiting for %(displayName)s to verify…", {displayName}); + confirm = ; + } else { + confirm = + + {_t("They match")} + + + {_t("They don't match")} + + ; + } + return

      {sasCaption}

      -

      {_t( - "For maximum security, we recommend you do this in person or use another " + - "trusted means of communication.", - )}

      +

      {_t("For ultimate security, do this in person or use another way to communicate.")}

      {sasDisplay} - + {confirm}
      ; } } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index c99b22f421..5b131b8750 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -451,7 +451,10 @@ "Verify this user by confirming the following number appears on their screen.": "Verify this user by confirming the following number appears on their screen.", "Unable to find a supported verification method.": "Unable to find a supported verification method.", "Cancel": "Cancel", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "For maximum security, we recommend you do this in person or use another trusted means of communication.", + "Waiting for %(displayName)s to verify…": "Waiting for %(displayName)s to verify…", + "They match": "They match", + "They don't match": "They don't match", + "For ultimate security, do this in person or use another way to communicate.": "For ultimate security, do this in person or use another way to communicate.", "Dog": "Dog", "Cat": "Cat", "Lion": "Lion", @@ -1124,12 +1127,13 @@ "URL previews are disabled by default for participants in this room.": "URL previews are disabled by default for participants in this room.", "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 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.", "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.": "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.", - "Verify User": "Verify User", - "For extra security, verify this user by checking a one-time code on both of your devices.": "For extra security, verify this user by checking a one-time code on both of your devices.", - "For maximum security, do this in person.": "For maximum security, do this in person.", + "Waiting for %(displayName)s to accept…": "Waiting for %(displayName)s to accept…", "Start Verification": "Start Verification", "Messages in this room are end-to-end encrypted.": "Messages in this room are end-to-end encrypted.", "Your messages are secured and only you and the recipient have the unique keys to unlock them.": "Your messages are secured and only you and the recipient have the unique keys to unlock them.", + "Verify User": "Verify User", + "For extra security, verify this user by checking a one-time code on both of your devices.": "For extra security, verify this user by checking a one-time code on both of your devices.", + "For maximum security, do this in person.": "For maximum security, do this in person.", "Members": "Members", "Files": "Files", "Trusted": "Trusted", @@ -1147,6 +1151,11 @@ "This client does not support end-to-end encryption.": "This client does not support end-to-end encryption.", "Messages in this room are not end-to-end encrypted.": "Messages in this room are not end-to-end encrypted.", "Security": "Security", + "Ask %(displayName)s to scan your code, or open your camera to scan theirs:": "Ask %(displayName)s to scan your code, or open your camera to scan theirs:", + "If you can't scan the code above, verify by comparing unique emoji.": "If you can't scan the code above, verify by comparing unique emoji.", + "Verify by emoji": "Verify by emoji", + "You've successfully verified %(displayName)s!": "You've successfully verified %(displayName)s!", + "Got it": "Got it", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", @@ -1426,6 +1435,7 @@ "Verify device": "Verify device", "Use Legacy Verification (for older clients)": "Use Legacy Verification (for older clients)", "Verify by comparing a short text string.": "Verify by comparing a short text string.", + "For maximum security, we recommend you do this in person or use another trusted means of communication.": "For maximum security, we recommend you do this in person or use another trusted means of communication.", "Begin Verifying": "Begin Verifying", "Waiting for partner to accept...": "Waiting for partner to accept...", "Nothing appearing? Not all clients support interactive verification yet. .": "Nothing appearing? Not all clients support interactive verification yet. .", From f8e0dcf26437c03c384ace261b53f06cb5a2293d Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 24 Jan 2020 09:33:55 -0700 Subject: [PATCH 247/906] Add null check for cross-signing info in verification panel --- src/components/views/right_panel/VerificationPanel.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index a29546c8f7..70ef8486bd 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -49,12 +49,12 @@ export default class VerificationPanel extends React.PureComponent { Verify by emoji ; - if (request.requestEvent && request.requestEvent.getId()) { + const crossSigningInfo = MatrixClientPeg.get().getStoredCrossSigningForUser(request.otherUserId); + if (request.requestEvent && request.requestEvent.getId() && crossSigningInfo) { const qrCodeKeys = [ [MatrixClientPeg.get().getDeviceId(), MatrixClientPeg.get().getDeviceEd25519Key()], [MatrixClientPeg.get().getCrossSigningId(), MatrixClientPeg.get().getCrossSigningId()], ]; - const crossSigningInfo = MatrixClientPeg.get().getStoredCrossSigningForUser(request.otherUserId); const qrCode = Date: Fri, 24 Jan 2020 09:37:12 -0700 Subject: [PATCH 248/906] Also check for our own key ID --- src/components/views/right_panel/VerificationPanel.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 70ef8486bd..403cff818c 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -50,10 +50,11 @@ export default class VerificationPanel extends React.PureComponent { ; const crossSigningInfo = MatrixClientPeg.get().getStoredCrossSigningForUser(request.otherUserId); + const myKeyId = MatrixClientPeg.get().getCrossSigningId(); if (request.requestEvent && request.requestEvent.getId() && crossSigningInfo) { const qrCodeKeys = [ [MatrixClientPeg.get().getDeviceId(), MatrixClientPeg.get().getDeviceEd25519Key()], - [MatrixClientPeg.get().getCrossSigningId(), MatrixClientPeg.get().getCrossSigningId()], + [myKeyId, MatrixClientPeg.get().getCrossSigningId()], ]; const qrCode = Date: Fri, 24 Jan 2020 16:41:43 +0000 Subject: [PATCH 249/906] post-merge fix --- src/components/structures/RightPanel.js | 4 +-- .../views/right_panel/VerificationPanel.js | 30 +++++++++++++++++-- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/components/structures/RightPanel.js b/src/components/structures/RightPanel.js index 2188bda4f2..79955c8448 100644 --- a/src/components/structures/RightPanel.js +++ b/src/components/structures/RightPanel.js @@ -196,7 +196,7 @@ export default class RightPanel extends React.Component { }); }; panel = ; diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index cbabb1188a..0fdf16de65 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -19,7 +19,6 @@ import React from 'react'; import * as sdk from '../../../index'; import {verificationMethods} from 'matrix-js-sdk/src/crypto'; import VerificationQRCode from "../elements/crypto/VerificationQRCode"; -import {VerificationRequest} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; import {MatrixClientPeg} from "../../../MatrixClientPeg"; import {_t} from "../../../languageHandler"; import E2EIcon from "../rooms/E2EIcon"; @@ -32,9 +31,26 @@ export default class VerificationPanel extends React.PureComponent { } renderQRPhase() { - const {member} = this.props; + const {member, request} = this.props; // type req: VerificationRequest // TODO change the button into a spinner when on click const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); + + if (!request.requestEvent || !request.requestEvent.getId()) { + // TODO handle this error case + return

      request.requestEvent.getId()

      ; + } + + const qrCodeKeys = [ + [MatrixClientPeg.get().getDeviceId(), MatrixClientPeg.get().getDeviceEd25519Key()], + [MatrixClientPeg.get().getCrossSigningId(), MatrixClientPeg.get().getCrossSigningId()], + ]; + const crossSigningInfo = MatrixClientPeg.get().getStoredCrossSigningForUser(request.otherUserId); + + if (!crossSigningInfo) { + // TODO handle this error case + return

      crossSigningInfo

      ; + } + return

      Verify by scanning

      @@ -43,12 +59,20 @@ export default class VerificationPanel extends React.PureComponent { }, { a: t => { t }, })}

      -
      QR Code
      + +

      Verify by emoji

      {_t("If you can't scan the code above, verify by comparing unique emoji.")}

      + {_t("Verify by emoji")} From 540a7f5c02f7b5151c38edcb4cd715e62294704c Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 24 Jan 2020 09:41:47 -0700 Subject: [PATCH 250/906] less duplication --- src/components/views/right_panel/VerificationPanel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 403cff818c..a75afd154a 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -54,7 +54,7 @@ export default class VerificationPanel extends React.PureComponent { if (request.requestEvent && request.requestEvent.getId() && crossSigningInfo) { const qrCodeKeys = [ [MatrixClientPeg.get().getDeviceId(), MatrixClientPeg.get().getDeviceEd25519Key()], - [myKeyId, MatrixClientPeg.get().getCrossSigningId()], + [myKeyId, myKeyId], ]; const qrCode = Date: Fri, 24 Jan 2020 17:31:00 +0000 Subject: [PATCH 251/906] Update profile avatar letter size Fixes https://github.com/vector-im/riot-web/issues/12042 --- res/css/views/right_panel/_UserInfo.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/views/right_panel/_UserInfo.scss b/res/css/views/right_panel/_UserInfo.scss index d2d9d12c6d..ad6254f57c 100644 --- a/res/css/views/right_panel/_UserInfo.scss +++ b/res/css/views/right_panel/_UserInfo.scss @@ -103,7 +103,7 @@ limitations under the License. justify-content: center; // override the calculated sizes so that the letter isn't HUGE - font-size: 26px !important; + font-size: 56px !important; width: 100% !important; } From bf0e1efce8441d8b8bd06243255617da76a11ffc Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Fri, 24 Jan 2020 17:53:30 +0000 Subject: [PATCH 252/906] Hide default encryption algorithm When the default encryption algorithm is used, we hide it to remove some jargon from the app. For any other algorithm, we continue showing it and add "unrecognised". Fixes https://github.com/vector-im/riot-web/issues/8829 --- src/TextForEvent.js | 17 +++++++++++++---- src/i18n/strings/en_EN.json | 3 ++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index 6a2744109b..cdfea45ad7 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -444,10 +444,19 @@ function textForHistoryVisibilityEvent(event) { function textForEncryptionEvent(event) { const senderName = event.sender ? event.sender.name : event.getSender(); - return _t('%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).', { - senderName, - algorithm: event.getContent().algorithm, - }); + if (event.getContent().algorithm === "m.megolm.v1.aes-sha2") { + return _t('%(senderName)s turned on end-to-end encryption.', { + senderName, + }); + } + return _t( + '%(senderName)s turned on end-to-end encryption ' + + '(unrecognised algorithm %(algorithm)s).', + { + senderName, + algorithm: event.getContent().algorithm, + }, + ); } // Currently will only display a change if a user's power level is changed diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index c3ad3d1901..79f5731aed 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -256,7 +256,8 @@ "%(senderName)s made future room history visible to all room members.": "%(senderName)s made future room history visible to all room members.", "%(senderName)s made future room history visible to anyone.": "%(senderName)s made future room history visible to anyone.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s made future room history visible to unknown (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).", + "%(senderName)s turned on end-to-end encryption.": "%(senderName)s turned on end-to-end encryption.", + "%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s changed the power level of %(powerLevelDiffText)s.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.", From 3d7137d4adeb4fa69742605e1828c53dabb5a2e2 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 24 Jan 2020 19:11:57 +0000 Subject: [PATCH 253/906] Setup flow for cross-signing on login / registration Still outstanding: * Keep password from login / registration * Confirmation on skip button Fixes https://github.com/vector-im/riot-web/issues/11902 --- res/css/_common.scss | 18 ++++--- res/css/views/auth/_AuthBody.scss | 9 ++-- .../_CreateSecretStorageDialog.scss | 4 ++ .../CreateSecretStorageDialog.js | 39 +++++++++++---- src/components/structures/MatrixChat.js | 35 +++++++++++--- src/components/structures/RoomView.js | 2 +- src/components/structures/auth/E2eSetup.js | 48 +++++++++++++++++++ src/components/views/auth/AuthBody.js | 4 ++ .../keybackup/RestoreKeyBackupDialog.js | 25 ++++++++++ 9 files changed, 159 insertions(+), 25 deletions(-) create mode 100644 src/components/structures/auth/E2eSetup.js diff --git a/res/css/_common.scss b/res/css/_common.scss index abc57a95ed..b92a618504 100644 --- a/res/css/_common.scss +++ b/res/css/_common.scss @@ -386,7 +386,13 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { text-align: right; } -.mx_Dialog button, .mx_Dialog input[type="submit"] { +/* XXX: Our button style are a mess: buttons that happen to appear in dialogs get special styles applied + * to them that no button anywhere else in the app gets by default. In practice, buttons in other places + * in the app look the same by being AccessibleButtons, or possibly by having explict button classes. + * We should go through and have one consistent set of styles for buttons throughout the app. + * For now, I am duplicating the selectors here for mx_Dialog and mx_DialogButtons. + */ +.mx_Dialog button, .mx_Dialog input[type="submit"], .mx_Dialog_buttons button, .mx_Dialog_buttons input[type="submit"] { @mixin mx_DialogButton; margin-left: 0px; margin-right: 8px; @@ -402,27 +408,27 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { margin-right: 0px; } -.mx_Dialog button:hover, .mx_Dialog input[type="submit"]:hover { +.mx_Dialog button:hover, .mx_Dialog input[type="submit"]:hover, .mx_Dialog_buttons button:hover, .mx_Dialog_buttons input[type="submit"]:hover { @mixin mx_DialogButton_hover; } -.mx_Dialog button:focus, .mx_Dialog input[type="submit"]:focus { +.mx_Dialog button:focus, .mx_Dialog input[type="submit"]:focus, .mx_Dialog_buttons button:focus, .mx_Dialog_buttons input[type="submit"]:focus { filter: brightness($focus-brightness); } -.mx_Dialog button.mx_Dialog_primary, .mx_Dialog input[type="submit"].mx_Dialog_primary { +.mx_Dialog button.mx_Dialog_primary, .mx_Dialog input[type="submit"].mx_Dialog_primary, .mx_Dialog_buttons button.mx_Dialog_primary, .mx_Dialog_buttons input[type="submit"].mx_Dialog_primary { color: $accent-fg-color; background-color: $accent-color; min-width: 156px; } -.mx_Dialog button.danger, .mx_Dialog input[type="submit"].danger { +.mx_Dialog button.danger, .mx_Dialog input[type="submit"].danger, .mx_Dialog_buttons button.danger, .mx_Dialog_buttons input[type="submit"].danger { background-color: $warning-color; border: solid 1px $warning-color; color: $accent-fg-color; } -.mx_Dialog button:disabled, .mx_Dialog input[type="submit"]:disabled { +.mx_Dialog button:disabled, .mx_Dialog input[type="submit"]:disabled, .mx_Dialog_buttons button:disabled, .mx_Dialog_buttons input[type="submit"]:disabled { background-color: $light-fg-color; border: solid 1px $light-fg-color; opacity: 0.7; diff --git a/res/css/views/auth/_AuthBody.scss b/res/css/views/auth/_AuthBody.scss index d342de6d75..51b9775811 100644 --- a/res/css/views/auth/_AuthBody.scss +++ b/res/css/views/auth/_AuthBody.scss @@ -15,13 +15,10 @@ limitations under the License. */ .mx_AuthBody { - width: 500px; background-color: $authpage-body-bg-color; border-radius: 0 4px 4px 0; padding: 25px 60px; box-sizing: border-box; - font-size: 12px; - color: $authpage-secondary-color; h2 { font-size: 24px; @@ -99,6 +96,12 @@ limitations under the License. border-radius: 4px; } +.mx_AuthBody_loginRegister { + width: 500px; + font-size: 12px; + color: $authpage-secondary-color; +} + .mx_AuthBody_editServerDetails { padding-left: 1em; font-size: 12px; diff --git a/res/css/views/dialogs/secretstorage/_CreateSecretStorageDialog.scss b/res/css/views/dialogs/secretstorage/_CreateSecretStorageDialog.scss index ed5aaa05a3..53e82670e1 100644 --- a/res/css/views/dialogs/secretstorage/_CreateSecretStorageDialog.scss +++ b/res/css/views/dialogs/secretstorage/_CreateSecretStorageDialog.scss @@ -78,6 +78,10 @@ limitations under the License. align-items: center; } +.mx_CreateSecretStorageDialog_recoveryKeyButtons .mx_AccessibleButton { + margin-right: 10px; +} + .mx_CreateSecretStorageDialog_recoveryKeyButtons button { flex: 1; white-space: nowrap; diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 8fd881fc32..92ede334d0 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -16,6 +16,7 @@ limitations under the License. */ import React from 'react'; +import PropTypes from 'prop-types'; import * as sdk from '../../../../index'; import {MatrixClientPeg} from '../../../../MatrixClientPeg'; import { scorePassword } from '../../../../utils/PasswordScorer'; @@ -52,6 +53,14 @@ function selectText(target) { * Secret Storage in account data. */ export default class CreateSecretStorageDialog extends React.PureComponent { + static propTypes = { + hasCancel: PropTypes.bool, + }; + + defaultProps = { + hasCancel: true, + }; + constructor(props) { super(props); @@ -82,9 +91,12 @@ export default class CreateSecretStorageDialog extends React.PureComponent { this._fetchBackupInfo(); this._queryKeyUploadAuth(); + + MatrixClientPeg.get().on('crypto.keyBackupStatus', this._onKeyBackupStatusChange); } componentWillUnmount() { + MatrixClientPeg.get().removeListener('crypto.keyBackupStatus', this._onKeyBackupStatusChange); if (this._setZxcvbnResultTimeout !== null) { clearTimeout(this._setZxcvbnResultTimeout); } @@ -92,7 +104,10 @@ export default class CreateSecretStorageDialog extends React.PureComponent { async _fetchBackupInfo() { const backupInfo = await MatrixClientPeg.get().getKeyBackupVersion(); - const backupSigStatus = await MatrixClientPeg.get().isKeyBackupTrusted(backupInfo); + const backupSigStatus = ( + // we may not have started crypto yet, in which case we definitely don't trust the backup + MatrixClientPeg.get().isCryptoEnabled() && await MatrixClientPeg.get().isKeyBackupTrusted(backupInfo) + ); const phase = backupInfo ? (backupSigStatus.usable ? PHASE_MIGRATE : PHASE_RESTORE_KEY_BACKUP) : @@ -127,6 +142,10 @@ export default class CreateSecretStorageDialog extends React.PureComponent { } } + _onKeyBackupStatusChange = () => { + this._fetchBackupInfo(); + } + _collectRecoveryKeyNode = (n) => { this._recoveryKeyNode = n; } @@ -229,7 +248,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { _onRestoreKeyBackupClick = () => { const RestoreKeyBackupDialog = sdk.getComponent('dialogs.keybackup.RestoreKeyBackupDialog'); Modal.createTrackedDialog( - 'Restore Backup', '', RestoreKeyBackupDialog, null, null, + 'Restore Backup', '', RestoreKeyBackupDialog, {showSummary: false}, null, /* priority = */ false, /* static = */ true, ); } @@ -411,6 +430,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { _renderPhasePassPhrase() { const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); const Field = sdk.getComponent('views.elements.Field'); + const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); let strengthMeter; let helpText; @@ -472,9 +492,9 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
      {_t("Advanced")} -

      +

      ; } @@ -554,6 +574,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { ); } + const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); return

      {_t( "Your recovery key is a safety net - you can use it to restore " + @@ -572,12 +593,12 @@ export default class CreateSecretStorageDialog extends React.PureComponent { {this._encodedRecoveryKey}

      - - +
      @@ -740,7 +761,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { onFinished={this.props.onFinished} title={this._titleForPhase(this.state.phase)} headerImage={headerImage} - hasCancel={[PHASE_PASSPHRASE].includes(this.state.phase)} + hasCancel={this.props.hasCancel && [PHASE_PASSPHRASE].includes(this.state.phase)} >
      {content} diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 0486ce764c..b4b38d7617 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -89,12 +89,15 @@ export const VIEWS = { // showing flow to trust this new device with cross-signing COMPLETE_SECURITY: 6, + // flow to setup SSSS / cross-signing on this account + E2E_SETUP: 7, + // we are logged in with an active matrix client. - LOGGED_IN: 7, + LOGGED_IN: 8, // We are logged out (invalid token) but have our local state again. The user // should log back in to rehydrate the client. - SOFT_LOGOUT: 8, + SOFT_LOGOUT: 9, }; // Actions that are redirected through the onboarding process prior to being @@ -657,7 +660,9 @@ export default createReactClass({ if ( !Lifecycle.isSoftLogout() && this.state.view !== VIEWS.LOGIN && - this.state.view !== VIEWS.COMPLETE_SECURITY + this.state.view !== VIEWS.REGISTER && + this.state.view !== VIEWS.COMPLETE_SECURITY && + this.state.view !== VIEWS.E2E_SETUP ) { this._onLoggedIn(); } @@ -1724,6 +1729,11 @@ export default createReactClass({ this.showScreen("forgot_password"); }, + onRegisterFlowComplete: function(credentials) { + this.onUserCompletedLoginFlow(); + return this.onRegistered(credentials); + }, + // returns a promise which resolves to the new MatrixClient onRegistered: function(credentials) { return Lifecycle.setLoggedIn(credentials); @@ -1847,12 +1857,18 @@ export default createReactClass({ if (masterKeyInStorage) { this.setStateForNewView({ view: VIEWS.COMPLETE_SECURITY }); + } else if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { + // This will only work if the feature is set to 'enable' in the config, + // since it's too early in the lifecycle for users to have turned the + // labs flag on. + this.setStateForNewView({ view: VIEWS.E2E_SETUP }); } else { this._onLoggedIn(); } }, - onCompleteSecurityFinished() { + // complete security / e2e setup has finished + onCompleteSecurityE2eSetupFinished() { this._onLoggedIn(); }, @@ -1872,7 +1888,14 @@ export default createReactClass({ const CompleteSecurity = sdk.getComponent('structures.auth.CompleteSecurity'); view = ( + ); + } else if (this.state.view === VIEWS.E2E_SETUP) { + const E2eSetup = sdk.getComponent('structures.auth.E2eSetup'); + view = ( + ); } else if (this.state.view === VIEWS.POST_REGISTRATION) { @@ -1939,7 +1962,7 @@ export default createReactClass({ email={this.props.startingFragmentQueryParams.email} brand={this.props.config.brand} makeRegistrationUrl={this._makeRegistrationUrl} - onLoggedIn={this.onRegistered} + onLoggedIn={this.onRegisterFlowComplete} onLoginClick={this.onLoginClick} onServerConfigChange={this.onServerConfigChange} {...this.getServerProperties()} diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 5c243f04bc..60fff5f1e3 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -766,7 +766,7 @@ export default createReactClass({ onUserVerificationChanged: function(userId, _trustStatus) { const room = this.state.room; - if (!room.currentState.getMember(userId)) { + if (!room || !room.currentState.getMember(userId)) { return; } this._updateE2EStatus(room); diff --git a/src/components/structures/auth/E2eSetup.js b/src/components/structures/auth/E2eSetup.js new file mode 100644 index 0000000000..a5f4ff933b --- /dev/null +++ b/src/components/structures/auth/E2eSetup.js @@ -0,0 +1,48 @@ +/* +Copyright 2020 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 React from 'react'; +import PropTypes from 'prop-types'; +import AsyncWrapper from '../../../AsyncWrapper'; +import * as sdk from '../../../index'; + +export default class E2eSetup extends React.Component { + static propTypes = { + onFinished: PropTypes.func.isRequired, + }; + + constructor() { + super(); + // awkwardly indented because https://github.com/eslint/eslint/issues/11310 + this._createStorageDialogPromise = + import("../../../async-components/views/dialogs/secretstorage/CreateSecretStorageDialog"); + } + + render() { + const AuthPage = sdk.getComponent("auth.AuthPage"); + const AuthBody = sdk.getComponent("auth.AuthBody"); + return ( + + + + + + ); + } +} diff --git a/src/components/views/auth/AuthBody.js b/src/components/views/auth/AuthBody.js index fe20d76afb..b74b7d866a 100644 --- a/src/components/views/auth/AuthBody.js +++ b/src/components/views/auth/AuthBody.js @@ -33,6 +33,10 @@ export default class AuthBody extends React.PureComponent { const classes = { 'mx_AuthBody': true, 'mx_AuthBody_noHeader': !this.props.header, + // XXX The login pages all use a smaller fonts size but we don't want this + // for subsequent auth screens like the e2e setup. Doing this a terrible way + // for now. + 'mx_AuthBody_loginRegister': this.props.header, }; return
      diff --git a/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js b/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js index 77fdee5e8a..0c432ba542 100644 --- a/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js +++ b/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js @@ -16,6 +16,7 @@ limitations under the License. */ import React from 'react'; +import PropTypes from 'prop-types'; import * as sdk from '../../../../index'; import {MatrixClientPeg} from '../../../../MatrixClientPeg'; import { MatrixClient } from 'matrix-js-sdk'; @@ -32,6 +33,16 @@ const RESTORE_TYPE_SECRET_STORAGE = 2; * Dialog for restoring e2e keys from a backup and the user's recovery key */ export default class RestoreKeyBackupDialog extends React.PureComponent { + static propTypes = { + // if false, will close the dialog as soon as the restore completes succesfully + // default: true + showSummary: PropTypes.bool, + }; + + defaultProps = { + showSummary: true, + }; + constructor(props) { super(props); this.state = { @@ -96,6 +107,10 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { const recoverInfo = await MatrixClientPeg.get().restoreKeyBackupWithPassword( this.state.passPhrase, undefined, undefined, this.state.backupInfo, ); + if (!this.props.showSummary) { + this.props.onFinished(true); + return; + } this.setState({ loading: false, recoverInfo, @@ -119,6 +134,10 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { const recoverInfo = await MatrixClientPeg.get().restoreKeyBackupWithRecoveryKey( this.state.recoveryKey, undefined, undefined, this.state.backupInfo, ); + if (!this.props.showSummary) { + this.props.onFinished(true); + return; + } this.setState({ loading: false, recoverInfo, @@ -253,6 +272,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { title = _t("Error"); content = _t("No backup found!"); } else if (this.state.recoverInfo) { + const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); title = _t("Backup Restored"); let failedToDecrypt; if (this.state.recoverInfo.total > this.state.recoverInfo.imported) { @@ -264,6 +284,11 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { content =

      {_t("Restored %(sessionCount)s session keys", {sessionCount: this.state.recoverInfo.imported})}

      {failedToDecrypt} +
      ; } else if (backupHasPassphrase && !this.state.forceRecoveryKey) { const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); From 9991a544aa2b413d00640bb6cb9262d831c80358 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Fri, 24 Jan 2020 22:26:28 +0000 Subject: [PATCH 254/906] Resolve default export warnings from Webpack Webpack was printing several warnings about missing default exports, particularly from components, where we auto-generate a default import via the component index. As part of this, the emoji picker recent handling (which is not a component) is moved elsewhere to avoid the generated import. --- src/components/structures/InteractiveAuth.js | 2 +- src/components/structures/TopLeftMenuButton.js | 2 +- src/components/views/auth/InteractiveAuthEntryComponents.js | 2 +- src/components/views/context_menus/TopLeftMenu.js | 2 +- src/components/views/emojipicker/EmojiPicker.js | 2 +- src/{components/views => }/emojipicker/recent.js | 0 6 files changed, 5 insertions(+), 5 deletions(-) rename src/{components/views => }/emojipicker/recent.js (100%) diff --git a/src/components/structures/InteractiveAuth.js b/src/components/structures/InteractiveAuth.js index 53bb990e26..3d63029b06 100644 --- a/src/components/structures/InteractiveAuth.js +++ b/src/components/structures/InteractiveAuth.js @@ -20,7 +20,7 @@ import React, {createRef} from 'react'; import createReactClass from 'create-react-class'; import PropTypes from 'prop-types'; -import {getEntryComponentForLoginType} from '../views/auth/InteractiveAuthEntryComponents'; +import getEntryComponentForLoginType from '../views/auth/InteractiveAuthEntryComponents'; import * as sdk from '../../index'; diff --git a/src/components/structures/TopLeftMenuButton.js b/src/components/structures/TopLeftMenuButton.js index 967805d099..ebd7aaae89 100644 --- a/src/components/structures/TopLeftMenuButton.js +++ b/src/components/structures/TopLeftMenuButton.js @@ -17,7 +17,7 @@ limitations under the License. import React from 'react'; import PropTypes from 'prop-types'; -import {TopLeftMenu} from '../views/context_menus/TopLeftMenu'; +import TopLeftMenu from '../views/context_menus/TopLeftMenu'; import BaseAvatar from '../views/avatars/BaseAvatar'; import {MatrixClientPeg} from '../../MatrixClientPeg'; import * as Avatar from '../../Avatar'; diff --git a/src/components/views/auth/InteractiveAuthEntryComponents.js b/src/components/views/auth/InteractiveAuthEntryComponents.js index 869e81c1f7..801420da95 100644 --- a/src/components/views/auth/InteractiveAuthEntryComponents.js +++ b/src/components/views/auth/InteractiveAuthEntryComponents.js @@ -641,7 +641,7 @@ const AuthEntryComponents = [ TermsAuthEntry, ]; -export function getEntryComponentForLoginType(loginType) { +export default function getEntryComponentForLoginType(loginType) { for (const c of AuthEntryComponents) { if (c.LOGIN_TYPE == loginType) { return c; diff --git a/src/components/views/context_menus/TopLeftMenu.js b/src/components/views/context_menus/TopLeftMenu.js index 528e4790c2..51ec202b90 100644 --- a/src/components/views/context_menus/TopLeftMenu.js +++ b/src/components/views/context_menus/TopLeftMenu.js @@ -27,7 +27,7 @@ import {MatrixClientPeg} from '../../../MatrixClientPeg'; import {MenuItem} from "../../structures/ContextMenu"; import * as sdk from "../../../index"; -export class TopLeftMenu extends React.Component { +export default class TopLeftMenu extends React.Component { static propTypes = { displayName: PropTypes.string.isRequired, userId: PropTypes.string.isRequired, diff --git a/src/components/views/emojipicker/EmojiPicker.js b/src/components/views/emojipicker/EmojiPicker.js index 1f508ceedc..ca8f0c0565 100644 --- a/src/components/views/emojipicker/EmojiPicker.js +++ b/src/components/views/emojipicker/EmojiPicker.js @@ -20,7 +20,7 @@ import PropTypes from 'prop-types'; import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; -import * as recent from './recent'; +import * as recent from '../../../emojipicker/recent'; import {DATA_BY_CATEGORY, getEmojiFromUnicode} from "../../../emoji"; export const CATEGORY_HEADER_HEIGHT = 22; diff --git a/src/components/views/emojipicker/recent.js b/src/emojipicker/recent.js similarity index 100% rename from src/components/views/emojipicker/recent.js rename to src/emojipicker/recent.js From 95df8b9bb7d4a2b40e65d079fb31bfca6767c57c Mon Sep 17 00:00:00 2001 From: Szimszon Date: Fri, 24 Jan 2020 18:34:27 +0000 Subject: [PATCH 255/906] Translated using Weblate (Hungarian) Currently translated at 99.8% (2052 of 2056 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 52 +++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index da2c015335..d2b877a8de 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -981,7 +981,7 @@ "Please contact your service administrator to get this limit increased.": "A korlát emelése érdekében kérlek vedd fel a kapcsolatot a szolgáltatás adminisztrátorával.", "This homeserver has hit its Monthly Active User limit so some users will not be able to log in.": "Ez a Matrix szerver elérte a havi aktív felhasználói korlátját néhány felhasználó nem fog tudni bejelentkezni.", "This homeserver has exceeded one of its resource limits so some users will not be able to log in.": "Ez a Matrix szerver túllépte valamelyik erőforrás korlátját így néhány felhasználó nem tud majd bejelentkezni.", - "Upgrade Room Version": "Szoba verziójának frissítése", + "Upgrade Room Version": "Szoba verziójának fejlesztése", "Create a new room with the same name, description and avatar": "Készíts egy új szobát ugyanazzal a névvel, leírással és profilképpel", "Update any local room aliases to point to the new room": "Állíts át minden helyi alternatív nevet erre a szobára", "Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "A felhasználóknak tiltsd meg, hogy a régi szobában beszélgessenek. Küldj egy üzenetet amiben megkéred a felhasználókat, hogy menjenek át az új szobába", @@ -996,9 +996,9 @@ "The conversation continues here.": "A beszélgetés itt folytatódik.", "This room is a continuation of another conversation.": "Ebben a szobában folytatódik egy másik beszélgetés.", "Click here to see older messages.": "Ide kattintva megnézheted a régi üzeneteket.", - "Failed to upgrade room": "A szoba frissítése sikertelen", - "The room upgrade could not be completed": "A szoba frissítését nem sikerült befejezni", - "Upgrade this room to version %(version)s": "A szoba frissítése %(version)s verzióra", + "Failed to upgrade room": "A szoba fejlesztése sikertelen", + "The room upgrade could not be completed": "A szoba fejlesztését nem sikerült befejezni", + "Upgrade this room to version %(version)s": "A szoba fejlesztése %(version)s verzióra", "Forces the current outbound group session in an encrypted room to be discarded": "A jelenlegi csoport munkamenet törlését kikényszeríti a titkosított szobában", "Registration Required": "Regisztrációt igényel", "You need to register to do this. Would you like to register now?": "Hogy ezt megtedd regisztrálnod kell. Szeretnél regisztrálni?", @@ -1140,9 +1140,9 @@ "Invite anyway and never warn me again": "Mindenképpen meghív és ne figyelmeztess többet", "Invite anyway": "Mindenképpen meghív", "Whether or not you're logged in (we don't record your username)": "Se akkor ha bejelentkezel se akkor ha nem; mi nem tároljuk a felhasználói nevedet", - "Upgrades a room to a new version": "Szoba frissítése új verzióra", + "Upgrades a room to a new version": "Szoba fejlesztése új verzióra", "Sets the room name": "Szobanév beállítása", - "%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s frissítette a szobát.", + "%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s fejlesztette a szobát.", "%(displayName)s is typing …": "%(displayName)s gépel …", "%(names)s and %(count)s others are typing …|other": "%(names)s és %(count)s másik gépelnek …", "%(names)s and %(count)s others are typing …|one": "%(names)s és még valaki gépelnek …", @@ -1460,9 +1460,9 @@ "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s visszavonta %(targetDisplayName)s a szobába való belépéséhez szükséges meghívóját.", "Enable desktop notifications for this device": "Asztali értesítések engedélyezése ehhez az eszközhöz", "Enable audible notifications for this device": "Hallható értesítések engedélyezése ehhez az eszközhöz", - "Upgrade this room to the recommended room version": "A szoba frissítése a javasolt verzióra", + "Upgrade this room to the recommended room version": "A szoba fejlesztése a javasolt verzióra", "This room is running room version , which this homeserver has marked as unstable.": "A szoba verziója: , amit a Matrix szerver instabilnak tekint.", - "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "A szoba frissítése bezárja ezt a szobát és új, frissített verzióval ugyanezen a néven létrehoz egy újat.", + "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "A szoba fejlesztése bezárja ezt a szobát és új, frissített verzióval ugyanezen a néven létrehoz egy újat.", "Failed to revoke invite": "A meghívó visszavonása sikertelen", "Could not revoke the invite. The server may be experiencing a temporary problem or you do not have sufficient permissions to revoke the invite.": "A meghívót nem lehet visszavonni. Vagy a szervernek átmenetileg problémái vannak vagy nincs megfelelő jogosultságod a meghívó visszavonásához.", "Revoke invite": "Meghívó visszavonása", @@ -1507,7 +1507,7 @@ "Sends the given message coloured as a rainbow": "A megadott üzenetet szivárvány színben küldi el", "Sends the given emote coloured as a rainbow": "A megadott hangulatjelet szivárvány színben küldi el", "The user's homeserver does not support the version of the room.": "A felhasználó matrix szervere nem támogatja a megadott szoba verziót.", - "When rooms are upgraded": "Ha a szobák frissültek", + "When rooms are upgraded": "Ha a szobák fejlesztésre kerülnek", "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Ez az eszköz nem menti el a kulcsaidat, de létezik mentés amit visszaállíthatsz és folytathatod.", "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Csatlakozz ezzel az eszközzel a kulcs mentéshez kilépés előtt, hogy ne veszíts el kulcsot ami esetleg csak ezen az eszközön van meg.", "Connect this device to Key Backup": "Csatlakozz ezzel az eszközzel a Kulcs Mentéshez", @@ -1538,7 +1538,7 @@ "This room doesn't exist. Are you sure you're at the right place?": "Ez a szoba nem létezik. Biztos, hogy jó helyen vagy?", "Try again later, or ask a room admin to check if you have access.": "Próbálkozz később vagy kérd meg a szoba adminisztrátorát, hogy nézze meg van-e hozzáférésed.", "%(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.": "Amikor a szobát próbáltuk elérni ezt a hibaüzenetet kaptuk: %(errcode)s. Ha úgy gondolod, hogy ez egy hiba légy szívesnyiss egy hibajegyet.", - "This room has already been upgraded.": "Ez a szoba már frissült.", + "This room has already been upgraded.": "Ez a szoba már fejlesztve van.", "Rotate Left": "Balra forgat", "Rotate Right": "Jobbra forgat", "View Servers in Room": "Szerverek megjelenítése a szobában", @@ -1690,7 +1690,7 @@ "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Ha felkutatásra és, hogy más ismerősök megtalálhassanak, nem akarod használni ezt a szervert: , akkor adjál meg másik azonosítási szervert alább.", "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Azonosítási szerver használata nem kötelező. Ha úgy döntesz, hogy az azonosítási szervert nem használod más felhasználók nem találnak rád és másokat sem tudsz e-mail cím vagy telefonszám alapján meghívni.", "Do not use an identity server": "Az azonosítási szerver mellőzése", - "Upgrade the room": "Szoba frissítése", + "Upgrade the room": "Szoba fejlesztése", "Set an email for account recovery. Use email or phone to optionally be discoverable by existing contacts.": "E-mail cím beállítása a fiók visszaállításához. E-mail cím vagy telefonszám, hogy ismerősök megtalálhassanak.", "Set an email for account recovery. Use email to optionally be discoverable by existing contacts.": "E-mail cím beállítása a fiók visszaállításához. E-mail cím, hogy ismerősök megtalálhassanak.", "Enter your custom homeserver URL What does this mean?": "Add meg a matrix szervered URL-jét Mit jelent ez?", @@ -1930,12 +1930,12 @@ "This message cannot be decrypted": "Ezt az üzenetet nem lehet visszafejteni", "Unencrypted": "Titkosítatlan", "Automatically invite users": "Felhasználók automatikus meghívása", - "Upgrade private room": "Privát szoba frissítése", - "Upgrade public room": "Nyilvános szoba frissítése", + "Upgrade private room": "Privát szoba fejlesztése", + "Upgrade public room": "Nyilvános szoba fejlesztése", "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.": "A szoba frissítése nem egyszerű művelet, általában a szoba hibás működése, hiányzó funkció vagy biztonsági sérülékenység esetén javasolt.", "This usually only affects how the room is processed on the server. If you're having problems with your Riot, please report a bug.": "Ez általában a szoba szerver oldali kezelésében jelent változást. Ha a Riotban van problémád, kérlek küldj egy hibajelentést.", - "You'll upgrade this room from to .": " verzióról verzióra frissíted a szobát.", - "Upgrade": "Frissítés", + "You'll upgrade this room from to .": " verzióról verzióra fejleszted a szobát.", + "Upgrade": "Fejlesztés", "Notification settings": "Értesítések beállítása", "User Status": "Felhasználó állapota", "Reactions": "Reakciók", @@ -2086,5 +2086,25 @@ "Unrecognised command: %(commandText)s": "Ismeretlen parancs: %(commandText)s", "You can use /help to list available commands. Did you mean to send this as a message?": "Használhatod a /help-et az elérhető parancsok kilistázásához. Ezt üzenetként akartad küldeni?", "Hint: Begin your message with // to start it with a slash.": "Tipp: Ez üzenetedet kezd ezzel: //, ha perjellel szeretnéd kezdeni.", - "Send as message": "Üzenet küldése" + "Send as message": "Üzenet küldése", + "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s szoba címnek, %(count)s másikkal együtt, hozzáadta: %(addedAddresses)s", + "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s %(count)s másikkal együtt törölte a szoba címek közül: %(removedAddresses)s", + "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s %(countRemoved)s darabot törölt és %(countAdded)s darabot hozzáadott a szoba címekhez", + "Someone is using an unknown device": "Valaki ismeretlen eszközt használ", + "This room is end-to-end encrypted": "Ez a szoba végpontok közötti titkosítást használ", + "Everyone in this room is verified": "A szobába mindenki ellenőrizve van", + "Invite only": "Csak meghívóval", + "Send a reply…": "Válasz küldése…", + "Send a message…": "Üzenet küldése…", + "Reject & Ignore user": "Felhasználó elutasítása és figyelmen kívül hagyása", + "If you can't find someone, ask them for their username, share your username (%(userId)s) or profile link.": "Ha nem találsz valakit, akkor kérdezd meg a felhasználói nevét, áruld el neki a felhasználói nevedet (%(userId)s) vagy a profil hivatkozásodat.", + "Enter your account password to confirm the upgrade:": "A fejlesztés megerősítéséhez add meg a fiók jelszavadat:", + "You'll need to authenticate with the server to confirm the upgrade.": "Azonosítanod kell magad a szerveren a fejlesztés megerősítéséhez.", + "Enter a passphrase": "Jelmondat bevitele", + "Enter your passphrase a second time to confirm it.": "Add meg a jelmondatot másodszor is a biztonság kedvéért.", + "Verify other users in their profile.": "Más felhasználók ellenőrzése a profiljukban.", + "Upgrade your encryption": "Titkosításod fejlesztése", + "Set up encryption": "Titkosítás beállítása", + "Encryption upgraded": "Titkosítás fejlesztve", + "Encryption setup complete": "Titkosítás beállítása kész" } From 662c723bf3401157e59601188d53ff008ae4d230 Mon Sep 17 00:00:00 2001 From: catborise Date: Fri, 24 Jan 2020 18:48:00 +0000 Subject: [PATCH 256/906] Translated using Weblate (Turkish) Currently translated at 73.7% (1515 of 2056 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/tr/ --- src/i18n/strings/tr.json | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 2656b00593..db43e96cea 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -1510,5 +1510,27 @@ "%(senderName)s placed a voice call.": "%(senderName)s bir çağrı yaptı.", "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s bir çağrı başlattı. (Bu tarayıcı tarafından desteklenmiyor)", "%(senderName)s placed a video call.": "%(senderName)s bir görüntülü çağrı yaptı.", - "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s bir görüntülü çağrı yaptı. (bu tarayıcı tarafından desteklenmiyor)" + "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s bir görüntülü çağrı yaptı. (bu tarayıcı tarafından desteklenmiyor)", + "Ask your Riot admin to check your config for incorrect or duplicate entries.": "Riot yöneticinize yapılandırmanızın hatalı ve mükerrer girdilerini kontrol etmesi için talepte bulunun.", + "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.": "Kayıt olabilirsiniz, fakat kimlik sunucunuz çevrimiçi olana kadar bazı özellikler mevcut olmayacak. Bu uyarıyı sürekli görüyorsanız, yapılandırmanızı kontrol edin veya sunucu yöneticinizle iletişime geçin.", + "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.": "Parolanızı sıfırlayabilirsiniz, fakat kimlik sunucunuz çevrimiçi olana kadar bazı özellikler mevcut olmayacak. Bu uyarıyı sürekli görüyorsanız, yapılandırmanızı kontrol edin veya sunucu yöneticinizle iletişime geçin.", + "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.": "Oturum açabilirsiniz, fakat kimlik sunucunuz çevrimiçi olana kadar bazı özellikler mevcut olmayacak. Bu uyarıyı sürekli görüyorsanız, yapılandırmanızı kontrol edin veya sunucu yöneticinizle iletişime geçin.", + "a few seconds from now": "şu andan itibaren bir kaç saniye", + "about a minute from now": "şu andan itibaren yaklaşık bir dakika", + "%(num)s minutes from now": "şu andan itibaren %(num)s dakika", + "about an hour from now": "şu andan itibaren yaklaşık bir saat", + "%(num)s hours from now": "şu andan itibaren %(num)s saat", + "about a day from now": "şu andan itibaren yaklaşık bir gün", + "%(num)s days from now": "şu andan itibaren %(num)s gün", + "The user must be unbanned before they can be invited.": "Kullanıcının davet edilebilmesi için öncesinde yasağının kaldırılması gereklidir.", + "Repeats like \"abcabcabc\" are only slightly harder to guess than \"abc\"": "“abcabcabc” gibi tekrarlar “abc” yi tahmin etmekten çok az daha zor olur", + "Sequences like abc or 6543 are easy to guess": "abc veya 6543 gibi diziler tahmin için oldukça kolaydır", + "Common names and surnames are easy to guess": "Yaygın isimleri ve soyisimleri tahmin etmek oldukça kolay", + "Enable cross-signing to verify per-user instead of per-device (in development)": "Her cihaz yerine her kullanıcıyı doğrulamak için çarpraz-imzalamayı aç (geliştiriliyor)", + "Show info about bridges in room settings": "Oda ayarlarındaki köprülerin bilgilerini göster", + "Show a placeholder for removed messages": "Silinen mesajlar için bir yer tutucu göster", + "Show display name changes": "Ekran isim değişikliklerini göster", + "Enable URL previews for this room (only affects you)": "Bu oda için URL önizlemeyi aç (sadece sizi etkiler)", + "Enable URL previews by default for participants in this room": "Bu odadaki katılımcılar için URL önizlemeyi varsayılan olarak açık hale getir", + "Enable widget screenshots on supported widgets": "Desteklenen görsel bileşenlerde anlık görüntüleri aç" } From 440b3fd1fdefe69993ff1b73d1a7b0c6de7ff317 Mon Sep 17 00:00:00 2001 From: Osoitz Date: Sat, 25 Jan 2020 11:39:29 +0000 Subject: [PATCH 257/906] Translated using Weblate (Basque) Currently translated at 100.0% (2050 of 2050 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/eu/ --- src/i18n/strings/eu.json | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 97cef0c70d..1ab4bd15b1 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1617,7 +1617,7 @@ "Resend edit": "Birbidali edizioa", "Resend %(unsentCount)s reaction(s)": "Birbidali %(unsentCount)s erreakzio", "Resend removal": "Birbidali kentzeko agindua", - "Forgotten your password?": "Pasahitza ahaztu duzu?", + "Forgotten your password?": "Pasahitza ahaztuta?", "Sign in and regain access to your account.": "Hasi saioa eta berreskuratu zure kontua.", "You're signed out": "Saioa amaitu duzu", "Clear personal data": "Garbitu datu pertsonalak", @@ -2074,5 +2074,41 @@ "Done": "Egina", "Without completing security on this device, it won’t have access to encrypted messages.": "Gailu honetan segurtasuna osatu ezean, ez du zifratutako mezuetara sarbiderik izango.", "Go Back": "Joan atzera", - "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup.": "Biltegi sekretua oraingo gakoen babeskopiaren xehetasunak erabiliz ezarriko da. Zure biltegi sekretuaren pasa-esaldia eta berreskuratze gakoa zure gakoen babes-kopiarako zenerabiltzanak izango dira." + "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup.": "Biltegi sekretua oraingo gakoen babeskopiaren xehetasunak erabiliz ezarriko da. Zure biltegi sekretuaren pasa-esaldia eta berreskuratze gakoa zure gakoen babes-kopiarako zenerabiltzanak izango dira.", + "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s erabiltzaileak %(addedAddresses)s helbideak eta beste %(count)s gehitu dizkio gela honi", + "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s erabiltzaileak %(removedAddresses)s helbideak eta beste %(count)s kendu dizkio gela honi", + "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s erabiltzaileak %(countRemoved)s helbide kendu eta %(countAdded)s gehitu dizkio gela honi", + "%(senderName)s turned on end-to-end encryption.": "%(senderName)s erabiltzaileak muturretik muturrera zifratzea aktibatu du.", + "%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s erabiltzaileak muturretik muturrera zifratzea gaitu du (%(algorithm)s algoritmo ezezaguna).", + "Someone is using an unknown device": "Baten bat gailu ezezagun bat erabiltzen ari da", + "This room is end-to-end encrypted": "Gela hau muturretik muturrera zifratuta dago", + "Everyone in this room is verified": "Gelako guztiak egiaztatuta daude", + "Encrypted by a deleted device": "Ezabatutako gailu batek zifratua", + "Invite only": "Gonbidapenez besterik ez", + "Send a reply…": "Bidali erantzuna…", + "Send a message…": "Bidali mezua…", + "Reject & Ignore user": "Ukatu eta ezikusi erabiltzailea", + "Unknown Command": "Agindu ezezaguna", + "Unrecognised command: %(commandText)s": "Agindu ezezaguna: %(commandText)s", + "You can use /help to list available commands. Did you mean to send this as a message?": "/help erabili dezakezu agindu erabilgarrien zerrenda ikusteko. Ala mezu gisa bidali nahi zenuen hau?", + "Hint: Begin your message with // to start it with a slash.": "Aholkua: Hasi zure mezua // idatziz barra batekin hasi nahi baduzu.", + "Send as message": "Bidali mezu gisa", + "Verify User": "Egiaztatu erabiltzailea", + "For extra security, verify this user by checking a one-time code on both of your devices.": "Segurtasun gehiagorako, egiaztatu erabiltzaile hau aldi-bakarrerako kode bat bi gailuetan egiaztatuz.", + "For maximum security, do this in person.": "Segurtasun gorenerako, egin hau aurrez aurre.", + "Start Verification": "Hasi egiaztaketa", + "If you can't find someone, ask them for their username, share your username (%(userId)s) or profile link.": "Ez baduzu baten bat aurkitzen, eskatu bere erabiltzaile-izena, partekatu zurea (%(userId)s) edo partekatu profilaren esteka.", + "Enter your account password to confirm the upgrade:": "Sartu zure kontuaren pasa-hitza eguneraketa baieztatzeko:", + "You'll need to authenticate with the server to confirm the upgrade.": "Zerbitzariarekin autentifikatu beharko duzu eguneraketa baieztatzeko.", + "Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Eguneratu gailu hau honek beste gailuak egiaztatu ahal izateko, horrela zifratutako mezuetara sarbidea emanez eta beste erabiltzaileentzat fidagarri gisa markatzeko.", + "Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Ezarri zifratzea gailu honetan honek beste gailuak egiaztatu ahal izateko, horrela zifratutako mezuetara sarbidea emanez eta beste erabiltzaileentzat fidagarri gisa markatzeko.", + "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Babestu zure zifratze gakoak pasa-esaldi batekin. Segurtasun gorenerako hau eta zure kontuaren pasahitza desberdinak izan beharko lukete:", + "Enter a passphrase": "Sartu pasa-esaldia", + "Enter your passphrase a second time to confirm it.": "Sartu zure pasa-esaldia berriro hau baieztatzeko.", + "This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Gailu honek beste gailuak egiaztatu ditzake, horrela zifratutako mezuetara sarbidea emanez eta beste erabiltzaileentzat fidagarri gisa markatuz.", + "Verify other users in their profile.": "Egiaztatu beste erabiltzaileak bere profiletan.", + "Upgrade your encryption": "Eguneratu zure zifratzea", + "Set up encryption": "Ezarri zifratzea", + "Encryption upgraded": "Zifratzea eguneratuta", + "Encryption setup complete": "Zifratzearen ezarpena egina" } From e710607a7244452aeb66f2c3204ccea62351bcd8 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Sat, 25 Jan 2020 08:22:40 +0000 Subject: [PATCH 258/906] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2050 of 2050 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 03fbe6f61b..4a70441317 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2085,5 +2085,31 @@ "Unrecognised command: %(commandText)s": "無法識別的指令:%(commandText)s", "You can use /help to list available commands. Did you mean to send this as a message?": "您可以使用 /help 來列出可用的指令。您是要傳送此訊息嗎?", "Hint: Begin your message with // to start it with a slash.": "提示:以 // 開頭讓您的訊息傳送時可以用斜線開頭。", - "Send as message": "以訊息傳送" + "Send as message": "以訊息傳送", + "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s 向此聊天室新增了 %(addedAddresses)s 與其他 %(count)s 個地址", + "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s 從此聊天室移除了 %(removedAddresses)s 與其他 %(count)s 個地址", + "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s 對此聊天室移除了 %(countRemoved)s 個並新增了 %(countAdded)s 地址到此聊天室", + "%(senderName)s turned on end-to-end encryption.": "%(senderName)s 開啟了端到端加密。", + "%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s 開啟了端到端加密(無法識別的演算法 %(algorithm)s)。", + "Someone is using an unknown device": "某人正在使用未知的裝置", + "This room is end-to-end encrypted": "此聊天室已端到端加密", + "Everyone in this room is verified": "此聊天室中每個人都已驗證", + "Invite only": "僅邀請", + "Send a reply…": "傳送回覆……", + "Send a message…": "傳送訊息……", + "Reject & Ignore user": "回絕並忽略使用者", + "If you can't find someone, ask them for their username, share your username (%(userId)s) or profile link.": "如果您找不到某人,請詢問他們以取得他們的使用者名稱,分享您的使用者名稱 (%(userId)s) 或簡介連結。", + "Enter your account password to confirm the upgrade:": "輸入您的帳號密碼以確認升級:", + "You'll need to authenticate with the server to confirm the upgrade.": "您必須透過伺服器驗證以確認升級。", + "Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "升級此裝置以允許其驗證其他裝置,並允許存取加密訊息以及將它們標記為受其他使用者信任。", + "Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "在此裝置上設定加密以允許其驗證其他裝置,並允許存取加密訊息以及將它們標記為受其他使用者信任。", + "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "使用通關密語保護您的加密金鑰。為了取得最強的安全性,此通關密語應與您的帳號密碼不同:", + "Enter a passphrase": "輸入通關密語", + "Enter your passphrase a second time to confirm it.": "輸入您的通關密語兩次以確認。", + "This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "此裝置現在可以驗證其他裝置,並允許存取加密訊息以及將它們標記為受其他使用者信任。", + "Verify other users in their profile.": "透過他們的簡介驗證其他使用者。", + "Upgrade your encryption": "升級您的加密", + "Set up encryption": "設定加密", + "Encryption upgraded": "加密已升級", + "Encryption setup complete": "加密設定完成" } From c96f82cd8b742b9f863099a2d7a6c2de7275768e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Sat, 25 Jan 2020 08:09:22 +0000 Subject: [PATCH 259/906] Translated using Weblate (French) Currently translated at 100.0% (2050 of 2050 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 5d02717b0c..1ddcc55544 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2102,5 +2102,14 @@ "Upgrade your encryption": "Mettre à niveau votre chiffrement", "Set up encryption": "Configurer le chiffrement", "Encryption upgraded": "Chiffrement mis à niveau", - "Encryption setup complete": "Configuration du chiffrement terminé" + "Encryption setup complete": "Configuration du chiffrement terminé", + "%(senderName)s turned on end-to-end encryption.": "%(senderName)s a activé le chiffrement de bout en bout.", + "%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s a activé le chiffrement de bout en bout (algorithme %(algorithm)s non reconnu).", + "Someone is using an unknown device": "Quelqu'un utilise un appareil inconnu", + "This room is end-to-end encrypted": "Ce salon est chiffré de bout en bout", + "Everyone in this room is verified": "Tout le monde dans ce salon est vérifié", + "Invite only": "Uniquement sur invitation", + "Send a reply…": "Envoyer une réponse…", + "Send a message…": "Envoyer un message…", + "If you can't find someone, ask them for their username, share your username (%(userId)s) or profile link.": "Si vous n’arrivez pas à trouver quelqu’un, demandez-lui son nom d’utilisateur, partagez votre nom d’utilisateur (%(userId)s) ou votre lien de profil." } From 437b45f8a65decdf6d83f5e61e484f345505f314 Mon Sep 17 00:00:00 2001 From: David Baker Date: Sat, 25 Jan 2020 15:28:06 +0000 Subject: [PATCH 260/906] Remember password for e2e bootstrapping Fixes https://github.com/vector-im/riot-web/issues/12046 --- .../CreateSecretStorageDialog.js | 3 ++- src/components/structures/MatrixChat.js | 24 +++++++++++++++---- src/components/structures/auth/E2eSetup.js | 2 ++ src/components/structures/auth/Login.js | 7 +++++- .../structures/auth/Registration.js | 8 ++++++- 5 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 92ede334d0..0867cae6f4 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -55,6 +55,7 @@ function selectText(target) { export default class CreateSecretStorageDialog extends React.PureComponent { static propTypes = { hasCancel: PropTypes.bool, + accountPassword: PropTypes.string, }; defaultProps = { @@ -82,7 +83,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { // does the server offer a UI auth flow with just m.login.password // for /keys/device_signing/upload? canUploadKeysWithPasswordOnly: null, - accountPassword: '', + accountPassword: props.accountPassword, accountPasswordCorrect: null, // set if we are 'upgrading' encryption (making an SSSS store from // an existing key backup secret). diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index b4b38d7617..133d74db45 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -256,6 +256,9 @@ export default createReactClass({ // logout page. Lifecycle.loadSession({}); } + + this._accountPassword = null; + this._accountPasswordTimer = null; }, componentDidMount: function() { @@ -352,6 +355,8 @@ export default createReactClass({ window.removeEventListener("focus", this.onFocus); window.removeEventListener('resize', this.handleResize); this.state.resizeNotifier.removeListener("middlePanelResized", this._dispatchTimelineResize); + + if (this._accountPasswordTimer !== null) clearTimeout(this._accountPasswordTimer); }, componentWillUpdate: function(props, state) { @@ -1729,9 +1734,8 @@ export default createReactClass({ this.showScreen("forgot_password"); }, - onRegisterFlowComplete: function(credentials) { - this.onUserCompletedLoginFlow(); - return this.onRegistered(credentials); + onRegisterFlowComplete: function(credentials, password) { + return this.onUserCompletedLoginFlow(credentials, password); }, // returns a promise which resolves to the new MatrixClient @@ -1822,7 +1826,14 @@ export default createReactClass({ this._loggedInView = ref; }, - async onUserCompletedLoginFlow(credentials) { + async onUserCompletedLoginFlow(credentials, password) { + this._accountPassword = password; + // self-destruct the password after 5mins + if (this._accountPasswordTimer !== null) clearTimeout(this._accountPasswordTimer); + this._accountPasswordTimer = setTimeout(() => { + this._accountPassword = null; + this._accountPasswordTimer = null; + }, 60 * 5 * 1000); // Wait for the client to be logged in (but not started) // which is enough to ask the server about account data. const loggedIn = new Promise(resolve => { @@ -1836,7 +1847,7 @@ export default createReactClass({ }); // Create and start the client in the background - Lifecycle.setLoggedIn(credentials); + const setLoggedInPromise = Lifecycle.setLoggedIn(credentials); await loggedIn; const cli = MatrixClientPeg.get(); @@ -1865,6 +1876,8 @@ export default createReactClass({ } else { this._onLoggedIn(); } + + return setLoggedInPromise; }, // complete security / e2e setup has finished @@ -1896,6 +1909,7 @@ export default createReactClass({ view = ( ); } else if (this.state.view === VIEWS.POST_REGISTRATION) { diff --git a/src/components/structures/auth/E2eSetup.js b/src/components/structures/auth/E2eSetup.js index a5f4ff933b..29b4345761 100644 --- a/src/components/structures/auth/E2eSetup.js +++ b/src/components/structures/auth/E2eSetup.js @@ -22,6 +22,7 @@ import * as sdk from '../../../index'; export default class E2eSetup extends React.Component { static propTypes = { onFinished: PropTypes.func.isRequired, + accountPassword: PropTypes.string, }; constructor() { @@ -40,6 +41,7 @@ export default class E2eSetup extends React.Component { diff --git a/src/components/structures/auth/Login.js b/src/components/structures/auth/Login.js index 7bc2dbcbae..c8b2a1ea9c 100644 --- a/src/components/structures/auth/Login.js +++ b/src/components/structures/auth/Login.js @@ -58,6 +58,11 @@ export default createReactClass({ displayName: 'Login', propTypes: { + // Called when the user has logged in. Params: + // - The object returned by the login API + // - The user's password, if applicable, (may be cached in memory for a + // short time so the user is not required to re-enter their password + // for operations like uploading cross-signing keys). onLoggedIn: PropTypes.func.isRequired, // If true, the component will consider itself busy. @@ -181,7 +186,7 @@ export default createReactClass({ username, phoneCountry, phoneNumber, password, ).then((data) => { this.setState({serverIsAlive: true}); // it must be, we logged in. - this.props.onLoggedIn(data); + this.props.onLoggedIn(data, password); }, (error) => { if (this._unmounted) { return; diff --git a/src/components/structures/auth/Registration.js b/src/components/structures/auth/Registration.js index fdf2f51e00..171d3ada26 100644 --- a/src/components/structures/auth/Registration.js +++ b/src/components/structures/auth/Registration.js @@ -45,7 +45,13 @@ export default createReactClass({ displayName: 'Registration', propTypes: { + // Called when the user has logged in. Params: + // - object with userId, deviceId, homeserverUrl, identityServerUrl, accessToken + // - The user's password, if available and applicable (may be cached in memory + // for a short time so the user is not required to re-enter their password + // for operations like uploading cross-signing keys). onLoggedIn: PropTypes.func.isRequired, + clientSecret: PropTypes.string, sessionId: PropTypes.string, makeRegistrationUrl: PropTypes.func.isRequired, @@ -348,7 +354,7 @@ export default createReactClass({ homeserverUrl: this.state.matrixClient.getHomeserverUrl(), identityServerUrl: this.state.matrixClient.getIdentityServerUrl(), accessToken: response.access_token, - }); + }, this.state.formVals.password); this._setupPushers(cli); // we're still busy until we get unmounted: don't show the registration form again From 8c5fd5c77e7110abba89412d41004149b6633918 Mon Sep 17 00:00:00 2001 From: David Baker Date: Sat, 25 Jan 2020 16:52:12 +0000 Subject: [PATCH 261/906] Verification nag toasts Implement the three differenty cases for this session, and also fix ones for other sessions which had the wrong copy. Fixes https://github.com/vector-im/riot-web/issues/11220 --- src/DeviceListener.js | 87 +++++++++++++++++-- .../views/toasts/NewSessionToast.js | 6 +- .../views/toasts/SetupEncryptionToast.js | 68 +++++++++++++++ src/i18n/strings/en_EN.json | 11 ++- 4 files changed, 160 insertions(+), 12 deletions(-) create mode 100644 src/components/views/toasts/SetupEncryptionToast.js diff --git a/src/DeviceListener.js b/src/DeviceListener.js index a4c5785db4..dc066eb7cb 100644 --- a/src/DeviceListener.js +++ b/src/DeviceListener.js @@ -24,6 +24,9 @@ function toastKey(device) { return 'newsession_' + device.deviceId; } +const KEY_BACKUP_POLL_INTERVAL = 5 * 60 * 1000; +const THIS_DEVICE_TOAST_KEY = 'setupencryption'; + export default class DeviceListener { static sharedInstance() { if (!global.mx_DeviceListener) global.mx_DeviceListener = new DeviceListener(); @@ -33,42 +36,114 @@ export default class DeviceListener { constructor() { // device IDs for which the user has dismissed the verify toast ('Later') this._dismissed = new Set(); + // has the user dismissed any of the various nag toasts to setup encryption on this device? + this._dismissedThisDeviceToast = false; + + // cache of the key backup info + this._keyBackupInfo = null; + this._keyBackupFetchedAt = null; } start() { MatrixClientPeg.get().on('crypto.devicesUpdated', this._onDevicesUpdated); MatrixClientPeg.get().on('deviceVerificationChanged', this._onDeviceVerificationChanged); - this.recheck(); + MatrixClientPeg.get().on('userTrustStatusChanged', this._onUserTrustStatusChanged); + this._recheck(); } stop() { if (MatrixClientPeg.get()) { MatrixClientPeg.get().removeListener('crypto.devicesUpdated', this._onDevicesUpdated); MatrixClientPeg.get().removeListener('deviceVerificationChanged', this._onDeviceVerificationChanged); + MatrixClientPeg.get().removeListener('userTrustStatusChanged', this._onUserTrustStatusChanged); } this._dismissed.clear(); } dismissVerification(deviceId) { this._dismissed.add(deviceId); - this.recheck(); + this._recheck(); + } + + dismissEncryptionSetup() { + this._dismissedThisDeviceToast = true; + this._recheck(); } _onDevicesUpdated = (users) => { if (!users.includes(MatrixClientPeg.get().getUserId())) return; - this.recheck(); + this._recheck(); } _onDeviceVerificationChanged = (users) => { if (!users.includes(MatrixClientPeg.get().getUserId())) return; - this.recheck(); + this._recheck(); } - async recheck() { + _onUserTrustStatusChanged = (userId, trustLevel) => { + if (userId !== MatrixClientPeg.get().getUserId()) return; + this._recheck(); + } + + // The server doesn't tell us when key backup is set up, so we poll + // & cache the result + async _getKeyBackupInfo() { + const now = (new Date()).getTime(); + if (!this._keyBackupInfo || this._keyBackupFetchedAt < now - KEY_BACKUP_POLL_INTERVAL) { + this._keyBackupInfo = await MatrixClientPeg.get().getKeyBackupVersion(); + this._keyBackupFetchedAt = now; + } + return this._keyBackupInfo; + } + + async _recheck() { if (!SettingsStore.isFeatureEnabled("feature_cross_signing")) return; const cli = MatrixClientPeg.get(); - if (!cli.isCryptoEnabled()) return false; + if (!cli.isCryptoEnabled()) return; + if (!cli.getCrossSigningId()) { + if (this._dismissedThisDeviceToast) { + ToastStore.sharedInstance().dismissToast(THIS_DEVICE_TOAST_KEY); + return; + } + + // cross signing isn't enabled - nag to enable it + // There 3 different toasts for: + if (cli.getStoredCrossSigningForUser(cli.getUserId())) { + // Cross-signing on account but this device doesn't trust the master key (verify this session) + ToastStore.sharedInstance().addOrReplaceToast({ + key: THIS_DEVICE_TOAST_KEY, + title: _t("Verify this Session"), + icon: "verification_warning", + props: {kind: 'verify_this_session'}, + component: sdk.getComponent("toasts.SetupEncryptionToast"), + }); + } else { + const backupInfo = await this._getKeyBackupInfo(); + if (backupInfo) { + // No cross-signing on account but key backup available (upgrade encryption) + ToastStore.sharedInstance().addOrReplaceToast({ + key: THIS_DEVICE_TOAST_KEY, + title: _t("Encryption upgrade available"), + icon: "verification_warning", + props: {kind: 'upgrade_encryption'}, + component: sdk.getComponent("toasts.SetupEncryptionToast"), + }); + } else { + // No cross-signing or key backup on account (set up encryption) + ToastStore.sharedInstance().addOrReplaceToast({ + key: THIS_DEVICE_TOAST_KEY, + title: _t("Set up encryption"), + icon: "verification_warning", + props: {kind: 'set_up_encryption'}, + component: sdk.getComponent("toasts.SetupEncryptionToast"), + }); + } + } + return; + } else { + ToastStore.sharedInstance().dismissToast(THIS_DEVICE_TOAST_KEY); + } const devices = await cli.getStoredDevicesForUser(cli.getUserId()); for (const device of devices) { diff --git a/src/components/views/toasts/NewSessionToast.js b/src/components/views/toasts/NewSessionToast.js index f83326121b..3b60f59131 100644 --- a/src/components/views/toasts/NewSessionToast.js +++ b/src/components/views/toasts/NewSessionToast.js @@ -32,7 +32,7 @@ export default class VerifySessionToast extends React.PureComponent { DeviceListener.sharedInstance().dismissVerification(this.props.deviceId); }; - _onVerifyClick = async () => { + _onReviewClick = async () => { const cli = MatrixClientPeg.get(); const DeviceVerifyDialog = sdk.getComponent('views.dialogs.DeviceVerifyDialog'); @@ -47,10 +47,10 @@ export default class VerifySessionToast extends React.PureComponent { render() { const FormButton = sdk.getComponent("elements.FormButton"); return (
      -
      {_t("Other users may not trust it")}
      +
      {_t("Review & verify your new session")}
      - +
      ); } diff --git a/src/components/views/toasts/SetupEncryptionToast.js b/src/components/views/toasts/SetupEncryptionToast.js new file mode 100644 index 0000000000..841ee66ac7 --- /dev/null +++ b/src/components/views/toasts/SetupEncryptionToast.js @@ -0,0 +1,68 @@ +/* +Copyright 2020 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 React from 'react'; +import PropTypes from 'prop-types'; +import * as sdk from "../../../index"; +import { _t } from '../../../languageHandler'; +import DeviceListener from '../../../DeviceListener'; +import { accessSecretStorage } from '../../../CrossSigningManager'; + +export default class SetupEncryptionToast extends React.PureComponent { + static propTypes = { + toastKey: PropTypes.string.isRequired, + kind: PropTypes.oneOf(['set_up_encryption', 'verify_this_session', 'upgrade_encryption']).isRequired, + }; + + _onLaterClick = () => { + DeviceListener.sharedInstance().dismissEncryptionSetup(); + }; + + _onSetupClick = async () => { + accessSecretStorage(); + }; + + getDescription() { + switch (this.props.kind) { + case 'set_up_encryption': + case 'upgrade_encryption': + return _t('Verify your other devices easier'); + case 'verify_this_session': + return _t('Other users may not trust it'); + } + } + + getSetupCaption() { + switch (this.props.kind) { + case 'set_up_encryption': + case 'upgrade_encryption': + return _t('Upgrade'); + case 'verify_this_session': + return _t('Verify'); + } + } + + render() { + const FormButton = sdk.getComponent("elements.FormButton"); + return (
      +
      {this.getDescription()}
      +
      + + +
      +
      ); + } +} diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 79f5731aed..0d033dff4d 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -88,6 +88,9 @@ "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(time)s", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s", + "Verify this Session": "Verify this Session", + "Encryption upgrade available": "Encryption upgrade available", + "Set up encryption": "Set up encryption", "New Session": "New Session", "Who would you like to add to this community?": "Who would you like to add to this community?", "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID", @@ -509,8 +512,12 @@ "Headphones": "Headphones", "Folder": "Folder", "Pin": "Pin", - "Other users may not trust it": "Other users may not trust it", + "Review & verify your new session": "Review & verify your new session", "Later": "Later", + "Review": "Review", + "Verify your other devices easier": "Verify your other devices easier", + "Other users may not trust it": "Other users may not trust it", + "Upgrade": "Upgrade", "Verify": "Verify", "Decline (%(counter)s)": "Decline (%(counter)s)", "Accept to continue:": "Accept to continue:", @@ -1514,7 +1521,6 @@ "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.": "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.", "This usually only affects how the room is processed on the server. If you're having problems with your Riot, please report a bug.": "This usually only affects how the room is processed on the server. If you're having problems with your Riot, please report a bug.", "You'll upgrade this room from to .": "You'll upgrade this room from to .", - "Upgrade": "Upgrade", "Sign out and remove encryption keys?": "Sign out and remove encryption keys?", "Clear Storage and Sign Out": "Clear Storage and Sign Out", "Send Logs": "Send Logs", @@ -2008,7 +2014,6 @@ "Set up secret storage": "Set up secret storage", "Restore your Key Backup": "Restore your Key Backup", "Upgrade your encryption": "Upgrade your encryption", - "Set up encryption": "Set up encryption", "Recovery key": "Recovery key", "Keep it safe": "Keep it safe", "Storing secrets...": "Storing secrets...", From 7169a8444959fe384504e99c5a0736408e9120ef Mon Sep 17 00:00:00 2001 From: David Baker Date: Sat, 25 Jan 2020 17:08:31 +0000 Subject: [PATCH 262/906] Dismiss toasts for logged out devices --- src/DeviceListener.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/DeviceListener.js b/src/DeviceListener.js index dc066eb7cb..3135e3d9a5 100644 --- a/src/DeviceListener.js +++ b/src/DeviceListener.js @@ -20,8 +20,8 @@ import * as sdk from './index'; import { _t } from './languageHandler'; import ToastStore from './stores/ToastStore'; -function toastKey(device) { - return 'newsession_' + device.deviceId; +function toastKey(deviceId) { + return 'newsession_' + deviceId; } const KEY_BACKUP_POLL_INTERVAL = 5 * 60 * 1000; @@ -34,6 +34,8 @@ export default class DeviceListener { } constructor() { + // set of device ID's we're currently showing toasts for + this._activeNagToasts = new Set(); // device IDs for which the user has dismissed the verify toast ('Later') this._dismissed = new Set(); // has the user dismissed any of the various nag toasts to setup encryption on this device? @@ -145,22 +147,32 @@ export default class DeviceListener { ToastStore.sharedInstance().dismissToast(THIS_DEVICE_TOAST_KEY); } + const newActiveToasts = new Set(); + const devices = await cli.getStoredDevicesForUser(cli.getUserId()); for (const device of devices) { if (device.deviceId == cli.deviceId) continue; const deviceTrust = await cli.checkDeviceTrust(cli.getUserId(), device.deviceId); if (deviceTrust.isCrossSigningVerified() || this._dismissed.has(device.deviceId)) { - ToastStore.sharedInstance().dismissToast(toastKey(device)); + ToastStore.sharedInstance().dismissToast(toastKey(device.deviceId)); } else { + this._activeNagToasts.add(device.deviceId); ToastStore.sharedInstance().addOrReplaceToast({ - key: toastKey(device), + key: toastKey(device.deviceId), title: _t("New Session"), icon: "verification_warning", props: {deviceId: device.deviceId}, component: sdk.getComponent("toasts.NewSessionToast"), }); + newActiveToasts.add(device.deviceId); } } + + // clear any other outstanding toasts (eg. logged out devices) + for (const deviceId of this._activeNagToasts) { + if (!newActiveToasts.has(deviceId)) ToastStore.sharedInstance().dismissToast(toastKey(deviceId)); + } + this._activeNagToasts = newActiveToasts; } } From 9e38c627913444f358939533c43fce2dc7754ebf Mon Sep 17 00:00:00 2001 From: David Baker Date: Sat, 25 Jan 2020 20:42:45 +0000 Subject: [PATCH 263/906] Show incoming verification requests in the 'complete security' phase If you click to verify your new sign in on another device, actually show the verification request on the 'complete security' screen. --- .../structures/auth/CompleteSecurity.js | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/components/structures/auth/CompleteSecurity.js b/src/components/structures/auth/CompleteSecurity.js index 89711fcb1d..ce938bd2f8 100644 --- a/src/components/structures/auth/CompleteSecurity.js +++ b/src/components/structures/auth/CompleteSecurity.js @@ -35,7 +35,18 @@ export default class CompleteSecurity extends React.Component { this.state = { phase: PHASE_INTRO, + verificationRequest: null, }; + MatrixClientPeg.get().on("crypto.verification.request", this.onVerificationRequest); + } + + componentWillUnmount() { + if (this.state.verificationRequest) { + this.state.verificationRequest.off("change", this.onVerificationRequestChange); + } + if (MatrixClientPeg.get()) { + MatrixClientPeg.get().removeListener("crypto.verification.request", this.onVerificationRequest); + } } onStartClick = async () => { @@ -55,6 +66,27 @@ export default class CompleteSecurity extends React.Component { } } + onVerificationRequest = (request) => { + if (request.otherUserId !== MatrixClientPeg.get().getUserId()) return; + + if (this.state.verificationRequest) { + this.state.verificationRequest.off("change", this.onVerificationRequestChange); + } + request.on("change", this.onVerificationRequestChange); + this.setState({ + verificationRequest: request, + }); + } + + onVerificationRequestChange = () => { + if (this.state.verificationRequest.cancelled) { + this.state.verificationRequest.off("change", this.onVerificationRequestChange); + this.setState({ + verificationRequest: null, + }); + } + } + onSkipClick = () => { this.setState({ phase: PHASE_CONFIRM_SKIP, @@ -87,7 +119,13 @@ export default class CompleteSecurity extends React.Component { let icon; let title; let body; - if (phase === PHASE_INTRO) { + + if (this.state.verificationRequest) { + const IncomingSasDialog = sdk.getComponent("views.dialogs.IncomingSasDialog"); + body = ; + } else if (phase === PHASE_INTRO) { icon = ; title = _t("Complete security"); body = ( From f851f976e7e82017cc02955c3adf758664d85ccc Mon Sep 17 00:00:00 2001 From: David Baker Date: Sat, 25 Jan 2020 21:26:43 +0000 Subject: [PATCH 264/906] Stop rogue verification toast if you verify during login Fixes https://github.com/vector-im/riot-web/issues/12057 --- src/components/structures/ToastContainer.js | 2 -- src/components/views/toasts/VerificationRequestToast.js | 7 +++++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/components/structures/ToastContainer.js b/src/components/structures/ToastContainer.js index 8a05f62e61..298c40e825 100644 --- a/src/components/structures/ToastContainer.js +++ b/src/components/structures/ToastContainer.js @@ -23,9 +23,7 @@ export default class ToastContainer extends React.Component { constructor() { super(); this.state = {toasts: ToastStore.sharedInstance().getToasts()}; - } - componentDidMount() { ToastStore.sharedInstance().on('update', this._onToastStoreUpdate); } diff --git a/src/components/views/toasts/VerificationRequestToast.js b/src/components/views/toasts/VerificationRequestToast.js index f912984486..b2d1aaf59d 100644 --- a/src/components/views/toasts/VerificationRequestToast.js +++ b/src/components/views/toasts/VerificationRequestToast.js @@ -39,6 +39,13 @@ export default class VerificationRequestToast extends React.PureComponent { this.setState({counter}); }, 1000); request.on("change", this._checkRequestIsPending); + // We should probably have a separate class managing the active verification toasts, + // rather than monitoring this in the toast component itself, since we'll get problems + // like the toasdt not going away when the verification is cancelled unless it's the + // one on the top (ie. the one that's mounted). + // As a quick & dirty fix, check the toast is still relevant when it mounts (this prevents + // a toast hanging around after logging in if you did a verification as part of login). + this._checkRequestIsPending(); } componentWillUnmount() { From 086e43e58469e7dba0fb2443b241ca1f68f2fe17 Mon Sep 17 00:00:00 2001 From: David Baker Date: Sat, 25 Jan 2020 21:30:42 +0000 Subject: [PATCH 265/906] comments ftw --- src/components/structures/ToastContainer.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/structures/ToastContainer.js b/src/components/structures/ToastContainer.js index 298c40e825..283fbdd96a 100644 --- a/src/components/structures/ToastContainer.js +++ b/src/components/structures/ToastContainer.js @@ -24,6 +24,10 @@ export default class ToastContainer extends React.Component { super(); this.state = {toasts: ToastStore.sharedInstance().getToasts()}; + // Start listening here rather than in componentDidMount because + // toasts may dismiss themselves in their didMount if they find + // they're already irrelevant by the time they're mounted, and + // our own componentDidMount is too late. ToastStore.sharedInstance().on('update', this._onToastStoreUpdate); } From 49cdbc9ebe68da74e0099c4e598d851800ba7852 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Sat, 25 Jan 2020 16:25:51 +0000 Subject: [PATCH 266/906] Translated using Weblate (Albanian) Currently translated at 99.7% (2043 of 2050 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sq/ --- src/i18n/strings/sq.json | 91 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 87 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index e833009d59..3c04ff85c0 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -1917,11 +1917,11 @@ "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s bëri një thirrje zanore. (e pambuluar nga ky shfletues)", "%(senderName)s placed a video call.": "%(senderName)s bëri një thirrje video.", "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s bëri një thirrje video. (e pambuluar nga ky shfletues)", - "Enable cross-signing to verify per-user instead of per-device (in development)": "", + "Enable cross-signing to verify per-user instead of per-device (in development)": "Aktivizoni cross-signing për të verifikuar me bazë përdorues në vend se me bazë pajisje (në zhvillim)", "Enable local event indexing and E2EE search (requires restart)": "Aktivizoni indeksim aktesh vendore dhe kërkim E2EE (lyp rinisje)", "Match system theme": "Përputhe me temën e sistemit", - "Send cross-signing keys to homeserver": "", - "Cross-signing public keys:": "", + "Send cross-signing keys to homeserver": "Dërgo te shërbyesi Home kyçe cross-signing", + "Cross-signing public keys:": "Kyçe publikë për cross-signing:", "on device": "në pajisje", "not found": "s’u gjet", "in secret storage": "në depozitë të fshehtë", @@ -2016,5 +2016,88 @@ "Connected to on ": "Lidhur me ", "Connected via %(protocolName)s": "Lidhur përmes %(protocolName)s", "Bridge Info": "Të dhëna Ure", - "Below is a list of bridges connected to this room.": "Më poshtë keni një listë urash të lidhura në këtë dhomë." + "Below is a list of bridges connected to this room.": "Më poshtë keni një listë urash të lidhura në këtë dhomë.", + "New Session": "Sesion i Ri", + "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s shtoi %(addedAddresses)s dhe dhe %(count)s adresa të tjera te kjo dhomë", + "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s hoqi %(removedAddresses)s dhe %(count)s adresa të tjera nga kjo dhomë", + "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s hoqi %(countRemoved)s dhe shtoi %(countAdded)s adresa te kjo dhomë", + "%(senderName)s turned on end-to-end encryption.": "%(senderName)s aktivizoi fshehtëzimin skaj-më-skaj.", + "%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s aktivizoi fshehtëzimin skaj-më-skaj (algoritëm jo i pranuar %(algorithm)s).", + "a few seconds ago": "pak sekonda më parë", + "about a minute ago": "rreth një minutë më parë", + "%(num)s minutes ago": "%(num)s minuta më parë", + "about an hour ago": "rreth një orë më parë", + "%(num)s hours ago": "%(num)s orë më parë", + "about a day ago": "rreth një ditë më parë", + "%(num)s days ago": "%(num)s ditë më parë", + "a few seconds from now": "pak sekonda nga tani", + "about a minute from now": "rreth një minutë nga tani", + "%(num)s minutes from now": "%(num)s minuta nga tani", + "about an hour from now": "rreth një orë nga tani", + "%(num)s hours from now": "%(num)s orë nga tani", + "about a day from now": "rreth një ditë nga tani", + "%(num)s days from now": "%(num)s ditë nga tani", + "Show a presence dot next to DMs in the room list": "Shfaqni një pikë pranie në krah DM-sh te lista e dhomave", + "Other users may not trust it": "Përdorues të tjerë mund të mos e besojnë", + "Later": "Më vonë", + "Cross-signing and secret storage are enabled.": "Cross-signing dhe depozitimi i fshehtë janë aktivizuar.", + "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this device.": "Llogaria juaj ka një identitet cross-signing në depozitë të fshehtë, por s’është ende i besuar në këtë pajisje.", + "Cross-signing and secret storage are not yet set up.": "Cross-signing dhe depozitimi i fshehtë s’janë ujdisur ende.", + "Cross-signing private keys:": "Kyçe privatë për cross-signing:", + "Backup key stored in secret storage, but this feature is not enabled on this device. Please enable cross-signing in Labs to modify key backup state.": "Kyçi i kopjeruajtjeve u depozitua në depozitë të fshehtë, po kjo veçori s’është e aktivizuar në këtë pajisje. Ju lutemi, aktivizoni në Labs cross-signing që të modifikoni gjendje kopjeruatjeje kyçesh.", + "Labs": "Labs", + "Complete": "E plotë", + "Someone is using an unknown device": "Dikush po përdor një pajisje të panjohur", + "This room is end-to-end encrypted": "Kjo dhomë është e fshehtëzuar skaj-më-skaj", + "Everyone in this room is verified": "Gjithkush në këtë dhomë është verifikuar", + "Encrypted by a deleted device": "Fshehtëzuar nga një pajisje e fshirë", + "Invite only": "Vetëm me ftesa", + "Send a reply…": "Dërgoni një përgjigje…", + "Send a message…": "Dërgoni një mesazh…", + "Reject & Ignore user": "Hidhe poshtë & Shpërfille përdoruesin", + "Unknown Command": "Urdhër i Panjohur", + "Unrecognised command: %(commandText)s": "Urdhër Jo i Pranuar: %(commandText)s", + "You can use /help to list available commands. Did you mean to send this as a message?": "Mund të përdorni /help që të shfaqen urdhrat e gatshëm. Donit vërtet ta dërgoni këtë si një mesazh?", + "Hint: Begin your message with // to start it with a slash.": "Ndihmëz: Fillojeni mesazhin tuaj me // që të nisë me një pjerrake.", + "Send as message": "Dërgoni një mesazh", + "Verify User": "Verifikoni Përdoruesin", + "For extra security, verify this user by checking a one-time code on both of your devices.": "Për siguri ekstra, verifikojeni këtë përdorues duke kontrolluar në të dyja pajisjet tuaja një kod njëpërdorimsh.", + "For maximum security, do this in person.": "Për siguri maksimum, bëjeni këtë ju vetë.", + "Start Verification": "Fillo Verifikimin", + "Failed to invite the following users to chat: %(csvUsers)s": "S’u arrit të ftoheshin për bisedë përdoruesit vijues: %(csvUsers)s", + "We couldn't create your DM. Please check the users you want to invite and try again.": "S’e krijuam dot DM-në tuaj. Ju lutemi, kontrolloni përdoruesit që doni të ftoni dhe riprovoni.", + "Something went wrong trying to invite the users.": "Diç shkoi ters teksa provohej të ftoheshin përdoruesit.", + "We couldn't invite those users. Please check the users you want to invite and try again.": "S’i ftuam dot këta përdorues. Ju lutemi, kontrolloni përdoruesit që doni të ftoni dhe riprovoni.", + "Failed to find the following users": "S’u arrit të gjendeshin përdoruesit vijues", + "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "Përdoruesit vijues mund të mos ekzistojnë ose janë të pavlefshëm, dhe s’mund të ftohen: %(csvNames)s", + "Suggestions": "Sugjerime", + "If you can't find someone, ask them for their username, share your username (%(userId)s) or profile link.": "Nëse s’gjeni dot dikë, kërkojini emrin e tij të përdoruesit, tregojuni emrin tuaj të përdoruesit (%(userId)s) ose lidhjen e profilit.", + "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.": "Nëse s’gjeni dot dikë, kërkojini emrin e tij të përdoruesit (p.sh., @përdorues:shërbyes.com) ose tregojuni këtë dhomë.", + "Access your secure message history and your cross-signing identity for verifying other devices by entering your passphrase.": "Për verifikim pajisjesh të tjera përmes dhënies së frazëkalimit tuaj, hyni te historiku i mesazheve tuaj të sigurt dhe identiteti juaj për cross-signing.", + "Access your secure message history and your cross-signing identity for verifying other devices by entering your recovery key.": "Për verifikim pajisjesh të tjera përmes dhënies së kyçit tuaj të rimarrjes, hyni te historiku i mesazheve tuaj të sigurt dhe identiteti juaj për cross-signing.", + "Complete security": "Siguri të plotë", + "Verify this session to grant it access to encrypted messages.": "Verifikojeni këtë sesion që t’i akordohet hyrje te mesazhe të fshehtëzuar.", + "Start": "Nise", + "Session verified": "Sesion i verifikuar", + "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Sesioni juaj i ri tani është i verifikuar. Ka hyrje te mesazhet tuaj të fshehtëzuar dhe përdoruesit e tjerë do ta shohin si të besuar.", + "Done": "U bë", + "Without completing security on this device, it won’t have access to encrypted messages.": "Pa plotësuar sigurinë në këtë pajisje, s’do të ketë hyrje te mesazhe të fshehtëzuar.", + "Go Back": "Shko Mbrapsht", + "Key Backup is enabled on your account but has not been set up from this session. To set up secret storage, restore your key backup.": "Kopjeruajtja e Kyçeve është e aktivizuar në llogarinë tuaj, por nuk është ujdisur që nga ky sesion. Që të ujdisni depozitim të fshehtë, riktheni kopjeruajtjen tuaj të kyçeve.", + "Restore": "Riktheje", + "Enter your account password to confirm the upgrade:": "Që të ripohohet përmirësimi, jepni fjalëkalimin e llogarisë tuaj:", + "You'll need to authenticate with the server to confirm the upgrade.": "Do t’ju duhet të bëni mirëfilltësimin me shërbyesin që të ripohohet përmirësimi.", + "Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Përmirësojeni këtë pajisje për ta lejuar të verifikojë pajisje të tjera, duke u akorduar hyrje te mesazhe të fshehtëzuar dhe duke u vënë shenjë si të besuara për përdorues të tjerë.", + "Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Ujdisni fshehtëzim në këtë pajisje që ta lejoni të verifikojë pajisje të tjera, duke u akorduar atyre hyrje te mesazhe të fshehtëzuar dhe duke u vënë shenjë atyre si të besuara për përdorues të tjerë.", + "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Sigurojini kyçet tuaj të fshehtëzimit me një frazëkalim. Për siguri maksimale, ky do të duhej të ishte i ndryshëm nga fjalëkalimi për llogarinë tuaj:", + "Enter a passphrase": "Jepni një frazëkalim", + "Enter your passphrase a second time to confirm it.": "Që të ripohohet, jepeni edhe një herë frazëkalimin tuaj.", + "This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Kjo pajisje mund të verifikojë pajisje të tjera, duke u akorduar hyrje te mesazhe të fshehtëzuar dhe duke u vënë shenjë si të besuara për përdorues të tjerë.", + "Verify other users in their profile.": "Verifikoni përdorues të tjerë në profilin e tyre.", + "Without setting up secret storage, you won't be able to restore your access to encrypted messages or your cross-signing identity for verifying other devices if you log out or use another device.": "Pa ujdisur depozitim të fshehtë, s’do të jeni në gjendje të rimerrni hyrje te mesazhe të fshehtëzuar apo te identiteti juaj cross-signing për verifikim pajisjesh të tjera, nëse dilni nga llogaria juaj ose përdorni një pajisje tjetër.", + "Restore your Key Backup": "Riktheni Kopjeruajtjen tuaj të Kyçeve", + "Upgrade your encryption": "Përmirësoni fshehtëzimin tuaj", + "Set up encryption": "Ujdisni fshehtëzim", + "Encryption upgraded": "U përmirësua fshehtëzimi", + "Encryption setup complete": "Ujdisje fshehtëzimit e plotësuar" } From a4bbe2ba645d6f411313b4b87b38a6783feec4c5 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sun, 26 Jan 2020 22:15:44 +0000 Subject: [PATCH 267/906] fix compound emoji --- src/emoji.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/emoji.js b/src/emoji.js index 125864e381..20b05531ca 100644 --- a/src/emoji.js +++ b/src/emoji.js @@ -79,13 +79,13 @@ EMOJIBASE.forEach(emoji => { }); /** - * Strips variation selectors from a string - * NB. Skin tone modifers are not variation selectors: + * Strips variation selectors from the end of given string + * NB. Skin tone modifiers are not variation selectors: * this function does not touch them. (Should it?) * * @param {string} str string to strip * @returns {string} stripped string */ function stripVariation(str) { - return str.replace(/[\uFE00-\uFE0F]/, ""); + return str.replace(/[\uFE00-\uFE0F]$/, ""); } From 13ba90a05469b3b6f35133d90c2233b50d63c57b Mon Sep 17 00:00:00 2001 From: Tirifto Date: Mon, 27 Jan 2020 09:33:34 +0000 Subject: [PATCH 268/906] Translated using Weblate (Esperanto) Currently translated at 90.1% (1848 of 2050 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/eo/ --- src/i18n/strings/eo.json | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 4ac519d16a..243aebb52d 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -1851,7 +1851,7 @@ "Error unsubscribing from list": "Eraris malabono de la listo", "Please try again or view your console for hints.": "Bonvolu reprovi aŭ serĉi helpilojn en via konzolo.", "You have not ignored anyone.": "Vi neniun malatentis.", - "You are not subscribed to any lists": "Vi neniun liston abonis.", + "You are not subscribed to any lists": "Vi neniun liston abonis", "Unsubscribe": "Malaboni", "View rules": "Montri regulojn", "You are currently subscribed to:": "Vi nun abonas:", @@ -1867,5 +1867,28 @@ "Widget ID": "Identigilo de fenestraĵo", "Widgets do not use message encryption.": "Fenestraĵoj ne uzas ĉifradon de mesaĝoj.", "Widget added by": "Fenestraĵon aldonis", - "This widget may use cookies.": "Ĉi tiu fenestraĵo povas uzi kuketojn." + "This widget may use cookies.": "Ĉi tiu fenestraĵo povas uzi kuketojn.", + "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s aldonis %(addedAddresses)s kaj %(count)s aliajn adresojn al ĉi tiu ĉambro", + "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s forigis %(removedAddresses)s kaj %(count)s aliajn adresojn el ĉi tiu ĉambro", + "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s forigis %(countRemoved)s kaj aldonis %(countAdded)s adresojn al ĉi tiu ĉambro", + "%(senderName)s turned on end-to-end encryption.": "%(senderName)s ŝaltis tutvojan ĉifradon.", + "%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s ŝaltis tutvojan ĉifradon (nerekonita algoritmo %(algorithm)s).", + "a few seconds ago": "antaŭ kelkaj sekundoj", + "about a minute ago": "antaŭ ĉirkaŭ minuto", + "%(num)s minutes ago": "antaŭ %(num)s minutoj", + "about an hour ago": "antaŭ ĉirkaŭ horo", + "%(num)s hours ago": "antaŭ %(num)s horoj", + "about a day ago": "antaŭ ĉirkaŭ tago", + "%(num)s days ago": "antaŭ %(num)s tagoj", + "a few seconds from now": "kelkajn sekundojn de nun", + "about a minute from now": "ĉirkaŭ minuton de nun", + "%(num)s minutes from now": "%(num)s minutojn de nun", + "about an hour from now": "ĉirkaŭ horon de nun", + "%(num)s hours from now": "%(num)s horojn de nun", + "about a day from now": "ĉirkaŭ tagon de nun", + "%(num)s days from now": "%(num)s tagojn de nun", + "Lock": "Seruro", + "Other users may not trust it": "Aliaj uzantoj eble ne kredas ĝin", + "Later": "Pli poste", + "Verify": "Kontroli" } From ca774f45fea0685b002f8bde37cae95cb7a51ece Mon Sep 17 00:00:00 2001 From: catborise Date: Sun, 26 Jan 2020 19:49:59 +0000 Subject: [PATCH 269/906] Translated using Weblate (Turkish) Currently translated at 73.8% (1513 of 2050 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/tr/ --- src/i18n/strings/tr.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index db43e96cea..257cb27b42 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -1532,5 +1532,11 @@ "Show display name changes": "Ekran isim değişikliklerini göster", "Enable URL previews for this room (only affects you)": "Bu oda için URL önizlemeyi aç (sadece sizi etkiler)", "Enable URL previews by default for participants in this room": "Bu odadaki katılımcılar için URL önizlemeyi varsayılan olarak açık hale getir", - "Enable widget screenshots on supported widgets": "Desteklenen görsel bileşenlerde anlık görüntüleri aç" + "Enable widget screenshots on supported widgets": "Desteklenen görsel bileşenlerde anlık görüntüleri aç", + "Show recently visited rooms above the room list": "En son ziyaret edilen odaları oda listesinin en üstünde göster", + "Show hidden events in timeline": "Zaman çizelgesinde gizli olayları göster", + "Encrypted messages in one-to-one chats": "Birebir sohbetlerdeki şifrelenmiş mesajlar", + "Encrypted messages in group chats": "Grup sohbetlerdeki şifrelenmiş mesajlar", + "This is your list of users/servers you have blocked - don't leave the room!": "Bu sizin engellediğiniz kullanıcılar/sunucular listeniz - odadan ayrılmayın!", + "Got It": "Anlaşıldı" } From ebb70ca9fb943317bb2bcb8e214de04797a8ea51 Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 27 Jan 2020 09:44:12 +0000 Subject: [PATCH 270/906] English Co-Authored-By: J. Ryan Stinnett --- src/DeviceListener.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DeviceListener.js b/src/DeviceListener.js index dc066eb7cb..f503353145 100644 --- a/src/DeviceListener.js +++ b/src/DeviceListener.js @@ -108,7 +108,7 @@ export default class DeviceListener { } // cross signing isn't enabled - nag to enable it - // There 3 different toasts for: + // There are 3 different toasts for: if (cli.getStoredCrossSigningForUser(cli.getUserId())) { // Cross-signing on account but this device doesn't trust the master key (verify this session) ToastStore.sharedInstance().addOrReplaceToast({ From 43173824d3bbecda233d896f43b44d4a53828862 Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 27 Jan 2020 09:44:39 +0000 Subject: [PATCH 271/906] Capitalisation Co-Authored-By: J. Ryan Stinnett --- src/DeviceListener.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DeviceListener.js b/src/DeviceListener.js index f503353145..32024d1d87 100644 --- a/src/DeviceListener.js +++ b/src/DeviceListener.js @@ -113,7 +113,7 @@ export default class DeviceListener { // Cross-signing on account but this device doesn't trust the master key (verify this session) ToastStore.sharedInstance().addOrReplaceToast({ key: THIS_DEVICE_TOAST_KEY, - title: _t("Verify this Session"), + title: _t("Verify this session"), icon: "verification_warning", props: {kind: 'verify_this_session'}, component: sdk.getComponent("toasts.SetupEncryptionToast"), From 8c4c79adde070766a14ad49d6b736104ca9a9ea4 Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 27 Jan 2020 10:05:42 +0000 Subject: [PATCH 272/906] i18n --- src/i18n/strings/en_EN.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 0d033dff4d..5c2f427c6a 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -88,7 +88,7 @@ "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(time)s", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s", - "Verify this Session": "Verify this Session", + "Verify this session": "Verify this session", "Encryption upgrade available": "Encryption upgrade available", "Set up encryption": "Set up encryption", "New Session": "New Session", From e50ed95edff8e2d5b8bfebd1ec605b6dd196e23b Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 27 Jan 2020 10:17:16 +0000 Subject: [PATCH 273/906] English Co-Authored-By: J. Ryan Stinnett --- src/DeviceListener.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DeviceListener.js b/src/DeviceListener.js index 3135e3d9a5..331b68398b 100644 --- a/src/DeviceListener.js +++ b/src/DeviceListener.js @@ -34,7 +34,7 @@ export default class DeviceListener { } constructor() { - // set of device ID's we're currently showing toasts for + // set of device IDs we're currently showing toasts for this._activeNagToasts = new Set(); // device IDs for which the user has dismissed the verify toast ('Later') this._dismissed = new Set(); From 11de92b9a90c6d847f6687d6c9808a24ca189fdd Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 27 Jan 2020 11:07:55 +0000 Subject: [PATCH 274/906] hopefully informative comment --- src/components/structures/auth/CompleteSecurity.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/structures/auth/CompleteSecurity.js b/src/components/structures/auth/CompleteSecurity.js index ce938bd2f8..206cdb743e 100644 --- a/src/components/structures/auth/CompleteSecurity.js +++ b/src/components/structures/auth/CompleteSecurity.js @@ -35,6 +35,9 @@ export default class CompleteSecurity extends React.Component { this.state = { phase: PHASE_INTRO, + // this serves dual purpose as the object for the request logic and + // the presence of it insidicating that we're in 'verify mode'. + // Because of the latter, it lives in the state. verificationRequest: null, }; MatrixClientPeg.get().on("crypto.verification.request", this.onVerificationRequest); From c9a0e93a74f437978eef3266f8b2b279558e9857 Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Mon, 27 Jan 2020 11:14:32 +0000 Subject: [PATCH 275/906] tidy up borders --- res/css/views/dialogs/_RoomSettingsDialog.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/css/views/dialogs/_RoomSettingsDialog.scss b/res/css/views/dialogs/_RoomSettingsDialog.scss index 0e8deb018e..66c34fd73d 100644 --- a/res/css/views/dialogs/_RoomSettingsDialog.scss +++ b/res/css/views/dialogs/_RoomSettingsDialog.scss @@ -66,16 +66,16 @@ limitations under the License. margin-bottom: 8px; border-width: 1px 1px; border-color: $primary-hairline-color; + border-style: solid; border-radius: 5px; .protocol-icon { float: left; - margin-right: 30px; + margin-right: 5px; img { border-radius: 5px; border-width: 1px 1px; border-color: $primary-hairline-color; - border-style: solid; } span { /* Correct letter placement */ From 692c993a34a5a4947b6ea25142e8533d11852c07 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 27 Jan 2020 11:40:05 +0000 Subject: [PATCH 276/906] js-sdk v4.0.0 --- package.json | 2 +- yarn.lock | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index dc619e50ef..901c0cec15 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "is-ip": "^2.0.0", "linkifyjs": "^2.1.6", "lodash": "^4.17.14", - "matrix-js-sdk": "4.0.0-rc.1", + "matrix-js-sdk": "4.0.0", "pako": "^1.0.5", "png-chunks-extract": "^1.0.0", "prop-types": "^15.5.8", diff --git a/yarn.lock b/yarn.lock index 75c5af6a1d..232067a99f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5760,11 +5760,12 @@ mathml-tag-names@^2.0.1: resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.1.tgz#6dff66c99d55ecf739ca53c492e626f1d12a33cc" integrity sha512-pWB896KPGSGkp1XtyzRBftpTzwSOL0Gfk0wLvxt4f2mgzjY19o0LxJ3U25vNWTzsh7da+KTbuXQoQ3lOJZ8WHw== -matrix-js-sdk@4.0.0-rc.1: - version "4.0.0-rc.1" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-4.0.0-rc.1.tgz#160d445364aa8ff36ae4fffb0ebc944f680afa4e" - integrity sha512-1tP9fUCU5I4bXQQHuVlKHbpySh71aM6sugVC6L8ikG1ebZuKkAc2tXf1tiHizp3hZadHoTZ1PGH19ZFlKDZ8Qw== +matrix-js-sdk@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-4.0.0.tgz#c81bdc905af2ab1634527e5f542f2f15977d31cf" + integrity sha512-Xbe36xL443qtEBH4xk0k39JabolqZfloK7fwYGMb/PgWO26VOzvw94XWahnIr5w83oxBAF9nFmP+7EnPG6IHnA== dependencies: + "@babel/runtime" "^7.8.3" another-json "^0.2.0" browser-request "^0.3.3" bs58 "^4.0.1" From 976ac328e12414e4b9af631a7c6ce18770defda4 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 27 Jan 2020 11:44:10 +0000 Subject: [PATCH 277/906] Prepare changelog for v2.0.0 --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7630231615..881669a1a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +Changes in [2.0.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v2.0.0) (2020-01-27) +=================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v2.0.0-rc.2...v2.0.0) + + * Ensure a plaintext version of the composer ends up on the clipboard + [\#3923](https://github.com/matrix-org/matrix-react-sdk/pull/3923) + * Move & upgrade babel runtime into dependencies (like it wants) + [\#3921](https://github.com/matrix-org/matrix-react-sdk/pull/3921) + * Don't list every single alias when there's many + [\#3919](https://github.com/matrix-org/matrix-react-sdk/pull/3919) + Changes in [2.0.0-rc.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v2.0.0-rc.2) (2020-01-20) ============================================================================================================= [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v2.0.0-rc.1...v2.0.0-rc.2) From 8c56c59922b2c0df387bd8fafb51272cb447392a Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 27 Jan 2020 11:44:10 +0000 Subject: [PATCH 278/906] v2.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 901c0cec15..fa017b223d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "2.0.0-rc.2", + "version": "2.0.0", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From e224150190f2d2869951a03eebc76c2ebcc93b18 Mon Sep 17 00:00:00 2001 From: Zoe Date: Mon, 27 Jan 2020 12:17:12 +0000 Subject: [PATCH 279/906] detail pass on DMs --- src/components/views/rooms/RoomBreadcrumbs.js | 2 +- src/components/views/rooms/RoomHeader.js | 5 ++++- src/components/views/rooms/RoomTile.js | 5 +++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/components/views/rooms/RoomBreadcrumbs.js b/src/components/views/rooms/RoomBreadcrumbs.js index 5a15a7518b..f9408d3259 100644 --- a/src/components/views/rooms/RoomBreadcrumbs.js +++ b/src/components/views/rooms/RoomBreadcrumbs.js @@ -363,7 +363,7 @@ export default class RoomBreadcrumbs extends React.Component { } let dmIndicator; - if (this._isDmRoom(r.room)) { + if (this._isDmRoom(r.room) && !SettingsStore.isFeatureEnabled("feature_cross_signing")) { dmIndicator = : undefined; + const dmUserId = DMRoomMap.shared().getUserIdForRoomId(this.props.room.roomId); const joinRules = this.props.room && this.props.room.currentState.getStateEvents("m.room.join_rules", ""); const joinRule = joinRules && joinRules.getContent().join_rule; let privateIcon; - if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { + // Don't show an invite-only icon for DMs. Users know they're invite-only. + if (!dmUserId && SettingsStore.isFeatureEnabled("feature_cross_signing")) { if (joinRule == "invite") { privateIcon = ; } diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index 9d2334de82..41975fe7b8 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -478,8 +478,9 @@ export default createReactClass({ let dmIndicator; let dmOnline; - // If we can place a shield, do that instead - if (dmUserId && !this.state.e2eStatus) { + /* Post-cross-signing we don't show DM indicators at all, instead relying on user + context to let them know when that is. */ + if (dmUserId && !SettingsStore.isFeatureEnabled("feature_cross_signing")) { dmIndicator = Date: Mon, 27 Jan 2020 14:05:22 +0000 Subject: [PATCH 280/906] Factor out into BridgeTile --- res/css/_components.scss | 1 + .../dialogs/_RoomSettingsDialogBridges.scss | 93 ++++++++++++++ src/components/views/settings/BridgeTile.js | 116 ++++++++++++++++++ .../settings/tabs/room/BridgeSettingsTab.js | 79 +----------- 4 files changed, 212 insertions(+), 77 deletions(-) create mode 100644 res/css/views/dialogs/_RoomSettingsDialogBridges.scss create mode 100644 src/components/views/settings/BridgeTile.js diff --git a/res/css/_components.scss b/res/css/_components.scss index 60f749de9c..f6a680c438 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -66,6 +66,7 @@ @import "./views/dialogs/_InviteDialog.scss"; @import "./views/dialogs/_MessageEditHistoryDialog.scss"; @import "./views/dialogs/_RoomSettingsDialog.scss"; +@import "./views/dialogs/_RoomSettingsDialogBridges.scss"; @import "./views/dialogs/_RoomUpgradeDialog.scss"; @import "./views/dialogs/_RoomUpgradeWarningDialog.scss"; @import "./views/dialogs/_SetEmailDialog.scss"; diff --git a/res/css/views/dialogs/_RoomSettingsDialogBridges.scss b/res/css/views/dialogs/_RoomSettingsDialogBridges.scss new file mode 100644 index 0000000000..85d5c76ffc --- /dev/null +++ b/res/css/views/dialogs/_RoomSettingsDialogBridges.scss @@ -0,0 +1,93 @@ +/* +Copyright 2020 New Vector Ltd. + +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. +*/ + +.mx_RoomSettingsDialog_BridgeList { + padding: 0; + + .mx_AccessibleButton { + display: inline; + margin: 0; + padding: 0; + float: left; + } +} + +.mx_RoomSettingsDialog_BridgeList li { + list-style-type: none; + padding: 5px; + margin-bottom: 8px; + border-width: 1px 1px; + border-color: $primary-hairline-color; + border-style: solid; + border-radius: 5px; + + .protocol-icon { + float: left; + margin-right: 5px; + img { + border-radius: 5px; + border-width: 1px 1px; + border-color: $primary-hairline-color; + } + span { + /* Correct letter placement */ + left: auto; + } + } + + h3 { + margin-top: 0; + margin-bottom: 4px; + font-size: 16pt; + color: $primary-fg-color; + } + + .column-icon { + float: left; + padding-right: 10px; + + .noProtocolIcon { + width: 48px; + height: 48px; + background: $settings-profile-placeholder-bg-color; + border-radius: 5px; + } + } + + .column-data { + display: inline-block; + width: 85%; + } + + .workspace-channel-details { + margin-top: 0; + color: $primary-fg-color; + } + + .metadata { + color: $muted-fg-color; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin-bottom: 0; + } + + .metadata.visible { + overflow-y: visible; + text-overflow: ellipsis; + white-space: normal; + } +} diff --git a/src/components/views/settings/BridgeTile.js b/src/components/views/settings/BridgeTile.js new file mode 100644 index 0000000000..330af4a18a --- /dev/null +++ b/src/components/views/settings/BridgeTile.js @@ -0,0 +1,116 @@ +/* +Copyright 2020 New Vector Ltd + +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 React from 'react'; +import PropTypes from 'prop-types'; +import {getHttpUriForMxc} from "matrix-js-sdk/src/content-repo"; +import {_t} from "../../../languageHandler"; +import {MatrixClientPeg} from "../../../MatrixClientPeg"; +import Pill from "../elements/Pill"; +import {makeUserPermalink} from "../../../utils/permalinks/Permalinks"; +import BaseAvatar from "../avatars/BaseAvatar"; +import AccessibleButton from "../elements/AccessibleButton"; + +export default class BridgeTile extends React.PureComponent { + static propTypes = { + ev: PropTypes.object.isRequired, + room: PropTypes.object.isRequired, + } + + state = { + visible: false + } + + _toggleVisible() { + this.setState({ + visible: !this.state.visible, + }); + } + + render() { + const content = this.props.ev.getContent(); + const { channel, network, protocol } = content; + const protocolName = protocol.displayname || protocol.id; + const channelName = channel.displayname || channel.id; + const networkName = network ? network.displayname || network.id : protocolName; + + let creator = null; + if (content.creator) { + creator = _t("This bridge was provisioned by .", {}, { + user: , + }); + } + + const bot = _t("This bridge is managed by .", {}, { + user: , + }); + + let networkIcon; + + if (protocol.avatar) { + const avatarUrl = getHttpUriForMxc( + MatrixClientPeg.get().getHomeserverUrl(), + protocol.avatar, 64, 64, "crop", + ); + + networkIcon = ; + } else { + networkIcon =
      ; + } + + + const workspaceChannelDetails = _t("Workspace: %(networkName)s Channel: %(channelName)s", { + networkName, + channelName, + }); + const id = this.props.ev.getId(); + const metadataClassname = "metadata" + (this.state.visible ? " visible" : ""); + return (
    1. +
      + {networkIcon} +
      +
      +

      {protocolName}

      +

      + {workspaceChannelDetails} +

      +

      + {creator} {bot} +

      + + Show { this.state.visible ? "less" : "more" } + +
      +
    2. ); + } +} diff --git a/src/components/views/settings/tabs/room/BridgeSettingsTab.js b/src/components/views/settings/tabs/room/BridgeSettingsTab.js index 8090cf7d4d..7a859b0594 100644 --- a/src/components/views/settings/tabs/room/BridgeSettingsTab.js +++ b/src/components/views/settings/tabs/room/BridgeSettingsTab.js @@ -18,10 +18,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import {_t} from "../../../../../languageHandler"; import {MatrixClientPeg} from "../../../../../MatrixClientPeg"; -import Pill from "../../../elements/Pill"; -import {makeUserPermalink} from "../../../../../utils/permalinks/Permalinks"; -import BaseAvatar from "../../../avatars/BaseAvatar"; -import {getHttpUriForMxc} from "matrix-js-sdk/src/content-repo"; +import BridgeTile from "../../BridgeTile"; const BRIDGE_EVENT_TYPES = [ "uk.half-shot.bridge", @@ -35,17 +32,6 @@ export default class BridgeSettingsTab extends React.Component { constructor() { super(); - - this.state = { - showMoreCard: null, - }; - } - - - _showMoreDetails(eventId) { - this.setState({ - showMoreCard: eventId, - }); } _renderBridgeCard(event, room) { @@ -53,68 +39,7 @@ export default class BridgeSettingsTab extends React.Component { if (!content || !content.channel || !content.protocol) { return null; } - const { channel, network } = content; - const protocolName = content.protocol.displayname || content.protocol.id; - const channelName = channel.displayname || channel.id; - const networkName = network ? network.displayname || network.id : protocolName; - - let creator = null; - if (content.creator) { - creator = _t("This bridge was provisioned by .", {}, { - user: , - }); - } - - const bot = _t("This bridge is managed by .", {}, { - user: , - }); - - const avatarUrl = network.avatar ? getHttpUriForMxc( - MatrixClientPeg.get().getHomeserverUrl(), - network.avatar, 32, 32, "crop", - ) : null; - - const networkIcon = ; - - const workspaceChannelDetails = _t("Workspace: %(networkName)s Channel: %(channelName)s", { - networkName, - channelName, - }); - const id = event.getId(); - const isVisible = this.state.showMoreCard === id; - const metadataClassname = "metadata " + (isVisible ? "visible" : ""); - return (
    3. -
      - {networkIcon} -
      -
      -

      {protocolName}

      -

      - {workspaceChannelDetails} -

      -

      - {creator} {bot} -

      - this._showMoreDetails(isVisible ? null : id)}>Show { isVisible ? "less" : "more" } -
      -
    4. ); + return } static getBridgeStateEvents(roomId) { From 7e0ab2f0a309157af8c953c88ef183b610e4fce1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Mon, 27 Jan 2020 15:28:43 +0100 Subject: [PATCH 281/906] DisableEventIndexDialog: Turn the cancel button red. --- res/css/_common.scss | 5 +++++ .../views/dialogs/eventindex/DisableEventIndexDialog.js | 1 + 2 files changed, 6 insertions(+) diff --git a/res/css/_common.scss b/res/css/_common.scss index 51d985efb7..77284d0a14 100644 --- a/res/css/_common.scss +++ b/res/css/_common.scss @@ -414,6 +414,11 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { color: $accent-fg-color; } +.mx_Dialog button.warning, .mx_Dialog input[type="submit"].warning { + border: solid 1px $warning-color; + color: $warning-color; +} + .mx_Dialog button:disabled, .mx_Dialog input[type="submit"]:disabled { background-color: $light-fg-color; border: solid 1px $light-fg-color; diff --git a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js index 13278217de..120b086ef6 100644 --- a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js +++ b/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.js @@ -63,6 +63,7 @@ export default class DisableEventIndexDialog extends React.Component { primaryButton={_t('Disable')} onPrimaryButtonClick={this._onDisable} primaryButtonClass="danger" + cancelButtonClass="warning" onCancel={this.props.onFinished} disabled={this.state.disabling} /> From 4d83288f4ea6ebfe61f6f7f0ef4784a9e175ad86 Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Mon, 27 Jan 2020 14:42:46 +0000 Subject: [PATCH 282/906] linting --- src/components/views/settings/BridgeTile.js | 4 ++-- .../views/settings/tabs/room/BridgeSettingsTab.js | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/views/settings/BridgeTile.js b/src/components/views/settings/BridgeTile.js index 330af4a18a..ee9343ec39 100644 --- a/src/components/views/settings/BridgeTile.js +++ b/src/components/views/settings/BridgeTile.js @@ -29,9 +29,9 @@ export default class BridgeTile extends React.PureComponent { ev: PropTypes.object.isRequired, room: PropTypes.object.isRequired, } - + state = { - visible: false + visible: false, } _toggleVisible() { diff --git a/src/components/views/settings/tabs/room/BridgeSettingsTab.js b/src/components/views/settings/tabs/room/BridgeSettingsTab.js index 7a859b0594..65c59ff977 100644 --- a/src/components/views/settings/tabs/room/BridgeSettingsTab.js +++ b/src/components/views/settings/tabs/room/BridgeSettingsTab.js @@ -39,7 +39,7 @@ export default class BridgeSettingsTab extends React.Component { if (!content || !content.channel || !content.protocol) { return null; } - return + return ; } static getBridgeStateEvents(roomId) { @@ -76,8 +76,8 @@ export default class BridgeSettingsTab extends React.Component {
        { bridgeEvents.map((event) => this._renderBridgeCard(event, room)) }
      -
      - } else { +
      ; + } else { content =

      {_t( "This room isn’t bridging messages to any platforms. " + "Learn more.", {}, @@ -86,7 +86,7 @@ export default class BridgeSettingsTab extends React.Component { // having to re-translate the string when we do. a: sub => '', }, - )}

      + )}

      ; } return ( From 5851b10f72af580b2be3357799075ea0fcd1dd82 Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Mon, 27 Jan 2020 14:44:11 +0000 Subject: [PATCH 283/906] strings --- src/i18n/strings/en_EN.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index e4ab764989..1afa3a33c9 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -521,6 +521,9 @@ "Accept to continue:": "Accept to continue:", "Upload": "Upload", "Remove": "Remove", + "This bridge was provisioned by .": "This bridge was provisioned by .", + "This bridge is managed by .": "This bridge is managed by .", + "Workspace: %(networkName)s Channel: %(channelName)s": "Workspace: %(networkName)s Channel: %(channelName)s", "Failed to upload profile picture!": "Failed to upload profile picture!", "Upload new:": "Upload new:", "No display name": "No display name", @@ -781,9 +784,6 @@ "Room version:": "Room version:", "Developer options": "Developer options", "Open Devtools": "Open Devtools", - "This bridge was provisioned by .": "This bridge was provisioned by .", - "This bridge is managed by .": "This bridge is managed by .", - "Workspace: %(networkName)s Channel: %(channelName)s": "Workspace: %(networkName)s Channel: %(channelName)s", "This room is bridging messages to the following platforms. Learn more.": "This room is bridging messages to the following platforms. Learn more.", "This room isn’t bridging messages to any platforms. Learn more.": "This room isn’t bridging messages to any platforms. Learn more.", "Bridges": "Bridges", From e38f1191a52880ee5b80ee3c68feb02831a8bdda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Mon, 27 Jan 2020 15:50:14 +0100 Subject: [PATCH 284/906] ManageEventIndex: Clarify that we're currently not downloading any messages. --- .../views/dialogs/eventindex/ManageEventIndexDialog.js | 2 +- src/i18n/strings/en_EN.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js index 5c82cc0391..b7ea87b1b2 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js @@ -108,7 +108,7 @@ export default class ManageEventIndexDialog extends React.Component { let crawlerState; if (this.state.currentRoom === null) { - crawlerState = _t("Not downloading messages for any room."); + crawlerState = _t("Not currently downloading messages for any room."); } else { crawlerState = ( _t("Downloading mesages for %(currentRoom)s.", { currentRoom: this.state.currentRoom }) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 419aecd528..e6e4ad3ed3 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2040,7 +2040,7 @@ "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.", "If disabled, messages from encrypted rooms won't appear in search results.": "If disabled, messages from encrypted rooms won't appear in search results.", "Disable": "Disable", - "Not downloading messages for any room.": "Not downloading messages for any room.", + "Not currently downloading messages for any room.": "Not currently downloading messages for any room.", "Downloading mesages for %(currentRoom)s.": "Downloading mesages for %(currentRoom)s.", "Riot is securely caching encrypted messages locally for them to appear in search results:": "Riot is securely caching encrypted messages locally for them to appear in search results:", "Space used:": "Space used:", From 50b491d7e5ede07a2d23e91e0a8cb3ec0c3c7251 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 27 Jan 2020 15:48:19 +0000 Subject: [PATCH 285/906] post merge fix --- .../views/right_panel/VerificationPanel.js | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 0fdf16de65..b911824b4e 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -35,21 +35,18 @@ export default class VerificationPanel extends React.PureComponent { // TODO change the button into a spinner when on click const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); - if (!request.requestEvent || !request.requestEvent.getId()) { + const cli = MatrixClientPeg.get(); + const crossSigningInfo = cli.getStoredCrossSigningForUser(request.otherUserId); + if (!crossSigningInfo || !request.requestEvent || !request.requestEvent.getId()) { // TODO handle this error case return

      request.requestEvent.getId()

      ; } + const myKeyId = cli.getCrossSigningId(); const qrCodeKeys = [ - [MatrixClientPeg.get().getDeviceId(), MatrixClientPeg.get().getDeviceEd25519Key()], - [MatrixClientPeg.get().getCrossSigningId(), MatrixClientPeg.get().getCrossSigningId()], + [cli.getDeviceId(), cli.getDeviceEd25519Key()], + [myKeyId, myKeyId], ]; - const crossSigningInfo = MatrixClientPeg.get().getStoredCrossSigningForUser(request.otherUserId); - - if (!crossSigningInfo) { - // TODO handle this error case - return

      crossSigningInfo

      ; - } return
      From ab8ea5226647fcfdcaa7a352f3c711d2d5c536ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Mon, 27 Jan 2020 16:50:33 +0100 Subject: [PATCH 286/906] EventIndexPanel: Make sure links get opened in a new tab. --- src/components/views/settings/EventIndexPanel.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/views/settings/EventIndexPanel.js b/src/components/views/settings/EventIndexPanel.js index 479a995bc8..68faa53e53 100644 --- a/src/components/views/settings/EventIndexPanel.js +++ b/src/components/views/settings/EventIndexPanel.js @@ -157,7 +157,8 @@ export default class EventIndexPanel extends React.Component { "with search components added.", {}, { - 'nativeLink': (sub) => {sub}, + 'nativeLink': (sub) => {sub}, }, ) } @@ -172,7 +173,8 @@ export default class EventIndexPanel extends React.Component { "for encrypted messages to appear in search results.", {}, { - 'riotLink': (sub) => {sub}, + 'riotLink': (sub) => {sub}, }, ) } From 805e9abb3981584cd941e59c5c10edc3595c38b9 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Mon, 27 Jan 2020 16:00:25 +0000 Subject: [PATCH 287/906] Flip back to develop --- package.json | 2 +- yarn.lock | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index f0b7e04c73..78bbb5b4c6 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "is-ip": "^2.0.0", "linkifyjs": "^2.1.6", "lodash": "^4.17.14", - "matrix-js-sdk": "4.0.0", + "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", "pako": "^1.0.5", "png-chunks-extract": "^1.0.0", "prop-types": "^15.5.8", diff --git a/yarn.lock b/yarn.lock index 232067a99f..b892ac44f6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5760,10 +5760,9 @@ mathml-tag-names@^2.0.1: resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.1.tgz#6dff66c99d55ecf739ca53c492e626f1d12a33cc" integrity sha512-pWB896KPGSGkp1XtyzRBftpTzwSOL0Gfk0wLvxt4f2mgzjY19o0LxJ3U25vNWTzsh7da+KTbuXQoQ3lOJZ8WHw== -matrix-js-sdk@4.0.0: +"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": version "4.0.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-4.0.0.tgz#c81bdc905af2ab1634527e5f542f2f15977d31cf" - integrity sha512-Xbe36xL443qtEBH4xk0k39JabolqZfloK7fwYGMb/PgWO26VOzvw94XWahnIr5w83oxBAF9nFmP+7EnPG6IHnA== + resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/21e4c597d9633aef606871cf9ffffaf039142be3" dependencies: "@babel/runtime" "^7.8.3" another-json "^0.2.0" From 40ec6d47a6693d99505f66742ca09c7951406553 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Mon, 27 Jan 2020 10:26:19 +0000 Subject: [PATCH 288/906] Translated using Weblate (Albanian) Currently translated at 99.7% (2048 of 2055 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sq/ --- src/i18n/strings/sq.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 3c04ff85c0..e23bd07015 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -2099,5 +2099,10 @@ "Upgrade your encryption": "Përmirësoni fshehtëzimin tuaj", "Set up encryption": "Ujdisni fshehtëzim", "Encryption upgraded": "U përmirësua fshehtëzimi", - "Encryption setup complete": "Ujdisje fshehtëzimit e plotësuar" + "Encryption setup complete": "Ujdisje fshehtëzimit e plotësuar", + "Verify this session": "Verifikoni këtë sesion", + "Encryption upgrade available": "Ka të gatshëm përmirësim fshehtëzimi", + "Review & verify your new session": "Shqyrtoni & verifikoni sesionin tuaj të ri", + "Review": "Shqyrtojeni", + "Verify your other devices easier": "Verifikoni më lehtë pajisjet tuaja të tjera" } From 1d90600ee1876e22108a80df3b2d74946589a031 Mon Sep 17 00:00:00 2001 From: Tirifto Date: Mon, 27 Jan 2020 10:25:39 +0000 Subject: [PATCH 289/906] Translated using Weblate (Esperanto) Currently translated at 92.3% (1897 of 2055 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/eo/ --- src/i18n/strings/eo.json | 51 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 243aebb52d..2953a81ce3 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -1890,5 +1890,54 @@ "Lock": "Seruro", "Other users may not trust it": "Aliaj uzantoj eble ne kredas ĝin", "Later": "Pli poste", - "Verify": "Kontroli" + "Verify": "Kontroli", + "Set up encryption": "Agordi ĉifradon", + "Upgrade": "Gradaltigi", + "Cannot connect to integration manager": "Ne povas konektiĝi al kunigilo", + "The integration manager is offline or it cannot reach your homeserver.": "La kunigilo estas eksterreta aŭ ne povas atingi vian hejmservilon", + "Backup has a valid signature from this user": "Savkopio havas validan subskribon de ĉi tiu uzanto", + "Backup has a invalid signature from this user": "Savkopio havas nevalidan subskribon de ĉi tiu uzanto", + "This user has not verified all of their devices.": "Ĉi tiu uzanto ne kontrolis ĉiujn siajn aparatojn.", + "You have not verified this user. This user has verified all of their devices.": "Vi ne kontrolis ĉi tiun uzanton. Ĉi tiu uzanto kontrolis ĉiujn siajn aparatojn.", + "You have verified this user. This user has verified all of their devices.": "Vi kontrolis ĉi tiun uzanton. Ĉi tiu uzanto kontrolis ĉiujn siajn aparatojn.", + "Someone is using an unknown device": "Iu uzas nekonatan aparaton", + "This room is end-to-end encrypted": "Ĉi tiu ĉambro uzas tutvojan ĉifradon", + "Everyone in this room is verified": "Ĉiu en la ĉambro estas kontrolita", + "This message cannot be decrypted": "Ĉi tiun mesaĝon ne eblas malĉifri", + "Unencrypted": "Neĉifrita", + "Encrypted by a deleted device": "Ĉifrita de forigita aparato", + "Send a reply…": "Sendi respondon…", + "Send a message…": "Sendi mesaĝon…", + "Direct Messages": "Rektaj mesaĝoj", + " wants to chat": " volas babili", + "Start chatting": "Ekbabili", + "Reject & Ignore user": "Rifuzi kaj malatenti uzanton", + "Unknown Command": "Nekonata komando", + "Send as message": "Sendi mesaĝon", + "Failed to connect to integration manager": "Malsukcesis konekton al kunigilo", + "Verify User": "Kontroli uzanton", + "For extra security, verify this user by checking a one-time code on both of your devices.": "Por plia sekureco, kontrolu ĉi tiun uzanton per unufoja kodo aperonta sur ambaŭ el viaj aparatoj.", + "For maximum security, do this in person.": "Por plejgranda sekureco, faru tion persone.", + "Start Verification": "Komenci kontrolon", + "Trusted": "Fidata", + "Not trusted": "Nefidata", + "Direct message": "Rekta mesaĝo", + "Security": "Sekureco", + "Reactions": "Reagoj", + "More options": "Pliaj elektebloj", + "Integrations are disabled": "Kunigoj estas malŝaltitaj", + "Integrations not allowed": "Kunigoj ne estas permesitaj", + "Suggestions": "Proponoj", + "Automatically invite users": "Memage inviti uzantojn", + "Upgrade private room": "Gradaltigi privatan ĉambron", + "Upgrade public room": "Gradaltigi publikan ĉambron", + "Notification settings": "Sciigaj agordoj", + "Take picture": "Foti", + "Start": "Komenci", + "Done": "Fini", + "Go Back": "Reiri", + "Verify other users in their profile.": "Kontrolu aliajn uzantojn en iliaj profiloj.", + "Upgrade your encryption": "Gradaltigi vian ĉifradon", + "Encryption upgraded": "Ĉifrado gradaltigita", + "Encryption setup complete": "Agordo de ĉifrado finita" } From 1964e18315657f800257e66756f6f6e5505ba20b Mon Sep 17 00:00:00 2001 From: Zoe Date: Mon, 27 Jan 2020 16:40:56 +0000 Subject: [PATCH 290/906] Fix issue where we don't notice if our own devices shouldn't be trusted --- src/components/structures/RoomView.js | 2 +- src/components/views/rooms/RoomTile.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 60fff5f1e3..2d669f9243 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -811,7 +811,7 @@ export default createReactClass({ debuglog("e2e verified", verified, "unverified", unverified); /* Check all verified user devices. */ - for (const userId of verified) { + for (const userId of [...verified, cli.getUserId()]) { const devices = await cli.getStoredDevicesForUser(userId); const anyDeviceNotVerified = devices.some(({deviceId}) => { return !cli.checkDeviceTrust(userId, deviceId).isVerified(); diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index 41975fe7b8..41d43476ea 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -166,7 +166,7 @@ export default createReactClass({ }); /* Check all verified user devices. */ - for (const userId of verified) { + for (const userId of [...verified, cli.getUserId()]) { const devices = await cli.getStoredDevicesForUser(userId); const allDevicesVerified = devices.every(({deviceId}) => { return cli.checkDeviceTrust(userId, deviceId).isVerified(); From ca5d4d88a275c93aff94158ae8b6836acd1f08e6 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 27 Jan 2020 17:17:05 +0000 Subject: [PATCH 291/906] Style the QR code --- res/css/views/right_panel/_UserInfo.scss | 5 +++++ .../views/right_panel/_VerificationPanel.scss | 16 ++++++++++++++ .../elements/crypto/VerificationQRCode.js | 2 +- .../views/right_panel/VerificationPanel.js | 21 ++++++++++--------- src/i18n/strings/en_EN.json | 2 +- 5 files changed, 34 insertions(+), 12 deletions(-) diff --git a/res/css/views/right_panel/_UserInfo.scss b/res/css/views/right_panel/_UserInfo.scss index 9db636ae6b..30c71146bf 100644 --- a/res/css/views/right_panel/_UserInfo.scss +++ b/res/css/views/right_panel/_UserInfo.scss @@ -111,6 +111,7 @@ limitations under the License. // override the calculated sizes so that the letter isn't HUGE font-size: 56px !important; width: 100% !important; + transition: font-size 1s; } .mx_UserInfo_avatar .mx_BaseAvatar.mx_BaseAvatar_image { @@ -270,4 +271,8 @@ limitations under the License. max-width: 72px; margin: 0 auto; } + + .mx_UserInfo_avatar .mx_BaseAvatar_initial { + font-size: 40px !important; // override the other override because here the avatar is smaller + } } diff --git a/res/css/views/right_panel/_VerificationPanel.scss b/res/css/views/right_panel/_VerificationPanel.scss index 84a82c9a5c..75b469cef9 100644 --- a/res/css/views/right_panel/_VerificationPanel.scss +++ b/res/css/views/right_panel/_VerificationPanel.scss @@ -18,4 +18,20 @@ limitations under the License. .mx_VerificationPanel_verified_section .mx_E2EIcon { margin: 0 auto; } + + .mx_VerificationPanel_qrCode { + padding: 4px 4px 0 4px; + background: white; + border-radius: 4px; + width: max-content; + max-width: 100%; + margin: 0 auto; + + canvas { + // override height and width which are set on the element directly + height: auto !important; + width: 100% !important; + max-width: 240px; + } + } } diff --git a/src/components/views/elements/crypto/VerificationQRCode.js b/src/components/views/elements/crypto/VerificationQRCode.js index 1cb5647317..630a06a07c 100644 --- a/src/components/views/elements/crypto/VerificationQRCode.js +++ b/src/components/views/elements/crypto/VerificationQRCode.js @@ -51,6 +51,6 @@ export default class VerificationQRCode extends React.PureComponent { const uri = `https://matrix.to/#/${this.props.keyholderUserId}?${qs.stringify(query)}`; - return ; + return ; } } diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index b911824b4e..c1e84afc22 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -48,22 +48,23 @@ export default class VerificationPanel extends React.PureComponent { [myKeyId, myKeyId], ]; + // TODO: add way to open camera to scan a QR code return

      Verify by scanning

      -

      {_t("Ask %(displayName)s to scan your code, or open your camera to scan theirs:", { +

      {_t("Ask %(displayName)s to scan your code:", { displayName: member.displayName || member.name || member.userId, - }, { - a: t => { t }, })}

      - +
      + +
      diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 6297270540..d4512d785d 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1156,7 +1156,7 @@ "This client does not support end-to-end encryption.": "This client does not support end-to-end encryption.", "Messages in this room are not end-to-end encrypted.": "Messages in this room are not end-to-end encrypted.", "Security": "Security", - "Ask %(displayName)s to scan your code, or open your camera to scan theirs:": "Ask %(displayName)s to scan your code, or open your camera to scan theirs:", + "Ask %(displayName)s to scan your code:": "Ask %(displayName)s to scan your code:", "If you can't scan the code above, verify by comparing unique emoji.": "If you can't scan the code above, verify by comparing unique emoji.", "Verify by emoji": "Verify by emoji", "You've successfully verified %(displayName)s!": "You've successfully verified %(displayName)s!", From db1d3c091e041b607507fdf145cb41c6a92c46f5 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 27 Jan 2020 17:21:31 +0000 Subject: [PATCH 292/906] Error handle the no QR verif case better --- .../views/right_panel/VerificationPanel.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index c1e84afc22..f6a26665d8 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -31,15 +31,22 @@ export default class VerificationPanel extends React.PureComponent { } renderQRPhase() { - const {member, request} = this.props; // type req: VerificationRequest + const {member, request} = this.props; // TODO change the button into a spinner when on click const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); const cli = MatrixClientPeg.get(); const crossSigningInfo = cli.getStoredCrossSigningForUser(request.otherUserId); if (!crossSigningInfo || !request.requestEvent || !request.requestEvent.getId()) { - // TODO handle this error case - return

      request.requestEvent.getId()

      ; + // for whatever reason we can't generate a QR code, offer only SAS Verification + return
      +

      Verify by emoji

      +

      {_t("Verify by comparing unique emoji.")}

      + + + {_t("Verify by emoji")} + +
      ; } const myKeyId = cli.getCrossSigningId(); From ff195381e9f17439fba3c7a2ff79e8587d41eaa6 Mon Sep 17 00:00:00 2001 From: stoically Date: Wed, 22 Jan 2020 16:44:47 +0100 Subject: [PATCH 293/906] Use https for recaptcha for all non-http protocols Signed-off-by: stoically --- src/components/views/auth/CaptchaForm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/auth/CaptchaForm.js b/src/components/views/auth/CaptchaForm.js index 2da837f029..efcc450067 100644 --- a/src/components/views/auth/CaptchaForm.js +++ b/src/components/views/auth/CaptchaForm.js @@ -62,7 +62,7 @@ export default createReactClass({ console.log("Loading recaptcha script..."); window.mx_on_recaptcha_loaded = () => {this._onCaptchaLoaded();}; let protocol = global.location.protocol; - if (protocol === "vector:") { + if (protocol !== "http:") { protocol = "https:"; } const scriptTag = document.createElement('script'); From dbf0c5b4c37f57d1b15597102690ef492f015756 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Mon, 27 Jan 2020 17:14:46 +0000 Subject: [PATCH 294/906] Translated using Weblate (Albanian) Currently translated at 99.7% (2066 of 2073 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sq/ --- src/i18n/strings/sq.json | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index e23bd07015..db687780f4 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -2104,5 +2104,23 @@ "Encryption upgrade available": "Ka të gatshëm përmirësim fshehtëzimi", "Review & verify your new session": "Shqyrtoni & verifikoni sesionin tuaj të ri", "Review": "Shqyrtojeni", - "Verify your other devices easier": "Verifikoni më lehtë pajisjet tuaja të tjera" + "Verify your other devices easier": "Verifikoni më lehtë pajisjet tuaja të tjera", + "Enable message search in encrypted rooms": "Aktivizo kërkim mesazhesh në dhoma të fshehtëzuara", + "Securely cache encrypted messages locally for them to appear in search results, using ": "Ruaj lokalisht në mënyrë të sigurt në fshehtinë mesazhet që të shfaqen në përfundime kërkimi, duke përdorur ", + " to store messages from ": " për të depozituar mesazhe nga ", + "rooms.": "dhoma.", + "Manage": "Administroni", + "Securely cache encrypted messages locally for them to appear in search results.": "Ruaj lokalisht në mënyrë të sigurt në fshehtinë mesazhet që të shfaqen në përfundime kërkimi.", + "Enable": "Aktivizoje", + "Riot is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom Riot Desktop with search components added.": "Riot-it i mungojnë disa përbërës të domosdoshëm për ruajtje lokalisht në mënyrë të sigurt në fshehtinë mesazhe. Nëse do të donit të eksperimentonit me këtë veçori, montoni një Desktop vetjak Riot Desktop me shtim përbërësish kërkimi.", + "Riot can't securely cache encrypted messages locally while running in a web browser. Use Riot Desktop for encrypted messages to appear in search results.": "Riot-i s’mund të ruajë lokalisht në mënyrë të sigurt mesazhe në fshehtinë teksa xhirohet nën shfletues. Që mesazhet e fshehtëzuar të shihen në përfundime kërkimi, përdorni Riot Desktop.", + "Message search": "Kërkim mesazhesh", + "If disabled, messages from encrypted rooms won't appear in search results.": "Në u çaktivizoftë, mesazhet prej dhomash të fshehtëzuara s’do të duken në përfundime kërkimi.", + "Disable": "Çaktivizoje", + "Not currently downloading messages for any room.": "Aktualisht s’po shkarkohen mesazhe për ndonjë dhomë.", + "Downloading mesages for %(currentRoom)s.": "Po shkarkohen mesazhe për %(currentRoom)s.", + "Riot is securely caching encrypted messages locally for them to appear in search results:": "Riot-i po ruan lokalisht në mënyrë të sigurt në fshehtinë mesazhet që të shfaqen në përfundime kërkimi:", + "Space used:": "Hapësirë e përdorur:", + "Indexed messages:": "Mesazhe të indeksuar:", + "Number of rooms:": "Numër dhomash:" } From 68bf646d032b60f13cdf9157b3b7d2f05d7bb8b7 Mon Sep 17 00:00:00 2001 From: Joshua Dietz Date: Mon, 27 Jan 2020 17:45:39 +0000 Subject: [PATCH 295/906] Translated using Weblate (German) Currently translated at 76.5% (1586 of 2073 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 78 ++++++++++++++++++++++++++++++++++++- 1 file changed, 77 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 1e75c59a21..6963fdfa6c 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1585,5 +1585,81 @@ "%(senderName)s placed a voice call.": "%(senderName)s tätigte einen Sprachanruf.", "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s tätigte einen Sprachanruf (Nicht von diesem Browser unterstützt)", "%(senderName)s placed a video call.": "%(senderName)s tätigte einen Videoanruf.", - "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s tätigte einen Videoanruf (Nicht von diesem Browser unterstützt)" + "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s tätigte einen Videoanruf (Nicht von diesem Browser unterstützt)", + "Verify this session": "Sitzung verifizieren", + "Set up encryption": "Verschlüsselung einrichten", + "New Session": "Neue Sitzung", + "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s hat %(addedAddresses)s und %(count)s Adressen zu diesem Raum hinzugefügt", + "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s hat %(removedAddresses)s und %(count)s andere Adressen aus diesem Raum entfernt", + "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s hat %(countRemoved)s entfernt und %(countAdded)s Adressen zu diesem Raum hinzugefügt", + "%(senderName)s turned on end-to-end encryption.": "%(senderName)s hat die Ende-zu-Ende Verschlüsselung aktiviert.", + "%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s hat die Ende-zu-Ende Verschlüsselung aktiviert (unbekannter Algorithmus %(algorithm)s).", + "%(senderName)s updated an invalid ban rule": "%(senderName)s hat eine ungültige Bannregel aktualisiert", + "The message you are trying to send is too large.": "Die Nachricht, die du versuchst zu senden, ist zu lang.", + "a few seconds ago": "vor ein paar Sekunden", + "about a minute ago": "vor etwa einer Minute", + "%(num)s minutes ago": "vor %(num)s Minuten", + "about an hour ago": "vor etwa einer Stunde", + "%(num)s hours ago": "vor %(num)s Stunden", + "about a day ago": "vor etwa einem Tag", + "%(num)s days ago": "vor %(num)s Tagen", + "about a minute from now": "in etwa einer Minute", + "%(num)s minutes from now": "In etwa %(num)s Minuten", + "about an hour from now": "in etwa einer Stunde", + "%(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", + "Enable message search in encrypted rooms": "Nachrichtensuche in verschlüsselten Räumen aktivieren", + "Lock": "Sperren", + "Review & verify your new session": "Überprüfe & verifiziere deine neue Sitzung", + "Later": "Später", + "Review": "Überprüfen", + "Verify your other devices easier": "Verifiziere deine weiteren Geräte einfacher", + "Verify": "Verifizieren", + "Decline (%(counter)s)": "Zurückweisen (%(counter)s)", + "on device": "auf dem Gerät", + "not found": "nicht gefunden", + "rooms.": "Räume.", + "Manage": "Verwalten", + "Securely cache encrypted messages locally for them to appear in search results.": "Speichere verschlüsselte Nachrichten sicher lokal zwischen, sodass sie in Suchergebnissen erscheinen können.", + "Enable": "Aktivieren", + "Connecting to integration manager...": "Verbinden zum 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.", + "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Verbinde dieses Gerät zum Schlüssel Backup, bevor du dich ausloggst, um zu verhindern, dass Verschlüsselungsschlüssel, die sich nur auf dem Gerät befinden, verloren gehen.", + "not stored": "nicht gespeichert", + "Backup has a signature from unknown user with ID %(deviceId)s": "Backup hat eine Signatur von Unbekanntem Nutzer mit ID %(deviceId)s", + "Backup key stored: ": "Backup Schlüssel gespeichert: ", + "Clear notifications": "Benachrichtigungen löschen", + "Disconnect from the identity server and connect to instead?": "Verbindung vom Identitätsserver trennen und stattdessen zu verbinden?", + "The identity server you have chosen does not have any terms of service.": "Der Identitätsserver, den du gewählt hast, hat keine Nutzungsbedingungen.", + "Disconnect identity server": "Verbindung zum Identitätsserver trennen", + "contact the administrators of identity server ": "Administrator des Identitätsservers kontaktieren", + "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.", + "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Du nutzt momentan keinen Identitätsserver. Um von bestehenden Kontakten die du kennst gefunden zu werden und diese zu finden, füge unten einen hinzu.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Nutze einen Integrationsmanager (%(serverName)s) um Bots, Widgets und Sticker Packs zu verwalten.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Verwende einen Integrationsmanager um Bots, Widgets und Sticker Packs 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 Email Adresse und Telefonnummer auffindbar zu machen.", + "Clear cache and reload": "Cache löschen und neu laden", + "Customise your experience with experimental labs features. Learn more.": "Passe deine Erfahrung mit experimentellen Lab Funktionen an. Mehr erfahren.", + "Ignored/Blocked": "Ignoriert/Blockiert", + "Something went wrong. Please try again or view your console for hints.": "Etwas ist schief gelaufen. Bitte versuche es erneut oder sieh für weitere Hinweise in deiner Konsole nach.", + "Error subscribing to list": "Fehler beim Abonnieren der Liste", + "Please verify the room ID or alias and try again.": "Bitte überprüfe die Raum ID oder den Alias und versuche es erneut.", + "Error removing ignored user/server": "Fehler beim Entfernen eines ignorierten Benutzers/Servers", + "Error unsubscribing from list": "Fehler beim Deabonnieren der Liste", + "Please try again or view your console for hints.": "Bitte versuche es erneut oder sieh für weitere Hinweise in deine Konsole.", + "Server rules": "Serverregeln", + "User rules": "Nutzerregeln", + "You have not ignored anyone.": "Du hast niemanden ignoriert.", + "You are currently ignoring:": "Du ignorierst momentan:", + "Unsubscribe": "Deabonnieren", + "View rules": "Regeln betrachten", + "You are currently subscribed to:": "Du abonnierst momentan:", + "⚠ These settings are meant for advanced users.": "⚠ Diese Einstellungen sind für fortgeschrittene Nutzer gedacht." } From 89f110f60a7756f0c27f4e248fc27011b55cd28e Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Mon, 27 Jan 2020 22:27:11 +0000 Subject: [PATCH 296/906] Add separate component for post-auth security flows Instead of twisting `AuthBody`, this adds a new component for the different styling of post-auth security flows. This also makes them fixed width and adjusts padding to match designs. --- res/css/_components.scss | 3 +- .../structures/auth/_CompleteSecurity.scss | 2 +- res/css/views/auth/_AuthBody.scss | 14 ++----- res/css/views/auth/_CompleteSecurityBody.scss | 42 +++++++++++++++++++ .../structures/auth/CompleteSecurity.js | 6 +-- src/components/structures/auth/E2eSetup.js | 6 +-- src/components/views/auth/AuthBody.js | 21 +--------- .../views/auth/CompleteSecurityBody.js | 27 ++++++++++++ 8 files changed, 83 insertions(+), 38 deletions(-) create mode 100644 res/css/views/auth/_CompleteSecurityBody.scss create mode 100644 src/components/views/auth/CompleteSecurityBody.js diff --git a/res/css/_components.scss b/res/css/_components.scss index 07e92bdc7b..a2cfc94c79 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -36,6 +36,7 @@ @import "./views/auth/_AuthHeader.scss"; @import "./views/auth/_AuthHeaderLogo.scss"; @import "./views/auth/_AuthPage.scss"; +@import "./views/auth/_CompleteSecurityBody.scss"; @import "./views/auth/_CountryDropdown.scss"; @import "./views/auth/_InteractiveAuthEntryComponents.scss"; @import "./views/auth/_LanguageSelector.scss"; @@ -148,10 +149,10 @@ @import "./views/rooms/_AuxPanel.scss"; @import "./views/rooms/_BasicMessageComposer.scss"; @import "./views/rooms/_E2EIcon.scss"; -@import "./views/rooms/_InviteOnlyIcon.scss"; @import "./views/rooms/_EditMessageComposer.scss"; @import "./views/rooms/_EntityTile.scss"; @import "./views/rooms/_EventTile.scss"; +@import "./views/rooms/_InviteOnlyIcon.scss"; @import "./views/rooms/_JumpToBottomButton.scss"; @import "./views/rooms/_LinkPreviewWidget.scss"; @import "./views/rooms/_MemberDeviceInfo.scss"; diff --git a/res/css/structures/auth/_CompleteSecurity.scss b/res/css/structures/auth/_CompleteSecurity.scss index c258ce4ec7..2bf51d9574 100644 --- a/res/css/structures/auth/_CompleteSecurity.scss +++ b/res/css/structures/auth/_CompleteSecurity.scss @@ -22,7 +22,7 @@ limitations under the License. .mx_CompleteSecurity_headerIcon { width: 24px; height: 24px; - margin: 0 4px; + margin-right: 4px; position: relative; } diff --git a/res/css/views/auth/_AuthBody.scss b/res/css/views/auth/_AuthBody.scss index 51b9775811..7c5b008535 100644 --- a/res/css/views/auth/_AuthBody.scss +++ b/res/css/views/auth/_AuthBody.scss @@ -1,5 +1,6 @@ /* Copyright 2019 New Vector Ltd +Copyright 2020 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. @@ -15,6 +16,9 @@ limitations under the License. */ .mx_AuthBody { + width: 500px; + font-size: 12px; + color: $authpage-secondary-color; background-color: $authpage-body-bg-color; border-radius: 0 4px 4px 0; padding: 25px 60px; @@ -92,16 +96,6 @@ limitations under the License. } } -.mx_AuthBody_noHeader { - border-radius: 4px; -} - -.mx_AuthBody_loginRegister { - width: 500px; - font-size: 12px; - color: $authpage-secondary-color; -} - .mx_AuthBody_editServerDetails { padding-left: 1em; font-size: 12px; diff --git a/res/css/views/auth/_CompleteSecurityBody.scss b/res/css/views/auth/_CompleteSecurityBody.scss new file mode 100644 index 0000000000..c7860fbe74 --- /dev/null +++ b/res/css/views/auth/_CompleteSecurityBody.scss @@ -0,0 +1,42 @@ +/* +Copyright 2019 New Vector Ltd +Copyright 2020 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. +*/ + +.mx_CompleteSecurityBody { + width: 600px; + color: $authpage-primary-color; + background-color: $authpage-body-bg-color; + border-radius: 4px; + padding: 20px; + box-sizing: border-box; + + h2 { + font-size: 24px; + font-weight: 600; + margin-top: 0; + } + + h3 { + font-size: 14px; + font-weight: 600; + } + + a:link, + a:hover, + a:visited { + @mixin mx_Dialog_link; + } +} diff --git a/src/components/structures/auth/CompleteSecurity.js b/src/components/structures/auth/CompleteSecurity.js index 206cdb743e..29d8207d0a 100644 --- a/src/components/structures/auth/CompleteSecurity.js +++ b/src/components/structures/auth/CompleteSecurity.js @@ -112,7 +112,7 @@ export default class CompleteSecurity extends React.Component { render() { const AuthPage = sdk.getComponent("auth.AuthPage"); - const AuthBody = sdk.getComponent("auth.AuthBody"); + const CompleteSecurityBody = sdk.getComponent("auth.CompleteSecurityBody"); const AccessibleButton = sdk.getComponent("elements.AccessibleButton"); const { @@ -204,7 +204,7 @@ export default class CompleteSecurity extends React.Component { return ( - +

      {icon} {title} @@ -212,7 +212,7 @@ export default class CompleteSecurity extends React.Component {
      {body}
      - + ); } diff --git a/src/components/structures/auth/E2eSetup.js b/src/components/structures/auth/E2eSetup.js index 29b4345761..9b390d24cc 100644 --- a/src/components/structures/auth/E2eSetup.js +++ b/src/components/structures/auth/E2eSetup.js @@ -34,16 +34,16 @@ export default class E2eSetup extends React.Component { render() { const AuthPage = sdk.getComponent("auth.AuthPage"); - const AuthBody = sdk.getComponent("auth.AuthBody"); + const CompleteSecurityBody = sdk.getComponent("auth.CompleteSecurityBody"); return ( - + - + ); } diff --git a/src/components/views/auth/AuthBody.js b/src/components/views/auth/AuthBody.js index b74b7d866a..9a078efb52 100644 --- a/src/components/views/auth/AuthBody.js +++ b/src/components/views/auth/AuthBody.js @@ -17,29 +17,10 @@ limitations under the License. 'use strict'; import React from 'react'; -import PropTypes from 'prop-types'; -import classnames from 'classnames'; export default class AuthBody extends React.PureComponent { - static PropTypes = { - header: PropTypes.bool, - }; - - static defaultProps = { - header: true, - }; - render() { - const classes = { - 'mx_AuthBody': true, - 'mx_AuthBody_noHeader': !this.props.header, - // XXX The login pages all use a smaller fonts size but we don't want this - // for subsequent auth screens like the e2e setup. Doing this a terrible way - // for now. - 'mx_AuthBody_loginRegister': this.props.header, - }; - - return
      + return
      { this.props.children }
      ; } diff --git a/src/components/views/auth/CompleteSecurityBody.js b/src/components/views/auth/CompleteSecurityBody.js new file mode 100644 index 0000000000..d757de9fe0 --- /dev/null +++ b/src/components/views/auth/CompleteSecurityBody.js @@ -0,0 +1,27 @@ +/* +Copyright 2020 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. +*/ + +'use strict'; + +import React from 'react'; + +export default class CompleteSecurityBody extends React.PureComponent { + render() { + return
      + { this.props.children } +
      ; + } +} From 2a1407a531e74eaea8a729cbd66d8f33d9d5f661 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 27 Jan 2020 15:36:12 -0700 Subject: [PATCH 297/906] Add more logging to settings watchers To try and track leaks versus spam. Fixes https://github.com/vector-im/riot-web/issues/12094 (it's not leaking, probably) --- src/settings/SettingsStore.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/settings/SettingsStore.js b/src/settings/SettingsStore.js index 9501bac205..b1d61197a0 100644 --- a/src/settings/SettingsStore.js +++ b/src/settings/SettingsStore.js @@ -145,7 +145,7 @@ export default class SettingsStore { callbackFn(originalSettingName, changedInRoomId, atLevel, newValAtLevel, newValue); }; - console.log(`Starting watcher for ${settingName}@${roomId || ''}`); + console.log(`Starting watcher for ${settingName}@${roomId || ''} as ID ${watcherId}`); SettingsStore._watchers[watcherId] = localizedCallback; defaultWatchManager.watchSetting(settingName, roomId, localizedCallback); @@ -159,8 +159,12 @@ export default class SettingsStore { * to cancel. */ static unwatchSetting(watcherReference) { - if (!SettingsStore._watchers[watcherReference]) return; + if (!SettingsStore._watchers[watcherReference]) { + console.warn(`Ending non-existent watcher ID ${watcherReference}`); + return; + } + console.log(`Ending watcher ID ${watcherReference}`); defaultWatchManager.unwatchSetting(SettingsStore._watchers[watcherReference]); delete SettingsStore._watchers[watcherReference]; } From 7effd22f6b9511ce7242065ddd3485f94078de3f Mon Sep 17 00:00:00 2001 From: catborise Date: Mon, 27 Jan 2020 20:05:38 +0000 Subject: [PATCH 298/906] Translated using Weblate (Turkish) Currently translated at 73.4% (1521 of 2073 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/tr/ --- src/i18n/strings/tr.json | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 257cb27b42..222d2802da 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -106,7 +106,7 @@ "Export": "Dışa Aktar", "Export E2E room keys": "Uçtan uca Oda anahtarlarını Dışa Aktar", "Failed to ban user": "Kullanıcı yasaklama(Ban) başarısız", - "Failed to change password. Is your password correct?": "Şifreniz değiştirilemedi . Şifreniz doğru mu ?", + "Failed to change password. Is your password correct?": "Parola değiştirilemedi . Şifreniz doğru mu ?", "Failed to change power level": "Güç seviyesini değiştirme başarısız oldu", "Failed to fetch avatar URL": "Avatar URL'i alınamadı", "Failed to forget room %(errCode)s": "Oda unutulması başarısız oldu %(errCode)s", @@ -270,7 +270,7 @@ "Start authentication": "Kimlik Doğrulamayı başlatın", "Start Chat": "Sohbet Başlat", "Submit": "Gönder", - "Success": "Başarı", + "Success": "Başarılı", "The phone number entered looks invalid": "Girilen telefon numarası geçersiz görünüyor", "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Sağladığınız imza anahtarı %(userId)s aygıtından %(deviceId)s ile eşleşiyor . Aygıt doğrulanmış olarak işaretlendi.", "This email address is already in use": "Bu e-posta adresi zaten kullanımda", @@ -350,7 +350,7 @@ "You need to be able to invite users to do that.": "Bunu yapmak için kullanıcıları davet etmeye ihtiyacınız var.", "You need to be logged in.": "Oturum açmanız gerekiyor.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "E-posta adresiniz bu Ana Sunucu'da ki Matrix ID'si ile ilişkili gözükmüyor.", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Şifreniz başarıyla değiştirildi . Diğer cihazlara girene kadar onlara bildirim almayacaksınız", + "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Parolanız başarıyla değiştirildi . Diğer cihazlara girene kadar onlara bildirim almayacaksınız", "You seem to be in a call, are you sure you want to quit?": "Bir çağrıda gözüküyorsunuz , çıkmak istediğinizden emin misiniz ?", "You seem to be uploading files, are you sure you want to quit?": "Dosya yüklüyorsunuz gibi görünüyor , çıkmak istediğinizden emin misiniz ?", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Kullanıcıyı sizinle aynı güç seviyesine yükseltirken , bu değişikliği geri alamazsınız.", @@ -588,7 +588,7 @@ "There are advanced notifications which are not shown here": "Burada gösterilmeyen gelişmiş bildirimler var", "The platform you're on": "Bulunduğun platform", "The version of Riot.im": "Riot.im'in sürümü", - "Your language of choice": "Seçtiginiz diliniz", + "Your language of choice": "", "Which officially provided instance you are using, if any": "Hangi resmi destekli örneği(eğer varsa) kullanmaktasınız", "Add Email Address": "E-posta Adresi Ekle", "Add Phone Number": "Telefon Numarası Ekle", @@ -1300,7 +1300,7 @@ "Message removed by %(userId)s": "Mesaj %(userId)s tarafından silindi", "You are still sharing your personal data on the identity server .": "Kimlik sunucusu üzerinde hala kişisel veri paylaşımı yapıyorsunuz.", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Kimlik sunucusundan bağlantıyı kesmeden önce telefon numaranızı ve e-posta adreslerinizi silmenizi tavsiye ederiz.", - "Set a new account password...": "Yeni bir hesap şifresi belirle...", + "Set a new account password...": "Yeni bir hesap parolası belirle...", "Deactivating your account is a permanent action - be careful!": "Hesabınızı pasifleştirmek bir kalıcı eylemdir - dikkat edin!", "Deactivate account": "Hesabı pasifleştir", "For help with using Riot, click here.": "Riot kullanarak yardım etmek için, buraya tıklayın.", @@ -1538,5 +1538,14 @@ "Encrypted messages in one-to-one chats": "Birebir sohbetlerdeki şifrelenmiş mesajlar", "Encrypted messages in group chats": "Grup sohbetlerdeki şifrelenmiş mesajlar", "This is your list of users/servers you have blocked - don't leave the room!": "Bu sizin engellediğiniz kullanıcılar/sunucular listeniz - odadan ayrılmayın!", - "Got It": "Anlaşıldı" + "Got It": "Anlaşıldı", + "Subscribing to a ban list will cause you to join it!": "Bir yasak listesine abonelik ona katılmanıza yol açar!", + "Message search": "Mesaj arama", + "A device's public name is visible to people you communicate with": "Bir cihazın halka açık ismi iletişimde olduğunuz kişilere görünür", + "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Mahremiyet bizim için önemli, bu yüzden hiç bir kişisel ve betimleyici veriyi analizlerimiz için toplamayız.", + "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.": "Uyarı: Bir oda yükseltimi o oda üyelerinin otomatik olarak yeni sürüm odaya göç ettirilmesini sağlamaz. Odanın eski sürümünde yeni sürüm odaya gitmek için bir linki gönderilecektir - yeni odaya katılmak için oda üyeleri bu linke tıklamak zorunda olacaktır.", + "Internal room ID:": "Dahili oda ID:", + "An error occurred changing the user's power level. Ensure you have sufficient permissions and try again.": "Kullanıcının güç düzeyini değiştirirken bir hata oluştu. Yeterli izinlere sahip olduğunuza emin olun ve yeniden deneyin.", + "Select the roles required to change various parts of the room": "Odanın çeşitli bölümlerini değişmek için gerekli rolleri seçiniz", + "Click the link in the email you received to verify and then click continue again.": "Aldığınız e-postaki bağlantıyı tıklayarak doğrulayın ve sonra tekrar tıklayarak devam edin." } From d014c5239be443911d3a3ad0b4650756c9e04a1a Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Mon, 27 Jan 2020 23:14:02 +0000 Subject: [PATCH 299/906] Add new session verification details dialog This gives more info on the session you're about to verify, including device name and ID. Fixes https://github.com/vector-im/riot-web/issues/11977 --- res/css/_components.scss | 1 + .../dialogs/_NewSessionReviewDialog.scss | 37 ++++++++ .../views/dialogs/NewSessionReviewDialog.js | 92 +++++++++++++++++++ .../views/elements/DialogButtons.js | 2 +- .../views/toasts/NewSessionToast.js | 5 +- src/i18n/strings/en_EN.json | 4 + 6 files changed, 138 insertions(+), 3 deletions(-) create mode 100644 res/css/views/dialogs/_NewSessionReviewDialog.scss create mode 100644 src/components/views/dialogs/NewSessionReviewDialog.js diff --git a/res/css/_components.scss b/res/css/_components.scss index 07e92bdc7b..de56ad77bb 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -65,6 +65,7 @@ @import "./views/dialogs/_IncomingSasDialog.scss"; @import "./views/dialogs/_InviteDialog.scss"; @import "./views/dialogs/_MessageEditHistoryDialog.scss"; +@import "./views/dialogs/_NewSessionReviewDialog.scss"; @import "./views/dialogs/_RoomSettingsDialog.scss"; @import "./views/dialogs/_RoomUpgradeDialog.scss"; @import "./views/dialogs/_RoomUpgradeWarningDialog.scss"; diff --git a/res/css/views/dialogs/_NewSessionReviewDialog.scss b/res/css/views/dialogs/_NewSessionReviewDialog.scss new file mode 100644 index 0000000000..7e35fe941e --- /dev/null +++ b/res/css/views/dialogs/_NewSessionReviewDialog.scss @@ -0,0 +1,37 @@ +/* +Copyright 2020 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. +*/ + +.mx_NewSessionReviewDialog_header { + display: flex; + align-items: center; + margin-top: 0; +} + +.mx_NewSessionReviewDialog_headerIcon { + width: 24px; + height: 24px; + margin-right: 4px; + position: relative; +} + +.mx_NewSessionReviewDialog_deviceName { + font-weight: 600; +} + +.mx_NewSessionReviewDialog_deviceID { + font-size: 12px; + color: $notice-secondary-color; +} diff --git a/src/components/views/dialogs/NewSessionReviewDialog.js b/src/components/views/dialogs/NewSessionReviewDialog.js new file mode 100644 index 0000000000..c14f0f5614 --- /dev/null +++ b/src/components/views/dialogs/NewSessionReviewDialog.js @@ -0,0 +1,92 @@ +/* +Copyright 2020 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 React from 'react'; +import PropTypes from 'prop-types'; +import * as sdk from "../../../index"; +import { _t } from '../../../languageHandler'; +import Modal from "../../../Modal"; + +export default class NewSessionReviewDialog extends React.PureComponent { + static propTypes = { + userId: PropTypes.string.isRequired, + device: PropTypes.object.isRequired, + onFinished: PropTypes.func.isRequired, + } + + onCancelClick = () => { + this.props.onFinished(false); + } + + onContinueClick = () => { + const DeviceVerifyDialog = + sdk.getComponent('views.dialogs.DeviceVerifyDialog'); + const { userId, device } = this.props; + Modal.createTrackedDialog('New Session Verification', 'Starting dialog', DeviceVerifyDialog, { + userId, + device, + }, null, /* priority = */ false, /* static = */ true); + } + + render() { + const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); + const DialogButtons = sdk.getComponent("views.elements.DialogButtons"); + + const { device } = this.props; + + const icon = ; + const titleText = _t("New session"); + + const title =

      + {icon} + {titleText} +

      ; + + return ( + +
      +

      {_t( + "Use this session to verify your new one, " + + "granting it access to encrypted messages:", + )}

      +
      +
      + + {device.getDisplayName()} + + ({device.deviceId}) + +
      +
      +

      {_t( + "If you didn’t sign in to this session, " + + "your account may be compromised.", + )}

      + +
      +
      + ); + } +} diff --git a/src/components/views/elements/DialogButtons.js b/src/components/views/elements/DialogButtons.js index ee15bfc3f2..9223b5ade8 100644 --- a/src/components/views/elements/DialogButtons.js +++ b/src/components/views/elements/DialogButtons.js @@ -83,7 +83,7 @@ export default createReactClass({ // primary in the DOM so will get form submissions unless we make it not a submit. type="button" onClick={this._onCancelClick} - className={this.props.cancelButtonClass} + className={this.props.cancelButtonClass} disabled={this.props.disabled} > { this.props.cancelButton || _t("Cancel") } diff --git a/src/components/views/toasts/NewSessionToast.js b/src/components/views/toasts/NewSessionToast.js index 3b60f59131..ed8b15e25f 100644 --- a/src/components/views/toasts/NewSessionToast.js +++ b/src/components/views/toasts/NewSessionToast.js @@ -34,11 +34,12 @@ export default class VerifySessionToast extends React.PureComponent { _onReviewClick = async () => { const cli = MatrixClientPeg.get(); - const DeviceVerifyDialog = sdk.getComponent('views.dialogs.DeviceVerifyDialog'); + const NewSessionReviewDialog = + sdk.getComponent('views.dialogs.NewSessionReviewDialog'); const device = await cli.getStoredDevice(cli.getUserId(), this.props.deviceId); - Modal.createTrackedDialog('New Session Verify', 'Starting dialog', DeviceVerifyDialog, { + Modal.createTrackedDialog('New Session Review', 'Starting dialog', NewSessionReviewDialog, { userId: MatrixClientPeg.get().getUserId(), device, }, null, /* priority = */ false, /* static = */ true); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 23ca730d97..7ccce9e7f6 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1508,6 +1508,10 @@ "Are you sure you want to sign out?": "Are you sure you want to sign out?", "Your homeserver doesn't seem to support this feature.": "Your homeserver doesn't seem to support this feature.", "Message edits": "Message edits", + "New session": "New session", + "Use this session to verify your new one, granting it access to encrypted messages:": "Use this session to verify your new one, granting it access to encrypted messages:", + "If you didn’t sign in to this session, your account may be compromised.": "If you didn’t sign in to this session, your account may be compromised.", + "This wasn't me": "This wasn't me", "If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.": "If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.", "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.", "Report bugs & give feedback": "Report bugs & give feedback", From 23a6b44fe7b615a50b42f234a8ee9e051984778d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Tue, 28 Jan 2020 07:43:25 +0000 Subject: [PATCH 300/906] Translated using Weblate (French) Currently translated at 100.0% (2073 of 2073 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 1ddcc55544..beaf2f9281 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2111,5 +2111,28 @@ "Invite only": "Uniquement sur invitation", "Send a reply…": "Envoyer une réponse…", "Send a message…": "Envoyer un message…", - "If you can't find someone, ask them for their username, share your username (%(userId)s) or profile link.": "Si vous n’arrivez pas à trouver quelqu’un, demandez-lui son nom d’utilisateur, partagez votre nom d’utilisateur (%(userId)s) ou votre lien de profil." + "If you can't find someone, ask them for their username, share your username (%(userId)s) or profile link.": "Si vous n’arrivez pas à trouver quelqu’un, demandez-lui son nom d’utilisateur, partagez votre nom d’utilisateur (%(userId)s) ou votre lien de profil.", + "Verify this session": "Vérifier cette session", + "Encryption upgrade available": "Mise à niveau du chiffrement disponible", + "Enable message search in encrypted rooms": "Activer la recherche de messages dans les salons chiffrés", + "Review & verify your new session": "Examiner et vérifier votre nouvelle session", + "Review": "Examiner", + "Verify your other devices easier": "Vérifiez vos autres appareils facilement", + "Securely cache encrypted messages locally for them to appear in search results, using ": "Mettre en cache les messages chiffrés localement et de manière sécurisée pour qu’ils apparaissent dans les résultats de recherche, en utilisant ", + " to store messages from ": " pour stocker des messages de ", + "rooms.": "salons.", + "Manage": "Gérer", + "Securely cache encrypted messages locally for them to appear in search results.": "Mettre en cache les messages chiffrés localement et de manière sécurisée pour qu’ils apparaissent dans les résultats de recherche.", + "Enable": "Activer", + "Riot is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom Riot Desktop with search components added.": "Il manque quelques composants à Riot pour mettre en cache les messages chiffrés localement de manière sécurisée. Si vous voulez essayer cette fonctionnalité, construisez Riot Desktop vous-même en ajoutant les composants de recherche.", + "Riot can't securely cache encrypted messages locally while running in a web browser. Use Riot Desktop for encrypted messages to appear in search results.": "Riot ne peut pas mettre en cache les messages chiffrés localement de manière sécurisée dans un navigateur web. Utilisez Riot Desktop pour que les messages chiffrés apparaissent dans les résultats de recherche.", + "Message search": "Recherche de message", + "If disabled, messages from encrypted rooms won't appear in search results.": "Si l’option est désactivée, les messages des salons chiffrés n’apparaîtront pas dans les résultats de recherche.", + "Disable": "Désactiver", + "Not currently downloading messages for any room.": "Aucun téléchargement de message en cours pour les salons.", + "Downloading mesages for %(currentRoom)s.": "Téléchargement des messages pour %(currentRoom)s.", + "Riot is securely caching encrypted messages locally for them to appear in search results:": "Riot met en cache les messages chiffrés localement et de manière sécurisée pour qu’ils apparaissent dans les résultats de recherche :", + "Space used:": "Espace utilisé :", + "Indexed messages:": "Messages indexés :", + "Number of rooms:": "Nombre de salons :" } From bdaf9fd06d2ec85985753eda2d076c7f195dd367 Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Tue, 28 Jan 2020 10:05:42 +0000 Subject: [PATCH 301/906] i18n --- src/components/views/settings/BridgeTile.js | 2 +- src/i18n/strings/en_EN.json | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/views/settings/BridgeTile.js b/src/components/views/settings/BridgeTile.js index ee9343ec39..a5672c271c 100644 --- a/src/components/views/settings/BridgeTile.js +++ b/src/components/views/settings/BridgeTile.js @@ -108,7 +108,7 @@ export default class BridgeTile extends React.PureComponent { {creator} {bot}

      - Show { this.state.visible ? "less" : "more" } + { this.state.visible ? _t("Show less") : _t("Show more") }
      ); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 1afa3a33c9..270d964e56 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -524,6 +524,8 @@ "This bridge was provisioned by .": "This bridge was provisioned by .", "This bridge is managed by .": "This bridge is managed by .", "Workspace: %(networkName)s Channel: %(channelName)s": "Workspace: %(networkName)s Channel: %(channelName)s", + "Show less": "Show less", + "Show more": "Show more", "Failed to upload profile picture!": "Failed to upload profile picture!", "Upload new:": "Upload new:", "No display name": "No display name", @@ -1461,7 +1463,6 @@ "Recent Conversations": "Recent Conversations", "Suggestions": "Suggestions", "Recently Direct Messaged": "Recently Direct Messaged", - "Show more": "Show more", "Direct Messages": "Direct Messages", "If you can't find someone, ask them for their username, or share your username (%(userId)s) or profile link.": "If you can't find someone, ask them for their username, or share your username (%(userId)s) or profile link.", "Go": "Go", From 67358e06bf5da0d40f58d00c75b589e70624bc79 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Tue, 28 Jan 2020 10:10:37 +0000 Subject: [PATCH 302/906] Use annotations and imports --- .../views/dialogs/NewSessionReviewDialog.js | 13 ++++++------- src/components/views/toasts/NewSessionToast.js | 8 ++++---- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/components/views/dialogs/NewSessionReviewDialog.js b/src/components/views/dialogs/NewSessionReviewDialog.js index c14f0f5614..2d2bcc8f35 100644 --- a/src/components/views/dialogs/NewSessionReviewDialog.js +++ b/src/components/views/dialogs/NewSessionReviewDialog.js @@ -16,10 +16,14 @@ limitations under the License. import React from 'react'; import PropTypes from 'prop-types'; -import * as sdk from "../../../index"; import { _t } from '../../../languageHandler'; -import Modal from "../../../Modal"; +import Modal from '../../../Modal'; +import { replaceableComponent } from '../../../utils/replaceableComponent'; +import DeviceVerifyDialog from './DeviceVerifyDialog'; +import BaseDialog from './BaseDialog'; +import DialogButtons from '../elements/DialogButtons'; +@replaceableComponent("views.dialogs.NewSessionReviewDialog") export default class NewSessionReviewDialog extends React.PureComponent { static propTypes = { userId: PropTypes.string.isRequired, @@ -32,8 +36,6 @@ export default class NewSessionReviewDialog extends React.PureComponent { } onContinueClick = () => { - const DeviceVerifyDialog = - sdk.getComponent('views.dialogs.DeviceVerifyDialog'); const { userId, device } = this.props; Modal.createTrackedDialog('New Session Verification', 'Starting dialog', DeviceVerifyDialog, { userId, @@ -42,9 +44,6 @@ export default class NewSessionReviewDialog extends React.PureComponent { } render() { - const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); - const DialogButtons = sdk.getComponent("views.elements.DialogButtons"); - const { device } = this.props; const icon = ; diff --git a/src/components/views/toasts/NewSessionToast.js b/src/components/views/toasts/NewSessionToast.js index ed8b15e25f..80564f3494 100644 --- a/src/components/views/toasts/NewSessionToast.js +++ b/src/components/views/toasts/NewSessionToast.js @@ -16,12 +16,15 @@ limitations under the License. import React from 'react'; import PropTypes from 'prop-types'; -import * as sdk from "../../../index"; import { _t } from '../../../languageHandler'; import Modal from "../../../Modal"; import { MatrixClientPeg } from '../../../MatrixClientPeg'; import DeviceListener from '../../../DeviceListener'; +import NewSessionReviewDialog from '../dialogs/NewSessionReviewDialog'; +import FormButton from '../elements/FormButton'; +import { replaceableComponent } from '../../../utils/replaceableComponent'; +@replaceableComponent("views.toasts.VerifySessionToast") export default class VerifySessionToast extends React.PureComponent { static propTypes = { toastKey: PropTypes.string.isRequired, @@ -34,8 +37,6 @@ export default class VerifySessionToast extends React.PureComponent { _onReviewClick = async () => { const cli = MatrixClientPeg.get(); - const NewSessionReviewDialog = - sdk.getComponent('views.dialogs.NewSessionReviewDialog'); const device = await cli.getStoredDevice(cli.getUserId(), this.props.deviceId); @@ -46,7 +47,6 @@ export default class VerifySessionToast extends React.PureComponent { }; render() { - const FormButton = sdk.getComponent("elements.FormButton"); return (
      {_t("Review & verify your new session")}
      From f4842688f880c324acdd1819d2fea05f15415b4b Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 28 Jan 2020 11:10:15 +0000 Subject: [PATCH 303/906] Add reciprocate to verification methods --- src/MatrixClientPeg.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MatrixClientPeg.js b/src/MatrixClientPeg.js index 450bec8e77..53dd63d805 100644 --- a/src/MatrixClientPeg.js +++ b/src/MatrixClientPeg.js @@ -217,7 +217,7 @@ class _MatrixClientPeg { timelineSupport: true, forceTURN: !SettingsStore.getValue('webRtcAllowPeerToPeer', false), fallbackICEServerAllowed: !!SettingsStore.getValue('fallbackICEServerAllowed'), - verificationMethods: [verificationMethods.SAS, verificationMethods.QR_CODE_SHOW], + verificationMethods: [verificationMethods.SAS, verificationMethods.QR_CODE_SHOW, verificationMethods.RECIPROCATE_QR_CODE], unstableClientRelationAggregation: true, identityServer: new IdentityAuthClient(), }; From 657457c14bc1f49da33ddae8a51f9a7d5ac91cba Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 28 Jan 2020 11:13:09 +0000 Subject: [PATCH 304/906] Apply remainder of ux --- .../views/right_panel/_EncryptionInfo.scss | 2 + src/components/views/dialogs/ErrorDialog.js | 10 +- .../views/right_panel/EncryptionPanel.js | 52 ++++++-- .../views/right_panel/VerificationPanel.js | 112 ++++++++++++------ .../views/verification/VerificationShowSas.js | 1 - src/i18n/strings/en_EN.json | 12 +- 6 files changed, 139 insertions(+), 50 deletions(-) diff --git a/res/css/views/right_panel/_EncryptionInfo.scss b/res/css/views/right_panel/_EncryptionInfo.scss index 386eef8e7f..e13b1b6802 100644 --- a/res/css/views/right_panel/_EncryptionInfo.scss +++ b/res/css/views/right_panel/_EncryptionInfo.scss @@ -20,5 +20,7 @@ limitations under the License. margin-top: 25px; margin-bottom: 15px; } + + text-align: center; } } diff --git a/src/components/views/dialogs/ErrorDialog.js b/src/components/views/dialogs/ErrorDialog.js index 15c87990d0..fbc5509457 100644 --- a/src/components/views/dialogs/ErrorDialog.js +++ b/src/components/views/dialogs/ErrorDialog.js @@ -42,6 +42,7 @@ export default createReactClass({ button: PropTypes.string, focus: PropTypes.bool, onFinished: PropTypes.func.isRequired, + headerImage: PropTypes.string, }, getDefaultProps: function() { @@ -56,9 +57,12 @@ export default createReactClass({ render: function() { const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); return ( -
      { this.props.description || _t('An error has occurred.') } diff --git a/src/components/views/right_panel/EncryptionPanel.js b/src/components/views/right_panel/EncryptionPanel.js index dfb145f61d..2c4a896624 100644 --- a/src/components/views/right_panel/EncryptionPanel.js +++ b/src/components/views/right_panel/EncryptionPanel.js @@ -21,19 +21,47 @@ import VerificationPanel from "./VerificationPanel"; import {MatrixClientPeg} from "../../../MatrixClientPeg"; import {ensureDMExists} from "../../../createRoom"; import {useEventEmitter} from "../../../hooks/useEventEmitter"; +import Modal from "../../../Modal"; +import {PHASE_REQUESTED} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; +import * as sdk from "../../../index"; +import {_t} from "../../../languageHandler"; -const EncryptionPanel = ({verificationRequest, member}) => { +// cancellation codes which constitute a key mismatch +const MISMATCHES = ["m.key_mismatch", "m.user_error", "m.mismatched_sas"]; + +const EncryptionPanel = ({verificationRequest, member, onClose}) => { const [request, setRequest] = useState(verificationRequest); useEffect(() => { setRequest(verificationRequest); }, [verificationRequest]); - const [pending, setPending] = useState(false); + const [phase, setPhase] = useState(false); const changeHandler = useCallback(() => { - setPending(request && request.requested); - }, [request]); + // handle transitions -> cancelled for mismatches which fire a modal instead of showing a card + if (request && request.cancelled && MISMATCHES.includes(request.cancellationCode)) { + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + Modal.createTrackedDialog("Verification failed", "insecure", ErrorDialog, { + headerImage: require("../../../../res/img/e2e/warning.svg"), + title: _t("Your messages are not secure"), + description:
      + {_t("One of the following may be compromised:")} +
        +
      • {_t("Your homeserver")}
      • +
      • {_t("The homeserver the user you’re verifying is connected to")}
      • +
      • {_t("Yours, or the other users’ internet connection")}
      • +
      • {_t("Yours, or the other users’ device")}
      • +
      +
      , + onFinished: onClose, + }); + return; // don't update phase here as we will be transitioning away from this view shortly + } + + if (request) { + setPhase(request.phase); + } + }, [onClose, request]); useEventEmitter(request, "change", changeHandler); - useEffect(changeHandler, [changeHandler]); const onStartVerification = useCallback(async () => { const cli = MatrixClientPeg.get(); @@ -42,10 +70,18 @@ const EncryptionPanel = ({verificationRequest, member}) => { setRequest(verificationRequest); }, [member.userId]); - if (!request || pending) { - return ; + const requested = request && phase === PHASE_REQUESTED; + if (!request || requested) { + return ; } else { - return ; + return ( + + ); } }; EncryptionPanel.propTypes = { diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index f6a26665d8..6a5516927a 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -22,6 +22,13 @@ import VerificationQRCode from "../elements/crypto/VerificationQRCode"; import {MatrixClientPeg} from "../../../MatrixClientPeg"; import {_t} from "../../../languageHandler"; import E2EIcon from "../rooms/E2EIcon"; +import { + PHASE_READY, + PHASE_DONE, + PHASE_STARTED, + PHASE_CANCELLED, +} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; +import Spinner from "../elements/Spinner"; export default class VerificationPanel extends React.PureComponent { constructor(props) { @@ -30,11 +37,22 @@ export default class VerificationPanel extends React.PureComponent { this._hasVerifier = !!props.request.verifier; } - renderQRPhase() { + renderQRPhase(pending) { const {member, request} = this.props; // TODO change the button into a spinner when on click const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); + let button; + if (pending) { + button = ; + } else { + button = ( + + {_t("Verify by emoji")} + + ); + } + const cli = MatrixClientPeg.get(); const crossSigningInfo = cli.getStoredCrossSigningForUser(request.otherUserId); if (!crossSigningInfo || !request.requestEvent || !request.requestEvent.getId()) { @@ -43,9 +61,7 @@ export default class VerificationPanel extends React.PureComponent {

      Verify by emoji

      {_t("Verify by comparing unique emoji.")}

      - - {_t("Verify by emoji")} - + { button }
      ; } @@ -78,9 +94,7 @@ export default class VerificationPanel extends React.PureComponent {

      Verify by emoji

      {_t("If you can't scan the code above, verify by comparing unique emoji.")}

      - - {_t("Verify by emoji")} - + { button }
      ; } @@ -97,7 +111,36 @@ export default class VerificationPanel extends React.PureComponent { })}

      Verify all users in a room to ensure it's secure.

      - + + + {_t("Got it")} + +
      + ); + } + + renderCancelledPhase() { + const {member, request} = this.props; + + const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); + + let text; + if (request.cancellationCode === "m.timeout") { + text = _t("Verification timed out. Start verification again from their profile."); + } else if (request.cancellingUserId === request.otherUserId) { + text = _t("%(displayName)s cancelled verification. Start verification again from their profile.", { + displayName: member.displayName || member.name || member.userId, + }); + } else { + text = _t("You cancelled verification. Start verification again from their profile."); + } + + return ( +
      +

      Verification cancelled

      +

      { text }

      + + {_t("Got it")}
      @@ -105,34 +148,32 @@ export default class VerificationPanel extends React.PureComponent { } render() { - const {member, request} = this.props; + const {member} = this.props; const displayName = member.displayName || member.name || member.userId; - if (request.ready) { - return this.renderQRPhase(); - } else if (request.started) { - if (this.state.sasEvent) { - const VerificationShowSas = sdk.getComponent('views.verification.VerificationShowSas'); - // TODO implement "mismatch" vs "cancelled" - return
      -

      Compare emoji

      - -
      ; - } else { - return (

      Setting up SAS verification...

      ); - } - } else if (request.done) { - return this.renderVerifiedPhase(); - } else if (request.cancelled) { - // TODO check if this matches target - // TODO should this be a MODAL? - return

      cancelled by {request.cancellingUserId}!

      ; + switch (this.props.phase) { + case PHASE_READY: + return this.renderQRPhase(); + case PHASE_STARTED: + if (this.state.sasEvent) { + const VerificationShowSas = sdk.getComponent('views.verification.VerificationShowSas'); + return
      +

      Compare emoji

      + +
      ; + } else { + return this.renderQRPhase(true); // keep showing same phase but with a spinner + } + case PHASE_DONE: + return this.renderVerifiedPhase(); + case PHASE_CANCELLED: + return this.renderCancelledPhase(); } return null; } @@ -143,8 +184,6 @@ export default class VerificationPanel extends React.PureComponent { await verifier.verify(); } catch (err) { console.error(err); - } finally { - this.setState({sasEvent: null}); } }; @@ -153,7 +192,7 @@ export default class VerificationPanel extends React.PureComponent { }; _onSasMismatchesClick = () => { - this.state.sasEvent.cancel(); + this.state.sasEvent.mismatch(); }; _onVerifierShowSas = (sasEvent) => { @@ -175,7 +214,6 @@ export default class VerificationPanel extends React.PureComponent { request.verifier.removeListener('show_sas', this._onVerifierShowSas); } this._hasVerifier = !!request.verifier; - this.forceUpdate(); // TODO fix this }; componentDidMount() { diff --git a/src/components/views/verification/VerificationShowSas.js b/src/components/views/verification/VerificationShowSas.js index 693a3769a0..08d0dd422d 100644 --- a/src/components/views/verification/VerificationShowSas.js +++ b/src/components/views/verification/VerificationShowSas.js @@ -16,7 +16,6 @@ limitations under the License. import React from 'react'; import PropTypes from 'prop-types'; -import * as sdk from '../../../index'; import { _t, _td } from '../../../languageHandler'; import {PendingActionSpinner} from "../right_panel/EncryptionInfo"; import AccessibleButton from "../elements/AccessibleButton"; diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index d4512d785d..e926d4ff91 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1139,6 +1139,12 @@ "Verify User": "Verify User", "For extra security, verify this user by checking a one-time code on both of your devices.": "For extra security, verify this user by checking a one-time code on both of your devices.", "For maximum security, do this in person.": "For maximum security, do this in person.", + "Your messages are not secure": "Your messages are not secure", + "One of the following may be compromised:": "One of the following may be compromised:", + "Your homeserver": "Your homeserver", + "The homeserver the user you’re verifying is connected to": "The homeserver the user you’re verifying is connected to", + "Yours, or the other users’ internet connection": "Yours, or the other users’ internet connection", + "Yours, or the other users’ device": "Yours, or the other users’ device", "Members": "Members", "Files": "Files", "Trusted": "Trusted", @@ -1156,11 +1162,15 @@ "This client does not support end-to-end encryption.": "This client does not support end-to-end encryption.", "Messages in this room are not end-to-end encrypted.": "Messages in this room are not end-to-end encrypted.", "Security": "Security", + "Verify by emoji": "Verify by emoji", + "Verify by comparing unique emoji.": "Verify by comparing unique emoji.", "Ask %(displayName)s to scan your code:": "Ask %(displayName)s to scan your code:", "If you can't scan the code above, verify by comparing unique emoji.": "If you can't scan the code above, verify by comparing unique emoji.", - "Verify by emoji": "Verify by emoji", "You've successfully verified %(displayName)s!": "You've successfully verified %(displayName)s!", "Got it": "Got it", + "Verification timed out. Start verification again from their profile.": "Verification timed out. Start verification again from their profile.", + "%(displayName)s cancelled verification. Start verification again from their profile.": "%(displayName)s cancelled verification. Start verification again from their profile.", + "You cancelled verification. Start verification again from their profile.": "You cancelled verification. Start verification again from their profile.", "Sunday": "Sunday", "Monday": "Monday", "Tuesday": "Tuesday", From 785277d4b8d44ad011bb79cf0db2369584ee0730 Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Tue, 28 Jan 2020 11:17:51 +0000 Subject: [PATCH 305/906] Review bits for travis --- .../views/dialogs/_RoomSettingsDialog.scss | 63 ------------------- .../dialogs/_RoomSettingsDialogBridges.scss | 7 ++- src/components/views/settings/BridgeTile.js | 13 ++-- .../settings/tabs/room/BridgeSettingsTab.js | 8 +-- src/i18n/strings/en_EN.json | 3 +- 5 files changed, 14 insertions(+), 80 deletions(-) diff --git a/res/css/views/dialogs/_RoomSettingsDialog.scss b/res/css/views/dialogs/_RoomSettingsDialog.scss index 66c34fd73d..2a4e62f9aa 100644 --- a/res/css/views/dialogs/_RoomSettingsDialog.scss +++ b/res/css/views/dialogs/_RoomSettingsDialog.scss @@ -56,66 +56,3 @@ limitations under the License. mask-position: center; } -.mx_RoomSettingsDialog_BridgeList { - padding: 0; -} - -.mx_RoomSettingsDialog_BridgeList li { - list-style-type: none; - padding: 5px; - margin-bottom: 8px; - border-width: 1px 1px; - border-color: $primary-hairline-color; - border-style: solid; - border-radius: 5px; - - .protocol-icon { - float: left; - margin-right: 5px; - img { - border-radius: 5px; - border-width: 1px 1px; - border-color: $primary-hairline-color; - } - span { - /* Correct letter placement */ - left: auto; - } - } - - h3 { - margin-top: 0; - margin-bottom: 4px; - font-size: 16pt; - } - - .column-icon { - float: left; - } - - .column-data { - display: inline-block; - width: 85%; - } - - .workspace-channel-details { - margin-top: 0; - color: $primary-fg-color; - } - - .metadata { - color: $muted-fg-color; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - margin-bottom: 0; - } - - .metadata.visible { - overflow-y: visible; - text-overflow: ellipsis; - white-space: normal; - } - -} - diff --git a/res/css/views/dialogs/_RoomSettingsDialogBridges.scss b/res/css/views/dialogs/_RoomSettingsDialogBridges.scss index 85d5c76ffc..ab54fb777b 100644 --- a/res/css/views/dialogs/_RoomSettingsDialogBridges.scss +++ b/res/css/views/dialogs/_RoomSettingsDialogBridges.scss @@ -1,5 +1,5 @@ /* -Copyright 2020 New Vector Ltd. +Copyright 2020 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. @@ -21,7 +21,6 @@ limitations under the License. display: inline; margin: 0; padding: 0; - float: left; } } @@ -75,6 +74,10 @@ limitations under the License. .workspace-channel-details { margin-top: 0; color: $primary-fg-color; + + .channel { + margin-left: 15px; + } } .metadata { diff --git a/src/components/views/settings/BridgeTile.js b/src/components/views/settings/BridgeTile.js index a5672c271c..dca23723aa 100644 --- a/src/components/views/settings/BridgeTile.js +++ b/src/components/views/settings/BridgeTile.js @@ -1,5 +1,5 @@ /* -Copyright 2020 New Vector Ltd +Copyright 2020 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. @@ -23,7 +23,8 @@ import Pill from "../elements/Pill"; import {makeUserPermalink} from "../../../utils/permalinks/Permalinks"; import BaseAvatar from "../avatars/BaseAvatar"; import AccessibleButton from "../elements/AccessibleButton"; - +import {replaceableComponent} from "../../../utils/replaceableComponent"; +@replaceableComponent("views.settings.BridgeTile") export default class BridgeTile extends React.PureComponent { static propTypes = { ev: PropTypes.object.isRequired, @@ -88,11 +89,6 @@ export default class BridgeTile extends React.PureComponent { networkIcon =
      ; } - - const workspaceChannelDetails = _t("Workspace: %(networkName)s Channel: %(channelName)s", { - networkName, - channelName, - }); const id = this.props.ev.getId(); const metadataClassname = "metadata" + (this.state.visible ? " visible" : ""); return (
    5. @@ -102,7 +98,8 @@ export default class BridgeTile extends React.PureComponent {

      {protocolName}

      - {workspaceChannelDetails} + {_t("Workspace: %(networkName)s", {networkName})} + {_t("Channel: %(channelName)s", {channelName})}

      {creator} {bot} diff --git a/src/components/views/settings/tabs/room/BridgeSettingsTab.js b/src/components/views/settings/tabs/room/BridgeSettingsTab.js index 65c59ff977..12a72ab8f9 100644 --- a/src/components/views/settings/tabs/room/BridgeSettingsTab.js +++ b/src/components/views/settings/tabs/room/BridgeSettingsTab.js @@ -30,10 +30,6 @@ export default class BridgeSettingsTab extends React.Component { roomId: PropTypes.string.isRequired, }; - constructor() { - super(); - } - _renderBridgeCard(event, room) { const content = event.getContent(); if (!content || !content.channel || !content.protocol) { @@ -70,7 +66,7 @@ export default class BridgeSettingsTab extends React.Component { { // TODO: We don't have this link yet: this will prevent the translators // having to re-translate the string when we do. - a: sub => '', + a: sub => sub, }, )}

        @@ -84,7 +80,7 @@ export default class BridgeSettingsTab extends React.Component { { // TODO: We don't have this link yet: this will prevent the translators // having to re-translate the string when we do. - a: sub => '', + a: sub => sub, }, )}

        ; } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 270d964e56..61dcd90638 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -523,7 +523,8 @@ "Remove": "Remove", "This bridge was provisioned by .": "This bridge was provisioned by .", "This bridge is managed by .": "This bridge is managed by .", - "Workspace: %(networkName)s Channel: %(channelName)s": "Workspace: %(networkName)s Channel: %(channelName)s", + "Workspace: %(networkName)s": "Workspace: %(networkName)s", + "Channel: %(channelName)s": "Channel: %(channelName)s", "Show less": "Show less", "Show more": "Show more", "Failed to upload profile picture!": "Failed to upload profile picture!", From c93b080434670d83511acf01940779d2bbfc5d39 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 28 Jan 2020 11:17:53 +0000 Subject: [PATCH 306/906] delint --- .../views/toasts/VerificationRequestToast.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/components/views/toasts/VerificationRequestToast.js b/src/components/views/toasts/VerificationRequestToast.js index 1015ed0313..342b7d840c 100644 --- a/src/components/views/toasts/VerificationRequestToast.js +++ b/src/components/views/toasts/VerificationRequestToast.js @@ -83,14 +83,15 @@ export default class VerificationRequestToast extends React.PureComponent { }); await request.accept(); const cli = MatrixClientPeg.get(); - dis.dispatch({ - action: "set_right_panel_phase", - phase: RIGHT_PANEL_PHASES.EncryptionPanel, - refireParams: { - verificationRequest: request, - member: cli.getUser(request.otherUserId), - }, - });} else if (request.channel.deviceId && request.verifier) { + dis.dispatch({ + action: "set_right_panel_phase", + phase: RIGHT_PANEL_PHASES.EncryptionPanel, + refireParams: { + verificationRequest: request, + member: cli.getUser(request.otherUserId), + }, + }); + } else if (request.channel.deviceId && request.verifier) { // show to_device verifications in dialog still const IncomingSasDialog = sdk.getComponent("views.dialogs.IncomingSasDialog"); Modal.createTrackedDialog('Incoming Verification', '', IncomingSasDialog, { From 71233a5affbfc8a793cd74e5ae9d6c3fd99dea63 Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Tue, 28 Jan 2020 11:33:51 +0000 Subject: [PATCH 307/906] liney liney come back we need you --- src/components/views/settings/BridgeTile.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/views/settings/BridgeTile.js b/src/components/views/settings/BridgeTile.js index dca23723aa..6902639879 100644 --- a/src/components/views/settings/BridgeTile.js +++ b/src/components/views/settings/BridgeTile.js @@ -24,6 +24,7 @@ import {makeUserPermalink} from "../../../utils/permalinks/Permalinks"; import BaseAvatar from "../avatars/BaseAvatar"; import AccessibleButton from "../elements/AccessibleButton"; import {replaceableComponent} from "../../../utils/replaceableComponent"; + @replaceableComponent("views.settings.BridgeTile") export default class BridgeTile extends React.PureComponent { static propTypes = { From 9cf59ab16d6b08b0ae40a76e300e0b5d0e4612f7 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Tue, 28 Jan 2020 12:30:39 +0000 Subject: [PATCH 308/906] Enable cross-signing lab when key in storage When we're starting a new session and find the cross-signing keys in secret storage, auto-enable the lab for the new session. Fixes https://github.com/vector-im/riot-web/issues/12100 --- src/components/structures/MatrixChat.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 133d74db45..1b4d0e9609 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1834,6 +1834,7 @@ export default createReactClass({ this._accountPassword = null; this._accountPasswordTimer = null; }, 60 * 5 * 1000); + // Wait for the client to be logged in (but not started) // which is enough to ask the server about account data. const loggedIn = new Promise(resolve => { @@ -1867,6 +1868,9 @@ export default createReactClass({ } if (masterKeyInStorage) { + // Auto-enable cross-signing for the new session when key found in + // secret storage. + SettingsStore.setFeatureEnabled("feature_cross_signing", true); this.setStateForNewView({ view: VIEWS.COMPLETE_SECURITY }); } else if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { // This will only work if the feature is set to 'enable' in the config, From 21405b8f25ab36dc1967b53bdd349e872165dd18 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 28 Jan 2020 12:44:14 +0000 Subject: [PATCH 309/906] Fix skinning and babel tagets --- babel.config.js | 4 ++-- src/Skinner.js | 14 ++++++++------ src/utils/replaceableComponent.ts | 8 ++++++-- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/babel.config.js b/babel.config.js index c83be72518..944d9051bb 100644 --- a/babel.config.js +++ b/babel.config.js @@ -4,7 +4,7 @@ module.exports = { ["@babel/preset-env", { "targets": { "browsers": [ - "last 2 versions" + "last 2 Chrome versions", "last 2 Firefox versions", "last 2 Safari versions" ] }, "modules": "commonjs" @@ -14,7 +14,7 @@ module.exports = { "@babel/preset-react" ], "plugins": [ - ["@babel/plugin-proposal-decorators", { "legacy": true }], + ["@babel/plugin-proposal-decorators", {"legacy": false, decoratorsBeforeExport: true}], "@babel/plugin-proposal-export-default-from", "@babel/plugin-proposal-numeric-separator", "@babel/plugin-proposal-class-properties", diff --git a/src/Skinner.js b/src/Skinner.js index 3baecc9fb3..1e121b8808 100644 --- a/src/Skinner.js +++ b/src/Skinner.js @@ -20,6 +20,7 @@ class Skinner { } getComponent(name) { + if (!name) throw new Error(`Invalid component name: ${name}`); if (this.components === null) { throw new Error( "Attempted to get a component before a skin has been loaded."+ @@ -43,12 +44,6 @@ class Skinner { // Check the skin first let comp = doLookup(this.components); - // If that failed, check against our own components - if (!comp) { - // Lazily load our own components because they might end up calling .getComponent() - comp = doLookup(require("./component-index").components); - } - // Just return nothing instead of erroring - the consumer should be smart enough to // handle this at this point. if (!comp) { @@ -75,6 +70,13 @@ class Skinner { const comp = skinObject.components[compKeys[i]]; this.addComponent(compKeys[i], comp); } + + // Now that we have a skin, load our components too + const idx = require("./component-index"); + if (!idx || !idx.components) throw new Error("Invalid react-sdk component index"); + for (const c in idx.components) { + if (!this.components[c]) this.components[c] = idx.components[c]; + } } addComponent(name, comp) { diff --git a/src/utils/replaceableComponent.ts b/src/utils/replaceableComponent.ts index 9f617b27f3..92272e533c 100644 --- a/src/utils/replaceableComponent.ts +++ b/src/utils/replaceableComponent.ts @@ -32,9 +32,13 @@ import * as sdk from '../index'; * with a skinned version. If no skinned version is available, this component * will be used. */ -export function replaceableComponent(name: string, origComponent: React.Component) { +export function replaceableComponent(name: string) { // Decorators return a function to override the class (origComponent). This // ultimately assumes that `getComponent()` won't throw an error and instead // return a falsey value like `null` when the skin doesn't have a component. - return () => sdk.getComponent(name) || origComponent; + return (origComponent) => { + const c = sdk.getComponent(name) || origComponent; + c.kind = "class"; // appeases babel + return c; + }; } From d0c28adfb1a13a54e78a7b9c825f824a784db28c Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 28 Jan 2020 12:53:37 +0000 Subject: [PATCH 310/906] Appease the linter --- src/Skinner.js | 2 +- src/utils/replaceableComponent.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Skinner.js b/src/Skinner.js index 1e121b8808..87c5a7be7f 100644 --- a/src/Skinner.js +++ b/src/Skinner.js @@ -42,7 +42,7 @@ class Skinner { }; // Check the skin first - let comp = doLookup(this.components); + const comp = doLookup(this.components); // Just return nothing instead of erroring - the consumer should be smart enough to // handle this at this point. diff --git a/src/utils/replaceableComponent.ts b/src/utils/replaceableComponent.ts index 92272e533c..281ff4c1ac 100644 --- a/src/utils/replaceableComponent.ts +++ b/src/utils/replaceableComponent.ts @@ -32,7 +32,7 @@ import * as sdk from '../index'; * with a skinned version. If no skinned version is available, this component * will be used. */ -export function replaceableComponent(name: string) { +export function replaceableComponent(name: string) { // Decorators return a function to override the class (origComponent). This // ultimately assumes that `getComponent()` won't throw an error and instead // return a falsey value like `null` when the skin doesn't have a component. From 0b7f23fa5491a97b598c4d94881108893520b030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 28 Jan 2020 15:06:43 +0100 Subject: [PATCH 311/906] EventIndex: Improve the documentation a bit. --- src/indexing/BaseEventIndexManager.js | 4 +- src/indexing/EventIndex.js | 131 +++++++++++++++++++++----- 2 files changed, 107 insertions(+), 28 deletions(-) diff --git a/src/indexing/BaseEventIndexManager.js b/src/indexing/BaseEventIndexManager.js index 8ebaddc3ab..7a3b583088 100644 --- a/src/indexing/BaseEventIndexManager.js +++ b/src/indexing/BaseEventIndexManager.js @@ -153,8 +153,8 @@ export default class BaseEventIndexManager { /** * Search the event index using the given term for matching events. * - * @param {SearchArgs} searchArgs The search configuration sets what should - * be searched for and what should be contained in the search result. + * @param {SearchArgs} searchArgs The search configuration for the search, + * sets the search term and determines the search result contents. * * @return {Promise<[SearchResult]>} A promise that will resolve to an array * of search results once the search is done. diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 9628920cd7..5d40267fcd 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -51,6 +51,9 @@ export default class EventIndex extends EventEmitter { this.registerListeners(); } + /** + * Register event listeners that are necessary for the event index to work. + */ registerListeners() { const client = MatrixClientPeg.get(); @@ -60,6 +63,9 @@ export default class EventIndex extends EventEmitter { client.on('Room.timelineReset', this.onTimelineReset); } + /** + * Remove the event index specific event listeners. + */ removeListeners() { const client = MatrixClientPeg.get(); if (client === null) return; @@ -116,6 +122,15 @@ export default class EventIndex extends EventEmitter { })); } + /** + * The sync event listener. + * + * The listener has two cases: + * - First sync after start up, check if the index is empty, add + * initial checkpoints, if so. Start the crawler background task. + * - Every other sync, tell the event index to commit all the queued up + * live events + */ onSync = async (state, prevState, data) => { const indexManager = PlatformPeg.get().getEventIndexingManager(); @@ -139,6 +154,14 @@ export default class EventIndex extends EventEmitter { } } + /** + * The Room.timeline listener. + * + * This listener waits for live events in encrypted rooms, if they are + * decrypted or unencrypted we queue them to be added to the index, + * otherwise we save their event id and wait for them in the Event.decrypted + * listener. + */ onRoomTimeline = async (ev, room, toStartOfTimeline, removed, data) => { // We only index encrypted rooms locally. if (!MatrixClientPeg.get().isRoomEncrypted(room.roomId)) return; @@ -162,6 +185,12 @@ export default class EventIndex extends EventEmitter { } } + /** + * The Event.decrypted listener. + * + * Checks if the event was marked for addition in the Room.timeline + * listener, if so queues it up to be added to the index. + */ onEventDecrypted = async (ev, err) => { const eventId = ev.getId(); @@ -171,6 +200,41 @@ export default class EventIndex extends EventEmitter { await this.addLiveEventToIndex(ev); } + /** + * The Room.timelineReset listener. + * + * Listens for timeline resets that are caused by a limited timeline to + * re-add checkpoints for rooms that need to be crawled again. + */ + onTimelineReset = async (room, timelineSet, resetAllTimelines) => { + if (room === null) return; + + const indexManager = PlatformPeg.get().getEventIndexingManager(); + if (!MatrixClientPeg.get().isRoomEncrypted(room.roomId)) return; + + const timeline = room.getLiveTimeline(); + const token = timeline.getPaginationToken("b"); + + const backwardsCheckpoint = { + roomId: room.roomId, + token: token, + fullCrawl: false, + direction: "b", + }; + + console.log("EventIndex: Added checkpoint because of a limited timeline", + backwardsCheckpoint); + + await indexManager.addCrawlerCheckpoint(backwardsCheckpoint); + + this.crawlerCheckpoints.push(backwardsCheckpoint); + } + + /** + * Queue up live events to be added to the event index. + * + * @param {MatrixEvent} ev The event that should be added to the index. + */ async addLiveEventToIndex(ev) { const indexManager = PlatformPeg.get().getEventIndexingManager(); @@ -190,10 +254,24 @@ export default class EventIndex extends EventEmitter { indexManager.addEventToIndex(e, profile); } + /** + * Emmit that the crawler has changed the checkpoint that it's currently + * handling. + */ emitNewCheckpoint() { this.emit("changedCheckpoint", this.currentRoom()); } + /** + * The main crawler loop. + * + * Goes through crawlerCheckpoints and fetches events from the server to be + * added to the EventIndex. + * + * If a /room/{roomId}/messages request doesn't contain any events, stop the + * crawl, otherwise create a new checkpoint and push it to the + * crawlerCheckpoints queue so we go through them in a round-robin way. + */ async crawlerFunc() { let cancelled = false; @@ -328,8 +406,6 @@ export default class EventIndex extends EventEmitter { ].indexOf(value.getType()) >= 0 && !value.isRedacted() && !value.isDecryptionFailure() ); - // TODO do we need to check if the event has all the valid - // attributes? }; // TODO if there are no events at this point we're missing a lot @@ -394,40 +470,28 @@ export default class EventIndex extends EventEmitter { console.log("EventIndex: Stopping crawler function"); } - onTimelineReset = async (room, timelineSet, resetAllTimelines) => { - if (room === null) return; - - const indexManager = PlatformPeg.get().getEventIndexingManager(); - if (!MatrixClientPeg.get().isRoomEncrypted(room.roomId)) return; - - const timeline = room.getLiveTimeline(); - const token = timeline.getPaginationToken("b"); - - const backwardsCheckpoint = { - roomId: room.roomId, - token: token, - fullCrawl: false, - direction: "b", - }; - - console.log("EventIndex: Added checkpoint because of a limited timeline", - backwardsCheckpoint); - - await indexManager.addCrawlerCheckpoint(backwardsCheckpoint); - - this.crawlerCheckpoints.push(backwardsCheckpoint); - } - + /** + * Start the crawler background task. + */ startCrawler() { if (this._crawler !== null) return; this.crawlerFunc(); } + /** + * Stop the crawler background task. + */ stopCrawler() { if (this._crawler === null) return; this._crawler.cancel(); } + /** + * Close the event index. + * + * This removes all the MatrixClient event listeners, stops the crawler + * task, and closes the index. + */ async close() { const indexManager = PlatformPeg.get().getEventIndexingManager(); this.removeListeners(); @@ -435,6 +499,15 @@ export default class EventIndex extends EventEmitter { return indexManager.closeEventIndex(); } + /** + * Search the event index using the given term for matching events. + * + * @param {SearchArgs} searchArgs The search configuration for the search, + * sets the search term and determines the search result contents. + * + * @return {Promise<[SearchResult]>} A promise that will resolve to an array + * of search results once the search is done. + */ async search(searchArgs) { const indexManager = PlatformPeg.get().getEventIndexingManager(); return indexManager.searchEventIndex(searchArgs); @@ -634,6 +707,12 @@ export default class EventIndex extends EventEmitter { return paginationPromise; } + /** + * Get statistical information of the index. + * + * @return {Promise} A promise that will resolve to the index + * statistics. + */ async getStats() { const indexManager = PlatformPeg.get().getEventIndexingManager(); return indexManager.getStats(); From 948ec203c63856863661256f0ea9bfa60455c4c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 28 Jan 2020 15:07:29 +0100 Subject: [PATCH 312/906] BaseEventIndexManager: Fix the type hints for the empty promises. --- src/indexing/BaseEventIndexManager.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/indexing/BaseEventIndexManager.js b/src/indexing/BaseEventIndexManager.js index 7a3b583088..66904f9264 100644 --- a/src/indexing/BaseEventIndexManager.js +++ b/src/indexing/BaseEventIndexManager.js @@ -105,7 +105,7 @@ export default class BaseEventIndexManager { * @return {Promise} A promise that will resolve when the event index is * initialized. */ - async initEventIndex(): Promise<> { + async initEventIndex(): Promise { throw new Error("Unimplemented"); } @@ -146,7 +146,7 @@ export default class BaseEventIndexManager { * @return {Promise} A promise that will resolve once the queued up events * were added to the index. */ - async commitLiveEvents(): Promise<> { + async commitLiveEvents(): Promise { throw new Error("Unimplemented"); } @@ -197,7 +197,7 @@ export default class BaseEventIndexManager { * @return {Promise} A promise that will resolve once the checkpoint has * been stored. */ - async addCrawlerCheckpoint(checkpoint: CrawlerCheckpoint): Promise<> { + async addCrawlerCheckpoint(checkpoint: CrawlerCheckpoint): Promise { throw new Error("Unimplemented"); } @@ -210,7 +210,7 @@ export default class BaseEventIndexManager { * @return {Promise} A promise that will resolve once the checkpoint has * been removed. */ - async removeCrawlerCheckpoint(checkpoint: CrawlerCheckpoint): Promise<> { + async removeCrawlerCheckpoint(checkpoint: CrawlerCheckpoint): Promise { throw new Error("Unimplemented"); } @@ -250,7 +250,7 @@ export default class BaseEventIndexManager { * @return {Promise} A promise that will resolve once the event index has * been closed. */ - async closeEventIndex(): Promise<> { + async closeEventIndex(): Promise { throw new Error("Unimplemented"); } @@ -260,7 +260,7 @@ export default class BaseEventIndexManager { * @return {Promise} A promise that will resolve once the event index has * been deleted. */ - async deleteEventIndex(): Promise<> { + async deleteEventIndex(): Promise { throw new Error("Unimplemented"); } } From a4778cc7e3371f12c32ec991a684c681911e0d1e Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 28 Jan 2020 14:18:12 +0000 Subject: [PATCH 313/906] Remove legacy --- babel.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/babel.config.js b/babel.config.js index 944d9051bb..333e5301af 100644 --- a/babel.config.js +++ b/babel.config.js @@ -14,7 +14,7 @@ module.exports = { "@babel/preset-react" ], "plugins": [ - ["@babel/plugin-proposal-decorators", {"legacy": false, decoratorsBeforeExport: true}], + ["@babel/plugin-proposal-decorators", {decoratorsBeforeExport: true}], "@babel/plugin-proposal-export-default-from", "@babel/plugin-proposal-numeric-separator", "@babel/plugin-proposal-class-properties", From 894568bf7aff3578970e6d577d28a14c19d2bce2 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 28 Jan 2020 14:19:06 +0000 Subject: [PATCH 314/906] Stop using deprecated stuff --- babel.config.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/babel.config.js b/babel.config.js index 333e5301af..3c0c3fcb85 100644 --- a/babel.config.js +++ b/babel.config.js @@ -2,12 +2,9 @@ module.exports = { "sourceMaps": "inline", "presets": [ ["@babel/preset-env", { - "targets": { - "browsers": [ - "last 2 Chrome versions", "last 2 Firefox versions", "last 2 Safari versions" - ] - }, - "modules": "commonjs" + "targets": [ + "last 2 Chrome versions", "last 2 Firefox versions", "last 2 Safari versions" + ], }], "@babel/preset-typescript", "@babel/preset-flow", From 9821e25e0b8aa5b4845897221af99261c1bf0418 Mon Sep 17 00:00:00 2001 From: Markus Stange Date: Tue, 28 Jan 2020 15:12:07 +0100 Subject: [PATCH 315/906] Tweak styling of unread indicator circle. This makes the element symmetric and reduces the size of the hit target. With the previous styling, the mid-circle glyph was sometimes offset from the center. Furthermore, the large font size increased the hit box of the ::after element, eating into the scroll up arrow button's hit target. It might be a good idea to give the ::after element pointer-events:none so that the scroll up button is clickable in its entirety. Signed-off-by: Markus Stange --- res/css/views/rooms/_TopUnreadMessagesBar.scss | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/res/css/views/rooms/_TopUnreadMessagesBar.scss b/res/css/views/rooms/_TopUnreadMessagesBar.scss index 77f19dac1c..505af9691d 100644 --- a/res/css/views/rooms/_TopUnreadMessagesBar.scss +++ b/res/css/views/rooms/_TopUnreadMessagesBar.scss @@ -25,19 +25,16 @@ limitations under the License. } .mx_TopUnreadMessagesBar::after { - content: "·"; + content: ""; position: absolute; top: -8px; left: 11px; - width: 16px; - height: 16px; + width: 4px; + height: 4px; border-radius: 16px; - font-weight: 600; - font-size: 30px; - line-height: 14px; - text-align: center; - color: $secondary-accent-color; - background-color: $accent-color; + overflow: hidden; + background-color: $secondary-accent-color; + border: 6px solid $accent-color; } .mx_TopUnreadMessagesBar_scrollUp { From 85bcad0ea0e0a667de343efa81dac64e63c2cf85 Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Tue, 28 Jan 2020 14:42:58 +0000 Subject: [PATCH 316/906] Styling for Nad --- .../dialogs/_RoomSettingsDialogBridges.scss | 100 ++++++++++-------- src/components/views/settings/BridgeTile.js | 2 +- .../settings/tabs/room/BridgeSettingsTab.js | 6 +- 3 files changed, 63 insertions(+), 45 deletions(-) diff --git a/res/css/views/dialogs/_RoomSettingsDialogBridges.scss b/res/css/views/dialogs/_RoomSettingsDialogBridges.scss index ab54fb777b..d77e019cbf 100644 --- a/res/css/views/dialogs/_RoomSettingsDialogBridges.scss +++ b/res/css/views/dialogs/_RoomSettingsDialogBridges.scss @@ -33,64 +33,80 @@ limitations under the License. border-style: solid; border-radius: 5px; - .protocol-icon { - float: left; - margin-right: 5px; - img { - border-radius: 5px; - border-width: 1px 1px; - border-color: $primary-hairline-color; - } - span { - /* Correct letter placement */ - left: auto; - } - } - - h3 { - margin-top: 0; - margin-bottom: 4px; - font-size: 16pt; - color: $primary-fg-color; - } - .column-icon { float: left; padding-right: 10px; + * { + border-radius: 5px; + border: 1px solid $input-darker-bg-color; + } + .noProtocolIcon { width: 48px; height: 48px; - background: $settings-profile-placeholder-bg-color; + background: $input-darker-bg-color; border-radius: 5px; } + + .protocol-icon { + float: left; + margin-right: 5px; + img { + border-radius: 5px; + border-width: 1px 1px; + border-color: $primary-hairline-color; + } + span { + /* Correct letter placement */ + left: auto; + } + } } .column-data { display: inline-block; width: 85%; - } - .workspace-channel-details { - margin-top: 0; - color: $primary-fg-color; + > h3 { + margin-top: 0px; + margin-bottom: 0px; + font-size: 16pt; + color: $primary-fg-color; + } - .channel { - margin-left: 15px; + > * { + margin-top: 4px; + margin-bottom: 0; + } + + .workspace-channel-details { + color: $primary-fg-color; + font-weight: 600; + + .channel { + margin-left: 5px; + } + } + + .showMore { + display: block; + text-align: left; + margin-top: 10px; + } + + .metadata { + color: $muted-fg-color; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin-bottom: 0; + } + + .metadata.visible { + overflow-y: visible; + text-overflow: ellipsis; + white-space: normal; } } - - .metadata { - color: $muted-fg-color; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - margin-bottom: 0; - } - - .metadata.visible { - overflow-y: visible; - text-overflow: ellipsis; - white-space: normal; - } } diff --git a/src/components/views/settings/BridgeTile.js b/src/components/views/settings/BridgeTile.js index 6902639879..1759c0f58d 100644 --- a/src/components/views/settings/BridgeTile.js +++ b/src/components/views/settings/BridgeTile.js @@ -105,7 +105,7 @@ export default class BridgeTile extends React.PureComponent {

        {creator} {bot}

        - + { this.state.visible ? _t("Show less") : _t("Show more") }
      diff --git a/src/components/views/settings/tabs/room/BridgeSettingsTab.js b/src/components/views/settings/tabs/room/BridgeSettingsTab.js index 12a72ab8f9..d66732de55 100644 --- a/src/components/views/settings/tabs/room/BridgeSettingsTab.js +++ b/src/components/views/settings/tabs/room/BridgeSettingsTab.js @@ -25,6 +25,8 @@ const BRIDGE_EVENT_TYPES = [ // m.bridge ]; +const BRIDGES_LINK = "https://matrix.org/bridges/"; + export default class BridgeSettingsTab extends React.Component { static propTypes = { roomId: PropTypes.string.isRequired, @@ -66,7 +68,7 @@ export default class BridgeSettingsTab extends React.Component { { // TODO: We don't have this link yet: this will prevent the translators // having to re-translate the string when we do. - a: sub => sub, + a: sub => {sub}, }, )}

        @@ -80,7 +82,7 @@ export default class BridgeSettingsTab extends React.Component { { // TODO: We don't have this link yet: this will prevent the translators // having to re-translate the string when we do. - a: sub => sub, + a: sub => {sub}, }, )}

        ; } From 5cabfb63a43a62e3a28c61f926bba32c312a8be3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 28 Jan 2020 16:13:56 +0100 Subject: [PATCH 317/906] EventIndex: Don't mark the event listener method docs as jsdoc comments. --- src/indexing/EventIndex.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/indexing/EventIndex.js b/src/indexing/EventIndex.js index 5d40267fcd..e1ec0d1d1c 100644 --- a/src/indexing/EventIndex.js +++ b/src/indexing/EventIndex.js @@ -122,7 +122,7 @@ export default class EventIndex extends EventEmitter { })); } - /** + /* * The sync event listener. * * The listener has two cases: @@ -154,7 +154,7 @@ export default class EventIndex extends EventEmitter { } } - /** + /* * The Room.timeline listener. * * This listener waits for live events in encrypted rooms, if they are @@ -185,7 +185,7 @@ export default class EventIndex extends EventEmitter { } } - /** + /* * The Event.decrypted listener. * * Checks if the event was marked for addition in the Room.timeline @@ -200,7 +200,7 @@ export default class EventIndex extends EventEmitter { await this.addLiveEventToIndex(ev); } - /** + /* * The Room.timelineReset listener. * * Listens for timeline resets that are caused by a limited timeline to From bfaa9d56fbf368eb3ffb4c985794633fd8014833 Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Tue, 28 Jan 2020 16:05:27 +0000 Subject: [PATCH 318/906] prefixes --- res/css/views/dialogs/_RoomSettingsDialogBridges.scss | 2 +- src/components/views/settings/BridgeTile.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/res/css/views/dialogs/_RoomSettingsDialogBridges.scss b/res/css/views/dialogs/_RoomSettingsDialogBridges.scss index d77e019cbf..a1793cc75e 100644 --- a/res/css/views/dialogs/_RoomSettingsDialogBridges.scss +++ b/res/css/views/dialogs/_RoomSettingsDialogBridges.scss @@ -89,7 +89,7 @@ limitations under the License. } } - .showMore { + .mx_showMore { display: block; text-align: left; margin-top: 10px; diff --git a/src/components/views/settings/BridgeTile.js b/src/components/views/settings/BridgeTile.js index 1759c0f58d..5b74e44c9e 100644 --- a/src/components/views/settings/BridgeTile.js +++ b/src/components/views/settings/BridgeTile.js @@ -105,7 +105,7 @@ export default class BridgeTile extends React.PureComponent {

        {creator} {bot}

        - + { this.state.visible ? _t("Show less") : _t("Show more") }
    6. From ab8fe80d6b6aa6f09093f2bdf83a975cdfc26d00 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Tue, 28 Jan 2020 16:11:15 +0000 Subject: [PATCH 319/906] Translated using Weblate (Hungarian) Currently translated at 98.6% (2048 of 2077 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index d2b877a8de..fe6f1d504e 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -2106,5 +2106,9 @@ "Upgrade your encryption": "Titkosításod fejlesztése", "Set up encryption": "Titkosítás beállítása", "Encryption upgraded": "Titkosítás fejlesztve", - "Encryption setup complete": "Titkosítás beállítása kész" + "Encryption setup complete": "Titkosítás beállítása kész", + "Verify this session": "Munkamenet ellenőrzése", + "Encryption upgrade available": "A titkosítás fejlesztése elérhető", + "%(senderName)s turned on end-to-end encryption.": "%(senderName)s bekapcsolta a végpontok közötti titkosítást.", + "%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s bekapcsolta a végpontok közötti titkosítást (ismeretlen algoritmus: %(algorithm)s)." } From abfa593791975e48440f32cdb1bbff6f0491dd88 Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 28 Jan 2020 16:36:07 +0000 Subject: [PATCH 320/906] Make the 'encryption upgrade' flow better Fixes https://github.com/vector-im/riot-web/issues/12086 --- .../CreateSecretStorageDialog.js | 92 ++++++++++--------- .../keybackup/RestoreKeyBackupDialog.js | 2 +- src/i18n/strings/en_EN.json | 3 +- 3 files changed, 51 insertions(+), 46 deletions(-) diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 0867cae6f4..69dd13f46e 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -25,15 +25,14 @@ import { _t } from '../../../../languageHandler'; import Modal from '../../../../Modal'; const PHASE_LOADING = 0; -const PHASE_RESTORE_KEY_BACKUP = 1; -const PHASE_MIGRATE = 2; -const PHASE_PASSPHRASE = 3; -const PHASE_PASSPHRASE_CONFIRM = 4; -const PHASE_SHOWKEY = 5; -const PHASE_KEEPITSAFE = 6; -const PHASE_STORING = 7; -const PHASE_DONE = 8; -const PHASE_OPTOUT_CONFIRM = 9; +const PHASE_MIGRATE = 1; +const PHASE_PASSPHRASE = 2; +const PHASE_PASSPHRASE_CONFIRM = 3; +const PHASE_SHOWKEY = 4; +const PHASE_KEEPITSAFE = 5; +const PHASE_STORING = 6; +const PHASE_DONE = 7; +const PHASE_OPTOUT_CONFIRM = 8; const PASSWORD_MIN_SCORE = 4; // So secure, many characters, much complex, wow, etc, etc. const PASSPHRASE_FEEDBACK_DELAY = 500; // How long after keystroke to offer passphrase feedback, ms. @@ -58,7 +57,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { accountPassword: PropTypes.string, }; - defaultProps = { + static defaultProps = { hasCancel: true, }; @@ -110,9 +109,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { MatrixClientPeg.get().isCryptoEnabled() && await MatrixClientPeg.get().isKeyBackupTrusted(backupInfo) ); - const phase = backupInfo ? - (backupSigStatus.usable ? PHASE_MIGRATE : PHASE_RESTORE_KEY_BACKUP) : - PHASE_PASSPHRASE; + const phase = backupInfo ? PHASE_MIGRATE : PHASE_PASSPHRASE; this.setState({ phase, @@ -151,9 +148,18 @@ export default class CreateSecretStorageDialog extends React.PureComponent { this._recoveryKeyNode = n; } + _onSkipClick = () => { + // TODO: add confirmation + this.props.onFinished(false); + } + _onMigrateFormSubmit = (e) => { e.preventDefault(); - this._bootstrapSecretStorage(); + if (this.state.backupSigStatus.usable) { + this._bootstrapSecretStorage(); + } else { + this._restoreBackup(); + } } _onCopyClick = () => { @@ -228,6 +234,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { } catch (e) { if (this.state.canUploadKeysWithPasswordOnly && e.httpStatus === 401 && e.data.flows) { this.setState({ + accountPassword: '', accountPasswordCorrect: false, phase: PHASE_MIGRATE, }); @@ -246,12 +253,22 @@ export default class CreateSecretStorageDialog extends React.PureComponent { this.props.onFinished(true); } - _onRestoreKeyBackupClick = () => { + _restoreBackup = async () => { const RestoreKeyBackupDialog = sdk.getComponent('dialogs.keybackup.RestoreKeyBackupDialog'); - Modal.createTrackedDialog( + const { finished } = Modal.createTrackedDialog( 'Restore Backup', '', RestoreKeyBackupDialog, {showSummary: false}, null, /* priority = */ false, /* static = */ true, ); + + await finished; + await this._fetchBackupInfo(); + if ( + this.state.backupSigStatus.usable && + this.state.canUploadKeysWithPasswordOnly && + this.state.accountPassword + ) { + this._bootstrapSecretStorage(); + } } _onOptOutClick = () => { @@ -367,23 +384,6 @@ export default class CreateSecretStorageDialog extends React.PureComponent { }); } - _renderPhaseRestoreKeyBackup() { - const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); - return
      -

      {_t( - "Key Backup is enabled on your account but has not been set " + - "up from this session. To set up secret storage, " + - "restore your key backup.", - )}

      - - -
      ; - } - _renderPhaseMigrate() { // TODO: This is a temporary screen so people who have the labs flag turned on and // click the button are aware they're making a change to their account. @@ -392,9 +392,16 @@ export default class CreateSecretStorageDialog extends React.PureComponent { // https://github.com/vector-im/riot-web/issues/11696 const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); const Field = sdk.getComponent('views.elements.Field'); + const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); let authPrompt; - if (this.state.canUploadKeysWithPasswordOnly) { + let nextCaption = _t("Next"); + if (!this.state.backupSigStatus.usable) { + authPrompt =
      +
      {_t("Restore your key backup to upgrade your encryption")}
      +
      ; + nextCaption = _t("Restore"); + } else if (this.state.canUploadKeysWithPasswordOnly) { authPrompt =
      {_t("Enter your account password to confirm the upgrade:")}
      {authPrompt}
      - + > + + ; } @@ -678,8 +688,6 @@ export default class CreateSecretStorageDialog extends React.PureComponent { _titleForPhase(phase) { switch (phase) { - case PHASE_RESTORE_KEY_BACKUP: - return _t('Restore your Key Backup'); case PHASE_MIGRATE: return _t('Upgrade your encryption'); case PHASE_PASSPHRASE: @@ -722,9 +730,6 @@ export default class CreateSecretStorageDialog extends React.PureComponent { case PHASE_LOADING: content = this._renderBusyPhase(); break; - case PHASE_RESTORE_KEY_BACKUP: - content = this._renderPhaseRestoreKeyBackup(); - break; case PHASE_MIGRATE: content = this._renderPhaseMigrate(); break; @@ -763,6 +768,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { title={this._titleForPhase(this.state.phase)} headerImage={headerImage} hasCancel={this.props.hasCancel && [PHASE_PASSPHRASE].includes(this.state.phase)} + fixedWidth={false} >
      {content} diff --git a/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js b/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js index 0c432ba542..4466775d3a 100644 --- a/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js +++ b/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js @@ -39,7 +39,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { showSummary: PropTypes.bool, }; - defaultProps = { + static defaultProps = { showSummary: true, }; diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 23ca730d97..75aadc02bd 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1991,7 +1991,7 @@ "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.", "File to import": "File to import", "Import": "Import", - "Key Backup is enabled on your account but has not been set up from this session. To set up secret storage, restore your key backup.": "Key Backup is enabled on your account but has not been set up from this session. To set up secret storage, restore your key backup.", + "Restore your key backup to upgrade your encryption": "Restore your key backup to upgrade your encryption", "Restore": "Restore", "Enter your account password to confirm the upgrade:": "Enter your account password to confirm the upgrade:", "You'll need to authenticate with the server to confirm the upgrade.": "You'll need to authenticate with the server to confirm the upgrade.", @@ -2022,7 +2022,6 @@ "Verify other users in their profile.": "Verify other users in their profile.", "Without setting up secret storage, you won't be able to restore your access to encrypted messages or your cross-signing identity for verifying other devices if you log out or use another device.": "Without setting up secret storage, you won't be able to restore your access to encrypted messages or your cross-signing identity for verifying other devices if you log out or use another device.", "Set up secret storage": "Set up secret storage", - "Restore your Key Backup": "Restore your Key Backup", "Upgrade your encryption": "Upgrade your encryption", "Recovery key": "Recovery key", "Keep it safe": "Keep it safe", From 330b489fd528b1f80bdbdd1ba1de091fec573cf7 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 28 Jan 2020 16:44:30 +0000 Subject: [PATCH 321/906] Switch back to legacy decorators Empirically the build is fine with these, but it is unfortunate that we have to reply on deprecated semantics. TypeScript should help fix this. --- babel.config.js | 2 +- src/utils/replaceableComponent.ts | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/babel.config.js b/babel.config.js index 3c0c3fcb85..d5a97d56ce 100644 --- a/babel.config.js +++ b/babel.config.js @@ -11,7 +11,7 @@ module.exports = { "@babel/preset-react" ], "plugins": [ - ["@babel/plugin-proposal-decorators", {decoratorsBeforeExport: true}], + ["@babel/plugin-proposal-decorators", {legacy: true}], "@babel/plugin-proposal-export-default-from", "@babel/plugin-proposal-numeric-separator", "@babel/plugin-proposal-class-properties", diff --git a/src/utils/replaceableComponent.ts b/src/utils/replaceableComponent.ts index 281ff4c1ac..9f617b27f3 100644 --- a/src/utils/replaceableComponent.ts +++ b/src/utils/replaceableComponent.ts @@ -32,13 +32,9 @@ import * as sdk from '../index'; * with a skinned version. If no skinned version is available, this component * will be used. */ -export function replaceableComponent(name: string) { +export function replaceableComponent(name: string, origComponent: React.Component) { // Decorators return a function to override the class (origComponent). This // ultimately assumes that `getComponent()` won't throw an error and instead // return a falsey value like `null` when the skin doesn't have a component. - return (origComponent) => { - const c = sdk.getComponent(name) || origComponent; - c.kind = "class"; // appeases babel - return c; - }; + return () => sdk.getComponent(name) || origComponent; } From 6c10c1b76d3ca69e5f5356b998ab44b5f2a02415 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Tue, 28 Jan 2020 16:16:03 +0000 Subject: [PATCH 322/906] Translated using Weblate (Hungarian) Currently translated at 100.0% (2078 of 2078 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index fe6f1d504e..856e3f535d 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -2110,5 +2110,41 @@ "Verify this session": "Munkamenet ellenőrzése", "Encryption upgrade available": "A titkosítás fejlesztése elérhető", "%(senderName)s turned on end-to-end encryption.": "%(senderName)s bekapcsolta a végpontok közötti titkosítást.", - "%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s bekapcsolta a végpontok közötti titkosítást (ismeretlen algoritmus: %(algorithm)s)." + "%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s bekapcsolta a végpontok közötti titkosítást (ismeretlen algoritmus: %(algorithm)s).", + "Enable message search in encrypted rooms": "Üzenetek keresésének engedélyezése titkosított szobákban", + "Review & verify your new session": "Az új munkameneted átnézése és ellenőrzése", + "Review": "Átnéz", + "Verify your other devices easier": "Ellenőrizd egyszerűbben a többi eszközöd", + "This bridge was provisioned by .": "Ezt a hidat az alábbi felhasználó készítette: .", + "Workspace: %(networkName)s": "Munkahely: %(networkName)s", + "Channel: %(channelName)s": "Csatorna: %(channelName)s", + "Show less": "Kevesebbet mutat", + "Securely cache encrypted messages locally for them to appear in search results, using ": "A titkosított üzenetek kereséséhez azokat biztonságos módon helyileg kell tárolnod, felhasználva: ", + " to store messages from ": " üzenetek eltárolásához innen ", + "rooms.": "szobák.", + "Manage": "Kezel", + "Securely cache encrypted messages locally for them to appear in search results.": "A titkosított üzenetek kereséséhez azokat biztonságos módon helyileg kell tárolnod.", + "Enable": "Engedélyez", + "Riot is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom Riot Desktop with search components added.": "A Riotból a titkosított üzenetek biztonságos helyi tárolásához hiányzik néhány dolog. Ha kísérletezni szeretnél ezzel a lehetőséggel fordíts le egy saját Riotot a kereső komponens hozzáadásával.", + "Riot can't securely cache encrypted messages locally while running in a web browser. Use Riot Desktop for encrypted messages to appear in search results.": "A Riot a web böngészőben nem tud biztonságosan titkosított üzenetet helyben elmenteni. Hogy a titkosított üzenetekre tudjál keresni használj Asztali Riot klienst.", + "Message search": "Üzenet keresése", + "This room is bridging messages to the following platforms. Learn more.": "Ez a szoba összeköti az üzeneteket a következő platformokkal, tudj meg többet.", + "This room isn’t bridging messages to any platforms. Learn more.": "Ez a szoba egy platformmal sem köt össze üzeneteket. Tudj meg többet.", + "Bridges": "Hidak", + "New session": "Új munkamenet", + "Use this session to verify your new one, granting it access to encrypted messages:": "Az új munkamenet ellenőrzéséhez használd ezt, amivel hozzáférést adsz a titkosított üzenetekhez:", + "If you didn’t sign in to this session, your account may be compromised.": "Ha nem te jelentkeztél be ebbe a munkamenetbe akkor a fiókodat feltörték.", + "This wasn't me": "Nem én voltam", + "Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Fejleszd ezt az eszközt, hogy ellenőrizhesd a többi eszközödet vele amivel hozzáférést adhatsz a titkosított üzeneteidhez és megbízhatónak jelölheted őket más felhasználók számára.", + "Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Állítsd be a titkosítást ezen az eszközön, hogy ellenőrizhesd a többi eszközödet vele, amivel hozzáférést adhatsz a titkosított üzeneteidhez és megbízhatónak jelölheted őket más felhasználók számára.", + "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Helyezd biztonságba a titkosítási kulcsaidat egy jelmondattal. A maximális biztonság érdekében ez térjen el a felhasználói fióknál használt jelszótól:", + "This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Ezzel az eszközzel most már ellenőrizheted a többi eszközödet, hozzáférést adhatsz a titkosított üzeneteidhez és megbízhatónak jelölheted őket más felhasználók számára.", + "If disabled, messages from encrypted rooms won't appear in search results.": "Ha nincs engedélyezve akkor a titkosított szobák üzenetei nem jelennek meg a keresések között.", + "Disable": "Tiltás", + "Not currently downloading messages for any room.": "Jelenleg egy szobából sem folyik üzenet letöltés.", + "Downloading mesages for %(currentRoom)s.": "Üzenetek letöltése innen: %(currentRoom)s.", + "Riot is securely caching encrypted messages locally for them to appear in search results:": "Riot a kereshetőség érdekében a titkosított üzeneteket biztonságos módon helyileg tárolja:", + "Space used:": "Hely felhasználva:", + "Indexed messages:": "Indexált üzenetek:", + "Number of rooms:": "Szobák száma:" } From 58df4127d3b0c3b08c776c15ae84ccb215d68247 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 28 Jan 2020 17:14:48 +0000 Subject: [PATCH 323/906] Update propTypes and remove todo --- src/components/views/right_panel/EncryptionPanel.js | 7 +++++-- src/components/views/right_panel/VerificationPanel.js | 1 - 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/views/right_panel/EncryptionPanel.js b/src/components/views/right_panel/EncryptionPanel.js index 2c4a896624..d45280e29c 100644 --- a/src/components/views/right_panel/EncryptionPanel.js +++ b/src/components/views/right_panel/EncryptionPanel.js @@ -14,7 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, {useCallback, useEffect, useState} from 'react'; +import React, {useCallback, useEffect, useState} from "react"; +import PropTypes from "prop-types"; import EncryptionInfo from "./EncryptionInfo"; import VerificationPanel from "./VerificationPanel"; @@ -85,7 +86,9 @@ const EncryptionPanel = ({verificationRequest, member, onClose}) => { } }; EncryptionPanel.propTypes = { - + member: PropTypes.object.isRequired, + onClose: PropTypes.func.isRequired, + verificationRequest: PropTypes.object, }; export default EncryptionPanel; diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 6a5516927a..3740c6e49d 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -39,7 +39,6 @@ export default class VerificationPanel extends React.PureComponent { renderQRPhase(pending) { const {member, request} = this.props; - // TODO change the button into a spinner when on click const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); let button; From 546acb696dd7c2313ebab2cc6f4a29122c6c4b1f Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 28 Jan 2020 17:15:50 +0000 Subject: [PATCH 324/906] Add confirmation to skip button Re-using the opt out phase which was unused --- .../CreateSecretStorageDialog.js | 34 ++++++++----------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 69dd13f46e..b08b6c5624 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -32,7 +32,7 @@ const PHASE_SHOWKEY = 4; const PHASE_KEEPITSAFE = 5; const PHASE_STORING = 6; const PHASE_DONE = 7; -const PHASE_OPTOUT_CONFIRM = 8; +const PHASE_CONFIRM_SKIP = 8; const PASSWORD_MIN_SCORE = 4; // So secure, many characters, much complex, wow, etc, etc. const PASSPHRASE_FEEDBACK_DELAY = 500; // How long after keystroke to offer passphrase feedback, ms. @@ -148,11 +148,6 @@ export default class CreateSecretStorageDialog extends React.PureComponent { this._recoveryKeyNode = n; } - _onSkipClick = () => { - // TODO: add confirmation - this.props.onFinished(false); - } - _onMigrateFormSubmit = (e) => { e.preventDefault(); if (this.state.backupSigStatus.usable) { @@ -271,8 +266,8 @@ export default class CreateSecretStorageDialog extends React.PureComponent { } } - _onOptOutClick = () => { - this.setState({phase: PHASE_OPTOUT_CONFIRM}); + _onSkipSetupClick = () => { + this.setState({phase: PHASE_CONFIRM_SKIP}); } _onSetUpClick = () => { @@ -496,7 +491,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { disabled={!this._passPhraseIsValid()} > @@ -564,7 +559,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { disabled={this.state.passPhrase !== this.state.passPhraseConfirm} > @@ -669,19 +664,18 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
      ; } - _renderPhaseOptOutConfirm() { + _renderPhaseSkipConfirm() { const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); return
      {_t( - "Without setting up secret storage, you won't be able to restore your " + - "access to encrypted messages or your cross-signing identity for " + - "verifying other devices if you log out or use another device.", + "Without completing security on this device, it won’t have " + + "access to encrypted messages.", )} - - +
      ; } @@ -694,8 +688,8 @@ export default class CreateSecretStorageDialog extends React.PureComponent { return _t('Set up encryption'); case PHASE_PASSPHRASE_CONFIRM: return _t('Confirm passphrase'); - case PHASE_OPTOUT_CONFIRM: - return _t('Warning!'); + case PHASE_CONFIRM_SKIP: + return _t('Are you sure?'); case PHASE_SHOWKEY: return _t('Recovery key'); case PHASE_KEEPITSAFE: @@ -751,8 +745,8 @@ export default class CreateSecretStorageDialog extends React.PureComponent { case PHASE_DONE: content = this._renderPhaseDone(); break; - case PHASE_OPTOUT_CONFIRM: - content = this._renderPhaseOptOutConfirm(); + case PHASE_CONFIRM_SKIP: + content = this._renderPhaseSkipConfirm(); break; } } From e1e35a53e43f9e8567da0e671d91cab1e640a555 Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 28 Jan 2020 17:18:09 +0000 Subject: [PATCH 325/906] i18n --- src/i18n/strings/en_EN.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 75aadc02bd..6a884d6f25 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2020,8 +2020,6 @@ "Copy it to your personal cloud storage": "Copy it to your personal cloud storage", "This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.", "Verify other users in their profile.": "Verify other users in their profile.", - "Without setting up secret storage, you won't be able to restore your access to encrypted messages or your cross-signing identity for verifying other devices if you log out or use another device.": "Without setting up secret storage, you won't be able to restore your access to encrypted messages or your cross-signing identity for verifying other devices if you log out or use another device.", - "Set up secret storage": "Set up secret storage", "Upgrade your encryption": "Upgrade your encryption", "Recovery key": "Recovery key", "Keep it safe": "Keep it safe", From 5e1b42b3505adb53652a9efb60bd7eda8df15a52 Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 28 Jan 2020 17:21:42 +0000 Subject: [PATCH 326/906] unused component --- .../views/dialogs/secretstorage/CreateSecretStorageDialog.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index b08b6c5624..62a80d0cdc 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -387,7 +387,6 @@ export default class CreateSecretStorageDialog extends React.PureComponent { // https://github.com/vector-im/riot-web/issues/11696 const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); const Field = sdk.getComponent('views.elements.Field'); - const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); let authPrompt; let nextCaption = _t("Next"); From b0028066395547f9912c7438bbf2e3e70a59f2e2 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 28 Jan 2020 17:42:39 +0000 Subject: [PATCH 327/906] Use DialogButtons because reusability :(( --- .../views/verification/VerificationShowSas.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/components/views/verification/VerificationShowSas.js b/src/components/views/verification/VerificationShowSas.js index 08d0dd422d..4a1628e9e6 100644 --- a/src/components/views/verification/VerificationShowSas.js +++ b/src/components/views/verification/VerificationShowSas.js @@ -19,6 +19,7 @@ import PropTypes from 'prop-types'; import { _t, _td } from '../../../languageHandler'; import {PendingActionSpinner} from "../right_panel/EncryptionInfo"; import AccessibleButton from "../elements/AccessibleButton"; +import DialogButtons from "../elements/DialogButtons"; function capFirst(s) { return s.charAt(0).toUpperCase() + s.slice(1); @@ -90,14 +91,15 @@ export default class VerificationShowSas extends React.Component { const text = _t("Waiting for %(displayName)s to verify…", {displayName}); confirm = ; } else { - confirm = - - {_t("They match")} - - - {_t("They don't match")} - - ; + // FIXME: stop using DialogButtons here once it this component is only used in the right panel verification + confirm = ; } return
      From 6fb8f6eef16ef7fc2f18871d8eceaaf083bdefab Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Tue, 28 Jan 2020 18:03:47 +0000 Subject: [PATCH 328/906] Add device IDs in user info tooltips For easier device identification, add the device ID in an HTML tooltip for now. Fixes https://github.com/vector-im/riot-web/issues/12103 --- src/components/views/right_panel/UserInfo.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index 051f92cc9c..394f6b5c98 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -183,11 +183,16 @@ function DeviceItem({userId, device}) { (device.getDisplayName() ? device.getDisplayName() : "") + " (" + device.deviceId + ")" : device.getDisplayName(); const trustedLabel = isVerified ? _t("Trusted") : _t("Not trusted"); - return ( -
      -
      {deviceName}
      -
      {trustedLabel}
      - ); + return ( + +
      +
      {deviceName}
      +
      {trustedLabel}
      + + ); } function DevicesSection({devices, userId, loading}) { From 39c8a9d204016ae1bc0209c2658f3a3ef7ec3835 Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 28 Jan 2020 19:42:09 +0000 Subject: [PATCH 329/906] Start new key backup in security setup flow Part of https://github.com/vector-im/riot-web/issues/11889 --- .../_CreateSecretStorageDialog.scss | 24 +++++++++++++++++++ .../CreateSecretStorageDialog.js | 19 +++++++++++++-- src/i18n/strings/en_EN.json | 1 + 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/res/css/views/dialogs/secretstorage/_CreateSecretStorageDialog.scss b/res/css/views/dialogs/secretstorage/_CreateSecretStorageDialog.scss index 53e82670e1..bbbf3fc1d3 100644 --- a/res/css/views/dialogs/secretstorage/_CreateSecretStorageDialog.scss +++ b/res/css/views/dialogs/secretstorage/_CreateSecretStorageDialog.scss @@ -15,6 +15,30 @@ See the License for the specific language governing permissions and limitations under the License. */ +.mx_CreateSecretStorageDialog { + // Why you ask? Because CompleteSecurityBody is 600px so this is the width + // we end up when in there, but when in our own dialog we set our own width + // so need to fix it to something sensible as otherwise we'd end up either + // really wide or really narrow depending on the phase. I bet you wish you + // never asked. + width: 560px; + + .mx_SettingsFlag { + display: flex; + } + + .mx_SettingsFlag_label { + flex: 1 1 0; + min-width: 0; + font-weight: 600; + } + + .mx_ToggleSwitch { + flex: 0 0 auto; + margin-left: 30px; + } +} + .mx_CreateSecretStorageDialog .mx_Dialog_title { /* TODO: Consider setting this for all dialog titles. */ margin-bottom: 1em; diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 62a80d0cdc..4068f72217 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -87,6 +87,8 @@ export default class CreateSecretStorageDialog extends React.PureComponent { // set if we are 'upgrading' encryption (making an SSSS store from // an existing key backup secret). doingUpgrade: null, + // status of the key backup toggle switch + useKeyBackup: true, }; this._fetchBackupInfo(); @@ -141,13 +143,19 @@ export default class CreateSecretStorageDialog extends React.PureComponent { } _onKeyBackupStatusChange = () => { - this._fetchBackupInfo(); + if (this.state.phase === PHASE_MIGRATE) this._fetchBackupInfo(); } _collectRecoveryKeyNode = (n) => { this._recoveryKeyNode = n; } + _onUseKeyBackupChange = (enabled) => { + this.setState({ + useKeyBackup: enabled, + }); + } + _onMigrateFormSubmit = (e) => { e.preventDefault(); if (this.state.backupSigStatus.usable) { @@ -222,6 +230,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { authUploadDeviceSigningKeys: this._doBootstrapUIAuth, createSecretStorageKey: async () => this._keyInfo, keyBackupInfo: this.state.backupInfo, + setupNewKeyBackup: !this.state.backupInfo && this.state.useKeyBackup, }); this.setState({ phase: PHASE_DONE, @@ -425,7 +434,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { hasCancel={false} primaryDisabled={this.state.canUploadKeysWithPasswordOnly && !this.state.accountPassword} > - @@ -436,6 +445,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); const Field = sdk.getComponent('views.elements.Field'); const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); + const LabelledToggleSwitch = sdk.getComponent('views.elements.LabelledToggleSwitch'); let strengthMeter; let helpText; @@ -484,6 +494,11 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
      + + Date: Tue, 28 Jan 2020 19:55:53 +0000 Subject: [PATCH 330/906] onClick to separate line --- src/components/views/right_panel/UserInfo.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index 394f6b5c98..e20ab07cae 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -185,8 +185,9 @@ function DeviceItem({userId, device}) { const trustedLabel = isVerified ? _t("Trusted") : _t("Not trusted"); return (
      {deviceName}
      From 793ff2cccc3b2359bf384df6e4dc938a4e735765 Mon Sep 17 00:00:00 2001 From: Hubert Chathi Date: Tue, 28 Jan 2020 15:36:24 -0500 Subject: [PATCH 331/906] Hide pre-join UTDs (#3881) --- src/components/structures/TimelinePanel.js | 94 ++++++++++++++++++++-- 1 file changed, 88 insertions(+), 6 deletions(-) diff --git a/src/components/structures/TimelinePanel.js b/src/components/structures/TimelinePanel.js index 65fb00c305..e708fad6a4 100644 --- a/src/components/structures/TimelinePanel.js +++ b/src/components/structures/TimelinePanel.js @@ -2,7 +2,7 @@ Copyright 2016 OpenMarket Ltd Copyright 2017 Vector Creations Ltd Copyright 2019 New Vector Ltd -Copyright 2019 The Matrix.org Foundation C.I.C. +Copyright 2019-2020 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. @@ -146,6 +146,9 @@ const TimelinePanel = createReactClass({ liveEvents: [], timelineLoading: true, // track whether our room timeline is loading + // the index of the first event that is to be shown + firstVisibleEventIndex: 0, + // canBackPaginate == false may mean: // // * we haven't (successfully) loaded the timeline yet, or: @@ -333,11 +336,12 @@ const TimelinePanel = createReactClass({ // We can now paginate in the unpaginated direction const canPaginateKey = (backwards) ? 'canBackPaginate' : 'canForwardPaginate'; - const { events, liveEvents } = this._getEvents(); + const { events, liveEvents, firstVisibleEventIndex } = this._getEvents(); this.setState({ [canPaginateKey]: true, events, liveEvents, + firstVisibleEventIndex, }); } }, @@ -369,6 +373,11 @@ const TimelinePanel = createReactClass({ return Promise.resolve(false); } + if (backwards && this.state.firstVisibleEventIndex !== 0) { + debuglog("TimelinePanel: won't", dir, "paginate past first visible event"); + return Promise.resolve(false); + } + debuglog("TimelinePanel: Initiating paginate; backwards:"+backwards); this.setState({[paginatingKey]: true}); @@ -377,12 +386,13 @@ const TimelinePanel = createReactClass({ debuglog("TimelinePanel: paginate complete backwards:"+backwards+"; success:"+r); - const { events, liveEvents } = this._getEvents(); + const { events, liveEvents, firstVisibleEventIndex } = this._getEvents(); const newState = { [paginatingKey]: false, [canPaginateKey]: r, events, liveEvents, + firstVisibleEventIndex, }; // moving the window in this direction may mean that we can now @@ -402,7 +412,11 @@ const TimelinePanel = createReactClass({ // itself into the right place return new Promise((resolve) => { this.setState(newState, () => { - resolve(r); + // we can continue paginating in the given direction if: + // - _timelineWindow.paginate says we can + // - we're paginating forwards, or we won't be trying to + // paginate backwards past the first visible event + resolve(r && (!backwards || firstVisibleEventIndex === 0)); }); }); }); @@ -476,12 +490,13 @@ const TimelinePanel = createReactClass({ this._timelineWindow.paginate(EventTimeline.FORWARDS, 1, false).then(() => { if (this.unmounted) { return; } - const { events, liveEvents } = this._getEvents(); + const { events, liveEvents, firstVisibleEventIndex } = this._getEvents(); const lastLiveEvent = liveEvents[liveEvents.length - 1]; const updatedState = { events, liveEvents, + firstVisibleEventIndex, }; let callRMUpdated; @@ -1115,6 +1130,7 @@ const TimelinePanel = createReactClass({ // get the list of events from the timeline window and the pending event list _getEvents: function() { const events = this._timelineWindow.getEvents(); + const firstVisibleEventIndex = this._checkForPreJoinUISI(events); // Hold onto the live events separately. The read receipt and read marker // should use this list, so that they don't advance into pending events. @@ -1128,9 +1144,72 @@ const TimelinePanel = createReactClass({ return { events, liveEvents, + firstVisibleEventIndex, }; }, + /** + * Check for undecryptable messages that were sent while the user was not in + * the room. + * + * @param {Array} events The timeline events to check + * + * @return {Number} The index within `events` of the event after the most recent + * undecryptable event that was sent while the user was not in the room. If no + * such events were found, then it returns 0. + */ + _checkForPreJoinUISI: function(events) { + const room = this.props.timelineSet.room; + + if (events.length === 0 || !room || + !MatrixClientPeg.get().isRoomEncrypted(room.roomId)) { + return 0; + } + + const userId = MatrixClientPeg.get().credentials.userId; + + // get the user's membership at the last event by getting the timeline + // that the event belongs to, and traversing the timeline looking for + // that event, while keeping track of the user's membership + const lastEvent = events[events.length - 1]; + const timeline = room.getTimelineForEvent(lastEvent.getId()); + const userMembershipEvent = + timeline.getState(EventTimeline.FORWARDS).getMember(userId); + let userMembership = userMembershipEvent + ? userMembershipEvent.membership : "leave"; + const timelineEvents = timeline.getEvents(); + for (let i = timelineEvents.length - 1; i >= 0; i--) { + const event = timelineEvents[i]; + if (event.getId() === lastEvent.getId()) { + // found the last event, so we can stop looking through the timeline + break; + } else if (event.getStateKey() === userId + && event.getType() === "m.room.member") { + const prevContent = event.getPrevContent(); + userMembership = prevContent.membership || "leave"; + } + } + + // now go through the events that we have and find the first undecryptable + // one that was sent when the user wasn't in the room + for (let i = events.length - 1; i >= 0; i--) { + const event = events[i]; + if (event.getStateKey() === userId + && event.getType() === "m.room.member") { + const prevContent = event.getPrevContent(); + userMembership = prevContent.membership || "leave"; + } else if (userMembership === "leave" && + (event.isDecryptionFailure() || event.isBeingDecrypted())) { + // reached an undecryptable message when the user wasn't in + // the room -- don't try to load any more + // Note: for now, we assume that events that are being decrypted are + // not decryptable + return i + 1; + } + } + return 0; + }, + _indexForEventId: function(evId) { for (let i = 0; i < this.state.events.length; ++i) { if (evId == this.state.events[i].getId()) { @@ -1323,6 +1402,9 @@ const TimelinePanel = createReactClass({ this.state.forwardPaginating || ['PREPARED', 'CATCHUP'].includes(this.state.clientSyncState) ); + const events = this.state.firstVisibleEventIndex + ? this.state.events.slice(this.state.firstVisibleEventIndex) + : this.state.events; return (

    -
    ; + ; } _renderPhasePassPhraseConfirm() { @@ -549,27 +543,30 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
    ; } const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); - return
    + return

    {_t( "Enter your passphrase a second time to confirm it.", )}

    -
    {passPhraseMatch}
    - -
    ; + ; } _renderPhaseShowKey() { diff --git a/src/components/structures/SearchBox.js b/src/components/structures/SearchBox.js index 873efb64c2..e169e09752 100644 --- a/src/components/structures/SearchBox.js +++ b/src/components/structures/SearchBox.js @@ -160,6 +160,7 @@ export default createReactClass({ onKeyDown={ this._onKeyDown } onBlur={this._onBlur} placeholder={ placeholder } + autoComplete="off" /> { clearButton }
    diff --git a/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js b/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js index c976eb81d0..ed65c9d2a6 100644 --- a/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js +++ b/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js @@ -1,6 +1,6 @@ /* Copyright 2018, 2019 New Vector Ltd -Copyright 2019 The Matrix.org Foundation C.I.C. +Copyright 2019, 2020 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. @@ -21,7 +21,6 @@ import * as sdk from '../../../../index'; import {MatrixClientPeg} from '../../../../MatrixClientPeg'; import { _t } from '../../../../languageHandler'; -import { Key } from "../../../../Keyboard"; /* * Access Secure Secret Storage by requesting the user's passphrase. @@ -69,6 +68,8 @@ export default class AccessSecretStorageDialog extends React.PureComponent { } _onPassPhraseNext = async () => { + if (this.state.passPhrase.length <= 0) return; + this.setState({ keyMatches: null }); const input = { passphrase: this.state.passPhrase }; const keyMatches = await this.props.checkPrivateKey(input); @@ -80,6 +81,8 @@ export default class AccessSecretStorageDialog extends React.PureComponent { } _onRecoveryKeyNext = async () => { + if (!this.state.recoveryKeyValid) return; + this.setState({ keyMatches: null }); const input = { recoveryKey: this.state.recoveryKey }; const keyMatches = await this.props.checkPrivateKey(input); @@ -97,18 +100,6 @@ export default class AccessSecretStorageDialog extends React.PureComponent { }); } - _onPassPhraseKeyPress = (e) => { - if (e.key === Key.ENTER && this.state.passPhrase.length > 0) { - this._onPassPhraseNext(); - } - } - - _onRecoveryKeyKeyPress = (e) => { - if (e.key === Key.ENTER && this.state.recoveryKeyValid) { - this._onRecoveryKeyNext(); - } - } - render() { const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); @@ -135,7 +126,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent { )}
    ; } else { - keyStatus =
    ; + keyStatus =
    ; } content =
    @@ -149,23 +140,26 @@ export default class AccessSecretStorageDialog extends React.PureComponent { "identity for verifying other devices by entering your passphrase.", )}

    -
    - + {keyStatus} - -
    + {_t( "If you've forgotten your passphrase you can "+ "use your recovery key or " + @@ -192,7 +186,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent { let keyStatus; if (this.state.recoveryKey.length === 0) { - keyStatus =
    ; + keyStatus =
    ; } else if (this.state.recoveryKeyValid) { keyStatus =
    {"\uD83D\uDC4D "}{_t("This looks like a valid recovery key!")} @@ -221,22 +215,23 @@ export default class AccessSecretStorageDialog extends React.PureComponent { "identity for verifying other devices by entering your recovery key.", )}

    -
    +
    {keyStatus} - -
    + {_t( "If you've forgotten your recovery key you can "+ "." From fe71fe6033a59e0dcc20c62527ad5b7ec7f71895 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 29 Jan 2020 13:38:50 +0000 Subject: [PATCH 357/906] Sprinkle forms and new-password designators to make autofill and password completion less wild Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../keybackup/CreateKeyBackupDialog.js | 66 ++++++++----------- src/components/views/auth/RegistrationForm.js | 2 + .../views/dialogs/DeactivateAccountDialog.js | 1 + .../keybackup/RestoreKeyBackupDialog.js | 15 ++--- .../views/settings/ChangePassword.js | 8 ++- 5 files changed, 43 insertions(+), 49 deletions(-) diff --git a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js index 8940239cfd..1557159e5c 100644 --- a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js +++ b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js @@ -192,31 +192,27 @@ export default class CreateKeyBackupDialog extends React.PureComponent { }); } - _onPassPhraseNextClick = () => { - this.setState({phase: PHASE_PASSPHRASE_CONFIRM}); - } - - _onPassPhraseKeyPress = async (e) => { - if (e.key === 'Enter') { - // If we're waiting for the timeout before updating the result at this point, - // skip ahead and do it now, otherwise we'll deny the attempt to proceed - // even if the user entered a valid passphrase - if (this._setZxcvbnResultTimeout !== null) { - clearTimeout(this._setZxcvbnResultTimeout); - this._setZxcvbnResultTimeout = null; - await new Promise((resolve) => { - this.setState({ - zxcvbnResult: scorePassword(this.state.passPhrase), - }, resolve); - }); - } - if (this._passPhraseIsValid()) { - this._onPassPhraseNextClick(); - } + _onPassPhraseNextClick = async () => { + // If we're waiting for the timeout before updating the result at this point, + // skip ahead and do it now, otherwise we'll deny the attempt to proceed + // even if the user entered a valid passphrase + if (this._setZxcvbnResultTimeout !== null) { + clearTimeout(this._setZxcvbnResultTimeout); + this._setZxcvbnResultTimeout = null; + await new Promise((resolve) => { + this.setState({ + zxcvbnResult: scorePassword(this.state.passPhrase), + }, resolve); + }); } - } + if (this._passPhraseIsValid()) { + this.setState({phase: PHASE_PASSPHRASE_CONFIRM}); + } + }; _onPassPhraseConfirmNextClick = async () => { + if (this.state.passPhrase !== this.state.passPhraseConfirm) return; + this._keyBackupInfo = await MatrixClientPeg.get().prepareKeyBackupVersion(this.state.passPhrase); this.setState({ setPassPhrase: true, @@ -224,13 +220,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent { downloaded: false, phase: PHASE_SHOWKEY, }); - } - - _onPassPhraseConfirmKeyPress = (e) => { - if (e.key === 'Enter' && this.state.passPhrase === this.state.passPhraseConfirm) { - this._onPassPhraseConfirmNextClick(); - } - } + }; _onSetAgainClick = () => { this.setState({ @@ -301,7 +291,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
    ; } - return
    + return

    {_t( "Warning: You should only set up key backup from a trusted computer.", {}, { b: sub => {sub} }, @@ -316,7 +306,6 @@ export default class CreateKeyBackupDialog extends React.PureComponent {

    - @@ -341,7 +332,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent { {_t("Set up with a Recovery Key")}

    -
    ; + ; } _renderPhasePassPhraseConfirm() { @@ -373,7 +364,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
    ; } const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); - return
    + return

    {_t( "Please enter your passphrase a second time to confirm.", )}

    @@ -382,7 +373,6 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
    - -
    ; + ; } _renderPhaseShowKey() { diff --git a/src/components/views/auth/RegistrationForm.js b/src/components/views/auth/RegistrationForm.js index 91f8e1b226..8ca454dabd 100644 --- a/src/components/views/auth/RegistrationForm.js +++ b/src/components/views/auth/RegistrationForm.js @@ -486,6 +486,7 @@ export default createReactClass({ id="mx_RegistrationForm_password" ref={field => this[FIELD_PASSWORD] = field} type="password" + autoComplete="new-password" label={_t("Password")} value={this.state.password} onChange={this.onPasswordChange} @@ -499,6 +500,7 @@ export default createReactClass({ id="mx_RegistrationForm_passwordConfirm" ref={field => this[FIELD_PASSWORD_CONFIRM] = field} type="password" + autoComplete="new-password" label={_t("Confirm")} value={this.state.passwordConfirm} onChange={this.onPasswordConfirmChange} diff --git a/src/components/views/dialogs/DeactivateAccountDialog.js b/src/components/views/dialogs/DeactivateAccountDialog.js index 7e36232eb0..d7468933df 100644 --- a/src/components/views/dialogs/DeactivateAccountDialog.js +++ b/src/components/views/dialogs/DeactivateAccountDialog.js @@ -118,6 +118,7 @@ export default class DeactivateAccountDialog extends React.Component { const Field = sdk.getComponent('elements.Field'); + // this is on purpose not a
    to prevent Enter triggering submission, to further prevent accidents return ( { - if (e.key === Key.ENTER) { - this._onPassPhraseNext(); - } - } - _onRecoveryKeyKeyPress = (e) => { if (e.key === Key.ENTER && this.state.recoveryKeyValid) { this._onRecoveryKeyNext(); @@ -305,21 +299,22 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { "messaging by entering your recovery passphrase.", )}

    -
    + - -
    + {_t( "If you've forgotten your recovery passphrase you can "+ "use your recovery key or " + diff --git a/src/components/views/settings/ChangePassword.js b/src/components/views/settings/ChangePassword.js index 2d8c4c4178..8cbe455af3 100644 --- a/src/components/views/settings/ChangePassword.js +++ b/src/components/views/settings/ChangePassword.js @@ -253,20 +253,24 @@ export default createReactClass({
    { currentPassword }
    -
    -
    From 920daa3125c229697a25daa65788d909839c71e1 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 29 Jan 2020 13:43:08 +0000 Subject: [PATCH 358/906] Get rid of custom enter handling and protect handlers, disabling button isn't foolproof Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/dialogs/keybackup/RestoreKeyBackupDialog.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js b/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js index 814f5a4980..fc9a21c51b 100644 --- a/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js +++ b/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js @@ -22,7 +22,6 @@ import {MatrixClientPeg} from '../../../../MatrixClientPeg'; import { MatrixClient } from 'matrix-js-sdk'; import Modal from '../../../../Modal'; import { _t } from '../../../../languageHandler'; -import {Key} from "../../../../Keyboard"; import { accessSecretStorage } from '../../../../CrossSigningManager'; const RESTORE_TYPE_PASSPHRASE = 0; @@ -125,6 +124,8 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { } _onRecoveryKeyNext = async () => { + if (!this.state.recoveryKeyValid) return; + this.setState({ loading: true, restoreError: null, @@ -157,12 +158,6 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { }); } - _onRecoveryKeyKeyPress = (e) => { - if (e.key === Key.ENTER && this.state.recoveryKeyValid) { - this._onRecoveryKeyNext(); - } - } - async _restoreWithSecretStorage() { this.setState({ loading: true, @@ -366,7 +361,6 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
    From 957e8629397cc620a1790e7154dba4d866b1b5a0 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 29 Jan 2020 13:58:02 +0000 Subject: [PATCH 359/906] Update copy some more Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/dialogs/DeviceVerifyDialog.js | 2 +- src/components/views/right_panel/EncryptionInfo.js | 2 +- src/components/views/verification/VerificationShowSas.js | 2 +- src/i18n/strings/en_EN.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/views/dialogs/DeviceVerifyDialog.js b/src/components/views/dialogs/DeviceVerifyDialog.js index 4340082c3a..f2368ad795 100644 --- a/src/components/views/dialogs/DeviceVerifyDialog.js +++ b/src/components/views/dialogs/DeviceVerifyDialog.js @@ -194,7 +194,7 @@ export default class DeviceVerifyDialog extends React.Component { { _t("Verify by comparing a short text string.") }

    - {_t("To be secure, do this in person or use another way to communicate.")} + {_t("To be secure, do this in person or use a trusted way to communicate.")}

    {

    {_t("Verify User")}

    {_t("For extra security, verify this user by checking a one-time code on both of your devices.")}

    -

    {_t("To be secure, do this in person or use another way to communicate.")}

    +

    {_t("To be secure, do this in person or use a trusted way to communicate.")}

    { content }
    diff --git a/src/components/views/verification/VerificationShowSas.js b/src/components/views/verification/VerificationShowSas.js index 04f7d86ae5..2a4888ffab 100644 --- a/src/components/views/verification/VerificationShowSas.js +++ b/src/components/views/verification/VerificationShowSas.js @@ -105,7 +105,7 @@ export default class VerificationShowSas extends React.Component { return

    {sasCaption}

    -

    {_t("To be secure, do this in person or use another way to communicate.")}

    +

    {_t("To be secure, do this in person or use a trusted way to communicate.")}

    {sasDisplay} {confirm}
    ; diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index b00fcf3c11..20c1234190 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -451,7 +451,7 @@ "Waiting for %(displayName)s to verify…": "Waiting for %(displayName)s to verify…", "They match": "They match", "They don't match": "They don't match", - "To be secure, do this in person or use another way to communicate.": "To be secure, do this in person or use another way to communicate.", + "To be secure, do this in person or use a trusted way to communicate.": "To be secure, do this in person or use a trusted way to communicate.", "Dog": "Dog", "Cat": "Cat", "Lion": "Lion", From 042bffc5e2ff84a5a7485a1024e39de6debccc57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Wed, 29 Jan 2020 12:17:18 +0000 Subject: [PATCH 360/906] Translated using Weblate (French) Currently translated at 100.0% (2098 of 2098 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 41 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index beaf2f9281..bf5eef02e1 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1138,7 +1138,7 @@ "Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?": "Impossible de trouver les profils pour les identifiants Matrix listés ci-dessous. Voulez-vous quand même les inviter ?", "Invite anyway and never warn me again": "Inviter quand même et ne plus me prévenir", "Invite anyway": "Inviter quand même", - "Waiting for %(userId)s to confirm...": "Attente de la confirmation de %(userId)s…", + "Waiting for %(userId)s to confirm...": "Nous attendons que %(userId)s confirme…", "Whether or not you're logged in (we don't record your username)": "Si vous êtes connecté ou pas (votre nom d'utilisateur n'est pas enregistré)", "Upgrades a room to a new version": "Met à niveau un salon vers une nouvelle version", "Sets the room name": "Défini le nom du salon", @@ -2021,7 +2021,7 @@ "Migrate from Key Backup": "Migrer depuis la sauvegarde de clés", "Help": "Aide", "New DM invite dialog (under development)": "Nouveau dialogue d’invitation aux MD (en développement)", - "Show more": "En savoir plus", + "Show more": "En voir plus", "Recent Conversations": "Conversations récentes", "Direct Messages": "Messages directs", "If you can't find someone, ask them for their username, or share your username (%(userId)s) or profile link.": "Si vous n’arrivez pas à trouver quelqu’un, demandez-lui son nom d’utilisateur ou partagez votre nom d’utilisateur (%(userId)s) ou votre lien de profil.", @@ -2134,5 +2134,40 @@ "Riot is securely caching encrypted messages locally for them to appear in search results:": "Riot met en cache les messages chiffrés localement et de manière sécurisée pour qu’ils apparaissent dans les résultats de recherche :", "Space used:": "Espace utilisé :", "Indexed messages:": "Messages indexés :", - "Number of rooms:": "Nombre de salons :" + "Number of rooms:": "Nombre de salons :", + "Waiting for %(displayName)s to verify…": "Nous attendons que %(displayName)s vérifie…", + "They match": "Ils correspondent", + "They don't match": "Ils ne correspondent pas", + "For ultimate security, do this in person or use another way to communicate.": "Pour une sécurité maximale, faites cela en personne ou utilisez un autre moyen de communication.", + "This bridge was provisioned by .": "Cette passerelle a été fournie par .", + "Workspace: %(networkName)s": "Espace de travail : %(networkName)s", + "Channel: %(channelName)s": "Canal : %(channelName)s", + "Show less": "En voir moins", + "This room is bridging messages to the following platforms. Learn more.": "Ce salon transmet les messages vers les plateformes suivantes. En savoir plus.", + "This room isn’t bridging messages to any platforms. Learn more.": "Ce salon ne transmet les messages à aucune plateforme. En savoir plus.", + "Bridges": "Passerelles", + "Waiting for %(displayName)s to accept…": "Nous attendons que %(displayName)s accepte…", + "Your messages are secured and only you and the recipient have the unique keys to unlock them.": "Vos messages sont sécurisés et seuls vous et le destinataire avez les clés uniques pour les déchiffrer.", + "Your messages are not secure": "Vos messages ne sont pas sécurisés", + "One of the following may be compromised:": "Un des éléments suivants est peut-être compromis :", + "Your homeserver": "Votre serveur d’accueil", + "The homeserver the user you’re verifying is connected to": "Le serveur d’accueil auquel l’utilisateur que vous vérifiez est connecté", + "Yours, or the other users’ internet connection": "Votre connexion internet ou celle de l’autre utilisateur", + "Yours, or the other users’ device": "Votre appareil ou celui de l’autre ordinateur", + "Verify by emoji": "Vérifier avec des émojis", + "Verify by comparing unique emoji.": "Vérifier en comparant des émojis uniques.", + "Ask %(displayName)s to scan your code:": "Demandez à %(displayName)s de scanner votre code :", + "If you can't scan the code above, verify by comparing unique emoji.": "Si vous ne pouvez pas scanner le code ci-dessus, vérifiez en comparant des émojis uniques.", + "You've successfully verified %(displayName)s!": "Vous avez vérifié %(displayName)s !", + "Got it": "Compris", + "Verification timed out. Start verification again from their profile.": "La vérification a expiré. Recommencez la vérification depuis son profil.", + "%(displayName)s cancelled verification. Start verification again from their profile.": "%(displayName)s a annulé la vérification. Recommencez la vérification depuis son profil.", + "You cancelled verification. Start verification again from their profile.": "Vous avez annulé la vérification. Recommencez la vérification depuis son profil.", + "New session": "Nouvelle session", + "Use this session to verify your new one, granting it access to encrypted messages:": "Utilisez cette session pour vérifier la nouvelle, ce qui lui permettra d’accéder aux messages chiffrés :", + "If you didn’t sign in to this session, your account may be compromised.": "Si vous ne vous êtes pas connecté à cette session, votre compte est peut-être compromis.", + "This wasn't me": "Ce n’était pas moi", + "Your new session is now verified. Other users will see it as trusted.": "Votre nouvelle session est maintenant vérifiée. Les autres utilisateurs la verront comme fiable.", + "Restore your key backup to upgrade your encryption": "Restaurez votre sauvegarde de clés pour mettre à niveau votre chiffrement", + "Back up my encryption keys, securing them with the same passphrase": "Sauvegarder mes clés de chiffrement, en les sécurisant avec la même phrase de passe" } From 8418625026c08cdd7fac050d17905c0afccfb7cb Mon Sep 17 00:00:00 2001 From: random Date: Wed, 29 Jan 2020 11:51:21 +0000 Subject: [PATCH 361/906] Translated using Weblate (Italian) Currently translated at 98.2% (2060 of 2098 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index c8844fb2bb..d60190ec66 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2107,5 +2107,28 @@ "Upgrade your encryption": "Aggiorna la tua cifratura", "Set up encryption": "Imposta la cifratura", "Encryption upgraded": "Cifratura aggiornata", - "Encryption setup complete": "Impostazione cifratura completata" + "Encryption setup complete": "Impostazione cifratura completata", + "Verify this session": "Verifica questa sessione", + "Encryption upgrade available": "Aggiornamento cifratura disponibile", + "%(senderName)s turned on end-to-end encryption.": "%(senderName)s ha attivato la cifratura end-to-end.", + "%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s ha attivato la cifratura end-to-end (algoritmo %(algorithm)s sconosciuto).", + "Enable message search in encrypted rooms": "Attiva la ricerca messaggi nelle stanze cifrate", + "Waiting for %(displayName)s to verify…": "In attesa della verifica da %(displayName)s …", + "They match": "Corrispondono", + "They don't match": "Non corrispondono", + "For ultimate security, do this in person or use another way to communicate.": "Per la massima sicurezza, fatelo di persona o usate un'altra via di comunicazione.", + "Review & verify your new session": "Controlla e verifica la tua nuova sessione", + "Review": "Controlla", + "Verify your other devices easier": "Verifica più facilmente gli altri tuoi dispositivi", + "This bridge was provisioned by .": "Questo bridge è stato fornito da .", + "Workspace: %(networkName)s": "Spazio di lavoro: %(networkName)s", + "Channel: %(channelName)s": "Canale: %(channelName)s", + "Show less": "Mostra meno", + "Securely cache encrypted messages locally for them to appear in search results, using ": "Tieni in cache localmente i messaggi cifrati in modo sicuro affinché appaiano nei risultati di ricerca, usando ", + " to store messages from ": " per conservare i messaggi da ", + "rooms.": "stanze.", + "Manage": "Gestisci", + "Securely cache encrypted messages locally for them to appear in search results.": "Tieni in cache localmente i messaggi cifrati in modo sicuro affinché appaiano nei risultati di ricerca.", + "Enable": "Attiva", + "Riot is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom Riot Desktop with search components added.": "A Riot mancano alcuni componenti richiesti per tenere in cache i messaggi cifrati in modo sicuro. Se vuoi sperimentare questa funzionalità, compila un Riot Desktop personale con i componenti di ricerca aggiunti." } From 19e7c768b6847b19c0e1f865749dd5077f1b45c5 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 29 Jan 2020 14:11:50 +0000 Subject: [PATCH 362/906] Replace Verify button in UserInfo verification with "Learn more" Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/right_panel/_UserInfo.scss | 8 +++++++- src/components/views/right_panel/EncryptionInfo.js | 2 +- src/components/views/right_panel/UserInfo.js | 5 +++-- src/components/views/right_panel/VerificationPanel.js | 6 +++--- src/components/views/verification/VerificationShowSas.js | 6 +++--- src/i18n/strings/en_EN.json | 1 + 6 files changed, 18 insertions(+), 10 deletions(-) diff --git a/res/css/views/right_panel/_UserInfo.scss b/res/css/views/right_panel/_UserInfo.scss index dc22de4713..27014d175a 100644 --- a/res/css/views/right_panel/_UserInfo.scss +++ b/res/css/views/right_panel/_UserInfo.scss @@ -261,10 +261,16 @@ limitations under the License. } .mx_UserInfo_verify { + padding-top: 0; + padding-left: 0; + font-weight: normal; + } + + .mx_UserInfo_wideButton { display: block; margin: 16px 0; } - button.mx_UserInfo_verify { + button.mx_UserInfo_wideButton { width: 100%; // FIXME get rid of this once we get rid of DialogButtons here } } diff --git a/src/components/views/right_panel/EncryptionInfo.js b/src/components/views/right_panel/EncryptionInfo.js index 8868c30053..c3f6770d18 100644 --- a/src/components/views/right_panel/EncryptionInfo.js +++ b/src/components/views/right_panel/EncryptionInfo.js @@ -38,7 +38,7 @@ const EncryptionInfo = ({pending, member, onStartVerification}) => { } else { const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); content = ( - + {_t("Start Verification")} ); diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index ee9884efe8..c48d9c9c37 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -1255,11 +1255,12 @@ const BasicUserInfo = ({room, member, groupId, devices, isRoomEncrypted}) => { userTrust.isCrossSigningVerified() : userTrust.isVerified(); const isMe = member.userId === cli.getUserId(); + let verifyButton; if (isRoomEncrypted && !userVerified && !isMe) { verifyButton = ( - verifyUser(member)}> - {_t("Verify")} + verifyUser(member)}> + {_t("Learn more")} ); } diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 18a9024310..48f4320bee 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -63,7 +63,7 @@ export default class VerificationPanel extends React.PureComponent { button = ; } else { button = ( - + {_t("Verify by emoji")} ); @@ -128,7 +128,7 @@ export default class VerificationPanel extends React.PureComponent {

    Verify all users in a room to ensure it's secure.

    - + {_t("Got it")}
    @@ -156,7 +156,7 @@ export default class VerificationPanel extends React.PureComponent {

    Verification cancelled

    { text }

    - + {_t("Got it")}
    diff --git a/src/components/views/verification/VerificationShowSas.js b/src/components/views/verification/VerificationShowSas.js index aee0f57cf8..26badb9826 100644 --- a/src/components/views/verification/VerificationShowSas.js +++ b/src/components/views/verification/VerificationShowSas.js @@ -80,7 +80,7 @@ export default class VerificationShowSas extends React.Component { } else { return
    {_t("Unable to find a supported verification method.")} - + {_t('Cancel')}
    ; @@ -96,10 +96,10 @@ export default class VerificationShowSas extends React.Component { confirm = ; } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 3ae0991f16..c529e8bf56 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1173,6 +1173,7 @@ "%(role)s in %(roomName)s": "%(role)s in %(roomName)s", "This client does not support end-to-end encryption.": "This client does not support end-to-end encryption.", "Messages in this room are not end-to-end encrypted.": "Messages in this room are not end-to-end encrypted.", + "Learn more": "Learn more", "Security": "Security", "Verify by emoji": "Verify by emoji", "Verify by comparing unique emoji.": "Verify by comparing unique emoji.", From 00dd1a4a8f673abb281c8fa1a404a194a22b3c86 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 29 Jan 2020 14:22:20 +0000 Subject: [PATCH 363/906] Re-use existing classes to fix font-size matching Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/right_panel/_UserInfo.scss | 6 ------ src/components/views/right_panel/UserInfo.js | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/res/css/views/right_panel/_UserInfo.scss b/res/css/views/right_panel/_UserInfo.scss index 27014d175a..5e5b66f58a 100644 --- a/res/css/views/right_panel/_UserInfo.scss +++ b/res/css/views/right_panel/_UserInfo.scss @@ -260,12 +260,6 @@ limitations under the License. } } - .mx_UserInfo_verify { - padding-top: 0; - padding-left: 0; - font-weight: normal; - } - .mx_UserInfo_wideButton { display: block; margin: 16px 0; diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index c48d9c9c37..f189380eac 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -1259,7 +1259,7 @@ const BasicUserInfo = ({room, member, groupId, devices, isRoomEncrypted}) => { let verifyButton; if (isRoomEncrypted && !userVerified && !isMe) { verifyButton = ( - verifyUser(member)}> + verifyUser(member)}> {_t("Learn more")} ); From c4f16591161bfc261a9c7fd34b0525962481bb75 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Wed, 29 Jan 2020 15:22:05 +0100 Subject: [PATCH 364/906] don't dismiss toasts for device verification as they are immediately started --- src/components/views/toasts/VerificationRequestToast.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/views/toasts/VerificationRequestToast.js b/src/components/views/toasts/VerificationRequestToast.js index 342b7d840c..d7b2880b92 100644 --- a/src/components/views/toasts/VerificationRequestToast.js +++ b/src/components/views/toasts/VerificationRequestToast.js @@ -56,7 +56,10 @@ export default class VerificationRequestToast extends React.PureComponent { _checkRequestIsPending = () => { const {request} = this.props; - if (request.ready || request.started || request.done || request.cancelled || request.observeOnly) { + const isPendingInRoomRequest = request.channel.roomId && + !(request.ready || request.started || request.done || request.cancelled || request.observeOnly); + const isPendingDeviceRequest = request.channel.deviceId && request.started; + if (!isPendingInRoomRequest && !isPendingDeviceRequest) { ToastStore.sharedInstance().dismissToast(this.props.toastKey); } }; From 59dc3cfb97c21833a99a0ede22dcc312a1d3911d Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Wed, 29 Jan 2020 15:23:13 +0100 Subject: [PATCH 365/906] update immediately, don't wait until verification is done this can deadlock, as you can't finish the verification without the UI --- src/components/views/right_panel/VerificationPanel.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 18a9024310..a34dfbfdd0 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -217,9 +217,12 @@ export default class VerificationPanel extends React.PureComponent { }; _onRequestChange = async () => { + this.forceUpdate(); const {request} = this.props; - if (!this._hasVerifier && !!request.verifier) { - request.verifier.on('show_sas', this._onVerifierShowSas); + const hadVerifier = this._hasVerifier; + this._hasVerifier = !!request.verifier; + if (!hadVerifier && this._hasVerifier) { + request.verifier.once('show_sas', this._onVerifierShowSas); try { // on the requester side, this is also awaited in _startSAS, // but that's ok as verify should return the same promise. @@ -227,10 +230,7 @@ export default class VerificationPanel extends React.PureComponent { } catch (err) { console.error("error verify", err); } - } else if (this._hasVerifier && !request.verifier) { - request.verifier.removeListener('show_sas', this._onVerifierShowSas); } - this._hasVerifier = !!request.verifier; }; componentDidMount() { From 3590c97d96d0b9a739d266067d15999924b9178c Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Wed, 29 Jan 2020 15:24:06 +0100 Subject: [PATCH 366/906] unrelated fix: rerender hidden event tile when decrypted to get accurate type --- src/components/views/messages/ViewSourceEvent.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/components/views/messages/ViewSourceEvent.js b/src/components/views/messages/ViewSourceEvent.js index 62cf45fb6e..9064fc3b68 100644 --- a/src/components/views/messages/ViewSourceEvent.js +++ b/src/components/views/messages/ViewSourceEvent.js @@ -32,6 +32,13 @@ export default class ViewSourceEvent extends React.PureComponent { }; } + componentDidMount() { + const {mxEvent} = this.props; + if (mxEvent.isBeingDecrypted()) { + mxEvent.once("Event.decrypted", () => this.forceUpdate()); + } + } + onToggle = (ev) => { ev.preventDefault(); const { expanded } = this.state; From 6d47f9620f12fe50efc4220a5ed7b71a40fd5358 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 29 Jan 2020 14:28:19 +0000 Subject: [PATCH 367/906] Adjust icons with in person with design --- res/css/views/rooms/_InviteOnlyIcon.scss | 2 +- res/css/views/rooms/_MessageComposer.scss | 4 ++-- res/css/views/rooms/_RoomHeader.scss | 8 ++++---- res/css/views/rooms/_RoomTile.scss | 15 +++++---------- 4 files changed, 12 insertions(+), 17 deletions(-) diff --git a/res/css/views/rooms/_InviteOnlyIcon.scss b/res/css/views/rooms/_InviteOnlyIcon.scss index e70586bb73..f4d9e4869f 100644 --- a/res/css/views/rooms/_InviteOnlyIcon.scss +++ b/res/css/views/rooms/_InviteOnlyIcon.scss @@ -20,7 +20,7 @@ limitations under the License. position: relative; display: block !important; // Align the padlock with unencrypted room names - margin-left: 6px; + margin: 0 4px; &::before { background-color: $roomtile-name-color; diff --git a/res/css/views/rooms/_MessageComposer.scss b/res/css/views/rooms/_MessageComposer.scss index fae9d0dfe3..a05b4c0c0e 100644 --- a/res/css/views/rooms/_MessageComposer.scss +++ b/res/css/views/rooms/_MessageComposer.scss @@ -76,8 +76,8 @@ limitations under the License. left: 60px; margin-right: 0; // Counteract the E2EIcon class margin-left: 3px; // Counteract the E2EIcon class - width: 12px; - height: 12px; + width: 15px; + height: 15px; } .mx_MessageComposer_noperm_error { diff --git a/res/css/views/rooms/_RoomHeader.scss b/res/css/views/rooms/_RoomHeader.scss index 6f0377b29c..47b8131ef0 100644 --- a/res/css/views/rooms/_RoomHeader.scss +++ b/res/css/views/rooms/_RoomHeader.scss @@ -21,10 +21,10 @@ limitations under the License. .mx_E2EIcon { margin: 0; position: absolute; - bottom: -1px; - right: -2px; - height: 10px; - width: 10px; + bottom: -2px; + right: -6px; + height: 15px; + width: 15px; } } diff --git a/res/css/views/rooms/_RoomTile.scss b/res/css/views/rooms/_RoomTile.scss index a24fdf2629..31d887cbbb 100644 --- a/res/css/views/rooms/_RoomTile.scss +++ b/res/css/views/rooms/_RoomTile.scss @@ -101,19 +101,19 @@ limitations under the License. // Note we match .mx_E2EIcon to make sure this matches more tightly than just // .mx_E2EIcon on its own .mx_RoomTile_e2eIcon.mx_E2EIcon { - height: 10px; - width: 10px; + height: 14px; + width: 14px; display: block; position: absolute; - bottom: -1px; - right: -2px; + bottom: -2px; + right: -5px; z-index: 1; margin: 0; } .mx_RoomTile_name { font-size: 14px; - padding: 0 6px; + padding: 0 4px; color: $roomtile-name-color; white-space: nowrap; overflow-x: hidden; @@ -214,8 +214,3 @@ limitations under the License. .mx_GroupInviteTile .mx_RoomTile_name { flex: 1; } - -.mx_InviteOnlyIcon + .mx_RoomTile_nameContainer .mx_RoomTile_name { - // Scoot the padding in a bit from 6px to make it look better - padding-left: 3px; -} From 44bc0d9fb19bddf39d44ec1192fe1c324dee87e2 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Wed, 29 Jan 2020 15:45:36 +0100 Subject: [PATCH 368/906] phase is a prop now --- src/components/views/right_panel/VerificationPanel.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index a34dfbfdd0..e78f20c743 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -217,7 +217,6 @@ export default class VerificationPanel extends React.PureComponent { }; _onRequestChange = async () => { - this.forceUpdate(); const {request} = this.props; const hadVerifier = this._hasVerifier; this._hasVerifier = !!request.verifier; From f12fe984e5275df6df6fd42d56526f5860658ff0 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 29 Jan 2020 15:00:01 +0000 Subject: [PATCH 369/906] Change new session toast to unverified This also changes text to show the device ID and name in the toast. Fixes https://github.com/vector-im/riot-web/issues/11916 --- res/css/structures/_ToastContainer.scss | 4 ++++ src/DeviceListener.js | 8 ++++---- ...sionToast.js => UnverifiedSessionToast.js} | 20 ++++++++++++------- src/i18n/strings/en_EN.json | 7 +++---- 4 files changed, 24 insertions(+), 15 deletions(-) rename src/components/views/toasts/{NewSessionToast.js => UnverifiedSessionToast.js} (76%) diff --git a/res/css/structures/_ToastContainer.scss b/res/css/structures/_ToastContainer.scss index 5b5c49f357..d1687743d6 100644 --- a/res/css/structures/_ToastContainer.scss +++ b/res/css/structures/_ToastContainer.scss @@ -98,5 +98,9 @@ limitations under the License. margin: 4px 0 11px 0; font-size: 12px; } + + .mx_Toast_deviceID { + font-size: 10px; + } } } diff --git a/src/DeviceListener.js b/src/DeviceListener.js index 630d1a61c0..4bc6ce2097 100644 --- a/src/DeviceListener.js +++ b/src/DeviceListener.js @@ -21,7 +21,7 @@ import { _t } from './languageHandler'; import ToastStore from './stores/ToastStore'; function toastKey(deviceId) { - return 'newsession_' + deviceId; + return 'unverified_session_' + deviceId; } const KEY_BACKUP_POLL_INTERVAL = 5 * 60 * 1000; @@ -160,10 +160,10 @@ export default class DeviceListener { this._activeNagToasts.add(device.deviceId); ToastStore.sharedInstance().addOrReplaceToast({ key: toastKey(device.deviceId), - title: _t("New Session"), + title: _t("Unverified session"), icon: "verification_warning", - props: {deviceId: device.deviceId}, - component: sdk.getComponent("toasts.NewSessionToast"), + props: { device }, + component: sdk.getComponent("toasts.UnverifiedSessionToast"), }); newActiveToasts.add(device.deviceId); } diff --git a/src/components/views/toasts/NewSessionToast.js b/src/components/views/toasts/UnverifiedSessionToast.js similarity index 76% rename from src/components/views/toasts/NewSessionToast.js rename to src/components/views/toasts/UnverifiedSessionToast.js index 80564f3494..cf982741a1 100644 --- a/src/components/views/toasts/NewSessionToast.js +++ b/src/components/views/toasts/UnverifiedSessionToast.js @@ -24,11 +24,11 @@ import NewSessionReviewDialog from '../dialogs/NewSessionReviewDialog'; import FormButton from '../elements/FormButton'; import { replaceableComponent } from '../../../utils/replaceableComponent'; -@replaceableComponent("views.toasts.VerifySessionToast") -export default class VerifySessionToast extends React.PureComponent { +@replaceableComponent("views.toasts.UnverifiedSessionToast") +export default class UnverifiedSessionToast extends React.PureComponent { static propTypes = { toastKey: PropTypes.string.isRequired, - deviceId: PropTypes.string, + device: PropTypes.object.isRequired, }; _onLaterClick = () => { @@ -36,9 +36,7 @@ export default class VerifySessionToast extends React.PureComponent { }; _onReviewClick = async () => { - const cli = MatrixClientPeg.get(); - - const device = await cli.getStoredDevice(cli.getUserId(), this.props.deviceId); + const { device } = this.props; Modal.createTrackedDialog('New Session Review', 'Starting dialog', NewSessionReviewDialog, { userId: MatrixClientPeg.get().getUserId(), @@ -47,8 +45,16 @@ export default class VerifySessionToast extends React.PureComponent { }; render() { + const { device } = this.props; + return (
    -
    {_t("Review & verify your new session")}
    +
    + + {device.getDisplayName()} + + ({device.deviceId}) + +
    diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 3ae0991f16..c064c7c8fd 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -91,7 +91,7 @@ "Verify this session": "Verify this session", "Encryption upgrade available": "Encryption upgrade available", "Set up encryption": "Set up encryption", - "New Session": "New Session", + "Unverified session": "Unverified session", "Who would you like to add to this community?": "Who would you like to add to this community?", "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID", "Invite new community members": "Invite new community members", @@ -516,13 +516,12 @@ "Headphones": "Headphones", "Folder": "Folder", "Pin": "Pin", - "Review & verify your new session": "Review & verify your new session", - "Later": "Later", - "Review": "Review", "Verify your other devices easier": "Verify your other devices easier", "Other users may not trust it": "Other users may not trust it", "Upgrade": "Upgrade", "Verify": "Verify", + "Later": "Later", + "Review": "Review", "Decline (%(counter)s)": "Decline (%(counter)s)", "Accept to continue:": "Accept to continue:", "Upload": "Upload", From 00fa7cce57498d0c2ab1963f75029baa4ff5956e Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 29 Jan 2020 15:02:52 +0000 Subject: [PATCH 370/906] Appease the linter --- src/MatrixClientPeg.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/MatrixClientPeg.js b/src/MatrixClientPeg.js index db99f38738..98fcc85d60 100644 --- a/src/MatrixClientPeg.js +++ b/src/MatrixClientPeg.js @@ -218,7 +218,11 @@ class _MatrixClientPeg { timelineSupport: true, forceTURN: !SettingsStore.getValue('webRtcAllowPeerToPeer', false), fallbackICEServerAllowed: !!SettingsStore.getValue('fallbackICEServerAllowed'), - verificationMethods: [verificationMethods.SAS, SHOW_QR_CODE_METHOD, verificationMethods.RECIPROCATE_QR_CODE], + verificationMethods: [ + verificationMethods.SAS, + SHOW_QR_CODE_METHOD, + verificationMethods.RECIPROCATE_QR_CODE, + ], unstableClientRelationAggregation: true, identityServer: new IdentityAuthClient(), }; From b96ad4a4f09b6edfebf279a6d4ebda65dd04ebdd Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 29 Jan 2020 15:07:43 +0000 Subject: [PATCH 371/906] Don't peek until the matrix client is ready When the client loaded, we'd load the room view which would try to get a room object from the client, fail because the client wasn't ready, think it's because the user wasn't joined to the room and start peeking instead. Coupled with the bug fixed by https://github.com/matrix-org/matrix-js-sdk/pull/1188 this would have caused https://github.com/vector-im/riot-web/issues/11120 --- src/stores/RoomViewStore.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/stores/RoomViewStore.js b/src/stores/RoomViewStore.js index d9204193e4..9bcc2815e6 100644 --- a/src/stores/RoomViewStore.js +++ b/src/stores/RoomViewStore.js @@ -46,6 +46,7 @@ const INITIAL_STATE = { forwardingEvent: null, quotingEvent: null, + matrixClientIsReady: false, }; /** @@ -59,6 +60,9 @@ class RoomViewStore extends Store { // Initialise state this._state = INITIAL_STATE; + if (MatrixClientPeg.get()) { + this._state.matrixClientIsReady = MatrixClientPeg.get().isInitialSyncComplete(); + } } _setState(newState) { @@ -136,6 +140,11 @@ class RoomViewStore extends Store { }, /*className=*/null, /*isPriority=*/false, /*isStatic=*/true); break; } + case 'sync_state': + this._setState({ + matrixClientIsReady: MatrixClientPeg.get().isInitialSyncComplete(), + }); + break; } } @@ -350,7 +359,7 @@ class RoomViewStore extends Store { } shouldPeek() { - return this._state.shouldPeek; + return this._state.shouldPeek && this._state.matrixClientIsReady; } } From b5914f5c2bb7ee2f44440d78e16d8607ea75d1e9 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 29 Jan 2020 15:14:56 +0000 Subject: [PATCH 372/906] Fix later button --- src/components/views/toasts/UnverifiedSessionToast.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/toasts/UnverifiedSessionToast.js b/src/components/views/toasts/UnverifiedSessionToast.js index cf982741a1..15cf18f47d 100644 --- a/src/components/views/toasts/UnverifiedSessionToast.js +++ b/src/components/views/toasts/UnverifiedSessionToast.js @@ -32,7 +32,8 @@ export default class UnverifiedSessionToast extends React.PureComponent { }; _onLaterClick = () => { - DeviceListener.sharedInstance().dismissVerification(this.props.deviceId); + const { device } = this.props; + DeviceListener.sharedInstance().dismissVerification(device.deviceId); }; _onReviewClick = async () => { From 81ee27f41e07234c3b84a7e801861e7d18ee22c9 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 29 Jan 2020 15:48:25 +0000 Subject: [PATCH 373/906] Replace device with session in UI text This replaces "device" with "session" throughout user-visible text at the React layer. Variable names and comments are left as-is for now. --- src/Analytics.js | 2 +- src/CallHandler.js | 2 +- src/Lifecycle.js | 2 +- src/SlashCommands.js | 12 +- .../views/dialogs/EncryptedEventDialog.js | 2 +- .../keybackup/CreateKeyBackupDialog.js | 2 +- .../keybackup/NewRecoveryMethodDialog.js | 2 +- .../keybackup/RecoveryMethodRemovedDialog.js | 4 +- .../CreateSecretStorageDialog.js | 8 +- src/components/structures/RoomStatusBar.js | 6 +- src/components/structures/RoomView.js | 2 +- .../structures/auth/CompleteSecurity.js | 2 +- .../structures/auth/ForgotPassword.js | 8 +- src/components/structures/auth/SoftLogout.js | 8 +- .../views/dialogs/ConfirmWipeDeviceDialog.js | 4 +- .../views/dialogs/DeviceVerifyDialog.js | 18 +- .../views/dialogs/IncomingSasDialog.js | 6 +- .../views/dialogs/KeyShareDialog.js | 8 +- src/components/views/dialogs/LogoutDialog.js | 2 +- .../views/dialogs/SetPasswordDialog.js | 4 +- .../views/dialogs/UnknownDeviceDialog.js | 12 +- .../AccessSecretStorageDialog.js | 4 +- .../views/right_panel/EncryptionInfo.js | 2 +- .../views/right_panel/EncryptionPanel.js | 2 +- src/components/views/right_panel/UserInfo.js | 2 +- src/components/views/rooms/E2EIcon.js | 16 +- src/components/views/rooms/EventTile.js | 14 +- src/components/views/rooms/MemberInfo.js | 8 +- .../views/rooms/RoomRecoveryReminder.js | 2 +- .../views/settings/ChangePassword.js | 2 +- .../views/settings/CrossSigningPanel.js | 4 +- src/components/views/settings/DevicesPanel.js | 10 +- .../views/settings/DevicesPanelEntry.js | 2 +- .../views/settings/KeyBackupPanel.js | 32 +-- .../views/settings/Notifications.js | 4 +- .../tabs/user/GeneralUserSettingsTab.js | 2 +- .../tabs/user/SecurityUserSettingsTab.js | 8 +- .../views/toasts/SetupEncryptionToast.js | 2 +- src/i18n/strings/en_EN.json | 191 +++++++++--------- src/settings/Settings.js | 6 +- 40 files changed, 214 insertions(+), 215 deletions(-) diff --git a/src/Analytics.js b/src/Analytics.js index d0c7a52814..6ec50cc25f 100644 --- a/src/Analytics.js +++ b/src/Analytics.js @@ -272,7 +272,7 @@ class Analytics { ), }, { expl: _td('Your User Agent'), value: navigator.userAgent }, - { expl: _td('Your device resolution'), value: resolution }, + { expl: _td('Your session resolution'), value: resolution }, ]; const ErrorDialog = sdk.getComponent('dialogs.ErrorDialog'); diff --git a/src/CallHandler.js b/src/CallHandler.js index 33e15d3cc9..1551b57313 100644 --- a/src/CallHandler.js +++ b/src/CallHandler.js @@ -139,7 +139,7 @@ function _setCallListeners(call) { Modal.createTrackedDialog('Call Failed', '', QuestionDialog, { title: _t('Call Failed'), description: _t( - "There are unknown devices in this room: "+ + "There are unknown sessions in this room: "+ "if you proceed without verifying them, it will be "+ "possible for someone to eavesdrop on your call.", ), diff --git a/src/Lifecycle.js b/src/Lifecycle.js index 7488488dd8..303bae42b1 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -378,7 +378,7 @@ export function hydrateSession(credentials) { const overwrite = credentials.userId !== oldUserId || credentials.deviceId !== oldDeviceId; if (overwrite) { - console.warn("Clearing all data: Old session belongs to a different user/device"); + console.warn("Clearing all data: Old session belongs to a different user/session"); } return _doSetLoggedIn(credentials, overwrite); diff --git a/src/SlashCommands.js b/src/SlashCommands.js index 2eb34576ac..b39b8fb9ac 100644 --- a/src/SlashCommands.js +++ b/src/SlashCommands.js @@ -771,7 +771,7 @@ export const CommandMap = { verify: new Command({ name: 'verify', args: ' ', - description: _td('Verifies a user, device, and pubkey tuple'), + description: _td('Verifies a user, session, and pubkey tuple'), runFn: function(roomId, args) { if (args) { const matches = args.match(/^(\S+) +(\S+) +(\S+)$/); @@ -785,22 +785,22 @@ export const CommandMap = { return success((async () => { const device = await cli.getStoredDevice(userId, deviceId); if (!device) { - throw new Error(_t('Unknown (user, device) pair:') + ` (${userId}, ${deviceId})`); + throw new Error(_t('Unknown (user, session) pair:') + ` (${userId}, ${deviceId})`); } const deviceTrust = await cli.checkDeviceTrust(userId, deviceId); if (deviceTrust.isVerified()) { if (device.getFingerprint() === fingerprint) { - throw new Error(_t('Device already verified!')); + throw new Error(_t('Session already verified!')); } else { - throw new Error(_t('WARNING: Device already verified, but keys do NOT MATCH!')); + throw new Error(_t('WARNING: Session already verified, but keys do NOT MATCH!')); } } if (device.getFingerprint() !== fingerprint) { const fprint = device.getFingerprint(); throw new Error( - _t('WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device' + + _t('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!', { @@ -821,7 +821,7 @@ export const CommandMap = {

    { _t('The signing key you provided matches the signing key you received ' + - 'from %(userId)s\'s device %(deviceId)s. Device marked as verified.', + 'from %(userId)s\'s session %(deviceId)s. Session marked as verified.', {userId, deviceId}) }

    diff --git a/src/async-components/views/dialogs/EncryptedEventDialog.js b/src/async-components/views/dialogs/EncryptedEventDialog.js index f6e17b1c84..b602cf60fe 100644 --- a/src/async-components/views/dialogs/EncryptedEventDialog.js +++ b/src/async-components/views/dialogs/EncryptedEventDialog.js @@ -191,7 +191,7 @@ export default createReactClass({

    { _t('Event information') }

    { this._renderEventInfo() } -

    { _t('Sender device information') }

    +

    { _t('Sender session information') }

    { this._renderDeviceInfo() }
    diff --git a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js index 8940239cfd..09abb2677d 100644 --- a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js +++ b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js @@ -495,7 +495,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent { return
    {_t( "Without setting up Secure Message Recovery, you won't be able to restore your " + - "encrypted message history if you log out or use another device.", + "encrypted message history if you log out or use another session.", )} {newMethodDetected}

    {_t( - "This device is encrypting history using the new recovery method.", + "This session is encrypting history using the new recovery method.", )}

    {hackWarning}

    {_t( - "This device has detected that your recovery passphrase and key " + + "This session has detected that your recovery passphrase and key " + "for Secure Messages have been removed.", )}

    {_t( "If you did this accidentally, you can setup Secure Messages on " + - "this device which will re-encrypt this device's message " + + "this session which will re-encrypt this session's message " + "history with a new recovery method.", )}

    {_t( diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 4068f72217..c3b74381ff 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -424,7 +424,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { return

    {_t( - "Upgrade this device to allow it to verify other devices, " + + "Upgrade this session to allow it to verify other sessions, " + "granting them access to encrypted messages and marking them " + "as trusted for other users.", )}

    @@ -471,7 +471,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { return

    {_t( - "Set up encryption on this device to allow it to verify other devices, " + + "Set up encryption on this session to allow it to verify other sessions, " + "granting them access to encrypted messages and marking them as trusted for other users.", )}

    {_t( @@ -665,7 +665,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); return

    {_t( - "This device can now verify other devices, granting them access " + + "This session can now verify other sessions, granting them access " + "to encrypted messages and marking them as trusted for other users.", )}

    {_t( @@ -682,7 +682,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); return

    {_t( - "Without completing security on this device, it won’t have " + + "Without completing security on this session, it won’t have " + "access to encrypted messages.", )} Show devices, send anyway or cancel.", + "Show sessions, send anyway or cancel.", {}, { - 'showDevicesText': (sub) => { sub }, + 'showSessionsText': (sub) => { sub }, 'sendAnywayText': (sub) => { sub }, 'cancelText': (sub) => { sub }, }, diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 2d669f9243..24eaa7a410 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -820,7 +820,7 @@ export default createReactClass({ this.setState({ e2eStatus: "warning", }); - debuglog("e2e status set to warning as not all users trust all of their devices." + + debuglog("e2e status set to warning as not all users trust all of their sessions." + " Aborted on user", userId); return; } diff --git a/src/components/structures/auth/CompleteSecurity.js b/src/components/structures/auth/CompleteSecurity.js index 0f30d9cf61..66834deb2c 100644 --- a/src/components/structures/auth/CompleteSecurity.js +++ b/src/components/structures/auth/CompleteSecurity.js @@ -197,7 +197,7 @@ export default class CompleteSecurity extends React.Component { body = (

    {_t( - "Without completing security on this device, it won’t have " + + "Without completing security on this session, it won’t have " + "access to encrypted messages.", )}

    diff --git a/src/components/structures/auth/ForgotPassword.js b/src/components/structures/auth/ForgotPassword.js index 4576067caa..0fc4a9af1e 100644 --- a/src/components/structures/auth/ForgotPassword.js +++ b/src/components/structures/auth/ForgotPassword.js @@ -152,8 +152,8 @@ export default createReactClass({
    { _t( "Changing your password will reset any end-to-end encryption keys " + - "on all of your devices, making encrypted chat history unreadable. Set up " + - "Key Backup or export your room keys from another device before resetting your " + + "on all of your sessions, making encrypted chat history unreadable. Set up " + + "Key Backup or export your room keys from another session before resetting your " + "password.", ) }
    , @@ -358,9 +358,9 @@ export default createReactClass({ return

    {_t("Your password has been reset.")}

    {_t( - "You have been logged out of all devices and will no longer receive " + + "You have been logged out of all sessions and will no longer receive " + "push notifications. To re-enable notifications, sign in again on each " + - "device.", + "session.", )}

    diff --git a/src/components/structures/auth/SoftLogout.js b/src/components/structures/auth/SoftLogout.js index 40800ad907..06838798c7 100644 --- a/src/components/structures/auth/SoftLogout.js +++ b/src/components/structures/auth/SoftLogout.js @@ -83,7 +83,7 @@ export default class SoftLogout extends React.Component { onFinished: (wipeData) => { if (!wipeData) return; - console.log("Clearing data from soft-logged-out device"); + console.log("Clearing data from soft-logged-out session"); Lifecycle.logout(); }, }); @@ -212,8 +212,8 @@ export default class SoftLogout extends React.Component { let introText = null; // null is translated to something area specific in this function if (this.state.keyBackupNeeded) { introText = _t( - "Regain access to your account and recover encryption keys stored on this device. " + - "Without them, you won’t be able to read all of your secure messages on any device."); + "Regain access to your account and recover encryption keys stored on this session. " + + "Without them, you won’t be able to read all of your secure messages on any session."); } if (this.state.loginView === LOGIN_VIEW.PASSWORD) { @@ -306,7 +306,7 @@ export default class SoftLogout extends React.Component {

    {_t( "Warning: Your personal data (including encryption keys) is still stored " + - "on this device. Clear it if you're finished using this device, or want to sign " + + "on this session. Clear it if you're finished using this session, or want to sign " + "in to another account.", )}

    diff --git a/src/components/views/dialogs/ConfirmWipeDeviceDialog.js b/src/components/views/dialogs/ConfirmWipeDeviceDialog.js index 49b558976a..2672d3e0f2 100644 --- a/src/components/views/dialogs/ConfirmWipeDeviceDialog.js +++ b/src/components/views/dialogs/ConfirmWipeDeviceDialog.js @@ -39,11 +39,11 @@ export default class ConfirmWipeDeviceDialog extends React.Component { return ( + title={_t("Clear all data on this session?")}>

    {_t( - "Clearing all data from this device is permanent. Encrypted messages will be lost " + + "Clearing all data from this session is permanent. Encrypted messages will be lost " + "unless their keys have been backed up.", )}

    diff --git a/src/components/views/dialogs/DeviceVerifyDialog.js b/src/components/views/dialogs/DeviceVerifyDialog.js index f2368ad795..89cf449eba 100644 --- a/src/components/views/dialogs/DeviceVerifyDialog.js +++ b/src/components/views/dialogs/DeviceVerifyDialog.js @@ -172,7 +172,7 @@ export default class DeviceVerifyDialog extends React.Component { const BaseDialog = sdk.getComponent("dialogs.BaseDialog"); return ( {body} @@ -262,12 +262,12 @@ export default class DeviceVerifyDialog extends React.Component { let text; if (MatrixClientPeg.get().getUserId() === this.props.userId) { - text = _t("To verify that this device can be trusted, please check that the key you see " + + text = _t("To verify that this session can be trusted, please check that the key you see " + "in User Settings on that device matches the key below:"); } else { - text = _t("To verify that this device can be trusted, please contact its owner using some other " + + text = _t("To verify that this session can be trusted, please contact its owner using some other " + "means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings " + - "for this device matches the key below:"); + "for this session matches the key below:"); } const key = FormattingUtils.formatCryptoKey(this.props.device.getFingerprint()); @@ -283,14 +283,14 @@ export default class DeviceVerifyDialog extends React.Component {

      -
    • { this.props.device.getDisplayName() }
    • -
    • { this.props.device.deviceId }
    • -
    • { key }
    • +
    • { this.props.device.getDisplayName() }
    • +
    • { this.props.device.deviceId }
    • +
    • { key }

    { _t("If it matches, press the verify button below. " + - "If it doesn't, then someone else is intercepting this device " + + "If it doesn't, then someone else is intercepting this session " + "and you probably want to press the blacklist button instead.") }

    @@ -298,7 +298,7 @@ export default class DeviceVerifyDialog extends React.Component { return (

    {_t( - // NB. Below wording adjusted to singular 'device' until we have + // NB. Below wording adjusted to singular 'session' until we have // cross-signing - "Verifying this user will mark their device as trusted, and " + - "also mark your device as trusted to them.", + "Verifying this user will mark their session as trusted, and " + + "also mark your session as trusted to them.", )}

    -

    { _t('Loading device info...') }

    +

    { _t('Loading session info...') }

    ); diff --git a/src/components/views/dialogs/LogoutDialog.js b/src/components/views/dialogs/LogoutDialog.js index a27ab6079b..fed1310469 100644 --- a/src/components/views/dialogs/LogoutDialog.js +++ b/src/components/views/dialogs/LogoutDialog.js @@ -138,7 +138,7 @@ export default class LogoutDialog extends React.Component { const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); let setupButtonCaption; if (this.state.backupInfo) { - setupButtonCaption = _t("Connect this device to Key Backup"); + setupButtonCaption = _t("Connect this session to Key Backup"); } else { // if there's an error fetching the backup info, we'll just assume there's // no backup for the purpose of the button caption diff --git a/src/components/views/dialogs/SetPasswordDialog.js b/src/components/views/dialogs/SetPasswordDialog.js index c8752afa6c..3797957568 100644 --- a/src/components/views/dialogs/SetPasswordDialog.js +++ b/src/components/views/dialogs/SetPasswordDialog.js @@ -29,7 +29,7 @@ const WarmFuzzy = function(props) { if (props.didSetEmail) { title = _t('You have successfully set a password and an email address!'); } - const advice = _t('You can now return to your account after signing out, and sign in on other devices.'); + const advice = _t('You can now return to your account after signing out, and sign in on other sessions.'); let extraAdvice = null; if (!props.didSetEmail) { extraAdvice = _t('Remember, you can always set an email address in user settings if you change your mind.'); @@ -114,7 +114,7 @@ export default createReactClass({ >

    - { _t('This will allow you to return to your account after signing out, and sign in on other devices.') } + { _t('This will allow you to return to your account after signing out, and sign in on other sessions.') }

    - { _t("You are currently blacklisting unverified devices; to send " + - "messages to these devices you must verify them.") } + { _t("You are currently blacklisting unverified sessions; to send " + + "messages to these sessions you must verify them.") } ); } else { @@ -141,7 +141,7 @@ export default createReactClass({

    { _t("We recommend you go through the verification process " + - "for each device to confirm they belong to their legitimate owner, " + + "for each session to confirm they belong to their legitimate owner, " + "but you can resend the message without verifying if you prefer.") }

    @@ -165,15 +165,15 @@ export default createReactClass({ return (

    - { _t('"%(RoomName)s" contains devices that you haven\'t seen before.', {RoomName: this.props.room.name}) } + { _t('"%(RoomName)s" contains sessions that you haven\'t seen before.', {RoomName: this.props.room.name}) }

    { warning } - { _t("Unknown devices") }: + { _t("Unknown sessions") }:
    diff --git a/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js b/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js index c976eb81d0..08d9f8dd5e 100644 --- a/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js +++ b/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js @@ -146,7 +146,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent { )}

    {_t( "Access your secure message history and your cross-signing " + - "identity for verifying other devices by entering your passphrase.", + "identity for verifying other sessions by entering your passphrase.", )}

    @@ -218,7 +218,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent { )}

    {_t( "Access your secure message history and your cross-signing " + - "identity for verifying other devices by entering your recovery key.", + "identity for verifying other sessions by entering your recovery key.", )}

    diff --git a/src/components/views/right_panel/EncryptionInfo.js b/src/components/views/right_panel/EncryptionInfo.js index 299e553769..040b0a7929 100644 --- a/src/components/views/right_panel/EncryptionInfo.js +++ b/src/components/views/right_panel/EncryptionInfo.js @@ -55,7 +55,7 @@ const EncryptionInfo = ({pending, member, onStartVerification}) => {

    {_t("Verify User")}

    -

    {_t("For extra security, verify this user by checking a one-time code on both of your devices.")}

    +

    {_t("For extra security, verify this user by checking a one-time code on both of your sessions.")}

    {_t("To be secure, do this in person or use a trusted way to communicate.")}

    { content }
    diff --git a/src/components/views/right_panel/EncryptionPanel.js b/src/components/views/right_panel/EncryptionPanel.js index 4e147bd7a5..6819db8e55 100644 --- a/src/components/views/right_panel/EncryptionPanel.js +++ b/src/components/views/right_panel/EncryptionPanel.js @@ -50,7 +50,7 @@ const EncryptionPanel = ({verificationRequest, member, onClose}) => {
  • {_t("Your homeserver")}
  • {_t("The homeserver the user you’re verifying is connected to")}
  • {_t("Yours, or the other users’ internet connection")}
  • -
  • {_t("Yours, or the other users’ device")}
  • +
  • {_t("Yours, or the other users’ session")}
  • , onFinished: onClose, diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index f189380eac..5a5d9a577c 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -208,7 +208,7 @@ function DevicesSection({devices, userId, loading}) { return ; } if (devices === null) { - return _t("Unable to load device list"); + return _t("Unable to load session list"); } const isMe = userId === cli.getUserId(); const deviceTrusts = devices.map(d => cli.checkDeviceTrust(userId, d.deviceId)); diff --git a/src/components/views/rooms/E2EIcon.js b/src/components/views/rooms/E2EIcon.js index df5fe204d4..ade44aa7c8 100644 --- a/src/components/views/rooms/E2EIcon.js +++ b/src/components/views/rooms/E2EIcon.js @@ -32,23 +32,23 @@ export const E2E_STATE = { }; const crossSigningUserTitles = { - [E2E_STATE.WARNING]: _td("This user has not verified all of their devices."), - [E2E_STATE.NORMAL]: _td("You have not verified this user. This user has verified all of their devices."), - [E2E_STATE.VERIFIED]: _td("You have verified this user. This user has verified all of their devices."), + [E2E_STATE.WARNING]: _td("This user has not verified all of their sessions."), + [E2E_STATE.NORMAL]: _td("You have not verified this user. This user has verified all of their sessions."), + [E2E_STATE.VERIFIED]: _td("You have verified this user. This user has verified all of their sessions."), }; const crossSigningRoomTitles = { - [E2E_STATE.WARNING]: _td("Someone is using an unknown device"), + [E2E_STATE.WARNING]: _td("Someone is using an unknown session"), [E2E_STATE.NORMAL]: _td("This room is end-to-end encrypted"), [E2E_STATE.VERIFIED]: _td("Everyone in this room is verified"), }; const legacyUserTitles = { - [E2E_STATE.WARNING]: _td("Some devices for this user are not trusted"), - [E2E_STATE.VERIFIED]: _td("All devices for this user are trusted"), + [E2E_STATE.WARNING]: _td("Some sessions for this user are not trusted"), + [E2E_STATE.VERIFIED]: _td("All sessions for this user are trusted"), }; const legacyRoomTitles = { - [E2E_STATE.WARNING]: _td("Some devices in this encrypted room are not trusted"), - [E2E_STATE.VERIFIED]: _td("All devices in this encrypted room are trusted"), + [E2E_STATE.WARNING]: _td("Some sessions in this encrypted room are not trusted"), + [E2E_STATE.VERIFIED]: _td("All sessions in this encrypted room are trusted"), }; const E2EIcon = ({isUser, status, className, size, onClick}) => { diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index 7d07e03b58..a8e9c7bf81 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -733,15 +733,15 @@ export default createReactClass({

    { this.state.previouslyRequestedKeys ? - _t( 'Your key share request has been sent - please check your other devices ' + + _t( 'Your key share request has been sent - please check your other sessions ' + 'for key share requests.') : - _t( 'Key share requests are sent to your other devices automatically. If you ' + - 'rejected or dismissed the key share request on your other devices, click ' + + _t( '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.') }

    - { _t( 'If your other devices do not have the key for this message you will not ' + + { _t( 'If your other sessions do not have the key for this message you will not ' + 'be able to decrypt them.') }

    @@ -749,7 +749,7 @@ export default createReactClass({ const keyRequestInfoContent = this.state.previouslyRequestedKeys ? _t('Key request sent.') : _t( - 'Re-request encryption keys from your other devices.', + 'Re-request encryption keys from your other sessions.', {}, {'requestLink': (sub) => { sub }}, ); @@ -938,7 +938,7 @@ function E2ePadlockUndecryptable(props) { function E2ePadlockUnverified(props) { return ( - + ); } @@ -950,7 +950,7 @@ function E2ePadlockUnencrypted(props) { function E2ePadlockUnknown(props) { return ( - + ); } diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js index 7c77c546b6..7c187bd17a 100644 --- a/src/components/views/rooms/MemberInfo.js +++ b/src/components/views/rooms/MemberInfo.js @@ -260,7 +260,7 @@ export default createReactClass({ e2eStatus: self._getE2EStatus(devices), }); }, function(err) { - console.log("Error downloading devices", err); + console.log("Error downloading sessions", err); self.setState({devicesLoading: false}); }); }, @@ -766,9 +766,9 @@ export default createReactClass({ // still loading devComponents = ; } else if (devices === null) { - devComponents = _t("Unable to load device list"); + devComponents = _t("Unable to load session list"); } else if (devices.length === 0) { - devComponents = _t("No devices with registered encryption keys"); + devComponents = _t("No sessions with registered encryption keys"); } else { devComponents = []; for (let i = 0; i < devices.length; i++) { @@ -780,7 +780,7 @@ export default createReactClass({ return (
    -

    { _t("Devices") }

    +

    { _t("Sessions") }

    { devComponents }
    diff --git a/src/components/views/rooms/RoomRecoveryReminder.js b/src/components/views/rooms/RoomRecoveryReminder.js index 6ce5e8153a..50521cdd37 100644 --- a/src/components/views/rooms/RoomRecoveryReminder.js +++ b/src/components/views/rooms/RoomRecoveryReminder.js @@ -124,7 +124,7 @@ export default class RoomRecoveryReminder extends React.PureComponent { let setupCaption; if (this.state.backupInfo) { - setupCaption = _t("Connect this device to Key Backup"); + setupCaption = _t("Connect this session to Key Backup"); } else { setupCaption = _t("Start using Key Backup"); } diff --git a/src/components/views/settings/ChangePassword.js b/src/components/views/settings/ChangePassword.js index 2d8c4c4178..291313a463 100644 --- a/src/components/views/settings/ChangePassword.js +++ b/src/components/views/settings/ChangePassword.js @@ -113,7 +113,7 @@ export default createReactClass({ description:
    { _t( - 'Changing password will currently reset any end-to-end encryption keys on all devices, ' + + '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.', diff --git a/src/components/views/settings/CrossSigningPanel.js b/src/components/views/settings/CrossSigningPanel.js index f7d3d62b4f..f99968c44f 100644 --- a/src/components/views/settings/CrossSigningPanel.js +++ b/src/components/views/settings/CrossSigningPanel.js @@ -127,7 +127,7 @@ export default class CrossSigningPanel extends React.PureComponent { } else if (crossSigningPrivateKeysInStorage) { summarisedStatus =

    {_t( "Your account has a cross-signing identity in secret storage, but it " + - "is not yet trusted by this device.", + "is not yet trusted by this session.", )}

    ; } else { summarisedStatus =

    {_t( @@ -152,7 +152,7 @@ export default class CrossSigningPanel extends React.PureComponent { - + diff --git a/src/components/views/settings/DevicesPanel.js b/src/components/views/settings/DevicesPanel.js index 2f5262c75a..2120801a81 100644 --- a/src/components/views/settings/DevicesPanel.js +++ b/src/components/views/settings/DevicesPanel.js @@ -62,10 +62,10 @@ export default class DevicesPanel extends React.Component { let errtxt; if (error.httpStatus == 404) { // 404 probably means the HS doesn't yet support the API. - errtxt = _t("Your homeserver does not support device management."); + errtxt = _t("Your homeserver does not support session management."); } else { - console.error("Error loading devices:", error); - errtxt = _t("Unable to load device list"); + console.error("Error loading sessions:", error); + errtxt = _t("Unable to load session list"); } this.setState({deviceLoadError: errtxt}); }, @@ -130,7 +130,7 @@ export default class DevicesPanel extends React.Component { makeRequest: this._makeDeleteRequest.bind(this), }); }).catch((e) => { - console.error("Error deleting devices", e); + console.error("Error deleting sessions", e); if (this._unmounted) { return; } }).finally(() => { this.setState({ @@ -188,7 +188,7 @@ export default class DevicesPanel extends React.Component { const deleteButton = this.state.deleting ? : - { _t("Delete %(count)s devices", {count: this.state.selectedDevices.length}) } + { _t("Delete %(count)s sessions", {count: this.state.selectedDevices.length}) } ; const classes = classNames(this.props.className, "mx_DevicesPanel"); diff --git a/src/components/views/settings/DevicesPanelEntry.js b/src/components/views/settings/DevicesPanelEntry.js index d9da697e78..ff3c318a92 100644 --- a/src/components/views/settings/DevicesPanelEntry.js +++ b/src/components/views/settings/DevicesPanelEntry.js @@ -40,7 +40,7 @@ export default class DevicesPanelEntry extends React.Component { return MatrixClientPeg.get().setDeviceDetails(device.device_id, { display_name: value, }).catch((e) => { - console.error("Error setting device display name", e); + console.error("Error setting session display name", e); throw new Error(_t("Failed to set display name")); }); } diff --git a/src/components/views/settings/KeyBackupPanel.js b/src/components/views/settings/KeyBackupPanel.js index fd166782d8..f3fe171e63 100644 --- a/src/components/views/settings/KeyBackupPanel.js +++ b/src/components/views/settings/KeyBackupPanel.js @@ -186,23 +186,23 @@ export default class KeyBackupPanel extends React.PureComponent { if (MatrixClientPeg.get().getKeyBackupEnabled()) { clientBackupStatus =

    {encryptedMessageAreEncrypted}

    -

    ✅ {_t("This device is backing up your keys. ")}

    +

    ✅ {_t("This session is backing up your keys. ")}

    ; } else { clientBackupStatus =

    {encryptedMessageAreEncrypted}

    {_t( - "This device is not backing up your keys, " + + "This session is not backing up your keys, " + "but you do have an existing backup you can restore from " + "and add to going forward.", {}, {b: sub => {sub}}, )}

    {_t( - "Connect this device to key backup before signing out to avoid " + - "losing any keys that may only be on this device.", + "Connect this session to key backup before signing out to avoid " + + "losing any keys that may only be on this session.", )}

    ; - restoreButtonCaption = _t("Connect this device to Key Backup"); + restoreButtonCaption = _t("Connect this session to Key Backup"); } let keyStatus; @@ -264,42 +264,42 @@ export default class KeyBackupPanel extends React.PureComponent { ); } else if (!sig.device) { sigStatus = _t( - "Backup has a signature from unknown device with ID %(deviceId)s", + "Backup has a signature from unknown session with ID %(deviceId)s", { deviceId: sig.deviceId }, { verify }, ); } else if (sig.valid && fromThisDevice) { sigStatus = _t( - "Backup has a valid signature from this device", + "Backup has a valid signature from this session", {}, { validity }, ); } else if (!sig.valid && fromThisDevice) { // it can happen... sigStatus = _t( - "Backup has an invalid signature from this device", + "Backup has an invalid signature from this session", {}, { validity }, ); } else if (sig.valid && sig.device.isVerified()) { sigStatus = _t( "Backup has a valid signature from " + - "verified device ", + "verified session ", {}, { validity, verify, device }, ); } else if (sig.valid && !sig.device.isVerified()) { sigStatus = _t( "Backup has a valid signature from " + - "unverified device ", + "unverified session ", {}, { validity, verify, device }, ); } else if (!sig.valid && sig.device.isVerified()) { sigStatus = _t( "Backup has an invalid signature from " + - "verified device ", + "verified session ", {}, { validity, verify, device }, ); } else if (!sig.valid && !sig.device.isVerified()) { sigStatus = _t( "Backup has an invalid signature from " + - "unverified device ", + "unverified session ", {}, { validity, verify, device }, ); } @@ -309,12 +309,12 @@ export default class KeyBackupPanel extends React.PureComponent { ; }); if (this.state.backupSigStatus.sigs.length === 0) { - backupSigStatuses = _t("Backup is not signed by any of your devices"); + backupSigStatuses = _t("Backup is not signed by any of your sessions"); } let trustedLocally; if (this.state.backupSigStatus.trusted_locally) { - trustedLocally = _t("This backup is trusted because it has been restored on this device"); + trustedLocally = _t("This backup is trusted because it has been restored on this session"); } let buttonRow = ( @@ -330,7 +330,7 @@ export default class KeyBackupPanel extends React.PureComponent { if (this.state.backupKeyStored && !SettingsStore.isFeatureEnabled("feature_cross_signing")) { buttonRow =

    ⚠️ {_t( "Backup key stored in secret storage, but this feature is not " + - "enabled on this device. Please enable cross-signing in Labs to " + + "enabled on this session. Please enable cross-signing in Labs to " + "modify key backup state.", )}

    ; } @@ -352,7 +352,7 @@ export default class KeyBackupPanel extends React.PureComponent { return

    {_t( - "Your keys are not being backed up from this device.", {}, + "Your keys are not being backed up from this session.", {}, {b: sub => {sub}}, )}

    {encryptedMessageAreEncrypted}

    diff --git a/src/components/views/settings/Notifications.js b/src/components/views/settings/Notifications.js index 3bad8ba2bd..1f4bde6eab 100644 --- a/src/components/views/settings/Notifications.js +++ b/src/components/views/settings/Notifications.js @@ -864,7 +864,7 @@ export default createReactClass({ + label={_t('Enable desktop notifications for this session')} /> + label={_t('Enable audible notifications for this session')} /> { emailNotificationsRows } diff --git a/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js b/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js index 2d56df6be4..304bb6449f 100644 --- a/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/GeneralUserSettingsTab.js @@ -261,7 +261,7 @@ export default class GeneralUserSettingsTab extends React.Component { title: _t("Success"), description: _t( "Your password was successfully changed. You will not receive " + - "push notifications on other devices until you log back in to them", + "push notifications on other sessions until you log back in to them", ) + ".", }); }; diff --git a/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js b/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js index eb5f346714..2e35a6bf6f 100644 --- a/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/SecurityUserSettingsTab.js @@ -185,11 +185,11 @@ export default class SecurityUserSettingsTab extends React.Component { {_t("Cryptography")}
    • - + {deviceId}
    • - + {identityKey}
    @@ -285,9 +285,9 @@ export default class SecurityUserSettingsTab extends React.Component {
    {_t("Security & Privacy")}
    - {_t("Devices")} + {_t("Sessions")}
    - {_t("A device's public name is visible to people you communicate with")} + {_t("A session's public name is visible to people you communicate with")}
    diff --git a/src/components/views/toasts/SetupEncryptionToast.js b/src/components/views/toasts/SetupEncryptionToast.js index 841ee66ac7..31406a6ff3 100644 --- a/src/components/views/toasts/SetupEncryptionToast.js +++ b/src/components/views/toasts/SetupEncryptionToast.js @@ -39,7 +39,7 @@ export default class SetupEncryptionToast extends React.PureComponent { switch (this.props.kind) { case 'set_up_encryption': case 'upgrade_encryption': - return _t('Verify your other devices easier'); + return _t('Verify your other sessions easier'); case 'verify_this_session': return _t('Other users may not trust it'); } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index c45ccace7e..b745feda17 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -17,7 +17,7 @@ "Every page you use in the app": "Every page you use in the app", "e.g. ": "e.g. ", "Your User Agent": "Your User Agent", - "Your device resolution": "Your device resolution", + "Your session resolution": "Your session resolution", "Analytics": "Analytics", "The information being sent to us to help make Riot.im better includes:": "The information being sent to us to help make Riot.im better includes:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.", @@ -25,7 +25,7 @@ "Unable to load! Check your network connectivity and try again.": "Unable to load! Check your network connectivity and try again.", "Dismiss": "Dismiss", "Call Failed": "Call Failed", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.", + "There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.", "Review Devices": "Review Devices", "Call Anyway": "Call Anyway", "Answer Anyway": "Answer Anyway", @@ -184,13 +184,13 @@ "Adds a custom widget by URL to the room": "Adds a custom widget by URL to the room", "Please supply a https:// or http:// widget URL": "Please supply a https:// or http:// widget URL", "You cannot modify widgets in this room.": "You cannot modify widgets in this room.", - "Verifies a user, device, and pubkey tuple": "Verifies a user, device, and pubkey tuple", - "Unknown (user, device) pair:": "Unknown (user, device) pair:", - "Device already verified!": "Device already verified!", - "WARNING: Device already verified, but keys do NOT MATCH!": "WARNING: Device already verified, but keys do NOT MATCH!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!", + "Verifies a user, session, and pubkey tuple": "Verifies a user, session, and pubkey tuple", + "Unknown (user, session) pair:": "Unknown (user, session) pair:", + "Session already verified!": "Session already verified!", + "WARNING: Session already verified, but keys do NOT MATCH!": "WARNING: Session already verified, but keys do NOT MATCH!", + "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!": "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!", "Verified key": "Verified key", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.", + "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.", "Displays action": "Displays action", "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", "Sends the given message coloured as a rainbow": "Sends the given message coloured as a rainbow", @@ -373,7 +373,7 @@ "Multiple integration managers": "Multiple integration managers", "Try out new ways to ignore people (experimental)": "Try out new ways to ignore people (experimental)", "Show a presence dot next to DMs in the room list": "Show a presence dot next to DMs in the room list", - "Enable cross-signing to verify per-user instead of per-device (in development)": "Enable cross-signing to verify per-user instead of per-device (in development)", + "Enable cross-signing to verify per-user instead of per-session (in development)": "Enable cross-signing to verify per-user instead of per-session (in development)", "Enable local event indexing and E2EE search (requires restart)": "Enable local event indexing and E2EE search (requires restart)", "Show info about bridges in room settings": "Show info about bridges in room settings", "Enable Emoji suggestions while typing": "Enable Emoji suggestions while typing", @@ -398,8 +398,8 @@ "Match system theme": "Match system theme", "Allow Peer-to-Peer for 1:1 calls": "Allow Peer-to-Peer for 1:1 calls", "Send analytics data": "Send analytics data", - "Never send encrypted messages to unverified devices from this device": "Never send encrypted messages to unverified devices from this device", - "Never send encrypted messages to unverified devices in this room from this device": "Never send encrypted messages to unverified devices in this room from this device", + "Never send encrypted messages to unverified sessions from this session": "Never send encrypted messages to unverified sessions from this session", + "Never send encrypted messages to unverified sessions in this room from this session": "Never send encrypted messages to unverified sessions in this room from this session", "Enable inline URL previews by default": "Enable inline URL previews by default", "Enable URL previews for this room (only affects you)": "Enable URL previews for this room (only affects you)", "Enable URL previews by default for participants in this room": "Enable URL previews by default for participants in this room", @@ -516,7 +516,7 @@ "Headphones": "Headphones", "Folder": "Folder", "Pin": "Pin", - "Verify your other devices easier": "Verify your other devices easier", + "Verify your other sessions easier": "Verify your other sessions easier", "Other users may not trust it": "Other users may not trust it", "Upgrade": "Upgrade", "Verify": "Verify", @@ -538,7 +538,7 @@ "New passwords don't match": "New passwords don't match", "Passwords can't be empty": "Passwords can't be empty", "Warning!": "Warning!", - "Changing password will currently reset any end-to-end encryption keys on all devices, 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 devices, 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.": "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.", "Export E2E room keys": "Export E2E room keys", "Do you want to set an email address?": "Do you want to set an email address?", "Current password": "Current password", @@ -547,21 +547,20 @@ "Confirm password": "Confirm password", "Change Password": "Change Password", "Cross-signing and secret storage are enabled.": "Cross-signing and secret storage are enabled.", - "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this device.": "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this device.", + "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.", "Cross-signing and secret storage are not yet set up.": "Cross-signing and secret storage are not yet set up.", "Bootstrap cross-signing and secret storage": "Bootstrap cross-signing and secret storage", "Cross-signing public keys:": "Cross-signing public keys:", - "on device": "on device", + "in memory": "in memory", "not found": "not found", "Cross-signing private keys:": "Cross-signing private keys:", "in secret storage": "in secret storage", "Secret storage public key:": "Secret storage public key:", "in account data": "in account data", - "Your homeserver does not support device management.": "Your homeserver does not support device management.", - "Unable to load device list": "Unable to load device list", + "Your homeserver does not support session management.": "Your homeserver does not support session management.", + "Unable to load session list": "Unable to load session list", "Authentication": "Authentication", - "Delete %(count)s devices|other": "Delete %(count)s devices", - "Delete %(count)s devices|one": "Delete device", + "Delete %(count)s sessions|other": "Delete %(count)s sessions", "ID": "ID", "Public Name": "Public Name", "Last seen": "Last seen", @@ -584,30 +583,30 @@ "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.", "Unable to load key backup status": "Unable to load key backup status", "Restore from Backup": "Restore from Backup", - "This device is backing up your keys. ": "This device is backing up your keys. ", - "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.", - "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.", - "Connect this device to Key Backup": "Connect this device to Key Backup", + "This session is backing up your keys. ": "This session is backing up your keys. ", + "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.", + "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.", + "Connect this session to Key Backup": "Connect this session to Key Backup", "not stored": "not stored", "Backing up %(sessionsRemaining)s keys...": "Backing up %(sessionsRemaining)s keys...", "All keys backed up": "All keys backed up", "Backup has a valid signature from this user": "Backup has a valid signature from this user", "Backup has a invalid signature from this user": "Backup has a invalid signature from this user", "Backup has a signature from unknown user with ID %(deviceId)s": "Backup has a signature from unknown user with ID %(deviceId)s", - "Backup has a signature from unknown device with ID %(deviceId)s": "Backup has a signature from unknown device with ID %(deviceId)s", - "Backup has a valid signature from this device": "Backup has a valid signature from this device", - "Backup has an invalid signature from this device": "Backup has an invalid signature from this device", - "Backup has a valid signature from verified device ": "Backup has a valid signature from verified device ", - "Backup has a valid signature from unverified device ": "Backup has a valid signature from unverified device ", - "Backup has an invalid signature from verified device ": "Backup has an invalid signature from verified device ", - "Backup has an invalid signature from unverified device ": "Backup has an invalid signature from unverified device ", - "Backup is not signed by any of your devices": "Backup is not signed by any of your devices", - "This backup is trusted because it has been restored on this device": "This backup is trusted because it has been restored on this device", - "Backup key stored in secret storage, but this feature is not enabled on this device. Please enable cross-signing in Labs to modify key backup state.": "Backup key stored in secret storage, but this feature is not enabled on this device. Please enable cross-signing in Labs to modify key backup state.", + "Backup has a signature from unknown session with ID %(deviceId)s": "Backup has a signature from unknown session with ID %(deviceId)s", + "Backup has a valid signature from this session": "Backup has a valid signature from this session", + "Backup has an invalid signature from this session": "Backup has an invalid signature from this session", + "Backup has a valid signature from verified session ": "Backup has a valid signature from verified session ", + "Backup has a valid signature from unverified session ": "Backup has a valid signature from unverified session ", + "Backup has an invalid signature from verified session ": "Backup has an invalid signature from verified session ", + "Backup has an invalid signature from unverified session ": "Backup has an invalid signature from unverified session ", + "Backup is not signed by any of your sessions": "Backup is not signed by any of your sessions", + "This backup is trusted because it has been restored on this session": "This backup is trusted because it has been restored on this session", + "Backup key stored in secret storage, but this feature is not enabled on this session. Please enable cross-signing in Labs to modify key backup state.": "Backup key stored in secret storage, but this feature is not enabled on this session. Please enable cross-signing in Labs to modify key backup state.", "Backup version: ": "Backup version: ", "Algorithm: ": "Algorithm: ", "Backup key stored: ": "Backup key stored: ", - "Your keys are not being backed up from this device.": "Your keys are not being backed up from this device.", + "Your keys are not being backed up from this session.": "Your keys are not being backed up from this session.", "Back up your keys before signing out to avoid losing them.": "Back up your keys before signing out to avoid losing them.", "Start using Key Backup": "Start using Key Backup", "Error saving email notification preferences": "Error saving email notification preferences", @@ -631,9 +630,9 @@ "Advanced notification settings": "Advanced notification settings", "There are advanced notifications which are not shown here": "There are advanced notifications which are not shown here", "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply", - "Enable desktop notifications for this device": "Enable desktop notifications for this device", + "Enable desktop notifications for this session": "Enable desktop notifications for this session", "Show message in desktop notification": "Show message in desktop notification", - "Enable audible notifications for this device": "Enable audible notifications for this device", + "Enable audible notifications for this session": "Enable audible notifications for this session", "Off": "Off", "On": "On", "Noisy": "Noisy", @@ -678,7 +677,7 @@ "Flair": "Flair", "Failed to change password. Is your password correct?": "Failed to change password. Is your password correct?", "Success": "Success", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them", + "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them", "Profile": "Profile", "Email addresses": "Email addresses", "Phone numbers": "Phone numbers", @@ -763,8 +762,8 @@ "": "", "Import E2E room keys": "Import E2E room keys", "Cryptography": "Cryptography", - "Device ID:": "Device ID:", - "Device key:": "Device key:", + "Session ID:": "Session ID:", + "Session key:": "Session key:", "Bulk options": "Bulk options", "Accept all %(invitedRooms)s invites": "Accept all %(invitedRooms)s invites", "Reject all %(invitedRooms)s invites": "Reject all %(invitedRooms)s invites", @@ -772,8 +771,8 @@ "Message search": "Message search", "Cross-signing": "Cross-signing", "Security & Privacy": "Security & Privacy", - "Devices": "Devices", - "A device's public name is visible to people you communicate with": "A device's public name is visible to people you communicate with", + "Sessions": "Sessions", + "A session's public name is visible to people you communicate with": "A session's public name is visible to people you communicate with", "Riot collects anonymous analytics to allow us to improve the application.": "Riot collects anonymous analytics to allow us to improve the application.", "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.", "Learn more about how we use analytics.": "Learn more about how we use analytics.", @@ -898,30 +897,30 @@ " (unsupported)": " (unsupported)", "Join as voice or video.": "Join as voice or video.", "Ongoing conference call%(supportedText)s.": "Ongoing conference call%(supportedText)s.", - "This user has not verified all of their devices.": "This user has not verified all of their devices.", - "You have not verified this user. This user has verified all of their devices.": "You have not verified this user. This user has verified all of their devices.", - "You have verified this user. This user has verified all of their devices.": "You have verified this user. This user has verified all of their devices.", - "Someone is using an unknown device": "Someone is using an unknown device", + "This user has not verified all of their sessions.": "This user has not verified all of their sessions.", + "You have not verified this user. This user has verified all of their sessions.": "You have not verified this user. This user has verified all of their sessions.", + "You have verified this user. This user has verified all of their sessions.": "You have verified this user. This user has verified all of their sessions.", + "Someone is using an unknown session": "Someone is using an unknown session", "This room is end-to-end encrypted": "This room is end-to-end encrypted", "Everyone in this room is verified": "Everyone in this room is verified", - "Some devices for this user are not trusted": "Some devices for this user are not trusted", - "All devices for this user are trusted": "All devices for this user are trusted", - "Some devices in this encrypted room are not trusted": "Some devices in this encrypted room are not trusted", - "All devices in this encrypted room are trusted": "All devices in this encrypted room are trusted", + "Some sessions for this user are not trusted": "Some sessions for this user are not trusted", + "All sessions for this user are trusted": "All sessions for this user are trusted", + "Some sessions in this encrypted room are not trusted": "Some sessions in this encrypted room are not trusted", + "All sessions in this encrypted room are trusted": "All sessions in this encrypted room are trusted", "Edit message": "Edit message", "This event could not be displayed": "This event could not be displayed", "%(senderName)s sent an image": "%(senderName)s sent an image", "%(senderName)s sent a video": "%(senderName)s sent a video", "%(senderName)s uploaded a file": "%(senderName)s uploaded a file", - "Your key share request has been sent - please check your other devices for key share requests.": "Your key share request has been sent - please check your other devices for key share requests.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "If your other devices do not have the key for this message you will not be able to decrypt them.", + "Your key share request has been sent - please check your other sessions for key share requests.": "Your key share request has been sent - please check your other sessions for key share requests.", + "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.": "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.", + "If your other sessions do not have the key for this message you will not be able to decrypt them.": "If your other sessions do not have the key for this message you will not be able to decrypt them.", "Key request sent.": "Key request sent.", - "Re-request encryption keys from your other devices.": "Re-request encryption keys from your other devices.", + "Re-request encryption keys from your other sessions.": "Re-request encryption keys from your other sessions.", "This message cannot be decrypted": "This message cannot be decrypted", - "Encrypted by an unverified device": "Encrypted by an unverified device", + "Encrypted by an unverified session": "Encrypted by an unverified session", "Unencrypted": "Unencrypted", - "Encrypted by a deleted device": "Encrypted by a deleted device", + "Encrypted by a deleted session": "Encrypted by a deleted session", "Please select the destination room for this message": "Please select the destination room for this message", "Invite only": "Invite only", "Scroll to bottom of page": "Scroll to bottom of page", @@ -956,7 +955,7 @@ "Failed to change power level": "Failed to change power level", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.", "Are you sure?": "Are you sure?", - "No devices with registered encryption keys": "No devices with registered encryption keys", + "No sessions with registered encryption keys": "No sessions with registered encryption keys", "Jump to read receipt": "Jump to read receipt", "Mention": "Mention", "Invite": "Invite", @@ -1148,13 +1147,13 @@ "Messages in this room are end-to-end encrypted.": "Messages in this room are end-to-end encrypted.", "Your messages are secured and only you and the recipient have the unique keys to unlock them.": "Your messages are secured and only you and the recipient have the unique keys to unlock them.", "Verify User": "Verify User", - "For extra security, verify this user by checking a one-time code on both of your devices.": "For extra security, verify this user by checking a one-time code on both of your devices.", + "For extra security, verify this user by checking a one-time code on both of your sessions.": "For extra security, verify this user by checking a one-time code on both of your sessions.", "Your messages are not secure": "Your messages are not secure", "One of the following may be compromised:": "One of the following may be compromised:", "Your homeserver": "Your homeserver", "The homeserver the user you’re verifying is connected to": "The homeserver the user you’re verifying is connected to", "Yours, or the other users’ internet connection": "Yours, or the other users’ internet connection", - "Yours, or the other users’ device": "Yours, or the other users’ device", + "Yours, or the other users’ session": "Yours, or the other users’ session", "Members": "Members", "Files": "Files", "Trusted": "Trusted", @@ -1422,8 +1421,8 @@ "Removing…": "Removing…", "Confirm Removal": "Confirm Removal", "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.", - "Clear all data on this device?": "Clear all data on this device?", - "Clearing all data from this device is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Clearing all data from this device is permanent. Encrypted messages will be lost unless their keys have been backed up.", + "Clear all data on this session?": "Clear all data on this session?", + "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.", "Clear all data": "Clear all data", "Community IDs cannot be empty.": "Community IDs cannot be empty.", "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Community IDs may only contain characters a-z, 0-9, or '=_-./'", @@ -1458,20 +1457,20 @@ "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.": "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.", "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)": "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)", "To continue, please enter your password:": "To continue, please enter your password:", - "Verify device": "Verify device", + "Verify session": "Verify session", "Use Legacy Verification (for older clients)": "Use Legacy Verification (for older clients)", "Verify by comparing a short text string.": "Verify by comparing a short text string.", "Begin Verifying": "Begin Verifying", "Waiting for partner to accept...": "Waiting for partner to accept...", "Nothing appearing? Not all clients support interactive verification yet. .": "Nothing appearing? Not all clients support interactive verification yet. .", "Waiting for %(userId)s to confirm...": "Waiting for %(userId)s to confirm...", - "To verify that this device can be trusted, please check that the key you see in User Settings on that device matches the key below:": "To verify that this device can be trusted, please check that the key you see in User Settings on that device matches the key below:", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:", + "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:": "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:", + "To verify that this session can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this session matches the key below:": "To verify that this session can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this session matches the key below:", "Use two-way text verification": "Use two-way text verification", - "Device name": "Device name", - "Device ID": "Device ID", - "Device key": "Device key", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.", + "Session name": "Session name", + "Session ID": "Session ID", + "Session key": "Session key", + "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this session and you probably want to press the blacklist button instead.": "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this session and you probably want to press the blacklist button instead.", "I verify that the keys match": "I verify that the keys match", "Back": "Back", "Send Custom Event": "Send Custom Event", @@ -1490,7 +1489,7 @@ "Developer Tools": "Developer Tools", "An error has occurred.": "An error has occurred.", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.", - "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.", + "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.", "Waiting for partner to confirm...": "Waiting for partner to confirm...", "Incoming Verification Request": "Incoming Verification Request", "Integrations are disabled": "Integrations are disabled", @@ -1509,12 +1508,12 @@ "If you can't find someone, ask them for their username, share your username (%(userId)s) or profile link.": "If you can't find someone, ask them for their username, share your username (%(userId)s) or profile link.", "Go": "Go", "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.": "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "You added a new device '%(displayName)s', which is requesting encryption keys.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Your unverified device '%(displayName)s' is requesting encryption keys.", + "You added a new session '%(displayName)s', which is requesting encryption keys.": "You added a new session '%(displayName)s', which is requesting encryption keys.", + "Your unverified session '%(displayName)s' is requesting encryption keys.": "Your unverified session '%(displayName)s' is requesting encryption keys.", "Start verification": "Start verification", "Share without verifying": "Share without verifying", "Ignore request": "Ignore request", - "Loading device info...": "Loading device info...", + "Loading session info...": "Loading session info...", "Encryption key request": "Encryption key request", "You've previously used Riot 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, Riot needs to resync your account.": "You've previously used Riot 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, Riot needs to resync your account.", "If the other version of Riot is still open in another tab, please close it as using Riot on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "If the other version of Riot is still open in another tab, please close it as using Riot on the same host with both lazy loading enabled and disabled simultaneously will cause issues.", @@ -1579,11 +1578,11 @@ "If you already have a Matrix account you can log in instead.": "If you already have a Matrix account you can log in instead.", "You have successfully set a password!": "You have successfully set a password!", "You have successfully set a password and an email address!": "You have successfully set a password and an email address!", - "You can now return to your account after signing out, and sign in on other devices.": "You can now return to your account after signing out, and sign in on other devices.", + "You can now return to your account after signing out, and sign in on other sessions.": "You can now return to your account after signing out, and sign in on other sessions.", "Remember, you can always set an email address in user settings if you change your mind.": "Remember, you can always set an email address in user settings if you change your mind.", "(HTTP status %(httpStatus)s)": "(HTTP status %(httpStatus)s)", "Please set a password!": "Please set a password!", - "This will allow you to return to your account after signing out, and sign in on other devices.": "This will allow you to return to your account after signing out, and sign in on other devices.", + "This will allow you to return to your account after signing out, and sign in on other sessions.": "This will allow you to return to your account after signing out, and sign in on other sessions.", "Share Room": "Share Room", "Link to most recent message": "Link to most recent message", "Share User": "Share User", @@ -1606,11 +1605,11 @@ "Summary": "Summary", "Document": "Document", "Next": "Next", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.", - "Room contains unknown devices": "Room contains unknown devices", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contains devices that you haven't seen before.", - "Unknown devices": "Unknown devices", + "You are currently blacklisting unverified sessions; to send messages to these sessions you must verify them.": "You are currently blacklisting unverified sessions; to send messages to these sessions you must verify them.", + "We recommend you go through the verification process for each session to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "We recommend you go through the verification process for each session to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.", + "Room contains unknown sessions": "Room contains unknown sessions", + "\"%(RoomName)s\" contains sessions that you haven't seen before.": "\"%(RoomName)s\" contains sessions that you haven't seen before.", + "Unknown sessions": "Unknown sessions", "Upload files (%(current)s of %(total)s)": "Upload files (%(current)s of %(total)s)", "Upload files": "Upload files", "Upload all": "Upload all", @@ -1629,13 +1628,13 @@ "Enter secret storage passphrase": "Enter secret storage passphrase", "Unable to access secret storage. Please verify that you entered the correct passphrase.": "Unable to access secret storage. Please verify that you entered the correct passphrase.", "Warning: You should only access secret storage from a trusted computer.": "Warning: You should only access secret storage from a trusted computer.", - "Access your secure message history and your cross-signing identity for verifying other devices by entering your passphrase.": "Access your secure message history and your cross-signing identity for verifying other devices by entering your passphrase.", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your passphrase.": "Access your secure message history and your cross-signing identity for verifying other sessions by entering your passphrase.", "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.": "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.", "Enter secret storage recovery key": "Enter secret storage recovery key", "This looks like a valid recovery key!": "This looks like a valid recovery key!", "Unable to access secret storage. Please verify that you entered the correct recovery key.": "Unable to access secret storage. Please verify that you entered the correct recovery key.", "Not a valid recovery key": "Not a valid recovery key", - "Access your secure message history and your cross-signing identity for verifying other devices by entering your recovery key.": "Access your secure message history and your cross-signing identity for verifying other devices by entering your recovery key.", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.": "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.", "If you've forgotten your recovery key you can .": "If you've forgotten your recovery key you can .", "Unable to load backup status": "Unable to load backup status", "Recovery Key Mismatch": "Recovery Key Mismatch", @@ -1863,8 +1862,8 @@ "Find a room… (e.g. %(exampleRoom)s)": "Find a room… (e.g. %(exampleRoom)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.", "Explore rooms": "Explore rooms", - "Message not sent due to unknown devices being present": "Message not sent due to unknown devices being present", - "Show devices, send anyway or cancel.": "Show devices, send anyway or cancel.", + "Message not sent due to unknown sessions being present": "Message not sent due to unknown sessions being present", + "Show sessions, send anyway or cancel.": "Show sessions, send anyway or cancel.", "You can't send any messages until you review and agree to our terms and conditions.": "You can't send any messages until you review and agree to our terms and conditions.", "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.": "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.", "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.": "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.", @@ -1912,13 +1911,13 @@ "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.", "Your new session is now verified. Other users will see it as trusted.": "Your new session is now verified. Other users will see it as trusted.", "Done": "Done", - "Without completing security on this device, it won’t have access to encrypted messages.": "Without completing security on this device, it won’t have access to encrypted messages.", + "Without completing security on this session, it won’t have access to encrypted messages.": "Without completing security on this session, it won’t have access to encrypted messages.", "Go Back": "Go Back", "Failed to send email": "Failed to send email", "The email address linked to your account must be entered.": "The email address linked to your account must be entered.", "A new password must be entered.": "A new password must be entered.", "New passwords must match each other.": "New passwords must match each other.", - "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.", + "Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.": "Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.", "Your Matrix account on %(serverName)s": "Your Matrix account on %(serverName)s", "Your Matrix account on ": "Your Matrix account on ", "No identity server is configured: add one in server settings to reset your password.": "No identity server is configured: add one in server settings to reset your password.", @@ -1928,7 +1927,7 @@ "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.", "I have verified my email address": "I have verified my email address", "Your password has been reset.": "Your password has been reset.", - "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.", + "You have been logged out of all sessions and will no longer receive push notifications. To re-enable notifications, sign in again on each session.": "You have been logged out of all sessions and will no longer receive push notifications. To re-enable notifications, sign in again on each session.", "Return to login screen": "Return to login screen", "Set a new password": "Set a new password", "Invalid homeserver discovery response": "Invalid homeserver discovery response", @@ -1966,14 +1965,14 @@ "Create your account": "Create your account", "Failed to re-authenticate due to a homeserver problem": "Failed to re-authenticate due to a homeserver problem", "Failed to re-authenticate": "Failed to re-authenticate", - "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.": "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.", + "Regain access to your account and recover encryption keys stored on this session. Without them, you won’t be able to read all of your secure messages on any session.": "Regain access to your account and recover encryption keys stored on this session. Without them, you won’t be able to read all of your secure messages on any session.", "Enter your password to sign in and regain access to your account.": "Enter your password to sign in and regain access to your account.", "Forgotten your password?": "Forgotten your password?", "Sign in and regain access to your account.": "Sign in and regain access to your account.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "You cannot sign in to your account. Please contact your homeserver admin for more information.", "You're signed out": "You're signed out", "Clear personal data": "Clear personal data", - "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.": "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.", + "Warning: Your personal data (including encryption keys) is still stored on this session. Clear it if you're finished using this session, or want to sign in to another account.": "Warning: Your personal data (including encryption keys) is still stored on this session. Clear it if you're finished using this session, or want to sign in to another account.", "Commands": "Commands", "Command Autocomplete": "Command Autocomplete", "Community Autocomplete": "Community Autocomplete", @@ -1991,6 +1990,7 @@ "NOT verified": "NOT verified", "Blacklisted": "Blacklisted", "verified": "verified", + "Device ID": "Device ID", "Verification": "Verification", "Ed25519 fingerprint": "Ed25519 fingerprint", "User ID": "User ID", @@ -2000,9 +2000,8 @@ "Algorithm": "Algorithm", "unencrypted": "unencrypted", "Decryption error": "Decryption error", - "Session ID": "Session ID", "Event information": "Event information", - "Sender device information": "Sender device information", + "Sender session information": "Sender session information", "Passphrases must match": "Passphrases must match", "Passphrase must not be empty": "Passphrase must not be empty", "Export room keys": "Export room keys", @@ -2020,9 +2019,9 @@ "Restore": "Restore", "Enter your account password to confirm the upgrade:": "Enter your account password to confirm the upgrade:", "You'll need to authenticate with the server to confirm the upgrade.": "You'll need to authenticate with the server to confirm the upgrade.", - "Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.", + "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.", "Great! This passphrase looks strong enough.": "Great! This passphrase looks strong enough.", - "Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.", + "Set up encryption on this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Set up encryption on this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.", "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:", "Enter a passphrase": "Enter a passphrase", "Back up my encryption keys, securing them with the same passphrase": "Back up my encryption keys, securing them with the same passphrase", @@ -2044,7 +2043,7 @@ "Print it and store it somewhere safe": "Print it and store it somewhere safe", "Save it on a USB key or backup drive": "Save it on a USB key or backup drive", "Copy it to your personal cloud storage": "Copy it to your personal cloud storage", - "This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.", + "This session can now verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "This session can now verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.", "Verify other users in their profile.": "Verify other users in their profile.", "Upgrade your encryption": "Upgrade your encryption", "Recovery key": "Recovery key", @@ -2063,7 +2062,7 @@ "As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.": "As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.", "As a safety net, you can use it to restore your encrypted message history.": "As a safety net, you can use it to restore your encrypted message history.", "Your keys are being backed up (the first backup could take a few minutes).": "Your keys are being backed up (the first backup could take a few minutes).", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.", + "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.": "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.", "Set up Secure Message Recovery": "Set up Secure Message Recovery", "Secure your backup with a passphrase": "Secure your backup with a passphrase", "Starting backup...": "Starting backup...", @@ -2077,12 +2076,12 @@ "New Recovery Method": "New Recovery Method", "A new recovery passphrase and key for Secure Messages have been detected.": "A new recovery passphrase and key for Secure Messages have been detected.", "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.": "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.", - "This device is encrypting history using the new recovery method.": "This device is encrypting history using the new recovery method.", + "This session is encrypting history using the new recovery method.": "This session is encrypting history using the new recovery method.", "Go to Settings": "Go to Settings", "Set up Secure Messages": "Set up Secure Messages", "Recovery Method Removed": "Recovery Method Removed", - "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "This device has detected that your recovery passphrase and key for Secure Messages have been removed.", - "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.", + "This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "This session has detected that your recovery passphrase and key for Secure Messages have been removed.", + "If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.": "If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.", "If disabled, messages from encrypted rooms won't appear in search results.": "If disabled, messages from encrypted rooms won't appear in search results.", "Disable": "Disable", diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 37a211e905..83975dd8e9 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -144,7 +144,7 @@ export const SETTINGS = { }, "feature_cross_signing": { isFeature: true, - displayName: _td("Enable cross-signing to verify per-user instead of per-device (in development)"), + displayName: _td("Enable cross-signing to verify per-user instead of per-session (in development)"), supportedLevels: LEVELS_FEATURE, default: false, }, @@ -348,8 +348,8 @@ export const SETTINGS = { supportedLevels: ['room-device', 'device'], supportedLevelsAreOrdered: true, displayName: { - "default": _td('Never send encrypted messages to unverified devices from this device'), - "room-device": _td('Never send encrypted messages to unverified devices in this room from this device'), + "default": _td('Never send encrypted messages to unverified sessions from this session'), + "room-session": _td('Never send encrypted messages to unverified sessions in this room from this session'), }, default: false, }, From a2734e6955a06535ab1eb84cddc7d57c763cfbbf Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 29 Jan 2020 15:56:26 +0000 Subject: [PATCH 374/906] Add missing await causing promises to be leaked as room IDs Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/dialogs/DeviceVerifyDialog.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/dialogs/DeviceVerifyDialog.js b/src/components/views/dialogs/DeviceVerifyDialog.js index f2368ad795..7fa83da58d 100644 --- a/src/components/views/dialogs/DeviceVerifyDialog.js +++ b/src/components/views/dialogs/DeviceVerifyDialog.js @@ -318,7 +318,7 @@ export default class DeviceVerifyDialog extends React.Component { } async function ensureDMExistsAndOpen(userId) { - const roomId = ensureDMExists(MatrixClientPeg.get(), userId); + const roomId = await ensureDMExists(MatrixClientPeg.get(), userId); // don't use andView and spinner in createRoom, together, they cause this dialog to close and reopen, // we causes us to loose the verifier and restart, and we end up having two verification requests dis.dispatch({ From 067bfe2ee3ce0129ba4f09e86d6b28977c68ed97 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 29 Jan 2020 16:10:46 +0000 Subject: [PATCH 375/906] Tweaks from PR --- src/Analytics.js | 2 +- src/components/structures/auth/ForgotPassword.js | 2 +- src/components/structures/auth/SoftLogout.js | 6 +++--- .../views/dialogs/ConfirmWipeDeviceDialog.js | 2 +- src/components/views/dialogs/SetPasswordDialog.js | 2 +- src/components/views/right_panel/EncryptionInfo.js | 2 +- src/i18n/strings/en_EN.json | 14 +++++++------- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Analytics.js b/src/Analytics.js index 6ec50cc25f..d0c7a52814 100644 --- a/src/Analytics.js +++ b/src/Analytics.js @@ -272,7 +272,7 @@ class Analytics { ), }, { expl: _td('Your User Agent'), value: navigator.userAgent }, - { expl: _td('Your session resolution'), value: resolution }, + { expl: _td('Your device resolution'), value: resolution }, ]; const ErrorDialog = sdk.getComponent('dialogs.ErrorDialog'); diff --git a/src/components/structures/auth/ForgotPassword.js b/src/components/structures/auth/ForgotPassword.js index 0fc4a9af1e..e921951512 100644 --- a/src/components/structures/auth/ForgotPassword.js +++ b/src/components/structures/auth/ForgotPassword.js @@ -360,7 +360,7 @@ export default createReactClass({

    {_t( "You have been logged out of all sessions and will no longer receive " + "push notifications. To re-enable notifications, sign in again on each " + - "session.", + "device.", )}

    diff --git a/src/components/structures/auth/SoftLogout.js b/src/components/structures/auth/SoftLogout.js index 06838798c7..8481b3fc43 100644 --- a/src/components/structures/auth/SoftLogout.js +++ b/src/components/structures/auth/SoftLogout.js @@ -212,8 +212,8 @@ export default class SoftLogout extends React.Component { let introText = null; // null is translated to something area specific in this function if (this.state.keyBackupNeeded) { introText = _t( - "Regain access to your account and recover encryption keys stored on this session. " + - "Without them, you won’t be able to read all of your secure messages on any session."); + "Regain access to your account and recover encryption keys stored in this session. " + + "Without them, you won’t be able to read all of your secure messages in any session."); } if (this.state.loginView === LOGIN_VIEW.PASSWORD) { @@ -306,7 +306,7 @@ export default class SoftLogout extends React.Component {

    {_t( "Warning: Your personal data (including encryption keys) is still stored " + - "on this session. Clear it if you're finished using this session, or want to sign " + + "in this session. Clear it if you're finished using this session, or want to sign " + "in to another account.", )}

    diff --git a/src/components/views/dialogs/ConfirmWipeDeviceDialog.js b/src/components/views/dialogs/ConfirmWipeDeviceDialog.js index 2672d3e0f2..41ef9131fa 100644 --- a/src/components/views/dialogs/ConfirmWipeDeviceDialog.js +++ b/src/components/views/dialogs/ConfirmWipeDeviceDialog.js @@ -39,7 +39,7 @@ export default class ConfirmWipeDeviceDialog extends React.Component { return ( + title={_t("Clear all data in this session?")}>

    {_t( diff --git a/src/components/views/dialogs/SetPasswordDialog.js b/src/components/views/dialogs/SetPasswordDialog.js index 3797957568..c48690bb48 100644 --- a/src/components/views/dialogs/SetPasswordDialog.js +++ b/src/components/views/dialogs/SetPasswordDialog.js @@ -29,7 +29,7 @@ const WarmFuzzy = function(props) { if (props.didSetEmail) { title = _t('You have successfully set a password and an email address!'); } - const advice = _t('You can now return to your account after signing out, and sign in on other sessions.'); + const advice = _t('You can now return to your account after signing out, and sign in on other devices.'); let extraAdvice = null; if (!props.didSetEmail) { extraAdvice = _t('Remember, you can always set an email address in user settings if you change your mind.'); diff --git a/src/components/views/right_panel/EncryptionInfo.js b/src/components/views/right_panel/EncryptionInfo.js index 040b0a7929..299e553769 100644 --- a/src/components/views/right_panel/EncryptionInfo.js +++ b/src/components/views/right_panel/EncryptionInfo.js @@ -55,7 +55,7 @@ const EncryptionInfo = ({pending, member, onStartVerification}) => {

    {_t("Verify User")}

    -

    {_t("For extra security, verify this user by checking a one-time code on both of your sessions.")}

    +

    {_t("For extra security, verify this user by checking a one-time code on both of your devices.")}

    {_t("To be secure, do this in person or use a trusted way to communicate.")}

    { content }
    diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index b745feda17..e3738b1175 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -17,7 +17,7 @@ "Every page you use in the app": "Every page you use in the app", "e.g. ": "e.g. ", "Your User Agent": "Your User Agent", - "Your session resolution": "Your session resolution", + "Your device resolution": "Your device resolution", "Analytics": "Analytics", "The information being sent to us to help make Riot.im better includes:": "The information being sent to us to help make Riot.im better includes:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.", @@ -1147,7 +1147,7 @@ "Messages in this room are end-to-end encrypted.": "Messages in this room are end-to-end encrypted.", "Your messages are secured and only you and the recipient have the unique keys to unlock them.": "Your messages are secured and only you and the recipient have the unique keys to unlock them.", "Verify User": "Verify User", - "For extra security, verify this user by checking a one-time code on both of your sessions.": "For extra security, verify this user by checking a one-time code on both of your sessions.", + "For extra security, verify this user by checking a one-time code on both of your devices.": "For extra security, verify this user by checking a one-time code on both of your devices.", "Your messages are not secure": "Your messages are not secure", "One of the following may be compromised:": "One of the following may be compromised:", "Your homeserver": "Your homeserver", @@ -1421,7 +1421,7 @@ "Removing…": "Removing…", "Confirm Removal": "Confirm Removal", "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.", - "Clear all data on this session?": "Clear all data on this session?", + "Clear all data in this session?": "Clear all data in this session?", "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.", "Clear all data": "Clear all data", "Community IDs cannot be empty.": "Community IDs cannot be empty.", @@ -1578,7 +1578,7 @@ "If you already have a Matrix account you can log in instead.": "If you already have a Matrix account you can log in instead.", "You have successfully set a password!": "You have successfully set a password!", "You have successfully set a password and an email address!": "You have successfully set a password and an email address!", - "You can now return to your account after signing out, and sign in on other sessions.": "You can now return to your account after signing out, and sign in on other sessions.", + "You can now return to your account after signing out, and sign in on other devices.": "You can now return to your account after signing out, and sign in on other devices.", "Remember, you can always set an email address in user settings if you change your mind.": "Remember, you can always set an email address in user settings if you change your mind.", "(HTTP status %(httpStatus)s)": "(HTTP status %(httpStatus)s)", "Please set a password!": "Please set a password!", @@ -1927,7 +1927,7 @@ "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.", "I have verified my email address": "I have verified my email address", "Your password has been reset.": "Your password has been reset.", - "You have been logged out of all sessions and will no longer receive push notifications. To re-enable notifications, sign in again on each session.": "You have been logged out of all sessions and will no longer receive push notifications. To re-enable notifications, sign in again on each session.", + "You have been logged out of all sessions and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "You have been logged out of all sessions and will no longer receive push notifications. To re-enable notifications, sign in again on each device.", "Return to login screen": "Return to login screen", "Set a new password": "Set a new password", "Invalid homeserver discovery response": "Invalid homeserver discovery response", @@ -1965,14 +1965,14 @@ "Create your account": "Create your account", "Failed to re-authenticate due to a homeserver problem": "Failed to re-authenticate due to a homeserver problem", "Failed to re-authenticate": "Failed to re-authenticate", - "Regain access to your account and recover encryption keys stored on this session. Without them, you won’t be able to read all of your secure messages on any session.": "Regain access to your account and recover encryption keys stored on this session. Without them, you won’t be able to read all of your secure messages on any session.", + "Regain access to your account and recover encryption keys stored in this session. Without them, you won’t be able to read all of your secure messages in any session.": "Regain access to your account and recover encryption keys stored in this session. Without them, you won’t be able to read all of your secure messages in any session.", "Enter your password to sign in and regain access to your account.": "Enter your password to sign in and regain access to your account.", "Forgotten your password?": "Forgotten your password?", "Sign in and regain access to your account.": "Sign in and regain access to your account.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "You cannot sign in to your account. Please contact your homeserver admin for more information.", "You're signed out": "You're signed out", "Clear personal data": "Clear personal data", - "Warning: Your personal data (including encryption keys) is still stored on this session. Clear it if you're finished using this session, or want to sign in to another account.": "Warning: Your personal data (including encryption keys) is still stored on this session. Clear it if you're finished using this session, or want to sign in to another account.", + "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.": "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.", "Commands": "Commands", "Command Autocomplete": "Command Autocomplete", "Community Autocomplete": "Community Autocomplete", From d8ca9d0f13e48fb470f11d43d41c8c4f247cf294 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 29 Jan 2020 16:35:38 +0000 Subject: [PATCH 376/906] Prune unused translations --- src/i18n/strings/ar.json | 1 - src/i18n/strings/az.json | 29 ------ src/i18n/strings/bg.json | 148 ----------------------------- src/i18n/strings/ca.json | 53 ----------- src/i18n/strings/cs.json | 133 -------------------------- src/i18n/strings/da.json | 24 ----- src/i18n/strings/de_DE.json | 119 ------------------------ src/i18n/strings/el.json | 60 ------------ src/i18n/strings/en_US.json | 58 ------------ src/i18n/strings/eo.json | 124 ------------------------- src/i18n/strings/es.json | 95 ------------------- src/i18n/strings/eu.json | 164 --------------------------------- src/i18n/strings/fa.json | 1 - src/i18n/strings/fi.json | 146 ----------------------------- src/i18n/strings/fr.json | 169 ---------------------------------- src/i18n/strings/gl.json | 66 ------------- src/i18n/strings/he.json | 2 - src/i18n/strings/hi.json | 68 +------------- src/i18n/strings/hu.json | 168 --------------------------------- src/i18n/strings/id.json | 12 --- src/i18n/strings/is.json | 28 ------ src/i18n/strings/it.json | 167 --------------------------------- src/i18n/strings/ja.json | 75 --------------- src/i18n/strings/jbo.json | 19 ---- src/i18n/strings/ko.json | 123 ------------------------- src/i18n/strings/lt.json | 62 ------------- src/i18n/strings/lv.json | 58 ------------ src/i18n/strings/ml.json | 1 - src/i18n/strings/nb_NO.json | 18 ---- src/i18n/strings/nl.json | 117 ----------------------- src/i18n/strings/nn.json | 84 ----------------- src/i18n/strings/pl.json | 97 ------------------- src/i18n/strings/pt.json | 51 ---------- src/i18n/strings/pt_BR.json | 84 ----------------- src/i18n/strings/ro.json | 1 - src/i18n/strings/ru.json | 117 ----------------------- src/i18n/strings/sk.json | 118 ------------------------ src/i18n/strings/sq.json | 161 -------------------------------- src/i18n/strings/sr.json | 62 ------------- src/i18n/strings/sr_Latn.json | 6 -- src/i18n/strings/sv.json | 98 -------------------- src/i18n/strings/ta.json | 1 - src/i18n/strings/te.json | 7 -- src/i18n/strings/th.json | 27 ------ src/i18n/strings/tr.json | 80 ---------------- src/i18n/strings/uk.json | 34 ------- src/i18n/strings/vi.json | 21 ----- src/i18n/strings/vls.json | 115 ----------------------- src/i18n/strings/zh_Hans.json | 103 --------------------- src/i18n/strings/zh_Hant.json | 165 --------------------------------- 50 files changed, 1 insertion(+), 3739 deletions(-) diff --git a/src/i18n/strings/ar.json b/src/i18n/strings/ar.json index 436c518ba0..708778d15d 100644 --- a/src/i18n/strings/ar.json +++ b/src/i18n/strings/ar.json @@ -46,7 +46,6 @@ "Changelog": "سِجل التغييرات", "Send Account Data": "إرسال بيانات الحساب", "Waiting for response from server": "في انتظار الرد مِن الخادوم", - "This will allow you to return to your account after signing out, and sign in on other devices.": "سيسمح لك هذا بالعودة إلى حسابك بعد الخروج، وتسجيل الدخول على الأجهزة الأخرى.", "Send logs": "إرسال السِجلات", "Download this file": "تنزيل هذا الملف", "Thank you!": "شكرًا !", diff --git a/src/i18n/strings/az.json b/src/i18n/strings/az.json index 538403f164..6cddb58ad1 100644 --- a/src/i18n/strings/az.json +++ b/src/i18n/strings/az.json @@ -74,9 +74,6 @@ "Moderator": "Moderator", "Admin": "Administrator", "Start a chat": "Danışığa başlamaq", - "Who would you like to communicate with?": "Kimlə siz əlaqə saxlamaq istəyirdiniz?", - "Start Chat": "Danışığa başlamaq", - "Invite new room members": "Yeni iştirakçıların otağına dəvət etmək", "You need to be logged in.": "Siz sistemə girməlisiniz.", "You need to be able to invite users to do that.": "Bunun üçün siz istifadəçiləri dəvət etmək imkanına malik olmalısınız.", "Failed to send request.": "Sorğunu göndərməyi bacarmadı.", @@ -126,14 +123,11 @@ "%(senderName)s made future room history visible to all room members.": "%(senderName)s iştirakçılar üçün danışıqların tarixini açdı.", "%(senderName)s made future room history visible to anyone.": "%(senderName)s hamı üçün danışıqların tarixini açdı.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s naməlum rejimdə otağın tarixini açdı (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s включил(а) в комнате сквозное шифрование (алгоритм %(algorithm)s).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s üçün %(fromPowerLevel)s-dan %(toPowerLevel)s-lə", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s hüquqların səviyyələrini dəyişdirdi %(powerLevelDiffText)s.", "Failed to join room": "Otağa girməyi bacarmadı", "Always show message timestamps": "Həmişə mesajların göndərilməsi vaxtını göstərmək", "Autoplay GIFs and videos": "GIF animasiyalarını və videolarını avtomatik olaraq oynayır", - "Never send encrypted messages to unverified devices from this device": "Heç vaxt (bu qurğudan) yoxlanılmamış qurğulara şifrlənmiş mesajları göndərməmək", - "Never send encrypted messages to unverified devices in this room from this device": "Heç vaxt (bu otaqda, bu qurğudan) yoxlanılmamış qurğulara şifrlənmiş mesajları göndərməmək", "Accept": "Qəbul etmək", "Error": "Səhv", "Incorrect verification code": "Təsdiq etmənin səhv kodu", @@ -152,8 +146,6 @@ "Failed to set display name": "Görünüş adını təyin etmək bacarmadı", "Notification targets": "Xəbərdarlıqlar üçün qurğular", "On": "Qoşmaq", - "Invalid alias format": "Adının yolverilməz formatı", - "'%(alias)s' is not a valid format for an alias": "Ad '%(alias)s' yolverilməz formata malikdir", "not specified": "qeyd edilmədi", "Local addresses for this room:": "Sizin serverinizdə bu otağın ünvanları:", "New address (e.g. #foo:%(localDomain)s)": "Yeni ünvan (məsələn, #nəsə:%(localDomain)s)", @@ -168,8 +160,6 @@ "Failed to toggle moderator status": "Moderatorun statusunu dəyişdirməyi bacarmadı", "Failed to change power level": "Hüquqların səviyyəsini dəyişdirməyi bacarmadı", "Are you sure?": "Siz əminsiniz?", - "No devices with registered encryption keys": "Şifrləmənin qeyd edilmiş açarlarıyla qurğu yoxdur", - "Devices": "Qurğular", "Unignore": "Blokdan çıxarmaq", "Ignore": "Bloklamaq", "User Options": "Hərəkətlər", @@ -182,17 +172,13 @@ "Video call": "Video çağırış", "Upload file": "Faylı göndərmək", "You do not have permission to post to this room": "Siz bu otağa yaza bilmirsiniz", - "Hide Text Formatting Toolbar": "Mətnin formatlaşdırılmasının alətlərini gizlətmək", "Command error": "Komandanın səhvi", - "Markdown is disabled": "Markdown kəsilmişdir", - "Markdown is enabled": "Markdown qoşulmuşdur", "Join Room": "Otağa girmək", "Upload avatar": "Avatar-ı yükləmək", "Settings": "Qurmalar", "Forget room": "Otağı unutmaq", "Invites": "Dəvətlər", "Favourites": "Seçilmişlər", - "People": "İnsanlar", "Low priority": "Əhəmiyyətsizlər", "Historical": "Arxiv", "Failed to unban": "Blokdan çıxarmağı bacarmadı", @@ -267,7 +253,6 @@ "Click to unmute audio": "Klikləyin, səsi qoşmaq üçün", "Click to mute audio": "Klikləyin, səsi söndürmək üçün", "Failed to load timeline position": "Xronologiyadan nişanı yükləməyi bacarmadı", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Şifrə uğurla dəyişdirildi. Təkrar avtorizasiyaya qədər siz başqa cihazlarda push-xəbərdarlıqları almayacaqsınız", "Unable to remove contact information": "Əlaqə məlumatlarının silməyi bacarmadı", "": "", "Import E2E room keys": "Şifrləmənin açarlarının idxalı", @@ -282,7 +267,6 @@ "click to reveal": "açılış üçün basın", "Homeserver is": "Ev serveri bu", "Identity Server is": "Eyniləşdirmənin serveri bu", - "matrix-react-sdk version:": "matrix-react-sdk versiyası:", "olm version:": "Olm versiyası:", "Failed to send email": "Email göndərilməsinin səhvi", "A new password must be entered.": "Yeni parolu daxil edin.", @@ -317,7 +301,6 @@ "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "'Çörək parçaları' funksiyadan istifadə edmiirsiniz (otaqlar siyahısından yuxarıdakı avatarlar)", "Analytics": "Analitik", "Call Failed": "Uğursuz zəng", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Bu otaqda məlum olmayan cihazlar var: onları təsdiq etmədən davam etsəniz, kimsə zənginizə qulaq asmaq mümkün olacaq.", "Review Devices": "Cihazları nəzərdən keçirin", "Call Anyway": "Hər halda zəng edin", "Answer Anyway": "Hər halda cavab verin", @@ -358,8 +341,6 @@ "Registration Required": "Qeydiyyat tələb olunur", "You need to register to do this. Would you like to register now?": "Bunu etmək üçün qeydiyyatdan keçməlisiniz. İndi qeydiyyatdan keçmək istərdiniz?", "Restricted": "Məhduddur", - "Email, name or Matrix ID": "E-poçt, ad və ya Matrix ID", - "Send Invites": "Dəvət göndərin", "Failed to invite": "Dəvət alınmadı", "Failed to invite users to the room:": "İstifadəçiləri otağa dəvət etmək alınmadı:", "Unable to create widget.": "Widjet yaratmaq olmur.", @@ -370,8 +351,6 @@ "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "¯ \\ _ (ツ) _ / ¯ işarəsini mesaja elavə edir.", "Searches DuckDuckGo for results": "Nəticələr üçün DuckDuckGo-da axtarır", "Upgrades a room to a new version": "Bir otağı yeni bir versiyaya yüksəldir", - "Room upgrade confirmation": "Otaq yenilənməsi quraşdırılması", - "Upgrading a room can be destructive and isn't always necessary.": "Bir otağı təkmilləşdirməsi dağıdıcı ola bilər və həmişə lazım deyil.", "Changes your display nickname in the current room only": "Yalnız cari otaqda ekran ləqəbinizi dəyişdirir", "Changes your avatar in this current room only": "Avatarınızı yalnız bu cari otaqda dəyişir", "Changes your avatar in all rooms": "Bütün otaqlarda avatarınızı dəyişdirir", @@ -384,12 +363,9 @@ "Opens the Developer Tools dialog": "Geliştirici Alətlər dialoqunu açır", "Adds a custom widget by URL to the room": "Otağa URL tərəfindən xüsusi bir widjet əlavə edir", "You cannot modify widgets in this room.": "Bu otaqda vidjetləri dəyişdirə bilməzsiniz.", - "Verifies a user, device, and pubkey tuple": "Bir istifadəçini, cihazı və publik açarı yoxlayır", - "Unknown (user, device) pair:": "Naməlum (istifadəçi, cihaz) qoşulma:", "Verified key": "Təsdiqlənmiş açar", "Sends the given message coloured as a rainbow": "Verilən mesajı göy qurşağı kimi rəngli göndərir", "Sends the given emote coloured as a rainbow": "Göndərilmiş emote rəngini göy qurşağı kimi göndərir", - "Unrecognised command:": "Tanınmayan əmr:", "Add Email Address": "Emal ünvan əlavə etmək", "Add Phone Number": "Telefon nömrəsi əlavə etmək", "e.g. %(exampleValue)s": "e.g. %(exampleValue)s", @@ -410,7 +386,6 @@ "Only continue if you trust the owner of the server.": "Yalnız server sahibinə etibar etsəniz davam edin.", "Trust": "Etibar", "Custom (%(level)s)": "Xüsusi (%(level)s)", - "Failed to start chat": "Söhbətə başlamaq olmur", "Failed to invite the following users to the %(roomName)s room:": "Aşağıdakı istifadəçiləri %(roomName)s otağına dəvət etmək alınmadı:", "Room %(roomId)s not visible": "Otaq %(roomId)s görünmür", "Messages": "Mesajlar", @@ -425,10 +400,6 @@ "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "E-poçtla dəvət etmək üçün şəxsiyyət serverindən istifadə edin. Defolt şəxsiyyət serverini (%(defaultIdentityServerName)s) istifadə etməyə və ya Parametrlərdə idarə etməyə davam edin.", "Use an identity server to invite by email. Manage in Settings.": "E-poçtla dəvət etmək üçün şəxsiyyət serverindən istifadə edin. Parametrlərdə idarə edin.", "Please supply a https:// or http:// widget URL": "Zəhmət olmasa https:// və ya http:// widget URL təmin edin", - "Device already verified!": "Cihaz artıq təsdiqləndi!", - "WARNING: Device already verified, but keys do NOT MATCH!": "XƏBƏRDARLIQ: Cihaz artıq təsdiqləndi, lakin açarlar uyğun gəlmir!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "XƏBƏRDARLIQ: ƏSAS VERIFİKASİYA VERİLİR! %(userId)s və cihaz %(deviceId)s üçün imza açarı \"%(fprint)s\" ilə təmin olunmayan \"%(fingerprint)s\". Bu, ünsiyyətlərinizin tutulduğunu ifadə edə bilər!", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Təqdim etdiyiniz imza açarı %(userId)s cihazının %(deviceId)s cihazından aldığınız imza açarına uyğundur. Cihaz təsdiqlənmiş kimi qeyd edildi.", "Forces the current outbound group session in an encrypted room to be discarded": "Şifrəli bir otaqda mövcud qrup sessiyasını ləğv etməyə məcbur edir", "Displays list of commands with usages and descriptions": "İstifadə qaydaları və təsvirləri ilə komanda siyahısını göstərir", "%(senderName)s requested a VoIP conference.": "%(senderName)s VoIP konfrans istədi.", diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index 108eb8ffb7..a62f66edfb 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -102,10 +102,6 @@ "Moderator": "Модератор", "Admin": "Администратор", "Start a chat": "Започване на чат", - "Who would you like to communicate with?": "С кой бихте желали да си комуникирате?", - "Start Chat": "Започни чат", - "Invite new room members": "Покана на нови членове в стаята", - "Send Invites": "Изпрати покани", "Failed to invite": "Неуспешна покана", "Failed to invite the following users to the %(roomName)s room:": "Следните потребителите не успяха да бъдат добавени в %(roomName)s:", "You need to be logged in.": "Трябва да влезете в профила си.", @@ -131,10 +127,7 @@ "You are now ignoring %(userId)s": "Вече игнорирате %(userId)s", "Unignored user": "Неигнориран потребител", "You are no longer ignoring %(userId)s": "Вече не игнорирате %(userId)s", - "Device already verified!": "Устройството е вече потвърдено!", - "WARNING: Device already verified, but keys do NOT MATCH!": "ВНИМАНИЕ: Устройстовото е потвърдено, но ключовете не съвпадат!", "Verified key": "Потвърден ключ", - "Unrecognised command:": "Неразпозната команда:", "Reason": "Причина", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s прие поканата за %(displayName)s.", "%(targetName)s accepted an invitation.": "%(targetName)s прие поканата.", @@ -171,7 +164,6 @@ "%(senderName)s made future room history visible to all room members.": "%(senderName)s направи бъдещата история на стаята видима за всички членове в нея.", "%(senderName)s made future room history visible to anyone.": "%(senderName)s направи бъдещата история на стаята видима за всеки.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s направи бъдещата история на стаята видима по непознат начин (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s включи шифроване от край до край (алгоритъм %(algorithm)s).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s от %(fromPowerLevel)s на %(toPowerLevel)s", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s смени нивото на достъп на %(powerLevelDiffText)s.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s смени закачените съобщения за стаята.", @@ -194,8 +186,6 @@ "Enable automatic language detection for syntax highlighting": "Включване на автоматично разпознаване на език за подчертаване на синтаксиса", "Automatically replace plain text Emoji": "Автоматично откриване и заместване на емотикони в текста", "Mirror local video feed": "Показвай ми огледално моя видео образ", - "Never send encrypted messages to unverified devices from this device": "Никога не изпращай шифровани съобщения от това устройство до непотвърдени устройства", - "Never send encrypted messages to unverified devices in this room from this device": "Никога не изпращай шифровани съобщения от това устройство до непотвърдени устройства в тази стая", "Enable inline URL previews by default": "Включване по подразбиране на URL прегледи", "Enable URL previews for this room (only affects you)": "Включване на URL прегледи за тази стая (засяга само Вас)", "Enable URL previews by default for participants in this room": "Включване по подразбиране на URL прегледи за участници в тази стая", @@ -223,10 +213,7 @@ "New Password": "Нова парола", "Confirm password": "Потвърждаване на парола", "Change Password": "Смяна на парола", - "Unable to load device list": "Неуспешно зареждане на списък с устройства", "Authentication": "Автентикация", - "Delete %(count)s devices|other": "Изтрий %(count)s устройства", - "Delete %(count)s devices|one": "Изтрий устройство", "Device ID": "Идентификатор на устройство", "Last seen": "Последно видян", "Failed to set display name": "Неуспешно задаване на име", @@ -244,9 +231,6 @@ "%(senderName)s sent a video": "%(senderName)s изпрати видео", "%(senderName)s uploaded a file": "%(senderName)s качи файл", "Options": "Настройки", - "Undecryptable": "Невъзможно разшифроване", - "Encrypted by an unverified device": "Шифровано от непотвърдено устройство", - "Unencrypted message": "Нешифровано съобщение", "Please select the destination room for this message": "Моля, изберете стаята, в която искате да изпратите това съобщение", "Blacklisted": "В черния списък", "device id: ": "идентификатор на устройството: ", @@ -266,8 +250,6 @@ "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.": "След като си намалите нивото на достъп, няма да можете да възвърнете тази промяна. Ако сте последния потребител с привилегии в тази стая, ще бъде невъзможно да възвърнете привилегии си.", "Are you sure?": "Сигурни ли сте?", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Няма да можете да възвърнете тази промяна, тъй като повишавате този потребител до същото ниво на достъп като Вашето.", - "No devices with registered encryption keys": "Няма устройства с регистрирани ключове за шифроване", - "Devices": "Устройства", "Unignore": "Премахни игнорирането", "Ignore": "Игнорирай", "Mention": "Спомени", @@ -287,20 +269,14 @@ "Voice call": "Гласово повикване", "Video call": "Видео повикване", "Upload file": "Качи файл", - "Show Text Formatting Toolbar": "Показване на лентата с инструменти за форматиране на текст", "Send an encrypted reply…": "Изпрати шифрован отговор…", "Send a reply (unencrypted)…": "Отговори (нешифрованo)…", "Send an encrypted message…": "Изпрати шифровано съобщение…", "Send a message (unencrypted)…": "Изпрати съобщение (нешифровано)…", "You do not have permission to post to this room": "Нямате разрешение да публикувате в тази стая", - "Hide Text Formatting Toolbar": "Скриване на лентата с инструменти за форматиране на текст", "Server error": "Сървърна грешка", "Server unavailable, overloaded, or something else went wrong.": "Сървърът е недостъпен, претоварен или нещо друго се обърка.", "Command error": "Грешка в командата", - "bold": "удебелен", - "italic": "курсивен", - "Markdown is disabled": "Markdown е изключен", - "Markdown is enabled": "Markdown е включен", "No pinned messages.": "Няма закачени съобщения.", "Loading...": "Зареждане...", "Pinned Messages": "Закачени съобщения", @@ -328,7 +304,6 @@ "Community Invites": "Покани за общност", "Invites": "Покани", "Favourites": "Любими", - "People": "Хора", "Low priority": "Нисък приоритет", "Historical": "Архив", "This room": "В тази стая", @@ -357,8 +332,6 @@ "Advanced": "Разширени", "Add a topic": "Добавете тема", "Jump to first unread message.": "Отиди до първото непрочетено съобщение.", - "Invalid alias format": "Невалиден формат на псевдонима", - "'%(alias)s' is not a valid format for an alias": "%(alias)s не е валиден формат на псевдоним", "not specified": "неопределен", "Remote addresses for this room:": "Отдалечени адреси на тази стая:", "Local addresses for this room:": "Локалните адреси на тази стая са:", @@ -408,8 +381,6 @@ "Community %(groupId)s not found": "Общност %(groupId)s не е намерена", "Create a new community": "Създаване на нова общност", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Създайте общност, за да групирате потребители и стаи! Изградете персонализирана начална страница, за да маркирате своето пространство в Matrix Вселената.", - "Unknown (user, device) pair:": "Непозната двойка (потребител, устройство):", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Подписващият ключ, който сте предоставили, съвпада с подписващия ключ, който сте получили от устройството %(deviceId)s на %(userId)s. Устройството е маркирано като потвърдено.", "Jump to message": "Отиди до съобщението", "Jump to read receipt": "Отиди до потвърждението за прочитане", "Revoke Moderator": "Премахване на правата на модератора", @@ -457,7 +428,6 @@ "Blacklist": "Добави в черен списък", "Unverify": "Махни потвърждението", "Verify...": "Потвърди...", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Вашето непотвърдено устройство '%(displayName)s' изисква ключове за шифроване.", "I have verified my email address": "Потвърдих имейл адреса си", "NOT verified": "НЕ е потвърдено", "verified": "потвърдено", @@ -543,18 +513,13 @@ "Unknown error": "Неизвестна грешка", "Incorrect password": "Неправилна парола", "Deactivate Account": "Затвори акаунта", - "Device name": "Име на устройство", - "Device key": "Ключ на устройство", - "Verify device": "Потвърждение на устройство", "Start verification": "Започни потвърждението", "Verification Pending": "Очакване на потвърждение", "Verification": "Потвърждение", "I verify that the keys match": "Потвърждавам, че ключовете съвпадат", "An error has occurred.": "Възникна грешка.", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Добавихте ново устройство '%(displayName)s', което изисква ключове за шифроване.", "Share without verifying": "Сподели без потвърждение", "Ignore request": "Игнорирай поканата", - "Loading device info...": "Зареждане на информация за устройството...", "Encryption key request": "Заявка за ключ за шифроване", "Unable to restore session": "Неуспешно възстановяване на сесията", "Invalid Email Address": "Невалиден имейл адрес", @@ -574,10 +539,6 @@ "Username available": "Потребителското име не е заето", "To get started, please pick a username!": "За да започнете, моля изберете потребителско име!", "If you already have a Matrix account you can log in instead.": "Ако вече имате Matrix профил, можете да влезете с него.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "В момента Вие блокирате непотвърдени устройства; за да изпращате съобщения до тези устройства, трябва да ги потвърдите.", - "Room contains unknown devices": "Стаята съдържа непознати устройства", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" съдържа устройства, който не сте виждали до сега.", - "Unknown devices": "Непознати устройства", "Private Chat": "Личен чат", "Public Chat": "Публичен чат", "Alias (optional)": "Псевдоним (по избор)", @@ -619,8 +580,6 @@ "Error whilst fetching joined communities": "Грешка при извличането на общности, към които сте присъединени", "You have no visible notifications": "Нямате видими известия", "Scroll to bottom of page": "Отиди до края на страницата", - "Message not sent due to unknown devices being present": "Съобщението не е изпратено поради наличието на непознати устройства", - "Show devices, send anyway or cancel.": "Покажи устройствата, изпрати въпреки това или откажи.", "%(count)s of your messages have not been sent.|other": "Някои от Вашите съобщение не бяха изпратени.", "%(count)s of your messages have not been sent.|one": "Вашето съобщение не беше изпратено.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Изпрати всички отново или откажи всички сега. Също така може да изберете индивидуални съобщения, които да изпратите отново или да откажете.", @@ -652,12 +611,9 @@ "Light theme": "Светла тема", "Dark theme": "Тъмна тема", "Success": "Успешно", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Вашата парола беше успешно сменена. Няма да получавате известия на други устройства, докато не влезете отново в профила си от тях", "": "<не се поддържа>", "Import E2E room keys": "Импортирай E2E ключове", "Cryptography": "Криптография", - "Device ID:": "Идентификатор на устройството:", - "Device key:": "Ключ на устройството:", "Riot collects anonymous analytics to allow us to improve the application.": "Riot събира анонимни статистики, за да ни позволи да подобрим приложението.", "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Поверителността е важна за нас, затова не събираме лични или идентифициращи Вас данни.", "Learn more about how we use analytics.": "Научете повече за това как използваме статистическите данни.", @@ -678,7 +634,6 @@ "click to reveal": "натиснете за показване", "Homeserver is": "Home сървър:", "Identity Server is": "Сървър за самоличност:", - "matrix-react-sdk version:": "Версия на matrix-react-sdk:", "riot-web version:": "Версия на riot-web:", "olm version:": "Версия на olm:", "Failed to send email": "Неуспешно изпращане на имейл", @@ -706,7 +661,6 @@ "Kicks user with given id": "Изгонва потребителя с даден идентификатор", "Changes your display nickname": "Сменя Вашия псевдоним", "Searches DuckDuckGo for results": "Търси в DuckDuckGo за резултати", - "Verifies a user, device, and pubkey tuple": "Потвърждава потребител, устройство или ключова двойка", "Ignores a user, hiding their messages from you": "Игнорира потребител, скривайки съобщенията му от Вас", "Stops ignoring a user, showing their messages going forward": "Спира игнорирането на потребител, показвайки съобщенията му занапред", "Commands": "Команди", @@ -726,7 +680,6 @@ "Claimed Ed25519 fingerprint key": "Заявен ключов отпечатък Ed25519", "End-to-end encryption information": "Информация за шифроването от край до край", "Event information": "Информация за събитието", - "Sender device information": "Информация за устройството на подателя", "Passphrases must match": "Паролите трябва да съвпадат", "Passphrase must not be empty": "Паролата не трябва да е празна", "Export room keys": "Експортиране на ключове за стаята", @@ -737,16 +690,10 @@ "File to import": "Файл за импортиране", "Import": "Импортирай", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Когато тази страница съдържа информация идентифицираща Вас (като например стая, потребител или идентификатор на група), тези данни биват премахнати преди да бъдат изпратени до сървъра.", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Има непознати устройства в тази стая. Ако продължите без да ги потвърдите, ще бъде възможно за някого да подслушва Вашия разговор.", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ВНИМАНИЕ: НЕУСПЕШНО ПОТВЪРЖДАВАНЕ НА КЛЮЧА! Ключът за подписване за %(userId)s и устройството %(deviceId)s е \"%(fprint)s\", което не съвпада с предоставения ключ \"%(fingerprint)s\". Това може да означава, че Вашата комуникация е прихваната!", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Смяната на парола ще нулира всички ключове за шифроване от край до край на всички устройства, правейки историята на шифрования чат невъзможна за четене, освен ако първо не експортирате ключовете за стаята и ги импортирате отново след това. В бъдеще това ще бъде подобрено.", "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?": "На път сте да бъдете отведени до друг сайт, където можете да удостоверите профила си за използване с %(integrationsUrl)s. Искате ли да продължите?", "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Сигурни ли сте, че искате да премахнете (изтриете) това събитие? Забележете, че ако изтриете събитие за промяна на името на стая или тема, това може да обърне промяната.", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "За да потвърдите, че на това устройство може да се вярва, моля свържете се със собственика му по друг начин (напр. на живо или чрез телефонен разговор) и го попитайте дали ключът, който той вижда в неговите настройки на потребителя за това устройство, съвпада с ключа по-долу:", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Ако съвпада, моля натиснете бутона за потвърждение по-долу. Ако не, то тогава някой друг имитира това устройство и вероятно искате вместо това да натиснете бутона за черен списък.", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Ако преди сте използвали по-нова версия на Riot, Вашата сесия може да не бъде съвместима с текущата версия. Затворете този прозорец и се върнете в по-новата версия.", "This will be your account name on the homeserver, or you can pick a different server.": "Това ще бъде името на профила Ви на Home сървъра, или можете да изберете друг сървър.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Препоръчваме Ви да минете през процеса за потвърждение за всяко устройство, за да потвърдите, че принадлежат на легитимен собственик. Ако предпочитате, можете да изпратите съобщение без потвърждение.", "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Засечени са данни от по-стара версия на Riot. Това ще доведе до неправилна работа на криптографията от край до край в по-старата версия. Шифрованите от край до край съобщения, които са били обменени наскоро (при използването на по-стара версия), може да не успеят да бъдат разшифровани в тази версия. Това също може да доведе до неуспех в обмяната на съобщения в тази версия. Ако имате проблеми, излезте и влезте отново в профила си. За да запазите историята на съобщенията, експортирайте и импортирайте отново Вашите ключове.", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Няма връзка с Home сървъра. Моля, проверете Вашата връзка. Уверете се, че SSL сертификатът на Home сървъра е надежден и че някое разширение на браузъра не блокира заявките.", "none": "няма", @@ -756,11 +703,7 @@ "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Експортираният файл може да бъде предпазен с парола. Трябва да въведете парола тук, за да разшифровате файла.", "Did you know: you can use communities to filter your Riot.im experience!": "Знаете ли, че: може да използвате общности, за да филтрирате Вашето Riot.im преживяване!", "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "За да създадете филтър, дръпнете и пуснете аватара на общността върху панела за филтриране в най-лявата част на екрана. По всяко време може да натиснете върху аватар от панела, за да видите само стаите и хората от тази общност.", - "Your key share request has been sent - please check your other devices for key share requests.": "Заявката за споделяне на ключ е изпратена. Моля, проверете заявките за споделяне на другите Ви устройства.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Заявки за споделяне на ключове се изпращат автоматично към другите Ви устройства. Ако сте ги отхвърлили от другите устройства, натиснете тук, за да заявите нови за тази сесия.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Ако другите Ви устройства нямат ключа за това съобщение, няма да можете да го разшифровате.", "Key request sent.": "Заявката за ключ е изпратена.", - "Re-request encryption keys from your other devices.": "Заявете отново ключове за шифроване от другите Ви устройства.", "Code": "Код", "If you've submitted a bug via GitHub, debug logs can help us track down the problem. 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.": "Ако сте изпратили грешка чрез GitHub, логовете за дебъгване могат да ни помогнат да проследим проблема. Логовете за дебъгване съдържат данни за използване на приложението, включващи потребителското Ви име, идентификаторите или псевдонимите на стаите или групите, които сте посетили, и потребителските имена на други потребители. Те не съдържат съобщения.", "Submit debug logs": "Изпрати логове за дебъгване", @@ -823,7 +766,6 @@ "Noisy": "Шумно", "Collecting app version information": "Събиране на информация за версията на приложението", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Изтриване на псевдонима %(alias)s на стаята и премахване на %(name)s от директорията?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Това ще Ви позволи да се върнете в профила си след излизане от него, и да влезете от други устройства.", "Enable notifications for this account": "Включване на известия за този профил", "Invite to this community": "Покани в тази общност", "Search…": "Търсене…", @@ -912,8 +854,6 @@ "Your User Agent": "Вашият браузър", "Your device resolution": "Разделителната способност на устройството Ви", "Always show encryption icons": "Винаги показвай икони за шифроване", - "Unable to reply": "Не може да се отговори", - "At this time it is not possible to reply with an emote.": "В момента не може да се отговори с емотикона.", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Не може да се зареди събитието, на което е отговорено. Или не съществува или нямате достъп да го видите.", "Popout widget": "Изкарай в нов прозорец", "Clear Storage and Sign Out": "Изчисти запазените данни и излез", @@ -965,12 +905,6 @@ "Permission Required": "Необходимо е разрешение", "A call is currently being placed!": "В момента се осъществява разговор!", "You do not have permission to start a conference call in this room": "Нямате достъп да започнете конферентен разговор в тази стая", - "deleted": "изтрито", - "underlined": "подчертано", - "inline-code": "код", - "block-quote": "цитат", - "bulleted-list": "списък (с тирета)", - "numbered-list": "номериран списък", "Failed to remove widget": "Неуспешно премахване на приспособление", "An error ocurred whilst trying to remove the widget from the room": "Възникна грешка при премахването на приспособлението от стаята", "System Alerts": "Системни уведомления", @@ -1059,11 +993,6 @@ "Encrypted messages in group chats": "Шифровани съобщения в групови чатове", "Delete Backup": "Изтрий резервното копие", "Unable to load key backup status": "Неуспешно зареждане на състоянието на резервното копие на ключа", - "Backup has a valid signature from this device": "Резервното копие има валиден подпис за това устройство", - "Backup has a valid signature from unverified device ": "Резервното копие има валиден подпис от непотвърдено устройство ", - "Backup has an invalid signature from verified device ": "Резервното копие има невалиден подпис от потвърдено устройство ", - "Backup has an invalid signature from unverified device ": "Резервното копие има невалиден подпис от непотвърдено устройство ", - "Backup is not signed by any of your devices": "Резервното копие не е подписано от нито едно Ваше устройство", "Backup version: ": "Версия на резервното копие: ", "Algorithm: ": "Алгоритъм: ", "Don't ask again": "Не питай пак", @@ -1090,7 +1019,6 @@ "This looks like a valid recovery key!": "Това изглежда като валиден ключ за възстановяване!", "Not a valid recovery key": "Не е валиден ключ за възстановяване", "Access your secure message history and set up secure messaging by entering your recovery key.": "Получете достъп до защитената история на съобщенията и настройте защитен чат, чрез въвеждане на ключа за възстановяване.", - "If you've forgotten your recovery passphrase you can ": "Ако сте забравили паролата за възстановяване, може да ", "Invalid homeserver discovery response": "Невалиден отговор по време на откриването на конфигурацията за сървъра", "Invalid identity server discovery response": "Невалиден отговор по време на откриването на конфигурацията за сървъра за самоличност", "General failure": "Обща грешка", @@ -1107,12 +1035,9 @@ "Your Recovery Key": "Вашия ключ за възстановяване", "Copy to clipboard": "Копирай в клипборд", "Download": "Свали", - "Your Recovery Key has been copied to your clipboard, paste it to:": "Ключа Ви за възстановяване беше копиран в клипборда, поставете го в:", - "Your Recovery Key is in your Downloads folder.": "Ключът Ви за възстановяване е в папка Изтеглени.", "Print it and store it somewhere safe": "Принтирайте го и го съхранявайте на безопасно място", "Save it on a USB key or backup drive": "Запазете го на USB или резервен диск", "Copy it to your personal cloud storage": "Копирайте го в персонално облачно пространство", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "Без настроено Възстановяване на Защитени Съобщения, няма да може да възстановите шифрованата история на съобщенията, в случай че излезете от профила си или използвате друго устройство.", "Set up Secure Message Recovery": "Настрой Възстановяване на Защитени Съобщения", "Keep it safe": "Пазете го в безопасност", "Create Key Backup": "Създай резервно копие на ключа", @@ -1123,7 +1048,6 @@ "Straight rows of keys are easy to guess": "Клавиши от прави редици са лесни за отгатване", "Short keyboard patterns are easy to guess": "Къси клавиатурни последователности са лесни за отгатване", "Custom user status messages": "Собствено статус съобщение", - "Backup has a valid signature from verified device ": "Резервното копие има валиден подпис от потвърдено устройство ", "Unable to load commit detail: %(msg)s": "Неуспешно зареждане на информация за commit: %(msg)s", "Set a new status...": "Задаване на нов статус...", "Clear status": "Изчисти статуса", @@ -1164,20 +1088,17 @@ "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Защитените съобщения с този потребител са шифровани от край-до-край и не могат да бъдат прочетени от други.", "Got It": "Разбрах", "Verify this user by confirming the following number appears on their screen.": "Потвърдете този потребител като се уверите, че следното число се вижда на екрана му.", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "За максимална сигурност, препоръчваме да го направите на живо или да използвате друг надежден начин за комуникация.", "Yes": "Да", "No": "Не", "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "Изпратихме Ви имейл за да потвърдим адреса Ви. Последвайте инструкциите в имейла и след това кликнете на бутона по-долу.", "Email Address": "Имейл адрес", "Backing up %(sessionsRemaining)s keys...": "Правене на резервно копие на %(sessionsRemaining)s ключа...", "All keys backed up": "Всички ключове са в резервното копие", - "Backup has a signature from unknown device with ID %(deviceId)s.": "Резервното копие съдържа подпис от непознато устройство с идентификатор %(deviceId)s.", "Add an email address to configure email notifications": "Добавете имейл адрес за да конфигурирате уведомления по имейл", "Unable to verify phone number.": "Неуспешно потвърждение на телефонния номер.", "Verification code": "Код за потвърждение", "Phone Number": "Телефонен номер", "Profile picture": "Профилна снимка", - "Upload profile picture": "Качи профилна снимка", "Display Name": "Име", "Room information": "Информация за стаята", "Internal room ID:": "Идентификатор на стаята:", @@ -1220,8 +1141,6 @@ "Voice & Video": "Глас и видео", "Main address": "Основен адрес", "Room avatar": "Снимка на стаята", - "Upload room avatar": "Качи снимка на стаята", - "No room avatar": "Няма снимка на стаята", "Room Name": "Име на стаята", "Room Topic": "Тема на стаята", "Join": "Присъедини се", @@ -1231,7 +1150,6 @@ "Waiting for partner to accept...": "Изчакване партньора да приеме...", "Use two-way text verification": "Използвай двустранно текстово потвърждение", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Потвърди потребителя и го маркирай като доверен. Доверяването на потребители Ви дава допълнително спокойствие при използване на съобщения шифровани от край-до-край.", - "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "Потвърждението на този потребител ще маркира устройството му като доверено, а Вашето ще бъде маркирано като доверено при него.", "Waiting for partner to confirm...": "Изчакване партньора да потвърди...", "Incoming Verification Request": "Входяща заявка за потвърждение", "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "За да се избегнат дублиращи се проблеми, моля първо прегледайте съществуващите проблеми (и гласувайте с +1) или създайте нов проблем, ако не сте намерили съществуващ.", @@ -1267,10 +1185,7 @@ "Keep going...": "Продължавайте...", "Starting backup...": "Започване на резервното копие...", "A new recovery passphrase and key for Secure Messages have been detected.": "Беше открита нова парола и ключ за Защитени Съобщения.", - "This device is encrypting history using the new recovery method.": "Устройството шифрова историята използвайки новия метод за възстановяване.", "Recovery Method Removed": "Методът за възстановяване беше премахнат", - "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "Устройството откри, че паролата за възстановяване и ключът за Защитени Съобщения са били премахнати.", - "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "Ако сте извършили това по погрешка, може да настройте Защитени Съобщения за това устройство, което ще зашифрова наново историята на съобщенията за това устройство, използвайки новия метод за възстановяване.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Ако не сте премахнали метода за възстановяване, е възможно нападател да се опитва да получи достъп до акаунта Ви. Променете паролата на акаунта и настройте нов метод за възстановяване веднага от Настройки.", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Файлът '%(fileName)s' надхвърля ограничението за размер на файлове за този сървър", "Gets or sets the room topic": "Взима или настройва темата на стаята", @@ -1329,7 +1244,6 @@ "Book": "Книга", "Pencil": "Молив", "Paperclip": "Кламер", - "Padlock": "Катинар", "Key": "Ключ", "Hammer": "Чук", "Telephone": "Телефон", @@ -1347,12 +1261,6 @@ "Headphones": "Слушалки", "Folder": "Папка", "Pin": "Кабърче", - "Your homeserver does not support device management.": "Вашият сървър не поддържа управление на устройствата.", - "This backup is trusted because it has been restored on this device": "Това резервно копие е доверено, понеже е било възстановено на това устройство", - "Some devices for this user are not trusted": "Някои устройства на този потребител не са доверени", - "Some devices in this encrypted room are not trusted": "Някои устройства в тази шифрована стая не са доверени", - "All devices for this user are trusted": "Всички устройства на този потребител са доверени", - "All devices in this encrypted room are trusted": "Всички устройства в тази шифрована стая са доверени", "Recovery Key Mismatch": "Ключа за възстановяване не съвпада", "Incorrect Recovery Passphrase": "Неправилна парола за възстановяване", "Backup could not be decrypted with this passphrase: please verify that you entered the correct recovery passphrase.": "Резервното копие не можа да бъде разшифровано с тази парола: потвърдете, че сте въвели правилната парола.", @@ -1362,16 +1270,13 @@ "This homeserver does not support communities": "Този сървър не поддържа общности", "A verification email will be sent to your inbox to confirm setting your new password.": "Ще Ви бъде изпратен имейл за потвърждение на новата парола.", "Your password has been reset.": "Паролата беше анулирана.", - "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Бяхте изхвърлени от профила на всички ваши устройства и вече няма да получавате известия на тях. За да включите известията отново, влезте пак от всяко едно устройство.", "This homeserver does not support login using email address.": "Този сървър не поддържа влизане в профил посредством имейл адрес.", "Registration has been disabled on this homeserver.": "Регистрацията е изключена на този сървър.", "Unable to query for supported registration methods.": "Неуспешно взимане на поддържаните методи за регистрация.", "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Сигурни ли сте? Ако нямате работещо резервно копие на ключовете, ще загубите достъп до шифрованите съобщения.", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Шифрованите съобщения са защитени с шифроване от край до край. Само Вие и получателят (получателите) имате ключове за четенето им.", "Restore from Backup": "Възстанови от резервно копие", - "This device is backing up your keys. ": "Това устройство прави резервни копия на ключовете. ", "Back up your keys before signing out to avoid losing them.": "Направете резервно копие на ключовете преди изход от профила, за да не ги загубите.", - "Your keys are not being backed up from this device.": "Това устройство не прави резервно копие на ключовете Ви.", "Start using Key Backup": "Включи резервни копия за ключовете", "Never lose encrypted messages": "Никога не губете шифровани съобщения", "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Съобщенията в тази стая са защитени с шифроване от край до край. Само Вие и получателят (получателите) имате ключове за разчитането им.", @@ -1390,7 +1295,6 @@ "Set up with a Recovery Key": "Настрой с ключ за възстановяване", "Please enter your passphrase a second time to confirm.": "Въведете паролата отново за потвърждение.", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "Ключът за възстановяване дава допълнителна сигурност - може да го използвате за да възстановите достъпа до шифрованите съобщения, в случай че забравите паролата.", - "Keep your recovery key somewhere very secure, like a password manager (or a safe)": "Пазете ключът за възстановяване на много сигурно място, например в password manager програма или сейф", "Your keys are being backed up (the first backup could take a few minutes).": "Прави се резервно копие на ключовете Ви (първото копие може да отнеме няколко минути).", "Secure your backup with a passphrase": "Защитете резервното копие с парола", "Confirm your passphrase": "Потвърдете паролата", @@ -1448,22 +1352,15 @@ "Power level": "Ниво на достъп", "Please install Chrome, Firefox, or Safari for the best experience.": "Инсталирайте Chrome, Firefox или Safari за най-добра работа.", "Want more than a community? Get your own server": "Искате повече от общност? Сдобийте се със собствен сървър", - "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "Промяната на паролата Ви, ще анулира всички ключове за шифроване от-край-до-край по всички Ваши устройства, правейки историята на чата нечетима. Настройте резервно копие на ключовете или експортирайте ключовете от друго устройство преди да промените паролата си.", "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Дали използвате 'breadcrumbs' функцията (аватари над списъка със стаи)", "Replying With Files": "Отговаряне с файлове", "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Все още не е възможно да отговорите с файл. Искате ли да качите файла без той да бъде отговор?", "The file '%(fileName)s' failed to upload.": "Файлът '%(fileName)s' не можа да бъде качен.", - "Room upgrade confirmation": "Потвърждение на обновяването на стаята", - "Upgrading a room can be destructive and isn't always necessary.": "Обновяването на стаята може да бъде деструктивно и не винаги е задължително.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Обновяването на стаи обикновено се препоръчва за стаи с версии считащи се за нестабилни. Нестабилните версии може да имат бъгове, липсващи функции или проблеми със сигурността.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Обновяванията на стаи обикновено повлияват само сървърната обработка. Ако имате проблем с Riot, моля съобщете за него със .", "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.": "Внимание: Обновяването на стаята няма автоматично да прехвърли членовете в новата версия на стаята. Ще изпратим съобщение в старата стая с връзка към новата - членовете на стаята ще трябва да кликнат на връзката за да влязат в новата стая.", "Adds a custom widget by URL to the room": "Добавя собствено приспособление от URL в стаята", "Please supply a https:// or http:// widget URL": "Моля, укажете https:// или http:// адрес на приспособление", "You cannot modify widgets in this room.": "Не можете да модифицирате приспособления в тази стая.", "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s премахна покана към %(targetDisplayName)s за присъединяване в стаята.", - "Enable desktop notifications for this device": "Включи известия на работния плот за това устройство", - "Enable audible notifications for this device": "Включи звукови уведомления за това устройство", "Upgrade this room to the recommended room version": "Обнови тази стая до препоръчаната версия на стаята", "This room is running room version , which this homeserver has marked as unstable.": "Тази стая използва версия на стая , която сървърът счита за нестабилна.", "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Обновяването на тази стая ще изключи текущата стая и ще създаде обновена стая със същото име.", @@ -1504,8 +1401,6 @@ "A conference call could not be started because the integrations server is not available": "Не може да бъде започнат конферентен разговор, защото сървърът за интеграции не е достъпен", "The server does not support the room version specified.": "Сървърът не поддържа указаната версия на стая.", "Name or Matrix ID": "Име или Matrix идентификатор", - "Email, name or Matrix ID": "Имейл, име или Matrix идентификатор", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Потвърдете, че искате да обновите стаята от до .", "Changes your avatar in this current room only": "Променя снимката Ви само в тази стая", "Unbans user with given ID": "Премахва блокирането на потребител с даден идентификатор", "Sends the given message coloured as a rainbow": "Изпраща текущото съобщение оцветено като дъга", @@ -1515,10 +1410,6 @@ "Sends the given emote coloured as a rainbow": "Изпраща дадената емоция, оцветена като дъга", "Show hidden events in timeline": "Покажи скрити събития по времевата линия", "When rooms are upgraded": "Когато стаите се актуализират", - "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Това устройстовото не архивира ключовете ви, вие обаче имате съществуващ архив, от който можете да ги възстановите и към който да ги добавяте в бъдеще.", - "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Преди да се отпишете, свържете устройство си към архивирането, за да предотвратите загуба на ключове, който може да се намират само на него.", - "Connect this device to Key Backup": "Свържете това устройство към Архивиране на ключове", - "Backup has an invalid signature from this device": "Архивирането получи невалиден подпис от това устройство", "this room": "тази стая", "View older messages in %(roomName)s.": "Виж по-стари съобщения в %(roomName)s.", "Joining room …": "Влизане в стая …", @@ -1612,8 +1503,6 @@ "Changes your avatar in all rooms": "Променя снимката ви във всички стаи", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Моля, кажете ни какво се обърка, или още по-добре - създайте проблем в GitHub обясняващ ситуацията.", "Removing…": "Премахване…", - "Clear all data on this device?": "Изчистване на всички данни от това устройство?", - "Clearing all data from this device is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Изчистването на всички данни от устройството е необратимо. Шифрованите съобщения ще бъдат загубени, освен ако не е било направено резервно копие на ключовете.", "Clear all data": "Изчисти всички данни", "Your homeserver doesn't seem to support this feature.": "Не изглежда сървърът ви да поддържа тази функция.", "Resend edit": "Изпрати наново корекцията", @@ -1621,14 +1510,12 @@ "Resend removal": "Изпрати наново премахването", "Failed to re-authenticate due to a homeserver problem": "Неуспешна повторна автентикация поради проблем със сървъра", "Failed to re-authenticate": "Неуспешна повторна автентикация", - "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.": "Възвърнете си достъпа до профила и възстановете ключовете за шифроване съхранени на това устройство. Без тях няма да можете да четете защитени съобщения на кое да е устройство.", "Enter your password to sign in and regain access to your account.": "Въведете паролата си за да влезете и да възстановите достъп до профила.", "Forgotten your password?": "Забравили сте си паролата?", "Sign in and regain access to your account.": "Влез и възвърни достъп до профила.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Не можете да влезете в профила си. Свържете се с администратора на сървъра за повече информация.", "You're signed out": "Излязохте от профила", "Clear personal data": "Изчисти личните данни", - "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.": "Внимание: личните ви данни (включително ключове за шифроване) все още се съхраняват на това устройство. Изчистете, ако сте приключили с използването на това устройство или искате да влезете в друг профил.", "Identity Server": "Сървър за самоличност", "Find others by phone or email": "Открийте други по телефон или имейл", "Be found by phone or email": "Бъдете открит по телефон или имейл", @@ -1641,7 +1528,6 @@ "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Попитайте администратора на сървъра ви (%(homeserverDomain)s) да конфигурира TURN сървър, за да може разговорите да работят надеждно.", "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.": "Като алтернатива, може да използвате публичния сървър turn.matrix.org, но той не е толкова надежден, а и IP адресът ви ще бъде споделен с него. Може да управлявате това в Настройки.", "Try using turn.matrix.org": "Опитай turn.matrix.org", - "Failed to start chat": "Неуспешно започване на чат", "Messages": "Съобщения", "Actions": "Действия", "Displays list of commands with usages and descriptions": "Показва списък с команди, начин на използване и описания", @@ -1667,7 +1553,6 @@ "Discovery": "Откриване", "Deactivate account": "Деактивиране на акаунт", "Always show the window menu bar": "Винаги показвай менютата на прозореца", - "A device's public name is visible to people you communicate with": "Публичното име на устройството е видимо от всички, с които комуникирате", "Unable to revoke sharing for email address": "Неуспешно оттегляне на споделянето на имейл адреса", "Unable to share email address": "Неуспешно споделяне на имейл адрес", "Revoke": "Оттегли", @@ -1680,7 +1565,6 @@ "Remove %(email)s?": "Премахни %(email)s?", "Remove %(phone)s?": "Премахни %(phone)s?", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "Беше изпратено SMS съобщение към +%(msisdn)s. Въведете съдържащият се код за потвърждение.", - "To verify that this device can be trusted, please check that the key you see in User Settings on that device matches the key below:": "За да потвърдите, че устройството е доверено, проверете дали ключът в Потребителски Настройки на устройството съвпада с ключа по-долу:", "Command Help": "Помощ за команди", "No identity server is configured: add one in server settings to reset your password.": "Не е конфигуриран сървър за самоличност: добавете такъв в настройки за сървъри за да може да възстановите паролата си.", "You do not have the required permissions to use this command.": "Нямате необходимите привилегии за да използвате тази команда.", @@ -1772,7 +1656,6 @@ "Add Phone Number": "Добави телефонен номер", "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.": "Това действие изисква връзка със сървъра за самоличност за валидиране на имейл адреса или телефонния номер, но сървърът не предоставя условия за ползване.", "Trust": "Довери се", - "Use the new, faster, composer for writing messages": "Използвай новия, по-бърз редактор за писане на съобщения", "Show previews/thumbnails for images": "Показвай преглед (умален размер) на снимки", "You should remove your personal data from identity server before disconnecting. Unfortunately, identity server is currently offline or cannot be reached.": "Би било добре да премахнете личните си данни от сървъра за самоличност преди прекъсване на връзката. За съжаление, сървърът за самоличност в момента не е достъпен.", "You should:": "Ще е добре да:", @@ -1841,8 +1724,6 @@ "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s започна гласово обаждане. (не се поддържа от този браузър)", "%(senderName)s placed a video call.": "%(senderName)s започна видео обаждане.", "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s започна видео обаждане. (не се поддържа от този браузър)", - "Send verification requests in direct message, including a new verification UX in the member panel.": "Изпращай заявки за потвърждение в директни съобщения, както и нов панел за верификация на членове.", - "Enable cross-signing to verify per-user instead of per-device (in development)": "Включи кръстосано-подписване, за да се верифицира на ниво потребител, а не устройство (в процес на разработка)", "Enable local event indexing and E2EE search (requires restart)": "Включи локални индексиране на събития и E2EE търсене (изисква рестартиране)", "Match system theme": "Напасване със системната тема", "My Ban List": "Моя списък с блокирания", @@ -1874,11 +1755,9 @@ "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s промени правило блокиращо достъпа до неща отговарящи на %(oldGlob)s към отговарящи на %(newGlob)s поради %(reason)s", "The message you are trying to send is too large.": "Съобщението, което се опитвате да изпратите е прекалено голямо.", "Cross-signing and secret storage are enabled.": "Кръстосано-подписване и секретно складиране са включени.", - "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this device.": "За вашия профил има самоличност за кръстосано-подписване в секретно складиране, но все още не е доверена от това устройство.", "Cross-signing and secret storage are not yet set up.": "Кръстосаното-подписване и секретно складиране все още не са настроени.", "Bootstrap cross-signing and secret storage": "Инициализирай кръстосано-подписване и секретно складиране", "Cross-signing public keys:": "Публични ключове за кръстосано-подписване:", - "on device": "на устройството", "not found": "не са намерени", "Cross-signing private keys:": "Private ключове за кръстосано подписване:", "in secret storage": "в секретно складиране", @@ -1888,10 +1767,7 @@ "Backup has a valid signature from this user": "Резервното копие има валиден подпис за този потребител", "Backup has a invalid signature from this user": "Резервното копие има невалиден подпис за този потребител", "Backup has a signature from unknown user with ID %(deviceId)s": "Резервното копие има подпис от непознат потребител с идентификатор %(deviceId)s", - "Backup has a signature from unknown device with ID %(deviceId)s": "Резервното копие има подпис от непознато устройство с идентификатор %(deviceId)s", - "Backup key stored in secret storage, but this feature is not enabled on this device. Please enable cross-signing in Labs to modify key backup state.": "Резервния ключ е съхранен в секретно складиране, но тази функция не е включена на това устройство. Включете кръстосано-подписване от Labs за да промените състоянието на резервното копие на ключа.", "Backup key stored: ": "Резервният ключ е съхранен: ", - "Start using Key Backup with Secure Secret Storage": "Започни използване на резервно копие на ключ в защитено секретно складиране", "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Използвай мениджър на интеграции %(serverName)s за управление на ботове, приспособления и стикери.", "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Използвай мениджър на интеграции за управление на ботове, приспособления и стикери.", "Manage integrations": "Управление на интеграциите", @@ -1928,11 +1804,6 @@ "Room ID or alias of ban list": "Идентификатор или име на стая списък за блокиране", "Subscribe": "Абонирай ме", "Cross-signing": "Кръстосано-подписване", - "This user has not verified all of their devices.": "Този потребител не е потвърдил всичките си устройства.", - "You have not verified this user. This user has verified all of their devices.": "Не сте потвърдили този потребител. Потребителят е потвърдил всичките си устройства.", - "You have verified this user. This user has verified all of their devices.": "Потвърдили сте този потребител. Потребителят е потвърдил всичките си устройства.", - "Some users in this encrypted room are not verified by you or they have not verified their own devices.": "Някои потребители в тази стая не са потвърдени от вас или не са потвърдили собствените си устройства.", - "All users in this encrypted room are verified by you and they have verified their own devices.": "Всички потребители в тази стая са потвърдени от вас и са потвърдили всичките си устройства.", "This message cannot be decrypted": "Съобщението не може да бъде дешифровано", "Unencrypted": "Нешифровано", "Close preview": "Затвори прегледа", @@ -1945,7 +1816,6 @@ "%(count)s verified sessions|other": "%(count)s потвърдени сесии", "%(count)s verified sessions|one": "1 потвърдена сесия", "Direct message": "Директно съобщение", - "Unverify user": "Отпотвърди потребители", "%(role)s in %(roomName)s": "%(role)s в%(roomName)s", "Messages in this room are end-to-end encrypted.": "Съобщенията в тази стая са шифровани от край-до-край.", "Verify": "Потвърди", @@ -1982,11 +1852,9 @@ "Enter secret storage passphrase": "Въведете парола за секретно складиране", "Unable to access secret storage. Please verify that you entered the correct passphrase.": "Неуспешен достъп до секретно складиране. Уверете се, че сте въвели правилната парола.", "Warning: You should only access secret storage from a trusted computer.": "Внимание: Трябва да достъпвате секретно складиране само от доверен компютър.", - "Access your secure message history and your cross-signing identity for verifying other devices by entering your passphrase.": "Въведете парола за да достъпите защитената история на съобщенията и самоличността за кръстосано-подписване и потвърждение на други устройства.", "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.": "Ако сте забравили паролата си, може да използвате ключ за възстановяване или да настройте опции за възстановяване.", "Enter secret storage recovery key": "Въведете ключ за възстановяване на секретно складиране", "Unable to access secret storage. Please verify that you entered the correct recovery key.": "Неуспешен достъп до секретно складиране. Подсигурете се, че сте въвели правилния ключ за възстановяване.", - "Access your secure message history and your cross-signing identity for verifying other devices by entering your recovery key.": "Въведете ключа за възстановяване за да достъпите защитената история на съобщенията и самоличността за кръстосано-подписване и потвърждение на други устройства.", "If you've forgotten your recovery key you can .": "Ако сте забравили ключа си за възстановяване, може да .", "Warning: You should only set up key backup from a trusted computer.": "Внимание: Трябва да настройвате резервно копие на ключове само от доверен компютър.", "If you've forgotten your recovery key you can ": "Ако сте забравили ключа за възстановяване, може да ", @@ -2000,36 +1868,20 @@ "Country Dropdown": "Падащо меню за избор на държава", "Verification Request": "Заявка за потвърждение", " (1/%(totalCount)s)": " (1/%(totalCount)s)", - "Secret Storage will be set up using your existing key backup details.Your secret storage passphrase and recovery key will be the same as they were for your key backup": "Секретно Складиране ще бъде настроено със съществуващия ви резервен ключ. Паролата и ключа за секретно складиране ще бъдат същите каквито са за резервно складиране", - "Warning: You should only set up secret storage from a trusted computer.": "Внимание: Желателно е да настройвате секретно складиране само от доверен компютър.", - "We'll use secret storage to optionally store an encrypted copy of your cross-signing identity for verifying other devices and message keys on our server. Protect your access to encrypted messages with a passphrase to keep it secure.": "Ще използваме секретно складиране за да предоставим опцията да се съхрани шифровано копие на идентичността ви за кръстосано-подписване, за потвърждаване на други устройства и ключове. Защитете достъпа си до шифровани съобщения с парола за да е защитено.", "Set up with a recovery key": "Настрой с ключ за възстановяване", "As a safety net, you can use it to restore your access to encrypted messages if you forget your passphrase.": "Като предпазна мярка, ако забравите паролата, може да го използвате за да възстановите достъпа до шифрованите съобщения.", "As a safety net, you can use it to restore your access to encrypted messages.": "Като предпазна мярка, може да го използвате за да възстановите достъпа до шифрованите съобщения.", "Keep your recovery key somewhere very secure, like a password manager (or a safe).": "Съхранявайте ключа за възстановяване на сигурно място, като в password manager (или сейф).", "Your recovery key has been copied to your clipboard, paste it to:": "Ключа за възстановяване беше копиран в клиборд, поставете го в:", "Your recovery key is in your Downloads folder.": "Ключа за възстановяване е във вашата папка Изтегляния.", - "Your access to encrypted messages is now protected.": "Достъпът ви до шифровани съобщения вече е защитен.", - "Without setting up secret storage, you won't be able to restore your access to encrypted messages or your cross-signing identity for verifying other devices if you log out or use another device.": "Без настройка на секретно складиране, ако излезе от профила или използвате друго устройство, няма да можете да възстановите достъпа до шифровани съобщения или идентичността за кръстосано-подписване за потвърждаване на други устройства.", - "Set up secret storage": "Настрой секретно складиране", - "Migrate from Key Backup": "Мигрирай от резервно копие на ключове", - "Secure your encrypted messages with a passphrase": "Защитете шифрованите съобщения с парола", "Storing secrets...": "Складиране на тайни...", "Unable to set up secret storage": "Неуспешна настройка на секретно складиране", - "New DM invite dialog (under development)": "Нов процес за канене чрез директни съобщения (все още се разработва)", "Show info about bridges in room settings": "Показвай информация за връзки с други мрежи в настройките на стаята", - "This bridge was provisioned by ": "Тази връзка с друга мрежа е била настроена от ", "This bridge is managed by .": "Тази връзка с друга мрежа се управлява от .", - "Bridged into , on ": "Свързано с , посредством ", - "Connected to on ": "Свързано с посредством ", - "Connected via %(protocolName)s": "Свързано посредством %(protocolName)s", - "Bridge Info": "Информация за връзката с друга мрежа", - "Below is a list of bridges connected to this room.": "По-долу е списък на връзки с други мрежи свързани с тази стая.", "Recent Conversations": "Скорошни разговори", "Suggestions": "Предложения", "Show more": "Покажи повече", "Direct Messages": "Директни съобщения", - "If you can't find someone, ask them for their username, or share your username (%(userId)s) or profile link.": "Ако не можете да намерите някой, питайте за потребителското им име, или споделете своето (%(userId)s) или връзка към профила.", "Go": "Давай", "Failed to find the following users": "Неуспешно откриване на следните потребители", "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "Следните потребители не съществуват или са невалидни и не могат да бъдат поканени: %(csvNames)s" diff --git a/src/i18n/strings/ca.json b/src/i18n/strings/ca.json index 77c8a9e635..87e90fec9d 100644 --- a/src/i18n/strings/ca.json +++ b/src/i18n/strings/ca.json @@ -1,5 +1,4 @@ { - "People": "Gent", "Add a widget": "Afegeix un giny", "Account": "Compte", "No Microphones detected": "No s'ha detectat cap micròfon", @@ -42,7 +41,6 @@ "This phone number is already in use": "Aquest número de telèfon ja està en ús", "Failed to verify email address: make sure you clicked the link in the email": "No s'ha pogut verificar l'adreça de correu electrònic. Assegureu-vos de fer clic a l'enllaç del correu electrònic de verificació", "Call Failed": "No s'ha pogut realitzar la trucada", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Hi ha dispositius desconeguts a aquesta sala: si continueu sense verificar-los, és possible que algú escolti la vostra trucada.", "Review Devices": "Revisió de dispositius", "Call Anyway": "Truca de totes maneres", "Answer Anyway": "Contesta de totes maneres", @@ -105,10 +103,6 @@ "Moderator": "Moderador", "Admin": "Administrador", "Start a chat": "Comença un xat", - "Who would you like to communicate with?": "Amb qui us voleu comunicar?", - "Start Chat": "Comença un xat", - "Invite new room members": "Convida a nous membres a la sala", - "Send Invites": "Envia invitacions", "Failed to invite": "No s'ha pogut tramitar la invitació", "Failed to invite the following users to the %(roomName)s room:": "No s'ha pogut convidar a la sala %(roomName)s els següents usuaris:", "You need to be logged in.": "És necessari estar autenticat.", @@ -130,14 +124,8 @@ "You are now ignoring %(userId)s": "Esteu ignorant l'usuari %(userId)s", "Unignored user": "Usuari no ignorat", "You are no longer ignoring %(userId)s": "Ja no esteu ignorant l'usuari %(userId)s", - "Device already verified!": "El dispositiu ja estava verificat!", - "WARNING: Device already verified, but keys do NOT MATCH!": "AVÍS: El dispositiu ja estava verificat, però les claus NO COINCIDEIXEN!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "AVÍS: NO S'HA POGUT VERIFICAR! La clau de signatura de l'usuari %(userId)s i el dispositiu %(deviceId)s és \"%(fprint)s\", però no coincideix amb la clau \"%(fingerprint)s\". Això pot voler dir que les vostres comunicacions estan sent interceptades!", "Verified key": "Claus verificades", "Call Timeout": "Temps d'espera de les trucades", - "Unknown (user, device) pair:": "Parell desconegut (usuari, dispositiu):", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "La clau de signatura que heu proporcionat coincideix amb la clau de signatura que heu rebut del dispositiu %(deviceId)s de l'usuari %(userId)s. S'ha marcat el dispositiu com a dispositiu verificat.", - "Unrecognised command:": "Ordre no reconegut:", "Reason": "Raó", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s ha acceptat la invitació de %(displayName)s.", "%(targetName)s accepted an invitation.": "%(targetName)s ha acceptat una invitació.", @@ -174,7 +162,6 @@ "%(senderName)s made future room history visible to all room members.": "%(senderName)s ha fet visible l'històric futur de la sala a tots els membres de la sala.", "%(senderName)s made future room history visible to anyone.": "%(senderName)s ha fet visible el futur historial de la sala per a tothom.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s ha fet visible el futur historial de la sala per a desconeguts (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ha activat el xifratge d'extrem a extrem (algoritme %(algorithm)s).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s a %(toPowerLevel)s", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ha canviat el nivell de poders de %(powerLevelDiffText)s.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s ha canviat els missatges fixats de la sala.", @@ -196,7 +183,6 @@ "Autoplay GIFs and videos": "Reprodueix de forma automàtica els GIF i vídeos", "Enable automatic language detection for syntax highlighting": "Activa la detecció automàtica d'idiomes per al ressaltat de sintaxi", "Automatically replace plain text Emoji": "Substitueix automàticament Emoji de text pla", - "Never send encrypted messages to unverified devices in this room from this device": "No enviïs mai missatges xifrats a dispositius no verificats en aquesta sala des d'aquest dispositiu", "Enable inline URL previews by default": "Activa per defecte la vista prèvia d'URL en línia", "Enable URL previews for this room (only affects you)": "Activa la vista prèvia d'URL d'aquesta sala (no afecta altres usuaris)", "Enable URL previews by default for participants in this room": "Activa per defecte la vista prèvia d'URL per als participants d'aquesta sala", @@ -204,7 +190,6 @@ "Active call (%(roomName)s)": "Trucada activa (%(roomName)s)", "unknown caller": "trucada d'un desconegut", "Incoming voice call from %(name)s": "Trucada de veu entrant de %(name)s", - "Never send encrypted messages to unverified devices from this device": "No enviïs mai missatges xifrats a dispositius no verificats des d'aquest dispositiu", "Incoming video call from %(name)s": "Trucada de vídeo entrant de %(name)s", "Incoming call from %(name)s": "Trucada entrant de %(name)s", "Decline": "Declina", @@ -218,7 +203,6 @@ "No display name": "Sense nom visible", "New passwords don't match": "Les noves contrasenyes no coincideixen", "Passwords can't be empty": "Les contrasenyes no poden estar buides", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Si canvieu la contrasenya, es reiniciaran totes les actuals claus de xifratge d'extrem per a tots els dispositius, fent que l'historial xifrat no sigui llegible, tret que primer exporteu les claus de la vostra sala i les torneu a importar després. En un futur això serà millorat.", "Export E2E room keys": "Exporta les claus E2E de la sala", "Do you want to set an email address?": "Voleu establir una adreça de correu electrònic?", "Current password": "Contrasenya actual", @@ -226,10 +210,7 @@ "New Password": "Nova contrasenya", "Confirm password": "Confirma la contrasenya", "Change Password": "Canvia la contrasenya", - "Unable to load device list": "No s'ha pogut carregar la llista de dispositius", "Authentication": "Autenticació", - "Delete %(count)s devices|other": "Suprimeix %(count)s dispositius", - "Delete %(count)s devices|one": "Suprimeix el dispositiu", "Device ID": "ID del dispositiu", "Last seen": "Vist per última vegada", "Failed to set display name": "No s'ha pogut establir el nom visible", @@ -246,9 +227,6 @@ "%(senderName)s sent a video": "%(senderName)s ha enviat un vídeo", "%(senderName)s uploaded a file": "%(senderName)s ha pujat un fitxer", "Options": "Opcions", - "Undecryptable": "Indesxifrable", - "Encrypted by an unverified device": "Xifrat per un dispositiu no verificat", - "Unencrypted message": "Missatge no xifrat", "Please select the destination room for this message": "Si us plau, seleccioneu la sala destinatària per a aquest missatge", "Blacklisted": "Llista negre", "device id: ": "ID del dispositiu: ", @@ -269,8 +247,6 @@ "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.": "No podreu desfer aquest canvi ja que estareu baixant de grau de privilegis. Només un altre usuari amb més privilegis podrà fer que els recupereu.", "Are you sure?": "Esteu segur?", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "No podreu desfer aquesta acció ja que esteu donant al usuari el mateix nivell de privilegi que el vostre.", - "No devices with registered encryption keys": "No hi ha cap dispositiu amb les claus de xifratge registrades", - "Devices": "Dispositius", "Unignore": "Deixa de ignorar", "Ignore": "Ignora", "Jump to read receipt": "Vés a l'últim missatge llegit", @@ -292,21 +268,15 @@ "Voice call": "Trucada de veu", "Video call": "Trucada de vídeo", "Upload file": "Puja un fitxer", - "Show Text Formatting Toolbar": "Mostra la barra d'eines de format de text", "Send an encrypted reply…": "Envia una resposta xifrada…", "Send a reply (unencrypted)…": "Envia una resposta (sense xifrar)…", "Send an encrypted message…": "Envia un missatge xifrat…", "Send a message (unencrypted)…": "Envia un missatge (sense xifrar)…", "You do not have permission to post to this room": "No teniu el permís per escriure en aquesta sala", - "Hide Text Formatting Toolbar": "Amaga la barra d'eines de format de text", "Server error": "S'ha produït un error al servidor", "Mirror local video feed": "Mostra el vídeo local com un mirall", "Server unavailable, overloaded, or something else went wrong.": "El servidor no està disponible, està sobrecarregat o alguna altra cosa no ha funcionat correctament.", "Command error": "S'ha produït un error en l'ordre", - "bold": "negreta", - "italic": "cursiva", - "Markdown is disabled": "El Markdown està desactivat", - "Markdown is enabled": "El Markdown està activat", "Jump to message": "Salta al missatge", "No pinned messages.": "No hi ha cap missatge fixat.", "Loading...": "S'està carregant...", @@ -362,8 +332,6 @@ "Permissions": "Permisos", "Add a topic": "Afegeix un tema", "Jump to first unread message.": "Salta al primer missatge no llegit.", - "Invalid alias format": "El format de l'àlies no és vàlid", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' no és un format d'àlies vàlid", "Anyone who knows the room's link, including guests": "Qualsevol que conegui l'enllaç de la sala, inclosos els usuaris d'altres xarxes", "not specified": "sense especificar", "Remote addresses for this room:": "Adreces remotes per a aquesta sala:", @@ -521,19 +489,11 @@ "Unknown error": "S'ha produït un error desconegut", "Incorrect password": "Contrasenya incorrecta", "Deactivate Account": "Desactivar el compte", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Per verificar que es pot confiar en aquest dispositiu, poseu-vos en contacte amb el propietari mitjançant altres mitjans (per exemple, en persona o amb una trucada telefònica) i pregunteu-li si la clau que veuen a la configuració del seu usuari, aquest dispositiu coincideix amb la següent clau:", - "Device name": "Nom del dispositiu", - "Device key": "Clau del dispositiu", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Si coincideix, premeu el botó de verificació de sota. Si no coincideix, algú més està interceptant aquest dispositiu i probablement voleu prémer el botó de llista negra.", - "Verify device": "Verifica el dispositiu", "I verify that the keys match": "Verifico que les claus coincideixen", "An error has occurred.": "S'ha produït un error.", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Heu afegit el nou dispositiu «%(displayName)s», que està demanant les claus de xifratge.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "El dispositiu no verificat «%(displayName)s» està demanant les claus de xifratge.", "Start verification": "Inicia la verificació", "Share without verifying": "Comparteix sense verificar", "Ignore request": "Ignora la sol·licitud", - "Loading device info...": "S'està carregant la informació del dispositiu...", "Encryption key request": "Sol·licitud de claus", "Unable to restore session": "No s'ha pogut restaurar la sessió", "Invalid Email Address": "El correu electrònic no és vàlid", @@ -552,11 +512,6 @@ "This will be your account name on the homeserver, or you can pick a different server.": "Aquest serà el nom del seu compte al servidor amfitrió, o bé trieu-ne un altre different server.", "If you already have a Matrix account you can log in instead.": "Si ja teniu un compte a Matrix, podeu log in.", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Si anteriorment heu utilitzat un versió de Riot més recent, la vostra sessió podría ser incompatible amb aquesta versió. Tanqueu aquesta finestra i torneu a la versió més recent.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Actualment teniu a la llista negre els dispositius no verificats; per enviar missatges a aquests dispositius, els heu de verificar abans.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Recomanem que dugueu a terme el procès de verificació per a cada dispositiu per tal de confirmar que són del legítim propietari, però podeu enviar el missatge sense verificar-ho si ho preferiu.", - "Room contains unknown devices": "Hi ha dispositius desconeguts a la sala", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "A la sala «%(RoomName)s» hi ha dispositius que no havíeu vist abans.", - "Unknown devices": "Dispositius desconeguts", "Private Chat": "Xat privat", "Public Chat": "Xat públic", "Custom": "Personalitzat", @@ -613,7 +568,6 @@ "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Crea una comunitat per agrupar usuaris i sales! Creeu una pàgina d'inici personalitzada per definir el vostre espai a l'univers Matrix.", "You have no visible notifications": "No teniu cap notificació visible", "Scroll to bottom of page": "Desplaça't fins a la part inferior de la pàgina", - "Message not sent due to unknown devices being present": "El missatge no s'ha enviat perquè hi ha dispositius desconeguts presents", "%(count)s of your messages have not been sent.|other": "Alguns dels vostres missatges no s'han enviat.", "%(count)s of your messages have not been sent.|one": "El vostre missatge no s'ha enviat.", "Warning": "Avís", @@ -636,7 +590,6 @@ "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "S'ha intentat carregar un punt específic dins la línia de temps d'aquesta sala, però no teniu permís per veure el missatge en qüestió.", "Tried to load a specific point in this room's timeline, but was unable to find it.": "S'ha intentat carregar un punt específic de la línia de temps d'aquesta sala, però no s'ha pogut trobar.", "Failed to load timeline position": "No s'ha pogut carregar aquesta posició de la línia de temps", - "Show devices, send anyway or cancel.": "Mostra els dispositius, envia de totes maneres o cancel·la.", "Signed Out": "Sessió tancada", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Reenviar tot o cancel·lar tot ara. També pots seleccionar missatges individualment per reenviar o cancel·lar.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Reenviar missarge o cancel·lar missatge ara.", @@ -648,10 +601,7 @@ "Sign out": "Tancar sessió", "Import E2E room keys": "Importar claus E2E de sala", "Cryptography": "Criptografia", - "Device ID:": "ID del dispositiu:", - "Device key:": "Clau del dispositiu:", "Labs": "Laboraroris", - "matrix-react-sdk version:": "Versió de matrix-react-sdk:", "riot-web version:": "Versió de riot-web:", "olm version:": "Versió d'olm:", "Incorrect username and/or password.": "Usuari i/o contrasenya incorrectes.", @@ -664,7 +614,6 @@ "Event information": "Informació d'esdeveniment", "User ID": "ID de l'usuari", "Decryption error": "Error de desxifratge", - "Sender device information": "Informació del dispositiu remitent", "Export room keys": "Exporta les claus de la sala", "Upload an avatar:": "Pujar un avatar:", "Confirm passphrase": "Introduïu una contrasenya", @@ -736,7 +685,6 @@ "Noisy": "Sorollós", "Collecting app version information": "S'està recollint la informació de la versió de l'aplicació", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Voleu esborrar de la sala l'alies %(alias)s i retirar %(name)s del directori?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Això farà possible que pugueu tronar al vostre compte des de qualsevol dispositiu.", "Enable notifications for this account": "Habilita les notificacions per aquest compte", "Invite to this community": "Convida a aquesta comunitat", "Search…": "Cerca…", @@ -847,7 +795,6 @@ "Define the power level of a user": "Defineix el nivell d'autoritat d'un usuari", "Deops user with given id": "Degrada l'usuari amb l'id donat", "Opens the Developer Tools dialog": "Obre el diàleg d'Eines del desenvolupador", - "Verifies a user, device, and pubkey tuple": "Verifica un usuari, dispositiu i tupla de clau pública", "Displays action": "Mostra l'acció", "Whether or not you're logged in (we don't record your username)": "Si heu iniciat sessió o no (no desem el vostre usuari)", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "El fitxer %(fileName)s supera el límit de pujades del servidor", diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 5aacb27c80..53126e8ff6 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -8,11 +8,9 @@ "Logout": "Odhlásit se", "Low priority": "Nízká priorita", "Notifications": "Upozornění", - "People": "Lidé", "Rooms": "Místnosti", "Search": "Hledání", "Settings": "Nastavení", - "Start Chat": "Začít chat", "This room": "Tato místnost", "Video call": "Videohovor", "Voice call": "Telefonát", @@ -94,7 +92,6 @@ "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s odstranil/a název místnosti.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s změnil/a téma na „%(topic)s“.", "Changes your display nickname": "Změní vaši zobrazovanou přezdívku", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "V současnosti změna hesla resetuje všechny šifrovací klíče na všech zařízeních, což vám znepřístupní historii zašifrovaných chatů, pokud si nejprve nevyexportujete klíče svých místností a pak je do nich znova nevložíte. Toto bude v budoucnu lépe ošetřeno.", "Command error": "Chyba příkazu", "Commands": "Příkazy", "Confirm password": "Potvrďte heslo", @@ -111,12 +108,8 @@ "Decryption error": "Chyba dešifrování", "Delete widget": "Vymazat widget", "Default": "Výchozí", - "Device already verified!": "Zařízení již bylo ověřeno!", "Device ID": "ID zařízení", - "Device ID:": "ID zařízení:", "device id: ": "id zařízení: ", - "Device key:": "Klíč zařízení:", - "Devices": "Zařízení", "Direct chats": "Přímé chaty", "Disable Notifications": "Vypnout upozornění", "Disinvite": "Odvolat pozvání", @@ -128,7 +121,6 @@ "Emoji": "Emodži", "Enable automatic language detection for syntax highlighting": "Zapnout kvůli zvýrazňování syntaxe automatické rozpoznávání jazyka", "Enable Notifications": "Zapnout upozornění", - "Encrypted by an unverified device": "Zašifrováno neověřeným zařízením", "%(senderName)s ended the call.": "%(senderName)s ukončil/a hovor.", "End-to-end encryption information": "Informace o end-to-end šifrování", "Enter passphrase": "Zadejte heslo", @@ -174,13 +166,10 @@ "Incoming voice call from %(name)s": "Příchozí hlasový hovor od %(name)s", "Incorrect username and/or password.": "Nesprávné uživatelské jméno nebo heslo.", "Incorrect verification code": "Nesprávný ověřovací kód", - "Invalid alias format": "Neplaný formát aliasu", "Invalid Email Address": "Neplatná e-mailová adresa", "%(senderName)s invited %(targetName)s.": "%(senderName)s pozval/a %(targetName)s.", - "Invite new room members": "Pozvat do místnosti nové členy", "Invites": "Pozvánky", "Invites user with given id to current room": "Pozve do aktuální místnosti uživatele s daným id", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' není platný formát aliasu", "Join Room": "Vstoupit do místnosti", "%(targetName)s joined the room.": "%(targetName)s vstoupil/a do místnosti.", "%(senderName)s kicked %(targetName)s.": "%(senderName)s vykopnul/a %(targetName)s.", @@ -189,7 +178,6 @@ "Last seen": "Naposledy viděn/a", "Leave room": "Odejít z místnosti", "Local addresses for this room:": "Místní adresy této místnosti:", - "matrix-react-sdk version:": "Verze matrix-react-sdk:", "Moderator": "Moderátor", "Name": "Jméno", "New address (e.g. #foo:%(localDomain)s)": "Nová adresa (např. #neco:%(localDomain)s)", @@ -224,13 +212,11 @@ "riot-web version:": "verze riot-web:", "Room %(roomId)s not visible": "Místnost %(roomId)s není viditelná", "Room Colour": "Barva místnosti", - "Room contains unknown devices": "V místnosti jsou neznámá zařízení", "%(roomName)s does not exist.": "%(roomName)s neexistuje.", "%(roomName)s is not accessible at this time.": "Místnost %(roomName)s není v tuto chvíli dostupná.", "Save": "Uložit", "Scroll to bottom of page": "Přejít na konec stránky", "Send anyway": "Přesto poslat", - "Sender device information": "Informace o zařízení odesílatele", "Send Reset Email": "Poslat resetovací e-mail", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s poslal/a obrázek.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s poslal/a %(targetDisplayName)s pozvánku ke vstupu do místnosti.", @@ -251,7 +237,6 @@ "Submit": "Odeslat", "Success": "Úspěch", "The phone number entered looks invalid": "Zadané telefonní číslo se zdá být neplatné", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Zadaný podepisovaný klíč se shoduje s klíčem obdrženým od uživatele %(userId)s ze zařízení %(deviceId)s. Zařízení je označeno jako ověřené.", "This email address is already in use": "Tato e-mailová adresa je již používaná", "This email address was not found": "Tato e-mailová adresa nebyla nalezena", "This room has no local addresses": "Tato místnost nemá žádné místní adresy", @@ -260,7 +245,6 @@ "Warning!": "Varování!", "Who can access this room?": "Kdo má přístup k této místnosti?", "Who can read history?": "Kdo může číst historii?", - "Who would you like to communicate with?": "S kým byste chtěli komunikovat?", "You are not in this room.": "Nejste v této místnosti.", "You do not have permission to do that in this room.": "V této místnosti nemáte na toto právo.", "You cannot place a call with yourself.": "Nemůžete volat sami sobě.", @@ -288,7 +272,6 @@ "To use it, just wait for autocomplete results to load and tab through them.": "Použijte tak, že vyčkáte na načtení našeptávaných výsledků a ty pak projdete tabulátorem.", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Nemáte práva k zobrazení zprávy v daném časovém úseku.", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Zpráva v daném časovém úseku nenalezena.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s zapnul/a end-to-end šifrování (algoritmus %(algorithm)s).", "Unable to add email address": "Nepodařilo se přidat e-mailovou adresu", "Unable to create widget.": "Nepodařilo se vytvořit widget.", "Unable to remove contact information": "Nepodařilo se smazat kontaktní údaje", @@ -297,17 +280,12 @@ "%(senderName)s unbanned %(targetName)s.": "%(senderName)s přijal/a zpět %(targetName)s.", "Unable to capture screen": "Nepodařilo se zachytit obrazovku", "Unable to enable Notifications": "Nepodařilo se povolit upozornění", - "Unable to load device list": "Nepodařilo se načíst seznam zařízení", - "Undecryptable": "Nerozšifrovatelné", "unencrypted": "nešifrované", - "Unencrypted message": "Nešifrovaná zpráva", "unknown caller": "neznámý volající", "unknown device": "neznámé zařízení", "Unknown room %(roomId)s": "Neznámá místnost %(roomId)s", - "Unknown (user, device) pair:": "Neznámý pár (uživatel, zařízení):", "Unmute": "Povolit", "Unnamed Room": "Nepojmenovaná místnost", - "Unrecognised command:": "Nerozpoznaný příkaz:", "Unrecognised room alias:": "Nerozpoznaný alias místnosti:", "Uploading %(filename)s and %(count)s others|zero": "Nahrávám %(filename)s", "Uploading %(filename)s and %(count)s others|one": "Nahrávám %(filename)s a %(count)s další", @@ -326,7 +304,6 @@ "Verified key": "Ověřený klíč", "(no answer)": "(žádná odpověď)", "(unknown failure: %(reason)s)": "(neznámá chyba: %(reason)s)", - "WARNING: Device already verified, but keys do NOT MATCH!": "VAROVÁNÍ: Zařízení byl již ověřeno, ale klíče se NESHODUJÍ!", "The remote side failed to pick up": "Vzdálené straně se nepodařilo hovor přijmout", "Who would you like to add to this community?": "Koho chcete přidat do této skupiny?", "Invite new community members": "Pozvěte nové členy skupiny", @@ -344,7 +321,6 @@ "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s", "Failed to add the following rooms to %(groupId)s:": "Nepodařilo se přidat následující místnosti do %(groupId)s:", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Vaše e-mailová adresa zřejmě nepatří k žádnému Matrix ID na tomto domovském serveru.", - "Send Invites": "Odeslat pozvánky", "Failed to invite": "Pozvání se nezdařilo", "Failed to invite the following users to the %(roomName)s room:": "Do místnosti %(roomName)s se nepodařilo pozvat následující uživatele:", "You need to be logged in.": "Musíte být přihlášen/a.", @@ -354,7 +330,6 @@ "Unpin Message": "Odepnout zprávu", "Ignored user": "Ignorovaný uživatel", "Unignored user": "Odignorovaný uživatel", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "VAROVÁNÍ: OVĚŘENÍ KLÍČE SELHALO! Podepisovací klíč uživatele %(userId)s a zařízení %(deviceId)s je „%(fprint)s“, což nesouhlasí s dodaným klíčem „%(fingerprint)s“. Toto může znamenat, že vaše komunikace je odposlouchávána!", "Reason": "Důvod", "VoIP conference started.": "VoIP konference započata.", "VoIP conference finished.": "VoIP konference ukončena.", @@ -371,8 +346,6 @@ "Unignore": "Odignorovat", "Ignore": "Ignorovat", "Admin Tools": "Nástroje pro správce", - "bold": "tučně", - "italic": "kurzíva", "No pinned messages.": "Žádné připíchnuté zprávy.", "Pinned Messages": "Připíchnuté zprávy", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s odstranil/a svoje zobrazované jméno (%(oldDisplayName)s).", @@ -404,18 +377,14 @@ "Create": "Vytvořit", "User Options": "Volby uživatele", "Please select the destination room for this message": "Vyberte prosím pro tuto zprávu cílovou místnost", - "No devices with registered encryption keys": "Žádná zařízení se zaregistrovanými šifrovacími klíči", "Jump to read receipt": "Skočit na poslední potvrzení o přečtení", "Invite": "Pozvat", "Revoke Moderator": "Odebrat moderátorství", "Make Moderator": "Udělit moderátorství", "and %(count)s others...|one": "a někdo další...", "Hangup": "Zavěsit", - "Show Text Formatting Toolbar": "Zobrazit nástroje formátování textu", - "Hide Text Formatting Toolbar": "Skrýt nástroje formátování textu", "Jump to message": "Přeskočit na zprávu", "Loading...": "Načítání...", - "Loading device info...": "Načítá se info o zařízení...", "You seem to be uploading files, are you sure you want to quit?": "Zřejmě právě nahráváte soubory. Chcete přesto odejít?", "You seem to be in a call, are you sure you want to quit?": "Zřejmě máte probíhající hovor. Chcete přesto odejít?", "Idle": "Nečinný/á", @@ -431,8 +400,6 @@ "Mention": "Zmínit", "Blacklisted": "Na černé listině", "Invited": "Pozvaní", - "Markdown is disabled": "Markdown je vypnutý", - "Markdown is enabled": "Markdown je zapnutý", "Joins room with given alias": "Vstoupí do místnosti s daným aliasem", "Leave Community": "Odejít ze skupiny", "Leave %(groupName)s?": "Odejít z %(groupName)s?", @@ -446,7 +413,6 @@ "Failed to fetch avatar URL": "Nepodařilo se získat adresu avataru", "Error decrypting audio": "Chyba při dešifrování zvuku", "Banned by %(displayName)s": "Vykázán/a uživatelem %(displayName)s", - "Never send encrypted messages to unverified devices in this room from this device": "Nikdy z tohoto zařízení neposílat šifrované zprávy neověřeným zařízením v této místnosti", "Privileged Users": "Privilegovaní uživatelé", "No users have specific privileges in this room": "Žádní uživatelé v této místnosti nemají zvláštní privilegia", "Publish this room to the public in %(domain)s's room directory?": "Zapsat tuto místnost do veřejného adresáře místností na %(domain)s?", @@ -490,12 +456,9 @@ "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s zpřístupnil budoucí historii místnosti neznámým (%(visibility)s).", "Not a valid Riot keyfile": "Neplatný soubor s klíčem Riot", "Mirror local video feed": "Zrcadlit lokání video", - "Never send encrypted messages to unverified devices from this device": "Z tohoto zařízení nikdy neodesílat šifrované zprávy na neověřená zařízení", "Enable inline URL previews by default": "Nastavit povolení náhledů URL adres jako výchozí", "Enable URL previews for this room (only affects you)": "Povolit náhledy URL adres pro tuto místnost (ovlivňuje pouze vás)", "Enable URL previews by default for participants in this room": "Povolit náhledy URL adres pro členy této místnosti jako výchozí", - "Delete %(count)s devices|one": "Smazat zařízení", - "Delete %(count)s devices|other": "Smazat %(count)s zařízení", " (unsupported)": " (nepodporované)", "Join as voice or video.": "Připojte se prostřednictvím audio nebo video.", "Ongoing conference call%(supportedText)s.": "Probíhající konferenční hovor%(supportedText)s.", @@ -608,14 +571,7 @@ "Something went wrong whilst creating your community": "Něco se pokazilo během vytváření vaší skupiny", "Unknown error": "Neznámá chyba", "Incorrect password": "Nesprávné heslo", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Pokud si chcete ověřit, zda je zařízení skutečně důvěryhodné, kontaktujte vlastníka jiným způsobem (např. osobně anebo telefonicky) a zeptejte se ho na klíč, který má pro toto zařízení zobrazený v nastavení a zda se shoduje s klíčem zobrazeným níže:", - "Device name": "Název zařízení", - "Device key": "Klíč zařízení", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Pokud se klíče shodují, stlačte ověřovací tlačítko uvedené níže. Pokud se neshodují, někdo další odposlouchává toto zařízení a v takovém případě by jste měli místo toho vybrat tlačítko černé listiny.", - "Verify device": "Ověřit zařízení", "I verify that the keys match": "Ověřil jsem, klíče se shodují", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Přidali jste nové zařízení s názvem '%(displayName)s', vyžadující šifrovací klíč.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Vaše neověřené zařízení s názvem '%(displayName)s' vyžaduje šifrovací klíč.", "Start verification": "Zahájit ověřování", "Share without verifying": "Sdílet bez ověření", "Ignore request": "Ignorovat žádost", @@ -632,10 +588,6 @@ "This will be your account name on the homeserver, or you can pick a different server.": "Toto bude název vašeho účtu na domácím serveru , anebo si můžete zvolit jiný server.", "If you already have a Matrix account you can log in instead.": "Pokud již účet Matrix máte, můžete se ihned Přihlásit.", "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s %(count)s krát vstoupil", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Neověřená zařízení jsou v této chvíli na černé listině; pokud chcete zasílat zprávy na tato zařízení, musíte je nejdříve ověřit.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Doporučujeme vám projít procesem ověřování pro všechna zařízení, abyste si potvrdili, že patří jejich pravým vlastníkům, ale pokud si to přejete, můžete zprávu znovu odeslat bez ověřování.", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "V místnosti „%(RoomName)s“ jsou zařízení s kterými jste dosud nikdy nekomunikovali.", - "Unknown devices": "Neznámá zařízení", "Private Chat": "Soukromý chat", "Public Chat": "Veřejný chat", "You must register to use this functionality": "Musíte být zaregistrovaný pokud chcete využívat této funkce", @@ -678,12 +630,10 @@ "Sent messages will be stored until your connection has returned.": "Odeslané zprávy zůstanou uložené, dokud se spojení znovu neobnoví.", "Active call": "Aktivní hovor", "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Kromě vás není v této místnosti nikdo jiný! Přejete si Pozvat další anebo Přestat upozorňovat na prázdnou místnost?", - "Message not sent due to unknown devices being present": "Zpráva nebyla odeslána vzhledem k nalezeným neznámým zařízením", "Room": "Místnost", "Failed to load timeline position": "Nepodařilo se načíst pozici na časové ose", "Light theme": "Světlý motiv", "Dark theme": "Tmavý motiv", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Vaše heslo bylo úspěšně změněno. Na ostatních zařízeních se vám již nebudou zobrazovat okamžitá oznámení do té chvíle než se na nich znovu přihlásíte", "Analytics": "Analytické údaje", "Riot collects anonymous analytics to allow us to improve the application.": "Riot sbírá anonymní analytické údaje, které nám umožňují aplikaci dále zlepšovat.", "Labs": "Experimentální funkce", @@ -701,7 +651,6 @@ "This server does not support authentication with a phone number.": "Tento server nepodporuje ověření telefonním číslem.", "Deops user with given id": "Zruší stav moderátor uživateli se zadaným ID", "Searches DuckDuckGo for results": "Vyhledá výsledky na DuckDuckGo", - "Verifies a user, device, and pubkey tuple": "Ověří zadané údaje uživatele, zařízení a veřejný klíč", "Ignores a user, hiding their messages from you": "Ignoruje uživatele a skryje všechny jeho zprávy", "Stops ignoring a user, showing their messages going forward": "Přestane ignorovat uživatele a začne zobrazovat jeho zprávy", "Notify the whole room": "Oznámení pro celou místnost", @@ -711,7 +660,6 @@ "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Tento proces vás provede importem šifrovacích klíčů, které jste si stáhli z jiného Matrix klienta. Po úspěšném naimportování budete v tomto klientovi moci dešifrovat všechny zprávy, které jste mohli dešifrovat v původním klientovi.", "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Stažený soubor je chráněn heslem. Soubor můžete naimportovat pouze pokud zadáte odpovídající heslo.", "Call Failed": "Hovor selhal", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "V této místnosti jsou neznámá zařízení: Pokud budete pokračovat bez jejich ověření, někdo může Váš hovor odposlouchávat.", "Review Devices": "Ověřit zařízení", "Call Anyway": "Přesto zavolat", "Answer Anyway": "Přesto přijmout", @@ -771,7 +719,6 @@ "Resend": "Poslat znovu", "Collecting app version information": "Sbírání informací o verzi aplikace", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Smazat alias místnosti %(alias)s a odstranit %(name)s z adresáře?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Toto vám umožní vrátit se po odhlášení ke svému účtu a používat jej na ostatních zařízeních.", "Keywords": "Klíčová slova", "Enable notifications for this account": "Zapnout upozornění na tomto účtu", "Invite to this community": "Pozvat do této komunity", @@ -878,27 +825,15 @@ "Send analytics data": "Odesílat analytická data", "Enable widget screenshots on supported widgets": "Povolit screenshot widgetu pro podporované widgety", "This event could not be displayed": "Tato událost nemohla být zobrazena", - "Your key share request has been sent - please check your other devices for key share requests.": "Žádost o sdílení klíče byla odeslána - prosím zkontrolujte si Vaše ostatí zařízení.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Žádost o sdílení klíčů je automaticky odesílaná na Vaše ostatní zařízení. Jestli jste žádost odmítly nebo zrušili dialogové okno se žádostí na ostatních zařízeních, kliknutím sem ji můžete opakovaně pro tuto relaci vyžádat.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Pokud Vaše ostatní zařízení nemají klíč pro tyto zprávy, nebudete je moci dešifrovat.", "Key request sent.": "Žádost o klíč poslána.", - "Re-request encryption keys from your other devices.": "Znovu vyžádat šifrovací klíče z vašich ostatních zařízení.", "Demote yourself?": "Snížit Vaši vlastní hodnost?", "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.": "Tuto změnu nebudete moci vzít zpět, protože snižujete svoji vlastní hodnost, jste-li poslední privilegovaný uživatel v místnosti, bude nemožné vaši současnou hodnost získat zpět.", "Demote": "Degradovat", "Share Link to User": "Sdílet odkaz na uživatele", - "deleted": "smazáno", - "underlined": "podtrženo", - "inline-code": "vnořený kód", - "block-quote": "citace", - "bulleted-list": "odrážkový seznam", - "numbered-list": "číselný seznam", "Send an encrypted reply…": "Odeslat šifrovanou odpověď …", "Send a reply (unencrypted)…": "Odeslat odpověď (nešifrovaně) …", "Send an encrypted message…": "Odeslat šifrovanou zprávu …", "Send a message (unencrypted)…": "Odeslat zprávu (nešifrovaně) …", - "Unable to reply": "Není možné odpovědět", - "At this time it is not possible to reply with an emote.": "V odpovědi zatím nejde vyjádřit pocit.", "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "%(displayName)s (%(userName)s) viděl %(dateTime)s", "Replying": "Odpovídá", "Share room": "Sdílet místnost", @@ -975,7 +910,6 @@ "Review terms and conditions": "Přečíst smluvní podmínky", "Did you know: you can use communities to filter your Riot.im experience!": "Věděli jste, že: práci s Riot.im si můžete zpříjemnit s použitím komunit!", "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Pro nastavení filtru přetáhněte avatar komunity na panel filtrování na levé straně obrazovky. Potom můžete kdykoliv kliknout na avatar komunity na tomto panelu a Riot Vám bude zobrazovat jen místnosti a lidi z dané komunity.", - "Show devices, send anyway or cancel.": "Zobrazit zařízení, i tak odeslat a nebo zrušit.", "You can't send any messages until you review and agree to our terms and conditions.": "Dokud si nepřečtete a neodsouhlasíte naše smluvní podmínky, nebudete moci posílat žádné zprávy.", "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.": "Vaše zpráva nebyla odeslána, protože tento domácí server dosáhl svého měsíčního limitu pro aktivní uživatele. Prosím kontaktujte Vašeho administratora pro další využívání služby.", "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.": "Vaše zpráva nebyla odeslána, protože tento domácí server dosáhl limitu. Prosím kontaktujte Vašeho administratora pro další využívání služby.", @@ -1017,9 +951,7 @@ "Set a new password": "Nastavit nové heslo", "Room Name": "Jméno místnosti", "Room Topic": "Téma místnosti", - "No room avatar": "Žádný avatar místnosti", "Room avatar": "Avatar místnosti", - "Upload room avatar": "Nahrát avatar místnosti", "Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.": "Změny toho kdo smí číst historické zprávy se aplikují jenom na další zprávy v této místosti. Viditelnost už poslaných zpráv zůstane jaká byla.", "To link to this room, please add an alias.": "K vytvoření odkazu je potřeba vyrobit místnosti alias.", "Roles & Permissions": "Funkce & Práva", @@ -1065,7 +997,6 @@ "Unable to verify phone number.": "Nepovedlo se ověřit telefonní číslo.", "Verification code": "Ověřovací kód", "Profile picture": "Profilový obrázek", - "Upload profile picture": "Nahrát profilový obrázek", "Display Name": "Zobrazované jméno", "Room Addresses": "Adresy místnosti", "For help with using Riot, click here.": "Pro pomoc s používáním Riotu, klikněte sem.", @@ -1074,10 +1005,6 @@ "Ignored users": "Ignorovaní uživatelé", "Bulk options": "Hromadná možnost", "Key backup": "Záloha klíčů", - "Some devices for this user are not trusted": "Některá zařízení nejsou důvěryhodné", - "Some devices in this encrypted room are not trusted": "Některá zařízení v této šifrované místnosti nejsou důvěryhodné", - "All devices for this user are trusted": "Všechna zařízení tohoto uživatele jsou důvěryhodná", - "All devices in this encrypted room are trusted": "Všechna zařízení v této šifrované místnosti jsou důveryhodná", "This room has been replaced and is no longer active.": "Tato místnost byla nahrazena a už není používaná.", "The conversation continues here.": "Konverzace pokračuje zde.", "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "Poslali jsme Vám ověřovací email. Následujte prosím instrukce a pak klikněte na následující tlačítko.", @@ -1087,21 +1014,11 @@ "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Šifrované zprávy jsou zabezpečené end-to-end šifrováním. Jenom Vy a příjemci mají dešifrovací klíče.", "Unable to load key backup status": "Nepovedlo se načíst stav zálohy", "Restore from Backup": "Obnovit ze zálohy", - "This device is backing up your keys. ": "Toto zařízení má zálohované klíče. ", "Back up your keys before signing out to avoid losing them.": "Před odhlášením si zazálohujte klíče abyste o ně nepřišli.", "Backing up %(sessionsRemaining)s keys...": "Zálohování %(sessionsRemaining)s klíčů...", "All keys backed up": "Všechny klíče jsou zazálohované", - "Backup has a signature from unknown device with ID %(deviceId)s.": "Záloha je podepsaná neznámým zařízením s ID %(deviceId)s.", - "Backup has a valid signature from this device": "Záloha má platný podpis tohoto zařízení", - "Backup has a valid signature from verified device ": "Záloha má platný podpis ověřeného zařízení ", - "Backup has a valid signature from unverified device ": "Záloha má platný podpis neověřeného zařízení ", - "Backup has an invalid signature from verified device ": "Záloha má neplatný podpis ověřeného zařízení ", - "Backup has an invalid signature from unverified device ": "Záloha má neplatný podpis neověřeného zařízení ", - "Backup is not signed by any of your devices": "Záloha není podepsaná žádným Vaším zařízením", - "This backup is trusted because it has been restored on this device": "Tato záloha je důvěryhodná, protože už z ní byly obnovené klíče", "Backup version: ": "Verze zálohy: ", "Algorithm: ": "Algoritmus: ", - "Your keys are not being backed up from this device.": "Vaše klíče se z tohoto zařízení nezálohují.", "Start using Key Backup": "Začít používat zálohu klíčů", "Add an email address to configure email notifications": "Pro nastavení emailových upozornění je třeba přidat emailovou adresu", "Whether or not you're logged in (we don't record your username)": "Jestli jste přihlášený/á (nezaznamenáváme ale Vaše jméno)", @@ -1175,7 +1092,6 @@ "Verify this user by confirming the following emoji appear on their screen.": "Ověřte uživatele zkontrolováním, že se mu na obrazovce objevily stejné obrázky.", "Verify this user by confirming the following number appears on their screen.": "Ověřte uživatele zkontrolováním, že se na obrazovce objevila stejná čísla.", "Unable to find a supported verification method.": "Nepovedlo se nám najít podporovanou metodu ověření.", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "Pro co nejlepší bezpečnost doporučujeme ověření dělat osobně nebo přes nějaký jiný důvěryhodný kanál.", "Dog": "Pes", "Cat": "Kočka", "Lion": "Lev", @@ -1221,7 +1137,6 @@ "Book": "Kniha", "Pencil": "Tužka", "Paperclip": "Sponka", - "Padlock": "Zámek", "Key": "Klíč", "Hammer": "Kladivo", "Telephone": "Telefon", @@ -1262,7 +1177,6 @@ "Incompatible Database": "Nekompatibilní databáze", "Continue With Encryption Disabled": "Pokračovat bez šifrování", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Po ověření bude uživatel označen jako důvěryhodný. Ověřování uživatelů Vám dává jistotu, že je komunikace důvěrná.", - "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "Ověření uživatele označí jeho zařízení za důvěryhodná a Vaše zařízení budou důvěryhodná pro něj.", "Waiting for partner to confirm...": "Čekám až to partner potvrdí...", "Incoming Verification Request": "Přišla Vám žádost o ověření", "Incompatible local cache": "Nekompatibilní lokální vyrovnávací paměť", @@ -1288,9 +1202,7 @@ "This looks like a valid recovery key!": "To vypadá jako správný klíč!", "Not a valid recovery key": "To není správný klíč", "Access your secure message history and set up secure messaging by entering your recovery key.": "Zadejte obnovovací klíč pro přístupu k historii zpráv a zabezpečené komunikaci.", - "If you've forgotten your recovery passphrase you can ": "Pokud si nepamatujete heslo k obnovení, můžete si ", "Recovery Method Removed": "Záloha klíčů byla odstraněna", - "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "Na tomto zařízení došlo k odstranění hesla k zálohám a klíče k zabezpečné konverzaci.", "Go to Settings": "Přejít do nastavení", "Enter a passphrase...": "Zadejte silné heslo...", "For maximum security, this should be different from your account password.": "Z bezpečnostních důvodů by toto heslo mělo být jiné než přihlašovací heslo.", @@ -1306,12 +1218,9 @@ "As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.": "Tento klíč můžete použít jako záchranou síť k obnově zašifrované historie pokud byste zapomněl/a heslo k záloze.", "As a safety net, you can use it to restore your encrypted message history.": "Tento klíč můžete použít jako záchranou síť k obnově zašifrované historie.", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "Obnovovací klíč je záchraná síť - lze použít k obnově zašifrovaných zpráv když zapomenete heslo.", - "Keep your recovery key somewhere very secure, like a password manager (or a safe)": "Uchovejte tento klíč na velmi bezpečném místě, například ve správci hesel (password manageru) nebo v trezoru", "Your Recovery Key": "Váš klíč pro obnovu zálohy", "Copy to clipboard": "Zkopírovat do schránky", "Download": "Stáhnout", - "Your Recovery Key has been copied to your clipboard, paste it to:": "Klíč byl uložen do schránky, vložte ho:", - "Your Recovery Key is in your Downloads folder.": "Klíč byl uložen do složky se staženými soubory.", "Print it and store it somewhere safe": "Vytiskněte si ho a bezpečně ho uložte", "Save it on a USB key or backup drive": "Uložte ho na bezpečnou USB flash disk nebo zálohovací disk", "Copy it to your personal cloud storage": "Zkopírujte si ho na osobní cloudové úložiště", @@ -1326,7 +1235,6 @@ "Unable to create key backup": "Nepovedlo se vyrobit zálohů klíčů", "Retry": "Zkusit znovu", "Set up Secure Messages": "Nastavit bezpečné obnovení zpráv", - "This device is encrypting history using the new recovery method.": "Toto zařízení šifruje historii pomocí nového způsobu zálohy a obnovy.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Pokud jste způsob obnovy neodstranili Vy, útočníci se můžou pokoušet dostat k vašemu účtu. Změňte si raději ihned heslo a nastavte nový způsob obnovy v Nastavení.", "Set up": "Nastavit", "Don't ask again": "Už se neptat", @@ -1334,9 +1242,7 @@ "If you don't want to set this up now, you can later in Settings.": "Pokud nechcete nastavení dokončit teď, můžete se k tomu vrátit později v nastavení.", "A new recovery passphrase and key for Secure Messages have been detected.": "Detekovali jsme nové heslo a klíč pro bezpečné obnovení.", "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.": "Pokud jste nenastavili nový způsob obnovy Vy, útočníci se můžou pokoušet dostat k vašemu účtu. Změňte si raději ihned heslo a nastavte nový způsob obnovy v Nastavení.", - "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "Pokud jste to udělali omylem, můžete si na tomto zařízení nastavit bezpečné obnovení zpráv, což znovu zašifruje kompletní historii s novým způsobem obnovení.", "Set up Secure Message Recovery": "Nastavit bezpečné obnovení zpráv", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "Když si nenastavíte bezpečné obnovení zpráv, nebudete mít možnost po odhlášení nebo přihlášení se na jiném zařízení číst historii šifrovaných konverzací.", "Without setting up Secure Message Recovery, you'll lose your secure message history when you log out.": "Bez nastavení bezpečného obnovení zpráv přijdete po odhlášení o historii šifrované komunikace.", "Show a reminder to enable Secure Message Recovery in encrypted rooms": "V šifrovaných konverzacích zobrazovat upozornění na možnost aktivovat bezpečné obnovení zpráv", "Gets or sets the room topic": "Nastaví nebo zjistí téma místnosti", @@ -1347,7 +1253,6 @@ "Enable Community Filter Panel": "Povolit panel Filtr komunity", "Show developer tools": "Zobrazit nástoje pro vývojáře", "Encrypted messages in group chats": "Šifrované zprávy ve skupinových konverzacích", - "Your homeserver does not support device management.": "Váš domovský server nepodporuje správu zařízení.", "Open Devtools": "Otevřít nástroje pro vývojáře", "Credits": "Poděkování", "You've previously used a newer version of Riot on %(host)s. To use this version again with end to end encryption, you will need to sign out and back in again. ": "Už jste na adrese %(host)s použili novější verzi Riotu. Jestli chcete znovu používat tuto verzi i s E2E šifrováním, je potřeba se odhlásit a znovu přihlásit. ", @@ -1394,7 +1299,6 @@ "A verification email will be sent to your inbox to confirm setting your new password.": "Nastavení nového hesla je potřeba potvrdit. Bude Vám odeslán ověřovací email.", "Sign in instead": "Přihlásit se", "Your password has been reset.": "Heslo bylo resetováno.", - "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Na všech zařízení jsme Vás odhlásili, takže nedostáváte žádné upozornění. Můžete je znovu povolit tím, že se na každém zařízení přihlásíte.", "Sign in with single sign-on": "Přihlásit se přes jednotné přihlašování", "Create account": "Vytvořit účet", "Unable to query for supported registration methods.": "Nepovedlo se načíst podporované způsoby přihlášení.", @@ -1444,13 +1348,7 @@ "The file '%(fileName)s' failed to upload.": "Soubor '%(fileName)s' se nepodařilo nahrát.", "The server does not support the room version specified.": "Server nepodporuje určenou verzi místnosti.", "Name or Matrix ID": "Jméno nebo Matrix ID", - "Email, name or Matrix ID": "Email, jméno nebo Matrix ID", - "Room upgrade confirmation": "Potvrzení: Upgrade místnosti", - "Upgrading a room can be destructive and isn't always necessary.": "Upgrade místnosti může mít destruktivní následky a možná není potřeba.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Upgrade místnosti se většinou doporučuje pokud je původní verze nestabilní. V nestabilních verzích můžou být chyby, chybějící funkce nebo můžou mít bezpečnostní problémy.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Upgrade místnosti se většinou týká zpracování serverovem. Pokud máte problém s klientem Riot, nahlašte nám prosím chybu na GitHub: .", "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.": "Varování: Upgrade místnosti automaticky převede všechny členy na novou verzi místnosti. Do staré místnosti pošleme odkaz na novou místnost - všichni členové na něj budou muset kliknout, aby se přidali do nové místnosti.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Potvrďte prosím, že chcete pokračovat a opravdu provést upgrade z verze na verzi .", "Changes your avatar in this current room only": "Změní váš avatar jen v této místnosti", "Unbans user with given ID": "Přijmout zpět uživatele s daným identifikátorem", "Adds a custom widget by URL to the room": "Přidá do místnosti vlastní widget podle adresy URL", @@ -1467,12 +1365,6 @@ "The user's homeserver does not support the version of the room.": "Uživatelův domovský server nepodporuje verzi této místnosti.", "Show hidden events in timeline": "Zobrazovat skryté události", "When rooms are upgraded": "Když je proveden upgrade místnosti", - "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Toto zařízení nezálohuje vaše klíče, ale máte existující zálohu kterou lze obnovit.", - "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Před odhlášením připojte toto zařízení k záloze klíčů, ať o ně nepřijdete.", - "Connect this device to Key Backup": "Připojit zařízení k zálohování klíčů", - "Backup has an invalid signature from this device": "Záloha má neplatný podpis z tohoto zařízení", - "Enable desktop notifications for this device": "Povolit na tomto zařízení notifikace", - "Enable audible notifications for this device": "Povolit na tomto zařízení zvukové notifikace", "Upgrade to your own domain": "Přejít na vlastní doménu", "Upgrade this room to the recommended room version": "Provést upgrade místnosti na doporučenou verzi", "this room": "tato místnost", @@ -1568,7 +1460,6 @@ "You have %(count)s unread notifications in a prior version of this room.|other": "Máte %(count)s nepřečtených notifikací v předchozí verzi této místnosti.", "You have %(count)s unread notifications in a prior version of this room.|one": "Máte %(count)s nepřečtenou notifikaci v předchozí verzi této místnosti.", "Your profile": "Váš profil", - "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "Změna hesla resetuje šifrovací klíče na všech vašich zařízeních a přijdete tak o přístup k historickým zprávám. Před změnou hesla si nastavte zálohu klíčů nebo si klíče pro místnosti exportujte.", "Your Matrix account on ": "Váš Matrix účet na serveru ", "Failed to get autodiscovery configuration from server": "Nepovedlo se automaticky načíst konfiguraci ze serveru", "Invalid base_url for m.homeserver": "Neplatná base_url pro m.homeserver", @@ -1597,7 +1488,6 @@ "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Zeptejte se administrátora (%(homeserverDomain)s) jestli by nemohl nakonfigurovat server TURN, aby začalo fungoval volání.", "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.": "Případně můžete zkusit použít veřejný server turn.matrix.org, což nemusí fungovat tak spolehlivě a řekne to tomu cizímu serveru vaší IP adresu. Můžete to udělat v Nastavení.", "Try using turn.matrix.org": "Zkuste použít turn.matrix.org", - "Failed to start chat": "Nepovedlo se začít chat", "Messages": "Zprávy", "Actions": "Akce", "Sends a message as plain text, without interpreting it as markdown": "Pošle zprávu jako prostý text, neinterpretuje jí jako Markdown", @@ -1648,8 +1538,6 @@ "Close dialog": "Zavřít dialog", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Napište nám prosím co se pokazilo a nebo nám napište issue na GitHub, kde popíšete problém.", "Removing…": "Odstaňování…", - "Clear all data on this device?": "Smazat všechna data na tomto zařízení?", - "Clearing all data from this device is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Smazání všech dat na tomto zařízení je nevratné. Zašifrované zprávy nepůjde obnovit, pokud nejsou klíče zazálohované.", "Clear all data": "Smazat všechna data", "Please enter a name for the room": "Zadejte prosím jméno místnosti", "Set a room alias to easily share your room with other people.": "Nastavte alias místnosti, abyste mohli místnost snadno sdílet s ostatními.", @@ -1661,7 +1549,6 @@ "Hide advanced": "Skrýt pokročilé", "Show advanced": "Zobrazit pokročilé", "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Zamezit uživatelům jiných domovských serverů, aby se připojili do místnosti (Toto nelze později změnit!)", - "To verify that this device can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Abyste ověřili, že je toto zařízení důvěryhodné, zkontrolujte, že klíč v Nastavení na tom zařízení se shoduje s tímto klíčem:", "Your homeserver doesn't seem to support this feature.": "Váš domovský server asi tuto funkci nepodporuje.", "Message edits": "Editování zpráv", "Please fill why you're reporting.": "Vyplňte prosím co chcete nahlásit.", @@ -1678,7 +1565,6 @@ "Trust": "Důvěra", "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", "Multiple integration managers": "Více správců integrací", - "Use the new, faster, composer for writing messages": "Použít nový, rychlejší editor zpráv", "Show previews/thumbnails for images": "Zobrazovat náhledy obrázků", "You should remove your personal data from identity server before disconnecting. Unfortunately, identity server is currently offline or cannot be reached.": "Před odpojením byste měli smazat osobní údaje ze serveru identit . Bohužel, server je offline nebo neodpovídá.", "You should:": "Měli byste:", @@ -1690,7 +1576,6 @@ "Show tray icon and minimize window to it on close": "Zobrazovat systémovou ikonu a minimalizovat při zavření", "Read Marker lifetime (ms)": "životnost značky přečteno (ms)", "Read Marker off-screen lifetime (ms)": "životnost značky přečteno mimo obrazovku (ms)", - "A device's public name is visible to people you communicate with": "Veřejné jméno zařízení je viditelné pro lidi se kterými komunikujete", "Upgrade the room": "Upgradovat místnost", "Enable room encryption": "Povolit v místnosti šifrování", "Error changing power level requirement": "Chyba změny požadavku na úroveň oprávnění", @@ -1820,14 +1705,12 @@ "Registration Successful": "Úspěšná registrace", "Failed to re-authenticate due to a homeserver problem": "Kvůli problémům s domovským server se nepovedlo autentifikovat znovu", "Failed to re-authenticate": "Nepovedlo se autentifikovat", - "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.": "Získejte znovu přístup k účtu a obnovte si šifrovací klíče uložené na tomto zařízení. Bez nich nebudete schopni číst zabezpečené zprávy na některých zařízeních.", "Enter your password to sign in and regain access to your account.": "Zadejte heslo pro přihlášení a obnovte si přístup k účtu.", "Forgotten your password?": "Zapomněli jste heslo?", "Sign in and regain access to your account.": "Přihlaste se a získejte přístup ke svému účtu.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Nemůžete se přihlásit do svého účtu. Kontaktujte administrátora domovského serveru pro více informací.", "You're signed out": "Jste odhlášeni", "Clear personal data": "Smazat osobní data", - "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.": "Varování: Vaše osobní data (včetně šifrovacích klíčů) jsou pořád uložena na tomto zařízení. Smažte je, pokud už toto zařízení nehodláte používat nebo se přihlašte pod jiný účet.", "Command Autocomplete": "Automatické doplňování příkazů", "Community Autocomplete": "Automatické doplňování komunit", "DuckDuckGo Results": "Výsledky hledání DuckDuckGo", @@ -1860,13 +1743,11 @@ "%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s změnil pravidlo blokující servery odpovídající %(oldGlob)s na servery odpovídající %(newGlob)s z důvodu %(reason)s", "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s změnil blokovací pravidlo odpovídající %(oldGlob)s na odpovídající %(newGlob)s z důvodu %(reason)s", "Try out new ways to ignore people (experimental)": "Vyzkošejte nové metody ignorování lidí (experimentální)", - "Send verification requests in direct message, including a new verification UX in the member panel.": "Poslat požadavek na ověření v přímé zprávě včetně nového verifikačního rozhraní v panelu.", "Enable local event indexing and E2EE search (requires restart)": "Povolit lokální indexování a vyhledávání v E2E šifrovaných zprávách (vyžaduje restart)", "Match system theme": "Přizpůsobit se systémovému vzhledu", "My Ban List": "Můj seznam zablokovaných", "This is your list of users/servers you have blocked - don't leave the room!": "Toto je váš seznam blokovaných uživatelů/serverů - neopouštějte tuto místnost!", "Decline (%(counter)s)": "Odmítnout (%(counter)s)", - "on device": "na zařízení", "Connecting to integration manager...": "Připojuji se ke správci integrací...", "Cannot connect to integration manager": "Nepovedlo se připojení ke správci integrací", "The integration manager is offline or it cannot reach your homeserver.": "Správce integrací neběží nebo se nemůže připojit k vašemu domovskému serveru.", @@ -1911,11 +1792,7 @@ "Failed to connect to integration manager": "Nepovedlo se připojit ke správci integrací", "Trusted": "Důvěryhodné", "Not trusted": "Nedůvěryhodné", - "Hide verified Sign-In's": "Skrýt důvěryhodná přihlášení", - "%(count)s verified Sign-In's|other": "%(count)s důvěryhodných přihlášení", - "%(count)s verified Sign-In's|one": "1 důvěryhodné přihlášení", "Direct message": "Přímá zpráva", - "Unverify user": "Nedůvěřovat uživateli", "%(role)s in %(roomName)s": "%(role)s v %(roomName)s", "Messages in this room are end-to-end encrypted.": "V této místosti jsou zprávy E2E šifrované.", "Security": "Bezpečnost", @@ -1965,16 +1842,12 @@ "User Status": "Stav uživatele", "Verification Request": "Požadavek na ověření", " (1/%(totalCount)s)": " (1/%(totalCount)s)", - "Warning: You should only set up secret storage from a trusted computer.": "Varování: Nastavujte bezpečné úložiště pouze z důvěryhodného počítače.", "Set up with a recovery key": "Nastavit obnovovací klíč", "As a safety net, you can use it to restore your access to encrypted messages if you forget your passphrase.": "Můžete jej použít jako záchranou síť na obnovení šifrovaných zpráv když zapomenete heslo.", "As a safety net, you can use it to restore your access to encrypted messages.": "Můžete jej použít jako záchranou síť na obnovení šifrovaných zpráv.", "Keep your recovery key somewhere very secure, like a password manager (or a safe).": "Uschovejte svůj klíč na velmi bezpečném místě, například ve správci hesel (nebo v trezoru).", "Your recovery key has been copied to your clipboard, paste it to:": "Váš obnovovací klíč byl zkopírován do schránky, vložte jej:", "Your recovery key is in your Downloads folder.": "Váš obnovací klíč je ve složce Stažené.", - "Your access to encrypted messages is now protected.": "Přístup k šifrovaným zprávám je teď chráněn.", - "Set up secret storage": "Nastavit bezpečné úložiště", - "Secure your encrypted messages with a passphrase": "Zabezpečte vaše šifrované zprávy heslem", "Storing secrets...": "Ukládám tajná data...", "Unable to set up secret storage": "Nepovedlo se nastavit bezpečné úložiště", "The message you are trying to send is too large.": "Zpráva kterou se snažíte odeslat je příliš velká.", @@ -1982,12 +1855,6 @@ "Backup has a valid signature from this user": "Záloha má platný podpis od tohoto uživatele", "Backup has a invalid signature from this user": "Záloha má neplatný podpis od tohoto uživatele", "Backup has a signature from unknown user with ID %(deviceId)s": "Záloha je podepsaná neznámým uživatelem %(deviceId)s", - "Backup has a signature from unknown device with ID %(deviceId)s": "Záloha je podepsaná neznámým zařízením %(deviceId)s", - "This user has not verified all of their devices.": "Uživatel neověřil všechna svá zařízení.", - "You have not verified this user. This user has verified all of their devices.": "Tohoto uživatele jste neověřili. Uživatel má ověřená všechna svá zařízení.", - "You have verified this user. This user has verified all of their devices.": "Tohoto uživatele jste ověřili. Uživatel má ověřená všechna svá zařízení.", - "Some users in this encrypted room are not verified by you or they have not verified their own devices.": "Někteřé uživatele v této šifrované místnosti jste neověřili nebo nemají ověřená některá svá zařízení.", - "All users in this encrypted room are verified by you and they have verified their own devices.": "Všichni uživatelé v této šifrované místnosti jsou ověření a mají ověřená všechna svá zařízení.", "Close preview": "Zavřít náhled", "Hide verified sessions": "Schovat ověřené relace", "%(count)s verified sessions|other": "%(count)s ověřených relací", diff --git a/src/i18n/strings/da.json b/src/i18n/strings/da.json index 14063d0dd1..e84be8e3c7 100644 --- a/src/i18n/strings/da.json +++ b/src/i18n/strings/da.json @@ -3,7 +3,6 @@ "You have no visible notifications": "Du har ingen synlige meddelelser", "Invites": "Invitationer", "Favourites": "Favoritter", - "People": "Personilg chat", "Rooms": "Rum", "Low priority": "Lav prioritet", "Historical": "Historisk", @@ -28,7 +27,6 @@ "Session ID": "Sessions ID", "End-to-end encryption information": "End-to-end krypterings oplysninger", "Event information": "Hændelses information", - "Sender device information": "Afsende enheds-oplysning", "Displays action": "Viser handling", "Bans user with given id": "Forbyder bruger med givet id", "Deops user with given id": "Fjerner OP af bruger med givet id", @@ -146,10 +144,6 @@ "Restricted": "Begrænset", "Moderator": "Moderator", "Start a chat": "Start en chat", - "Who would you like to communicate with?": "Hvem vil du kommunikere med?", - "Start Chat": "Start Chat", - "Invite new room members": "Inviter nye rummedlemmer", - "Send Invites": "Send invitationer", "Operation failed": "Operation mislykkedes", "Failed to invite": "Kunne ikke invitere", "Failed to invite the following users to the %(roomName)s room:": "Kunne ikke invitere de følgende brugere til %(roomName)s rummet:", @@ -172,13 +166,7 @@ "You are now ignoring %(userId)s": "Du ignorere nu %(userId)s", "Unignored user": "Holdt op med at ignorere bruger", "You are no longer ignoring %(userId)s": "Du ignorer ikke længere %(userId)s", - "Unknown (user, device) pair:": "Ukendt (bruger, enhed) par:", - "Device already verified!": "Enhed allerede verificeret!", - "WARNING: Device already verified, but keys do NOT MATCH!": "ADVARSEL: Enhed allerede verificeret, men nøgler PASSER IKKE!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ADVARSEL: NØGLE VERIFICERING FEJLEDE! Signaturnøglen for %(userId)s and enhed %(deviceId)s er \"%(fprint)s\" hvilket ikke passer med den oplyste nøgle \"%(fingerprint)s\". Dette kan betyde jeres kommunikation bliver opsnappet!", "Verified key": "Verificeret nøgle", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Signaturnøglen du oplste passer med nøglen fra %(userId)ss enhed %(deviceId)s. Enheden er markeret som verificeret.", - "Unrecognised command:": "Ukendt kommando:", "Reason": "Årsag", "%(senderName)s requested a VoIP conference.": "%(senderName)s forespurgte en VoIP konference.", "%(senderName)s invited %(targetName)s.": "%(senderName)s inviterede %(targetName)s.", @@ -259,7 +247,6 @@ "Noisy": "Støjende", "Collecting app version information": "Indsamler app versionsoplysninger", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Slet rumaliaset %(alias)s og fjern %(name)s fra kataloget?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Dette vil tillade dig at vende tilbage til din konto efter at have logget ud og at logge ind på andre enheder.", "Keywords": "Søgeord", "Enable notifications for this account": "Aktivér underretninger for dette brugernavn", "Invite to this community": "Inviter til dette fællesskab", @@ -361,7 +348,6 @@ "The information being sent to us to help make Riot.im better includes:": "Information som sendes til os for at kunne forbedre Riot.im inkluderer:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Hvis denne side indeholder identificerbar information, så som rum, bruger eller gruppe ID, bliver disse fjernet før dataene sendes til serveren.", "Call Failed": "Opkald mislykkedes", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Der er ukendte enheder i dette rum: hvis du fortsætter uden at bekræfte dem, kan det være muligt at nogen aflytter dit opkald.", "Review Devices": "Gennemse enheder", "Call Anyway": "Ring op alligevel", "Answer Anyway": "Tag imod alligevel", @@ -391,8 +377,6 @@ "Unable to load! Check your network connectivity and try again.": "Kunne ikke hente! Tjek din netværksforbindelse og prøv igen.", "Registration Required": "Registrering påkrævet", "You need to register to do this. Would you like to register now?": "Du behøver registrere dig for at gøre dette. Vil du registrere nu?", - "Email, name or Matrix ID": "E-mail, navn eller Matrix-ID", - "Failed to start chat": "Kunne ikke starte chatten", "Failed to invite users to the room:": "Kunne ikke invitere brugere til rummet:", "Missing roomId.": "roomId mangler.", "Messages": "Beskeder", @@ -402,12 +386,7 @@ "Sends a message as plain text, without interpreting it as markdown": "Sender en besked som ren tekst, uden at fortolke den som Markdown", "Upgrades a room to a new version": "Opgraderer et rum til en ny version", "You do not have the required permissions to use this command.": "Du har ikke de nødvendige rettigheder for at udføre denne kommando.", - "Room upgrade confirmation": "Rum opgraderings information", - "Upgrading a room can be destructive and isn't always necessary.": "At opgradere et rum kan være skadelig og er ikke altid nødvendigt.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Rumopgraderinger anbefales typisk når en rumversion betragtes som ustabil. Ustabile rumversioner kan have fejl, manglende funktioner eller sikkerhedsbrister.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Rumopgraderinger påvirker normalt kun servernes behandling af rum. Hvis du har problemer med din Riot-klient bedes du oprette en sag på .", "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.": "Advarsel: Opgradering af et rum flytter ikke automatisk rummets medlemmer til den nye version af rummet. Vi sender et link til den nye version i den gamle version af rummet - rummets medlemmer må klikke på dette link for at tilgå det nye rum.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Bekræft venligst at du vil fortsætte med at opgradere rummet fra til .", "Changes your display nickname in the current room only": "Ændrer dit viste navn kun for det nuværende rum", "Changes the avatar of the current room": "Ændrer avataren af det nuværende rum", "Changes your avatar in this current room only": "Ændrer din avatar kun for det nuværende rum", @@ -427,7 +406,6 @@ "Adds a custom widget by URL to the room": "Tilføjer en widget til rummet vha. URL", "Please supply a https:// or http:// widget URL": "Oplys en https:// eller http:// widget URL", "You cannot modify widgets in this room.": "Du kan ikke ændre widgets i dette rum.", - "Verifies a user, device, and pubkey tuple": "Bekræfter en tupel (kombination) af bruger, enhed og offentlig nøgle", "Forces the current outbound group session in an encrypted room to be discarded": "Tvinger den nuværende udgående gruppe-session i et krypteret rum til at blive kasseret", "Sends the given message coloured as a rainbow": "Sender beskeden med regnbuefarver", "Sends the given emote coloured as a rainbow": "Sender emoji'en med regnbuefarver", @@ -457,7 +435,6 @@ "%(senderName)s made future room history visible to all room members.": "%(senderName)s gjorde fremtidig rumhistorik synligt for alle rummedlemmer.", "%(senderName)s made future room history visible to anyone.": "%(senderName)s gjorde fremtidig rumhistorik synligt for alle.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s gjorde fremtidig rumhistorik synligt for ukendt (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s aktiverede end-to-end kryptering (algoritme %(algorithm)s).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s fra %(fromPowerLevel)s til %(toPowerLevel)s", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ændrede rettighedsniveau af %(powerLevelDiffText)s.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s ændrede de fastgjorte beskeder for rummet.", @@ -537,7 +514,6 @@ "Group & filter rooms by custom tags (refresh to apply changes)": "Gruppér og filtrér rum efter egne tags (opdater for at anvende ændringerne)", "Render simple counters in room header": "Vis simple tællere i rumhovedet", "Multiple integration managers": "Flere integrationsmanagere", - "Use the new, faster, composer for writing messages": "Brug den nye, hurtigere editor for at forfatte beskeder", "Enable Emoji suggestions while typing": "Aktiver emoji forslag under indtastning", "Use compact timeline layout": "Brug kompakt tidslinje", "Show a placeholder for removed messages": "Vis en pladsholder for fjernede beskeder" diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 6963fdfa6c..2dcdb43aec 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -3,7 +3,6 @@ "You have no visible notifications": "Du hast keine sichtbaren Benachrichtigungen", "Invites": "Einladungen", "Favourites": "Favoriten", - "People": "Personen", "Rooms": "Räume", "Low priority": "Niedrige Priorität", "Historical": "Archiv", @@ -28,7 +27,6 @@ "Session ID": "Sitzungs-ID", "End-to-end encryption information": "Informationen zur Ende-zu-Ende-Verschlüsselung", "Event information": "Ereignis-Information", - "Sender device information": "Geräte-Informationen des Absenders", "Displays action": "Zeigt Aktionen an", "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", @@ -54,7 +52,6 @@ "Deactivate Account": "Benutzerkonto schließen", "Failed to send email": "Fehler beim Senden der E-Mail", "Account": "Benutzerkonto", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Dein Passwort wurde erfolgreich geändert. Du wirst erst Benachrichtigungen auf anderen Geräten empfangen können, wenn du dich dort erneut anmeldest", "Click here to fix": "Zum reparieren hier klicken", "Default": "Standard", "Export E2E room keys": "E2E-Raum-Schlüssel exportieren", @@ -72,14 +69,11 @@ "I have verified my email address": "Ich habe meine E-Mail-Adresse verifiziert", "Import E2E room keys": "E2E-Raum-Schlüssel importieren", "Invalid Email Address": "Ungültige E-Mail-Adresse", - "Invite new room members": "Neue Raum-Mitglieder einladen", "Sign in with": "Anmelden mit", "Leave room": "Raum verlassen", "Logout": "Abmelden", "Manage Integrations": "Integrationen verwalten", "Moderator": "Moderator", - "Never send encrypted messages to unverified devices from this device": "Niemals verschlüsselte Nachrichten an unverifizierte Geräte von diesem Gerät aus versenden", - "Never send encrypted messages to unverified devices in this room from this device": "Niemals verschlüsselte Nachrichten an unverifizierte Geräte in diesem Raum von diesem Gerät aus senden", "Notifications": "Benachrichtigungen", "": "", "No users have specific privileges in this room": "Kein Benutzer hat in diesem Raum besondere Berechtigungen", @@ -94,14 +88,12 @@ "Remove": "Entfernen", "Return to login screen": "Zur Anmeldemaske zurückkehren", "Room Colour": "Raumfarbe", - "Send Invites": "Einladungen senden", "Send Reset Email": "E-Mail zum Zurücksetzen senden", "Settings": "Einstellungen", "Signed Out": "Abgemeldet", "Sign out": "Abmelden", "Someone": "Jemand", "Start a chat": "Chat starten", - "Start Chat": "Chat beginnen", "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", @@ -124,7 +116,6 @@ "VoIP conference started.": "VoIP-Konferenz gestartet.", "Who can access this room?": "Wer hat Zugang zu diesem Raum?", "Who can read history?": "Wer kann den bisherigen Chatverlauf lesen?", - "Who would you like to communicate with?": "Mit wem möchtest du kommunizieren?", "You do not have permission to post to this room": "Du hast keine Berechtigung, in diesem Raum etwas zu senden", "Call Timeout": "Anruf-Timeout", "Existing Call": "Bereits bestehender Anruf", @@ -206,7 +197,6 @@ "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s hat den Anzeigenamen geändert in %(displayName)s.", "This room is not recognised.": "Dieser Raum wurde nicht erkannt.", "To use it, just wait for autocomplete results to load and tab through them.": "Um diese Funktion zu nutzen, warte einfach auf die Autovervollständigungsergebnisse und benutze dann die TAB-Taste zum durchblättern.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s hat die Ende-zu-Ende-Verschlüsselung aktiviert (Algorithmus: %(algorithm)s).", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s hat die Verbannung von %(targetName)s aufgehoben.", "Usage": "Verwendung", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s hat die Einladung für %(targetName)s zurückgezogen.", @@ -228,7 +218,6 @@ "Click to mute video": "Klicken, um das Video stummzuschalten", "Command error": "Befehlsfehler", "Decrypt %(text)s": "%(text)s entschlüsseln", - "Devices": "Geräte", "Direct chats": "Direkt-Chats", "Disinvite": "Einladung zurückziehen", "Download %(text)s": "%(text)s herunterladen", @@ -240,19 +229,12 @@ "Failed to reject invite": "Ablehnen der Einladung ist fehlgeschlagen", "Failed to set display name": "Anzeigename konnte nicht gesetzt werden", "Fill screen": "Fülle Bildschirm", - "Hide Text Formatting Toolbar": "Text-Formatierungs-Werkzeugleiste verbergen", "Incorrect verification code": "Falscher Verifizierungscode", - "Invalid alias format": "Ungültiges Alias-Format", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' ist kein gültiges Alias-Format", "Join Room": "Dem Raum beitreten", "Kick": "Kicken", "Local addresses for this room:": "Lokale Adressen dieses Raumes:", - "Markdown is disabled": "Markdown ist deaktiviert", - "Markdown is enabled": "Markdown ist aktiviert", - "Message not sent due to unknown devices being present": "Nachrichten wurden nicht gesendet, da unbekannte Geräte anwesend sind", "New address (e.g. #foo:%(localDomain)s)": "Neue Adresse (z. B. #foo:%(localDomain)s)", "not specified": "nicht spezifiziert", - "No devices with registered encryption keys": "Keine Geräte mit registrierten Verschlüsselungs-Schlüsseln", "No more results": "Keine weiteren Ergebnisse", "No results": "Keine Ergebnisse", "OK": "OK", @@ -267,7 +249,6 @@ "This room has no local addresses": "Dieser Raum hat keine lokale Adresse", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Es wurde versucht, einen bestimmten Punkt im Chatverlauf dieses Raumes zu laden. Dir fehlt jedoch die Berechtigung, die betreffende Nachricht zu sehen.", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Es wurde versucht, einen bestimmten Punkt im Chatverlauf dieses Raumes zu laden, der Punkt konnte jedoch nicht gefunden werden.", - "Unable to load device list": "Geräteliste konnte nicht geladen werden", "Unknown room %(roomId)s": "Unbekannter Raum %(roomId)s", "You seem to be in a call, are you sure you want to quit?": "Du scheinst in einem Anruf zu sein. Bist du sicher schließen zu wollen?", "You seem to be uploading files, are you sure you want to quit?": "Du scheinst Dateien hochzuladen. Bist du sicher schließen zu wollen?", @@ -275,8 +256,6 @@ "Make Moderator": "Zum Moderator ernennen", "Room": "Raum", "Cancel": "Abbrechen", - "bold": "Fett", - "italic": "Kursiv", "Click to unmute video": "Klicken, um die Video-Stummschaltung zu deaktivieren", "Click to unmute audio": "Klicken, um den Ton wieder einzuschalten", "Failed to load timeline position": "Laden der Chat-Position fehlgeschlagen", @@ -291,7 +270,6 @@ "Confirm password": "Passwort bestätigen", "Current password": "Aktuelles Passwort", "Email": "E-Mail", - "matrix-react-sdk version:": "Version von matrix-react-sdk:", "New passwords don't match": "Die neuen Passwörter stimmen nicht überein", "olm version:": "Version von olm:", "Passwords can't be empty": "Passwortfelder dürfen nicht leer sein", @@ -302,7 +280,6 @@ "Error decrypting attachment": "Fehler beim Entschlüsseln des Anhangs", "Mute": "Stummschalten", "Operation failed": "Aktion fehlgeschlagen", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Eine Änderung des Passworts setzt derzeit alle Schlüssel für die E2E-Verschlüsselung auf allen verwendeten Geräten zurück. Bereits verschlüsselte Chat-Inhalte sind somit nur noch lesbar, wenn du zunächst alle Schlüssel exportierst und später wieder importierst. Wir arbeiten an einer Verbesserung dieser momentan noch notwendigen Vorgehensweise.", "Unmute": "Stummschalten aufheben", "Invalid file%(extra)s": "Ungültige Datei%(extra)s", "Please select the destination room for this message": "Bitte den Raum auswählen, an den diese Nachricht gesendet werden soll", @@ -320,14 +297,8 @@ "Unknown error": "Unbekannter Fehler", "Incorrect password": "Ungültiges Passwort", "To continue, please enter your password.": "Zum fortfahren bitte Passwort eingeben.", - "Device name": "Geräte-Name", - "Device key": "Geräte-Schlüssel", - "Verify device": "Gerät verifizieren", "I verify that the keys match": "Ich bestätige, dass die Schlüssel identisch sind", "Unable to restore session": "Sitzungswiederherstellung fehlgeschlagen", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Nicht verifizierte Geräte werden aktuell blockiert und auf die Sperrliste gesetzt. Um Nachrichten an diese Geräte senden zu können, müssen diese zunächst verifiziert werden.", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" enthält Geräte, die du bislang noch nicht gesehen hast.", - "Unknown devices": "Unbekannte Geräte", "Unknown Address": "Unbekannte Adresse", "Verify...": "Verifizieren...", "ex. @bob:example.com": "z. B. @bob:example.com", @@ -357,15 +328,12 @@ "Online": "Online", " (unsupported)": " (nicht unterstützt)", "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Dieser Prozess erlaubt es dir, die zuvor von einem anderen Matrix-Client exportierten Verschlüsselungs-Schlüssel zu importieren. Danach kannst du alle Nachrichten entschlüsseln, die auch bereits auf dem anderen Client entschlüsselt werden konnten.", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Um sicherzustellen, dass diesem Gerät vertraut werden kann, kontaktiere bitte den Eigentümer des Geräts über ein anderes Kommunikationsmittel (z.B. im persönlichen Gespräch oder durch einen Telefonanruf) und vergewissere dich, dass der Schlüssel, den der Eigentümer in den Benutzer-Einstellungen für dieses Gerät sieht, mit dem folgenden Schlüssel identisch ist:", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Wenn er identisch ist, bitte den Bestätigen-Button unten verwenden. Falls er nicht identisch sein sollte, hat eine Fremdperson Kontrolle über dieses Gerät und es sollte gesperrt werden.", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Wenn du zuvor eine aktuellere Version von Riot verwendet hast, ist deine Sitzung eventuell inkompatibel mit dieser Version. Bitte schließe dieses Fenster und kehre zur aktuelleren Version zurück.", "Blacklist": "Blockieren", "Unblacklist": "Entblockieren", "Unverify": "Verifizierung widerrufen", "Drop file here to upload": "Datei hier loslassen zum hochladen", "Idle": "Untätig", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Wir empfehlen dir, für jedes Gerät den Verifizierungsprozess durchzuführen, um sicherzustellen, dass sie tatsächlich ihrem rechtmäßigem Eigentümer gehören. Alternativ kannst du die Nachrichten auch ohne Verifizierung erneut senden.", "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?": "Du wirst jetzt auf die Website eines Drittanbieters weitergeleitet, damit du dein Benutzerkonto für die Verwendung von %(integrationsUrl)s authentifizieren kannst. Möchtest du fortfahren?", "Start automatically after system login": "Nach System-Login automatisch starten", @@ -380,30 +348,22 @@ "Default Device": "Standard-Gerät", "Microphone": "Mikrofon", "Camera": "Kamera", - "Device already verified!": "Gerät bereits verifiziert!", "Export": "Export", "Import": "Importieren", "Incorrect username and/or password.": "Inkorrekter Nutzername und/oder Passwort.", "Results from DuckDuckGo": "Ergebnisse von DuckDuckGo", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Den Signaturschlüssel den du bereitstellst stimmt mit dem Schlüssel den du von %(userId)s's Gerät %(deviceId)s empfangen hast überein. Gerät als verifiziert markiert.", "Add a topic": "Thema hinzufügen", "Anyone": "Jeder", "Are you sure you want to leave the room '%(roomName)s'?": "Bist du sicher, dass du den Raum '%(roomName)s' verlassen möchtest?", "Custom level": "Benutzerdefiniertes Berechtigungslevel", - "Device ID:": "Geräte-Kennung:", "device id: ": "Geräte-ID: ", - "Device key:": "Geräte-Schlüssel:", "Publish this room to the public in %(domain)s's room directory?": "Diesen Raum im Raum-Verzeichnis von %(domain)s veröffentlichen?", "Register": "Registrieren", "Save": "Speichern", - "Unknown (user, device) pair:": "Unbekanntes (Benutzer-/Gerät-)Paar:", "Remote addresses for this room:": "Remote-Adressen für diesen Raum:", - "Unrecognised command:": "Unbekannter Befehl:", "Unrecognised room alias:": "Unbekannter Raum-Alias:", "Use compact timeline layout": "Kompaktes Chatverlauf-Layout verwenden", "Verified key": "Verifizierter Schlüssel", - "WARNING: Device already verified, but keys do NOT MATCH!": "WARNUNG: Gerät bereits verifiziert, aber Schlüssel sind NICHT GLEICH!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "WARNUNG: SCHLÜSSEL-VERIFIZIERUNG FEHLGESCHLAGEN! Der Signatur-Schlüssel für %(userId)s und das Gerät %(deviceId)s ist \"%(fprint)s\", welcher nicht mit dem bereitgestellten Schlüssel \"%(fingerprint)s\" übereinstimmt. Dies kann bedeuten, dass deine Kommunikation abgehört wird!", "You have disabled URL previews by default.": "Du hast die URL-Vorschau standardmäßig deaktiviert.", "You have enabled URL previews by default.": "Du hast die URL-Vorschau standardmäßig aktiviert.", "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s hat das Raum-Bild geändert zu ", @@ -438,7 +398,6 @@ "Disable Notifications": "Benachrichtigungen deaktivieren", "Drop File Here": "Lasse Datei hier los", "Enable Notifications": "Benachrichtigungen aktivieren", - "Encrypted by an unverified device": "Von einem nicht verifizierten Gerät verschlüsselt", "Failed to upload profile picture!": "Hochladen des Profilbild's fehlgeschlagen!", "Incoming call from %(name)s": "Eingehender Anruf von %(name)s", "Incoming video call from %(name)s": "Eingehender Video-Anruf von %(name)s", @@ -448,16 +407,12 @@ "No display name": "Kein Anzeigename", "Private Chat": "Privater Chat", "Public Chat": "Öffentlicher Chat", - "Room contains unknown devices": "Raum enthält unbekannte Geräte", "%(roomName)s does not exist.": "%(roomName)s existert nicht.", "%(roomName)s is not accessible at this time.": "%(roomName)s ist aktuell nicht zugreifbar.", "Seen by %(userName)s at %(dateTime)s": "Gesehen von %(userName)s um %(dateTime)s", "Send anyway": "Trotzdem senden", "Start authentication": "Authentifizierung beginnen", - "Show Text Formatting Toolbar": "Text-Formatierungs-Werkzeugleiste anzeigen", "This room": "In diesem Raum", - "Undecryptable": "Nicht entschlüsselbar", - "Unencrypted message": "Nicht verschlüsselbare Nachricht", "unknown caller": "Unbekannter Anrufer", "Unnamed Room": "Unbenannter Raum", "Upload new:": "Neue(s) hochladen:", @@ -476,9 +431,7 @@ "Start verification": "Verifizierung starten", "Share without verifying": "Ohne Verifizierung verwenden", "Ignore request": "Anforderung ignorieren", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Du hast das neue Gerät '%(displayName)s' hinzugefügt, welches nun Verschlüsselungs-Schlüssel anfordert.", "Encryption key request": "Anforderung von Verschlüsselungs-Schlüsseln", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Dein nicht verifiziertes Gerät '%(displayName)s' fordert Verschlüsselungs-Schlüssel an.", "Check for update": "Suche nach Updates", "Add a widget": "Widget hinzufügen", "Allow": "Erlauben", @@ -490,8 +443,6 @@ "Unable to create widget.": "Widget kann nicht erstellt werden.", "You are not in this room.": "Du bist nicht in diesem Raum.", "You do not have permission to do that in this room.": "Du hast dafür keine Berechtigung in diesem Raum.", - "Verifies a user, device, and pubkey tuple": "Verifiziert ein Tupel aus Benutzer, Gerät und öffentlichem Schlüssel", - "Loading device info...": "Lädt Geräte-Info...", "Example": "Beispiel", "Create": "Erstellen", "Featured Rooms:": "Hervorgehobene Räume:", @@ -705,13 +656,10 @@ "Flair": "Abzeichen", "Showing flair for these communities:": "Abzeichen für diese Communities zeigen:", "This room is not showing flair for any communities": "Dieser Raum zeigt für keine Communities die Abzeichen an", - "Delete %(count)s devices|other": "Lösche %(count)s Geräte", - "Delete %(count)s devices|one": "Lösche Gerät", "Something went wrong when trying to get your communities.": "Beim Laden deiner Communites ist etwas schief gelaufen.", "Display your community flair in rooms configured to show it.": "Zeige deinen Community-Flair in den Räumen, die es erlauben.", "This homeserver doesn't offer any login flows which are supported by this client.": "Dieser Heimserver verfügt über keinen, von diesem Client unterstütztes Anmeldeverfahren.", "Call Failed": "Anruf fehlgeschlagen", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "In diesem Raum befinden sich nicht-verifizierte Geräte. Wenn du fortfährst ohne sie zu verifizieren, könnten Angreifer den Anruf mithören.", "Review Devices": "Geräte ansehen", "Call Anyway": "Trotzdem anrufen", "Answer Anyway": "Trotzdem annehmen", @@ -743,7 +691,6 @@ "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)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.", - "Show devices, send anyway or cancel.": "Geräte anzeigen, trotzdem senden oder abbrechen.", "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 enthalten, 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 es der Fall ist", @@ -756,11 +703,7 @@ "Did you know: you can use communities to filter your Riot.im experience!": "Wusstest du: Du kannst Communities nutzen um deine Riot.im-Erfahrung zu filtern!", "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Um einen Filter zu setzen, siehe einen Community-Bild auf das Filter-Panel ganz links. Du kannst jederzeit auf einen Avatar im Filter-Panel klicken um nur die Räume und Personen aus der Community zu sehen.", "Clear filter": "Filter zurücksetzen", - "Your key share request has been sent - please check your other devices for key share requests.": "Die Anfrage den Schlüssel zu teilen wurden gesendet. Bitte sieh auf deinen anderen Geräte nach der Anfrage.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Schlüssel-Anfragen wurden automatisch zu den anderen Geräten gesendet. Wenn du diese Anfragen auf deinen anderen Geräten abgelehnt oder verpasst hast, klicke hier um die Schlüssel für diese Sitzung erneut anzufragen.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Wenn deine anderen Geräte keine Schlüssel für diese Nachricht haben, wirst du diese nicht entschlüsseln können.", "Key request sent.": "Schlüssel-Anfragen gesendet.", - "Re-request encryption keys from your other devices.": "Verschlüsselungs-Schlüssel von deinen anderen Geräten erneut anfragen.", "If you've submitted a bug via GitHub, debug logs can help us track down the problem. 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.": "Wenn du einen Fehler via GitHub gemeldet hast, können Fehlerberichte uns helfen um das Problem zu finden. Sie enthalten Anwendungsdaten wie deinen Nutzernamen, Raum- und Gruppen-ID's und Aliase die du besucht hast und Nutzernamen anderer Nutzer. Sie enthalten keine Nachrichten.", "Submit debug logs": "Fehlerberichte einreichen", "Code": "Code", @@ -823,7 +766,6 @@ "Noisy": "Laut", "Collecting app version information": "App-Versionsinformationen werden abgerufen", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Soll der Raum-Alias %(alias)s gelöscht und der %(name)s aus dem Verzeichnis entfernt werden?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Dies erlaubt dir, dich wieder an deinem Konto anzumelden, nachdem du dich abgemeldet hast.", "Keywords": "Schlüsselwörter", "Enable notifications for this account": "Benachrichtigungen für dieses Benutzerkonto aktivieren", "Invite to this community": "In diese Community einladen", @@ -913,7 +855,6 @@ "Your device resolution": "Deine Bildschirmauflösung", "Popout widget": "Widget ausklinken", "Always show encryption icons": "Immer Verschlüsselungssymbole zeigen", - "Unable to reply": "Antworten nicht möglich", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Das Ereignis, auf das geantwortet wurde, konnte nicht geladen werden. Entweder es existiert nicht oder du hast keine Berechtigung, dieses anzusehen.", "Send Logs": "Sende Protokoll", "Clear Storage and Sign Out": "Speicher leeren und abmelden", @@ -921,7 +862,6 @@ "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", - "At this time it is not possible to reply with an emote.": "An dieser Stelle ist es nicht möglich mit einer Umschreibung zu antworten.", "Enable widget screenshots on supported widgets": "Widget-Screenshots bei unterstützten Widgets aktivieren", "Send analytics data": "Analysedaten senden", "e.g. %(exampleValue)s": "z.B. %(exampleValue)s", @@ -965,14 +905,8 @@ "A call is currently being placed!": "Ein Anruf wurde schon gestartet!", "Permission Required": "Berechtigung benötigt", "You do not have permission to start a conference call in this room": "Du hast keine Berechtigung um ein Konferenzgespräch in diesem Raum zu starten", - "deleted": "gelöscht", - "underlined": "unterstrichen", - "bulleted-list": "Liste mit Punkten", - "numbered-list": "Liste mit Nummern", "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", - "inline-code": "Quellcode", - "block-quote": "Zitat", "System Alerts": "System-Benachrichtigung", "Only room administrators will see this warning": "Nur Raum-Administratoren werden diese Nachricht sehen", "Please contact your service administrator to continue using the service.": "Bitte kontaktiere deinen Systemadministrator um diesen Dienst weiter zu nutzen.", @@ -1024,11 +958,6 @@ "Show developer tools": "Zeige Entwickler-Werkzeuge", "Unable to load! Check your network connectivity and try again.": "Konnte nicht geladen werden! Überprüfe die Netzwerkverbindung und versuche es erneut.", "Delete Backup": "Sicherung löschen", - "Backup has a valid signature from this device": "Sicherung hat eine valide Signatur von diesem Gerät", - "Backup has an invalid signature from verified device ": "Sicherung hat eine invalide Signatur vom verifiziertem Gerät ", - "Backup has an invalid signature from unverified device ": "Sicherung hat eine invalide Signatur vom unverifiziertem Gerät ", - "Backup has a valid signature from unverified device ": "Sicherung hat eine valide Signatur vom unverifiziertem Gerät ", - "Backup is not signed by any of your devices": "Sicherung wurde von keinem deiner Geräte signiert", "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 Riot to do this": "Um deinen Chatverlauf nicht zu verlieren, musst du deine Raum-Schlüssel exportieren, bevor du dich abmeldest. Du musst zurück zu einer neueren Riot-Version gehen, um dies zu tun", @@ -1095,7 +1024,6 @@ "Straight rows of keys are easy to guess": "Gerade Reihen von Tasten sind einfach zu erraten", "Custom user status messages": "Angepasste Nutzerstatus-Nachrichten", "Unable to load key backup status": "Konnte Status des Schlüsselbackups nicht laden", - "Backup has a valid signature from verified device ": "Sicherung hat eine valide Signatur von einem verifiziertem Gerät ", "Don't ask again": "Nicht erneut fragen", "Set up": "Einrichten", "Please review and accept all of the homeserver's policies": "Bitte sieh dir die Heimserver-Regularien an und akzeptiere sie", @@ -1110,7 +1038,6 @@ "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options": "Wenn du deinen Wiederherstellungspassphrase vergessen hast, kannst du deinen Wiederherstellungsschlüssel benutzen oder neue Wiederherstellungsoptionen einrichten", "You've previously used a newer version of Riot on %(host)s. To use this version again with end to end encryption, you will need to sign out and back in again. ": "Du hast kürzlich eine neuere Version von Riot auf %(host)s verwendet. Um diese Version erneut mit Ende-zu-Ende-Verschlüsselung zu nutzen, musst du dich ab- und wieder anmelden. ", "Access your secure message history and set up secure messaging by entering your recovery key.": "Auf sichere Nachrichtenhistorie zugreifen und sicheren Nachrichtenversand einrichten indem du deinen Wiederherstellungsschlüssel eingibst.", - "If you've forgotten your recovery passphrase you can ": "Wenn du deine Wiederherstellungspassphrase vergessen hast, kannst du ", "Set a new status...": "Setze einen neuen Status...", "Clear status": "Status löschen", "Invalid homeserver discovery response": "Ungültige Antwort beim Aufspüren des Heimservers", @@ -1120,8 +1047,6 @@ "Great! This passphrase looks strong enough.": "Gut! Diese Passphrase sieht stark genug aus.", "As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.": "Als Sicherheitsnetz kannst du ihn benutzen um deine verschlüsselte Nachrichtenhistorie wiederherzustellen, falls du deine Wiederherstellungspassphrase vergessen hast.", "As a safety net, you can use it to restore your encrypted message history.": "Als Sicherheitsnetz kannst du ihn benutzen um deine verschlüsselte Nachrichtenhistorie wiederherzustellen.", - "Your Recovery Key has been copied to your clipboard, paste it to:": "Dein Wiederherstellungsschlüssel wurde in deine Zwischenablage kopiert. Füge ihn hier ein:", - "Your Recovery Key is in your Downloads folder.": "Dein Wiederherstellungsschlüssel ist in deinem Downloads-Ordner.", "Set up Secure Message Recovery": "Richte Sichere Nachrichten-Wiederherstellung ein", "Without setting up Secure Message Recovery, you'll lose your secure message history when you log out.": "Ohne Sichere Nachrichten-Wiederherstellung einzurichten, wirst du deine sichere Nachrichtenhistorie verlieren, wenn du dich abmeldest.", "If you don't want to set this up now, you can later in Settings.": "Wenn du dies jetzt nicht einrichten willst, kannst du dies später in den Einstellungen tun.", @@ -1130,7 +1055,6 @@ "Set up Secure Messages": "Richte sichere Nachrichten ein", "Go to Settings": "Gehe zu Einstellungen", "Sign in with single sign-on": "Mit Single Sign-On anmelden", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "Wenn du die Sichere Nachrichten-Wiederherstellung nicht einrichtest, wirst du nicht in der Lage sein deine verschlüsselte Nachrichtenhistorie wiederherzustellen, wenn du dich abmeldest oder ein weiteres Gerät benutzt.", "Waiting for %(userId)s to confirm...": "Warte auf Bestätigung für %(userId)s ...", "Unrecognised address": "Nicht erkannte Adresse", "User %(user_id)s may or may not exist": "Existenz der Benutzer %(user_id)s unsicher", @@ -1164,20 +1088,17 @@ "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Sichere Nachrichten mit diesem Benutzer sind Ende-zu-Ende-verschlüsselt und können nicht von Dritten gelesen werden.", "Got It": "Verstanden", "Verify this user by confirming the following number appears on their screen.": "Verifizieren Sie diesen Benutzer, indem Sie bestätigen, dass die folgende Nummer auf dessen Bildschirm erscheint.", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "Für maximale Sicherheit empfehlen wir, dies persönlich zu tun oder ein anderes vertrauenswürdiges Kommunikationsmittel zu verwenden.", "Yes": "Ja", "No": "Nein", "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "Wir haben dir eine E-Mail geschickt, um deine Adresse zu überprüfen. Bitte folge den Anweisungen dort und klicke dann auf die Schaltfläche unten.", "Email Address": "E-Mail-Adresse", "Backing up %(sessionsRemaining)s keys...": "Sichere %(sessionsRemaining)s Schlüssel...", "All keys backed up": "Alle Schlüssel gesichert", - "Backup has a signature from unknown device with ID %(deviceId)s.": "Sicherung hat eine Signatur von einem unbekannten Gerät mit der ID %(deviceId)s.", "Add an email address to configure email notifications": "Füge eine E-Mail-Adresse hinzu, um E-Mail-Benachrichtigungen zu konfigurieren", "Unable to verify phone number.": "Die Telefonnummer kann nicht überprüft werden.", "Verification code": "Bestätigungscode", "Phone Number": "Telefonnummer", "Profile picture": "Profilbild", - "Upload profile picture": "Profilbild hochladen", "Display Name": "Anzeigename", "Room information": "Rauminformationen", "Internal room ID:": "Interne Raum ID:", @@ -1257,7 +1178,6 @@ "Book": "Buch", "Pencil": "Stift", "Paperclip": "Büroklammer", - "Padlock": "Vorhängeschloss", "Key": "Schlüssel", "Hammer": "Hammer", "Telephone": "Telefon", @@ -1275,8 +1195,6 @@ "Headphones": "Kopfhörer", "Folder": "Ordner", "Pin": "Stecknadel", - "Your homeserver does not support device management.": "Dein Heimserver unterstützt Geräte-Management nicht.", - "This backup is trusted because it has been restored on this device": "Dieser Sicherung wird vertraut, weil es auf diesem Gerät wiederhergestellt wurde", "Timeline": "Chatverlauf", "Autocomplete delay (ms)": "Verzögerung zur Autovervollständigung (ms)", "Roles & Permissions": "Rollen & Berechtigungen", @@ -1292,14 +1210,8 @@ "Verify this user by confirming the following emoji appear on their screen.": "Verifizieren Sie diesen Benutzer, indem Sie bestätigen, dass folgendes Emoji auf dessen Bildschirm erscheint.", "Missing media permissions, click the button below to request.": "Fehlende Medienberechtigungen. Drücke auf den Knopf unten, um sie anzufordern.", "Request media permissions": "Medienberechtigungen anfordern", - "Some devices for this user are not trusted": "Nicht allen Geräte dieses Benutzers wird vertraut", - "Some devices in this encrypted room are not trusted": "Nicht allen Geräten in diesem Verschlüsselten Raum wird vertraut", - "All devices for this user are trusted": "Allen Geräten dieses Benutzers wird vertraut", - "All devices in this encrypted room are trusted": "Allen Geräten in diesem Raum wird vertraut", "Main address": "Primäre Adresse", "Room avatar": "Raum-Bild", - "Upload room avatar": "Raum-Bild hochladen", - "No room avatar": "Kein Raum-Bild", "Room Name": "Raum-Name", "Room Topic": "Raum-Thema", "Join": "Beitreten", @@ -1314,9 +1226,7 @@ "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Bist du sicher? Du wirst deine verschlüsselten Nachrichten verlieren, wenn deine Schlüssel nicht 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", - "This device is backing up your keys. ": "Dieses Gerät sichert deine Schlüssel. ", "Back up your keys before signing out to avoid losing them.": "Sichere deine Schlüssel bevor du dich abmeldest, damit du sie nicht verlierst.", - "Your keys are not being backed up from this device.": "Deine Schlüssel werden nicht von diesem Gerät gesichert.", "Start using Key Backup": "Beginne Schlüsselsicherung zu nutzen", "Credits": "Danksagungen", "Starting backup...": "Starte Backup...", @@ -1337,7 +1247,6 @@ "Composer": "Nachrichteneingabefeld", "Nothing appearing? Not all clients support interactive verification yet. .": "Es ist nichts aufgetaucht? Noch nicht alle Clients unterstützen die interaktive Verifikation. .", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Verifiziere diesen Benutzer und markiere ihn als \"vertraut\". Dies gibt dir bei Ende-zu-Ende-verschlüsselten Nachrichten extra Seelenfrieden.", - "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "Das Verifizieren dieses Benutzers wird seine Geräte als \"vertraut\" markieren und dein Gerät bei ihnen als \"vertraut\" markieren.", "I don't want my encrypted messages": "Ich möchte meine verschlüsselten Nachrichten nicht", "You'll lose access to your encrypted messages": "Du wirst den Zugang zu deinen verschlüsselten Nachrichten verlieren", "If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.": "Wenn du Fehler bemerkst oder eine Rückmeldung geben möchtest, teile dies uns auf GitHub mit.", @@ -1372,7 +1281,6 @@ "A verification email will be sent to your inbox to confirm setting your new password.": "Eine Verifizierungs-E-Mail wird an dich gesendet um dein neues Passwort zu bestätigen.", "Sign in instead": "Stattdessen anmelden", "Your password has been reset.": "Dein Passwort wurde zurückgesetzt.", - "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Du wurdest auf allen Geräten abgemeldet und wirst keine Push-Benachrichtigungen bekommen. Um Benachrichtigungen wieder zu aktivieren, melde dich auf jedem Gerät erneut an.", "Set a new password": "Setze ein neues Passwort", "This homeserver does not support login using email address.": "Dieser Heimserver unterstützt eine Anmeldung über E-Mail-Adresse nicht.", "Create account": "Konto anlegen", @@ -1383,12 +1291,8 @@ "Set up with a Recovery Key": "Wiederherstellungsschlüssel einrichten", "Please enter your passphrase a second time to confirm.": "Bitte gebe deine Passphrase ein weiteres mal zur Bestätigung ein.", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "Dein Wiederherstellungsschlüssel ist ein Sicherungsnetz - Du kannst ihn benutzen um Zugang zu deinen verschlüsselten Nachrichten zu bekommen, wenn du deine Passphrase vergisst.", - "Keep your recovery key somewhere very secure, like a password manager (or a safe)": "Speichere deinen Wiederherstellungsschlüssel irgendwo, wo er sicher ist. Das kann ein Passwort-Manager oder Safe sein", "A new recovery passphrase and key for Secure Messages have been detected.": "Eine neue Wiederherstellungspassphrase und -Schlüssel für sichere Nachrichten wurde festgestellt.", - "This device is encrypting history using the new recovery method.": "Dieses Gerät verschlüsselt die Historie mit einer neuen Wiederherstellungsmethode.", "Recovery Method Removed": "Wiederherstellungsmethode gelöscht", - "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "Dieses Gerät hat bemerkt, dass deine Wiederherstellungspassphrase und -Schlüssel für Sichere Nachrichten gelöscht wurde.", - "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "Wenn du dies aus Versehen getan hast, kannst du Sichere Nachrichten auf diesem Gerät einrichten, wodurch die Nachrichtenhistorie von diesem Gerät mit einer neuen Wiederherstellungsmethode erneut verschlüsselt wird.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Wenn du die Wiederherstellungsmethode nicht gelöscht hast, kann ein Angreifer versuchen Zugang zu deinem Konto zu bekommen. Ändere dein Passwort und richte sofort eine neue Wiederherstellungsmethode in den Einstellungen ein.", "Backup could not be decrypted with this key: please verify that you entered the correct recovery key.": "Sicherung konnte mit diesem Schlüssel nicht entschlüsselt werden: Bitte stelle sicher, dass du den richtigen Wiederherstellungsschlüssel eingegeben hast.", "Incorrect Recovery Passphrase": "Falsche Wiederherstellungspassphrase", @@ -1448,22 +1352,16 @@ "Want more than a community? Get your own server": "Du möchtest mehr als eine Community? Hol dir deinen eigenen Server", "Could not load user profile": "Konnte Nutzerprofil nicht laden", "Your Matrix account on %(serverName)s": "Dein Matrixkonto auf %(serverName)s", - "Email, name or Matrix ID": "E-Mail, Name oder Matrix-ID", "Name or Matrix ID": "Name oder Matrix ID", "Your Riot is misconfigured": "Dein Riot ist falsch konfiguriert", "You cannot modify widgets in this room.": "Du kannst 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)", "A conference call could not be started because the integrations server is not available": "Ein Konferenzanruf konnte nicht gestartet werden, da der Integrationsserver nicht verfügbar ist", "The server does not support the room version specified.": "Der Server unterstützt die angegebene Raumversion nicht.", - "Room upgrade confirmation": "Raum-Upgradebestätigung", - "Upgrading a room can be destructive and isn't always necessary.": "Ein Raum-Upgrade kann destruktiv sein und ist nicht immer notwendig.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Raum-Upgrades werden üblicherweise empfohlen, wenn eine Raum-Version instabil ist. Instabile Raum-Versionen können Bugs, fehlende Features oder Sicherheitslücken enthalten.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Raum-Upgrades betreffen überlicherweise nur serverseitige Datenverarbeitung des Raumes. Wenn du ein Problem mit deinem Riot-Client hast, dann erstelle bitte ein Issue mit .", "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.", "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?", "The file '%(fileName)s' failed to upload.": "Die Datei \"%(fileName)s\" konnte nicht hochgeladen werden.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Bitte bestätige, dass du mit dem Raum-Upgrade von auf fortfahren möchtest.", "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", @@ -1486,7 +1384,6 @@ "Show recently visited rooms above the room list": "Zeige kürzlich besuchte Räume oberhalb der Raumliste", "Show hidden events in timeline": "Zeige versteckte Ereignisse in der Chronik", "Low bandwidth mode": "Modus für niedrige Bandbreite", - "Enable desktop notifications for this device": "Desktop-Benachrichtigungen für dieses Gerät aktivieren", "Reset": "Zurücksetzen", "Joining room …": "Raum beitreten…", "Rejecting invite …": "Einladung ablehnen…", @@ -1516,19 +1413,14 @@ "Revoke invite": "Einladung zurückziehen", "Invited by %(sender)s": "Eingeladen von %(sender)s", "Changes your avatar in all rooms": "Verändert dein Profilbild in allen Räumen", - "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Dieses Gerät speichert deine Schlüssel nicht, aber du hast ein bestehendes Backup, welches du wiederherstellen kannst um fortzufahren.", - "Backup has an invalid signature from this device": "Das Backup besitzt eine ungültige Signatur von diesem Gerät", - "Failed to start chat": "Chat konnte nicht gestartet werden", "Messages": "Nachrichten", "Actions": "Aktionen", "Displays list of commands with usages and descriptions": "Zeigt eine Liste von Befehlen mit Verwendungen und Beschreibungen an", - "Connect this device to Key Backup": "Schließen Sie dieses Gerät an Key Backup an", "Call failed due to misconfigured server": "Anruf aufgrund eines falsch konfigurierten Servers fehlgeschlagen", "Try using turn.matrix.org": "Versuchen Sie es mit turn.matrix.org", "You do not have the required permissions to use this command.": "Sie haben nicht die erforderlichen Berechtigungen, um diesen Befehl zu verwenden.", "Multiple integration managers": "Mehrere Integrationsmanager", "Public Name": "Öffentlicher Name", - "Enable audible notifications for this device": "Aktivieren Sie die akustischen Benachrichtigungen für dieses Gerät", "Identity Server URL must be HTTPS": "Die Identity Server-URL muss HTTPS sein", "Could not connect to Identity Server": "Verbindung zum Identity Server konnte nicht hergestellt werden", "Checking server": "Server wird überprüft", @@ -1545,7 +1437,6 @@ "Do not use an identity server": "Keinen Identitätsserver verwenden", "Enter a new identity server": "Gib einen neuen Identitätsserver ein", "Clear personal data": "Persönliche Daten löschen", - "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.": "Warnung: Deine persönlichen Daten (inkl. Verschlüsselungsschlüssel) sind noch auf diesem Gerät gespeichert. Lösche diese Daten, wenn du mit der Nutzung auf diesem Gerät fertig bist oder dich in einen anderen Account einloggen möchtest.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Wenn du die Verbindung zu deinem Identitätsserver trennst, heißt das, dass du nicht mehr von anderen Benutzern gefunden werden und auch andere nicht mehr per E-Mail oder Telefonnummer einladen kannst.", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Bitte frage den Administrator deines Heimservers (%(homeserverDomain)s) darum, einen TURN-Server einzurichten, damit Anrufe zuverlässig funktionieren.", "Disconnect from the identity server ?": "Verbindung zum Identitätsserver trennen?", @@ -1554,8 +1445,6 @@ "Changes the avatar of the current room": "Ändert den Avatar für diesen Raum", "Deactivate account": "Benutzerkonto schließen", "Show previews/thumbnails for images": "Zeige eine Vorschau für Bilder", - "A device's public name is visible to people you communicate with": "Der Gerätename ist sichtbar für die Personen mit denen du kommunizierst", - "Clear all data on this device?": "Alle Daten auf diesem Gerät löschen?", "View": "Vorschau", "Find a room…": "Suche einen Raum…", "Find a room… (e.g. %(exampleRoom)s)": "Suche einen Raum… (z.B. %(exampleRoom)s)", @@ -1569,9 +1458,6 @@ "Use an identity server to invite by email. Manage in Settings.": "Nutze einen Identitätsserver, um über E-Mail Einladungen zu verschicken. Verwalte es in den Einstellungen.", "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", "Try out new ways to ignore people (experimental)": "Versuche neue Möglichkeiten, um Menschen zu ignorieren (experimentell)", - "Send verification requests in direct message, including a new verification UX in the member panel.": "Verschicke Bestätigungsanfragen via Direktnachricht, inklusive einer neuen Verifikationsnutzer*innenoberfläche im Mitglieds-Panel", - "Enable cross-signing to verify per-user instead of per-device (in development)": "Schalte cross-signing ein, um Verifizierung per Benutzer*in statt per Gerät zu ermöglichen (in Entwicklung)", - "Use the new, faster, composer for writing messages": "Nutze die neue, schnellere Schreiboberfläche um Nachrichten zu verfassen.", "Send read receipts for messages (requires compatible homeserver to disable)": "Schicke Lesebestätigungen für Nachrichten (erfordert einen kompatiblen Heimserver zum Deaktivieren)", "My Ban List": "Meine Bannliste", "This is your list of users/servers you have blocked - don't leave the room!": "Dies ist die Liste von Benutzer*innen/Servern, die du blockiert hast - verlasse den Raum nicht!", @@ -1588,7 +1474,6 @@ "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s tätigte einen Videoanruf (Nicht von diesem Browser unterstützt)", "Verify this session": "Sitzung verifizieren", "Set up encryption": "Verschlüsselung einrichten", - "New Session": "Neue Sitzung", "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s hat %(addedAddresses)s und %(count)s Adressen zu diesem Raum hinzugefügt", "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s hat %(removedAddresses)s und %(count)s andere Adressen aus diesem Raum entfernt", "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s hat %(countRemoved)s entfernt und %(countAdded)s Adressen zu diesem Raum hinzugefügt", @@ -1612,13 +1497,10 @@ "Show info about bridges in room settings": "Information über Bridges in den Raumeinstellungen anzeigen", "Enable message search in encrypted rooms": "Nachrichtensuche in verschlüsselten Räumen aktivieren", "Lock": "Sperren", - "Review & verify your new session": "Überprüfe & verifiziere deine neue Sitzung", "Later": "Später", "Review": "Überprüfen", - "Verify your other devices easier": "Verifiziere deine weiteren Geräte einfacher", "Verify": "Verifizieren", "Decline (%(counter)s)": "Zurückweisen (%(counter)s)", - "on device": "auf dem Gerät", "not found": "nicht gefunden", "rooms.": "Räume.", "Manage": "Verwalten", @@ -1627,7 +1509,6 @@ "Connecting to integration manager...": "Verbinden zum 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.", - "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Verbinde dieses Gerät zum Schlüssel Backup, bevor du dich ausloggst, um zu verhindern, dass Verschlüsselungsschlüssel, die sich nur auf dem Gerät befinden, verloren gehen.", "not stored": "nicht gespeichert", "Backup has a signature from unknown user with ID %(deviceId)s": "Backup hat eine Signatur von Unbekanntem Nutzer mit ID %(deviceId)s", "Backup key stored: ": "Backup Schlüssel gespeichert: ", diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index b4de278ef0..8bbcf47cbe 100644 --- a/src/i18n/strings/el.json +++ b/src/i18n/strings/el.json @@ -59,12 +59,8 @@ "Decrypt %(text)s": "Αποκρυπτογράφηση %(text)s", "Decryption error": "Σφάλμα αποκρυπτογράφησης", "Default": "Προεπιλογή", - "Device already verified!": "Η συσκευή έχει ήδη επαληθευτεί!", "Device ID": "Αναγνωριστικό συσκευής", - "Device ID:": "Αναγνωριστικό συσκευής:", "device id: ": "αναγνωριστικό συσκευής: ", - "Device key:": "Κλειδί συσκευής:", - "Devices": "Συσκευές", "Direct chats": "Απευθείας συνομιλίες", "Disinvite": "Ανάκληση πρόσκλησης", "Download %(text)s": "Λήψη %(text)s", @@ -103,7 +99,6 @@ "Incorrect username and/or password.": "Λανθασμένο όνομα χρήστη και/ή κωδικός.", "Incorrect verification code": "Λανθασμένος κωδικός επαλήθευσης", "Invalid Email Address": "Μη έγκυρη διεύθυνση ηλεκτρονικής αλληλογραφίας", - "Invite new room members": "Προσκαλέστε νέα μέλη", "Invited": "Προσκλήθηκε", "Invites": "Προσκλήσεις", "Sign in with": "Συνδεθείτε με", @@ -118,8 +113,6 @@ "Local addresses for this room:": "Τοπική διεύθυνση για το δωμάτιο:", "Logout": "Αποσύνδεση", "Low priority": "Χαμηλής προτεραιότητας", - "matrix-react-sdk version:": "Έκδοση matrix-react-sdk:", - "Message not sent due to unknown devices being present": "Το μήνυμα δεν στάλθηκε γιατί υπάρχουν άγνωστες συσκευές", "Click here to fix": "Κάνε κλικ εδώ για διόρθωση", "Command error": "Σφάλμα εντολής", "Commands": "Εντολές", @@ -140,7 +133,6 @@ "olm version:": "Έκδοση olm:", "Password": "Κωδικός πρόσβασης", "Passwords can't be empty": "Οι κωδικοί πρόσβασης δεν γίνετε να είναι κενοί", - "People": "Άτομα", "Phone": "Τηλέφωνο", "Register": "Εγγραφή", "riot-web version:": "Έκδοση riot-web:", @@ -157,12 +149,9 @@ "This email address is already in use": "Η διεύθυνση ηλ. αλληλογραφίας χρησιμοποιείται ήδη", "This email address was not found": "Δεν βρέθηκε η διεύθυνση ηλ. αλληλογραφίας", "Success": "Επιτυχία", - "Start Chat": "Συνομιλία", "Cancel": "Ακύρωση", "Custom Server Options": "Προσαρμοσμένες ρυθμίσεις διακομιστή", "Dismiss": "Απόρριψη", - "bold": "έντονα", - "italic": "πλάγια", "Close": "Κλείσιμο", "Create new room": "Δημιουργία νέου δωματίου", "Room directory": "Ευρετήριο", @@ -193,8 +182,6 @@ "Home": "Αρχική", "Last seen": "Τελευταία εμφάνιση", "Manage Integrations": "Διαχείριση ενσωματώσεων", - "Markdown is disabled": "Το Markdown είναι απενεργοποιημένο", - "Markdown is enabled": "Το Markdown είναι ενεργοποιημένο", "Missing room_id in request": "Λείπει το room_id στο αίτημα", "Permissions": "Δικαιώματα", "Power level must be positive integer.": "Το επίπεδο δύναμης πρέπει να είναι ένας θετικός ακέραιος.", @@ -214,7 +201,6 @@ "Searches DuckDuckGo for results": "Γίνεται αναζήτηση στο DuckDuckGo για αποτελέσματα", "Seen by %(userName)s at %(dateTime)s": "Διαβάστηκε από τον/την %(userName)s στις %(dateTime)s", "Send anyway": "Αποστολή ούτως ή άλλως", - "Send Invites": "Αποστολή προσκλήσεων", "Send Reset Email": "Αποστολή μηνύματος επαναφοράς", "%(senderDisplayName)s sent an image.": "Ο %(senderDisplayName)s έστειλε μια φωτογραφία.", "Session ID": "Αναγνωριστικό συνεδρίας", @@ -231,15 +217,12 @@ "Unban": "Άρση αποκλεισμού", "%(senderName)s unbanned %(targetName)s.": "Ο χρήστης %(senderName)s έδιωξε τον χρήστη %(targetName)s.", "Unable to enable Notifications": "Αδυναμία ενεργοποίησης των ειδοποιήσεων", - "Unable to load device list": "Αδυναμία φόρτωσης της λίστας συσκευών", "unencrypted": "μη κρυπτογραφημένο", - "Unencrypted message": "Μη κρυπτογραφημένο μήνυμα", "unknown caller": "άγνωστος καλών", "unknown device": "άγνωστη συσκευή", "Unknown room %(roomId)s": "Άγνωστο δωμάτιο %(roomId)s", "Unmute": "Άρση σίγασης", "Unnamed Room": "Ανώνυμο δωμάτιο", - "Unrecognised command:": "Μη αναγνωρίσιμη εντολή:", "Unrecognised room alias:": "Μη αναγνωρίσιμο ψευδώνυμο:", "Upload avatar": "Αποστολή προσωπικής εικόνας", "Upload Failed": "Απέτυχε η αποστολή", @@ -252,7 +235,6 @@ "Video call": "Βιντεοκλήση", "Voice call": "Φωνητική κλήση", "Warning!": "Προειδοποίηση!", - "Who would you like to communicate with?": "Με ποιον θα θέλατε να επικοινωνήσετε;", "You are already in a call.": "Είστε ήδη σε μια κλήση.", "You have no visible notifications": "Δεν έχετε ορατές ειδοποιήσεις", "You must register to use this functionality": "Πρέπει να εγγραφείτε για να χρησιμοποιήσετε αυτή την λειτουργία", @@ -300,11 +282,7 @@ "Unknown error": "Άγνωστο σφάλμα", "Incorrect password": "Λανθασμένος κωδικός πρόσβασης", "To continue, please enter your password.": "Για να συνεχίσετε, παρακαλούμε πληκτρολογήστε τον κωδικό πρόσβασής σας.", - "Device name": "Όνομα συσκευής", - "Device key": "Κλειδί συσκευής", - "Verify device": "Επιβεβαίωση συσκευής", "Unable to restore session": "Αδυναμία επαναφοράς συνεδρίας", - "Unknown devices": "Άγνωστες συσκευές", "Unknown Address": "Άγνωστη διεύθυνση", "Blacklist": "Μαύρη λίστα", "Verify...": "Επιβεβαίωση...", @@ -327,7 +305,6 @@ "Username not available": "Μη διαθέσιμο όνομα χρήστη", "Something went wrong!": "Κάτι πήγε στραβά!", "Could not connect to the integration server": "Αδυναμία σύνδεσης στον διακομιστή ενσωμάτωσης", - "Encrypted by an unverified device": "Κρυπτογραφημένο από μια ανεπιβεβαίωτη συσκευή", "Error: Problem communicating with the given homeserver.": "Σφάλμα: πρόβλημα κατά την επικοινωνία με τον ορισμένο διακομιστή.", "Failed to ban user": "Δεν ήταν δυνατό ο αποκλεισμός του χρήστη", "Failed to change power level": "Δεν ήταν δυνατή η αλλαγή του επιπέδου δύναμης", @@ -335,26 +312,20 @@ "Failed to unban": "Δεν ήταν δυνατή η άρση του αποκλεισμού", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s από %(fromPowerLevel)s σε %(toPowerLevel)s", "Guests cannot join this room even if explicitly invited.": "Οι επισκέπτες δεν μπορούν να συνδεθούν στο δωμάτιο ακόμη και αν έχουν καλεστεί.", - "Hide Text Formatting Toolbar": "Απόκρυψη εργαλειοθήκης μορφοποίησης κειμένου", "Incoming call from %(name)s": "Εισερχόμενη κλήση από %(name)s", "Incoming video call from %(name)s": "Εισερχόμενη βιντεοκλήση από %(name)s", "Incoming voice call from %(name)s": "Εισερχόμενη φωνητική κλήση από %(name)s", - "Invalid alias format": "Μη έγκυρη μορφή ψευδώνυμου", "Invalid file%(extra)s": "Μη έγκυρο αρχείο %(extra)s", "%(senderName)s invited %(targetName)s.": "Ο %(senderName)s προσκάλεσε τον %(targetName)s.", "Invites user with given id to current room": "Προσκαλεί τον χρήστη με το δοσμένο αναγνωριστικό στο τρέχον δωμάτιο", - "'%(alias)s' is not a valid format for an alias": "Το '%(alias)s' δεν είναι μια έγκυρη μορφή ψευδώνυμου", "%(senderName)s made future room history visible to all room members, from the point they are invited.": "Ο %(senderName)s έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο όλα τα μέλη, από τη στιγμή που προσκλήθηκαν.", "%(senderName)s made future room history visible to all room members, from the point they joined.": "Ο %(senderName)s έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο όλα τα μέλη, από τη στιγμή που συνδέθηκαν.", "%(senderName)s made future room history visible to all room members.": "Ο %(senderName)s έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο όλα τα μέλη.", "%(senderName)s made future room history visible to anyone.": "Ο %(senderName)s έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο οποιοσδήποτε.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "Ο %(senderName)s έκανε το μελλοντικό ιστορικό του δωματίου δημόσιο άγνωστο (%(visibility)s).", "Missing user_id in request": "Λείπει το user_id στο αίτημα", - "Never send encrypted messages to unverified devices from this device": "Να μη γίνει ποτέ αποστολή κρυπτογραφημένων μηνυμάτων σε ανεπιβεβαίωτες συσκευές από αυτή τη συσκευή", - "Never send encrypted messages to unverified devices in this room from this device": "Να μη γίνει ποτέ αποστολή κρυπτογραφημένων μηνυμάτων σε ανεπιβεβαίωτες συσκευές, σε αυτό το δωμάτιο, από αυτή τη συσκευή", "not specified": "μη καθορισμένο", "NOT verified": "ΧΩΡΙΣ επαλήθευση", - "No devices with registered encryption keys": "Καθόλου συσκευές με εγγεγραμένα κλειδιά κρυπτογράφησης", "No display name": "Χωρίς όνομα", "No users have specific privileges in this room": "Κανένας χρήστης δεν έχει συγκεκριμένα δικαιώματα σε αυτό το δωμάτιο", "Only people who have been invited": "Μόνο άτομα που έχουν προσκληθεί", @@ -363,18 +334,14 @@ "%(senderName)s requested a VoIP conference.": "Ο %(senderName)s αιτήθηκε μια συνδιάσκεψη VoIP.", "Riot does not have permission to send you notifications - please check your browser settings": "Το Riot δεν έχει δικαιώματα για αποστολή ειδοποιήσεων - παρακαλούμε ελέγξτε τις ρυθμίσεις του περιηγητή σας", "Riot was not given permission to send notifications - please try again": "Δεν δόθηκαν δικαιώματα αποστολής ειδοποιήσεων στο Riot - παρακαλούμε προσπαθήστε ξανά", - "Room contains unknown devices": "Το δωμάτιο περιέχει άγνωστες συσκευές", "%(roomName)s is not accessible at this time.": "Το %(roomName)s δεν είναι προσβάσιμο αυτή τη στιγμή.", "Scroll to bottom of page": "Μετάβαση στο τέλος της σελίδας", - "Sender device information": "Πληροφορίες συσκευής αποστολέα", "Server may be unavailable, overloaded, or search timed out :(": "Ο διακομιστής μπορεί να είναι μη διαθέσιμος, υπερφορτωμένος, ή να έχει λήξει η αναζήτηση :(", "Server may be unavailable, overloaded, or you hit a bug.": "Ο διακομιστής μπορεί να είναι μη διαθέσιμος, υπερφορτωμένος, ή να πέσατε σε ένα σφάλμα.", "Server unavailable, overloaded, or something else went wrong.": "Ο διακομιστής μπορεί να είναι μη διαθέσιμος, υπερφορτωμένος, ή κάτι άλλο να πήγε στραβά.", - "Show Text Formatting Toolbar": "Εμφάνιση της εργαλειοθήκης μορφοποίησης κειμένου", "%(count)s of your messages have not been sent.|other": "Μερικά από τα μηνύματα σας δεν έχουν αποσταλεί.", "This room is not recognised.": "Αυτό το δωμάτιο δεν αναγνωρίζεται.", "Unable to capture screen": "Αδυναμία σύλληψης οθόνης", - "Unknown (user, device) pair:": "Άγνωστο ζεύγος (χρήστη, συσκευής):", "Uploading %(filename)s and %(count)s others|zero": "Γίνεται αποστολή του %(filename)s", "Uploading %(filename)s and %(count)s others|other": "Γίνεται αποστολή του %(filename)s και %(count)s υπολοίπων", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (δύναμη %(powerLevelNumber)s)", @@ -385,7 +352,6 @@ "VoIP conference finished.": "Ολοκληρώθηκε η συνδιάσκεψη VoIP.", "VoIP conference started.": "Ξεκίνησησε η συνδιάσκεψη VoIP.", "VoIP is unsupported": "Δεν υποστηρίζεται το VoIP", - "WARNING: Device already verified, but keys do NOT MATCH!": "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Η συσκευή έχει επαληθευτεί, αλλά τα κλειδιά ΔΕΝ ΤΑΙΡΙΑΖΟΥΝ!", "Who can access this room?": "Ποιος μπορεί να προσπελάσει αυτό το δωμάτιο;", "Who can read history?": "Ποιος μπορεί να διαβάσει το ιστορικό;", "%(senderName)s withdrew %(targetName)s's invitation.": "Ο %(senderName)s ανακάλεσε την πρόσκληση του %(targetName)s.", @@ -401,7 +367,6 @@ "Riot collects anonymous analytics to allow us to improve the application.": "Το Riot συλλέγει ανώνυμα δεδομένα επιτρέποντας μας να βελτιώσουμε την εφαρμογή.", "Failed to invite": "Δεν ήταν δυνατή η πρόσκληση", "I verify that the keys match": "Επιβεβαιώνω πως ταιριάζουν τα κλειδιά", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "Το \"%(RoomName)s\" περιέχει συσκευές που δεν έχετε ξαναδεί.", "Please check your email to continue registration.": "Παρακαλούμε ελέγξτε την ηλεκτρονική σας αλληλογραφία για να συνεχίσετε με την εγγραφή.", "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Αν δεν ορίσετε μια διεύθυνση ηλεκτρονικής αλληλογραφίας, δεν θα θα μπορείτε να επαναφέρετε τον κωδικό πρόσβασης σας. Είστε σίγουροι;", "Removed or unknown message type": "Αφαιρέθηκε ή άγνωστος τύπος μηνύματος", @@ -418,8 +383,6 @@ "The email address linked to your account must be entered.": "Πρέπει να εισηχθεί η διεύθυνση ηλ. αλληλογραφίας που είναι συνδεδεμένη με τον λογαριασμό σας.", "The remote side failed to pick up": "Η απομακρυσμένη πλευρά απέτυχε να συλλέξει", "This room is not accessible by remote Matrix servers": "Αυτό το δωμάτιο δεν είναι προσβάσιμο από απομακρυσμένους διακομιστές Matrix", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "Ο %(senderName)s ενεργοποίησε την από άκρο σε άκρο κρυπτογράφηση (algorithm %(algorithm)s).", - "Undecryptable": "Μη αποκρυπτογραφημένο", "Uploading %(filename)s and %(count)s others|one": "Γίνεται αποστολή του %(filename)s και %(count)s υπολοίπα", "You have disabled URL previews by default.": "Έχετε απενεργοποιημένη από προεπιλογή την προεπισκόπηση συνδέσμων.", "You have enabled URL previews by default.": "Έχετε ενεργοποιημένη από προεπιλογή την προεπισκόπηση συνδέσμων.", @@ -432,9 +395,7 @@ "Join as voice or video.": "Συμμετάσχετε με φωνή ή βίντεο.", "Joins room with given alias": "Συνδέεστε στο δωμάτιο με δοσμένο ψευδώνυμο", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Εμφάνιση χρονικών σημάνσεων σε 12ωρη μορφή ώρας (π.χ. 2:30 μ.μ.)", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Το κλειδί υπογραφής που δώσατε αντιστοιχεί στο κλειδί υπογραφής που λάβατε από τη συσκευή %(userId)s %(deviceId)s. Η συσκευή έχει επισημανθεί ως επιβεβαιωμένη.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Η διεύθυνση της ηλ. αλληλογραφίας σας δεν φαίνεται να συσχετίζεται με μια ταυτότητα Matrix σε αυτόν τον Διακομιστή Φιλοξενίας.", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Ο κωδικός πρόσβασής σας άλλαξε επιτυχώς. Δεν θα λάβετε ειδοποιήσεις push σε άλλες συσκευές μέχρι να συνδεθείτε ξανά σε αυτές", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Δεν θα μπορέσετε να αναιρέσετε αυτήν την αλλαγή καθώς προωθείτε τον χρήστη να έχει το ίδιο επίπεδο δύναμης με τον εαυτό σας.", "Sent messages will be stored until your connection has returned.": "Τα απεσταλμένα μηνύματα θα αποθηκευτούν μέχρι να αακτηθεί η σύνδεσή σας.", "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Είστε βέβαιοι ότι θέλετε να καταργήσετε (διαγράψετε) αυτό το συμβάν; Σημειώστε ότι αν διαγράψετε το όνομα δωματίου ή αλλάξετε το θέμα, θα μπορούσε να αναιρέσει την αλλαγή.", @@ -452,22 +413,16 @@ "Your browser does not support the required cryptography extensions": "Ο περιηγητής σας δεν υποστηρίζει τα απαιτούμενα πρόσθετα κρυπτογράφησης", "Not a valid Riot keyfile": "Μη έγκυρο αρχείο κλειδιού Riot", "Authentication check failed: incorrect password?": "Αποτυχία ελέγχου πιστοποίησης: λανθασμένος κωδικός πρόσβασης;", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Η αλλαγή του κωδικού πρόσβασης θα επαναφέρει τα κλειδιά κρυπτογράφησης από άκρο σε άκρο σε όλες τις συσκευές, καθιστώντας το κρυπτογραφημένο ιστορικό συζητήσεων μη αναγνώσιμο, εκτός και αν εξάγετε πρώτα τα κλειδιά και τα εισαγάγετε ξανά στο δωμάτιο. Στο μέλλον αυτή η διαδικασία θα βελτιωθεί.", "Claimed Ed25519 fingerprint key": "Απαιτήθηκε κλειδί αποτυπώματος Ed25519", "Displays action": "Εμφανίζει την ενέργεια", "To use it, just wait for autocomplete results to load and tab through them.": "Για να το χρησιμοποιήσετε, απλά περιμένετε μέχρι να φορτωθούν τα αποτέλεσμα αυτόματης συμπλήρωσης. Έπειτα επιλέξτε ένα από αυτά χρησιμοποιώντας τον στηλοθέτη.", "Use compact timeline layout": "Χρήση συμπαγούς διάταξης χρονολογίου", "(could not connect media)": "(αδυναμία σύνδεσης με το πολυμέσο)", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: ΑΠΕΤΥΧΕ Η ΕΠΙΒΕΒΑΙΩΣΗ ΤΟΥ ΚΛΕΙΔΙΟΥ! Το κλειδί υπογραφής για τον χρήστη %(userId)s και συσκευή %(deviceId)s είναι \"%(fprint)s\" και δεν ταιριάζει με το δοσμένο κλειδί \"%(fingerprint)s\". Αυτό σημαίνει ότι η επικοινωνία σας μπορεί να έχει υποκλαπεί!", "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Αυτή η διαδικασία σας επιτρέπει να εξαγάγετε τα κλειδιά για τα μηνύματα που έχετε λάβει σε κρυπτογραφημένα δωμάτια σε ένα τοπικό αρχείο. Στη συνέχεια, θα μπορέσετε να εισάγετε το αρχείο σε άλλο πρόγραμμα του Matrix, έτσι ώστε το πρόγραμμα να είναι σε θέση να αποκρυπτογραφήσει αυτά τα μηνύματα.", "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Το αρχείο εξαγωγής θα επιτρέψει σε οποιονδήποτε που μπορεί να το διαβάσει να αποκρυπτογραφήσει κρυπτογραφημένα μηνύματα που εσείς μπορείτε να δείτε, οπότε θα πρέπει να είστε προσεκτικοί για να το κρατήσετε ασφαλές. Για να βοηθήσετε με αυτό, θα πρέπει να εισαγάγετε ένα συνθηματικό, το οποία θα χρησιμοποιηθεί για την κρυπτογράφηση των εξαγόμενων δεδομένων. Η εισαγωγή δεδομένων θα είναι δυνατή χρησιμοποιώντας μόνο το ίδιο συνθηματικό.", "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Αυτή η διαδικασία σας επιτρέπει να εισαγάγετε κλειδιά κρυπτογράφησης που έχετε προηγουμένως εξάγει από άλλο πρόγραμμα του Matrix. Στη συνέχεια, θα μπορέσετε να αποκρυπτογραφήσετε τυχόν μηνύματα που το άλλο πρόγραμμα θα μπορούσε να αποκρυπτογραφήσει.", "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Το αρχείο εξαγωγής θα είναι προστατευμένο με συνθηματικό. Θα χρειαστεί να πληκτρολογήσετε το συνθηματικό εδώ για να αποκρυπτογραφήσετε το αρχείο.", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Για να βεβαιωθείτε ότι είναι αξιόπιστη αυτή η συσκευή, επικοινωνήστε με τον κάτοχο της χρησιμοποιώντας άλλα μέσα (π.χ. προσωπικά ή μέσω τηλεφώνου) και ρωτήστε εάν το κλειδί που βλέπετε στις ρυθμίσεις χρήστη για αυτήν τη συσκευή ταιριάζει με το παρακάτω κλειδί:", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Εάν ταιριάζει, πατήστε το κουμπί επιβεβαίωσης παρακάτω. Εάν όχι, τότε κάποιος άλλος παρακολουθεί αυτή τη συσκευή και ίσως θέλετε να πατήσετε το κουμπί της μαύρης λίστας.", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Αν χρησιμοποιούσατε προηγουμένως μια πιο πρόσφατη έκδοση του Riot, η συνεδρία σας ίσως είναι μη συμβατή με αυτήν την έκδοση. Κλείστε αυτό το παράθυρο και επιστρέψτε στην πιο πρόσφατη έκδοση.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Αυτήν τη στιγμή βάζετε σε μαύρη λίστα μη επιβαιωμένες συσκευές. Για να στείλετε μηνύματα σε αυτές τις συσκευές, πρέπει να τις επιβεβαιώσετε.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Σας συνιστούμε να ολοκληρώσετε τη διαδικασία επαλήθευσης για κάθε συσκευή και να επιβεβαιώσετε ότι ανήκουν στον νόμιμο κάτοχό της, αλλά εάν προτιμάτε μπορείτε να στείλετε ξανά το μήνυμα χωρίς επαλήθευση.", "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?": "Θα μεταφερθείτε σε έναν ιστότοπου τρίτου για να πραγματοποιηθεί η πιστοποίηση του λογαριασμού σας με το %(integrationsUrl)s. Θα θέλατε να συνεχίσετε;", "Do you want to set an email address?": "Θέλετε να ορίσετε μια διεύθυνση ηλεκτρονικής αλληλογραφίας;", "This will allow you to reset your password and receive notifications.": "Αυτό θα σας επιτρέψει να επαναφέρετε τον κωδικό πρόσβαση σας και θα μπορείτε να λαμβάνετε ειδοποιήσεις.", @@ -475,8 +430,6 @@ "Start verification": "Έναρξη επιβεβαίωσης", "Share without verifying": "Κοινή χρήση χωρίς επιβεβαίωση", "Ignore request": "Παράβλεψη αιτήματος", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Έχετε προσθέσει μια νέα συσκευή '%(displayName)s', η οποία ζητά κλειδιά κρυπτογράφησης.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Η ανεπιβεβαίωτη συσκευή σας '%(displayName)s' ζητά κλειδιά κρυπτογράφησης.", "Encryption key request": "Αίτημα κλειδιού κρυπτογράφησης", "Check for update": "Έλεγχος για ενημέρωση", "Fetching third party location failed": "Η λήψη τοποθεσίας απέτυχε", @@ -527,7 +480,6 @@ "Noisy": "Δυνατά", "Collecting app version information": "Συγκέντρωση πληροφοριών σχετικά με την έκδοση της εφαρμογής", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Διαγραφή του ψευδώνυμου %(alias)s και αφαίρεση του %(name)s από το ευρετήριο;", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Αυτό θα σας επιτρέψει να επιστρέψετε στον λογαριασμό σας αφού αποσυνδεθείτε και συνδεθείτε από άλλες συσκευές.", "Keywords": "Λέξεις κλειδιά", "Enable notifications for this account": "Ενεργοποίηση ειδοποιήσεων για τον λογαριασμό", "Messages containing keywords": "Μηνύματα που περιέχουν λέξεις κλειδιά", @@ -624,7 +576,6 @@ "Failed to invite users to community": "Αποτυχία πρόσκλησης χρηστών στην κοινότητα", "Failed to invite users to %(groupId)s": "Αποτυχία πρόσκλησης χρηστών στο %(groupId)s", "Failed to add the following rooms to %(groupId)s:": "Αποτυχία προσθήκης στο %(groupId)s των δωματίων:", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Υπάρχουν άγνωστες συσκευές στο δωμάτιο: εάν συνεχίσετε χωρίς να τις επιβεβαιώσετε, θα μπορούσε κάποιος να κρυφακούει την κλήση σας.", "Show these rooms to non-members on the community page and room list?": "Εμφάνιση αυτών των δωματίων σε μη-μέλη στην σελίδα της κοινότητας και στη λίστα δωματίων;", "Room name or alias": "Όνομα η ψευδώνυμο δωματίου", "Restricted": "Περιορισμένο/η", @@ -640,15 +591,12 @@ "%(widgetName)s widget removed by %(senderName)s": "Το widget %(widgetName)s αφαιρέθηκε από τον/την %(senderName)s", "Message Pinning": "Καρφίτσωμα Μηνυμάτων", "Enable URL previews for this room (only affects you)": "Ενεργοποίηση προεπισκόπισης URL για αυτό το δωμάτιο (επηρεάζει μόνο εσάς)", - "Delete %(count)s devices|other": "Διαγραφή %(count)s συσκευών", - "Delete %(count)s devices|one": "Διαγραφή συσκευής", "Cannot add any more widgets": "Δεν είναι δυνατή η προσθήκη άλλων γραφικών στοιχείων", "The maximum permitted number of widgets have already been added to this room.": "Ο μέγιστος επιτρεπτός αριθμός γραφικών στοιχείων έχει ήδη προστεθεί σε αυτό το δωμάτιο.", "Add a widget": "Προσθέστε ένα γραφικό στοιχείο", "%(senderName)s sent an image": "Ο/Η %(senderName)s έστειλε μία εικόνα", "%(senderName)s sent a video": "Ο/Η %(senderName)s έστειλε ένα βίντεο", "%(senderName)s uploaded a file": "Ο/Η %(senderName)s αναφόρτωσε ένα αρχείο", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Εάν οι άλλες συσκευές σας δεν έχουν το κλειδί για αυτό το μήνυμα, τότε δεν θα μπορείτε να το αποκρυπτογραφήσετε.", "Disinvite this user?": "Απόσυρση της πρόσκλησης αυτού του χρήστη;", "Mention": "Αναφορά", "Invite": "Πρόσκληση", @@ -657,7 +605,6 @@ "Send a reply (unencrypted)…": "Αποστολή απάντησης (μη κρυπτογραφημένης)…", "Send an encrypted message…": "Αποστολή κρυπτογραφημένου μηνύματος…", "Send a message (unencrypted)…": "Αποστολή μηνύματος (μη κρυπτογραφημένου)…", - "Unable to reply": "Αδυναμία απάντησης", "Unpin Message": "Ξεκαρφίτσωμα μηνύματος", "Jump to message": "Πηγαίντε στο μήνυμα", "No pinned messages.": "Κανένα καρφιτσωμένο μήνυμα.", @@ -704,8 +651,6 @@ "Unable to load! Check your network connectivity and try again.": "Αδυναμία φόρτωσης! Ελέγξτε την σύνδεση του δικτύου και προσπαθήστε ξανά.", "Registration Required": "Απαιτείτε Εγγραφή", "You need to register to do this. Would you like to register now?": "Χρειάζεται να γίνει εγγραφή για αυτό. Θα θέλατε να κάνετε εγγραφή τώρα;", - "Email, name or Matrix ID": "Ηλ. ταχυδρομείο, όνομα ή ταυτότητα Matrix", - "Failed to start chat": "Αποτυχία αρχικοποίησης συνομιλίας", "Failed to invite users to the room:": "Αποτυχία πρόσκλησης χρηστών στο δωμάτιο:", "Missing roomId.": "Λείπει η ταυτότητα δωματίου.", "Messages": "Μηνύματα", @@ -715,12 +660,7 @@ "Sends a message as plain text, without interpreting it as markdown": "Αποστέλλει ένα μήνυμα ως απλό κείμενο, χωρίς να το ερμηνεύει ως \"markdown\"", "Upgrades a room to a new version": "Αναβαθμίζει το δωμάτιο σε μια καινούργια έκδοση", "You do not have the required permissions to use this command.": "Δεν διαθέτετε τις απαιτούμενες άδειες για να χρησιμοποιήσετε αυτήν την εντολή.", - "Room upgrade confirmation": "Επιβεβαίωση αναβάθμισης δωματίου", - "Upgrading a room can be destructive and isn't always necessary.": "Η αναβάθμιση ενός δωματίου μπορεί να είναι καταστροφική και δεν είναι πάντα απαραίτητη.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Οι αναβαθμίσεις δωματίου είναι συνήθως προτεινόμενες όταν μια έκδοση δωματίου θεωρείτε ασταθής. Ασταθείς εκδόσεις δωματίων μπορεί να έχουν σφάλματα, ελλειπή χαρακτηριστικά, ή αδυναμίες ασφαλείας.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Οι αναβαθμίσεις δωματίων συνήθως επηρεάζουν μόνο την επεξεργασία του δωματίου από την πλευρά του διακομιστή. Εάν έχετε προβλήματα με το πρόγραμμα-πελάτη Riot, παρακαλώ αρχειοθετήστε ένα πρόβλημα μέσω .", "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.": "Προσοχή: Αναβαθμίζοντας ένα δωμάτιο δεν θα μεταφέρει αυτόματα τα μέλη του δωματίου στη νέα έκδοση του δωματίου. Θα αναρτήσουμε ένα σύνδεσμο προς το νέο δωμάτιο στη παλιά έκδοση του δωματίου - τα μέλη του δωματίου θα πρέπει να πατήσουν στον σύνδεσμο για να μπουν στο νέο δωμάτιο.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Παρακαλώ επιβεβαιώστε ότι θα θέλατε να προχωρήσετε με την αναβάθμιση του δωματίου από σε .", "Changes your display nickname in the current room only": "Αλλάζει το εμφανιζόμενο ψευδώνυμο μόνο στο παρόν δωμάτιο", "Changes the avatar of the current room": "Αλλάζει το άβαταρ αυτού του δωματίου", "Changes your avatar in this current room only": "Αλλάζει το άβαταρ σας μόνο στο παρόν δωμάτιο", diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json index 70e4bf5092..05f29c3887 100644 --- a/src/i18n/strings/en_US.json +++ b/src/i18n/strings/en_US.json @@ -47,7 +47,6 @@ "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s removed the room name.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s changed the topic to \"%(topic)s\".", "Changes your display nickname": "Changes your display nickname", - "Changing password will currently reset any end-to-end encryption keys on all devices, 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 devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.", "Claimed Ed25519 fingerprint key": "Claimed Ed25519 fingerprint key", "Click here to fix": "Click here to fix", "Click to mute audio": "Click to mute audio", @@ -72,12 +71,8 @@ "Deops user with given id": "Deops user with given id", "Default": "Default", "Delete widget": "Delete widget", - "Device already verified!": "Device already verified!", "Device ID": "Device ID", - "Device ID:": "Device ID:", "device id: ": "device id: ", - "Device key:": "Device key:", - "Devices": "Devices", "Direct chats": "Direct chats", "Disinvite": "Disinvite", "Displays action": "Displays action", @@ -124,7 +119,6 @@ "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s", "Guests cannot join this room even if explicitly invited.": "Guests cannot join this room even if explicitly invited.", "Hangup": "Hangup", - "Hide Text Formatting Toolbar": "Hide Text Formatting Toolbar", "Historical": "Historical", "Homeserver is": "Homeserver is", "Identity Server is": "Identity Server is", @@ -133,15 +127,12 @@ "Import E2E room keys": "Import E2E room keys", "Incorrect username and/or password.": "Incorrect username and/or password.", "Incorrect verification code": "Incorrect verification code", - "Invalid alias format": "Invalid alias format", "Invalid Email Address": "Invalid Email Address", "Invalid file%(extra)s": "Invalid file%(extra)s", "%(senderName)s invited %(targetName)s.": "%(senderName)s invited %(targetName)s.", - "Invite new room members": "Invite new room members", "Invited": "Invited", "Invites": "Invites", "Invites user with given id to current room": "Invites user with given id to current room", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias", "Sign in with": "Sign in with", "Join Room": "Join Room", "%(targetName)s joined the room.": "%(targetName)s joined the room.", @@ -172,17 +163,11 @@ "%(senderName)s made future room history visible to anyone.": "%(senderName)s made future room history visible to anyone.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s made future room history visible to unknown (%(visibility)s).", "Manage Integrations": "Manage Integrations", - "Markdown is disabled": "Markdown is disabled", - "Markdown is enabled": "Markdown is enabled", - "matrix-react-sdk version:": "matrix-react-sdk version:", - "Message not sent due to unknown devices being present": "Message not sent due to unknown devices being present", "Missing room_id in request": "Missing room_id in request", "Missing user_id in request": "Missing user_id in request", "Moderator": "Moderator", "Mute": "Mute", "Name": "Name", - "Never send encrypted messages to unverified devices from this device": "Never send encrypted messages to unverified devices from this device", - "Never send encrypted messages to unverified devices in this room from this device": "Never send encrypted messages to unverified devices in this room from this device", "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)", "New passwords don't match": "New passwords don't match", "New passwords must match each other.": "New passwords must match each other.", @@ -192,7 +177,6 @@ "(not supported by this browser)": "(not supported by this browser)", "": "", "NOT verified": "NOT verified", - "No devices with registered encryption keys": "No devices with registered encryption keys", "No more results": "No more results", "No results": "No results", "No users have specific privileges in this room": "No users have specific privileges in this room", @@ -202,7 +186,6 @@ "Operation failed": "Operation failed", "Password": "Password", "Passwords can't be empty": "Passwords can't be empty", - "People": "People", "Permissions": "Permissions", "Phone": "Phone", "Please check your email and click on the link it contains. Once this is done, click continue.": "Please check your email and click on the link it contains. Once this is done, click continue.", @@ -233,8 +216,6 @@ "Search": "Search", "Search failed": "Search failed", "Searches DuckDuckGo for results": "Searches DuckDuckGo for results", - "Sender device information": "Sender device information", - "Send Invites": "Send Invites", "Send Reset Email": "Send Reset Email", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sent an image.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.", @@ -253,10 +234,8 @@ "%(count)s of your messages have not been sent.|other": "Some of your messages have not been sent.", "Someone": "Someone", "Start a chat": "Start a chat", - "Start Chat": "Start Chat", "Submit": "Submit", "Success": "Success", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.", "This email address is already in use": "This email address is already in use", "This email address was not found": "This email address was not found", "The email address linked to your account must be entered.": "The email address linked to your account must be entered.", @@ -269,7 +248,6 @@ "To use it, just wait for autocomplete results to load and tab through them.": "To use it, just wait for autocomplete results to load and tab through them.", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Tried to load a specific point in this room's timeline, but was unable to find it.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).", "Unable to add email address": "Unable to add email address", "Unable to remove contact information": "Unable to remove contact information", "Unable to verify email address.": "Unable to verify email address.", @@ -277,14 +255,11 @@ "%(senderName)s unbanned %(targetName)s.": "%(senderName)s unbanned %(targetName)s.", "Unable to capture screen": "Unable to capture screen", "Unable to enable Notifications": "Unable to enable Notifications", - "Unable to load device list": "Unable to load device list", "unencrypted": "unencrypted", "unknown device": "unknown device", "unknown error code": "unknown error code", "Unknown room %(roomId)s": "Unknown room %(roomId)s", - "Unknown (user, device) pair:": "Unknown (user, device) pair:", "Unmute": "Unmute", - "Unrecognised command:": "Unrecognized command:", "Unrecognised room alias:": "Unrecognized room alias:", "Upload avatar": "Upload avatar", "Upload Failed": "Upload Failed", @@ -306,11 +281,8 @@ "(no answer)": "(no answer)", "(unknown failure: %(reason)s)": "(unknown failure: %(reason)s)", "Warning!": "Warning!", - "WARNING: Device already verified, but keys do NOT MATCH!": "WARNING: Device already verified, but keys do NOT MATCH!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!", "Who can access this room?": "Who can access this room?", "Who can read history?": "Who can read history?", - "Who would you like to communicate with?": "Who would you like to communicate with?", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s withdrew %(targetName)s's invitation.", "You are already in a call.": "You are already in a call.", "You cannot place a call with yourself.": "You cannot place a call with yourself.", @@ -322,7 +294,6 @@ "You need to be able to invite users to do that.": "You need to be able to invite users to do that.", "You need to be logged in.": "You need to be logged in.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Your email address does not appear to be associated with a Matrix ID on this Homeserver.", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them", "You seem to be in a call, are you sure you want to quit?": "You seem to be in a call, are you sure you want to quit?", "You seem to be uploading files, are you sure you want to quit?": "You seem to be uploading files, are you sure you want to quit?", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.", @@ -359,8 +330,6 @@ "Sent messages will be stored until your connection has returned.": "Sent messages will be stored until your connection has returned.", "Cancel": "Cancel", "Active call": "Active call", - "bold": "bold", - "italic": "italic", "Please select the destination room for this message": "Please select the destination room for this message", "Start automatically after system login": "Start automatically after system login", "Analytics": "Analytics", @@ -387,18 +356,9 @@ "Unknown error": "Unknown error", "Incorrect password": "Incorrect password", "To continue, please enter your password.": "To continue, please enter your password.", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:", - "Device name": "Device name", - "Device key": "Device key", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.", - "Verify device": "Verify device", "I verify that the keys match": "I verify that the keys match", "Unable to restore session": "Unable to restore session", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contains devices that you haven't seen before.", - "Unknown devices": "Unknown devices", "Unknown Address": "Unknown Address", "Unblacklist": "Unblacklist", "Blacklist": "Blacklist", @@ -444,7 +404,6 @@ "Room directory": "Room directory", "Start chat": "Start chat", "Drop File Here": "Drop File Here", - "Encrypted by an unverified device": "Encrypted by an unverified device", "Error: Problem communicating with the given homeserver.": "Error: Problem communicating with the given homeserver.", "Failed to fetch avatar URL": "Failed to fetch avatar URL", "Failed to upload profile picture!": "Failed to upload profile picture!", @@ -457,17 +416,13 @@ "No display name": "No display name", "Private Chat": "Private Chat", "Public Chat": "Public Chat", - "Room contains unknown devices": "Room contains unknown devices", "%(roomName)s does not exist.": "%(roomName)s does not exist.", "%(roomName)s is not accessible at this time.": "%(roomName)s is not accessible at this time.", "Seen by %(userName)s at %(dateTime)s": "Seen by %(userName)s at %(dateTime)s", "Send anyway": "Send anyway", - "Show Text Formatting Toolbar": "Show Text Formatting Toolbar", "Start authentication": "Start authentication", "The phone number entered looks invalid": "The phone number entered looks invalid", "This room": "This room", - "Undecryptable": "Undecryptable", - "Unencrypted message": "Unencrypted message", "unknown caller": "unknown caller", "Unnamed Room": "Unnamed Room", "Uploading %(filename)s and %(count)s others|zero": "Uploading %(filename)s", @@ -494,8 +449,6 @@ "Start verification": "Start verification", "Share without verifying": "Share without verifying", "Ignore request": "Ignore request", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "You added a new device '%(displayName)s', which is requesting encryption keys.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Your unverified device '%(displayName)s' is requesting encryption keys.", "Encryption key request": "Encryption key request", "Check for update": "Check for update", "Allow": "Allow", @@ -508,7 +461,6 @@ "Unable to create widget.": "Unable to create widget.", "You are not in this room.": "You are not in this room.", "You do not have permission to do that in this room.": "You do not have permission to do that in this room.", - "Loading device info...": "Loading device info...", "Message removed by %(userId)s": "Message removed by %(userId)s", "Example": "Example", "Create": "Create", @@ -519,7 +471,6 @@ "Failed to upload image": "Failed to upload image", "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s widget added by %(senderName)s", "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s widget removed by %(senderName)s", - "Verifies a user, device, and pubkey tuple": "Verifies a user, device, and pubkey tuple", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.", "Fetching third party location failed": "Fetching third party location failed", "A new version of Riot is available.": "A new version of Riot is available.", @@ -568,7 +519,6 @@ "Files": "Files", "Collecting app version information": "Collecting app version information", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Delete the room alias %(alias)s and remove %(name)s from the directory?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "This will allow you to return to your account after signing out, and sign in on other devices.", "Keywords": "Keywords", "Unpin Message": "Unpin Message", "Enable notifications for this account": "Enable notifications for this account", @@ -653,7 +603,6 @@ "The information being sent to us to help make Riot.im better includes:": "The information being sent to us to help make Riot.im better includes:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.", "Call Failed": "Call Failed", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.", "Review Devices": "Review Devices", "Call Anyway": "Call Anyway", "Answer Anyway": "Answer Anyway", @@ -701,15 +650,9 @@ "The server does not support the room version specified.": "The server does not support the room version specified.", "Name or Matrix ID": "Name or Matrix ID", "Unable to load! Check your network connectivity and try again.": "Unable to load! Check your network connectivity and try again.", - "Email, name or Matrix ID": "Email, name or Matrix ID", "Failed to invite users to the room:": "Failed to invite users to the room:", "Upgrades a room to a new version": "Upgrades a room to a new version", - "Room upgrade confirmation": "Room upgrade confirmation", - "Upgrading a room can be destructive and isn't always necessary.": "Upgrading a room can be destructive and isn't always necessary.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .", "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.": "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.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Please confirm that you'd like to go forward with upgrading this room from to .", "Changes your display nickname in the current room only": "Changes your display nickname in the current room only", "Changes your avatar in this current room only": "Changes your avatar in this current room only", "Gets or sets the room topic": "Gets or sets the room topic", @@ -743,7 +686,6 @@ "Call failed due to misconfigured server": "Call failed due to misconfigured server", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.", "Try using turn.matrix.org": "Try using turn.matrix.org", - "Failed to start chat": "Failed to start chat", "Messages": "Messages", "Actions": "Actions", "Other": "Other" diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 2953a81ce3..1513e2dcd8 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -62,10 +62,6 @@ "Moderator": "Ĉambrestro", "Admin": "Administranto", "Start a chat": "Komenci babilon", - "Who would you like to communicate with?": "Kun kiu vi volas komuniki?", - "Start Chat": "Komenci babilon", - "Invite new room members": "Inviti novajn ĉambranojn", - "Send Invites": "Sendi invitojn", "Operation failed": "Ago malsukcesis", "Failed to invite": "Invito malsukcesis", "Failed to invite the following users to the %(roomName)s room:": "Malsukcesis inviti la jenajn uzantojn al la ĉambro %(roomName)s:", @@ -88,13 +84,7 @@ "You are now ignoring %(userId)s": "Vi nun malatentas uzanton %(userId)s", "Unignored user": "Reatentata uzanto", "You are no longer ignoring %(userId)s": "Vi nun reatentas uzanton %(userId)s", - "Unknown (user, device) pair:": "Nekonata duopo (uzanto, aparato):", - "Device already verified!": "Aparato jam kontroliĝis!", - "WARNING: Device already verified, but keys do NOT MATCH!": "AVERTO: Aparato jam kontroliĝis, sed la ŝlosiloj NE KONGRUAS!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "AVERTO: KONTROLO DE ŜLOSILO MALSUKCESIS! Subskriba ŝlosilo por %(userId)s kaj aparato%(deviceId)s estas « %(fprint)s », kiu ne kongruas kun la donita ŝlosilo « %(fingerprint)s ». Eble do via komuniko estas subaŭskultata!", "Verified key": "Kontrolita ŝlosilo", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "La donita subskriba ŝlosilo kongruas kun la ŝlosilo ricevita de %(userId)s por ĝia aparato %(deviceId)s. Aparato markita kiel kontrolita.", - "Unrecognised command:": "Nerekonita komando:", "Reason": "Kialo", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s akceptis la inviton por %(displayName)s.", "%(targetName)s accepted an invitation.": "%(targetName)s akceptis inviton.", @@ -131,7 +121,6 @@ "%(senderName)s made future room history visible to all room members.": "%(senderName)s videbligis estontan historion de la ĉambro al ĉiuj ĉambranoj.", "%(senderName)s made future room history visible to anyone.": "%(senderName)s videbligis estontan historion de la ĉambro al ĉiuj.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s videbligis estontan historion de la ĉambro al nekonata (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ŝaltis ĝiscelan ĉifradon (algoritmo: %(algorithm)s).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s al %(toPowerLevel)s", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ŝanĝis la potencan nivelon de %(powerLevelDiffText)s.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s ŝanĝis la fiksitajn mesaĝojn de la ĉambro.", @@ -151,7 +140,6 @@ "Always show message timestamps": "Ĉiam montri mesaĝajn tempindikojn", "Autoplay GIFs and videos": "Memfare ludi GIF-bildojn kaj filmojn", "Call Failed": "Voko malsukcesis", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "En la ĉambro estas nekonataj aparatoj: se vi daŭrigos ne kontrolante ilin, iu povos subaŭskulti vian vokon.", "Review Devices": "Kontroli aparatojn", "Call Anyway": "Tamen voki", "Answer Anyway": "Tamen respondi", @@ -162,8 +150,6 @@ "Enable automatic language detection for syntax highlighting": "Ŝalti memagan rekonon de lingvo por sintaksa markado", "Automatically replace plain text Emoji": "Memfare anstataŭigi tekstajn mienetojn", "Mirror local video feed": "Speguli lokan filmon", - "Never send encrypted messages to unverified devices from this device": "Neniam sendi neĉifritajn mesaĝojn al nekontrolitaj aparatoj de tiu ĉi aparato", - "Never send encrypted messages to unverified devices in this room from this device": "Neniam sendi ĉifritajn mesaĝojn al nekontrolitaj aparatoj en tiu ĉi ĉambro el tiu ĉi aparato", "Enable inline URL previews by default": "Ŝalti entekstan antaŭrigardon al retadresoj", "Enable URL previews for this room (only affects you)": "Ŝalti URL-antaŭrigardon en ĉi tiu ĉambro (nur por vi)", "Enable URL previews by default for participants in this room": "Ŝalti URL-antaŭrigardon por anoj de ĉi tiu ĉambro", @@ -193,10 +179,7 @@ "New Password": "Nova pasvorto", "Confirm password": "Konfirmi pasvorton", "Change Password": "Ŝanĝi pasvorton", - "Unable to load device list": "Listo de aparatoj ne legeblas", "Authentication": "Aŭtentigo", - "Delete %(count)s devices|other": "Forigi %(count)s aparatojn", - "Delete %(count)s devices|one": "Forigi aparaton", "Device ID": "Aparata identigilo", "Last seen": "Laste vidita", "Failed to set display name": "Malsukcesis agordi vidigan nomon", @@ -214,9 +197,6 @@ "%(senderName)s sent a video": "%(senderName)s sendis filmon", "%(senderName)s uploaded a file": "%(senderName)s alŝutis dosieron", "Options": "Agordoj", - "Undecryptable": "Nemalĉifrebla", - "Encrypted by an unverified device": "Ĉifrita de nekontrolita aparato", - "Unencrypted message": "Neĉifrita mesaĝo", "Please select the destination room for this message": "Bonvolu elekti celan ĉambron por tiu mesaĝo", "Blacklisted": "Senpova legi ĉifritajn mesaĝojn", "device id: ": "aparata identigilo: ", @@ -235,11 +215,8 @@ "Failed to change power level": "Malsukcesis ŝanĝi nivelon de potenco", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Tiun ĉi ŝanĝon vi ne povos fareblos, ĉar vi donas al la uzanto la saman nivelon de potenco, kiun havas vi mem.", "Are you sure?": "Ĉu vi certas?", - "No devices with registered encryption keys": "Neniuj aparatoj kun registritaj ĉifraj ŝlosiloj", - "Devices": "Aparatoj", "Unignore": "Reatenti", "Ignore": "Malatenti", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ŝanĝo de pasvorto nuntempe nuligos ĉiujn ĝiscele ĉifrajn ŝlosilojn sur ĉiuj viaj aparatoj. Tio igos ĉifritajn babilajn historiojn nelegeblaj, krom se vi unue elportos viajn ĉambrajn ŝlosilojn kaj reenportos ilin poste. Estonte tio pliboniĝos.", "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s ŝanĝis la profilbildon de %(roomName)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?": "Vi estas direktota al ekstera retejo por aŭtentigi vian konton por uzo kun %(integrationsUrl)s. Ĉu vi volas daŭrigi tion?", "Jump to read receipt": "Salti al legokonfirmo", @@ -262,16 +239,10 @@ "Voice call": "Voĉvoko", "Video call": "Vidvoko", "Upload file": "Alŝuti dosieron", - "Show Text Formatting Toolbar": "Montri tekstaranĝan breton", "You do not have permission to post to this room": "Mankas al vi permeso afiŝi en tiu ĉambro", - "Hide Text Formatting Toolbar": "Kaŝi tekstaranĝan breton", "Server error": "Servila eraro", "Server unavailable, overloaded, or something else went wrong.": "Servilo estas neatingebla, troŝarĝita, aŭ io alia misokazis.", "Command error": "Komanda eraro", - "bold": "grasa", - "italic": "kursiva", - "Markdown is disabled": "Marksubo estas malŝaltita", - "Markdown is enabled": "Marksubo estas ŝaltita", "Unpin Message": "Malfiksi mesaĝon", "Jump to message": "Salti al mesaĝo", "No pinned messages.": "Neniuj fiksitaj mesaĝoj.", @@ -305,7 +276,6 @@ "Community Invites": "Komunumaj invitoj", "Invites": "Invitoj", "Favourites": "Ŝatataj", - "People": "Homoj", "Rooms": "Ĉambroj", "Low priority": "Malpli gravaj", "Historical": "Estintaj", @@ -340,8 +310,6 @@ "Cancel": "Nuligi", "Jump to first unread message.": "Salti al unua nelegita mesaĝo.", "Close": "Fermi", - "Invalid alias format": "Malvalida formo de kromnomo", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' ne estas valida formo de kromnomo", "not specified": "nespecifita", "Remote addresses for this room:": "Foraj adresoj de ĉi tiu ĉambro:", "Local addresses for this room:": "Lokaj adresoj por ĉi tiu ĉambro:", @@ -502,20 +470,12 @@ "Unknown error": "Nekonata eraro", "Incorrect password": "Malĝusta pasvorto", "Deactivate Account": "Malaktivigi konton", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Por kontroli ke tiu ĉi aparato estas fidinda, bonvolu kontakti ties posedanton per alia maniero (ekz-e persone aŭ telefone) kaj demandi ĝin ĉu la ŝlosilo, kiun ĝi vidas en agordoj de uzanto ĉe si, kongruas kun la ĉi-suba ŝlosilo:", - "Device name": "Aparata nomo", - "Device key": "Aparata ŝlosilo", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Se ĝi kongruas, premu la kontrolan butonon sube. Se ne, tiuokaze iu alia interkaptas ĉi tiun aparaton, kaj eble vi premu la malpermesan butonon anstataŭe.", - "Verify device": "Kontroli aparaton", "I verify that the keys match": "Mi kontrolas, ke la ŝlosiloj kongruas", "An error has occurred.": "Okazis eraro.", "OK": "Bone", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Vi aldonis novan aparaton “%(displayName)s”, kiu petas ĉifrajn ŝlosilojn.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Via nekontrolita aparato '%(displayName)s' petas ĉifrajn ŝlosilojn.", "Start verification": "Komenci kontrolon", "Share without verifying": "Kunhavigi sen kontrolo", "Ignore request": "Malatenti peton", - "Loading device info...": "Enleganta informojn pri aparato…", "Encryption key request": "Peto por ĉifra ŝlosilo", "Unable to restore session": "Seanco ne restaŭreblas", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Se vi antaŭe uzis pli novan version de Riot, via seanco eble ne kongruos kun ĉi tiu versio. Fermu ĉi tiun fenestron kaj revenu al la pli nova versio.", @@ -532,11 +492,6 @@ "Blacklist": "Malpermesi legadon de ĉifritaj mesaĝoj", "Unverify": "Malkontroli", "If you already have a Matrix account you can log in instead.": "Se vi jam havas Matrix-konton, vi povas saluti anstataŭe.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Vi nun malpermesas legadon de ĉifritaj mesaĝoj al nekontrolitaj aparatoj; por sendi mesaĝojn al tiuj, vi devas ilin kontroli.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Ni rekomendas al vi bone kontroli ĉiun aparaton por certigi, ke ĝi apartenas al la verŝajna posedanto, sed vi povas resendi la mesaĝon sen kontrolo, laŭprefere.", - "Room contains unknown devices": "Ĉambro enhavas nekonatajn aparatojn", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "« %(RoomName)s » enhavas aparatojn, kiujn vi neniam vidis antaŭe.", - "Unknown devices": "Nekonataj aparatoj", "Private Chat": "Privata babilo", "Public Chat": "Publika babilo", "Custom": "Propra", @@ -592,7 +547,6 @@ "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Kreu komunumon por kunigi uzantojn kaj ĉambrojn! Fari propran hejmpaĝon por montri vian spacon en la universo de Matrix.", "You have no visible notifications": "Neniuj videblaj sciigoj", "Scroll to bottom of page": "Rulumi al susbo de la paĝo", - "Message not sent due to unknown devices being present": "Mesaĝo ne sendita pro ĉeesto de nekonataj aparatoj", "Connectivity to the server has been lost.": "Konekto al la servilo perdiĝis.", "Sent messages will be stored until your connection has returned.": "Senditaj mesaĝoj konserviĝos ĝis via konekto refunkcios.", "Active call": "Aktiva voko", @@ -620,13 +574,10 @@ "Dark theme": "Malhela haŭto", "Sign out": "Adiaŭi", "Success": "Sukceso", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Via pasvorto sukcese ŝanĝiĝis. Vi ne ricevos puŝatentigojn je aliaj aparatoj ĝis tiam, kiam vi resalutos per ili", "Unable to remove contact information": "Kontaktaj informoj ne forigeblas", "": "", "Import E2E room keys": "Enporti ĝiscele ĉifrajn ĉambrajn ŝlosilojn", "Cryptography": "Kriptografio", - "Device ID:": "Aparata identigilo:", - "Device key:": "Aparata ŝlosilo:", "Analytics": "Analizo", "Riot collects anonymous analytics to allow us to improve the application.": "Riot kolektas sennomaj analizajn datumojn por helpi plibonigadon de la programo.", "Labs": "Eksperimentaj funkcioj", @@ -648,7 +599,6 @@ "click to reveal": "klaku por malkovri", "Homeserver is": "Hejmservilo estas", "Identity Server is": "Identiga servilo estas", - "matrix-react-sdk version:": "versio de matrix-react-sdk:", "riot-web version:": "versio de riot-web:", "olm version:": "versio de olm:", "Failed to send email": "Malsukcesis sendi retleteron", @@ -678,7 +628,6 @@ "Kicks user with given id": "Forpelas uzanton kun la donita identigilo", "Changes your display nickname": "Ŝanĝas vian vidigan nomon", "Searches DuckDuckGo for results": "Serĉas rezultojn per DuckDuckGo", - "Verifies a user, device, and pubkey tuple": "Kontrolas opon de uzanto, aparato, kaj publika ŝlosilo", "Ignores a user, hiding their messages from you": "Malatentas uzanton, kaŝante ĝiajn mesaĝojn de vi", "Stops ignoring a user, showing their messages going forward": "Ĉesas malatenti uzanton, montronte ĝiajn pluajn mesaĝojn", "Commands": "Komandoj", @@ -701,7 +650,6 @@ "Session ID": "Seanca identigilo", "End-to-end encryption information": "Informoj pri tutvoja ĉifrado", "Event information": "Informoj pri okazaĵo", - "Sender device information": "Informoj pri aparato de sendinto", "Passphrases must match": "Pasfrazoj devas kongrui", "Passphrase must not be empty": "Pasfrazoj maldevas esti malplenaj", "Export room keys": "Elporti ĉambrajn ŝlosilojn", @@ -785,7 +733,6 @@ "Resend": "Resendi", "Collecting app version information": "Kolektanta informon pri versio de la aplikaĵo", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Ĉu forigi la ĉambran kromnomon %(alias)s kaj forigi %(name)s de la ujo?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Ĉi tio permesos al vi reveni al via konto post adiaŭo, kaj saluti kun aliaj aparatoj.", "Enable notifications for this account": "Ŝalti sciigojn por tiu ĉi konto", "Invite to this community": "Inviti al tiu ĉi komunumo", "Messages containing keywords": "Mesaĝoj enhavantaj ŝlosilovortojn", @@ -879,8 +826,6 @@ "Always show encryption icons": "Ĉiam montri bildetojn de ĉifrado", "Send analytics data": "Sendi statistikajn datumojn", "Key request sent.": "Demando de ŝlosilo sendita.", - "Re-request encryption keys from your other devices.": "Redemandi ĉifroŝlosilojn el viaj aliaj aparatoj.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Se viaj aliaj aparatoj ne havas la ŝlosilon por ĉi tiu mesaĝo, vi ne povos malĉifri ĝin.", "Permission Required": "Necesas permeso", "Registration Required": "Necesas registriĝo", "You need to register to do this. Would you like to register now?": "Por fari ĉi tion, vi bezonas registriĝi. Ĉu vi volas registriĝi nun?", @@ -938,10 +883,8 @@ "Language and region": "Lingvo kaj regiono", "Theme": "Haŭto", "General": "Ĝenerala", - "Unable to reply": "Ne eblas respondi", "In reply to ": "Respondanta al ", "Share Message": "Diskonigi", - "Show devices, send anyway or cancel.": "Montri aparatojn, tamen sendinuligi.", "Whether or not you're logged in (we don't record your username)": "Ĉu vi salutis aŭ ne (ni ne registras vian uzantonomon)", "You do not have permission to start a conference call in this room": "Vi ne havas permeson komenci grupvokon en ĉi tiu ĉambro", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "La dosiero '%(fileName)s' superas la grandecan limon de ĉi tiu hejmservilo", @@ -991,7 +934,6 @@ "Book": "Libro", "Pencil": "Grifelo", "Scissors": "Tondilo", - "Padlock": "Penda seruro", "Key": "Ŝlosilo", "Hammer": "Martelo", "Telephone": "Telefono", @@ -1013,7 +955,6 @@ "Email Address": "Retpoŝtadreso", "Phone Number": "Telefonnumero", "Profile picture": "Profilbildo", - "Upload profile picture": "Alŝuti profilbildon", "Upgrade to your own domain": "Ĝisdatigi al via propra domajno", "Display Name": "Vidiga nomo", "Set a new account password...": "Agordi novan kontan pasvorton...", @@ -1060,12 +1001,6 @@ "Roles & Permissions": "Roloj & Permesoj", "Enable encryption?": "Ĉu ŝalti ĉifradon?", "Share Link to User": "Kunhavigi ligilon al uzanto", - "deleted": "forigita", - "underlined": "substrekita", - "inline-code": "enteksta-kodo", - "block-quote": "blokcito", - "bulleted-list": "bula-listo", - "numbered-list": "numerita-listo", "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Vidita de %(displayName)s (%(userName)s) je %(dateTime)s", "Share room": "Kunhavigi ĉambron", "System Alerts": "Sistemaj avertoj", @@ -1073,8 +1008,6 @@ "Don't ask me again": "Ne demandu min denove", "Main address": "Ĉefa adreso", "Room avatar": "Profilbildo de ĉambro", - "Upload room avatar": "Alŝuti profilbildon de ĉambro", - "No room avatar": "Neniu profilbildo de ĉambro", "Room Name": "Nomo de ĉambro", "Room Topic": "Temo de ĉambro", "Yes, I want to help!": "Jes. Mi volas helpi!", @@ -1150,14 +1083,8 @@ "The file '%(fileName)s' failed to upload.": "Malsukcesis alŝuti dosieron « %(fileName)s ».", "The server does not support the room version specified.": "La servilo ne subtenas la donitan ĉambran version.", "Name or Matrix ID": "Nomo aŭ Matrix-identigilo", - "Email, name or Matrix ID": "Retpoŝtadreso, nomo, aŭ Matrix-identigilo", "Upgrades a room to a new version": "Gradaltigas ĉambron al nova versio", - "Room upgrade confirmation": "Konfirmo de ĉambra gradaltigo", - "Upgrading a room can be destructive and isn't always necessary.": "Gradaltigo de ĉambro povas esti detrua kaj ne estas ĉiam necesa.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Gradaltigoj de ĉambroj estas kutime rekomendataj kiam ĉambra versio estas opiniata malstabila. Malstabilaj ĉambraj versioj povas kunhavi erarojn, mankojn de funkcioj, aŭ malsekuraĵojn.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Ĉambraj gradaltigoj efikas nur sur servil-flanka funkciado de la ĉambro. Se vi havas problemon kun via kliento (Riot), bonvolu raparti problemon per .", "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.": "Averto: Gradaltigo de ĉambro ne transmetos ĉiujn ĉambranojn al la nova versio de la ĉambro. Ni afiŝos ligilon al la nova ĉambro en la malnova versio de la ĉambro – ĉambranoj devos tien klaki por aliĝi al la nova ĉambro.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Bonvolu konfirmi, ke vi certe volas gradaltigi ĉi tiun ĉambron de al .", "Changes your display nickname in the current room only": "Ŝanĝas vian vidigan nomon nur en la nuna ĉambro", "Changes your avatar in this current room only": "Ŝanĝas vian profilbildon nur en la nuna ĉambro", "Gets or sets the room topic": "Ekhavas aŭ agordas la temon de la ĉambro", @@ -1205,38 +1132,22 @@ "Verify this user by confirming the following emoji appear on their screen.": "Kontrolu ĉi tiun uzanton per konfirmo, ke la jenaj bildsignoj aperis sur ĝia ekrano.", "Verify this user by confirming the following number appears on their screen.": "Kontrolu ĉu tiun uzanton per konfirmo, ke la jena numero aperis sur ĝia ekrano.", "Unable to find a supported verification method.": "Ne povas trovi subtenatan metodon de kontrolo.", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "Por la plej bona sekureco, ni rekomendas fari ĉi tion persone, aŭ per alia, fidata komunikilo.", "Santa": "Kristnaska viro", "Thumbs up": "Dikfingro supren", "Paperclip": "Paperkuntenilo", "Pin": "Pinglo", - "Your homeserver does not support device management.": "Via hejmservilo ne subtenas administradon de aparatoj.", "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "Ni sendis al vi retleteron por konfirmi vian adreson. Bonvolu sekvi la tieajn intrukciojn kaj poste klaki al la butono sube.", "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Ĉu vi certas? Vi perdos ĉiujn viajn ĉifritajn mesaĝojn, se viaj ŝlosiloj ne estas savkopiitaj.", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Ĉifritaj mesaĝoj estas sekurigitaj per tutvoja ĉifrado. Nur vi kaj la ricevonto(j) havas la ŝlosilojn necesajn por legado.", - "This device is backing up your keys. ": "Ĉi tiu aparato savkopias viajn ŝlosilojn. ", "Custom user status messages": "Propraj uzantoaj statmesaĝoj", "Group & filter rooms by custom tags (refresh to apply changes)": "Grupigi kaj filtri ĉambrojn per propraj etikedoj (aktualigu por ŝanĝojn apliki)", "Restore from Backup": "Rehavi el savkopio", - "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Tiu ĉi aparato ne ne savkopias viajn ŝlosilojn, sed vi jam havas savkopion, kiun vi povas restarigi, kaj aldonadi al ĝi de nun.", "Backing up %(sessionsRemaining)s keys...": "Savkopianta %(sessionsRemaining)s ŝlosilojn…", "All keys backed up": "Ĉiuj ŝlosiloj estas savkopiitaj", - "Backup has a signature from unknown device with ID %(deviceId)s.": "Savkopio havas subskribon de nekonata aparato kun la identigilo %(deviceId)s.", - "Backup has a valid signature from this device": "Savkopio havas validan subskribon de ĉi tiu aparato", - "Backup has an invalid signature from this device": "Savkopio havas nevalidan subskribon de tiu ĉi aparato", - "Backup has a valid signature from verified device ": "Savkopio havas validan subskribon de kontrolita aparato ", - "Backup has a valid signature from unverified device ": "Savkopio havas validan subskribon de nekontrolita aparato ", - "Backup has an invalid signature from verified device ": "Savkopio havas nevalidan subskribon de kontrolita aparato ", - "Backup has an invalid signature from unverified device ": "Savkopio havas nevalidan subskribon de nekontrolita aparato ", - "Backup is not signed by any of your devices": "Savkopio estas subskribita de neniu el viaj aparatoj", - "This backup is trusted because it has been restored on this device": "Ĉi tiu savkopio estas fidata ĉar ĝi estis restarigita por ĉi tiu aparato", "Backup version: ": "Versio de savkopio: ", "Algorithm: ": "Algoritmo: ", - "Your keys are not being backed up from this device.": "Viaj ŝlosiloj ne estas savkopiataj de ĉi tiu aparato.", "Back up your keys before signing out to avoid losing them.": "Savkopiu viajn ŝlosilojn antaŭ adiaŭo, por ilin ne perdi.", "Add an email address to configure email notifications": "Aldonu retpoŝtadreson por agordi retpoŝtajn sciigojn", - "Enable desktop notifications for this device": "Ŝalti labortablajn sciigojn por ĉi tiu aparato", - "Enable audible notifications for this device": "Ŝalti sonajn sciigojn por ĉi tiu aparato", "Unable to verify phone number.": "Ne povas kontroli telefonnumeron.", "Verification code": "Kontrola kodo", "Deactivating your account is a permanent action - be careful!": "Malaktivigo de via konto estas nemalfarebla – atentu!", @@ -1287,10 +1198,6 @@ "This room has already been upgraded.": "Ĉi tiu ĉambro jam gradaltiĝis.", "This room is running room version , which this homeserver has marked as unstable.": "Ĉi tiu ĉambro uzas ĉambran version , kiun la hejmservilo markis kiel nestabilan.", "Your Riot is misconfigured": "Via kliento Riot estas misagordita", - "All devices for this user are trusted": "Ĉiuj aparatoj de tiu ĉi uzanto estas fidataj", - "All devices in this encrypted room are trusted": "Ĉiuj aparatoj en ĉi tiu ĉifrita ĉambro estas fidataj", - "Your key share request has been sent - please check your other devices for key share requests.": "Via peto por havigo de ŝlosilo sendiĝis – bonvolu kontroli viajn aliajn aparatojn pro petoj.", - "At this time it is not possible to reply with an emote.": "Ankoraŭ ne eblas respondi per mieno.", "Joining room …": "Aliĝanta al ĉambro …", "Loading …": "Enleganta …", "Rejecting invite …": "Rifuzanta inviton …", @@ -1338,7 +1245,6 @@ "Nothing appearing? Not all clients support interactive verification yet. .": "Ĉu neniu aperas? Ankoraŭ ne ĉiuj klientoj subtenas interagan kontrolon. .", "Waiting for %(userId)s to confirm...": "Atendanta konfirmon de %(userId)s…", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Kontrolu ĉi tiun uzanton por marki ĝin fidata. Fidado devas vin trankviligi dum uzado de tutvoja ĉifrado.", - "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "Kontrolo de ĉi tiu uzanto markos ĝian aparaton fidata, kaj ankaŭ la vian por ĝi.", "Waiting for partner to confirm...": "Atendas konfirmon de kunulo…", "Incoming Verification Request": "Venas kontrolpeto", "Manually export keys": "Mane elporti ŝlosilojn", @@ -1398,7 +1304,6 @@ "You have %(count)s unread notifications in a prior version of this room.|other": "Vi havas %(count)s nelegitajn sciigojn en antaŭa versio de ĉi tiu ĉambro.", "You have %(count)s unread notifications in a prior version of this room.|one": "Vi havas %(count)s nelegitan sciigon en antaŭa versio de ĉi tiu ĉambro.", "Your profile": "Via profilo", - "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "Ŝanĝo de pasvorto renovigos tutvoje ĉifrajn ŝlosilojn de ĉiuj viaj aparatoj, igante la historion de ĉifrita babilo nelegebla. Agordu savkopiadon de ŝlosiloj, aŭ elportu ŝlosilojn de viaj ĉambroj el alia aparato, antaŭ ol vi ŝanĝos la pasvorton.", "Your Matrix account on ": "Via Matrix-konto sur ", "This homeserver does not support login using email address.": "Ĉi tiu hejmservilo ne subtenas saluton per retpoŝtadreso.", "Registration has been disabled on this homeserver.": "Registriĝoj malŝaltiĝis sur ĉi tiu hejmservilo.", @@ -1440,7 +1345,6 @@ "Show recently visited rooms above the room list": "Montri freŝe vizititajn ĉambrojn super la listo de ĉambroj", "Show hidden events in timeline": "Montri kaŝitajn okazojn en historio", "Low bandwidth mode": "Reĝimo de malmulta kapacito", - "Connect this device to Key Backup": "Konekti ĉi tiun aparaton al Savkopiado de ŝlosiloj", "Start using Key Backup": "Ekuzi Savkopiadon de ŝlosiloj", "Timeline": "Historio", "Autocomplete delay (ms)": "Prokrasto de memaga kompletigo", @@ -1451,7 +1355,6 @@ "Notification sound": "Sono de sciigo", "Set a new custom sound": "Agordi novan propran sonon", "Browse": "Foliumi", - "Some devices for this user are not trusted": "Iuj aparatoj de tiu ĉi uzanto ne estas fidataj", "Show all": "Montri ĉiujn", "Edited at %(date)s. Click to view edits.": "Redaktita je %(date)s. Klaku por vidi redaktojn.", "That doesn't look like a valid email address": "Tio ne ŝajnas esti valida retpoŝtadreso", @@ -1480,8 +1383,6 @@ "Encryption": "Ĉifrado", "Once enabled, encryption cannot be disabled.": "Post ŝalto, ne plu eblas malŝalti ĉifradon.", "Encrypted": "Ĉifrata", - "Some devices in this encrypted room are not trusted": "Iuj aparatoj en ĉi tiu ĉifrata ĉambro ne estas fidataj", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Petoj pri kunhavigo de ŝlosiloj sendiĝas al viaj aliaj aparatoj memage. Se vi rifuzis aŭ forlasis la peton en viaj aliaj aparatoj, klaku ĉi tien por repeti la ŝlosilojn por tiu ĉi kunsido.", "The conversation continues here.": "La interparolo pluas ĉi tie.", "This room has been replaced and is no longer active.": "Ĉi tiu ĉambro estas anstataŭita, kaj ne plu aktivas.", "Loading room preview": "Preparas antaŭrigardon al la ĉambro", @@ -1496,8 +1397,6 @@ "%(oneUser)smade no changes %(count)s times|other": "%(oneUser)snenion ŝanĝis je %(count)s fojoj", "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)snenion ŝanĝis", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Ne povas enlegi la responditan okazon; aŭ ĝi ne ekzistas, aŭ vi ne rajtas vidi ĝin.", - "Clear all data on this device?": "Ĉu vakigi ĉiujn datumojn en tiu ĉi aparato?", - "Clearing all data from this device is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Vakigo de ĉiuj datumoj de tiu ĉi aparato estas porĉiama. Ĉifritaj mesaĝoj perdiĝos, malse vi savkopiis iliajn ŝlosilojn.", "Clear all data": "Vakigi ĉiujn datumojn", "Community IDs cannot be empty.": "Identigilo de komunumo ne estu malplena.", "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 Riot to do this": "Por eviti perdon de via babila historio, vi devas elporti la ŝlosilojn de viaj ĉambroj antaŭ adiaŭo. Por tio vi bezonos reveni al la pli nova versio de Riot", @@ -1537,7 +1436,6 @@ "This looks like a valid recovery key!": "Ŝajnas esti valida rehava ŝlosilo!", "Not a valid recovery key": "Ne estas valida rehava ŝlosilo", "Access your secure message history and set up secure messaging by entering your recovery key.": "Aliru vian sekuran mesaĝan historion kaj agordu sekuran mesaĝadon per enigo de via rehava ŝlosilo.", - "If you've forgotten your recovery passphrase you can ": "Se vi forgesis vian rehavan pasfrazon, vi povas ", "Resend %(unsentCount)s reaction(s)": "Resendi %(unsentCount)s reago(j)n", "Resend removal": "Resendi forigon", "Share Permalink": "Kunhavi daŭran ligilon", @@ -1570,15 +1468,11 @@ "New Recovery Method": "Nova rehava metodo", "A new recovery passphrase and key for Secure Messages have been detected.": "Novaj rehava pasfrazo kaj ŝlosilo por sekuraj mesaĝoj troviĝis.", "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.": "Se vi ne agordis la novan rehavan metodon, eble atakanto provas aliri vian konton. Vi tuj ŝanĝu la pasvorton de via konto, kaj agordu novan rehavan metodon en la agordoj.", - "This device is encrypting history using the new recovery method.": "Ĉi tiu aparato ĉifras historion kun la nova rehava metodo.", "Set up Secure Messages": "Agordi sekurajn mesaĝojn", "Recovery Method Removed": "Rehava metodo foriĝis", - "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "Ĉi tiu aparato trovis, ke viaj rehava pasfrazo kaj ŝlosilo por sekuraj mesaĝoj foriĝis.", - "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "Se vi faris tion akcidente, vi povas agordi sekurajn mesaĝojn per ĉi tiu aparato, reĉifrante la mesaĝan historion de la aparato kun nova rehava metodo.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Se vi ne forigis la rehavan metodon, eble atakanto provas aliri vian konton. Vi tuj ŝanĝu la pasvorton de via konto, kaj agordu novan rehavan metodon en la agordoj.", "Use a longer keyboard pattern with more turns": "Uzu pli longan tekston kun plia varieco", "Unable to load key backup status": "Ne povas enlegi staton de ŝlosila savkopio", - "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Konektu ĉi tiun aparaton al ŝlosila savkopiado antaŭ adiaŭo, por eviti perdon de ŝlosiloj de tiu ĉi aparato.", "Reset": "Reagordi", "Demote yourself?": "Ĉu malrangaltigi vin mem?", "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.": "Vi ne povos malfari tiun ŝanĝon, ĉar vi malrangaltigas vin mem; se vi estas la lasta povohava uzanto en la ĉambro, estos neeble vian povon rehavi.", @@ -1586,7 +1480,6 @@ "Power level": "Povonivelo", "Use two-way text verification": "Uzi duflankan tekstan kontrolon", "Upgrading this room requires closing down the current instance of the room and creating a new room in its place. To give room members the best possible experience, we will:": "Gradaltigo de ĉi tiu ĉambro bezonas fermi ĝin, kaj krei novan por anstataŭi ĝin. Por plejbonigi sperton de la ĉambranoj, ni:", - "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Vi adiaŭis ĉiujn aparatojn kaj ne plu ricevados sciigojn. Por reŝalti ilin, resalutu per ĉiu el la aparatoj.", "Invalid homeserver discovery response": "Nevalida eltrova respondo de hejmservilo", "Failed to get autodiscovery configuration from server": "Malsukcesis akiri agordojn de memaga eltrovado de la servilo", "Homeserver URL does not appear to be a valid Matrix homeserver": "URL por hejmservilo ŝajne ne ligas al valida hejmservilo de Matrix", @@ -1595,26 +1488,20 @@ "Sign in with single sign-on": "Salutu per ununura saluto", "Failed to re-authenticate due to a homeserver problem": "Malsukcesis reaŭtentigi pro hejmservila problemo", "Failed to re-authenticate": "Malsukcesis reaŭtentigi", - "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.": "Rehavu aliron al via konto kaj ĉifrajn ŝlosilojn memoratajn de tiu ĉi aparato. Sen ili, vi ne povos legi ĉiujn viajn sekurajn mesaĝojn per iu ajn aparato.", "Enter your password to sign in and regain access to your account.": "Enigu vian pasvorton por saluti kaj rehavi aliron al via konto.", "Sign in and regain access to your account.": "Saluti kaj rehavi aliron al via konto.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Vi ne povas saluti per via konto. Bonvolu kontakti administranton de via hejmservilo por akiri pliajn informojn.", - "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.": "Averto: Tiu ĉi aparato ankoraŭ memoras viajn personajn datumojn (inkluzive ĉifrajn ŝlosilojn). Vakigu ilin, se vi ĉesas uzi ĉi tiun aparaton, aŭ volas saluti per alia konto.", "Set up with a Recovery Key": "Agordi per rehava ŝlosilo", "Go back to set it again.": "Reiru por reagordi ĝin.", "As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.": "Asekure vi povas uzi ĝin por rehavi vian historion de ĉifritaj mesaĝoj se vi forgesos vian rehavan pasfrazon.", "As a safety net, you can use it to restore your encrypted message history.": "Asekure vi povas uzi ĝin por rehavi vian historion de ĉifritaj mesaĝoj.", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "Via rehava ŝlosilo estas asekuro – vi povos uzi ĝin por rehavi aliron al viaj ĉifritaj mesaĝoj, se vi forgesos vian pasfrazon.", - "Keep your recovery key somewhere very secure, like a password manager (or a safe)": "Konservu vian rehavan ŝlosilon en tre sekura loko, kiel en administrilo de pasvortoj (aŭ sekurŝranko)", "Your Recovery Key": "Via rehava ŝlosilo", "Copy to clipboard": "Kopii al tondujo", - "Your Recovery Key has been copied to your clipboard, paste it to:": "Via rehava ŝlosilo kopiiĝis al via tondujo, algluu ĝin al:", - "Your Recovery Key is in your Downloads folder.": "Via rehava ŝlosilo estas en via elŝuta dosierujo.", "Print it and store it somewhere safe": "Presu ĝin kaj konservu ĝin en sekura loko", "Save it on a USB key or backup drive": "Konservu ĝin en poŝmemorilo aŭ savkopia disko", "Copy it to your personal cloud storage": "Kopiu ĝin al via persona enreta konservejo", "Your keys are being backed up (the first backup could take a few minutes).": "Viaj ŝlosiloj estas savkopiataj (la unua savkopio povas daŭri kelkajn minutojn).", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "Sen agordo de sekura rehavo de mesaĝoj, vi ne povos rehavi vian historion de ĉifritaj mesaĝoj se vi adiaŭos aŭ uzos alian aparaton.", "Set up Secure Message Recovery": "Agordi sekuran rehavon de mesaĝoj", "Secure your backup with a passphrase": "Sekurigi vian savkopion per pasfrazo", "Confirm your passphrase": "Konfirmu vian pasfrazon", @@ -1650,7 +1537,6 @@ "Public Name": "Publika nomo", "Do not use an identity server": "Ne uzi identigan servilon", "Enter a new identity server": "Enigi novan identigan servilon", - "Failed to start chat": "Malsukcesis komenci babilon", "Messages": "Mesaĝoj", "Actions": "Agoj", "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Uzu identigan servilon por inviti retpoŝte. Klaku al « daŭrigi » por uzi la norman identigan servilon (%(defaultIdentityServerName)s) aŭ administru tion en Agordoj.", @@ -1683,7 +1569,6 @@ "Discovery": "Trovado", "Deactivate account": "Malaktivigi konton", "Always show the window menu bar": "Ĉiam montri la fenestran menubreton", - "A device's public name is visible to people you communicate with": "Publika nomo de aparato estas videbla de homoj, kun kiuj vi komunikas", "Upgrade the room": "Gradaltigi la ĉambron", "Enable room encryption": "Ŝalti ĉifradon de la ĉambro", "Error changing power level requirement": "Eraris ŝanĝo de postulo de potenconivelo", @@ -1721,7 +1606,6 @@ "Trust": "Fido", "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", "Multiple integration managers": "Pluraj kunigiloj", - "Use the new, faster, composer for writing messages": "Uzi la novan, pli rapidan verkilon de mesaĝoj", "Show previews/thumbnails for images": "Montri antaŭrigardojn/bildetojn je bildoj", "You should remove your personal data from identity server before disconnecting. Unfortunately, identity server is currently offline or cannot be reached.": "Vi forigu viajn personajn datumojn de identiga servilo antaŭ ol vi malkonektiĝos. Bedaŭrinde, identiga servilo estas nuntempe eksterreta kaj ne eblas ĝin atingi.", "You should:": "Vi:", @@ -1809,7 +1693,6 @@ "Hide advanced": "Kaŝi specialajn", "Show advanced": "Montri specialajn", "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Bloki aliĝojn al ĉi tiu ĉambro de uzantoj el aliaj Matrix-serviloj (Ĉi tiun agordon ne eblas poste ŝanĝi!)", - "To verify that this device can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Por kontroli ke tiu ĉi aparato estas fidinda, bonvolu kontroli, ke la ŝlosilo, kiun vi vidas en viaj Agordoj de uzanto je tiu aparato, akordas kun la ŝlosilo sube:", "Please fill why you're reporting.": "Bonvolu skribi, kial vi raportas.", "Report Content to Your Homeserver Administrator": "Raporti enhavon al la administrantode via hejmservilo", "Reporting this message will send its unique 'event ID' to the administrator of your homeserver. If messages in this room are encrypted, your homeserver administrator will not be able to read the message text or view any files or images.": "Per raporto de ĝi tiu mesaĝo vi sendos ĝian unikan « eventan identigilon » al la administranto de via hejmservilo. Se mesaĝoj en ĉi tiu ĉambro estas ĉifrataj, la administranto de via hejmservilo ne povos legi la tekston de la mesaĝo, nek rigardi dosierojn aŭ bildojn.", @@ -1839,7 +1722,6 @@ "%(senderName)s placed a video call.": "%(senderName)s metis vidvokon.", "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s metis vidvokon. (mankas subteno en ĉi tiu foliumilo)", "Try out new ways to ignore people (experimental)": "Elprovi novajn manierojn malatenti homojn (eksperimente)", - "Send verification requests in direct message, including a new verification UX in the member panel.": "Sendadi kontrolajn petojn per rektaj mesaĝoj, inkluzive novan kontrolan ilaron en la membra panelo.", "Match system theme": "Similiĝi la sisteman haŭton", "My Ban List": "Mia listo de forbaroj", "This is your list of users/servers you have blocked - don't leave the room!": "Ĉi tio estas la listo de uzantoj/serviloj, kiujn vi forbaris – ne eliru el la ĉambro!", @@ -1897,15 +1779,10 @@ "The integration manager is offline or it cannot reach your homeserver.": "La kunigilo estas eksterreta aŭ ne povas atingi vian hejmservilon", "Backup has a valid signature from this user": "Savkopio havas validan subskribon de ĉi tiu uzanto", "Backup has a invalid signature from this user": "Savkopio havas nevalidan subskribon de ĉi tiu uzanto", - "This user has not verified all of their devices.": "Ĉi tiu uzanto ne kontrolis ĉiujn siajn aparatojn.", - "You have not verified this user. This user has verified all of their devices.": "Vi ne kontrolis ĉi tiun uzanton. Ĉi tiu uzanto kontrolis ĉiujn siajn aparatojn.", - "You have verified this user. This user has verified all of their devices.": "Vi kontrolis ĉi tiun uzanton. Ĉi tiu uzanto kontrolis ĉiujn siajn aparatojn.", - "Someone is using an unknown device": "Iu uzas nekonatan aparaton", "This room is end-to-end encrypted": "Ĉi tiu ĉambro uzas tutvojan ĉifradon", "Everyone in this room is verified": "Ĉiu en la ĉambro estas kontrolita", "This message cannot be decrypted": "Ĉi tiun mesaĝon ne eblas malĉifri", "Unencrypted": "Neĉifrita", - "Encrypted by a deleted device": "Ĉifrita de forigita aparato", "Send a reply…": "Sendi respondon…", "Send a message…": "Sendi mesaĝon…", "Direct Messages": "Rektaj mesaĝoj", @@ -1917,7 +1794,6 @@ "Failed to connect to integration manager": "Malsukcesis konekton al kunigilo", "Verify User": "Kontroli uzanton", "For extra security, verify this user by checking a one-time code on both of your devices.": "Por plia sekureco, kontrolu ĉi tiun uzanton per unufoja kodo aperonta sur ambaŭ el viaj aparatoj.", - "For maximum security, do this in person.": "Por plejgranda sekureco, faru tion persone.", "Start Verification": "Komenci kontrolon", "Trusted": "Fidata", "Not trusted": "Nefidata", diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 958203a020..85e24b7ba9 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -33,7 +33,6 @@ "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s cambió el nombre de la sala a %(roomName)s.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s cambió el tema a \"%(topic)s\".", "Changes your display nickname": "Cambia tu apodo público", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "El cambio de contraseña restablecerá actualmente todas las claves de cifrado de extremo a extremo de todos los dispositivos, haciendo que el historial de chat cifrado sea ilegible, a menos que primero exporte las claves de la habitación y vuelva a importarlas después. En el futuro esto será mejorado.", "Claimed Ed25519 fingerprint key": "Clave de huella digital Ed25519 reclamada", "Click here to fix": "Haz clic aquí para arreglar", "Click to mute audio": "Haz clic para silenciar el audio", @@ -57,7 +56,6 @@ "Deops user with given id": "Degrada al usuario con la ID dada", "Default": "Por Defecto", "Device ID": "ID de Dispositivo", - "Devices": "Dispositivos", "Direct chats": "Conversaciones directas", "Disinvite": "Deshacer invitación", "Displays action": "Muestra la acción", @@ -100,21 +98,17 @@ "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s a %(toPowerLevel)s", "Guests cannot join this room even if explicitly invited.": "Invitados no pueden unirse a esta sala aun cuando han sido invitados explícitamente.", "Hangup": "Colgar", - "Hide Text Formatting Toolbar": "Ocultar barra de herramientas de formato de texto", "Historical": "Histórico", "Homeserver is": "El Servidor Doméstico es", "Identity Server is": "El Servidor de Identidad es", "I have verified my email address": "He verificado mi dirección de correo electrónico", "Import E2E room keys": "Importar claves de salas con Cifrado de Extremo a Extremo", "Incorrect verification code": "Verificación de código incorrecta", - "Invalid alias format": "Formato de alias inválido", "Invalid Email Address": "Dirección de Correo Electrónico Inválida", "Invalid file%(extra)s": "Archivo inválido %(extra)s", "%(senderName)s invited %(targetName)s.": "%(senderName)s invitó a %(targetName)s.", - "Invite new room members": "Invitar nuevos miembros a la sala", "Invites": "Invitaciones", "Invites user with given id to current room": "Invita al usuario con la ID dada a la sala actual", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' no es un formato de alias válido", "Sign in with": "Quiero iniciar sesión con", "Join Room": "Unirse a la Sala", "%(targetName)s joined the room.": "%(targetName)s se unió a la sala.", @@ -142,12 +136,9 @@ "Custom": "Personalizado", "Custom level": "Nivel personalizado", "Decline": "Rechazar", - "Device already verified!": "¡El dispositivo ya ha sido verificado!", - "Device ID:": "ID de Dispositivo:", "device id: ": "ID de dispositivo: ", "Disable Notifications": "Deshabilitar Notificaciones", "Enable Notifications": "Habilitar Notificaciones", - "Encrypted by an unverified device": "Cifrado por un dispositivo sin verificar", "Enter passphrase": "Ingresar frase de contraseña", "Error: Problem communicating with the given homeserver.": "Error: No es posible comunicar con el servidor doméstico indicado.", "Export": "Exportar", @@ -187,13 +178,9 @@ "Unknown error": "Error desconocido", "Incorrect password": "Contraseña incorrecta", "To continue, please enter your password.": "Para continuar, ingresa tu contraseña por favor.", - "Device name": "Nombre de dispositivo", - "Device key": "Clave de dispositivo", - "Verify device": "Verificar dispositivo", "I verify that the keys match": "Verifico que las claves coinciden", "Unable to restore session": "No se puede recuperar la sesión", "Room Colour": "Color de la sala", - "Room contains unknown devices": "La sala contiene dispositivos desconocidos", "%(roomName)s does not exist.": "%(roomName)s no existe.", "%(roomName)s is not accessible at this time.": "%(roomName)s no es accesible en este momento.", "Rooms": "Salas", @@ -203,8 +190,6 @@ "Search failed": "Falló la búsqueda", "Seen by %(userName)s at %(dateTime)s": "Visto por %(userName)s el %(dateTime)s", "Send anyway": "Enviar de todos modos", - "Sender device information": "Información del dispositivo emisor", - "Send Invites": "Enviar Invitaciones", "Send Reset Email": "Enviar Correo Electrónico de Restauración", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s envió una imagen.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s invitó a %(targetDisplayName)s a unirse a la sala.", @@ -216,7 +201,6 @@ "%(senderName)s set a profile picture.": "%(senderName)s estableció una imagen de perfil.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s estableció %(displayName)s como su nombre público.", "Settings": "Ajustes", - "Show Text Formatting Toolbar": "Mostrar la barra de formato de texto", "Signed Out": "Desconectado", "Sign in": "Conectar", "Sign out": "Cerrar sesión", @@ -224,7 +208,6 @@ "Someone": "Alguien", "Start a chat": "Iniciar una conversación", "Start authentication": "Iniciar autenticación", - "Start Chat": "Iniciar Conversación", "Submit": "Enviar", "Success": "Éxito", "The phone number entered looks invalid": "El número telefónico indicado parece erróneo", @@ -235,21 +218,14 @@ "Are you sure you want to leave the room '%(roomName)s'?": "¿Está seguro de que desea abandonar la sala '%(roomName)s'?", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "No se puede conectar al servidor doméstico - compruebe su conexión, asegúrese de que el certificado SSL del servidor es de confiaza, y compruebe que no hay extensiones del navegador bloqueando las peticiones.", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s eliminó el nombre de la sala.", - "Device key:": "Clave de dispositivo:", "Drop File Here": "Deje el fichero aquí", "Join as voice or video.": "Unirse con voz o vídeo.", "Manage Integrations": "Gestionar integraciones", - "Markdown is disabled": "Markdown está deshabilitado", - "Markdown is enabled": "Markdown está activado", - "matrix-react-sdk version:": "Versión de matrix-react-sdk:", - "Message not sent due to unknown devices being present": "Mensaje no enviado debido a la presencia de dispositivos desconocidos", "Missing room_id in request": "Falta el room_id en la solicitud", "Missing user_id in request": "Falta el user_id en la solicitud", "Moderator": "Moderador", "Mute": "Silenciar", "Name": "Nombre", - "Never send encrypted messages to unverified devices from this device": "Nunca enviar mensajes cifrados a dispositivos sin verificar desde este dispositivo", - "Never send encrypted messages to unverified devices in this room from this device": "Nunca enviar mensajes cifrados a dispositivos sin verificar en esta sala desde este dispositivo", "New address (e.g. #foo:%(localDomain)s)": "Dirección nueva (ej. #foo:%(localDomain)s)", "New passwords don't match": "Las contraseñas nuevas no coinciden", "New passwords must match each other.": "Las contraseñas nuevas deben coincidir.", @@ -259,7 +235,6 @@ "(not supported by this browser)": "(no soportado por este navegador)", "": "", "NOT verified": "SIN verificar", - "No devices with registered encryption keys": "No hay dispositivos con claves de cifrado registradas", "No display name": "Sin nombre público", "No more results": "No hay más resultados", "No results": "No hay resultados", @@ -270,7 +245,6 @@ "Operation failed": "Falló la operación", "Password": "Contraseña", "Passwords can't be empty": "Las contraseñas no pueden estar en blanco", - "People": "Personas", "Permissions": "Permisos", "Phone": "Teléfono", "Please check your email and click on the link it contains. Once this is done, click continue.": "Por favor, consulta tu correo electrónico y haz clic en el enlace que contiene. Una vez hecho esto, haz clic en continuar.", @@ -297,7 +271,6 @@ "Room %(roomId)s not visible": "La sala %(roomId)s no está visible", "Searches DuckDuckGo for results": "Busca resultados en DuckDuckGo", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Mostrar marcas temporales en formato de 12 horas (ej. 2:30pm)", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "La clave de firma que usted ha proporcionado coincide con la recibida del dispositivo %(deviceId)s de %(userId)s. Dispositivo verificado.", "This email address is already in use": "Esta dirección de correo electrónico ya está en uso", "This email address was not found": "No se encontró esta dirección de correo electrónico", "The email address linked to your account must be entered.": "Debes ingresar la dirección de correo electrónico vinculada a tu cuenta.", @@ -330,7 +303,6 @@ "To get started, please pick a username!": "Para empezar, ¡por favor elija un nombre de usuario!", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Se ha intentado cargar cierto punto en la cronología de esta sala, pero no tiene permiso para ver el mensaje solicitado.", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Se ha intentado cargar cierto punto en la cronología de esta sala, pero no se ha podido encontrarlo.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s activó el cifrado de extremo a extremo (algoritmo %(algorithm)s).", "Unable to add email address": "No es posible añadir la dirección de correo electrónico", "Unable to create widget.": "No es posible crear el componente.", "Unable to remove contact information": "No se ha podido eliminar la información de contacto", @@ -338,13 +310,9 @@ "Unban": "Quitar Veto", "Unable to capture screen": "No es posible capturar la pantalla", "Unable to enable Notifications": "No es posible habilitar las Notificaciones", - "Unable to load device list": "No se ha podido cargar la lista de dispositivos", - "Undecryptable": "No se puede descifrar", - "Unencrypted message": "Mensaje sin cifrar", "unknown caller": "Persona que llama desconocida", "unknown device": "dispositivo desconocido", "Unknown room %(roomId)s": "Sala desconocida %(roomId)s", - "Unknown (user, device) pair:": "Pareja desconocida (usuario, dispositivo):", "Unnamed Room": "Sala sin nombre", "Uploading %(filename)s and %(count)s others|zero": "Subiendo %(filename)s", "Uploading %(filename)s and %(count)s others|one": "Subiendo %(filename)s y otros %(count)s", @@ -371,10 +339,8 @@ "(no answer)": "(sin respuesta)", "(unknown failure: %(reason)s)": "(error desconocido: %(reason)s)", "Warning!": "¡Advertencia!", - "WARNING: Device already verified, but keys do NOT MATCH!": "ADVERTENCIA: Dispositivo ya verificado, ¡pero las claves NO COINCIDEN!", "Who can access this room?": "¿Quién puede acceder a esta sala?", "Who can read history?": "¿Quién puede leer el historial?", - "Who would you like to communicate with?": "¿Con quién te gustaría comunicarte?", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s retiró la invitación de %(targetName)s.", "You are already in a call.": "Ya estás participando en una llamada.", "You are not in this room.": "No estás en esta sala.", @@ -389,10 +355,8 @@ "%(senderName)s unbanned %(targetName)s.": "%(senderName)s le quitó el veto a %(targetName)s.", "unencrypted": "sin cifrar", "Unmute": "Dejar de silenciar", - "Unrecognised command:": "Comando no identificado:", "Unrecognised room alias:": "Alias de sala no reconocido:", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (nivel de permisos %(powerLevelNumber)s)", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ADVERTENCIA: VERIFICACIÓN DE CLAVE FALLO\" La clave de firma para %(userId)s y el dispositivo %(deviceId)s es \"%(fprint)s\" la cual no concuerda con la clave provista por \"%(fingerprint)s\". Esto puede significar que sus comunicaciones están siendo interceptadas!", "You cannot place VoIP calls in this browser.": "No puedes realizar llamadas VoIP en este navegador.", "You do not have permission to post to this room": "No tienes permiso para publicar en esta sala", "You have disabled URL previews by default.": "Ha deshabilitado la vista previa de URL por defecto.", @@ -402,7 +366,6 @@ "You need to be able to invite users to do that.": "Debes ser capaz de invitar usuarios para realizar esa acción.", "You need to be logged in.": "Necesitas haber iniciado sesión.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Tu dirección de correo electrónico no parece estar asociada a una ID de Matrix en este Servidor Doméstico.", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Su contraseña a sido cambiada exitosamente. No recibirá notificaciones en otros dispositivos hasta que ingrese de nuevo en ellos", "You seem to be in a call, are you sure you want to quit?": "Parece estar en medio de una llamada, ¿esta seguro que desea salir?", "You seem to be uploading files, are you sure you want to quit?": "Pareces estar subiendo archivos, ¿seguro que quieres salir?", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "No podrás deshacer este cambio porque estás promoviendo al usuario para tener el mismo nivel de autoridad que tú.", @@ -501,7 +464,6 @@ "Noisy": "Ruidoso", "Collecting app version information": "Recolectando información de la versión de la aplicación", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "¿Borrar el alias de la sala %(alias)s y eliminar %(name)s del directorio?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Esto te permitirá regresar a tu cuenta después de cerrar sesión, así como iniciar sesión en otros dispositivos.", "Keywords": "Palabras clave", "Enable notifications for this account": "Habilitar notificaciones para esta cuenta", "Invite to this community": "Invitar a esta comunidad", @@ -589,7 +551,6 @@ "Every page you use in the app": "Cada página que utilizas en la aplicación", "Your User Agent": "Tu Agente de Usuario", "Your device resolution": "La resolución de tu dispositivo", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Hay dispositivos desconocidos en esta sala: si continúas sin verificarlos, será posible que alguien escuche tu llamada.", "Which officially provided instance you are using, if any": "Qué instancia proporcionada oficialmente estás utilizando, si estás utilizando alguna", "e.g. %(exampleValue)s": "ej. %(exampleValue)s", "e.g. ": "ej. ", @@ -620,7 +581,6 @@ "Unignored user": "Usuario no ignorado", "You are no longer ignoring %(userId)s": "Ya no está ignorando a %(userId)s", "Opens the Developer Tools dialog": "Abre el diálogo de Herramientas de Desarrollador", - "Verifies a user, device, and pubkey tuple": "Verifica a un usuario, dispositivo, y tupla de clave pública", "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s cambió su nombre público a %(displayName)s.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s cambió los mensajes con chincheta en la sala.", "%(widgetName)s widget modified by %(senderName)s": "el widget %(widgetName)s fue modificado por %(senderName)s", @@ -637,8 +597,6 @@ "Enable URL previews for this room (only affects you)": "Activar vista previa de URL en esta sala (sólo le afecta a ud.)", "Enable URL previews by default for participants in this room": "Activar vista previa de URL por defecto para los participantes en esta sala", "Enable widget screenshots on supported widgets": "Activar capturas de pantalla de widget en los widgets soportados", - "Delete %(count)s devices|other": "Eliminar %(count)s dispositivos", - "Delete %(count)s devices|one": "Eliminar dispositivo", "Drop file here to upload": "Soltar aquí el fichero a subir", " (unsupported)": " (no soportado)", "Ongoing conference call%(supportedText)s.": "Llamada de conferencia en curso%(supportedText)s.", @@ -646,11 +604,7 @@ "%(senderName)s sent an image": "%(senderName)s envió una imagen", "%(senderName)s sent a video": "%(senderName)s envió un vídeo", "%(senderName)s uploaded a file": "%(senderName)s subió un fichero", - "Your key share request has been sent - please check your other devices for key share requests.": "Se envió su solicitud para compartir la clave - por favor, compruebe sus otros dispositivos para solicitudes de compartir clave.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Las solicitudes para compartir la clave se envían a sus otros dispositivos automáticamente. Si rechazó o descartó la solicitud en sus otros dispositivos, pulse aquí para solicitar otra vez las claves durante esta sesión.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Si sus otros dispositivos no tienen la clave para este mensaje no podrá descifrarlos.", "Key request sent.": "Solicitud de clave enviada.", - "Re-request encryption keys from your other devices.": "Volver a solicitar las claves de cifrado de tus otros dispositivos.", "Disinvite this user?": "¿Dejar de invitar a este usuario?", "Kick this user?": "¿Echar a este usuario?", "Unban this user?": "¿Quitarle el veto a este usuario?", @@ -666,20 +620,10 @@ "Share Link to User": "Compartir Enlace al Usuario", "User Options": "Opciones de Usuario", "Make Moderator": "Convertir a Moderador", - "bold": "negrita", - "italic": "cursiva", - "deleted": "eliminado", - "underlined": "subrayado", - "inline-code": "código en línea", - "block-quote": "cita extensa", - "bulleted-list": "lista con viñetas", - "numbered-list": "lista numerada", "Send an encrypted reply…": "Enviar una respuesta cifrada…", "Send a reply (unencrypted)…": "Enviar una respuesta (sin cifrar)…", "Send an encrypted message…": "Enviar un mensaje cifrado…", "Send a message (unencrypted)…": "Enviar un mensaje (sin cifrar)…", - "Unable to reply": "No se pudo responder", - "At this time it is not possible to reply with an emote.": "En este momento no es posible responder con un emoticono.", "Jump to message": "Ir a mensaje", "No pinned messages.": "No hay mensajes con chincheta.", "Loading...": "Cargando...", @@ -856,11 +800,6 @@ "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.": "La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Que olvidemos tus mensajes implica que los mensajes que hayas enviado no se compartirán con ningún usuario nuevo o no registrado, pero aquellos usuarios registrados que ya tengan acceso a estos mensajes seguirán teniendo acceso a su copia.", "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)": "Por favor, olvida todos los mensajes enviados al desactivar mi cuenta. (Advertencia: esto provocará que los usuarios futuros vean conversaciones incompletas)", "To continue, please enter your password:": "Para continuar, ingresa tu contraseña por favor:", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Para verificar que este dispositivo es confiable, por favor contacta a su dueño por algún otro medio (ej. cara a cara o por teléfono) y pregúntale si la clave que ve en sus Ajustes de Usuario para este dispositivo coincide con la clave a continuación:", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Si coincide, oprime el botón de verificar a continuación. Si no coincide, entonces alguien más está interceptando este dispositivo y probablemente prefieras oprimir el botón de prohibir.", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Añadiste un nuevo dispositivo '%(displayName)s', que está solicitando claves de cifrado.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Tu dispositivo sin verificar '%(displayName)s' está solicitando claves de cifrado.", - "Loading device info...": "Cargando información del dispositivo...", "Encryption key request": "Solicitud de clave de cifrado", "Clear Storage and Sign Out": "Borrar Almacenamiento y Cerrar Sesión", "Send Logs": "Enviar Registros", @@ -880,10 +819,6 @@ "Share Room Message": "Compartir el mensaje de la sala", "Link to selected message": "Enlazar a mensaje seleccionado", "COPY": "COPIAR", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Está actualmente prohibiendo dispositivos sin verificar; para enviar mensajes a los mismos deber verificarlos.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Le recomendamos que efectúe el proceso de verificación con cada dispositivo para confirmar que pertenecen a su propietario legítimo, pero si lo prefiere puede reenviar el mensaje sin verificar.", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contiene dispositivos que no ha visto antes.", - "Unknown devices": "Dispositivos desconocidos", "Unable to reject invite": "No se pudo rechazar la invitación", "Share Message": "Compartir mensaje", "Collapse Reply Thread": "Colapsar Hilo de Respuestas", @@ -940,7 +875,6 @@ "Error whilst fetching joined communities": "Error al recuperar las comunidades a las que estás unido", "Create a new community": "Crear una comunidad nueva", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Crear una comunidad para agrupar usuarios y salas. Construye una página de inicio personalizada para destacarla.", - "Show devices, send anyway or cancel.": "Mostrar dispositivos, enviar de todos modos o cancelar.", "You can't send any messages until you review and agree to our terms and conditions.": "No puede enviar ningún mensaje hasta que revise y esté de acuerdo con nuestros términos y condiciones.", "%(count)s of your messages have not been sent.|one": "No se envió su mensaje.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Reenviar todo o cancelar todo ahora. También puedes seleccionar mensajes individuales para reenviar o cancelar.", @@ -1022,7 +956,6 @@ "Gets or sets the room topic": "Obtiene o establece el tema de la sala", "This room has no topic.": "Esta sala no tiene tema.", "Sets the room name": "Establece el nombre de la sala", - "Upload profile picture": "Subir imagen de perfil", "Phone numbers": "Números de teléfono", "Email addresses": "Correos electrónicos", "Language and region": "Idioma y región", @@ -1096,7 +1029,6 @@ "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Los mensajes seguros con este usuario están cifrados punto a punto y no es posible que los lean otros.", "Verify this user by confirming the following number appears on their screen.": "Verifica a este usuario confirmando que este número aparece en su pantalla.", "Unable to find a supported verification method.": "No es posible encontrar un método de verificación soportado.", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "Para mayor seguridad, recomendamos que hagas esto en persona o uses otro medio de comunicación fiables.", "Dog": "Perro", "Cat": "Gato", "Lion": "León", @@ -1142,7 +1074,6 @@ "Book": "Libro", "Pencil": "Lápiz", "Paperclip": "Clip", - "Padlock": "Candado", "Key": "Llave", "Hammer": "Martillo", "Telephone": "Teléfono", @@ -1160,7 +1091,6 @@ "Headphones": "Auriculares", "Folder": "Carpeta", "Pin": "Pin", - "Your homeserver does not support device management.": "Tu servidor doméstico no soporta gestión de dispositivos.", "Yes": "Sí", "No": "No", "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "Te hemos enviado un mensaje para verificar tu dirección de correo. Por favor, sigue las instrucciones y después haz clic el botón de abajo.", @@ -1170,18 +1100,11 @@ "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Los mensajes cifrados son seguros con el cifrado punto a punto. Solo tú y el/los destinatario/s tiene/n las claves para leer estos mensajes.", "Unable to load key backup status": "No se pudo cargar el estado de la copia de la clave", "Restore from Backup": "Restaurar desde copia", - "This device is backing up your keys. ": "Este dispositivo está haciendo copia de tus claves. ", "Back up your keys before signing out to avoid losing them.": "Haz copia de tus claves antes de salir para evitar perderlas.", "Backing up %(sessionsRemaining)s keys...": "Haciendo copia de %(sessionsRemaining)s claves...", "All keys backed up": "Se han copiado todas las claves", - "Backup has a signature from unknown device with ID %(deviceId)s.": "La copia tiene una firma de un dispositivo desconocido con ID %(deviceId)s.", - "Backup has a valid signature from this device": "La copia tiene una firma válida desde este dispositivo", - "Backup has a valid signature from verified device ": "La copia tiene una firma válida desde el dispositivo verificado", - "Backup is not signed by any of your devices": "La copia no está firmada por ninguno de tus dispositivos", - "This backup is trusted because it has been restored on this device": "Se confía en la copia porque se ha restaurado en este dispositivo", "Backup version: ": "Versión de la copia: ", "Algorithm: ": "Algoritmo: ", - "Your keys are not being backed up from this device.": "Tus claves no se está copiando desde este dispositivo.", "Start using Key Backup": "Comenzar a usar la copia de claves", "Add an email address to configure email notifications": "Añade una dirección para configurar las notificaciones por correo", "Unable to verify phone number.": "No se pudo verificar el número de teléfono.", @@ -1219,10 +1142,6 @@ "Key backup": "Copia de clave", "Missing media permissions, click the button below to request.": "No hay permisos de medios, haz clic abajo para pedirlos.", "Request media permissions": "Pedir permisos de los medios", - "Some devices for this user are not trusted": "Algunos dispositivos de este usuario no son confiables", - "Some devices in this encrypted room are not trusted": "Algunos dispositivos de esta sala cifrada no son confiables", - "All devices for this user are trusted": "Todos los dispositivos de este usuario son confiables", - "All devices in this encrypted room are trusted": "Todos los dispositivos para esta sala cifrada con confiables", "Never lose encrypted messages": "Nunca perder mensajes cifrados", "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Los mensajes en esta sala están cifrados de extremo a extremo. Solo tu y el/los destinatario/s tiene/n las claves para leer estos mensajes.", "Securely back up your keys to avoid losing them. Learn more.": "Haz copia de manera segura de tus claves para evitar perderlas. Lee más.", @@ -1231,8 +1150,6 @@ "Add some now": "Añadir algunos ahora", "Main address": "Dirección principal", "Room avatar": "Avatar de la sala", - "Upload room avatar": "Subir avatar de la sala", - "No room avatar": "Sin avatar de la sala", "Room Name": "Nombre de sala", "Failed to load group members": "No se pudieron cargar los miembros del grupo", "Join": "Unirse", @@ -1255,7 +1172,6 @@ "Waiting for %(userId)s to confirm...": "Esperando a que confirme %(userId)s...", "Use two-way text verification": "Usar verificación de texto en dos sentidos", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Verifica ese usuario para marcar como confiable. Confiar en usuarios aporta mucha tranquilidad en los mensajes cifrados de extremo a extremo.", - "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "Verificar a este usuario lo marcará como confiable, y también marca tu dispositivo como fiable para él.", "Waiting for partner to confirm...": "Esperando que confirme el compañero...", "Incoming Verification Request": "Petición de verificación entrante", "%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s cambió la regla para unirse a %(rule)s", @@ -1263,7 +1179,6 @@ "Use a longer keyboard pattern with more turns": "Usa un patrón de tecleo más largo y con más vueltas", "Enable Community Filter Panel": "Habilitar el Panel de Filtro de Comunidad", "Verify this user by confirming the following emoji appear on their screen.": "Verifica este usuario confirmando que los siguientes emojis aparecen en su pantalla.", - "Backup has a valid signature from unverified device ": "La copia tiene una firma válida de un dispositivo no verificado", "Your Riot is misconfigured": "Riot tiene un error de configuración", "Whether or not you're logged in (we don't record your username)": "Hayas o no iniciado sesión (no guardamos tu nombre de usuario)", "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Uses o no los 'breadcrumbs' (iconos sobre la lista de salas)", @@ -1273,13 +1188,8 @@ "The file '%(fileName)s' failed to upload.": "Falló en subir el archivo '%(fileName)s'.", "The server does not support the room version specified.": "El servidor no soporta la versión de sala especificada.", "Name or Matrix ID": "Nombre o identificador (ID) Matrix ", - "Email, name or Matrix ID": "Correo, nombre o identificador (ID) Matrix.", "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Pone ¯\\_(ツ)_/¯ al principio de un mensaje de texto.", - "Upgrading a room can be destructive and isn't always necessary.": "Actualizar una sala podría dañarla y no siempre es necesario.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Se recomienda actualizar una sala cuando su versión es considerada inestable. Las versiones de sala inestables pueden tener bugs, menos funcionalidades o problemas de seguridad.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Las actualizaciones de sala normalmente sólo afectan a la sala en el lado del servidor. Si tienes problema con tu cliente, por favor comunica el problema en .", "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.": "Aviso: Actualizar una sala no migrará automáticamente a sus miembros a la nueva versión de la sala. Incluiremos un enlace a la nueva sala en la versión antigüa de la misma - los miembros tendrán que seguir ese enlace para unirse a la nueva sala.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Por favor confirma que quieres continuar con la actualización de la sala de a .", "Changes your display nickname in the current room only": "Cambia tu apodo sólo en la sala actual", "Changes your avatar in this current room only": "Cambia tu avatar sólo en la sala actual", "Changes your avatar in all rooms": "Cambia tu avatar en todas las salas", @@ -1315,7 +1225,6 @@ "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Por favor pídele al administrador de tu servidor doméstico (%(homeserverDomain)s) que configure un servidor TURN para que las llamadas funcionen correctamente.", "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.": "Alternativamente, puedes tratar de usar el servidor público en turn.matrix.org, pero éste no será igual de confiable, y compartirá tu dirección IP con ese servidor. También puedes administrar esto en Ajustes.", "Try using turn.matrix.org": "Trata de usar turn.matrix.org", - "Failed to start chat": "Error al iniciar el chat", "Messages": "Mensajes", "Actions": "Acciones", "Other": "Otros", @@ -1330,7 +1239,6 @@ "You cannot modify widgets in this room.": "No puedes modificar widgets en esta sala.", "Displays list of commands with usages and descriptions": "Muestra lista de comandos con usos y descripciones", "Multiple integration managers": "Administradores de integración múltiples", - "Room upgrade confirmation": "Confirmación de actualización de sala", "Add Email Address": "Añadir dirección de correo", "Add Phone Number": "Añadir número de teléfono", "Identity server has no terms of service": "El servidor de identidad no tiene términos de servicio", @@ -1346,10 +1254,7 @@ "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s hizo una llamada de vídeo (no soportada por este navegador)", "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", "Try out new ways to ignore people (experimental)": "Pruebe nuevas formas de ignorar a usuarios (experimental)", - "Send verification requests in direct message, including a new verification UX in the member panel.": "Envíe solicitudes de verificación por mensaje directo, con una nueva interfaz de verificación en el panel de miembros.", - "Enable cross-signing to verify per-user instead of per-device (in development)": "Active la firma cruzada para verificar usuarios en vez de dispositivos (en desarrollo)", "Enable local event indexing and E2EE search (requires restart)": "Active el indexado de eventos locales y la búsqueda E2EE (necesita reiniciar)", - "Use the new, faster, composer for writing messages": "Escriba mensajes con el nuevo y mejorado compositor", "Match system theme": "Usar el tema del sistema", "Show previews/thumbnails for images": "Mostrar vistas previas para las imágenes", "When rooms are upgraded": "Cuando se mejoran las salas", diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 1ab4bd15b1..a7c1be2fdf 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -28,7 +28,6 @@ "Sign out": "Amaitu saioa", "Home": "Hasiera", "Favourites": "Gogokoak", - "People": "Jendea", "Rooms": "Gelak", "Invites": "Gonbidapenak", "Low priority": "Lehentasun baxua", @@ -61,7 +60,6 @@ "Phone": "Telefonoa", "Advanced": "Aurreratua", "Cryptography": "Kriptografia", - "Devices": "Gailuak", "Always show message timestamps": "Erakutsi beti mezuen denbora-zigilua", "Name": "Izena", "Last seen": "Azkenekoz ikusia", @@ -80,7 +78,6 @@ "Banned users": "Debekatutako erabiltzaileak", "Labs": "Laborategia", "This room has no local addresses": "Gela honek ez du tokiko helbiderik", - "Invalid alias format": "Ezizenaren formatu baliogabea", "End-to-end encryption information": "Muturretik muturrerako zifratzearen informazioa", "Event information": "Gertaeraren informazioa", "Curve25519 identity key": "Curve25519 identitate gakoa", @@ -88,10 +85,7 @@ "Algorithm": "Algoritmoa", "Session ID": "Saioaren IDa", "Decryption error": "Deszifratze errorea", - "Sender device information": "Igorlearen gailuaren informazioa", - "Device name": "Gailuaren izena", "Device ID": "Gailuaren IDa", - "Device key": "Gailuaren gakoa", "Verification": "Egiaztaketa", "Ed25519 fingerprint": "Ed25519 hatz-marka", "Export E2E room keys": "Esportatu E2E geletako gakoak", @@ -102,19 +96,15 @@ "Import E2E room keys": "Inportatu E2E geletako gakoak", "Import room keys": "Inportatu gelako gakoak", "Import": "Inportatu", - "Never send encrypted messages to unverified devices from this device": "Ez bidali inoiz zifratutako mezuak egiaztatu gabeko gailuetara gailu honetatik", "Blacklisted": "Blokeatuta", "unknown device": "gailu ezezaguna", "Unverify": "Kendu egiaztaketa", "Blacklist": "Blokeatu", "Unblacklist": "Desblokeatu", - "Verify device": "Egiaztatu gailua", "I verify that the keys match": "Gakoak bat datozela egiaztatu dut", - "Room contains unknown devices": "Gelan gailu ezezagunak daude", "Someone": "Norbait", "Start a chat": "Hasi txat bat", "Start authentication": "Hasi autentifikazioa", - "Start Chat": "Hasi txata", "Success": "Arrakasta", "For security, this session has been signed out. Please sign in again.": "Segurtasunagatik saio hau amaitu da. Hasi saioa berriro.", "Guests cannot join this room even if explicitly invited.": "Bisitariak ezin dira gela honetara elkartu ez bazaie zuzenean gonbidatu.", @@ -167,10 +157,7 @@ "Decline": "Ukatu", "Decrypt %(text)s": "Deszifratu %(text)s", "Default": "Lehenetsia", - "Device already verified!": "Gailua egiaztatuta dago!", - "Device ID:": "Gailuaren IDa:", "device id: ": "gailuaren id-a: ", - "Device key:": "Gailuaren gakoa:", "Direct chats": "Txat zuzenak", "Disable Notifications": "Desgaitu jakinarazpenak", "Displays action": "Ekintza bistaratzen du", @@ -183,7 +170,6 @@ "Download %(text)s": "Deskargatu %(text)s", "Emoji": "Emoji", "Enable Notifications": "Gaitu jakinarazpenak", - "Encrypted by an unverified device": "Egiaztatu gabeko gailu batek zifratuta", "%(senderName)s ended the call.": "%(senderName)s erabiltzaileak deia amaitu du.", "Error decrypting attachment": "Errorea eranskina deszifratzean", "Error: Problem communicating with the given homeserver.": "Errorea: Arazoa emandako hasiera zerbitzariarekin komunikatzeko.", @@ -208,7 +194,6 @@ "Fill screen": "Bete pantaila", "Forget room": "Ahaztu gela", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s %(fromPowerLevel)s mailatik %(toPowerLevel)s mailara", - "Hide Text Formatting Toolbar": "Ezkutatu testu-formatuaren tresna-barra", "Incoming call from %(name)s": "%(name)s erabiltzailearen deia jasotzen", "Incoming video call from %(name)s": "%(name)s erabiltzailearen bideo deia jasotzen", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s erabiltzaileak %(displayName)s erabiltzailearen gonbidapena onartu du.", @@ -223,10 +208,8 @@ "Invalid Email Address": "E-mail helbide baliogabea", "Invalid file%(extra)s": "Fitxategi %(extra)s baliogabea", "%(senderName)s invited %(targetName)s.": "%(senderName)s erabiltzaileak %(targetName)s gonbidatu du.", - "Invite new room members": "Gonbidatu kide berriak gelara", "Invited": "Gonbidatuta", "Invites user with given id to current room": "Emandako ID-a duen erabiltzailea gonbidatzen du gelara", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' ez da baliozko formatua ezizen batentzat", "Sign in with": "Hasi saioa hau erabilita:", "Join as voice or video.": "Elkartu ahotsa edo bideoa erabiliz.", "%(targetName)s joined the room.": "%(targetName)s erabiltzailea gelara elkartu da.", @@ -242,13 +225,8 @@ "%(senderName)s made future room history visible to anyone.": "%(senderName)s erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du edonorentzat.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s erabiltzaileak etorkizuneko gelaren historiala ikusgai jarri du ezezagunentzat (%(visibility)s).", "Manage Integrations": "Kudeatu integrazioak", - "Markdown is disabled": "Markdown desgaituta dago", - "Markdown is enabled": "Markdown gaituta dago", - "matrix-react-sdk version:": "matrix-react-sdk bertsioa:", - "Message not sent due to unknown devices being present": "Ez da mezua bidali gailu ezezagunak daudelako", "Missing room_id in request": "Gelaren ID-a falta da eskaeran", "Missing user_id in request": "Erabiltzailearen ID-a falta da eskaeran", - "Never send encrypted messages to unverified devices in this room from this device": "Ez bidali inoiz zifratutako mezuak egiaztatu gabeko gailuetara gela honetan gailu honetatik", "New address (e.g. #foo:%(localDomain)s)": "Helbide berria (adib. #foo:%(localDomain)s)", "New passwords don't match": "Pasahitz berriak ez datoz bat", "New passwords must match each other.": "Pasahitz berriak berdinak izan behar dira.", @@ -256,13 +234,11 @@ "(not supported by this browser)": "(nabigatzaile honek ez du euskarririk)", "": "", "NOT verified": "EZ egiaztatuta", - "No devices with registered encryption keys": "Erregistratutako zifratze gakoak dituen gailurik ez", "No display name": "Pantaila izenik ez", "No more results": "Emaitza gehiagorik ez", "No users have specific privileges in this room": "Ez dago gela honetan baimen zehatzik duen erabiltzailerik", "olm version:": "olm bertsioa:", "Server may be unavailable, overloaded, or you hit a bug.": "Agian zerbitzaria ez dago eskuragarri, edo gainezka dago, edo akats bat aurkitu duzu.", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Oraingoz pasahitza aldatzeak gailu guztietako muturretik muturrerako zifratze-gakoak berrezarriko ditu, eta ezin izango dituzu zifratutako txatetako historialak irakurri ez badituzu aurretik zure gelako gakoak esportatzen eta aldaketa eta gero berriro inportatzen. Etorkizunean hau hobetuko da.", "Passwords can't be empty": "Pasahitzak ezin dira hutsik egon", "Permissions": "Baimenak", "Power level must be positive integer.": "Botere maila osoko zenbaki positibo bat izan behar da.", @@ -279,7 +255,6 @@ "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s erabiltzaileak bere pantaila-izena kendu du (%(oldDisplayName)s).", "%(senderName)s removed their profile picture.": "%(senderName)s erabiltzaileak bere profileko argazkia kendu du.", "%(senderName)s requested a VoIP conference.": "%(senderName)s erabiltzaileak VoIP konferentzia bat eskatu du.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Une honetan egiaztatu gabeko gailuak blokeatzen ari zara, gailu hauetara mezuak bidali ahal izateko egiaztatu behar dituzu.", "Results from DuckDuckGo": "DuckDuckGo bilatzaileko emaitzak", "Riot does not have permission to send you notifications - please check your browser settings": "Riotek ez du zuri jakinarazpenak bidaltzeko baimenik, egiaztatu nabigatzailearen ezarpenak", "Riot was not given permission to send notifications - please try again": "Ez zaio jakinarazpenak bidaltzeko baimena eman Rioti, saiatu berriro", @@ -293,7 +268,6 @@ "Searches DuckDuckGo for results": "DuckDuckGo-n bilatzen ditu emaitzak", "Seen by %(userName)s at %(dateTime)s": "%(userName)s erabiltzaileak ikusia %(dateTime)s(e)an", "Send anyway": "Bidali hala ere", - "Send Invites": "Bidali gonbidapenak", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s erabiltzaileak irudi bat bidali du.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s erabiltzaileak gelara elkartzeko gonbidapen bat bidali dio %(targetDisplayName)s erbiltzaileari.", "Server error": "Zerbitzari-errorea", @@ -301,13 +275,11 @@ "Server unavailable, overloaded, or something else went wrong.": "Zerbitzaria eskuraezin edo gainezka egon daiteke edo zerbaitek huts egin du.", "%(senderName)s set a profile picture.": "%(senderName)s erabiltzaileak profileko argazkia ezarri du.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s erabiltzaileak %(displayName)s ezarri du pantaila izen gisa.", - "Show Text Formatting Toolbar": "Erakutsi testu-formatuaren tresna-barra", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Erakutsi denbora-zigiluak 12 ordutako formatuan (adib. 2:30pm)", "Signed Out": "Saioa amaituta", "Sign in": "Hasi saioa", "%(count)s of your messages have not been sent.|other": "Zure mezu batzuk ez dira bidali.", "The phone number entered looks invalid": "Sartutako telefono zenbakia ez dirudi baliozkoa", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Eman duzun sinadura-gakoa %(userId)s erabiltzailearen %(deviceId)s gailutik jasotako bera da. Gailua egiaztatuta gisa markatu da.", "This email address was not found": "Ez da e-mail helbide hau aurkitu", "The remote side failed to pick up": "Urruneko aldeak hartzean huts egin du", "This room is not recognised.": "Ez da gela hau ezagutzen.", @@ -317,23 +289,17 @@ "To use it, just wait for autocomplete results to load and tab through them.": "Erabiltzeko, itxaron osatze automatikoaren emaitzak kargatu arte eta gero tabuladorearekin hautatu.", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Gela honen denbora-lerroko puntu zehatz bat kargatzen saiatu zara, baina ez duzu mezu zehatz hori ikusteko baimenik.", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Gela honen denbora-lerroko puntu zehatz bat kargatzen saiatu da, baina ezin izan da aurkitu.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s erabiltzaileak muturretik muturrerako (%(algorithm)s algoritmoa) zifratzea aktibatu du.", "Unable to add email address": "Ezin izan da e-mail helbidea gehitu", "Unable to remove contact information": "Ezin izan da kontaktuaren informazioa kendu", "Unable to verify email address.": "Ezin izan da e-mail helbidea egiaztatu.", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s erabiltzaileak debekua kendu dio %(targetName)s erabiltzaileari.", "Unable to capture screen": "Ezin izan da pantaila-argazkia atera", "Unable to enable Notifications": "Ezin izan dira jakinarazpenak gaitu", - "Unable to load device list": "Ezin izan da gailuen zerrenda kargatu", - "Undecryptable": "Deszifraezina", "unencrypted": "zifratu gabe", - "Unencrypted message": "Zifratu gabeko mezua", "unknown caller": "deitzaile ezezaguna", "Unknown room %(roomId)s": "%(roomId)s gela ezezaguna da", - "Unknown (user, device) pair:": "Erabiltzaile eta gailu bikote ezezaguna:", "Unmute": "Audioa aktibatu", "Unnamed Room": "Izen gabeko gela", - "Unrecognised command:": "Agindu ezezaguna:", "Unrecognised room alias:": "Gelaren ezizen ezezaguna:", "Uploading %(filename)s and %(count)s others|zero": "%(filename)s igotzen", "Uploading %(filename)s and %(count)s others|one": "%(filename)s eta beste %(count)s igotzen", @@ -358,9 +324,6 @@ "(could not connect media)": "(ezin izan da media konektatu)", "(no answer)": "(erantzunik ez)", "(unknown failure: %(reason)s)": "(hutsegite ezezaguna: %(reason)s)", - "WARNING: Device already verified, but keys do NOT MATCH!": "ABISUA: Gailua egiaztatuta dago, baina gakoak EZ DATOZ BAT!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ABISUA: GAKOEN EGIAZTAKETAK HUTS EGIN DU! %(userId)s erabiltzailearen %(deviceId)s gailuaren sinadura-gakoa \"%(fprint)s\" da, eta ez dator bat emandako \"%(fingerprint)s\" gakoarekin. Honek inor komunikazioa antzematen ari dela esan nahi lezake!", - "Who would you like to communicate with?": "Norekin komunikatu nahi duzu?", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s erabiltzaileak atzera bota du %(targetName)s erabiltzailearen gonbidapena.", "You are already in a call.": "Bazaude dei batean.", "You cannot place a call with yourself.": "Ezin diozu zure buruari deitu.", @@ -372,7 +335,6 @@ "You need to be able to invite users to do that.": "Erabiltzaileak gonbidatzeko baimena behar duzu hori egiteko.", "You need to be logged in.": "Saioa hasi duzu.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Zure e-mail helbidea ez dago antza hasiera zerbitzari honetako Matrix ID batekin lotuta.", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Zure pasahitza ongi aldatu da. Ez dituzu beste gailuetan jakinarazpenak jasoko hauetan saioa berriro hasi arte", "You seem to be in a call, are you sure you want to quit?": "Badirudi dei batean zaudela, ziur irten nahi duzula?", "You seem to be uploading files, are you sure you want to quit?": "Badirudi fitxategiak iotzen zaudela, ziur irten nahi duzula?", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Ezin izango duzu hau atzera bota erabiltzailea zure botere maila berera igotzen ari zarelako.", @@ -407,8 +369,6 @@ "Sent messages will be stored until your connection has returned.": "Bidalitako mezuak zure konexioa berreskuratu arte gordeko dira.", "(~%(count)s results)|one": "(~%(count)s emaitza)", "(~%(count)s results)|other": "(~%(count)s emaitza)", - "bold": "lodia", - "italic": "etzana", "Please select the destination room for this message": "Hautatu mezu hau bidaltzeko gela", "New Password": "Pasahitz berria", "Start automatically after system login": "Hasi automatikoki sisteman saioa hasi eta gero", @@ -430,13 +390,8 @@ "Unknown error": "Errore ezezaguna", "Incorrect password": "Pasahitz okerra", "To continue, please enter your password.": "Jarraitzeko sartu zure pasahitza.", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Gailu hau fidagarria dela egiaztatzeko, kontaktatu bere jabea beste medio bat erabiliz (adib. aurrez aurre edo telefonoz deituz) eta galdetu beraien erabiltzaile-ezarpenetan bere gailurako ikusten duen gakoa hemen beheko bera den:", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Bat badator sakatu egiaztatu botoia. Bat ez badator, beste inor gailu hau atzematen dago eta blokeatu beharko zenuke.", "Unable to restore session": "Ezin izan da saioa berreskuratu", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Aurretik Riot bertsio berriago bat erabili baduzu, zure saioa bertsio honekin bateraezina izan daiteke. Itxi leiho hau eta itzuli bertsio berriagora.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Gailu bakoitzaren egiaztaketa prozesua jarraitzea aholkatzen dizugu, benetako jabeari dagozkiela baieztatzeko, baina mezua egiaztatu gabe birbidali dezakezu ere.", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" gelan aurretik ikusi ez dituzun gailuak daude.", - "Unknown devices": "Gailu ezezagunak", "Unknown Address": "Helbide ezezaguna", "Verify...": "Egiaztatu...", "ex. @bob:example.com": "adib. @urko:adibidea.eus", @@ -472,8 +427,6 @@ "Start verification": "Hasi egiaztaketa", "Share without verifying": "Partekatu egiaztatu gabe", "Ignore request": "Ezikusi eskaera", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "'%(displayName)s' gailua gehitu duzu eta zifratze-gakoak eskatzen ari da.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Zure egiaztatu gabeko '%(displayName)s' gailua zifratze-gakoak eskatzen ari da.", "Encryption key request": "Zifratze-gakoa eskatuta", "Deops user with given id": "Emandako ID-a duen erabiltzailea mailaz jaisten du", "Add a widget": "Gehitu trepeta bat", @@ -493,7 +446,6 @@ "Unable to create widget.": "Ezin izan da trepeta sortu.", "You are not in this room.": "Ez zaude gela honetan.", "You do not have permission to do that in this room.": "Ez duzu gela honetan hori egiteko baimenik.", - "Loading device info...": "Gailuaren informazioa kargatzen...", "Example": "Adibidea", "Create": "Sortu", "Featured Rooms:": "Nabarmendutako gelak:", @@ -502,7 +454,6 @@ "Failed to upload image": "Irudia igotzeak huts egin du", "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s trepeta gehitu du %(senderName)s erabiltzaileak", "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s trepeta kendu du %(senderName)s erabiltzaileak", - "Verifies a user, device, and pubkey tuple": "Erabiltzaile, gailu eta gako publiko multzoa egiaztatzen du", "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s trepeta aldatu du %(senderName)s erabiltzaileak", "Copied!": "Kopiatuta!", "Failed to copy": "Kopiak huts egin du", @@ -521,7 +472,6 @@ "Unpin Message": "Desfinkatu mezua", "Add rooms to this community": "Gehitu gelak komunitate honetara", "Call Failed": "Deiak huts egin du", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Gailu ezezagunak daude gela honetan: hauek egiaztatu gabe aurrera jarraituz gero, posiblea litzateke inork zure deia entzutea.", "Review Devices": "Berrikusi gailuak", "Call Anyway": "Deitu hala ere", "Answer Anyway": "Erantzun hala ere", @@ -548,8 +498,6 @@ "Enable inline URL previews by default": "Gailu URL-en aurrebista lehenetsita", "Enable URL previews for this room (only affects you)": "Gaitu URLen aurrebista gela honetan (zuretzat bakarrik aldatuko duzu)", "Enable URL previews by default for participants in this room": "Gaitu URLen aurrebista lehenetsita gela honetako partaideentzat", - "Delete %(count)s devices|other": "Ezabatu %(count)s gailu", - "Delete %(count)s devices|one": "Ezabatu gailua", "%(senderName)s sent an image": "%(senderName)s erabiltzaileak irudi bat bidali du", "%(senderName)s sent a video": "%(senderName)s erabiltzaileak bideo bat bidali du", "%(senderName)s uploaded a file": "%(senderName)s erabiltzaileak fitxategi bat bidali du", @@ -747,7 +695,6 @@ "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(fullYear)s(e)ko %(monthName)sk %(day)sa", "This room is not public. You will not be able to rejoin without an invite.": "Gela hau ez da publikoa. Ezin izango zara berriro elkartu gonbidapenik gabe.", "Community IDs cannot be empty.": "Komunitate ID-ak ezin dira hutsik egon.", - "Show devices, send anyway or cancel.": "Erakutsi gailuak, bidali hala ere edo ezeztatu.", "In reply to ": "honi erantzunez: ", "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s erabiltzaileak bere pantaila izena aldatu du %(displayName)s izatera.", "Failed to set direct chat tag": "Huts egin du txat zuzenarenaren etiketa jartzean", @@ -756,11 +703,7 @@ "Clear filter": "Garbitu iragazkia", "Did you know: you can use communities to filter your Riot.im experience!": "Ba al zenekien? Komunitateak erabili ditzakezu zure Riot.im esperientzia iragazteko!", "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Iragazki bat ezartzeko, arrastatu komunitate baten abatarra pantailaren ezkerrean dagoen iragazki-panelera. Iragazki-paneleko abatar batean klik egin dezakezu komunitate horri lotutako gelak eta pertsonak besterik ez ikusteko.", - "Your key share request has been sent - please check your other devices for key share requests.": "Zure gakoa partekatzeko eskaria bidali da - egiaztatu zure beste gailuetan gakoa partekatzeko eskariak.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Gakoa partekatzeko eskariak automatikoki bidaltzen dira zure beste gailuetara. Zure beste gailuetan gakoa partekatzeko eskaria ukatu edo baztertu baduzu, egin klik hemen saio honetarako gakoak eskatzeko berriz ere.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Zure beste gailuek mezu honetarako gakoa ez badute ezin izango dute deszifratu.", "Key request sent.": "Gako eskaria bidalita.", - "Re-request encryption keys from your other devices.": "Berriz eskatu zifratze-gakoak zure beste gailuetatik.", "Code": "Kodea", "If you've submitted a bug via GitHub, debug logs can help us track down the problem. 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.": "GitHub bidez akats baten berri eman badiguzu, arazte-egunkariek arazoa aurkitzen lagundu gaitzakete. Arazte-egunkariek aplikazioaren erabileraren datuak dauzkate, zure erabiltzaile izena barne, eta bisitatu dituzun gelen ID-ak edo ezizenak eta beste erabiltzaileen izenak. Ez dute mezurik.", "Submit debug logs": "Bidali arazte-egunkariak", @@ -823,7 +766,6 @@ "Files": "Fitxategiak", "Collecting app version information": "Aplikazioaren bertsio-informazioa biltzen", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Ezabatu gelaren %(alias)s ezizena eta kendu %(name)s direktoriotik?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Honek zure kontura itzultzea ahalbidetuko dizu, beste gailuetan saioa amaitu eta berriro hasi eta gero.", "Keywords": "Hitz gakoak", "Enable notifications for this account": "Gaitu jakinarazpenak kontu honetarako", "Invite to this community": "Gonbidatu komunitate honetara", @@ -918,8 +860,6 @@ "Refresh": "Freskatu", "We encountered an error trying to restore your previous session.": "Errore bat aurkitu dugu zure aurreko saioa berrezartzen saiatzean.", "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Zure nabigatzailearen biltegiratzea garbitzeak arazoa konpon lezake, baina saioa amaituko da eta zifratutako txaten historiala ezin izango da berriro irakurri.", - "Unable to reply": "Ezin erantzun", - "At this time it is not possible to reply with an emote.": "Une honetan ezin da irriabartxo batekin erantzun.", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Ezin izan da erantzundako gertaera kargatu, edo ez dago edo ez duzu ikusteko baimenik.", "Collapse Reply Thread": "Tolestu erantzun-haria", "Enable widget screenshots on supported widgets": "Gaitu trepeten pantaila-argazkiak, onartzen duten trepetetan", @@ -965,12 +905,6 @@ "Permission Required": "Baimena beharrezkoa", "You do not have permission to start a conference call in this room": "Ez duzu baimenik konferentzia dei bat hasteko gela honetan", "This event could not be displayed": "Ezin izan da gertakari hau bistaratu", - "deleted": "ezabatuta", - "underlined": "azpimarratuta", - "inline-code": "lineako kodea", - "block-quote": "aipamen blokea", - "bulleted-list": "buletdun zerrenda", - "numbered-list": "zenbakidun zerrenda", "Failed to remove widget": "Huts egin du trepeta kentzean", "An error ocurred whilst trying to remove the widget from the room": "Trepeta gelatik kentzen saiatzean errore bat gertatu da", "System Alerts": "Sistemaren alertak", @@ -1025,11 +959,6 @@ "Unable to load! Check your network connectivity and try again.": "Ezin da kargatu! Egiaztatu sare konexioa eta saiatu berriro.", "Delete Backup": "Ezabatu babes-kopia", "Unable to load key backup status": "Ezin izan da gakoen babes-kopiaren egoera kargatu", - "Backup has a valid signature from this device": "Babes-kopiak gailu honen baliozko sinadura bat du", - "Backup has a valid signature from unverified device ": "Babes-kopiak egiaztatu gabeko gailu baten baliozko sinadura du", - "Backup has an invalid signature from verified device ": "Babes-kopiak egiaztatutako gailuaren balio gabeko sinadura du", - "Backup has an invalid signature from unverified device ": "Babes-kopiak egiaztatu gabeko gailuaren baliogabeko sinadura du", - "Backup is not signed by any of your devices": "Babes-kopia ez dago zure gailu batek sinauta", "Backup version: ": "Babes-kopiaren bertsioa: ", "Algorithm: ": "Algoritmoa: ", "Please review and accept all of the homeserver's policies": "Berrikusi eta onartu hasiera-zerbitzariaren politika guztiak", @@ -1047,12 +976,9 @@ "Your Recovery Key": "Zure berreskuratze gakoa", "Copy to clipboard": "Kopiatu arbelera", "Download": "Deskargatu", - "Your Recovery Key has been copied to your clipboard, paste it to:": "Zure berreskuratze gakoa zure arbelera kopiatu da, itsatsi hemen:", - "Your Recovery Key is in your Downloads folder.": "Zure berreskuratze gakoa zure Deskargak karpetan dago.", "Print it and store it somewhere safe": "Inprimatu ezazu eta gorde toki seguruan", "Save it on a USB key or backup drive": "Gorde ezazu USB giltza batean edo babes-kopien diskoan", "Copy it to your personal cloud storage": "Kopiatu ezazu zure hodeiko biltegi pertsonalean", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "Mezu seguruen berreskuratzea ezartzen ez bada, ezin izango duzu zure zifratutako mezuen historiala berreskuratu saioa amaitzen baduzu edo beste gailu bat erabiltzen baduzu.", "Set up Secure Message Recovery": "Ezarri mezu seguruen berreskuratzea", "Keep it safe": "Gorde toki seguruan", "Create Key Backup": "Sortu gakoaren babes-kopia", @@ -1071,7 +997,6 @@ "This looks like a valid recovery key!": "Hau baliozko berreskuratze gako bat dirudi!", "Not a valid recovery key": "Ez da baliozko berreskuratze gako bat", "Access your secure message history and set up secure messaging by entering your recovery key.": "Atzitu zure mezu seguruen historiala eta ezarri mezularitza segurua zure berreskuratze gakoa sartuz.", - "If you've forgotten your recovery passphrase you can ": "Zure berreskuratze pasa-esaldia ahaztu baduzu ditzakezu", "Sign in with single sign-on": "Hai saioa urrats batean", "Failed to perform homeserver discovery": "Huts egin du hasiera-zerbitzarien bilaketak", "Invalid homeserver discovery response": "Baliogabeko hasiera-zerbitzarien bilaketaren erantzuna", @@ -1127,7 +1052,6 @@ "New Recovery Method": "Berreskuratze metodo berria", "Set up Secure Messages": "Ezarri mezu seguruak", "Go to Settings": "Joan ezarpenetara", - "Backup has a valid signature from verified device ": "Babes-kopiak egiaztatutako gailu baten baliozko sinadura bat du", "Unable to load commit detail: %(msg)s": "Ezin izan dira xehetasunak kargatu: %(msg)s", "Invalid identity server discovery response": "Baliogabeko erantzuna identitate zerbitzariaren bilaketan", "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.": "Ez baduzu berreskuratze sistema berria ezarri, erasotzaile bat zure kontua atzitzen saiatzen egon daiteke. Aldatu zure kontuaren pasahitza eta ezarri berreskuratze metodo berria berehala ezarpenetan.", @@ -1214,8 +1138,6 @@ "Hammer": "Mailua", "Telephone": "Telefonoa", "Room avatar": "Gelaren abatarra", - "Upload room avatar": "Igo gelaren abatarra", - "No room avatar": "Gelaren abatarrik ez", "Room Name": "Gelaren izena", "Room Topic": "Gelaren mintzagaia", "Verify by comparing a short text string.": "Egiaztatu testu-kate labur bat konparatuz.", @@ -1290,10 +1212,8 @@ "Missing media permissions, click the button below to request.": "Multimedia baimenak falda dira, sakatu beheko botoia baimenak eskatzeko.", "Request media permissions": "Eskatu multimedia baimenak", "Allow Peer-to-Peer for 1:1 calls": "Baimendu Peer-to-Peer biren arteko deietan", - "Your keys are not being backed up from this device.": "Ez da gakoen babes kopiarik sortzen gailu honetatik.", "Start using Key Backup": "Hasi gakoen babes-kopia egiten", "Restore from Backup": "Berrezarri babes-kopia", - "This device is backing up your keys. ": "Gailu honek zure gakoen babes-kopia egiten du. ", "Back up your keys before signing out to avoid losing them.": "Egin gakoen babes-kopia bat saioa amaitu aurretik, galdu nahi ez badituzu.", "Backing up %(sessionsRemaining)s keys...": "%(sessionsRemaining)s gakoen babes-kopia egiten...", "All keys backed up": "Gako guztien babes.kopia egin da", @@ -1319,37 +1239,27 @@ "Verify this user by confirming the following emoji appear on their screen.": "Baieztatu erabiltzaile hau beheko emojiak bere pantailan agertzen direla egiaztatuz.", "Verify this user by confirming the following number appears on their screen.": "Baieztatu erabiltzaile hau honako zenbakia bere pantailan agertzen dela egiaztatuz.", "Unable to find a supported verification method.": "Ezin izan da onartutako egiaztaketa metodorik aurkitu.", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "Segurtasun hobe baterako, hau aurrez aurre egitea edo fidagarria den beste komunikazio modu baten bidez egitea aholkatzen dugu.", "Thumbs up": "Ederto", "Hourglass": "Harea-erlojua", "Paperclip": "Klipa", - "Padlock": "Giltzarrapoa", "Pin": "Txintxeta", - "Your homeserver does not support device management.": "Zure hasiera-zerbitzariak ez du gailuen kudeaketa onartzen.", "Yes": "Bai", "No": "Ez", "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "E-mail bat bidali dizugu zure helbidea egiaztatzeko. Jarraitu hango argibideak eta gero sakatu beheko botoia.", "Email Address": "E-mail helbidea", "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Ziur al zaude? Zure zifratutako mezuak galduko dituzu zure gakoen babes-kopia egoki bat egiten ez bada.", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Zifratutako mezuak muturretik muturrerako zifratzearen bidez babestuak daude. Zuk eta hartzaileak edo hartzaileek irakurri ditzakezue mezu horiek, beste inork ez.", - "Backup has a signature from unknown device with ID %(deviceId)s.": "Babes-kopiak %(deviceId)s ID-a duen gailu ezezagun baten sinadura du.", - "This backup is trusted because it has been restored on this device": "Babes-kopia hau fidagarritzat jotzen da gailu honetan berrezarri delako", "Add an email address to configure email notifications": "Gehitu e-mail helbidea e-mail bidezko jakinarazpenak ezartzeko", "Unable to verify phone number.": "Ezin izan da telefono zenbakia egiaztatu.", "Verification code": "Egiaztaketa kodea", "Phone Number": "Telefono zenbakia", "Profile picture": "Profileko irudia", - "Upload profile picture": "Igo profileko irudia", "Display Name": "Pantaila-izena", "Room information": "Gelako informazioa", "Internal room ID:": "Gelaren barne ID-a:", "Room version": "Gela bertsioa", "Room version:": "Gela bertsioa:", "Developer options": "Garatzaileen aukerak", - "Some devices for this user are not trusted": "Erabiltzaile honen gailu batzuk ez dira fidagarritzat jotzen", - "Some devices in this encrypted room are not trusted": "Zifratutako gela honetako gailu batzuk ez dira fidagarritzat jotzen", - "All devices for this user are trusted": "Erabiltzaile honen gailu guztiak fidagarritzat jotzen dira", - "All devices in this encrypted room are trusted": "Zifratutako gela honetako gailu guztiak fidagarritzat jotzen dira", "Never lose encrypted messages": "Ez galdu inoiz zifratutako mezuak", "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Gela honetako mezuak muturretik muturrerako zifratzeaz babestuak daude. Zuek eta hartzaileek besterik ez daukazue mezu horiek irakurtzeko giltza.", "Composer": "Idazlekua", @@ -1366,7 +1276,6 @@ "Nothing appearing? Not all clients support interactive verification yet. .": "Ez da ezer agertzen? Bezero guztiek ez dute egiaztaketa interaktiborako euskarria. .", "Use two-way text verification": "Erabili bi zentzutako testu egiaztaketa", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Egiaztatu erabiltzaile hau fidagarritzat markatzeko. Honek bakea ematen dizu muturretik muturrerako zifratutako mezuak erabiltzean.", - "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "Erabiltzaile hau egiaztatzean fidagarri gisa markatuko da, eta zure gailua berarentzat fidagarritzat markatuko da ere.", "Waiting for partner to confirm...": "Kideak baieztatzearen zain...", "Incoming Verification Request": "Jasotako egiaztaketa eskaria", "I don't want my encrypted messages": "Ez ditut nire zifratutako mezuak nahi", @@ -1381,7 +1290,6 @@ "Hide": "Ezkutatu", "This homeserver does not support communities": "Hasiera-zerbitzari honek ez du komunitateetarako euskarria", "A verification email will be sent to your inbox to confirm setting your new password.": "Egiaztaketa e-mail bat bidaliko da zure sarrera-ontzira pasahitz berria ezarri nahi duzula berresteko.", - "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Gailu guztietan saioa amaitu duzu eta ez duzu push jakinarazpenik jasoko. Jakinarazpenak berriro aktibatzeko, hasi saioa gailuetan.", "This homeserver does not support login using email address.": "Hasiera-zerbitzari honek ez du e-mail helbidea erabiliz saioa hastea onartzen.", "Registration has been disabled on this homeserver.": "Izen ematea desaktibatuta dago hasiera-zerbitzari honetan.", "Unable to query for supported registration methods.": "Ezin izan da onartutako izen emate metodoei buruz galdetu.", @@ -1390,13 +1298,9 @@ "Set up with a Recovery Key": "Ezarri berreskuratze gakoarekin", "Please enter your passphrase a second time to confirm.": "Sartu zure pasaesaldia berriro baieztatzeko.", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "Berreskuratze gakoa badaezpadako bat da, zure zifratutako mezuetara sarbidea berreskuratzeko erabili dezakezu pasaesaldia ahaztuz gero.", - "Keep your recovery key somewhere very secure, like a password manager (or a safe)": "Gorde berreskuratze gakoa toki oso seguru batean, pasaesaldi kudeatzaile batean esaterako (edo gordailu kutxa batean)", "Your keys are being backed up (the first backup could take a few minutes).": "Zure gakoen babes-kopia egiten ari da (lehen babes-kopiak minutu batzuk behar ditzake).", "Success!": "Ongi!", "A new recovery passphrase and key for Secure Messages have been detected.": "Berreskuratze pasaesaldi eta mezu seguruen gako berriak antzeman dira.", - "This device is encrypting history using the new recovery method.": "Gailu honek historiala berreskuratze metodo berriarekin zifratzen du.", - "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "Gailu honek zure berreskuratze pasaesaldia eta mezu seguruen gakoa kendu direla antzeman du.", - "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "Nahi gabe egin baduzu hau, Mezu seguruak ezarri ditzakezu gailu honetan eta gailu honetako mezuen historiala berreskuratze metodo berriarekin zifratuko da.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Ez baduzu berreskuratze metodoa kendu, agian erasotzaile bat zure mezuen historialera sarbidea lortu nahi du. Aldatu kontuaren pasahitza eta ezarri berreskuratze metodo berri bat berehala ezarpenetan.", "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use this app with an existing Matrix account on a different homeserver.": "Zerbitzari pertsonalizatuaren aukera erabili dezakezu beste Matrix zerbitzarietan saioa hasteko beste hasiera-zerbitzari batek URLa adieraziz. Honek aplikazio hau beste Matrix zerbitzari batean duzun Matrix kontua erabiltzea baimentzen dizu.", "Changes your display nickname in the current room only": "Zure pantailako izena aldatzen du gela honetan bakarrik", @@ -1448,14 +1352,8 @@ "Please install Chrome, Firefox, or Safari for the best experience.": "Instalatu Chrome, Firefox, edo Safari esperientzia hobe baterako.", "Want more than a community? Get your own server": "Komunitate bat baino gehiago nahi duzu? Eskuratu zure zerbitzari propioa", "Could not load user profile": "Ezin izan da erabiltzaile-profila kargatu", - "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "Zure pasahitza aldatzeak zure gailu guztietako muturretik-muturrerako zifratzerako gakoak berrezarriko ditu, eta aurretik zifratutako mezuen historiala ezin izango da irakurri. Ezarri gakoen babes-kopia edo esportatu zure geletako gakoak beste gailu batetik pasahitza aldatu aurretik.", - "Room upgrade confirmation": "Gela eguneratzeko berrespena", - "Upgrading a room can be destructive and isn't always necessary.": "Gela bertsio-berritzeak ondorio suntsitzaileak izan ditzake eta ez da beti beharrezkoa.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Gela bertsio-berritzea aholkatzen da gelaren bertsioa ezegonkortzat jotzen denean. Gela bertsio ezegonkorrek akatsak izan ditzakete, falta diren ezaugarriak, edo segurtasun arazoak.", "You cannot modify widgets in this room.": "Ezin dituzu gela honetako trepetak aldatu.", "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s erabiltzaileak %(targetDisplayName)s geñara elkartzeko gonbidapena errefusatu du.", - "Enable desktop notifications for this device": "Gaitu mahaigaineko jakinarazpenak gailu honetan", - "Enable audible notifications for this device": "Gaitu jakinarazpen entzungarriak gailu honetan", "Upgrade this room to the recommended room version": "Bertsio-berritu gela hau aholkatutako bertsiora", "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Gela hau bertsio-berritzeak gelaren oraingo instantzia itzaliko du eta izen bereko beste gela berri bat sortuko du.", "Failed to revoke invite": "Gonbidapena indargabetzeak huts egin du", @@ -1475,10 +1373,7 @@ "The file '%(fileName)s' failed to upload.": "Huts egin du '%(fileName)s' fitxategia igotzean.", "The server does not support the room version specified.": "Zerbitzariak ez du emandako gela-bertsioa onartzen.", "Name or Matrix ID": "Izena edo Matrix ID-a", - "Email, name or Matrix ID": "E-mail, izena edo Matrix ID-a", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Gelak eguneratzeak zerbitzariaren aldeko gelaren prozesamenduan eragiten du besterik ez. Zure Riot bezeroarekin arazoak badituzu, eman arazoaren berri hemen .", "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.": "Abisua:: Gela eguneratzeak ez ditu automatikoki migratuko kideak gelaren bertsio berrira. Gela berrira daraman esteka bat argitaratuko da gelaren bertsio zaharrean, gelako kideek estekan sakatu beharko dute gela berrira elkartzeko.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Berretsi gela eguneratzearekin jarraitu nahi duzula, bertsiotik bertsiora.", "Changes your avatar in this current room only": "Zure abatarra aldatzen du gela honetan bakarrik", "Unbans user with given ID": "ID zehatz bat duen erabiltzaileari debekua altxatzen dio", "Adds a custom widget by URL to the room": "URL bidez trepeta pertsonalizatu bat gehitzen du gelara", @@ -1497,10 +1392,6 @@ "Show hidden events in timeline": "Erakutsi gertaera ezkutuak denbora-lerroan", "Low bandwidth mode": "Banda-zabalera gutxiko modua", "When rooms are upgraded": "Gelak eguneratzean", - "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Gailu honek ez du zure gakoen babes-kopia egiten, baina badago babes-kopia bat eta berreskuratu dezakezu aurrera jarraitzeko.", - "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Konektatu gailu hau gakoen babes-kopiara saioa amaitu aurretik, bakarrik gailu honetan egon daitezkeen gakoak galdu nahi ez badituzu.", - "Connect this device to Key Backup": "Konektatu gailu hau gakoen babes-kopiara", - "Backup has an invalid signature from this device": "Babes-kopiak gailu honen baliogabeko sinadura du", "this room": "gela hau", "View older messages in %(roomName)s.": "Ikusi %(roomName)s gelako mezu zaharragoak.", "Uploaded sound": "Igotako soinua", @@ -1611,7 +1502,6 @@ "%(oneUser)smade no changes %(count)s times|other": "%(oneUser)s erabiltzaileak ez du aldaketarik egin %(count)s aldiz", "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)s erabiltzaileak ez du aldaketarik egin", "Removing…": "Kentzen…", - "Clear all data on this device?": "Garbitu gailu honi buruzko datu guztiak?", "Clear all data": "Garbitu datu guztiak", "Your homeserver doesn't seem to support this feature.": "Antza zure hasiera-zerbitzariak ez du ezaugarri hau onartzen.", "Resend edit": "Birbidali edizioa", @@ -1622,13 +1512,10 @@ "You're signed out": "Saioa amaitu duzu", "Clear personal data": "Garbitu datu pertsonalak", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Esaguzu zer ez den behar bezala ibili edo, hobe oraindik, sortu GitHub txosten bat zure arazoa deskribatuz.", - "Clearing all data from this device is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Datu guztiak gailu honetatik ezabatzea behin betiko da. Zifratutako mezuak galdu egingo dira ez bada bere gakoen babes-kopia bat egin.", "Failed to re-authenticate due to a homeserver problem": "Berriro autentifikatzean huts egin du hasiera-zerbitzariaren arazo bat dela eta", "Failed to re-authenticate": "Berriro autentifikatzean huts egin du", - "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.": "Berreskuratu zure kontura sarbidea eta gailu honetan gordetako zifratze gakoak. Hauek gabe, ezin izango dituzu zure mezu seguruak irakurri beste gailuetatik.", "Enter your password to sign in and regain access to your account.": "Sartu zure pasahitza saioa hasteko eta berreskuratu zure kontura sarbidea.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Ezin duzu zure kontuan saioa hasi. Jarri kontaktuan zure hasiera zerbitzariko administratzailearekin informazio gehiagorako.", - "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.": "Abisua: Zure datu pertsonalak (zure zifratze gakoak barne) gailu honetan gordeko dira. Garbitu ezazu gailu hau erabiltzen bukatu duzunean edo beste kontu bat erabili nahi duzunean.", "Identity Server": "Identitate zerbitzaria", "Find others by phone or email": "Aurkitu besteak telefonoa edo e-maila erabiliz", "Be found by phone or email": "Izan telefonoa edo e-maila erabiliz aurkigarria", @@ -1640,7 +1527,6 @@ "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Eskatu zure hasiera-zerbitzariaren administratzaileari (%(homeserverDomain)s) TURN zerbitzari bat konfiguratu dezala deiek ondo funtzionatzeko.", "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.": "Bestela, turn.matrix.org zerbitzari publikoa erabili dezakezu, baina hau ez da hain fidagarria izango, eta zure IP-a partekatuko du zerbitzari horrekin. Hau ezarpenetan ere kudeatu dezakezu.", "Try using turn.matrix.org": "Saiatu turn.matrix.org erabiltzen", - "Failed to start chat": "Huts egin du txata hastean", "Messages": "Mezuak", "Actions": "Ekintzak", "Displays list of commands with usages and descriptions": "Aginduen zerrenda bistaratzen du, erabilera eta deskripzioekin", @@ -1669,7 +1555,6 @@ "Please enter verification code sent via text.": "Sartu SMS bidez bidalitako egiaztatze kodea.", "Discovery options will appear once you have added a phone number above.": "Aurkitze aukerak behin goian telefono zenbaki bat gehitu duzunean agertuko dira.", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "SMS mezu bat bidali zaizu +%(msisdn)s zenbakira. Sartu hemen mezu horrek daukan egiaztatze-kodea.", - "To verify that this device can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Gailu hau fidagarria dela egiaztatzeko, egiaztatu gailu horretako Erabiltzaile ezarpenetan ikusi dezakezun gakoa beheko hau bera dela:", "Command Help": "Aginduen laguntza", "No identity server is configured: add one in server settings to reset your password.": "Eza da identitate-zerbitzaririk konfiguratu, gehitu bat zerbitzari-ezarpenetan zure pasahitza berrezartzeko.", "This account has been deactivated.": "Kontu hau desaktibatuta dago.", @@ -1697,7 +1582,6 @@ "Changes the avatar of the current room": "Uneko gelaren abatarra aldatzen du", "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Erabili identitate-zerbitzari bat e-mail bidez gonbidatzeko. Sakatu jarraitu lehenetsitakoa erabiltzeko (%(defaultIdentityServerName)s) edo aldatu ezarpenetan.", "Use an identity server to invite by email. Manage in Settings.": "Erabili identitate-zerbitzari bat e-mail bidez gonbidatzeko. Kudeatu ezarpenetan.", - "Use the new, faster, composer for writing messages": "Erabili mezuak idazteko tresna berri eta azkarragoa", "Send read receipts for messages (requires compatible homeserver to disable)": "Bidali mezuentzako irakurragiriak (Hasiera-zerbitzari bateragarria behar da desgaitzeko)", "Show previews/thumbnails for images": "Erakutsi irudien aurrebista/iruditxoak", "Change identity server": "Aldatu identitate-zerbitzaria", @@ -1714,7 +1598,6 @@ "Clear cache and reload": "Garbitu cachea eta birkargatu", "Read Marker lifetime (ms)": "Orri-markagailuaren biziraupena (ms)", "Read Marker off-screen lifetime (ms)": "Orri-markagailuaren biziraupena pantailaz kanpo (ms)", - "A device's public name is visible to people you communicate with": "Gailuaren izen publikoa zurekin komunikatzen den jendeak ikusi dezake", "Error changing power level requirement": "Errorea botere-maila eskaria aldatzean", "An error occurred changing the room's power level requirements. Ensure you have sufficient permissions and try again.": "Errore bat gertatu da gelaren botere-maila eskariak aldatzean. Baieztatu baimen bahikoa duzula eta saiatu berriro.", "Error changing power level": "Errorea botere-maila aldatzean", @@ -1841,8 +1724,6 @@ "%(senderName)s placed a video call.": "%(senderName)s erabiltzaileak bideo-dei bat abiatu du.", "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s erabiltzaileak bideo-dei bat abiatu du. (Nabigatzaile honek ez du onartzen)", "Try out new ways to ignore people (experimental)": "Probatu jendea ez entzuteko modu berriak (esperimentala)", - "Send verification requests in direct message, including a new verification UX in the member panel.": "Bidali egiaztatze eskariak mezu zuzenetan, kide paneleko egiaztatze interfaze berria barne.", - "Enable cross-signing to verify per-user instead of per-device (in development)": "Gaitu zeharkako sinadura erabiltzaileko eta ez gailuko egiaztatzeko (garapenean)", "Enable local event indexing and E2EE search (requires restart)": "Gaitu gertaera lokalen indexazioa eta E2EE bilaketa (berrabiarazi behar da)", "Match system theme": "Bat egin sistemako gaiarekin", "My Ban List": "Nire debeku-zerrenda", @@ -1890,11 +1771,7 @@ "Failed to connect to integration manager": "Huts egin du integrazio kudeatzailera konektatzean", "Trusted": "Konfiantzazkoa", "Not trusted": "Ez konfiantzazkoa", - "Hide verified Sign-In's": "Ezkutatu baieztatuko saio hasierak", - "%(count)s verified Sign-In's|other": "Baieztatutako %(count)s saio hasiera", - "%(count)s verified Sign-In's|one": "Baieztatutako saio hasiera 1", "Direct message": "Mezu zuzena", - "Unverify user": "Kendu baieztatzea erabiltzaileari", "%(role)s in %(roomName)s": "%(role)s %(roomName)s gelan", "Messages in this room are end-to-end encrypted.": "Gela honetako mezuak ez daude muturretik muturrera zifratuta.", "Security": "Segurtasuna", @@ -1945,11 +1822,9 @@ "%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s erabiltzaileak zerbitzariak debekatzen dituen araua aldatu du %(oldGlob)s adierazpenetik %(newGlob)s adierazpenera, arrazoia: %(reason)s", "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s erabiltzaileak debeku arau bat aldatu du %(oldGlob)s adierazpenetik %(newGlob)s adierazpenera, arrazoia: %(reason)s", "Cross-signing and secret storage are enabled.": "Zeharkako sinadura eta biltegi sekretua gaituta daude.", - "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this device.": "Zure kontuak zeharkako sinaduraren identitatea biltegi sekretuan du, baina gailu honek oraindik ez du fidagarritzat.", "Cross-signing and secret storage are not yet set up.": "Zeharkako sinadura eta biltegi sekretua ez daude oraindik ezarrita.", "Bootstrap cross-signing and secret storage": "Abiatu zeharkako sinadura eta biltegi sekretua", "Cross-signing public keys:": "Zeharkako sinaduraren gako publikoak:", - "on device": "gailuan", "not found": "ez da aurkitu", "Cross-signing private keys:": "Zeharkako sinaduraren gako pribatuak:", "in secret storage": "biltegi sekretuan", @@ -1959,10 +1834,7 @@ "Backup has a valid signature from this user": "Babes-kopiak erabiltzaile honen baliozko sinadura bat du", "Backup has a invalid signature from this user": "Babes-kopiak erabiltzaile honen baliogabeko sinadura bat du", "Backup has a signature from unknown user with ID %(deviceId)s": "Babes-kopiak %(deviceId)s ID-a duen erabiltzaile ezezagun baten sinadura du", - "Backup has a signature from unknown device with ID %(deviceId)s": "Babes-kopiak %(deviceId)s ID-a duen gailu ezezagun baten sinadura du", - "Backup key stored in secret storage, but this feature is not enabled on this device. Please enable cross-signing in Labs to modify key backup state.": "Babes-kopiaren gakoa biltegi sekretuan gorde da, gaina ezaugarri hau ez dago aktibatuta gailu honetan. Gaitu zeharkako sinadura laborategian babes-kopiaren egoera aldatzeko.", "Backup key stored: ": "Babes-kopiaren gakoa gordeta: ", - "Start using Key Backup with Secure Secret Storage": "Hasi gakoen babes-kopia erabiltzen biltegi sekretu seguruarekin", "Cross-signing": "Zeharkako sinadura", "This message cannot be decrypted": "Mezu hau ezin da deszifratu", "Unencrypted": "Zifratu gabe", @@ -1984,64 +1856,38 @@ "Enter secret storage passphrase": "Sartu biltegi sekretuko pasaesaldia", "Unable to access secret storage. Please verify that you entered the correct passphrase.": "Ezin izan da biltegi sekretura sartu. Egiaztatu pasaesaldi zuzena idatzi duzula.", "Warning: You should only access secret storage from a trusted computer.": "Abisua: Biltegi sekretura ordenagailu fidagarri batetik konektatu beharko zinateke beti.", - "Access your secure message history and your cross-signing identity for verifying other devices by entering your passphrase.": "Atzitu zure mezu seguruen historiala eta zeharkako sinaduraren identitatea beste gailuak egiaztatzeko zure pasa-esaldia sartuz.", "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.": "Zure pasa-esaldia ahaztu baduzu berreskuratze gakoa erabili dezakezu edo berreskuratze aukera berriak ezarri ditzakezu.", "Enter secret storage recovery key": "Sartu biltegi sekretuko berreskuratze-gakoa", "Unable to access secret storage. Please verify that you entered the correct recovery key.": "Ezin izan da biltegi sekretura sartu. Egiaztatu berreskuratze-gako zuzena sartu duzula.", - "Access your secure message history and your cross-signing identity for verifying other devices by entering your recovery key.": "Atzitu zure mezu seguruen historiala eta zeharkako sinaduraren identitatea beste gailuak egiaztatzeko zure pasa-esaldia sartuz.", "If you've forgotten your recovery key you can .": "Zure berreskuratze-gakoa ahaztu baduzu ditzakezu.", "Warning: You should only set up key backup from a trusted computer.": "Abisua:: Gakoen babes-kopia fidagarria den gailu batetik egin beharko zenuke beti.", "If you've forgotten your recovery key you can ": "Zure berreskuratze-gakoa ahaztu baduzu ditzakezu", "Notification settings": "Jakinarazpenen ezarpenak", "User Status": "Erabiltzaile-egoera", - "Warning: You should only set up secret storage from a trusted computer.": "Abisua: Biltegi sekretura ordenagailu fidagarri batetik konektatu beharko zinateke beti.", - "We'll use secret storage to optionally store an encrypted copy of your cross-signing identity for verifying other devices and message keys on our server. Protect your access to encrypted messages with a passphrase to keep it secure.": "Biltegi sekretua erabiliko dugu, aukeran, beste gailuak egiaztatzeko zure zeharkako sinaduraren identitatearen eta mezuen gakoen kopia zifratu bat zure zerbitzarian gordetzeko. Babestu zure mezu zifratuetara sarbidea pasa.esaldi batekin seguru mantentzeko.", "Set up with a recovery key": "Ezarri berreskuratze gakoarekin", "As a safety net, you can use it to restore your access to encrypted messages if you forget your passphrase.": "Aukeran, berreskuratze pasa-esaldia ahazten baduzu, zure zifratutako mezuak berreskuratzeko erabili dezakezu.", "As a safety net, you can use it to restore your access to encrypted messages.": "Badaezpada, zure zifratutako mezuen historiala berreskuratzeko erabili dezakezu.", "Keep your recovery key somewhere very secure, like a password manager (or a safe).": "Gorde zure berreskuratze gakoa toki oso seguruan, esaterako pasahitz kudeatzaile batean (edo gordailu kutxan).", "Your recovery key has been copied to your clipboard, paste it to:": "Zure berreskuratze gakoa arbelera kopiatu da, itsatsi hemen:", "Your recovery key is in your Downloads folder.": "Zure berreskuratze gakoa zure Deskargak karpetan dago.", - "Your access to encrypted messages is now protected.": "Zure zifratutako mezuetara sarbidea babestuta dago.", - "Without setting up secret storage, you won't be able to restore your access to encrypted messages or your cross-signing identity for verifying other devices if you log out or use another device.": "Mezu seguruen berreskuratzea ezartzen ez bada, ezin izango duzu zure zifratutako mezuen historiala edo beste gailuak egiaztatzeko zeharkako sinadura berreskuratu saioa amaitzen baduzu edo beste gailu bat erabiltzen baduzu.", - "Set up secret storage": "Ezarri biltegi sekretua", - "Secure your encrypted messages with a passphrase": "Babestu zure zifratutako mezuak pasa-esaldi batekin", "Storing secrets...": "Sekretuak gordetzen...", "Unable to set up secret storage": "Ezin izan da biltegi sekretua ezarri", "The message you are trying to send is too large.": "Bidali nahi duzun mezua handiegia da.", - "This user has not verified all of their devices.": "Erabiltzaileak ez ditu bere gailu guztiak egiaztatu.", - "You have not verified this user. This user has verified all of their devices.": "Ez duzu erabiltzaile hau egiaztatu. Erabiltzaile honek bere gailu guztiak egiaztatu ditu.", - "You have verified this user. This user has verified all of their devices.": "Erabiltzaile hau egiaztatu duzu. Erabiltzaile honek bere gailu guztiak egiaztatu ditu.", - "Some users in this encrypted room are not verified by you or they have not verified their own devices.": "Ez dituzu zifratutako gela honetako erabiltzaile batzuk egiaztatu, edo hauek ez dituzte bere gailu guztiak egiaztatu.", - "All users in this encrypted room are verified by you and they have verified their own devices.": "Zifratutako gela honetako erabiltzaile guztiak egiaztatu dituzu, eta hauek bere gailu guztiak egiaztatu dituzte.", "Language Dropdown": "Hizkuntza menua", "Help": "Laguntza", "Country Dropdown": "Herrialde menua", - "Secret Storage will be set up using your existing key backup details.Your secret storage passphrase and recovery key will be the same as they were for your key backup": "Biltegi sekretua zure oraingo gakoen babes-kopiaren xehetasunak erabiliz ezarriko da. Zure biltegi sekretuaren pasa-esaldia eta berreskuratze gakoa lehen gakoen babes-kopiarako ziren berdinak izango dira", - "Migrate from Key Backup": "Migratu gakoen babes-kopiatik", - "New DM invite dialog (under development)": "Mezu zuzen bidezko gonbidapen elkarrizketa-koadro berria (garapenean)", "Show info about bridges in room settings": "Erakutsi zubiei buruzko informazioa gelaren ezarpenetan", - "This bridge was provisioned by ": "Zubi hau erabiltzaileak hornitu du", "This bridge is managed by .": "Zubi hau erabiltzaileak kudeatzen du.", - "Bridged into , on ": " kanalera zubia, protokoloan", - "Connected to on ": " kanalera konektatuta, sarean", - "Connected via %(protocolName)s": "%(protocolName)s bidez konektatuta", - "Bridge Info": "Zubiaren informazioa", - "Below is a list of bridges connected to this room.": "Behean gela honetara konektatutako zubien informazioa dago.", "Show more": "Erakutsi gehiago", "Recent Conversations": "Azken elkarrizketak", "Direct Messages": "Mezu zuzenak", - "If you can't find someone, ask them for their username, or share your username (%(userId)s) or profile link.": "Ez baduzu baten bat aurkitzen, eska egiezu bere erabiltzaile-izena, edo eman egiezu zurea (%(userId)s) edo profilera esteka.", "Go": "Joan", "Suggestions": "Proposamenak", "Failed to find the following users": "Ezin izan dira honako erabiltzaile hauek aurkitu", "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "Honako erabiltzaile hauek agian ez dira existitzen edo baliogabeak dira, eta ezin dira gonbidatu: %(csvNames)s", "Show a presence dot next to DMs in the room list": "Erakutsi presentzia puntua mezu zuzenen ondoan gelen zerrendan", "Lock": "Blokeatu", - "Key Backup is enabled on your account but has not been set up from this session. To set up secret storage, restore your key backup.": "Gakoen babes-kopia gaituta dago zure kontuan baina ez da saio honetarako ezarri. Biltegi sekretua ezartzeko, berrezarri zure gakoen babes-kopia.", "Restore": "Berrezarri", - "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup": "Biltegi sekretua ezarriko da zure oraingo gakoen babes-kopiaren xehetasunak erabiliz. Zure biltegi sekretuaren pasa-esaldia eta berreskuratze gakoa lehen gakoen babes-kopiarako ziren berberak izango dira", - "Restore your Key Backup": "Berrezarri zure gakoen babes-kopia", "a few seconds ago": "duela segundo batzuk", "about a minute ago": "duela minutu bat inguru", "%(num)s minutes ago": "duela %(num)s minutu", @@ -2056,8 +1902,6 @@ "%(num)s hours from now": "hemendik %(num)s ordutara", "about a day from now": "hemendik egun batera", "%(num)s days from now": "hemendik %(num)s egunetara", - "New Session": "Saio berria", - "New invite dialog": "Gonbidapen elkarrizketa-koadro berria", "Other users may not trust it": "Beste erabiltzaile batzuk ez fidagarritzat jo lezakete", "Later": "Geroago", "Failed to invite the following users to chat: %(csvUsers)s": "Ezin izan dira honako erabiltzaile hauek gonbidatu txatera: %(csvUsers)s", @@ -2072,18 +1916,14 @@ "Session verified": "Saioa egiaztatuta", "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Zure saio berria orain egiaztatuta dago. Zure zifratutako mezuetara sarbidea du, eta beste erabiltzaileek fidagarri gisa ikusiko zaituzte.", "Done": "Egina", - "Without completing security on this device, it won’t have access to encrypted messages.": "Gailu honetan segurtasuna osatu ezean, ez du zifratutako mezuetara sarbiderik izango.", "Go Back": "Joan atzera", - "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup.": "Biltegi sekretua oraingo gakoen babeskopiaren xehetasunak erabiliz ezarriko da. Zure biltegi sekretuaren pasa-esaldia eta berreskuratze gakoa zure gakoen babes-kopiarako zenerabiltzanak izango dira.", "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s erabiltzaileak %(addedAddresses)s helbideak eta beste %(count)s gehitu dizkio gela honi", "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s erabiltzaileak %(removedAddresses)s helbideak eta beste %(count)s kendu dizkio gela honi", "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s erabiltzaileak %(countRemoved)s helbide kendu eta %(countAdded)s gehitu dizkio gela honi", "%(senderName)s turned on end-to-end encryption.": "%(senderName)s erabiltzaileak muturretik muturrera zifratzea aktibatu du.", "%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s erabiltzaileak muturretik muturrera zifratzea gaitu du (%(algorithm)s algoritmo ezezaguna).", - "Someone is using an unknown device": "Baten bat gailu ezezagun bat erabiltzen ari da", "This room is end-to-end encrypted": "Gela hau muturretik muturrera zifratuta dago", "Everyone in this room is verified": "Gelako guztiak egiaztatuta daude", - "Encrypted by a deleted device": "Ezabatutako gailu batek zifratua", "Invite only": "Gonbidapenez besterik ez", "Send a reply…": "Bidali erantzuna…", "Send a message…": "Bidali mezua…", @@ -2095,17 +1935,13 @@ "Send as message": "Bidali mezu gisa", "Verify User": "Egiaztatu erabiltzailea", "For extra security, verify this user by checking a one-time code on both of your devices.": "Segurtasun gehiagorako, egiaztatu erabiltzaile hau aldi-bakarrerako kode bat bi gailuetan egiaztatuz.", - "For maximum security, do this in person.": "Segurtasun gorenerako, egin hau aurrez aurre.", "Start Verification": "Hasi egiaztaketa", "If you can't find someone, ask them for their username, share your username (%(userId)s) or profile link.": "Ez baduzu baten bat aurkitzen, eskatu bere erabiltzaile-izena, partekatu zurea (%(userId)s) edo partekatu profilaren esteka.", "Enter your account password to confirm the upgrade:": "Sartu zure kontuaren pasa-hitza eguneraketa baieztatzeko:", "You'll need to authenticate with the server to confirm the upgrade.": "Zerbitzariarekin autentifikatu beharko duzu eguneraketa baieztatzeko.", - "Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Eguneratu gailu hau honek beste gailuak egiaztatu ahal izateko, horrela zifratutako mezuetara sarbidea emanez eta beste erabiltzaileentzat fidagarri gisa markatzeko.", - "Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Ezarri zifratzea gailu honetan honek beste gailuak egiaztatu ahal izateko, horrela zifratutako mezuetara sarbidea emanez eta beste erabiltzaileentzat fidagarri gisa markatzeko.", "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Babestu zure zifratze gakoak pasa-esaldi batekin. Segurtasun gorenerako hau eta zure kontuaren pasahitza desberdinak izan beharko lukete:", "Enter a passphrase": "Sartu pasa-esaldia", "Enter your passphrase a second time to confirm it.": "Sartu zure pasa-esaldia berriro hau baieztatzeko.", - "This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Gailu honek beste gailuak egiaztatu ditzake, horrela zifratutako mezuetara sarbidea emanez eta beste erabiltzaileentzat fidagarri gisa markatuz.", "Verify other users in their profile.": "Egiaztatu beste erabiltzaileak bere profiletan.", "Upgrade your encryption": "Eguneratu zure zifratzea", "Set up encryption": "Ezarri zifratzea", diff --git a/src/i18n/strings/fa.json b/src/i18n/strings/fa.json index 056aa9400c..badb785132 100644 --- a/src/i18n/strings/fa.json +++ b/src/i18n/strings/fa.json @@ -52,7 +52,6 @@ "Noisy": "پرسروصدا", "Collecting app version information": "درحال جمع‌آوری اطلاعات نسخه‌ی برنامه", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "آیا مطمئنید که می‌خواهید نام مستعار گپ %(alias)s را پاک و %(name)s را از فهرست حذف کنید؟", - "This will allow you to return to your account after signing out, and sign in on other devices.": "این به شما اجازه خواهد داد که پس از خروج به اکانت خود بازگردید و از سایر دستگاه‌ها وارد شوید.", "Cancel": "لغو", "Enable notifications for this account": "آگاه سازی با رایانامه را برای این اکانت فعال کن", "Messages containing keywords": "پیا‌م‌های دارای این کلیدواژه‌ها ", diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 38d7556f52..1d60b1af60 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -83,12 +83,8 @@ "Decline": "Hylkää", "Decryption error": "Virhe salauksen purkamisessa", "Default": "Oletus", - "Device already verified!": "Laite on jo varmennettu!", "Device ID": "Laitetunniste", - "Device ID:": "Laitetunniste:", "device id: ": "laitetunniste: ", - "Device key:": "Laiteavain:", - "Devices": "Laitteet", "Direct chats": "Suorat keskustelut", "Disable Notifications": "Ota ilmoitukset pois käytöstä", "Disinvite": "Peru kutsu", @@ -100,7 +96,6 @@ "Email address": "Sähköpostiosoite", "Emoji": "Emoji", "Enable Notifications": "Ota ilmoitukset käyttöön", - "Encrypted by an unverified device": "Varmentamattoman laiteen salaama", "End-to-end encryption information": "Osapuolten välisen salauksen tiedot", "Enter passphrase": "Syötä salasana", "Error decrypting attachment": "Virhe purettaessa liitteen salausta", @@ -129,7 +124,6 @@ "Filter room members": "Suodata huoneen jäseniä", "Forget room": "Unohda huone", "For security, this session has been signed out. Please sign in again.": "Turvallisuussyistä tämä istunto on kirjattu ulos. Ole hyvä ja kirjaudu uudestaan.", - "Hide Text Formatting Toolbar": "Piilota tekstinmuotoilutyökalupalkki", "Homeserver is": "Kotipalvelin on", "Identity Server is": "Identiteettipalvelin on", "I have verified my email address": "Olen varmistanut sähköpostiosoitteeni", @@ -140,9 +134,7 @@ "Incoming voice call from %(name)s": "Saapuva äänipuhelu käyttäjältä %(name)s", "Incorrect username and/or password.": "Virheellinen käyttäjätunnus ja/tai salasana.", "Incorrect verification code": "Virheellinen varmennuskoodi", - "Invalid alias format": "Aliaksen muoto on virheellinen", "Invalid Email Address": "Virheellinen sähköpostiosoite", - "Invite new room members": "Kutsu lisää jäseniä huoneeseen", "Invited": "Kutsuttu", "Invites": "Kutsut", "Invites user with given id to current room": "Kutsuu tunnuksen mukaisen käyttäjän huoneeseen", @@ -159,10 +151,6 @@ "Logout": "Kirjaudu ulos", "Low priority": "Alhainen prioriteetti", "Manage Integrations": "Hallinnoi integraatioita", - "Markdown is disabled": "Markdown on pois päältä", - "Markdown is enabled": "Markdown on päällä", - "matrix-react-sdk version:": "Matrix-react-sdk:n versio:", - "Message not sent due to unknown devices being present": "Viestiä ei lähetetty koska paikalla on tuntemattomia laitteita", "Moderator": "Moderaattori", "Name": "Nimi", "New passwords don't match": "Uudet salasanat eivät täsmää", @@ -181,7 +169,6 @@ "Only people who have been invited": "Vain kutsutut käyttäjät", "Password": "Salasana", "Passwords can't be empty": "Salasanat eivät voi olla tyhjiä", - "People": "Henkilöt", "Permissions": "Oikeudet", "Phone": "Puhelin", "Private Chat": "Yksityinen keskustelu", @@ -194,15 +181,12 @@ "Return to login screen": "Palaa kirjautumissivulle", "riot-web version:": "Riot-webin versio:", "Room Colour": "Huoneen väri", - "Room contains unknown devices": "Huone sisältää tuntemattomia laitteita", "Rooms": "Huoneet", "Save": "Tallenna", "Scroll to bottom of page": "Vieritä sivun loppuun", "Search failed": "Haku epäonnistui", "Searches DuckDuckGo for results": "Hakee DuckDuckGo:n avulla", "Send anyway": "Lähetä silti", - "Sender device information": "Lähettäjän laitteen tiedot", - "Send Invites": "Lähetä kutsut", "Server error": "Palvelinvirhe", "Session ID": "Istuntotunniste", "Sign in": "Kirjaudu sisään", @@ -210,7 +194,6 @@ "%(count)s of your messages have not been sent.|other": "Osaa viesteistäsi ei ole lähetetty.", "Someone": "Joku", "Start a chat": "Aloita keskustelu", - "Start Chat": "Aloita keskustelu", "Submit": "Lähetä", "This email address is already in use": "Tämä sähköpostiosoite on jo käytössä", "This email address was not found": "Sähköpostiosoitetta ei löytynyt", @@ -219,16 +202,12 @@ "This room": "Tämä huone", "This room is not accessible by remote Matrix servers": "Tähän huoneeseen ei pääse ulkopuolisilta Matrix-palvelimilta", "Unban": "Poista porttikielto", - "Undecryptable": "Salauksen purku ei ole mahdollista", "unencrypted": "salaamaton", - "Unencrypted message": "Salaamaton viesti", "unknown caller": "tuntematon soittaja", "unknown device": "tuntematon laite", "Unknown room %(roomId)s": "Tuntematon huone %(roomId)s", - "Unknown (user, device) pair:": "Tuntematon (käyttäjä, laite)-pari:", "Unmute": "Poista mykistys", "Unnamed Room": "Nimeämätön huone", - "Unrecognised command:": "Tuntematon komento:", "Unrecognised room alias:": "Tuntematon huonealias:", "Uploading %(filename)s and %(count)s others|zero": "Ladataan %(filename)s", "Uploading %(filename)s and %(count)s others|one": "Ladataan %(filename)s ja %(count)s muuta", @@ -243,14 +222,12 @@ "Invalid file%(extra)s": "Virheellinen tiedosto%(extra)s", "%(senderName)s invited %(targetName)s.": "%(senderName)s kutsui käyttäjän %(targetName)s.", "none": "Ei mikään", - "No devices with registered encryption keys": "Ei laitteita, joilla on rekisteröityjä salausavaimia", "No users have specific privileges in this room": "Kellään käyttäjällä ei ole erityisiä oikeuksia", "%(senderName)s requested a VoIP conference.": "%(senderName)s pyysi VoIP-konferenssia.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s asetti näyttönimekseen %(displayName)s.", "This room is not recognised.": "Huonetta ei tunnistettu.", "This doesn't appear to be a valid email address": "Tämä ei vaikuta olevan kelvollinen sähköpostiosoite", "This phone number is already in use": "Puhelinnumero on jo käytössä", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s otti osapuolten välisen salauksen käyttöön (algoritmi %(algorithm)s).", "Username invalid: %(errMessage)s": "Käyttäjätunnus ei kelpaa: %(errMessage)s", "Users": "Käyttäjät", "Verification": "Varmennus", @@ -266,7 +243,6 @@ "Warning!": "Varoitus!", "Who can access this room?": "Ketkä pääsevät tähän huoneeseen?", "Who can read history?": "Ketkä voivat lukea historiaa?", - "Who would you like to communicate with?": "Kenen kanssa haluaisit kommunikoida?", "You are already in a call.": "Sinulla on jo puhelu käynnissä.", "You are not in this room.": "Et ole tässä huoneessa.", "You do not have permission to do that in this room.": "Sinulla ei ole oikeutta tehdä tuota tässä huoneessa.", @@ -299,8 +275,6 @@ "(~%(count)s results)|one": "(~%(count)s tulos)", "(~%(count)s results)|other": "(~%(count)s tulosta)", "Active call": "Aktiivinen puhelu", - "bold": "lihavoitu", - "italic": "kursiivi", "Please select the destination room for this message": "Ole hyvä ja valitse vastaanottava huone tälle viestille", "New Password": "Uusi salasana", "Start automatically after system login": "Käynnistä automaattisesti käyttöjärjestelmään kirjautumisen jälkeen", @@ -320,9 +294,6 @@ "Confirm Removal": "Varmista poistaminen", "Unknown error": "Tuntematon virhe", "Incorrect password": "Virheellinen salasana", - "Device name": "Laitenimi", - "Device key": "Laiteavain", - "Verify device": "Varmenna laite", "I verify that the keys match": "Varmistin, että avaimet vastaavat toisiaan", "Unable to restore session": "Istunnon palautus epäonnistui", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s poisti huoneen nimen.", @@ -338,8 +309,6 @@ "Publish this room to the public in %(domain)s's room directory?": "Julkaise tämä huone verkkotunnuksen %(domain)s huoneluettelossa?", "Missing room_id in request": "room_id puuttuu kyselystä", "Missing user_id in request": "user_id puuttuu kyselystä", - "Never send encrypted messages to unverified devices from this device": "Älä koskaan lähetä salattuja viestejä varmentamattomiin laitteisiin tältä laitteelta", - "Never send encrypted messages to unverified devices in this room from this device": "Älä koskaan lähetä salattuja viestejä tässä huoneessa oleviin varmentamattomiin laitteisiin tältä laitteelta", "New address (e.g. #foo:%(localDomain)s)": "Uusi osoite (esim. #foo:%(localDomain)s)", "Revoke Moderator": "Poista moderaattorioikeudet", "%(targetName)s rejected the invitation.": "%(targetName)s hylkäsi kutsun.", @@ -354,20 +323,17 @@ "Send Reset Email": "Lähetä salasanan palautusviesti", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s lähetti kuvan.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s kutsui käyttäjän %(targetDisplayName)s liittymään huoneeseen.", - "Show Text Formatting Toolbar": "Näytä tekstinmuotoilupalkki", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Näytä aikaleimat 12 tunnin muodossa (esim. 2:30pm)", "Signed Out": "Uloskirjautunut", "Start authentication": "Aloita tunnistus", "Success": "Onnistui", "The phone number entered looks invalid": "Syötetty puhelinnumero näyttää virheelliseltä", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Syöttämäsi allekirjoitusavain vastaa käyttäjän %(userId)s laitteelta %(deviceId)s saamaasi allekirjoitusavainta. Laite on merkitty varmennetuksi.", "Unable to add email address": "Sähköpostiosoitteen lisääminen epäonnistui", "Unable to remove contact information": "Yhteystietojen poistaminen epäonnistui", "Unable to verify email address.": "Sähköpostin vahvistaminen epäonnistui.", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s poisti porttikiellon käyttäjältä %(targetName)s.", "Unable to capture screen": "Ruudun kaappaus epäonnistui", "Unable to enable Notifications": "Ilmoitusten käyttöönotto epäonnistui", - "Unable to load device list": "Laitelistan lataaminen epäonnistui", "Uploading %(filename)s and %(count)s others|other": "Ladataan %(filename)s ja %(count)s muuta", "Upload Failed": "Lataus epäonnistui", "Upload file": "Lataa tiedosto", @@ -376,10 +342,8 @@ "Use compact timeline layout": "Käytä tiivistä aikajanaa", "User ID": "Käyttäjätunnus", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s vaihtoi aiheeksi \"%(topic)s\".", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Salasanan muuttaminen nollaa myös osapuolten välisen salauksen avaimet kaikilla laitteilla. Tällöin vanhojen viestien lukeminen ei ole enää mahdollista, ellet ensin tallenna huoneavaimia ja tuo niitä takaisin jälkeenpäin. Tähän tulee tulevaisuudessa parannusta.", "Define the power level of a user": "Määritä käyttäjän oikeustaso", "Failed to change power level": "Oikeustason muuttaminen epäonnistui", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' ei ole kelvollinen muoto aliakselle", "Please check your email and click on the link it contains. Once this is done, click continue.": "Ole hyvä ja tarkista sähköpostisi ja seuraa sen sisältämää linkkiä. Kun olet valmis, paina jatka.", "Power level must be positive integer.": "Oikeustason pitää olla positiivinen kokonaisluku.", "Server may be unavailable, overloaded, or search timed out :(": "Palvelin saattaa olla saavuttamattomissa, ylikuormitettu tai haku kesti liian kauan :(", @@ -393,10 +357,7 @@ "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (oikeustaso %(powerLevelNumber)s)", "Verification Pending": "Varmennus odottaa", "(could not connect media)": "(mediaa ei voitu yhdistää)", - "WARNING: Device already verified, but keys do NOT MATCH!": "VAROITUS: Laite on jo varmennettu mutta avaimet eivät vastaa toisiaan!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "VAROITUS: AVAIMEN VARMENNUS EPÄONNISTUI! Käyttäjän %(userId)s ja laitteen %(deviceId)s allekirjoitusavain on \"%(fprint)s\" joka ei vastaa annettua avainta \"%(fingerprint)s\". Tämä saattaa tarkoittaa että viestintäsi siepataan!", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s veti takaisin käyttäjän %(targetName)s kutsun.", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Salasanan vaihtaminen onnistui. Et saa push-ilmoituksia muilla laitteilla ennen kuin kirjaudut niihin takaisin", "You seem to be in a call, are you sure you want to quit?": "Sinulla näyttää olevan puhelu kesken. Haluatko varmasti lopettaa?", "You seem to be uploading files, are you sure you want to quit?": "Näytät lataavan tiedostoja. Oletko varma että haluat lopettaa?", "Jan": "tammi", @@ -412,9 +373,6 @@ "Nov": "marras", "Dec": "joulu", "To continue, please enter your password.": "Ole hyvä ja syötä salasanasi jatkaaksesi.", - "Verifies a user, device, and pubkey tuple": "Varmentaa käyttäjän, laitteen ja julkisen avaimen kolmikon", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" sisältä laitteita joita et ole nähnyt aikaisemmin.", - "Unknown devices": "Tuntemattomia laitteita", "Unknown Address": "Tuntematon osoite", "Unverify": "Kumoa varmennus", "Verify...": "Varmenna...", @@ -445,10 +403,7 @@ "Start verification": "Aloita varmennus", "Share without verifying": "Jaa ilman varmennusta", "Ignore request": "Jätä pyyntö huomioimatta", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Lisäsit laitteen '%(displayName)s' joka pyytää salausavaimia.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Sinun varmentamaton laitteesi '%(displayName)s' pyytää salausavaimia.", "Encryption key request": "Salausavainpyyntö", - "Loading device info...": "Ladataan laitetiedot...", "Example": "Esimerkki", "Create": "Luo", "Failed to upload image": "Kuvan lataaminen epäonnistui", @@ -611,7 +566,6 @@ "Notify the whole room": "Ilmoita koko huoneelle", "Room Notification": "Huoneilmoitus", "Call Failed": "Puhelu epäonnistui", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Huoneessa on tuntemattomia laitteita: jos jatkat varmentamatta niitä, joku voi kuunnella puheluasi.", "Review Devices": "Näytä laitteet", "Call Anyway": "Soita silti", "Answer Anyway": "Vastaa silti", @@ -629,8 +583,6 @@ "%(widgetName)s widget added by %(senderName)s": "%(senderName)s lisäsi pienoisohjelman %(widgetName)s", "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s poisti pienoisohjelman %(widgetName)s", "Send": "Lähetä", - "Delete %(count)s devices|other": "Poista %(count)s laitetta", - "Delete %(count)s devices|one": "Poista laite", "Ongoing conference call%(supportedText)s.": "Menossa oleva ryhmäpuhelu %(supportedText)s.", "%(duration)ss": "%(duration)s s", "%(duration)sm": "%(duration)s m", @@ -707,8 +659,6 @@ "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s vaihtoi profiilikuvansa", "%(items)s and %(count)s others|other": "%(items)s ja %(count)s muuta", "%(items)s and %(count)s others|one": "%(items)s ja yksi muu", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Varmistaaksesi, että tähän laitteeseen voidaan luottaa, ota yhteyttä laitteen haltijaan jollain muulla tavalla (esim. kasvotusten tai puhelimitse) ja pyydä häntä varmistamaan, että hänen laitteensa käyttäjäasetuksissa näkyy sama avain kuin alla:", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Jos avain täsmää, valitse painike alla. Jos avain ei täsmää, niin joku muu salakuuntelee laitetta ja haluat todennäköisesti painaa estopainiketta.", "Old cryptography data detected": "Vanhaa salaustietoa havaittu", "Warning": "Varoitus", "Access Token:": "Pääsykoodi:", @@ -758,7 +708,6 @@ "Resend": "Lähetä uudelleen", "Collecting app version information": "Haetaan sovelluksen versiotietoja", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Poista huonealias %(alias)s ja poista %(name)s luettelosta?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Tämä antaa sinun palata tilillesi uloskirjautumisen jälkeen sekä kirjautua muilla laitteilla.", "Keywords": "Avainsanat", "Enable notifications for this account": "Ota käyttöön ilmoitukset tälle tilille", "Invite to this community": "Kutsu tähän yhteisöön", @@ -935,7 +884,6 @@ "Book": "Kirja", "Pencil": "Lyijykynä", "Paperclip": "Klemmari", - "Padlock": "Riippulukko", "Key": "Avain", "Hammer": "Vasara", "Telephone": "Puhelin", @@ -971,8 +919,6 @@ "Go back": "Takaisin", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Luo yhteisö tuodaksesi yhteen käyttäjät ja huoneet! Luo mukautettu kotisivu rajataksesi paikkasi Matrix-universumissa.", "Room avatar": "Huoneen kuva", - "Upload room avatar": "Lähetä huoneen kuva", - "No room avatar": "Huoneella ei ole kuvaa", "Main address": "Pääosoite", "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.": "Kun joku asettaa osoitteen linkiksi viestiinsä, URL-esikatselu voi näyttää tietoja linkistä kuten otsikon, kuvauksen ja kuvan verkkosivulta.", "Link to most recent message": "Linkitä viimeisimpään viestiin", @@ -988,7 +934,6 @@ "Hide Stickers": "Piilota tarrat", "Show Stickers": "Näytä tarrat", "Profile picture": "Profiilikuva", - "Upload profile picture": "Lataa profiilikuva palvelimelle", "Set a new account password...": "Aseta uusi salasana tilille...", "Set a new status...": "Aseta uusi tila...", "Not sure of your password? Set a new one": "Etkö ole varma salasanastasi? Aseta uusi salasana", @@ -1090,10 +1035,8 @@ "Email Address": "Sähköpostiosoite", "Yes": "Kyllä", "No": "Ei", - "Your homeserver does not support device management.": "Kotipalvelimesi ei tue laitehallintaa.", "Please help improve Riot.im by sending anonymous usage data. This will use a cookie (please see our Cookie Policy).": "Auta parantamaan Riot.im:ää lähettämällä käyttötietoja anonyymisti. Tämä vaatii toimiakseen evästeen (lue evästekäytäntö).", "Elephant": "Norsu", - "This device is backing up your keys. ": "Tämä laite on varmuuskopioimassa avaimiasi. ", "Add an email address to configure email notifications": "Lisää sähköpostiosoite määrittääksesi sähköposti-ilmoitukset", "Chat with Riot Bot": "Keskustele Riot-botin kanssa", "You'll lose access to your encrypted messages": "Menetät pääsyn salattuihin viesteihisi", @@ -1173,17 +1116,8 @@ "Back up your keys before signing out to avoid losing them.": "Varmuuskopioi avaimesi ennen kuin kirjaudut ulos välttääksesi avainten menetyksen.", "Backing up %(sessionsRemaining)s keys...": "Varmuuskopioidaan %(sessionsRemaining)s avainta…", "All keys backed up": "Kaikki avaimet on varmuuskopioitu", - "Backup has a signature from unknown device with ID %(deviceId)s.": "Varmuuskopiossa on allekirjoitus tuntemattomasta laitteesta ID:llä %(deviceId)s.", - "Backup has a valid signature from this device": "Varmuuskopiossa on pätevä allekirjoitus tästä laitteesta", - "Backup has a valid signature from verified device ": "Varmuuskopiossa on pätevä allekirjoitus varmennetusta laitteesta ", - "Backup has a valid signature from unverified device ": "Varmuuskopiossa on pätevä allekirjoitus varmentamattomasta laitteesta ", - "Backup has an invalid signature from verified device ": "Varmuuskopiossa on epäkelpo allekirjoitus varmennetusta laitteesta ", - "Backup has an invalid signature from unverified device ": "Varmuuskopiossa on epäkelpo allekirjoitus varmentamattomasta laitteesta ", - "Backup is not signed by any of your devices": "Yksikään laitteistasi ei ole allekirjoittanut varmuuskopiota", - "This backup is trusted because it has been restored on this device": "Tämä varmuuskopio on luotettu, koska se on palautettu tähän laitteeseen", "Backup version: ": "Varmuuskopion versio: ", "Algorithm: ": "Algoritmi: ", - "Your keys are not being backed up from this device.": "Avaimesi eivät ole varmuuskopioituna tästä laitteesta.", "Start using Key Backup": "Aloita avainvarmuuskopion käyttö", "Unable to verify phone number.": "Puhelinnumeron vahvistaminen epäonnistui.", "Verification code": "Varmennuskoodi", @@ -1200,7 +1134,6 @@ "Key backup": "Avainvarmuuskopio", "Missing media permissions, click the button below to request.": "Mediaoikeuksia puuttuu. Klikkaa painikkeesta pyytääksesi oikeuksia.", "Request media permissions": "Pyydä mediaoikeuksia", - "Some devices for this user are not trusted": "Jotkut tämän käyttäjän laitteista eivät ole luotettuja", "Manually export keys": "Vie avaimet käsin", "Share User": "Jaa käyttäjä", "Share Community": "Jaa yhteisö", @@ -1216,7 +1149,6 @@ "Show avatars in user and room mentions": "Näytä profiilikuvat käyttäjä- ja huonemaininnoissa", "Order rooms in the room list by most important first instead of most recent": "Järjestä huonelista tärkein ensin viimeisimmän sijasta", "Got It": "Ymmärretty", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "Parhaan turvallisuuden takaamiseksi suosittelemme, että teet tämän kasvotusten tai muun luotetun viestintäkeinon avulla.", "Scissors": "Sakset", "Which officially provided instance you are using, if any": "Mitä virallisesti saatavilla olevaa instanssia käytät, jos mitään", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s %(day)s. %(monthName)s %(fullYear)s", @@ -1227,27 +1159,12 @@ "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "%(senderDisplayName)s otti käyttöön tyylin ryhmälle %(newGroups)s ja poisti käytöstä tyylin ryhmältä %(oldGroups)s tässä huoneessa.", "Enable widget screenshots on supported widgets": "Ota sovelmien kuvankaappaukset käyttöön tuetuissa sovelmissa", "Legal": "Lakitekstit", - "Some devices in this encrypted room are not trusted": "Jotkut laitteet tässä salatussa huoneessa eivät ole luotettuja", - "All devices for this user are trusted": "Kaikki tämän käyttäjän laitteista ovat luotettuja", - "All devices in this encrypted room are trusted": "Kaikki laitteet tässä salatussa huoneessa ovat luotettuja", "This event could not be displayed": "Tätä tapahtumaa ei voitu näyttää", - "Your key share request has been sent - please check your other devices for key share requests.": "Avaimen jakopyyntösi on lähetetty. Tarkista muut laitteesi avaimen jakopyyntöä varten.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Avaimen jakopyynnöt lähetetään automaattisesti muihin laitteisiin. Jos olet hylännyt tai jättänyt huomiotta avaimen jakopyynönn toisella laitteellasi, klikkaa tästä pyytääksesi avaimia tälle istunnolle uudestaan.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Jos muut laitteesi eivät sisällä avainta tälle viestille, et pysty purkamaan viestin salausta.", "Key request sent.": "Avainpyyntö lähetetty.", - "Re-request encryption keys from your other devices.": "Pyydä uudelleen salausavaimia muilta laitteiltasi.", "Demote yourself?": "Alenna itsesi?", "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.": "Et voi perua tätä muutosta, koska olet alentamassa itseäsi. Jos olet viimeinen oikeutettu henkilö tässä huoneessa, oikeuksia ei voi enää saada takaisin.", "Demote": "Alenna", - "deleted": "poistettu", - "underlined": "alleviivattu", - "inline-code": "koodinpätkä", - "block-quote": "lainaus", - "bulleted-list": "lista", - "numbered-list": "numeroitu lista", "This room has been replaced and is no longer active.": "Tämä huone on korvattu, eikä se ole enää aktiivinen.", - "Unable to reply": "Vastaaminen on mahdotonta", - "At this time it is not possible to reply with an emote.": "Emojilla vastaaminen ei ole nyt mahdollista.", "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "%(displayName)s (%(userName)s) näki %(dateTime)s", "Replying": "Vastataan", "System Alerts": "Järjestelmähälytykset", @@ -1318,7 +1235,6 @@ "Waiting for %(userId)s to confirm...": "Odotetaan, että %(userId)s hyväksyy...", "Use two-way text verification": "Käytä kahdensuuntaista tekstivarmennusta", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Varmenna tämä käyttäjä merkitäksesi hänet luotetuksi. Käyttäjiin luottaminen antaa sinulle ylimääräistä mielenrauhaa käyttäessäsi osapuolten välistä salausta.", - "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "Tämän käyttäjän varmentaminen merkitsee hänen laitteensa luotetuksi sekä merkitsee sinun laitteesi luotetuksi hänelle.", "Waiting for partner to confirm...": "Odotetaan, että toinen osapuoli varmistaa...", "Incoming Verification Request": "Saapuva varmennuspyyntö", "You've previously used Riot 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, Riot needs to resync your account.": "Olet aikaisemmin käytttänyt Riotia laitteella %(host)s, jossa oli jäsenten laiska lataus käytössä. Tässä versiossa laiska lataus on pois käytöstä. Koska paikallinen välimuisti ei ole yhteensopiva näiden kahden asetuksen välillä, Riotin täytyy synkronoida tilisi tiedot uudelleen.", @@ -1333,8 +1249,6 @@ "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Selaimen varaston tyhjentäminen saattaa korjata ongelman, mutta kirjaa sinut samalla ulos ja estää sinua lukemasta salattuja keskusteluita.", "A username can only contain lower case letters, numbers and '=_-./'": "Käyttäjätunnus voi sisältää vain pieniä kirjaimia, numeroita ja merkkejä ”=_-./”", "COPY": "Kopioi", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Estät tällä hetkellä varmentamattomia laitteita; jotta voit lähettää viestejä näihin laitteisiin, sinun täytyy varmentaa ne.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Suosittelemme, että käyt varmennusprosessin läpi jokaisella laitteella varmistaaksesi, että ne kuuluvat oikeille omistajilleen, mutta voit lähettää viestin uudelleen varmentamatta, jos niin haluat.", "Unable to load backup status": "Varmuuskopioinnin tilan lataaminen epäonnistui", "Recovery Key Mismatch": "Palautusavaimet eivät täsmää", "Backup could not be decrypted with this key: please verify that you entered the correct recovery key.": "Varmuuskopiota ei voitu purkaa tällä avaimella. Tarkastathan, että syötit oikean palautusavaimen.", @@ -1347,7 +1261,6 @@ "Access your secure message history and set up secure messaging by entering your recovery passphrase.": "Pääse turvattuun viestihistoriaasi ja ota käyttöön turvallinen viestintä syöttämällä palautuksen salalauseesi.", "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options": "Jos olet unohtanut palautuksen salalauseesi, voit käyttää palautusavaintasi tai ottaa käyttöön uuden palautustavan", "Access your secure message history and set up secure messaging by entering your recovery key.": "Pääse turvattuun viestihistoriaasi ja ota käyttöön turvallinen viestintä syöttämällä palautusavaimesi.", - "If you've forgotten your recovery passphrase you can ": "Jos olet unohtanut palautuksen salalauseesi, voit ", "Share Permalink": "Jaa ikilinkki", "Collapse Reply Thread": "Supista vastaussäie", "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use this app with an existing Matrix account on a different homeserver.": "Voit käyttää mukautettuja palvelinasetuksia kirjautuaksesi toiselle Matrix-palvelimelle. Tämä sallii tämän sovelluksen käytön toisella kotipalvelimella olevalla Matrix-tilillä.", @@ -1383,7 +1296,6 @@ "Review terms and conditions": "Lue käyttöehdot", "Did you know: you can use communities to filter your Riot.im experience!": "Tiesitkö: voit käyttää yhteisöjä suodattaaksesi Riot.im-kokemustasi!", "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Asettaaksesi suodattimen, vedä yhteisön kuva vasemmalla olevan suodatinpaneelin päälle. Voit klikata suodatinpaneelissa olevaa yhteisön kuvaa, jotta näet vain huoneet ja henkilöt, jotka liittyvät kyseiseen yhteisöön.", - "Show devices, send anyway or cancel.": "Näytä laitteet, lähetä silti tai peruuta.", "You can't send any messages until you review and agree to our terms and conditions.": "Et voi lähettää viestejä ennen kuin luet ja hyväksyt käyttöehtomme.", "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.": "Viestiäsi ei lähetetty, koska tämä kotipalvelin on saavuttanut kuukausittaisten aktiivisten käyttäjien rajan. Ota yhteyttä palvelun ylläpitäjään jatkaaksesi palvelun käyttämistä.", "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.": "Viestiäsi ei lähetetty, koska tämä kotipalvelin on ylittänyt resurssirajan. Ota yhteyttä palvelun ylläpitäjään jatkaaksesi palvelun käyttämistä.", @@ -1391,7 +1303,6 @@ "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Lähetä viesti uudelleen tai peruuta viesti.", "Could not load user profile": "Käyttäjäprofiilia ei voitu ladata", "Your Matrix account on %(serverName)s": "Matrix-tilisi palvelimella %(serverName)s", - "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Olet kirjautunut ulos kaikista laitteista etkä enää saa push-ilmoituksia. Laittaaksesi ilmoitukset uudestaan päälle, kirjaudu uudelleen kullekin laitteelle.", "General failure": "Yleinen virhe", "This homeserver does not support login using email address.": "Tämä kotipalvelin ei tue sähköpostiosoitteella kirjautumista.", "Please contact your service administrator to continue using this service.": "Ota yhteyttä palvelun ylläpitäjään jatkaaksesi palvelun käyttöä.", @@ -1413,17 +1324,11 @@ "Your keys are being backed up (the first backup could take a few minutes).": "Avaimiasi varmuuskopioidaan (ensimmäinen varmuuskopio voi viedä muutaman minuutin).", "Unable to create key backup": "Avaimen varmuuskopiota ei voi luoda", "A verification email will be sent to your inbox to confirm setting your new password.": "Ottaaksesi käyttöön uuden salasanasi, seuraa ohjeita sinulle lähetettävässä vahvistussähköpostissa.", - "Room upgrade confirmation": "Huoneen päivitysvarmistus", - "Upgrading a room can be destructive and isn't always necessary.": "Huoneen päivittäminen saattaa tuhota jotain, eikä se aina ole tarpeellista.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Huonepäivityksiä suositellaan yleensä silloin, kun huoneen versio katsotaan epävakaaksi. Epävakaissa versioissa saattaa olla virheitä, puuttuvia ominaisuuksia tai tietoturvahaavoittuvuuksia.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Huonepäivitykset yleensä vaikuttavat vain huoneen palvelinpuolen käsittelyyn. Jos sinulla on ongelmia Riot-asiakasohjelmasi kanssa, tee virheilmoitus osoitteessa .", "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.": "Varoitus: huoneen päivittäminen ei automaattisesti siirrä huoneen jäseniä huoneen uuteen versioon. Liitämme vanhaan huoneeseen linkin, joka osoittaa uuteen, päivitettyyn huoneeseen. Huoneen jäsenten täytyy klikata linkkiä liittyäkseen uuteen huoneeseen.", "Adds a custom widget by URL to the room": "Lisää huoneeseen määritetyssä osoitteessa olevan sovelman", "Please supply a https:// or http:// widget URL": "Lisää sovelman osoitteen alkuun https:// tai http://", "You cannot modify widgets in this room.": "Et voi muokata tämän huoneen sovelmia.", "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s kumosi henkilön %(targetDisplayName)s kutsun liittyä tähän huoneeseen.", - "Enable desktop notifications for this device": "Ota käyttöön työpöytäilmoitukset tälle laitteelle", - "Enable audible notifications for this device": "Ota käyttöön ääntä toistavat ilmoitukset tälle laitteelle", "Upgrade this room to the recommended room version": "Päivitä tämä huone suositeltuun huoneversioon", "This room is running room version , which this homeserver has marked as unstable.": "Tämä huone pyörii versiolla , jonka tämä kotipalvelin on merkannut epävakaaksi.", "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Huoneen päivittäminen sulkee huoneen nykyisen instanssin ja luo päivitetyn huoneen samalla nimellä.", @@ -1443,7 +1348,6 @@ "You have %(count)s unread notifications in a prior version of this room.|other": "Sinulla on %(count)s lukematonta ilmoitusta huoneen edellisessä versiossa.", "You have %(count)s unread notifications in a prior version of this room.|one": "Sinulla on %(count)s lukematon ilmoitus huoneen edellisessä versiossa.", "Clear filter": "Tyhjennä suodatin", - "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "Salasanan vaihtaminen nollaa osapuolten välisen salauksen avaimet kaikilla laitteillasi, estäen sinua lukemasta keskusteluhistoriaasi. Ota käyttöön avainvarmuuskopio tai ota talteen huoneavaimesi toiselta laitteelta ennen kuin palautat salasanasi.", "Sign in instead": "Kirjaudu sisään", "Your password has been reset.": "Salasanasi on nollattu.", "Invalid homeserver discovery response": "Epäkelpo kotipalvelimen etsinnän vastaus", @@ -1456,11 +1360,7 @@ "As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.": "Voit käyttää sitä turvaverkkona palauttaaksesi salatun keskusteluhistoriasi, mikäli unohdat palautuksen salalauseesi.", "As a safety net, you can use it to restore your encrypted message history.": "Voit käyttää sitä turvaverkkona palauttaaksesi salatun keskusteluhistoriasi.", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "Palautusavaimesi on turvaverkko – voit käyttää sitä palauttaaksesi pääsyn salattuihin viesteihisi, mikäli unohdat salalauseesi.", - "Keep your recovery key somewhere very secure, like a password manager (or a safe)": "Pidä palautusavaimesi jossain hyvin turvallisessa paikassa, kuten salasananhallintasovelluksessa (tai kassakaapissa)", "Your Recovery Key": "Palautusavaimesi", - "Your Recovery Key has been copied to your clipboard, paste it to:": "Palautusavaimesi on kopioitu leikepöydälle, liitä se:", - "Your Recovery Key is in your Downloads folder.": "Palautusavaimesi on Lataukset-kansiossasi.", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "Mikäli et ota käyttöön salattujen viestien palautusta, et voi palauttaa salattua keskusteluhistoriaasi, jos kirjaudut ulos tai käytät toista laitetta.", "Set up Secure Message Recovery": "Ota käyttöön salattujen viestien palautus", "Secure your backup with a passphrase": "Turvaa varmuuskopiosi salalauseella", "Confirm your passphrase": "Varmista salalauseesi", @@ -1471,24 +1371,18 @@ "New Recovery Method": "Uusi palautustapa", "A new recovery passphrase and key for Secure Messages have been detected.": "Uusi palautuksen salalause ja avain salatuille viesteille on löydetty.", "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.": "Jos et ottanut käyttöön uutta palautustapaa, hyökkääjä saattaa yrittää käyttää tiliäsi. Vaihda tilisi salasana ja aseta uusi palautustapa asetuksissa välittömästi.", - "This device is encrypting history using the new recovery method.": "Tämä laite salaa historian käyttäen uutta palautustapaa.", "Set up Secure Messages": "Ota käyttöön salatut viestit", "Recovery Method Removed": "Palautustapa poistettu", - "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "Tämä laite on huomannut, että palautuksen salalauseesi ja avaimesi salatuille viesteille on poistettu.", - "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "Jos teit tämän vahingossa, voit ottaa käyttöön salatut viestit tälle laitteelle, mikä uudelleensalaa tämän laitteen keskusteluhistorian uudella palautustavalla.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Jos et poistanut palautustapaa, hyökkääjä saattaa yrittää käyttää tiliäsi. Vaihda tilisi salasana ja aseta uusi palautustapa asetuksissa välittömästi.", "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Käytätkö 'leivänmuruja' (kuvia huonelistan yläpuolella) vai et", "Replying With Files": "Tiedostoilla vastaaminen", "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Tiedostolla vastaaminen ei onnistu tällä erää. Haluatko ladata tiedoston vastaamatta?", "The file '%(fileName)s' failed to upload.": "Tiedoston '%(fileName)s' lataaminen ei onnistunut.", "The server does not support the room version specified.": "Palvelin ei tue määritettyä huoneversiota.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Vahvista, että haluat päivittää huoneen versiosta versioon .", "Changes your avatar in this current room only": "Vaihtaa kuvasi vain nykyisessä huoneessa", "Sends the given message coloured as a rainbow": "Lähettää viestin sateenkaaren väreissä", "Sends the given emote coloured as a rainbow": "Lähettää emoten sateenkaaren väreissä", "The user's homeserver does not support the version of the room.": "Käyttäjän kotipalvelin ei tue huoneen versiota.", - "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Tämä laite ei varmuuskopioi avaimiasi, mutta sinulla on olemassa varmuuskopio palauttamista ja lisäämistä varten.", - "Backup has an invalid signature from this device": "Varmuuskopiossa on epäkelpo allekirjoitus tältä laitteelta", "this room": "tämä huone", "View older messages in %(roomName)s.": "Näytä vanhemmat viestit huoneessa %(roomName)s.", "Joining room …": "Liitytään huoneeseen …", @@ -1545,13 +1439,11 @@ "Identity server URL does not appear to be a valid identity server": "Identiteettipalvelimen osoite ei näytä olevan kelvollinen identiteettipalvelin", "A conference call could not be started because the integrations server is not available": "Konferenssipuhelua ei voitu aloittaa, koska integraatiopalvelin ei ole käytettävissä", "When rooms are upgraded": "Kun huoneet päivitetään", - "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Yhdistä tämä laite avainten varmuuskopiointiin ennen kuin kirjaudut ulos, jotta et menetä mahdollisia vain tällä laitteella olevia avaimia.", "Rejecting invite …": "Hylätään kutsua …", "You were kicked from %(roomName)s by %(memberName)s": "%(memberName)s poisti sinut huoneesta %(roomName)s", "edited": "muokattu", "To help us prevent this in future, please send us logs.": "Voit auttaa meitä estämään tämän toistumisen lähettämällä meille lokeja.", "Name or Matrix ID": "Nimi tai Matrix-tunnus", - "Email, name or Matrix ID": "Sähköposti, nimi tai Matrix-tunnus", "This file is too large to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.": "Tiedosto on liian iso ladattavaksi. Tiedostojen kokoraja on %(limit)s mutta tämä tiedosto on %(sizeOfThisFile)s.", "Unbans user with given ID": "Poistaa porttikiellon tunnuksen mukaiselta käyttäjältä", "No homeserver URL provided": "Kotipalvelimen osoite puuttuu", @@ -1559,7 +1451,6 @@ "Edit message": "Muokkaa viestiä", "Sign in to your Matrix account on ": "Kirjaudu Matrix-tilillesi palvelimella ", "Show hidden events in timeline": "Näytä piilotetut tapahtumat aikajanalla", - "Connect this device to Key Backup": "Yhdistä tämä laite avainten varmuuskopiointiin", "GitHub issue": "GitHub-issue", "Notes": "Huomautukset", "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.": "Sisällytä tähän lisätiedot, joista voi olla apua ongelman analysoinnissa, kuten mitä olit tekemässä, huoneen tunnukset, käyttäjätunnukset, jne.", @@ -1606,7 +1497,6 @@ "%(severalUsers)smade no changes %(count)s times|one": "%(severalUsers)s eivät tehneet muutoksia", "%(oneUser)smade no changes %(count)s times|other": "%(oneUser)s ei tehnyt muutoksia %(count)s kertaa", "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)s ei tehnyt muutoksia", - "Clear all data on this device?": "Poista kaikki tiedot tältä laitteelta?", "Your homeserver doesn't seem to support this feature.": "Kotipalvelimesi ei näytä tukevan tätä ominaisuutta.", "Resend edit": "Lähetä muokkaus uudelleen", "Resend %(unsentCount)s reaction(s)": "Lähetä %(unsentCount)s reaktio(ta) uudelleen", @@ -1615,16 +1505,13 @@ "Clear all data": "Poista kaikki tiedot", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Kerro mikä meni pieleen, tai, mikä parempaa, luo GitHub-issue joka kuvailee ongelman.", "Removing…": "Poistetaan…", - "Clearing all data from this device is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Kaikkien tietojen poistaminen tältä laitteelta on peruuttamatonta. Salatut viestit menetetään, ellei niiden avaimia ole varmuuskopioitu.", "Failed to re-authenticate due to a homeserver problem": "Uudelleenautentikointi epäonnistui kotipalvelinongelmasta johtuen", "Failed to re-authenticate": "Uudelleenautentikointi epäonnistui", - "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.": "Pääse takaisin tilillesi ja palauta tälle laitteelle tallennetut salausavaimet. Ilman niitä et voi lukea kaikkia salattuja viestejäsi kaikilla laitteilla.", "Enter your password to sign in and regain access to your account.": "Syötä salasanasi kirjautuaksesi ja päästäksesi takaisin tilillesi.", "Forgotten your password?": "Unohditko salasanasi?", "Sign in and regain access to your account.": "Kirjaudu ja pääse takaisin tilillesi.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Et voi kirjautua tilillesi. Ota yhteyttä kotipalvelimesi ylläpitäjään saadaksesi lisätietoja.", "Clear personal data": "Poista henkilökohtaiset tiedot", - "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.": "Varoitus: Henkilökohtaisia tietojasi (mukaan lukien salausavaimia) on edelleen tallennettuna tällä laitteella. Poista ne, jos et aio enää käyttää tätä laitetta, tai haluat kirjautua toiselle tilille.", "Identity Server": "Identiteettipalvelin", "Find others by phone or email": "Löydä muita käyttäjiä puhelimen tai sähköpostin perusteella", "Be found by phone or email": "Varmista, että sinut löydetään puhelimen tai sähköpostin perusteella", @@ -1632,7 +1519,6 @@ "Terms of Service": "Käyttöehdot (Terms of Service)", "Service": "Palvelu", "Summary": "Yhteenveto", - "Failed to start chat": "Keskustelun aloittaminen ei onnistunut", "Messages": "Viestit", "Actions": "Toiminnot", "Displays list of commands with usages and descriptions": "Näyttää luettelon komennoista käyttötavoin ja kuvauksin", @@ -1667,7 +1553,6 @@ "Enter a new identity server": "Syötä uusi identiteettipalvelin", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Hyväksy identiteettipalvelimen (%(serverName)s) käyttöehdot (Terms of Service), jotta sinut voi löytää sähköpostiosoitteen tai puhelinnumeron perusteella.", "Deactivate account": "Deaktivoi tili", - "A device's public name is visible to people you communicate with": "Laitteen julkinen nimi näkyy käyttäjille, joiden kanssa olet yhteydessä", "Remove %(email)s?": "Poista %(email)s?", "Remove %(phone)s?": "Poista %(phone)s?", "Command Help": "Komento-ohje", @@ -1834,10 +1719,7 @@ "Use an identity server to invite by email. Manage in Settings.": "Voit käyttää identiteettipalvelinta sähköpostikutsujen lähettämiseen.", "Multiple integration managers": "Useita integraatiolähteitä", "Try out new ways to ignore people (experimental)": "Kokeile uusia tapoja käyttäjien huomiotta jättämiseen (kokeellinen)", - "Send verification requests in direct message, including a new verification UX in the member panel.": "Lähetä varmennuspyynnöt suoralla viestillä. Tämä sisältää uuden varmennuskäyttöliittymän jäsenpaneelissa.", - "Enable cross-signing to verify per-user instead of per-device (in development)": "Ota käyttöön ristivarmennus, jolla varmennat käyttäjän, jokaisen käyttäjän laitteen sijaan (kehitysversio)", "Enable local event indexing and E2EE search (requires restart)": "Ota käyttöön paikallinen tapahtumaindeksointi ja paikallinen haku salatuista viesteistä (vaatii uudelleenlatauksen)", - "Use the new, faster, composer for writing messages": "Käytä uutta, nopeampaa kirjoitinta viestien kirjoittamiseen", "Match system theme": "Käytä järjestelmän teemaa", "Decline (%(counter)s)": "Hylkää (%(counter)s)", "Connecting to integration manager...": "Yhdistetään integraatioiden lähteeseen...", @@ -1881,10 +1763,6 @@ "Failed to connect to integration manager": "Yhdistäminen integraatioiden lähteeseen epäonnistui", "Trusted": "Luotettu", "Not trusted": "Epäluotettu", - "Hide verified Sign-In's": "Piilota varmennetut tunnukset", - "%(count)s verified Sign-In's|other": "%(count)s varmennettua tunnusta", - "%(count)s verified Sign-In's|one": "1 varmennettu tunnus", - "Unverify user": "Poista käyttäjän varmennus", "This client does not support end-to-end encryption.": "Tämä asiakasohjelma ei tue osapuolten välistä salausta.", "Messages in this room are not end-to-end encrypted.": "Tämän huoneen viestit eivät ole salattuja.", "Messages in this room are end-to-end encrypted.": "Tämän huoneen viestit ovat salattuja.", @@ -1904,7 +1782,6 @@ "More options": "Lisää asetuksia", "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "Käytä identiteettipalvelinta kutsuaksesi henkilöitä sähköpostilla. Käytä oletusta (%(defaultIdentityServerName)s) tai aseta toinen palvelin asetuksissa.", "Use an identity server to invite by email. Manage in Settings.": "Käytä identiteettipalvelinta kutsuaksesi käyttäjiä sähköpostilla. Voit vaihtaa identiteettipalvelimen asetuksissa.", - "To verify that this device can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Varmistaaksesi, että tähän laitteeseen voidaan luottaa, tarkista, että kyseisen laitteen asetuksissa näkyvä avain täsmää alapuolella olevaan avaimeen:", "Integrations are disabled": "Integraatiot ovat pois käytöstä", "Enable 'Manage Integrations' in Settings to do this.": "Ota integraatiot käyttöön asetuksista kohdasta ”Hallitse integraatioita”.", "Integrations not allowed": "Integraatioiden käyttö on kielletty", @@ -1926,7 +1803,6 @@ "Customise your experience with experimental labs features. Learn more.": "Muokkaa kokemustasi kokeellisilla laboratio-ominaisuuksia. Tutki vaihtoehtoja.", "Error upgrading room": "Virhe päivitettäessä huonetta", "Double check that your server supports the room version chosen and try again.": "Tarkista, että palvelimesi tukee valittua huoneversiota ja yritä uudelleen.", - "Invite joined members to the new room automatically": "Kutsu huoneen jäsenet liittymään uuteen huoneeseen automaattisesti", "Send cross-signing keys to homeserver": "Lähetä ristivarmennuksen tarvitsemat avaimet kotipalvelimelle", "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s poisti porttikiellon käyttäjiltä, jotka täsmäsivät sääntöön %(glob)s", "%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s poisti huoneita estävän säännön %(glob)s", @@ -1947,11 +1823,9 @@ "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s muutti estosääntöä muodosta %(oldGlob)s muotoon %(newGlob)s. Syy: %(reason)s", "The message you are trying to send is too large.": "Lähettämäsi viesti on liian suuri.", "Cross-signing and secret storage are enabled.": "Ristivarmennus ja salavarasto on käytössä.", - "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this device.": "Tunnuksellasi on ristivarmennusidentiteetti salavarastossa, mutta tämä laite ei luota siihen.", "Cross-signing and secret storage are not yet set up.": "Ristivarmennusta ja salavarastoa ei ole vielä otettu käyttöön.", "Bootstrap cross-signing and secret storage": "Ota käyttöön ristivarmennus ja salavarasto", "Cross-signing public keys:": "Ristivarmennuksen julkiset avaimet:", - "on device": "laitteella", "not found": "ei löydetty", "Cross-signing private keys:": "Ristivarmennuksen salaiset avaimet:", "in secret storage": "salavarastossa", @@ -1962,15 +1836,7 @@ "Backup has a valid signature from this user": "Varmuuskopiossa on kelvollinen allekirjoitus tältä käyttäjältä", "Backup has a invalid signature from this user": "Varmuuskopiossa on epäkelpo allekirjoitus tältä käyttäjältä", "Backup has a signature from unknown user with ID %(deviceId)s": "Varmuuskopiossa on tuntematon allekirjoitus käyttäjältä, jonka ID on %(deviceId)s", - "Backup has a signature from unknown device with ID %(deviceId)s": "Varmuuskopiossa on tuntematon allekirjoitus laitteelta, jonka ID on %(deviceId)s", - "Backup key stored in secret storage, but this feature is not enabled on this device. Please enable cross-signing in Labs to modify key backup state.": "Vara-avain on tallennettu salavarastoon, mutta salavarasto ei ole käytössä tällä laitteella. Ota käyttöön ristivarmennus Laboratoriosta, jotta voi muokata avainvarmuuskopion tilaa.", "Backup key stored: ": "Vara-avain on tallennettu: ", - "Start using Key Backup with Secure Secret Storage": "Aloita avainten varmuuskopiointi turvalliseen salavarastoon", - "This user has not verified all of their devices.": "Tämä käyttäjä ei ole varmentanut kaikkia laitteitaan.", - "You have not verified this user. This user has verified all of their devices.": "Et ole varmentanut tätä käyttäjää. Tämä käyttäjä on varmentanut kaikki laitteensa.", - "You have verified this user. This user has verified all of their devices.": "Olet varmentanut tämän käyttäjän. Tämä käyttäjä on varmentanut kaikki laitteensa.", - "Some users in this encrypted room are not verified by you or they have not verified their own devices.": "Et ole varmentanut osaa tämän salausta käyttävän huoneen käyttäjistä tai he eivät ole varmentaneet omia laitteitaan.", - "All users in this encrypted room are verified by you and they have verified their own devices.": "Olet varmentanut kaikki käyttäjät tässä salausta käyttävässä huoneessa ja he ovat varmentaneet omat laitteensa.", "This message cannot be decrypted": "Tätä viestiä ei voida avata luettavaksi", "Unencrypted": "Suojaamaton", "Close preview": "Sulje esikatselu", @@ -1992,11 +1858,9 @@ "Enter secret storage passphrase": "Syötä salavaraston salalause", "Unable to access secret storage. Please verify that you entered the correct passphrase.": "Salavavaraston avaaminen epäonnistui. Varmista, että syötit oikean salalauseen.", "Warning: You should only access secret storage from a trusted computer.": "Varoitus: sinun pitäisi käyttää salavarastoa vain luotetulta tietokoneelta.", - "Access your secure message history and your cross-signing identity for verifying other devices by entering your passphrase.": "Käytä turvattua viestihistoriaasi ja ristivarmennuksen identiteettiäsi muiden laitteiden varmentamiseen syöttämällä salalauseesi.", "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.": "Jos olet unohtanut salalauseesi, voit käyttää palautusavaintasi tai asettaa uusia palautusvaihtoehtoja.", "Enter secret storage recovery key": "Syötä salavaraston palautusavain", "Unable to access secret storage. Please verify that you entered the correct recovery key.": "Salavaraston käyttö epäonnistui. Varmista, että syötit oikean palautusavaimen.", - "Access your secure message history and your cross-signing identity for verifying other devices by entering your recovery key.": "Käytä turvattua viestihistoriaasi ja ristivarmennuksen identiteettiäsi muiden laitteiden varmentamiseen syöttämällä palautusavaimesi.", "If you've forgotten your recovery key you can .": "Jos olet unohtanut palautusavaimesi, voit .", "Warning: You should only set up key backup from a trusted computer.": "Varoitus: sinun pitäisi ottaa avainten varmuuskopiointi käyttöön vain luotetulla tietokoneella.", "If you've forgotten your recovery key you can ": "Jos olet unohtanut palautusavaimesi, voit ", @@ -2004,27 +1868,17 @@ "Help": "Ohje", "User Status": "Käyttäjän tila", "Country Dropdown": "Maapudotusvalikko", - "Secret Storage will be set up using your existing key backup details.Your secret storage passphrase and recovery key will be the same as they were for your key backup": "Salavarasto otetaan käyttöön nykyisen avainten varmuuskopiointimenetelmäsi tiedoilla. Salavaraston salalause ja palautusavain tulee olemaan samat kuin ne olivat avainten varmuuskopioinnissasi", - "Warning: You should only set up secret storage from a trusted computer.": "Varoitus: sinun pitäisi ottaa salavarasto käyttöön vain luotetulla tietokoneella.", - "We'll use secret storage to optionally store an encrypted copy of your cross-signing identity for verifying other devices and message keys on our server. Protect your access to encrypted messages with a passphrase to keep it secure.": "Voimme vaihtoehtoisesti tallentaa salavarastoon salatun kopion ristivarmennuksen identiteetistäsi muiden laitteiden varmentamiseen ja lähettääksesi avaimia meidän palvelimelle. Suojaa pääsysi salattuihin viesteihisi pitämällä salalauseesi turvassa.", "Set up with a recovery key": "Ota käyttöön palautusavaimella", "As a safety net, you can use it to restore your access to encrypted messages if you forget your passphrase.": "Turvaverkkona, voit käyttää sitä palauttamaan pääsysi salattuihin viesteihin, jos unohdat salalauseesi.", "As a safety net, you can use it to restore your access to encrypted messages.": "Turvaverkkona, voit käyttää sitä palauttamaan pääsysi salattuihin viesteihisi.", "Keep your recovery key somewhere very secure, like a password manager (or a safe).": "Pidä palautusavaimesi jossain hyvin turvallisessa paikassa, kuten salasananhallintasovelluksessa (tai kassakaapissa).", "Your recovery key has been copied to your clipboard, paste it to:": "Palautusavaimesi on kopioitu leikepöydällesi. Liitä se:", "Your recovery key is in your Downloads folder.": "Palautusavaimesi on Lataukset-kansiossasi.", - "Your access to encrypted messages is now protected.": "Pääsysi salattuihin viesteihisi on nyt turvattu.", - "Without setting up secret storage, you won't be able to restore your access to encrypted messages or your cross-signing identity for verifying other devices if you log out or use another device.": "Ottamatta käyttöön salavarastoa et voi palauttaa pääsyäsi salattuihin viesteihisi tai ristivarmennuksen identiteettiisi, jos kirjaudut ulos tai käytät toista laitetta.", - "Set up secret storage": "Ota salavarasto käyttöön", - "Migrate from Key Backup": "Siirrä tiedot vanhasta avainten varmuuskopiointijärjestelmästä", - "Secure your encrypted messages with a passphrase": "Turvaa salatut viestisi salalauseella", "Storing secrets...": "Tallennetaan salaisuuksia...", "Unable to set up secret storage": "Salavaraston käyttöönotto epäonnistui", - "New DM invite dialog (under development)": "Uusi dialogi kutsuille yksityiskeskusteluun (kehitysversio)", "Show more": "Näytä lisää", "Recent Conversations": "Viimeaikaiset keskustelut", "Direct Messages": "Yksityisviestit", - "If you can't find someone, ask them for their username, or share your username (%(userId)s) or profile link.": "Jos et löydä jotakuta, kysy hänen käyttäjätunnusta, tai anna oma käyttäjätunnuksesi (%(userId)s) tai linkin profiiliisi hänelle.", "Go": "Mene", "Lock": "Lukko" } diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index bf5eef02e1..c371846eb3 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -16,8 +16,6 @@ "Failed to change power level": "Échec du changement de rang", "Failed to forget room %(errCode)s": "Échec de l'oubli du salon %(errCode)s", "Remove": "Supprimer", - "bold": "gras", - "italic": "italique", "Favourite": "Favoris", "Notifications": "Notifications", "Settings": "Paramètres", @@ -71,7 +69,6 @@ "Decryption error": "Erreur de déchiffrement", "Deops user with given id": "Retire le rang d’opérateur d’un utilisateur à partir de son identifiant", "Device ID": "Identifiant de l'appareil", - "Devices": "Appareils", "Failed to join room": "Échec de l’inscription au salon", "Failed to kick": "Échec de l'expulsion", "Failed to leave room": "Échec du départ du salon", @@ -100,21 +97,17 @@ "For security, this session has been signed out. Please sign in again.": "Par mesure de sécurité, la session a expiré. Merci de vous authentifier à nouveau.", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s à %(toPowerLevel)s", "Hangup": "Raccrocher", - "Hide Text Formatting Toolbar": "Cacher la barre de formatage de texte", "Historical": "Historique", "Homeserver is": "Le serveur d'accueil est", "Identity Server is": "Le serveur d'identité est", "I have verified my email address": "J’ai vérifié mon adresse e-mail", "Import E2E room keys": "Importer les clés de chiffrement de bout en bout", "Incorrect verification code": "Code de vérification incorrect", - "Invalid alias format": "Format d'alias non valide", "Invalid Email Address": "Adresse e-mail non valide", "%(senderName)s invited %(targetName)s.": "%(senderName)s a invité %(targetName)s.", - "Invite new room members": "Inviter de nouveaux membres", "Invited": "Invités", "Invites": "Invitations", "Invites user with given id to current room": "Invite un utilisateur dans le salon actuel à partir de son identifiant", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' n'est pas un format valide pour un alias", "Sign in with": "Se connecter avec", "Join Room": "Rejoindre le salon", "%(targetName)s joined the room.": "%(targetName)s a rejoint le salon.", @@ -134,16 +127,10 @@ "%(senderName)s made future room history visible to anyone.": "%(senderName)s a rendu l'historique visible à n'importe qui.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s a rendu l'historique visible à inconnu (%(visibility)s).", "Manage Integrations": "Gestion des intégrations", - "Markdown is disabled": "Le formatage Markdown est désactivé", - "Markdown is enabled": "Le formatage Markdown est activé", - "matrix-react-sdk version:": "Version de matrix-react-sdk :", - "Message not sent due to unknown devices being present": "Message non envoyé à cause de la présence d’appareils inconnus", "Missing room_id in request": "Absence du room_id dans la requête", "Missing user_id in request": "Absence du user_id dans la requête", "Moderator": "Modérateur", "Name": "Nom", - "Never send encrypted messages to unverified devices from this device": "Ne jamais envoyer de message chiffré aux appareils non vérifiés depuis cet appareil", - "Never send encrypted messages to unverified devices in this room from this device": "Ne jamais envoyer de message chiffré aux appareils non vérifiés dans ce salon depuis cet appareil", "New address (e.g. #foo:%(localDomain)s)": "Nouvelle adresse (par ex. #foo:%(localDomain)s)", "New passwords don't match": "Les mots de passe ne correspondent pas", "New passwords must match each other.": "Les nouveaux mots de passe doivent être identiques.", @@ -152,7 +139,6 @@ "(not supported by this browser)": "(non supporté par ce navigateur)", "": "", "NOT verified": "NON vérifié", - "No devices with registered encryption keys": "Pas d’appareil avec des clés de chiffrement enregistrées", "No more results": "Fin des résultats", "No results": "Pas de résultat", "unknown error code": "code d’erreur inconnu", @@ -160,11 +146,9 @@ "Only people who have been invited": "Seules les personnes ayant été invitées", "Password": "Mot de passe", "Passwords can't be empty": "Le mot de passe ne peut pas être vide", - "People": "Personnes", "Permissions": "Permissions", "Phone": "Numéro de téléphone", "Operation failed": "L'opération a échoué", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Pour le moment, changer le mot de passe réinitialise les clés de chiffrement sur tous les appareils, rendant l’historique des discussions chiffrées illisible, à moins d’exporter d'abord les clés de salon puis de les ré-importer. Ceci sera amélioré prochainement.", "Default": "Par défaut", "Email address": "Adresse e-mail", "Error decrypting attachment": "Erreur lors du déchiffrement de la pièce jointe", @@ -195,8 +179,6 @@ "Search": "Rechercher", "Search failed": "Échec de la recherche", "Searches DuckDuckGo for results": "Recherche des résultats dans DuckDuckGo", - "Sender device information": "Informations de l'appareil de l'expéditeur", - "Send Invites": "Envoyer des invitations", "Send Reset Email": "Envoyer l'e-mail de réinitialisation", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s a envoyé une image.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s a invité %(targetDisplayName)s à rejoindre le salon.", @@ -214,7 +196,6 @@ "%(count)s of your messages have not been sent.|other": "Certains de vos messages n’ont pas été envoyés.", "Someone": "Quelqu'un", "Start a chat": "Commencer une discussion", - "Start Chat": "Commencer une discussion", "Submit": "Soumettre", "Success": "Succès", "This email address is already in use": "Cette adresse e-mail est déjà utilisée", @@ -229,7 +210,6 @@ "To use it, just wait for autocomplete results to load and tab through them.": "Pour l’utiliser, attendez simplement que les résultats de l’auto-complétion s’affichent et défilez avec la touche Tab.", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Un instant donné de la chronologie n’a pu être chargé car vous n’avez pas la permission de le visualiser.", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Un instant donné de la chronologie n’a pu être chargé car il n’a pas pu être trouvé.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s a activé le chiffrement de bout en bout (algorithme %(algorithm)s).", "Unable to add email address": "Impossible d'ajouter l'adresse e-mail", "Unable to remove contact information": "Impossible de supprimer les informations du contact", "Unable to verify email address.": "Impossible de vérifier l’adresse e-mail.", @@ -237,7 +217,6 @@ "%(senderName)s unbanned %(targetName)s.": "%(senderName)s a révoqué le bannissement de %(targetName)s.", "Unable to capture screen": "Impossible de capturer l'écran", "Unable to enable Notifications": "Impossible d'activer les notifications", - "Unable to load device list": "Impossible de charger la liste des appareils", "unencrypted": "non chiffré", "unknown device": "appareil inconnu", "Unknown room %(roomId)s": "Salon inconnu %(roomId)s", @@ -259,7 +238,6 @@ "Warning!": "Attention !", "Who can access this room?": "Qui peut accéder au salon ?", "Who can read history?": "Qui peut lire l'historique ?", - "Who would you like to communicate with?": "Avec qui voulez-vous communiquer ?", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s a annulé l’invitation de %(targetName)s.", "You are already in a call.": "Vous avez déjà un appel en cours.", "You cannot place a call with yourself.": "Vous ne pouvez pas passer d'appel avec vous-même.", @@ -269,7 +247,6 @@ "You need to be able to invite users to do that.": "Vous devez être capable d’inviter des utilisateurs pour faire ça.", "You need to be logged in.": "Vous devez être identifié.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Votre adresse e-mail ne semble pas être associée à un identifiant Matrix sur ce serveur d'accueil.", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Votre mot de passe a été mis à jour avec succès. Vous ne recevrez plus de notification sur vos autres appareils jusqu’à ce que vous vous identifiez à nouveau", "You seem to be in a call, are you sure you want to quit?": "Vous semblez avoir un appel en cours, voulez-vous vraiment partir ?", "You seem to be uploading files, are you sure you want to quit?": "Vous semblez être en train d'envoyer des fichiers, voulez-vous vraiment partir ?", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Vous ne pourrez pas annuler cette modification car vous promouvez l’utilisateur au même rang que le vôtre.", @@ -330,18 +307,9 @@ "Unknown error": "Erreur inconnue", "Incorrect password": "Mot de passe incorrect", "To continue, please enter your password.": "Pour continuer, veuillez saisir votre mot de passe.", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Pour vérifier que vous pouvez faire confiance à cet appareil, merci de contacter son propriétaire par un autre moyen (par ex. en personne ou par téléphone) et demandez lui si la clé qu’il/elle voit dans ses Paramètres Utilisateur pour cet appareil correspond à la clé ci-dessous :", - "Device name": "Nom de l'appareil", - "Device key": "Clé de l'appareil", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Si les clés correspondent, cliquer sur le bouton \"Vérifier\" ci-dessous. Sinon quelqu’un d’autre est en train d’intercepter cet appareil et vous devriez certainement cliquer sur le bouton \"Ajouter à la liste noire\" à la place.", - "Verify device": "Vérifier cet appareil", "I verify that the keys match": "J’ai vérifié que les clés correspondaient", "Unable to restore session": "Impossible de restaurer la session", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Si vous avez utilisé une version plus récente de Riot précédemment, votre session risque d’être incompatible avec cette version. Fermez cette fenêtre et retournez à la version plus récente.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Vous êtes en train d’ajouter à la liste noire des appareils non-vérifiés ; pour envoyer des messages à ces appareils vous devez les vérifier.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Nous vous recommandons d’effectuer le processus de vérification pour tous les appareils afin de confirmer qu’ils appartiennent à leurs propriétaires légitimes, mais vous pouvez renvoyer le(s) message(s) sans vérifier si vous préférez.", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contient des appareils que vous n'avez encore jamais vus.", - "Unknown devices": "Appareils inconnus", "Unknown Address": "Adresse inconnue", "Unblacklist": "Supprimer de la liste noire", "Blacklist": "Ajouter à la liste noire", @@ -375,19 +343,13 @@ "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s a changé l’avatar du salon en ", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s a supprimé l'avatar du salon.", "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s a changé l’avatar de %(roomName)s", - "Device already verified!": "Appareil déjà vérifié !", "Export": "Exporter", "Import": "Importer", "Incorrect username and/or password.": "Nom d’utilisateur et/ou mot de passe incorrect.", "Results from DuckDuckGo": "Résultats de DuckDuckGo", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Les clés de signature que vous avez transmises correspondent aux clés que vous avez reçues de l’appareil %(deviceId)s de %(userId)s. L’appareil est vérifié.", - "Unknown (user, device) pair:": "Couple (utilisateur, appareil) inconnu :", - "Unrecognised command:": "Commande non reconnue :", "Unrecognised room alias:": "Alias de salon non reconnu :", "Use compact timeline layout": "Utiliser l'affichage compact de l'historique", "Verified key": "Clé vérifiée", - "WARNING: Device already verified, but keys do NOT MATCH!": "ATTENTION : appareil déjà vérifié mais les clés NE CORRESPONDENT PAS !", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ATTENTION : ERREUR DE VÉRIFICATION DES CLÉS ! La clé de signature pour %(userId)s et l'appareil %(deviceId)s est “%(fprint)s” et ne correspond pas à la clé “%(fingerprint)s” qui a été fournie. Cela peut signifier que vos communications sont interceptées !", "No Microphones detected": "Aucun micro détecté", "No Webcams detected": "Aucune webcam détectée", "No media permissions": "Pas de permission pour les médias", @@ -399,9 +361,7 @@ "Anyone": "N'importe qui", "Are you sure you want to leave the room '%(roomName)s'?": "Voulez-vous vraiment quitter le salon \"%(roomName)s\" ?", "Custom level": "Rang personnalisé", - "Device ID:": "Identifiant de l'appareil :", "device id: ": "identifiant de l'appareil : ", - "Device key:": "Clé de l’appareil :", "Register": "S'inscrire", "Remote addresses for this room:": "Adresses distantes pour ce salon :", "Save": "Enregistrer", @@ -441,22 +401,17 @@ "No display name": "Pas de nom affiché", "Private Chat": "Discussion privée", "Public Chat": "Discussion publique", - "Room contains unknown devices": "Le salon contient des appareils inconnus", "%(roomName)s does not exist.": "%(roomName)s n'existe pas.", "%(roomName)s is not accessible at this time.": "%(roomName)s n'est pas accessible pour le moment.", "Seen by %(userName)s at %(dateTime)s": "Vu par %(userName)s à %(dateTime)s", "Send anyway": "Envoyer quand même", - "Show Text Formatting Toolbar": "Afficher la barre de formatage de texte", "Start authentication": "Commencer une authentification", "This room": "Ce salon", - "Undecryptable": "Indéchiffrable", - "Unencrypted message": "Message non chiffré", "unknown caller": "appelant inconnu", "Unnamed Room": "Salon anonyme", "Username invalid: %(errMessage)s": "Nom d'utilisateur non valide : %(errMessage)s", "(~%(count)s results)|one": "(~%(count)s résultat)", "(~%(count)s results)|other": "(~%(count)s résultats)", - "Encrypted by an unverified device": "Chiffré par un appareil non vérifié", "Home": "Accueil", "Upload new:": "Envoyer un nouveau :", "Join as voice or video.": "Rejoindre en audio ou en vidéo.", @@ -474,8 +429,6 @@ "Start verification": "Commencer la vérification", "Share without verifying": "Partager sans vérifier", "Ignore request": "Ignorer la requête", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Vous avez ajouté un nouvel appareil, \"%(displayName)s\", qui demande des clés de chiffrement.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Votre appareil non vérifié \"%(displayName)s\" demande des clés de chiffrement.", "Encryption key request": "Requête de clé de chiffrement", "Check for update": "Rechercher une mise à jour", "Add a widget": "Ajouter un widget", @@ -488,7 +441,6 @@ "Unable to create widget.": "Impossible de créer le widget.", "You are not in this room.": "Vous n'êtes pas dans ce salon.", "You do not have permission to do that in this room.": "Vous n'avez pas la permission d'effectuer cette action dans ce salon.", - "Loading device info...": "Chargement des informations de l'appareil...", "Example": "Exemple", "Create": "Créer", "Featured Rooms:": "Salons mis en avant :", @@ -504,7 +456,6 @@ "PM": "PM", "Copied!": "Copié !", "Failed to copy": "Échec de la copie", - "Verifies a user, device, and pubkey tuple": "Vérifie un utilisateur, un appareil et une clé publique", "%(widgetName)s widget modified by %(senderName)s": "Widget %(widgetName)s modifié par %(senderName)s", "Who would you like to add to this community?": "Qui souhaitez-vous ajouter à cette communauté ?", "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Attention : toute personne ajoutée à une communauté sera visible par tous ceux connaissant l'identifiant de la communauté", @@ -702,8 +653,6 @@ "Idle for %(duration)s": "Inactif depuis %(duration)s", "Offline for %(duration)s": "Hors ligne depuis %(duration)s", "Unknown for %(duration)s": "Inconnu depuis %(duration)s", - "Delete %(count)s devices|one": "Supprimer l'appareil", - "Delete %(count)s devices|other": "Supprimer %(count)s appareils", "Something went wrong when trying to get your communities.": "Une erreur est survenue lors de l'obtention de vos communautés.", "This homeserver doesn't offer any login flows which are supported by this client.": "Ce serveur d'accueil n'offre aucune méthode d'identification compatible avec ce client.", "Flair": "Badge", @@ -713,7 +662,6 @@ "expand": "développer", "collapse": "réduire", "Call Failed": "Échec de l'appel", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Il y a des appareils inconnus dans ce salon : si vous continuez sans les vérifier, quelqu'un pourrait épier votre appel.", "Review Devices": "Passer en revue les appareils", "Call Anyway": "Appeler quand même", "Answer Anyway": "Répondre quand même", @@ -747,7 +695,6 @@ "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s %(day)s %(monthName)s %(fullYear)s", "This room is not public. You will not be able to rejoin without an invite.": "Ce salon n'est pas public. Vous ne pourrez pas y revenir sans invitation.", "Community IDs cannot be empty.": "Les identifiants de communauté ne peuvent pas être vides.", - "Show devices, send anyway or cancel.": "Afficher les appareils, envoyer quand même ou annuler.", "In reply to ": "En réponse à ", "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s a changé son nom affiché en %(displayName)s.", "Failed to set direct chat tag": "Échec de l'ajout de l'étiquette discussion directe", @@ -756,11 +703,7 @@ "Clear filter": "Supprimer les filtres", "Did you know: you can use communities to filter your Riot.im experience!": "Le saviez-vous : vous pouvez utiliser les communautés pour filtrer votre expérience Riot.im !", "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Pour activer un filtre, faites glisser un avatar de communauté sur le panneau des filtres tout à gauche de l'écran. Vous pouvez cliquer sur un avatar dans ce panneau quand vous le souhaitez afin de ne voir que les salons et les personnes associés à cette communauté.", - "Your key share request has been sent - please check your other devices for key share requests.": "Votre demande de partage de clé a été envoyée - veuillez vérifier les demandes de partage de clé sur vos autres appareils.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Les demandes de partage de clé sont envoyées à vos autres appareils automatiquement. Si vous rejetez ou supprimez la demande de partage de clé sur vos autres appareils, cliquez ici pour redemander les clés pour cette session.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Si vos autres appareils n'ont pas la clé pour ce message, vous ne pourrez pas le déchiffrer.", "Key request sent.": "Demande de clé envoyée.", - "Re-request encryption keys from your other devices.": "Re-demander les clés de chiffrement depuis vos autres appareils.", "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Vu par %(displayName)s (%(userName)s) à %(dateTime)s", "Code": "Code", "If you've submitted a bug via GitHub, debug logs can help us track down the problem. 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.": "Si vous avez signalé un bug via GitHub, les journaux de débogage peuvent nous aider à identifier le problème. Les journaux de débogage contiennent des données d'utilisation de l'application dont votre nom d'utilisateur, les identifiants ou alias des salons ou groupes que vous avez visité et les noms d'utilisateur des autres participants. Ils ne contiennent pas les messages.", @@ -822,7 +765,6 @@ "Resend": "Renvoyer", "Collecting app version information": "Récupération des informations de version de l’application", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Supprimer l'alias %(alias)s du salon et supprimer %(name)s du répertoire ?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Cela vous permettra de retourner sur votre compte après vous être déconnecté, et de vous identifier sur d'autres appareils.", "Keywords": "Mots-clés", "Enable notifications for this account": "Activer les notifications pour ce compte", "Invite to this community": "Inviter à cette communauté", @@ -918,8 +860,6 @@ "Refresh": "Rafraîchir", "We encountered an error trying to restore your previous session.": "Une erreur est survenue lors de la restauration de la dernière session.", "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Effacer le stockage de votre navigateur peut résoudre le problème, mais cela vous déconnectera et tous les historiques de conversation encryptés seront illisibles.", - "Unable to reply": "Impossible de répondre", - "At this time it is not possible to reply with an emote.": "Pour le moment il n'est pas possible de répondre avec une réaction.", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Impossible de charger l'événement auquel il a été répondu, soit il n'existe pas, soit vous n'avez pas l'autorisation de le voir.", "Collapse Reply Thread": "Masquer le fil de réponse", "Enable widget screenshots on supported widgets": "Activer les captures d'écran des widgets pris en charge", @@ -962,12 +902,6 @@ "Demote yourself?": "Vous rétrograder ?", "Demote": "Rétrograder", "This event could not be displayed": "Cet événement n'a pas pu être affiché", - "deleted": "barré", - "underlined": "souligné", - "inline-code": "code", - "block-quote": "citation", - "bulleted-list": "liste à puces", - "numbered-list": "liste à numéros", "Permission Required": "Permission requise", "You do not have permission to start a conference call in this room": "Vous n'avez pas la permission de lancer un appel en téléconférence dans ce salon", "A call is currently being placed!": "Un appel est en cours !", @@ -1031,11 +965,6 @@ "Unable to load! Check your network connectivity and try again.": "Chargement impossible ! Vérifiez votre connexion au réseau et réessayez.", "Delete Backup": "Supprimer la sauvegarde", "Unable to load key backup status": "Impossible de charger l'état de sauvegarde des clés", - "Backup has a valid signature from this device": "La sauvegarde a une signature valide pour cet appareil", - "Backup has a valid signature from unverified device ": "La sauvegarde a une signature valide de l'appareil non vérifié ", - "Backup has an invalid signature from verified device ": "La sauvegarde a une signature non valide de l'appareil vérifié ", - "Backup has an invalid signature from unverified device ": "La sauvegarde a une signature non valide de l'appareil non vérifié ", - "Backup is not signed by any of your devices": "La sauvegarde n'est signée par aucun de vos appareils", "Backup version: ": "Version de la sauvegarde : ", "Algorithm: ": "Algorithme : ", "Enter a passphrase...": "Saisissez une phrase de passe…", @@ -1048,12 +977,9 @@ "Your Recovery Key": "Votre clé de récupération", "Copy to clipboard": "Copier dans le presse-papier", "Download": "Télécharger", - "Your Recovery Key has been copied to your clipboard, paste it to:": "Votre clé de récupération a été copiée dans votre presse-papier, collez-la dans :", - "Your Recovery Key is in your Downloads folder.": "Votre clé de récupération est dans votre dossier de téléchargements.", "Print it and store it somewhere safe": "Imprimez-la et conservez-la dans un endroit sûr", "Save it on a USB key or backup drive": "Sauvegardez-la sur une clé USB ou un disque de sauvegarde", "Copy it to your personal cloud storage": "Copiez-la dans votre espace de stockage personnel en ligne", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "Si vous ne configurez pas la récupération de messages sécurisée, vous ne pourrez pas restaurer l'historique de vos messages chiffrés si vous vous déconnectez ou si vous utilisez un autre appareil.", "Set up Secure Message Recovery": "Configurer la récupération de messages sécurisée", "Keep it safe": "Conservez-la en lieu sûr", "Create Key Backup": "Créer la sauvegarde des clés", @@ -1072,7 +998,6 @@ "This looks like a valid recovery key!": "Cela ressemble à une clé de récupération valide !", "Not a valid recovery key": "Ce n'est pas une clé de récupération valide", "Access your secure message history and set up secure messaging by entering your recovery key.": "Accédez à l'historique sécurisé de vos messages et configurez la messagerie sécurisée en renseignant votre clé de récupération.", - "If you've forgotten your recovery passphrase you can ": "Si vous avez oublié votre clé de récupération vous pouvez ", "Failed to perform homeserver discovery": "Échec lors de la découverte du serveur d'accueil", "Invalid homeserver discovery response": "Réponse de découverte du serveur d'accueil non valide", "Use a few words, avoid common phrases": "Utilisez quelques mots, évitez les phrases courantes", @@ -1120,7 +1045,6 @@ "Checking...": "Vérification…", "Invalid identity server discovery response": "Réponse non valide lors de la découverte du serveur d'identité", "General failure": "Erreur générale", - "Backup has a valid signature from verified device ": "La sauvegarde a une signature valide depuis un appareil vérifié", "New Recovery Method": "Nouvelle méthode de récupération", "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.": "Si vous n'avez pas activé de nouvelle méthode de récupération, un attaquant essaye peut-être d'accéder à votre compte. Changez immédiatement le mot de passe de votre compte et configurez une nouvelle méthode de récupération dans les paramètres.", "Set up Secure Messages": "Configurer les messages sécurisés", @@ -1170,13 +1094,11 @@ "Email Address": "Adresse e-mail", "Backing up %(sessionsRemaining)s keys...": "Sauvegarde de %(sessionsRemaining)s clés...", "All keys backed up": "Toutes les clés ont été sauvegardées", - "Backup has a signature from unknown device with ID %(deviceId)s.": "La sauvegarde a une signature de l'appareil inconnu qui a pour identifiant %(deviceId)s.", "Add an email address to configure email notifications": "Ajouter une adresse e-mail pour configurer les notifications par e-mail", "Unable to verify phone number.": "Impossible de vérifier le numéro de téléphone.", "Verification code": "Code de vérification", "Phone Number": "Numéro de téléphone", "Profile picture": "Image de profil", - "Upload profile picture": "Transférer une image de profil", "Display Name": "Nom affiché", "Room information": "Information du salon", "Internal room ID:": "Identifiant interne du salon :", @@ -1203,7 +1125,6 @@ "Room list": "Liste de salons", "Timeline": "Historique", "Autocomplete delay (ms)": "Délai pour l'autocomplétion (ms)", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "Pour une sécurité maximale, nous vous recommandons de faire cela en personne ou d'utiliser un autre moyen sûr de communication.", "Chat with Riot Bot": "Discuter avec le bot Riot", "Roles & Permissions": "Rôles & Permissions", "To link to this room, please add an alias.": "Pour partager ce salon, veuillez créer un alias.", @@ -1220,8 +1141,6 @@ "Voice & Video": "Voix & Vidéo", "Main address": "Adresse princpale", "Room avatar": "Avatar du salon", - "Upload room avatar": "Transférer un avatar pour le salon", - "No room avatar": "Aucun avatar de salon", "Room Name": "Nom du salon", "Room Topic": "Sujet du salon", "Join": "Rejoindre", @@ -1231,7 +1150,6 @@ "Waiting for partner to accept...": "Nous attendons que le partenaire accepte…", "Use two-way text verification": "Utiliser la vérification textuelle bidirectionnelle", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Vérifier cet utilisateur pour que ce soit un utilisateur de confiance. Faire confiance aux utilisateurs vous apporte une tranquillité d’esprit quand vous utilisez des messages chiffrés de bout en bout.", - "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "En vérifiant cet utilisateur, son appareil sera marqué comme appareil de confiance, et le vôtre sera aussi marqué comme appareil de confiance pour lui.", "Waiting for partner to confirm...": "Nous attendons que le partenaire confirme…", "Incoming Verification Request": "Demande de vérification entrante", "Go back": "Revenir en arrière", @@ -1267,10 +1185,7 @@ "Keep going...": "Continuer…", "Starting backup...": "Début de la sauvegarde…", "A new recovery passphrase and key for Secure Messages have been detected.": "Une nouvelle phrase de passe et une nouvelle clé de récupération pour les messages sécurisés ont été détectées.", - "This device is encrypting history using the new recovery method.": "Cet appareil chiffre l'historique en utilisant la nouvelle méthode de récupération.", "Recovery Method Removed": "Méthode de récupération supprimée", - "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "Cet appareil a détecté que votre phrase de passe et votre clé de récupération ont été supprimées.", - "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "Si vus avez fait cela par accident, vous pouvez configurer les messages sécurisés sur cet appareil, ce qui re-chiffrera l'historique des messages de cet appareil avec une nouvelle méthode de récupération.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Si vous n'avez pas supprimé la méthode de récupération, un attaquant peut être en train d'essayer d'accéder à votre compte. Modifiez le mot de passe de votre compte et configurez une nouvelle méthode de récupération dans les réglages.", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Le fichier \"%(fileName)s\" dépasse la taille limite autorisée par ce serveur pour les téléchargements", "Gets or sets the room topic": "Récupère ou défini le sujet du salon", @@ -1329,7 +1244,6 @@ "Book": "Livre", "Pencil": "Crayon", "Paperclip": "Trombone", - "Padlock": "Cadenas", "Key": "Clé", "Hammer": "Marteau", "Telephone": "Téléphone", @@ -1347,12 +1261,6 @@ "Headphones": "Écouteurs", "Folder": "Dossier", "Pin": "Épingle", - "Your homeserver does not support device management.": "Votre serveur d'accueil ne prend pas en charge la gestion des appareils.", - "This backup is trusted because it has been restored on this device": "Cette sauvegarde est fiable car elle a été restaurée sur cet appareil", - "Some devices for this user are not trusted": "Certains appareil pour cet utilisateur ne sont pas fiables", - "Some devices in this encrypted room are not trusted": "Certains appareils dans ce salon chiffré ne sont pas fiables", - "All devices for this user are trusted": "Tous les appareils de cet utilisateur sont fiables", - "All devices in this encrypted room are trusted": "Tous les appareils de ce salon chiffré sont fiables", "Recovery Key Mismatch": "La clé de récupération ne correspond pas", "Incorrect Recovery Passphrase": "Phrase de passe de récupération incorrecte", "Backup could not be decrypted with this passphrase: please verify that you entered the correct recovery passphrase.": "La sauvegarde n'a pas pu être déchiffrée avec cette phrase de passe : vérifiez que vous avez saisi la bonne phrase de passe de récupération.", @@ -1362,16 +1270,13 @@ "This homeserver does not support communities": "Ce serveur d'accueil ne prend pas en charge les communautés", "A verification email will be sent to your inbox to confirm setting your new password.": "Un e-mail de vérification sera envoyé à votre adresse pour confirmer la modification de votre mot de passe.", "Your password has been reset.": "Votre mot de passe a été réinitialisé.", - "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Vous avez été déconnecté de tous les appareils et vous ne recevrez plus de notifications. Pour réactiver les notifications, reconnectez-vous sur chaque appareil.", "This homeserver does not support login using email address.": "Ce serveur d'accueil ne prend pas en charge la connexion avec une adresse e-mail.", "Registration has been disabled on this homeserver.": "L'inscription a été désactivée sur ce serveur d'accueil.", "Unable to query for supported registration methods.": "Impossible de demander les méthodes d'inscription prises en charge.", "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "En êtes-vous sûr(e) ? Vous perdrez vos messages chiffrés si vos clés ne sont pas sauvegardées correctement.", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Les messages chiffrés sont sécurisés avec un chiffrement de bout en bout. Seuls vous et le(s) destinataire(s) ont les clés pour lire ces messages.", "Restore from Backup": "Restaurer depuis la sauvegarde", - "This device is backing up your keys. ": "Cet appareil sauvegarde vos clés. ", "Back up your keys before signing out to avoid losing them.": "Sauvegardez vos clés avant de vous déconnecter pour éviter de les perdre.", - "Your keys are not being backed up from this device.": "Vos clés ne sont pas sauvegardées depuis cet appareil.", "Start using Key Backup": "Commencer à utiliser la sauvegarde de clés", "Never lose encrypted messages": "Ne perdez jamais vos messages chiffrés", "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Les messages de ce salon sont sécurisés avec le chiffrement de bout en bout. Seuls vous et le(s) destinataire(s) avez les clés pour lire ces messages.", @@ -1390,7 +1295,6 @@ "Set up with a Recovery Key": "Configurer une clé de récupération", "Please enter your passphrase a second time to confirm.": "Veuillez saisir votre phrase de passe une seconde fois pour la confirmer.", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "Votre clé de récupération est une mesure de précaution. Vous pouvez l’utiliser pour restaurer l’accès à vos messages chiffrés si vous oubliez votre phrase de passe.", - "Keep your recovery key somewhere very secure, like a password manager (or a safe)": "Conservez votre clé de récupération dans un endroit très sécurisé, comme un gestionnaire de mots de passe (ou un coffre-fort)", "Your keys are being backed up (the first backup could take a few minutes).": "Vous clés sont en cours de sauvegarde (la première sauvegarde peut prendre quelques minutes).", "Secure your backup with a passphrase": "Protégez votre sauvegarde avec une phrase de passe", "Confirm your passphrase": "Confirmez votre phrase de passe", @@ -1448,18 +1352,11 @@ "Power level": "Rang", "Want more than a community? Get your own server": "Vous voulez plus qu’une communauté ? Obtenez votre propre serveur", "Please install Chrome, Firefox, or Safari for the best experience.": "Veuillez installer Chrome, Firefox ou Safari pour une expérience optimale.", - "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "Le changement de votre mot de passe entraînera la réinitialisation de toutes les clés de chiffrement de bout en bout sur tous vos appareils. L’historique de vos conversations chiffrées sera alors illisible. Configurez la sauvegarde des clés ou exportez vos clés de chiffrement depuis un autre appareil avant de modifier votre mot de passe.", - "Room upgrade confirmation": "Confirmation de la mise à niveau du salon", - "Upgrading a room can be destructive and isn't always necessary.": "La mise à niveau d’un salon peut être destructive et n’est pas toujours nécessaire.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Les mises à niveau de salon sont généralement recommandées quand la version du salon est considérée comme instable. Les versions de salon instables peuvent produire des anomalies, avoir des fonctionnalités en moins ou contenir des failles de sécurité.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Les mises à niveau de salon n’affectent généralement que le traitement par le serveur du salon. Si vous avez un problème avec votre client Riot, créez un rapport avec .", "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.": "Attention : La mise à niveau du salon ne migrera pas automatiquement les membres du salon vers la nouvelle version du salon. Nous enverrons un lien vers le nouveau salon dans l’ancienne version du salon. Les participants au salon devront cliquer sur ce lien pour rejoindre le nouveau salon.", "Adds a custom widget by URL to the room": "Ajoute un widget personnalisé par URL au salon", "Please supply a https:// or http:// widget URL": "Veuillez fournir une URL du widget en https:// ou http://", "You cannot modify widgets in this room.": "Vous ne pouvez pas modifier les widgets de ce salon.", "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s a révoqué l’invitation de %(targetDisplayName)s à rejoindre le salon.", - "Enable desktop notifications for this device": "Activer les notifications de bureau pour cet appareil", - "Enable audible notifications for this device": "Activer les notifications sonores pour cet appareil", "Upgrade this room to the recommended room version": "Mettre à niveau ce salon vers la version recommandée", "This room is running room version , which this homeserver has marked as unstable.": "Ce salon utilise la version , que ce serveur d’accueil a marqué comme instable.", "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "La mise à niveau du salon désactivera cette instance du salon et créera un salon mis à niveau avec le même nom.", @@ -1504,18 +1401,12 @@ "A conference call could not be started because the integrations server is not available": "L’appel en téléconférence n’a pas pu être lancé car les intégrations du serveur ne sont pas disponibles", "The server does not support the room version specified.": "Le serveur ne prend pas en charge la version de salon spécifiée.", "Name or Matrix ID": "Nom ou identifiant Matrix", - "Email, name or Matrix ID": "E-mail, nom ou identifiant Matrix", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Veuillez confirmer la mise à niveau de ce salon de à .", "Changes your avatar in this current room only": "Change votre avatar seulement dans le salon actuel", "Unbans user with given ID": "Révoque le bannissement de l’utilisateur ayant l’identifiant fourni", "Sends the given message coloured as a rainbow": "Envoie le message coloré aux couleurs de l’arc-en-ciel", "Sends the given emote coloured as a rainbow": "Envoie la réaction colorée aux couleurs de l’arc-en-ciel", "The user's homeserver does not support the version of the room.": "Le serveur d’accueil de l’utilisateur ne prend pas en charge la version de ce salon.", "When rooms are upgraded": "Quand les salons sont mis à niveau", - "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Cet appareil ne sauvegarde pas vos clés, mais vous avez une sauvegarde existante que vous pouvez restaurer et joindre.", - "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Connecter cet appareil à la sauvegarde de clés avant de vous déconnecter pour éviter de perdre des clés qui pourraient n’être présentes que sur cet appareil.", - "Connect this device to Key Backup": "Connecter cet appareil à la sauvegarde de clés", - "Backup has an invalid signature from this device": "La sauvegarde a une signature invalide depuis cet appareil", "this room": "ce salon", "View older messages in %(roomName)s.": "Voir les messages plus anciens dans %(roomName)s.", "Joining room …": "Inscription au salon…", @@ -1614,18 +1505,14 @@ "Resend removal": "Renvoyer la suppression", "Your homeserver doesn't seem to support this feature.": "Il semble que votre serveur d’accueil ne prenne pas en charge cette fonctionnalité.", "Changes your avatar in all rooms": "Change votre avatar dans tous les salons", - "Clear all data on this device?": "Supprimer toutes les données sur cet appareil ?", "You're signed out": "Vous êtes déconnecté(e)", "Clear all data": "Supprimer toutes les données", "Removing…": "Suppression…", - "Clearing all data from this device is permanent. Encrypted messages will be lost unless their keys have been backed up.": "La suppression de toutes les données sur cet appareil est permanente. Les messages chiffrés seront perdus à moins que leurs clés n’aient été sauvegardées.", "Failed to re-authenticate due to a homeserver problem": "Échec de la ré-authentification à cause d’un problème du serveur d’accueil", "Failed to re-authenticate": "Échec de la ré-authentification", "Enter your password to sign in and regain access to your account.": "Saisissez votre mot de passe pour vous connecter et ré-accéder à votre compte.", "Forgotten your password?": "Mot de passe oublié ?", "Clear personal data": "Supprimer les données personnelles", - "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.": "Attention : Vos données personnelles (y compris vos clés de chiffrement) sont toujours stockées sur cet appareil. Supprimez-les si vous n’utilisez plus cet appareil ou si vous voulez vous connecter avec un autre compte.", - "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.": "Ré-accédez à votre compte et récupérez les clés de chiffrement stockées sur cet appareil. Sans elles, vous ne pourrez pas lire tous les messages sécurisés sur tous les appareils.", "Sign in and regain access to your account.": "Connectez-vous et ré-accédez à votre compte.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Vous ne pouvez pas vous connecter à votre compte. Contactez l’administrateur de votre serveur d’accueil pour plus d’informations.", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Dites-nous ce qui s’est mal passé ou, encore mieux, créez un rapport d’erreur sur GitHub qui décrit le problème.", @@ -1637,7 +1524,6 @@ "Service": "Service", "Summary": "Résumé", "This account has been deactivated.": "Ce compte a été désactivé.", - "Failed to start chat": "Échec du démarrage de la discussion", "Messages": "Messages", "Actions": "Actions", "Displays list of commands with usages and descriptions": "Affiche la liste des commandes avec leurs utilisations et descriptions", @@ -1667,7 +1553,6 @@ "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Vous n’utilisez actuellement aucun serveur d’identité. Pour découvrir et être découvert par les contacts existants que vous connaissez, ajoutez-en un ci-dessous.", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "La déconnexion de votre serveur d’identité signifie que vous ne serez plus découvrable par d’autres utilisateurs et que vous ne pourrez plus faire d’invitation par e-mail ou téléphone.", "Integration Manager": "Gestionnaire d’intégration", - "To verify that this device can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Pour savoir si vous pouvez faire confiance à cet appareil, vérifiez que la clé que vous voyez dans les paramètres de l’utilisateur sur cet appareil correspond à la clé ci-dessous :", "Call failed due to misconfigured server": "Échec de l’appel à cause d’un serveur mal configuré", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Demandez à l’administrateur de votre serveur d’accueil (%(homeserverDomain)s) de configurer un serveur TURN afin que les appels fonctionnent de manière fiable.", "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.": "Sinon, vous pouvez essayer d’utiliser le serveur public à turn.matrix.org, mais ça ne sera pas aussi fiable et ça partagera votre adresse IP avec ce serveur. Vous pouvez aussi gérer cela dans les paramètres.", @@ -1682,7 +1567,6 @@ "Remove %(phone)s?": "Supprimer %(phone)s ?", "ID": "Identifiant", "Public Name": "Nom public", - "A device's public name is visible to people you communicate with": "Le nom public d’un appareil est visible par les personnes avec qui vous communiquez", "Accept to continue:": "Acceptez pour continuer :", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Acceptez les conditions de service du serveur d’identité (%(serverName)s) pour vous permettre d’être découvrable par votre adresse e-mail ou votre numéro de téléphone.", "Multiple integration managers": "Gestionnaires d’intégration multiples", @@ -1782,7 +1666,6 @@ "%(count)s unread messages.|other": "%(count)s messages non lus.", "Unread mentions.": "Mentions non lues.", "Please create a new issue on GitHub so that we can investigate this bug.": "Veuillez créer un nouveau rapport sur GitHub afin que l’on enquête sur cette erreur.", - "Use the new, faster, composer for writing messages": "Utilisez le nouveau compositeur plus rapide pour écrire des messages", "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.": "Clé public du captcha manquante dans la configuration du serveur d’accueil. Veuillez le signaler à l’administrateur de votre serveur d’accueil.", "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|one": "Vous êtes sur le point de supprimer 1 message de %(user)s. Ça ne peut pas être annulé. Voulez-vous continuer ?", "Remove %(count)s messages|one": "Supprimer 1 message", @@ -1872,11 +1755,7 @@ "Custom (%(level)s)": "Personnalisé (%(level)s)", "Trusted": "Fiable", "Not trusted": "Non vérifié", - "Hide verified Sign-In's": "Masquer les connexions vérifiées", - "%(count)s verified Sign-In's|other": "%(count)s connexions vérifiées", - "%(count)s verified Sign-In's|one": "1 connexion vérifiée", "Direct message": "Message direct", - "Unverify user": "Ne plus marquer l’utilisateur comme vérifié", "%(role)s in %(roomName)s": "%(role)s dans %(roomName)s", "Messages in this room are end-to-end encrypted.": "Les messages dans ce salon sont chiffrés de bout en bout.", "Security": "Sécurité", @@ -1893,7 +1772,6 @@ "Using this widget may share data with %(widgetDomain)s.": "L’utilisation de ce widget pourrait partager des données avec %(widgetDomain)s.", "Widget added by": "Widget ajouté par", "This widget may use cookies.": "Ce widget pourrait utiliser des cookies.", - "Send verification requests in direct message, including a new verification UX in the member panel.": "Envoyer les demandes de vérification en message direct, en incluant une nouvelle expérience de vérification dans le tableau des membres.", "Enable local event indexing and E2EE search (requires restart)": "Activer l’indexation des événements locaux et la recherche des données chiffrées de bout en bout (nécessite un redémarrage)", "Connecting to integration manager...": "Connexion au gestionnaire d’intégrations…", "Cannot connect to integration manager": "Impossible de se connecter au gestionnaire d’intégrations", @@ -1916,7 +1794,6 @@ "Manage integrations": "Gérer les intégrations", "Verification Request": "Demande de vérification", " (1/%(totalCount)s)": " (1/%(totalCount)s)", - "Enable cross-signing to verify per-user instead of per-device (in development)": "Activer la signature croisée pour vérifier par utilisateur plutôt que par appareil (en développement)", "Match system theme": "S’adapter au thème du système", "%(senderName)s placed a voice call.": "%(senderName)s a passé un appel vocal.", "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s a passé un appel vocal. (pas pris en charge par ce navigateur)", @@ -1943,7 +1820,6 @@ "Start chatting": "Commencer à discuter", "Send cross-signing keys to homeserver": "Envoyer les clés de signature croisée au serveur d’accueil", "Cross-signing public keys:": "Clés publiques de signature croisée :", - "on device": "sur l’appareil", "not found": "non trouvé", "Cross-signing private keys:": "Clés privées de signature croisée :", "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s a supprimé la règle qui bannit les utilisateurs correspondant à %(glob)s", @@ -1966,83 +1842,52 @@ "in secret storage": "dans le coffre secret", "Secret storage public key:": "Clé publique du coffre secret :", "in account data": "dans les données du compte", - "Bootstrap Secure Secret Storage": "Créer le coffre secret sécurisé", "Cross-signing": "Signature croisée", "Enter secret storage passphrase": "Saisir la phrase de passe du coffre secret", "Unable to access secret storage. Please verify that you entered the correct passphrase.": "Impossible d’accéder au coffre secret. Vérifiez que vous avez saisi la bonne phrase de passe.", "Warning: You should only access secret storage from a trusted computer.": "Attention : Vous devriez uniquement accéder au coffre secret depuis un ordinateur de confiance.", - "Access your secure message history and your cross-signing identity for verifying other devices by entering your passphrase.": "Accédez à l’historique de vos messages sécurisés et votre identité de signature croisée pour vérifier d’autres appareils en saisissant votre phrase de passe.", "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.": "Si vous avez oublié votre phrase de passe, vous pouvez utiliser votre clé de récupération ou définir de nouvelles options de récupération.", "Enter secret storage recovery key": "Saisir la clé de récupération du coffre secret", "Unable to access secret storage. Please verify that you entered the correct recovery key.": "Impossible d’accéder au coffre secret. Vérifiez que vous avez saisi la bonne clé de récupération.", - "Access your secure message history and your cross-signing identity for verifying other devices by entering your recovery key.": "Accédez à l’historique de vos messages secrets et à votre identité de signature croisée pour vérifier d’autres appareils en saisissant votre clé de récupération.", "If you've forgotten your recovery key you can .": "Si vous avez oublié votre clé de récupération vous pouvez .", "Warning: You should only set up key backup from a trusted computer.": "Attention : Vous devriez uniquement configurer une sauvegarde de clés depuis un ordinateur de confiance.", "If you've forgotten your recovery key you can ": "Si vous avez oublié votre clé de récupération, vous pouvez ", - "Warning: You should only set up secret storage from a trusted computer.": "Attention : Vous devriez uniquement configurer le coffre secret depuis un ordinateur de confiance.", - "We'll use secret storage to optionally store an encrypted copy of your cross-signing identity for verifying other devices and message keys on our server. Protect your access to encrypted messages with a passphrase to keep it secure.": "Nous utiliserons le coffre secret pour conserver optionnellement une copie chiffrée de votre identité de signature croisée pour vérifier d’autres appareils et des clés de messages sur notre serveur. Protégez votre accès aux messages chiffrés avec une phrase de passe pour la sécuriser.", "Set up with a recovery key": "Configurer avec une clé de récupération", "As a safety net, you can use it to restore your access to encrypted messages if you forget your passphrase.": "Par mesure de sécurité, vous pouvez l’utiliser pour récupérer l’accès aux messages chiffrés si vous oubliez votre phrase de passe.", "As a safety net, you can use it to restore your access to encrypted messages.": "Par mesure de sécurité, vous pouvez l’utiliser pour récupérer l’accès à vos messages chiffrés.", "Keep your recovery key somewhere very secure, like a password manager (or a safe).": "Conservez votre clé de récupération dans un endroit très sécurisé, comme un gestionnaire de mots de passe (ou un coffre-fort).", "Your recovery key has been copied to your clipboard, paste it to:": "Votre clé de récupération a été copiée dans votre presse-papiers, collez-la pour :", "Your recovery key is in your Downloads folder.": "Votre clé de récupération est dans votre dossier de Téléchargements.", - "Your access to encrypted messages is now protected.": "Votre accès aux messages chiffrés est maintenant protégé.", - "Without setting up secret storage, you won't be able to restore your access to encrypted messages or your cross-signing identity for verifying other devices if you log out or use another device.": "Si vous ne configurez pas le coffre secret, vous ne pourrez pas récupérer l’accès à vos messages chiffrés ou à votre identité de signature croisée pour vérifier d’autres appareils si vous vous déconnectez ou si vous utilisez un autre appareil.", - "Set up secret storage": "Configurer le coffre secret", - "Secure your encrypted messages with a passphrase": "Sécuriser vos messages chiffrés avec une phrase de passe", "Storing secrets...": "Sauvegarde des secrets…", "Unable to set up secret storage": "Impossible de configurer le coffre secret", "Cross-signing and secret storage are enabled.": "La signature croisée et le coffre secret sont activés.", - "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this device.": "Votre compte a une identité de signature croisée dans le coffre secret, mais cet appareil ne lui fait pas encore confiance.", "Cross-signing and secret storage are not yet set up.": "La signature croisée et le coffre secret ne sont pas encore configurés.", "Bootstrap cross-signing and secret storage": "Initialiser la signature croisée et le coffre secret", "not stored": "non sauvegardé", "Backup has a valid signature from this user": "La sauvegarde a une signature valide de cet utilisateur", "Backup has a invalid signature from this user": "La sauvegarde a une signature non valide de cet utilisateur", "Backup has a signature from unknown user with ID %(deviceId)s": "La sauvegarde a une signature de l’utilisateur inconnu ayant pour identifiant %(deviceId)s", - "Backup has a signature from unknown device with ID %(deviceId)s": "La sauvegarde a une signature de l’appareil inconnu ayant pour identifiant %(deviceId)s", - "Backup key stored in secret storage, but this feature is not enabled on this device. Please enable cross-signing in Labs to modify key backup state.": "La clé de sauvegarde est stockée dans le coffre secret, mais cette fonctionnalité n’est pas activée sur cet appareil. Activez la signature croisée dans le Labo pour modifier l’état de la sauvegarde de clé.", "Backup key stored: ": "Clé de sauvegarde stockée : ", - "Start using Key Backup with Secure Secret Storage": "Commencer à utiliser la sauvegarde de clés avec le coffre secret sécurisé", "Hide verified sessions": "Masquer les sessions vérifiées", "%(count)s verified sessions|other": "%(count)s sessions vérifiées", "%(count)s verified sessions|one": "1 session vérifiée", "Close preview": "Fermer l’aperçu", - "This user has not verified all of their devices.": "Cet utilisateur n'a pas vérifié tous ses appareils.", - "You have not verified this user. This user has verified all of their devices.": "Vous n'avez pas vérifié cet utilisateur. Cet utilisateur a vérifié tous ses appareils.", - "You have verified this user. This user has verified all of their devices.": "Vous avez vérifié cet utilisateur. Cet utilisateur a vérifié tous ses appareils.", - "Some users in this encrypted room are not verified by you or they have not verified their own devices.": "Certains utilisateurs dans ce salon chiffré n’ont pas été vérifiés par vous ou n’ont pas vérifié leurs propres appareils.", - "All users in this encrypted room are verified by you and they have verified their own devices.": "Tous les utilisateurs de ce salon chiffré ont été vérifiés par vous et ont vérifié leurs propres appareils.", "Language Dropdown": "Sélection de la langue", "Country Dropdown": "Sélection du pays", "The message you are trying to send is too large.": "Le message que vous essayez d’envoyer est trop gros.", - "Secret Storage will be set up using your existing key backup details.Your secret storage passphrase and recovery key will be the same as they were for your key backup": "Le coffre secret sera configuré en utilisant vos informations de sauvegarde de clés existantes. Votre phrase de passe et votre clé de récupération seront les mêmes que pour la sauvegarde de clés", - "Migrate from Key Backup": "Migrer depuis la sauvegarde de clés", "Help": "Aide", - "New DM invite dialog (under development)": "Nouveau dialogue d’invitation aux MD (en développement)", "Show more": "En voir plus", "Recent Conversations": "Conversations récentes", "Direct Messages": "Messages directs", - "If you can't find someone, ask them for their username, or share your username (%(userId)s) or profile link.": "Si vous n’arrivez pas à trouver quelqu’un, demandez-lui son nom d’utilisateur ou partagez votre nom d’utilisateur (%(userId)s) ou votre lien de profil.", "Go": "C’est parti", "Show info about bridges in room settings": "Afficher des informations à propos des passerelles dans les paramètres du salon", - "This bridge was provisioned by ": "Cette passerelle est fournie par ", "This bridge is managed by .": "Cette passerelle est gérée par .", - "Bridged into , on ": "Relié à , sur ", - "Connected to on ": "Connecté à sur ", - "Connected via %(protocolName)s": "Connecté via %(protocolName)s", - "Bridge Info": "Informations de la passerelle", - "Below is a list of bridges connected to this room.": "Vous trouverez ci-dessous la liste des passerelles connectées à ce salon.", "Suggestions": "Suggestions", "Failed to find the following users": "Impossible de trouver les utilisateurs suivants", "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "Les utilisateurs suivant n’existent peut-être pas ou ne sont pas valides, et ne peuvent pas être invités : %(csvNames)s", "Show a presence dot next to DMs in the room list": "Afficher une pastille de présence à côté des messages directs dans la liste des salons", "Lock": "Cadenas", - "Key Backup is enabled on your account but has not been set up from this session. To set up secret storage, restore your key backup.": "La sauvegarde de clés est activée pour votre compte mais n’a pas été configurée pour cette session. Pour configurer le coffre secret, restaurez votre sauvegarde de clés.", "Restore": "Restaurer", - "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup": "Le coffre secret sera configuré en utilisant les paramètres existants de la sauvegarde de clés. Votre phrase de passe et votre clé de récupération seront les mêmes que celles de votre sauvegarde de clés", - "Restore your Key Backup": "Restaurer votre sauvegarde de clés", "a few seconds ago": "il y a quelques secondes", "about a minute ago": "il y a environ une minute", "%(num)s minutes ago": "il y a %(num)s minutes", @@ -2057,7 +1902,6 @@ "%(num)s hours from now": "dans %(num)s heures", "about a day from now": "dans un jour environ", "%(num)s days from now": "dans %(num)s jours", - "New invite dialog": "Nouvelle boîte de dialogue d’invitation", "Failed to invite the following users to chat: %(csvUsers)s": "Échec de l’invitation des utilisateurs suivants à discuter : %(csvUsers)s", "We couldn't create your DM. Please check the users you want to invite and try again.": "Impossible de créer votre Message direct. Vérifiez les utilisateurs que vous souhaitez inviter et réessayez.", "Something went wrong trying to invite the users.": "Une erreur est survenue en essayant d’inviter les utilisateurs.", @@ -2070,17 +1914,12 @@ "Session verified": "Session vérifiée", "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Votre nouvelle session est maintenant vérifiée. Elle a accès à vos messages chiffrés et les autres utilisateurs la verront comme fiable.", "Done": "Terminé", - "Without completing security on this device, it won’t have access to encrypted messages.": "Si vous ne complétez pas la sécurité sur cet appareil, vous n’aurez pas accès aux messages chiffrés.", "Go Back": "Retourner en arrière", - "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup.": "Le coffre secret sera configuré en utilisant les détails existants de votre sauvegarde de clés. Votre phrase de passe et votre clé de récupération seront les mêmes que celles de votre sauvegarde de clés.", - "New Session": "Nouvelle session", "Other users may not trust it": "D’autres utilisateurs pourraient ne pas lui faire confiance", "Later": "Plus tard", "Verify User": "Vérifier l’utilisateur", "For extra security, verify this user by checking a one-time code on both of your devices.": "Pour une meilleure sécurité, vérifiez cet utilisateur en comparant un code à usage unique sur vos deux appareils.", - "For maximum security, do this in person.": "Pour une sécurité maximale, faites-le en personne.", "Start Verification": "Commencer la vérification", - "Encrypted by a deleted device": "Chiffré par un appareil supprimé", "Unknown Command": "Commande inconnue", "Unrecognised command: %(commandText)s": "Commande non reconnue : %(commandText)s", "You can use /help to list available commands. Did you mean to send this as a message?": "Vous pouvez utiliser /help pour obtenir la liste des commandes disponibles. Vouliez-vous envoyer un message ?", @@ -2092,12 +1931,9 @@ "Reject & Ignore user": "Rejeter et ignorer l’utilisateur", "Enter your account password to confirm the upgrade:": "Saisissez le mot de passe de votre compte pour confirmer la mise à niveau :", "You'll need to authenticate with the server to confirm the upgrade.": "Vous devrez vous identifier avec le serveur pour confirmer la mise à niveau.", - "Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Mettez à niveau cet appareil pour lui permettre de vérifier d’autres appareils, qui pourront alors accéder aux messages chiffrés et seront vus comme fiables par les autres utilisateurs.", - "Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Configurez le chiffrement sur cet appareil pour lui permettre de vérifier d’autres appareils, qui pourront alors accéder aux messages chiffrés et seront vus comme fiables par les autres utilisateurs.", "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Sécurisez vos clés de chiffrement avec une phrase de passe. Pour une sécurité maximale, elle devrait être différente du mot de passe de votre compte :", "Enter a passphrase": "Saisissez une phrase de passe", "Enter your passphrase a second time to confirm it.": "Saisissez votre phrase de passe une seconde fois pour la confirmer.", - "This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Cet appareil peut à présent vérifier d’autres appareils, qui pourront alors accéder aux messages chiffrés et seront vus comme fiables par les autres utilisateurs.", "Verify other users in their profile.": "Vérifiez d’autres utilisateurs dans leur profil.", "Upgrade your encryption": "Mettre à niveau votre chiffrement", "Set up encryption": "Configurer le chiffrement", @@ -2105,7 +1941,6 @@ "Encryption setup complete": "Configuration du chiffrement terminé", "%(senderName)s turned on end-to-end encryption.": "%(senderName)s a activé le chiffrement de bout en bout.", "%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s a activé le chiffrement de bout en bout (algorithme %(algorithm)s non reconnu).", - "Someone is using an unknown device": "Quelqu'un utilise un appareil inconnu", "This room is end-to-end encrypted": "Ce salon est chiffré de bout en bout", "Everyone in this room is verified": "Tout le monde dans ce salon est vérifié", "Invite only": "Uniquement sur invitation", @@ -2115,9 +1950,7 @@ "Verify this session": "Vérifier cette session", "Encryption upgrade available": "Mise à niveau du chiffrement disponible", "Enable message search in encrypted rooms": "Activer la recherche de messages dans les salons chiffrés", - "Review & verify your new session": "Examiner et vérifier votre nouvelle session", "Review": "Examiner", - "Verify your other devices easier": "Vérifiez vos autres appareils facilement", "Securely cache encrypted messages locally for them to appear in search results, using ": "Mettre en cache les messages chiffrés localement et de manière sécurisée pour qu’ils apparaissent dans les résultats de recherche, en utilisant ", " to store messages from ": " pour stocker des messages de ", "rooms.": "salons.", @@ -2138,7 +1971,6 @@ "Waiting for %(displayName)s to verify…": "Nous attendons que %(displayName)s vérifie…", "They match": "Ils correspondent", "They don't match": "Ils ne correspondent pas", - "For ultimate security, do this in person or use another way to communicate.": "Pour une sécurité maximale, faites cela en personne ou utilisez un autre moyen de communication.", "This bridge was provisioned by .": "Cette passerelle a été fournie par .", "Workspace: %(networkName)s": "Espace de travail : %(networkName)s", "Channel: %(channelName)s": "Canal : %(channelName)s", @@ -2153,7 +1985,6 @@ "Your homeserver": "Votre serveur d’accueil", "The homeserver the user you’re verifying is connected to": "Le serveur d’accueil auquel l’utilisateur que vous vérifiez est connecté", "Yours, or the other users’ internet connection": "Votre connexion internet ou celle de l’autre utilisateur", - "Yours, or the other users’ device": "Votre appareil ou celui de l’autre ordinateur", "Verify by emoji": "Vérifier avec des émojis", "Verify by comparing unique emoji.": "Vérifier en comparant des émojis uniques.", "Ask %(displayName)s to scan your code:": "Demandez à %(displayName)s de scanner votre code :", diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 0b80c41f65..346dda09f2 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -11,7 +11,6 @@ "You cannot place a call with yourself.": "Non pode facer unha chamada a si mesmo.", "Warning!": "Aviso!", "Call Failed": "Fallou a chamada", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Hai dispositivos descoñecidos en esta sala: se segue adiante sen verificalos, pode ser posible que alguén bote un ollo a súa chamada.", "Review Devices": "Revisar dispositivos", "Call Anyway": "Chamar igualmente", "Answer Anyway": "Responder igualmente", @@ -66,10 +65,6 @@ "Moderator": "Moderador", "Admin": "Administrador", "Start a chat": "Iniciar unha conversa", - "Who would you like to communicate with?": "Con quen desexa comunicarse?", - "Start Chat": "Iniciar conversa", - "Invite new room members": "Convidar a novos participantes", - "Send Invites": "Enviar convites", "Operation failed": "Fallou a operación", "Failed to invite": "Fallou o convite", "Failed to invite the following users to the %(roomName)s room:": "Houbo un fallo convidando os seguintes usuarios á sala %(roomName)s:", @@ -92,13 +87,7 @@ "You are now ignoring %(userId)s": "Agora está a ignorar %(userId)s", "Unignored user": "Usuarios non ignorados", "You are no longer ignoring %(userId)s": "Xa non está a ignorar a %(userId)s", - "Unknown (user, device) pair:": "Parella descoñecida (dispositivo, usuaria):", - "Device already verified!": "Dispositivo xa verificado!", - "WARNING: Device already verified, but keys do NOT MATCH!": "Aviso: o dispositivo xa está verificado só que as chaves NON CONCORDAN!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "AVISO: FALLOU A VERIFICACIÓN DE CHAVES! A chave de firma para o %(userId)s e dispositivo %(deviceId)s é \"%(fprint)s\" que non concorda coa chave proporcionada \"%(fingerprint)s\". Isto podería significar que as súas comunicacións están a ser interceptadas!", "Verified key": "Chave verificada", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "A chave de firma que proporcionou concorda coa chave de firma que recibiu do dispositivo %(deviceId)s de %(userId)s. Dispositivo marcado como verificado.", - "Unrecognised command:": "Orde non recoñecida:", "Reason": "Razón", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s aceptou o convite para %(displayName)s.", "%(targetName)s accepted an invitation.": "%(targetName)s aceptou o convite.", @@ -135,7 +124,6 @@ "%(senderName)s made future room history visible to all room members.": "%(senderName)s fixo visible para todos participantes o historial futuro da sala.", "%(senderName)s made future room history visible to anyone.": "%(senderName)s fixo visible para calquera o historial futuro da sala.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s fixo visible o historial futuro da sala para descoñecidos (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s activou o cifrado de par-a-par (algoritmo %(algorithm)s).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s desde %(fromPowerLevel)s a %(toPowerLevel)s", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s cambiou o nivel de autoridade a %(powerLevelDiffText)s.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s cambiou as mensaxes fixadas para a sala.", @@ -158,8 +146,6 @@ "Autoplay GIFs and videos": "Reprodución automática de GIFs e vídeos", "Enable automatic language detection for syntax highlighting": "Activar a detección automática de idioma para o resalte da sintaxe", "Automatically replace plain text Emoji": "Substituír automaticamente Emoji en texto plano", - "Never send encrypted messages to unverified devices from this device": "Nunca enviar mensaxes cifradas aos dispositivos que non estean verificados neste dispositivo", - "Never send encrypted messages to unverified devices in this room from this device": "Nunca enviar mensaxes cifradas aos dispositivos que non estean verificados nesta sala desde este dispositivo", "Enable inline URL previews by default": "Activar por defecto as vistas previas en liña de URL", "Enable URL previews for this room (only affects you)": "Activar avista previa de URL nesta sala (só lle afecta a vostede)", "Enable URL previews by default for participants in this room": "Activar a vista previa de URL por defecto para as participantes nesta sala", @@ -181,7 +167,6 @@ "No display name": "Sen nome público", "New passwords don't match": "Os contrasinais novos non coinciden", "Passwords can't be empty": "Os contrasinais non poden estar baleiros", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ao cambiar o contrasinal restablecerá todas as chaves de cifrado extremo-a-extremo en todos os dispositivos, facendo ilexible o historial da conversa a menos que primeiro exporte as chaves da sala e posteriormente as importe. No futuro melloraremos isto.", "Continue": "Continuar", "Export E2E room keys": "Exportar chaves E2E da sala", "Do you want to set an email address?": "Quere establecer un enderezo de correo electrónico?", @@ -190,10 +175,7 @@ "New Password": "Novo contrasinal", "Confirm password": "Confirme o contrasinal", "Change Password": "Cambiar contrasinal", - "Unable to load device list": "Non se puido cargar a lista de dispositivos", "Authentication": "Autenticación", - "Delete %(count)s devices|other": "Eliminar %(count)s dispositivos", - "Delete %(count)s devices|one": "Eliminar dispositivo", "Device ID": "ID de dispositivo", "Last seen": "Visto por última vez", "Failed to set display name": "Fallo ao establecer o nome público", @@ -213,9 +195,6 @@ "%(senderName)s sent a video": "%(senderName)s enviou un vídeo", "%(senderName)s uploaded a file": "%(senderName)s subiu un ficheiro", "Options": "Axustes", - "Undecryptable": "Non descifrable", - "Encrypted by an unverified device": "Cifrado por un dispositivo non verificado", - "Unencrypted message": "Mensaxe non cifrada", "Please select the destination room for this message": "Escolla por favor a sala de destino para esta mensaxe", "Blacklisted": "Omitidos", "device id: ": "id dispositivo: ", @@ -234,8 +213,6 @@ "Failed to change power level": "Fallo ao cambiar o nivel de permisos", "Are you sure?": "Está segura?", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Non poderá desfacer este cambio xa que lle estará promocionando e outorgándolle a outra persoa os mesmos permisos que os seus.", - "No devices with registered encryption keys": "Sen dispositivos con chaves de cifrado rexistradas", - "Devices": "Dispositivos", "Unignore": "Non ignorar", "Ignore": "Ignorar", "Jump to read receipt": "Ir ao resgardo de lectura", @@ -258,20 +235,14 @@ "Voice call": "Chamada de voz", "Video call": "Chamada de vídeo", "Upload file": "Subir ficheiro", - "Show Text Formatting Toolbar": "Mostrar barra de formato de texto", "Send an encrypted reply…": "Enviar unha resposta cifrada…", "Send a reply (unencrypted)…": "Enviar unha resposta (non cifrada)…", "Send an encrypted message…": "Enviar unha mensaxe cifrada…", "Send a message (unencrypted)…": "Enviar unha mensaxe (non cifrada)…", "You do not have permission to post to this room": "Non ten permiso para comentar nesta sala", - "Hide Text Formatting Toolbar": "Agochar barra de formato de texto", "Server error": "Fallo no servidor", "Server unavailable, overloaded, or something else went wrong.": "Servidor non dispoñible, sobrecargado, ou outra cousa puido fallar.", "Command error": "Erro na orde", - "bold": "remarcado", - "italic": "cursiva", - "Markdown is disabled": "Markdown desactivado", - "Markdown is enabled": "Markdown activado", "Unpin Message": "Desfixar mensaxe", "Jump to message": "Ir a mensaxe", "No pinned messages.": "Sen mensaxes fixadas.", @@ -307,7 +278,6 @@ "Community Invites": "Convites da comunidade", "Invites": "Convites", "Favourites": "Favoritas", - "People": "Xente", "Rooms": "Salas", "Low priority": "Baixa prioridade", "Historical": "Historial", @@ -342,8 +312,6 @@ "Cancel": "Cancelar", "Jump to first unread message.": "Ir a primeira mensaxe non lida.", "Close": "Pechar", - "Invalid alias format": "Formato de alias non válido", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' non é un formato válido para un alias", "not specified": "non indicado", "Remote addresses for this room:": "Enderezos remotos para esta sala:", "Local addresses for this room:": "O enderezo local para esta sala:", @@ -505,20 +473,12 @@ "Unknown error": "Fallo descoñecido", "Incorrect password": "Contrasinal incorrecto", "Deactivate Account": "Desactivar conta", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Para verificar que se pode confiar neste dispositivo, contacte co seu dono utilizando algún outro medio (ex. en persoa ou chamada de teléfono) e pregúntelle se a clave que ven nos axustes de usuario do se dispositivo coincide coa clave inferior:", - "Device name": "Nome do dispositivo", - "Device key": "Chave do dispositivo", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Se concorda, pulse o botón verificar. Si non, entón alguén está interceptando este dispositivo e probablemente vostede desexe pulsar o botón lista negra.", - "Verify device": "Verificar dispositivo", "I verify that the keys match": "Certifico que coinciden as chaves", "An error has occurred.": "Algo fallou.", "OK": "OK", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Engadiu un novo dispositivo '%(displayName)s', que está a solicitar as chaves de cifrado.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "O seu dispositivo non verificado '%(displayName)s' está solicitando chaves de cifrado.", "Start verification": "Iniciar verificación", "Share without verifying": "Compartir sen verificar", "Ignore request": "Ignorar petición", - "Loading device info...": "Cargando información do dispositivo...", "Encryption key request": "Petición de chave de cifrado", "Unable to restore session": "Non se puido restaurar a sesión", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Si anteriormente utilizou unha versión máis recente de Riot, a súa sesión podería non ser compatible con esta versión. Peche esta ventá e volva a versión máis recente.", @@ -537,11 +497,6 @@ "To get started, please pick a username!": "Para comezar, escolla un nome de usuaria!", "This will be your account name on the homeserver, or you can pick a different server.": "Este será o nome da súa conta no servidor, ou pode escoller un servidor diferente.", "If you already have a Matrix account you can log in instead.": "Se xa ten unha conta Matrix entón pode conectarse.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Neste momento está por na lista negra os dispositivos non verificados; para enviar mensaxes a eses dispositivos debe verificalos.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Recomendámoslle que vaia ao proceso de verificación para cada dispositivo para confirmar que pertencen ao seu dono lexítimos, pero se o prefire pode enviar a mensaxe sen ter verificado.", - "Room contains unknown devices": "A sala contén dispositivos descoñecidos", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contén dispositivos que vostede non vira antes.", - "Unknown devices": "Dispositivos descoñecidos", "Private Chat": "Conversa privada", "Public Chat": "Conversa pública", "Custom": "Personalizada", @@ -599,8 +554,6 @@ "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Crear unha comunidade para agrupar usuarias e salas! Poña unha páxina de inicio personalizada para destacar o seu lugar no universo Matrix.", "You have no visible notifications": "Non ten notificacións visibles", "Scroll to bottom of page": "Desprácese ate o final da páxina", - "Message not sent due to unknown devices being present": "Non se enviou a mensaxe porque hai dispositivos non coñecidos", - "Show devices, send anyway or cancel.": "Mostrar dispositivos, enviar igualmente ou cancelar.", "%(count)s of your messages have not been sent.|other": "Algunha das súas mensaxes non foron enviadas.", "%(count)s of your messages have not been sent.|one": "A súa mensaxe non foi enviada.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Reenviar todo ou bencancelar todo. Tamén pode seleccionar mensaxes individuais para reenviar ou cancelar.", @@ -634,13 +587,10 @@ "Sign out": "Desconectar", "Failed to change password. Is your password correct?": "Fallo ao cambiar o contrasinal. É correcto o contrasinal?", "Success": "Parabéns", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "O seu contrasinal cambiouse correctamente. Non recibirá notificacións tipo push en outros dispositivos ate que se conecte novamente en eles", "Unable to remove contact information": "Non se puido eliminar a información do contacto", "": "", "Import E2E room keys": "Importar chaves E2E da sala", "Cryptography": "Criptografía", - "Device ID:": "ID de dispositivo:", - "Device key:": "Chave do dispositivo:", "Analytics": "Analytics", "Riot collects anonymous analytics to allow us to improve the application.": "Riot recolle información analítica anónima para permitirnos mellorar o aplicativo.", "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "A intimidade impórtanos, así que non recollemos información personal ou identificable nos datos dos nosos análises.", @@ -664,7 +614,6 @@ "click to reveal": "pulse para revelar", "Homeserver is": "O servidor de inicio é", "Identity Server is": "O servidor de identidade é", - "matrix-react-sdk version:": "versión matrix-react-sdk:", "riot-web version:": "versión riot-web:", "olm version:": "versión olm:", "Failed to send email": "Fallo ao enviar correo electrónico", @@ -695,7 +644,6 @@ "Kicks user with given id": "Expulsa usuaria co id proporcionado", "Changes your display nickname": "Cambia o alcume mostrado", "Searches DuckDuckGo for results": "Buscar en DuckDuckGo por resultados", - "Verifies a user, device, and pubkey tuple": "Valida o conxunto de usuaria, dispositivo e chave pública", "Ignores a user, hiding their messages from you": "Ignora unha usuaria, agochándolle as súas mensaxes", "Stops ignoring a user, showing their messages going forward": "Deixa de ignorar unha usuaria, mostrándolles as súas mensaxes a partir de agora", "Commands": "Comandos", @@ -719,7 +667,6 @@ "Session ID": "ID de sesión", "End-to-end encryption information": "Información do cifrado extremo-a-extremo", "Event information": "Información do evento", - "Sender device information": "Información do dispositivo do remitente", "Passphrases must match": "As frases de paso deben coincidir", "Passphrase must not be empty": "A frase de paso non pode quedar baldeira", "Export room keys": "Exportar chaves da sala", @@ -750,11 +697,7 @@ "Failed to set direct chat tag": "Fallo ao establecer etiqueta do chat directo", "Failed to remove tag %(tagName)s from room": "Fallo ao eliminar a etiqueta %(tagName)s da sala", "Failed to add tag %(tagName)s to room": "Fallo ao engadir a etiqueta %(tagName)s a sala", - "Your key share request has been sent - please check your other devices for key share requests.": "Enviouse a solicitude de compartir chave - por favor comprobe as peticións de compartir chaves nos seus outros dispositivos.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "As peticións de compartir chaves envíanse de xeito automático aos seus outros dispositivos. Se rexeita o obvia estas peticións nos outros dispositivos, pulse aquí para solicitar novamente as chaves para esta sesión.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Se os seus outros dispositivos non teñen as chaves para este mensaxe non poderán descifrala.", "Key request sent.": "Petición de chave enviada.", - "Re-request encryption keys from your other devices.": "Volver a pedir chaves de cifrado desde os outros dispositivos.", "Flair": "Aura", "Showing flair for these communities:": "Mostrar a aura para estas comunidades:", "Display your community flair in rooms configured to show it.": "Mostrar a aura da súa comunidade nas salas configuradas para que a mostren.", @@ -823,7 +766,6 @@ "Files": "Ficheiros", "Collecting app version information": "Obtendo información sobre a versión da app", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Eliminar o alcume da sala %(alias)s e borrar %(name)s do directorio?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Isto permitiralle volver a súa conta tras desconectarse, e conectarse en outros dispositivos.", "Keywords": "Palabras chave", "Enable notifications for this account": "Activar notificacións para esta conta", "Invite to this community": "Convidar a esta comunidade", @@ -912,8 +854,6 @@ "Your device resolution": "Resolución do dispositivo", "Missing roomId.": "Falta o ID da sala.", "Always show encryption icons": "Mostra sempre iconas de cifrado", - "Unable to reply": "Non puido responder", - "At this time it is not possible to reply with an emote.": "Neste intre non é posible responder con un emote.", "Popout widget": "trebello emerxente", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Non se cargou o evento ao que respondía, ou non existe ou non ten permiso para velo.", "Send Logs": "Enviar informes", @@ -958,12 +898,6 @@ "This event could not be displayed": "Non se puido amosar este evento", "Demote yourself?": "Baixarse a si mesmo de rango?", "Demote": "Baixar de rango", - "deleted": "eliminado", - "underlined": "subliñado", - "inline-code": "código en liña", - "block-quote": "bloque de citas", - "bulleted-list": "lista de puntos", - "numbered-list": "lista numérica", "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.": "Nas salas cifradas, como é esta, está desactivado por defecto a previsualización das URL co fin de asegurarse de que o servidor local (que é onde se gardan as previsualizacións) non poida recoller información sobre das ligazóns que se ven nesta sala.", "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.": "Cando alguén pon unha URL na mensaxe, esta previsualízarase para que así se coñezan xa cousas delas como o título, a descrición ou as imaxes que inclúe ese sitio web.", "The email field must not be blank.": "Este campo de correo non pode quedar en branco.", diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json index 335c516105..9c3e383afc 100644 --- a/src/i18n/strings/he.json +++ b/src/i18n/strings/he.json @@ -3,7 +3,6 @@ "This phone number is already in use": "מספר הטלפון הזה כבר בשימוש", "Failed to verify email address: make sure you clicked the link in the email": "אימות כתובת הדוא\"ל נכשלה: וודא שלחצת על הקישור בדוא\"ל", "Call Failed": "השיחה נכשלה", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "ישנם מכשירים לא ידועים בחדר: המשך ללא אימותם יאפשר למישהו לצוטט לשיחתך.", "Review Devices": "סקירת מכשירים", "Call Anyway": "התקשר בכל זאת", "Answer Anyway": "ענה בכל זאת", @@ -126,7 +125,6 @@ "Resend": "שלח מחדש", "Collecting app version information": "אוסף מידע על גרסת היישום", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "מחק כינוי %(alias)s של החדר והסר את %(name)s מהרשימה?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "זה יאפשר לך לחזור לחשבונך אחרי התנתקות ולהתחבר באמצעות התקנים אחרים.", "Keywords": "מילות מפתח", "Enable notifications for this account": "אפשר התראות לחשבון זה", "Invite to this community": "הזמן לקהילה זו", diff --git a/src/i18n/strings/hi.json b/src/i18n/strings/hi.json index 5afba35a94..3028566536 100644 --- a/src/i18n/strings/hi.json +++ b/src/i18n/strings/hi.json @@ -27,7 +27,6 @@ "The information being sent to us to help make Riot.im better includes:": "Riot.im को बेहतर बनाने के लिए हमें भेजी गई जानकारी में निम्नलिखित शामिल हैं:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "जहां इस पृष्ठ में पहचान योग्य जानकारी शामिल है, जैसे कि रूम, यूजर या समूह आईडी, वह डाटा सर्वर को भेजे से पहले हटा दिया जाता है।", "Call Failed": "कॉल विफल", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "इस रूम में अज्ञात डिवाइस हैं: यदि आप उन्हें सत्यापित किए बिना आगे बढ़ते हैं, तो किसी और के लिए आपकी कॉल पर नजर डालना संभव हो सकता हैं।", "Review Devices": "डिवाइस की समीक्षा करें", "Call Anyway": "वैसे भी कॉल करें", "Answer Anyway": "वैसे भी जवाब दें", @@ -99,10 +98,6 @@ "Moderator": "मध्यस्थ", "Admin": "व्यवस्थापक", "Start a chat": "एक चैट शुरू करें", - "Who would you like to communicate with?": "आप किसके साथ संवाद करना चाहते हैं?", - "Start Chat": "चैट शुरू करें", - "Invite new room members": "नए रूम के सदस्यों को आमंत्रित करें", - "Send Invites": "आमंत्रण भेजें", "Operation failed": "कार्रवाई विफल", "Failed to invite": "आमंत्रित करने में विफल", "Failed to invite the following users to the %(roomName)s room:": "निम्नलिखित उपयोगकर्ताओं को %(roomName)s रूम में आमंत्रित करने में विफल:", @@ -139,16 +134,9 @@ "Define the power level of a user": "उपयोगकर्ता के पावर स्तर को परिभाषित करें", "Deops user with given id": "दिए गए आईडी के साथ उपयोगकर्ता को देओप्स करना", "Opens the Developer Tools dialog": "डेवलपर टूल्स संवाद खोलता है", - "Verifies a user, device, and pubkey tuple": "उपयोगकर्ता, डिवाइस और पबकी टुपल को सत्यापित करता है", - "Unknown (user, device) pair:": "अज्ञात (उपयोगकर्ता, डिवाइस) जोड़ी:", - "Device already verified!": "डिवाइस पहले ही सत्यापित है!", - "WARNING: Device already verified, but keys do NOT MATCH!": "चेतावनी: डिवाइस पहले ही सत्यापित है, लेकिन चाबियाँ मेल नहीं खाती हैं!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "चेतावनी: कुंजी सत्यापन विफल! %(userId)s और डिवाइस %(deviceId)s के लिए हस्ताक्षर कुंजी \"%(fprint)s\" है जो प्रदान की गई कुंजी \"%(fingerprint)s\" से मेल नहीं खाती है। इसका मतलब यह हो सकता है कि आपके संचार को अंतरग्रहण किया जा रहा है!", "Verified key": "सत्यापित कुंजी", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "आपके द्वारा प्रदान की गई हस्ताक्षर कुंजी %(userId)s के डिवाइस %(deviceId)s से प्राप्त हस्ताक्षर कुंजी से मेल खाती है। डिवाइस सत्यापित के रूप में चिह्नित किया गया है।", "Displays action": "कार्रवाई प्रदर्शित करता है", "Forces the current outbound group session in an encrypted room to be discarded": "एक एन्क्रिप्टेड रूम में मौजूदा आउटबाउंड समूह सत्र को त्यागने के लिए मजबूर करता है", - "Unrecognised command:": "अपरिचित आदेश:", "Reason": "कारण", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s ने %(displayName)s के लिए निमंत्रण को स्वीकार कर लिया है।", "%(targetName)s accepted an invitation.": "%(targetName)s ने एक निमंत्रण स्वीकार कर लिया।", @@ -193,7 +181,6 @@ "%(senderName)s made future room history visible to all room members.": "%(senderName)s ने भविष्य के रूम का इतिहास सभी रूम के सदस्यों के लिए दृश्यमान बना दिया।", "%(senderName)s made future room history visible to anyone.": "%(senderName)s ने भविष्य के रूम का इतिहास हर किसी के लिए दृश्यमान बना दिया।", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s ने भविष्य के रूम का इतिहास अज्ञात (%(visibility)s) के लिए दृश्यमान बनाया।", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ने एंड-टू-एंड एन्क्रिप्शन (एल्गोरिदम %(algorithm)s) चालू कर दिया।", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s का %(fromPowerLevel)s से %(toPowerLevel)s", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ने %(powerLevelDiffText)s के पावर स्तर को बदल दिया।", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s ने रूम के लिए पिन किए गए संदेश को बदल दिया।", @@ -225,8 +212,6 @@ "Automatically replace plain text Emoji": "स्वचालित रूप से सादा पाठ इमोजी को प्रतिस्थापित करें", "Mirror local video feed": "स्थानीय वीडियो फ़ीड को आईना करें", "Send analytics data": "विश्लेषण डेटा भेजें", - "Never send encrypted messages to unverified devices from this device": "इस डिवाइस से असत्यापित डिवाइस पर एन्क्रिप्टेड संदेश कभी न भेजें", - "Never send encrypted messages to unverified devices in this room from this device": "इस डिवाइस से असत्यापित डिवाइस पर एन्क्रिप्टेड संदेश कभी न भेजें", "Enable inline URL previews by default": "डिफ़ॉल्ट रूप से इनलाइन यूआरएल पूर्वावलोकन सक्षम करें", "Enable URL previews for this room (only affects you)": "इस रूम के लिए यूआरएल पूर्वावलोकन सक्षम करें (केवल आपको प्रभावित करता है)", "Enable URL previews by default for participants in this room": "इस रूम में प्रतिभागियों के लिए डिफ़ॉल्ट रूप से यूआरएल पूर्वावलोकन सक्षम करें", @@ -261,7 +246,6 @@ "New passwords don't match": "नए पासवर्ड मेल नहीं खाते हैं", "Passwords can't be empty": "पासवर्ड खाली नहीं हो सकते हैं", "Warning!": "चेतावनी!", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "पासवर्ड बदलना वर्तमान में सभी उपकरणों पर किसी भी एंड-टू-एंड एन्क्रिप्शन कुंजी को रीसेट कर देगा, एन्क्रिप्टेड चैट इतिहास को अपठनीय बनायेगा, जब तक कि आप पहले अपनी रूम कुंजियां निर्यात न करें और बाद में उन्हें फिर से आयात न करें। भविष्य में यह सुधार होगा।", "Export E2E room keys": "E2E रूम कुंजी निर्यात करें", "Do you want to set an email address?": "क्या आप एक ईमेल पता सेट करना चाहते हैं?", "Current password": "वर्तमान पासवर्ड", @@ -269,10 +253,7 @@ "New Password": "नया पासवर्ड", "Confirm password": "पासवर्ड की पुष्टि कीजिये", "Change Password": "पासवर्ड बदलें", - "Unable to load device list": "डिवाइस सूची लोड करने में असमर्थ", "Authentication": "प्रमाणीकरण", - "Delete %(count)s devices|other": "%(count)s यंत्र हटाएं", - "Delete %(count)s devices|one": "यंत्र हटाएं", "Device ID": "यंत्र आईडी", "Last seen": "अंतिम बार देखा गया", "Failed to set display name": "प्रदर्शन नाम सेट करने में विफल", @@ -280,12 +261,7 @@ "Enable Notifications": "सूचनाएं सक्षम करें", "Delete Backup": "बैकअप हटाएं", "Unable to load key backup status": "कुंजी बैकअप स्थिति लोड होने में असमर्थ", - "Backup has a valid signature from this device": "इस डिवाइस से बैकअप में वैध हस्ताक्षर है", - "Backup has a valid signature from unverified device ": "असत्यापित डिवाइस से बैकअप में मान्य हस्ताक्षर है", - "Backup has an invalid signature from verified device ": "सत्यापित डिवाइस से बैकअप में अमान्य हस्ताक्षर है", - "Backup has an invalid signature from unverified device ": "असत्यापित डिवाइस से बैकअप में अमान्य हस्ताक्षर है", "Verify...": "सत्यापित करें ...", - "Backup is not signed by any of your devices": "बैकअप आपके किसी भी डिवाइस द्वारा हस्ताक्षरित नहीं है", "Backup version: ": "बैकअप संस्करण: ", "Algorithm: ": "कलन विधि: ", "Error saving email notification preferences": "ईमेल अधिसूचना प्राथमिकताओं को सहेजने में त्रुटि", @@ -341,7 +317,6 @@ "Messages containing @room": "@Room युक्त संदेश", "Encrypted messages in one-to-one chats": "एक एक के साथ चैट में एन्क्रिप्टेड संदेश", "Encrypted messages in group chats": "समूह चैट में एन्क्रिप्टेड संदेश", - "Backup has a valid signature from verified device ": "बैकअप के पास सत्यापित डिवाइस से वैध हस्ताक्षर है", "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "हो सकता है कि आपने उन्हें रायट के अलावा किसी अन्य ग्राहक में कॉन्फ़िगर किया हो। आप उन्हें रायट में ट्यून नहीं कर सकते लेकिन वे अभी भी आवेदन करते हैं", "Show message in desktop notification": "डेस्कटॉप अधिसूचना में संदेश दिखाएं", "Off": "बंद", @@ -360,14 +335,7 @@ "%(senderName)s sent a video": "%(senderName)s ने एक वीडियो भेजा", "%(senderName)s uploaded a file": "%(senderName)s ने एक फाइल अपलोड की", "Options": "विकल्प", - "Your key share request has been sent - please check your other devices for key share requests.": "आपका कुंजी शेयर अनुरोध भेजा गया है - कृपया कुंजी शेयर अनुरोधों के लिए अपने अन्य डिवाइस देखें।", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "कुंजी शेयर अनुरोध स्वचालित रूप से अपने अन्य उपकरणों के लिए भेजा जाता है। आप को अस्वीकार कर दिया या अपने अन्य उपकरणों पर कुंजी शेयर अनुरोध को खारिज कर दिया है, तो फिर इस सत्र के लिए कुंजी का अनुरोध करने के लिए यहां क्लिक करें।", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "यदि आपके अन्य उपकरणों में इस संदेश की कुंजी नहीं है तो आप उन्हें डिक्रिप्ट करने में सक्षम नहीं होंगे।", "Key request sent.": "कुंजी अनुरोध भेजा गया।", - "Re-request encryption keys from your other devices.": "अपने अन्य उपकरणों से एन्क्रिप्शन कुंजी का पुन: अनुरोध करें ।", - "Undecryptable": "डिक्रिप्ट करना संभव नहीं", - "Encrypted by an unverified device": "एक असत्यापित डिवाइस द्वारा एन्क्रिप्ट किया गया", - "Unencrypted message": "बिना एन्क्रिप्ट वाला संदेश", "Please select the destination room for this message": "कृपया इस संदेश के लिए गंतव्य रूम का चयन करें", "Blacklisted": "काली सूची में डाला गया", "device id: ": "डिवाइस आईडी: ", @@ -389,8 +357,6 @@ "Failed to change power level": "पावर स्तर बदलने में विफल", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "आप इस परिवर्तन को पूर्ववत नहीं कर पाएंगे क्योंकि आप उपयोगकर्ता को अपने आप से समान शक्ति स्तर रखने के लिए प्रोत्साहित कर रहे हैं।", "Are you sure?": "क्या आपको यकीन है?", - "No devices with registered encryption keys": "पंजीकृत एन्क्रिप्शन कुंजी के साथ कोई डिवाइस नहीं", - "Devices": "उपकरण", "Unignore": "अनदेखा न करें", "Ignore": "अनदेखा करें", "Jump to read receipt": "पढ़ी हुई रसीद में कूदें", @@ -410,20 +376,11 @@ "Invited": "आमंत्रित", "Filter room members": "रूम के सदस्यों को फ़िल्टर करें", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (शक्ति %(powerLevelNumber)s)", - "bold": "बोल्ड", - "italic": "तिरछा", - "deleted": "हटाए गए", - "underlined": "रेखांकित", - "inline-code": "इनलाइन कोड", - "block-quote": "ब्लॉक उद्धरण", - "bulleted-list": "बुलेटेड सूची", - "numbered-list": "गिने-सूची", "Attachment": "आसक्ति", "Hangup": "फोन रख देना", "Voice call": "आवाज कॉल", "Video call": "वीडियो कॉल", "Upload file": "फाइल अपलोड करें", - "Show Text Formatting Toolbar": "टेक्स्ट स्वरूपण टूलबार दिखाएं", "Send an encrypted reply…": "एक एन्क्रिप्टेड उत्तर भेजें …", "Send a reply (unencrypted)…": "एक उत्तर भेजें (अनएन्क्रिप्टेड) …", "Send an encrypted message…": "एक एन्क्रिप्टेड संदेश भेजें …", @@ -431,14 +388,9 @@ "This room has been replaced and is no longer active.": "इस रूम को बदल दिया गया है और अब सक्रिय नहीं है।", "The conversation continues here.": "वार्तालाप यहां जारी है।", "You do not have permission to post to this room": "आपको इस रूम में पोस्ट करने की अनुमति नहीं है", - "Hide Text Formatting Toolbar": "टेक्स्ट स्वरूपण टूलबार छुपाएं", "Server error": "सर्वर त्रुटि", "Server unavailable, overloaded, or something else went wrong.": "सर्वर अनुपलब्ध, अधिभारित, या कुछ और गलत हो गया।", "Command error": "कमांड त्रुटि", - "Unable to reply": "उत्तर देने में असमर्थ", - "At this time it is not possible to reply with an emote.": "इस समय एक भावना के साथ जवाब देना संभव नहीं है।", - "Markdown is disabled": "मार्कडाउन अक्षम है", - "Markdown is enabled": "मार्कडाउन सक्षम है", "No pinned messages.": "कोई पिन संदेश नहीं।", "Loading...": "लोड हो रहा है...", "Pinned Messages": "पिन किए गए संदेश", @@ -502,7 +454,6 @@ "Verify this user by confirming the following emoji appear on their screen.": "इस उपयोगकर्ता की पुष्टि करें कि उनकी स्क्रीन पर निम्नलिखित इमोजी दिखाई देते हैं।", "Verify this user by confirming the following number appears on their screen.": "निम्न स्क्रीन पर दिखाई देने वाली संख्या की पुष्टि करके इस उपयोगकर्ता को सत्यापित करें।", "Unable to find a supported verification method.": "समर्थित सत्यापन विधि खोजने में असमर्थ।", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "अधिकतम सुरक्षा के लिए, हम अनुशंसा करते हैं कि आप इसे व्यक्ति में करें या संचार के किसी अन्य विश्वसनीय साधन का उपयोग करें।", "Dog": "कुत्ता", "Cat": "बिल्ली", "Lion": "शेर", @@ -548,7 +499,6 @@ "Book": "पुस्तक", "Pencil": "पेंसिल", "Paperclip": "पेपर क्लिप", - "Padlock": "ताला", "Key": "चाबी", "Hammer": "हथौड़ा", "Telephone": "टेलीफोन", @@ -566,7 +516,6 @@ "Headphones": "हेडफोन", "Folder": "फ़ोल्डर", "Pin": "पिन", - "Your homeserver does not support device management.": "आपका होम सर्वर डिवाइस प्रबंधन का समर्थन नहीं करता है।", "Unable to remove contact information": "संपर्क जानकारी निकालने में असमर्थ", "Yes": "हाँ", "No": "नहीं", @@ -580,21 +529,16 @@ "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "क्या आपको यकीन है? यदि आपकी कुंजियाँ ठीक से बैकअप नहीं हैं तो आप अपने एन्क्रिप्टेड संदेशों को खो देंगे।", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "एन्क्रिप्ट किए गए संदेश एंड-टू-एंड एन्क्रिप्शन के साथ सुरक्षित हैं। केवल आपके और प्राप्तकर्ता के पास ही इन संदेशों को पढ़ने की कुंजी है।", "Restore from Backup": "बैकअप से बहाल करना", - "This device is backing up your keys. ": "यह उपकरण आपकी कुंजी का बैकअप ले रहा है। ", "Back up your keys before signing out to avoid losing them.": "उन्हें खोने से बचने के लिए साइन आउट करने से पहले अपनी कुंजियों का बैकअप लें।", "Backing up %(sessionsRemaining)s keys...": "%(sessionsRemaining)s कुंजी का बैकअप कर रहा है ...", "All keys backed up": "सभी कुंजियाँ वापस आ गईं", - "Backup has a signature from unknown device with ID %(deviceId)s.": "बैकअप में आईडी %(deviceId)s के साथ अज्ञात डिवाइस से एक हस्ताक्षर है।", - "This backup is trusted because it has been restored on this device": "यह बैकअप विश्वसनीय है क्योंकि इसे इस उपकरण पर पुनर्स्थापित किया गया है", "Advanced": "उन्नत", - "Your keys are not being backed up from this device.": "आपकी कुंजी इस उपकरण से समर्थित नहीं है।", "Start using Key Backup": "कुंजी बैकअप का उपयोग करना शुरू करें", "Add an email address to configure email notifications": "ईमेल सूचनाओं को कॉन्फ़िगर करने के लिए एक ईमेल पता जोड़ें", "Unable to verify phone number.": "फ़ोन नंबर सत्यापित करने में असमर्थ।", "Verification code": "पुष्टि संख्या", "Phone Number": "फ़ोन नंबर", "Profile picture": "प्रोफ़ाइल फोटो", - "Upload profile picture": "प्रोफ़ाइल चित्र अपलोड करें", "Display Name": "प्रदर्शित होने वाला नाम", "Save": "अमुकनाम्ना", "This room is not accessible by remote Matrix servers": "यह रूम रिमोट मैट्रिक्स सर्वर द्वारा सुलभ नहीं है", @@ -611,7 +555,6 @@ "URL Previews": "URL पूर्वावलोकन", "Failed to change password. Is your password correct?": "पासवर्ड बदलने में विफल। क्या आपका पासवर्ड सही है?", "Success": "सफल", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "आपका पासवर्ड सफलतापूर्वक बदल दिया गया था। जब तक आप उन्हें वापस लॉग इन नहीं करेंगे तब तक आपको अन्य डिवाइस पर पुश नोटिफिकेशन नहीं मिलेगा", "Profile": "प्रोफाइल", "Account": "अकाउंट", "Set a new account password...": "नया खाता पासवर्ड सेट करें ...", @@ -634,7 +577,6 @@ "Submit debug logs": "डिबग लॉग जमा करें", "FAQ": "सामान्य प्रश्न", "Versions": "संस्करण", - "matrix-react-sdk version:": "मैट्रिक्स-प्रतिक्रिया-एसडीके संस्करण:", "riot-web version:": "रायट-वेब संस्करण:", "olm version:": "olm संस्करण:", "Homeserver is": "होमेसेर्वेर हैं", @@ -659,8 +601,6 @@ "": "<समर्थित नहीं>", "Import E2E room keys": "E2E कक्ष की चाबियां आयात करें", "Cryptography": "क्रिप्टोग्राफी", - "Device ID:": "डिवाइस आईडी:", - "Device key:": "डिवाइस कुंजी:", "Ignored users": "अनदेखी उपयोगकर्ताओं", "Bulk options": "थोक विकल्प", "Reject all %(invitedRooms)s invites": "सभी %(invitedRooms)s की आमंत्रण को अस्वीकार करें", @@ -689,17 +629,11 @@ "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "इस समय किसी फ़ाइल के साथ उत्तर देना संभव नहीं है। क्या आप इस फ़ाइल को बिना उत्तर दिए अपलोड करना चाहेंगे?", "The file '%(fileName)s' failed to upload.": "फ़ाइल '%(fileName)s' अपलोड करने में विफल रही।", "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "एक सादे पाठ संदेश के लिए ¯\\_(ツ)_/¯ प्रस्तुत करता है", - "Room upgrade confirmation": "रूम के उन्नयन की पुष्टि", - "Upgrading a room can be destructive and isn't always necessary.": "एक कमरे को अपग्रेड करना विनाशकारी हो सकता है और हमेशा आवश्यक नहीं होता है।", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "एक कमरे के संस्करण को अस्थिर माना जाता है, तो आमतौर पर कमरे के उन्नयन की सिफारिश की जाती है। अस्थिर कमरे के संस्करणों में बग, लापता विशेषताएं या सुरक्षा कमजोरियां हो सकती हैं।", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "रूम का उन्नयन आमतौर पर केवल रूम के सर्वर-साइड को प्रभावित करता है। यदि आपको अपने रायट क्लाइंट के साथ समस्या हो रही है, तो कृपया के साथ एक समस्या दर्ज करें।", "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.": "चेतावनी: किसी कमरे को अपग्रेड करना कमरे के सदस्यों को कमरे के नए संस्करण में स्वचालित रूप से माइग्रेट नहीं करना है। हम कमरे के पुराने संस्करण में नए कमरे के लिए एक लिंक पोस्ट करेंगे। नए कमरे में शामिल होने के लिए कमरे के सदस्यों को इस लिंक पर क्लिक करना होगा।", "Adds a custom widget by URL to the room": "रूम में URL द्वारा एक कस्टम विजेट जोड़ता है", "Please supply a https:// or http:// widget URL": "कृपया एक https:// या http:// विजेट URL की आपूर्ति करें", "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.": "उपयोगकर्ता को आमंत्रित करने से पहले उन्हें प्रतिबंधित किया जाना चाहिए।", - "Enable desktop notifications for this device": "इस उपकरण के लिए डेस्कटॉप सूचनाएं सक्षम करें", - "Enable audible notifications for this device": "इस उपकरण के लिए श्रव्य सूचनाएँ सक्षम करें" + "The user must be unbanned before they can be invited.": "उपयोगकर्ता को आमंत्रित करने से पहले उन्हें प्रतिबंधित किया जाना चाहिए।" } diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 0ef0a7eeec..9de0f42ab9 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -71,7 +71,6 @@ "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s törölte a szoba nevét.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s megváltoztatta a témát erre \"%(topic)s\".", "Changes your display nickname": "Becenév megváltoztatása", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Jelszó megváltoztatása jelenleg alaphelyzetbe állítja a titkosításnál használt kulcsokat minden készüléken, ezzel a régi titkosított üzenetek olvashatatlanok lesznek hacsak először nem mented ki a kulcsokat és újra betöltöd. A jövőben ezen javítunk.", "Claimed Ed25519 fingerprint key": "Igényelt Ed25519 ujjlenyomat kulcs", "Click here to fix": "A javításhoz kattints ide", "Click to mute audio": "Hang némításhoz kattints ide", @@ -95,12 +94,8 @@ "Decrypt %(text)s": "%(text)s visszafejtése", "Decryption error": "Visszafejtési hiba", "Default": "Alapértelmezett", - "Device already verified!": "Készülék már ellenőrizve!", "Device ID": "Készülék azonosító", - "Device ID:": "Készülék azonosító:", "device id: ": "készülék azonosító: ", - "Device key:": "Készülék kulcs:", - "Devices": "Készülékek", "Direct chats": "Közvetlen csevegés", "Disable Notifications": "Értesítések tiltása", "Disinvite": "Meghívás visszavonása", @@ -112,7 +107,6 @@ "Email address": "E-mail cím", "Emoji": "Emoji", "Enable Notifications": "Értesítések bekapcsolása", - "Encrypted by an unverified device": "Nem ellenőrzött eszköz által titkosítva", "%(senderName)s ended the call.": "%(senderName)s befejezte a hívást.", "End-to-end encryption information": "Ponttól pontig való titkosítási információk", "Enter passphrase": "Jelmondat megadása", @@ -148,7 +142,6 @@ "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s : %(fromPowerLevel)s -> %(toPowerLevel)s", "Guests cannot join this room even if explicitly invited.": "Vendégek akkor sem csatlakozhatnak ehhez a szobához ha külön meghívók kaptak.", "Hangup": "Megszakít", - "Hide Text Formatting Toolbar": "Szövegformázási menü elrejtése", "Historical": "Archív", "Home": "Kezdőlap", "Homeserver is": "Matrix szerver:", @@ -161,15 +154,12 @@ "Incoming voice call from %(name)s": "Bejövő hívás: %(name)s", "Incorrect username and/or password.": "Helytelen felhasználó és/vagy jelszó.", "Incorrect verification code": "Hibás azonosítási kód", - "Invalid alias format": "Hibás alternatív név formátum", "Invalid Email Address": "Hibás e-mail cím", "Invalid file%(extra)s": "Hibás fájl%(extra)s", "%(senderName)s invited %(targetName)s.": "%(senderName)s meghívta: %(targetName)s.", - "Invite new room members": "Új tagok meghívása", "Invited": "Meghívva", "Invites": "Meghívók", "Invites user with given id to current room": "Felhasználó meghívása ebbe a szobába megadott azonosítóval", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' nem megfelelő formátum egy alternatív névhez", "Sign in with": "Belépés ezzel:", "Join as voice or video.": "Csatlakozás hanggal vagy videóval.", "Join Room": "Belépés a szobába", @@ -192,16 +182,10 @@ "%(senderName)s made future room history visible to anyone.": "%(senderName)s elérhetővé tette a szoba új üzeneteit nekik bárki.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s elérhetővé tette a szoba új üzeneteit nekik ismeretlen (%(visibility)s).", "Manage Integrations": "Integrációk kezelése", - "Markdown is disabled": "Markdown kikapcsolva", - "Markdown is enabled": "Markdown engedélyezett", - "matrix-react-sdk version:": "matrix-react-sdk verzió:", - "Message not sent due to unknown devices being present": "Ismeretlen eszköz miatt az üzenet nem küldhető el", "Missing room_id in request": "Hiányzó room_id a kérésben", "Missing user_id in request": "Hiányzó user_id a kérésben", "Moderator": "Moderátor", "Name": "Név", - "Never send encrypted messages to unverified devices from this device": "Soha ne küldj titkosított üzenetet ellenőrizetlen eszközre erről az eszközről", - "Never send encrypted messages to unverified devices in this room from this device": "Soha ne küldj titkosított üzenetet ebből a szobából ellenőrizetlen eszközre erről az eszközről", "New address (e.g. #foo:%(localDomain)s)": "Új cím (e.g. #foo:%(localDomain)s)", "New passwords don't match": "Az új jelszavak nem egyeznek", "New passwords must match each other.": "Az új jelszavaknak meg kell egyezniük egymással.", @@ -210,7 +194,6 @@ "(not supported by this browser)": "(ebben a böngészőben nem támogatott)", "": "", "NOT verified": "NEM ellenőrzött", - "No devices with registered encryption keys": "Nincs eszköz a regisztrált titkosítási kulcsokhoz", "No display name": "Nincs megjelenítési név", "No more results": "Nincs több találat", "No results": "Nincs találat", @@ -219,7 +202,6 @@ "Only people who have been invited": "Csak akiket meghívtak", "Password": "Jelszó", "Passwords can't be empty": "A jelszó nem lehet üres", - "People": "Emberek", "Permissions": "Jogosultságok", "Phone": "Telefon", "Please check your email and click on the link it contains. Once this is done, click continue.": "Ellenőrizd az e-mail-edet és kattints a benne lévő linkre. Ha ez megvan, kattints a folytatásra.", @@ -244,7 +226,6 @@ "riot-web version:": "riot-web verzió:", "Room %(roomId)s not visible": "%(roomId)s szoba nem látható", "Room Colour": "Szoba színe", - "Room contains unknown devices": "A szobában ellenőrizetlen eszközök vannak", "%(roomName)s does not exist.": "%(roomName)s nem létezik.", "%(roomName)s is not accessible at this time.": "%(roomName)s jelenleg nem érhető el.", "Rooms": "Szobák", @@ -254,8 +235,6 @@ "Searches DuckDuckGo for results": "Keresés DuckDuckGo-val", "Seen by %(userName)s at %(dateTime)s": "%(userName)s %(dateTime)s időpontban látta", "Send anyway": "Küld mindenképpen", - "Sender device information": "Küldő eszközének információja", - "Send Invites": "Meghívók elküldése", "Send Reset Email": "Visszaállítási e-mail küldése", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s képet küldött.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s meghívót küldött %(targetDisplayName)s felhasználónak, hogy lépjen be a szobába.", @@ -266,7 +245,6 @@ "Session ID": "Kapcsolat azonosító", "%(senderName)s set a profile picture.": "%(senderName)s profil képet állított be.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s a megjelenítési nevét megváltoztatta erre: %(displayName)s.", - "Show Text Formatting Toolbar": "Szöveg formázási eszköztár megjelenítése", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Az időbélyegek 12 órás formátumban mutatása (pl.: 2:30pm)", "Signed Out": "Kijelentkezett", "Sign in": "Bejelentkezés", @@ -275,11 +253,9 @@ "Someone": "Valaki", "Start a chat": "Csevegés indítása", "Start authentication": "Azonosítás indítása", - "Start Chat": "Csevegés indítása", "Submit": "Elküld", "Success": "Sikeres", "The phone number entered looks invalid": "A megadott telefonszám érvénytelennek tűnik", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Az általad megadott aláíró kulcs megegyezik %(userId)s felhasználótól kapott kulccsal amit %(deviceId)s eszközhöz használ. Az eszköz ellenőrzöttnek jelölve.", "This email address is already in use": "Ez az e-mail cím már használatban van", "This email address was not found": "Az e-mail cím nem található", "The email address linked to your account must be entered.": "A fiókodhoz kötött e-mail címet add meg.", @@ -293,7 +269,6 @@ "To use it, just wait for autocomplete results to load and tab through them.": "A használatához csak várd meg az automatikus kiegészítéshez a találatok betöltését és TAB-bal választhatsz közülük.", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Megpróbáltam betölteni a szoba megadott időpontjának megfelelő adatait, de nincs jogod a kérdéses üzenetek megjelenítéséhez.", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Megpróbáltam betölteni a szoba megadott időpontjának megfelelő adatait, de nem találom.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s bekapcsolta a titkosítást ponttól pontig (algoritmus %(algorithm)s).", "Unable to add email address": "Az e-mail címet nem sikerült hozzáadni", "Unable to remove contact information": "A névjegy információkat nem sikerült törölni", "Unable to verify email address.": "Az e-mail cím ellenőrzése sikertelen.", @@ -301,17 +276,12 @@ "%(senderName)s unbanned %(targetName)s.": "%(senderName)s visszaengedte %(targetName)s felhasználót.", "Unable to capture screen": "A képernyő felvétele sikertelen", "Unable to enable Notifications": "Az értesítések engedélyezése sikertelen", - "Unable to load device list": "Az eszközlista betöltése sikertelen", - "Undecryptable": "Visszafejthetetlen", "unencrypted": "titkosítatlan", - "Unencrypted message": "Titkosítatlan üzenet", "unknown caller": "ismeretlen hívó", "unknown device": "ismeretlen eszköz", "Unknown room %(roomId)s": "Ismeretlen szoba %(roomId)s", - "Unknown (user, device) pair:": "Ismeretlen (felhasználó, eszköz) pár:", "Unmute": "Némítás kikapcsolása", "Unnamed Room": "Névtelen szoba", - "Unrecognised command:": "Ismeretlen parancs:", "Unrecognised room alias:": "Ismeretlen szoba becenév:", "Uploading %(filename)s and %(count)s others|zero": "%(filename)s feltöltése", "Uploading %(filename)s and %(count)s others|one": "%(filename)s és még %(count)s db másik feltöltése", @@ -339,10 +309,8 @@ "(no answer)": "(nincs válasz)", "(unknown failure: %(reason)s)": "(ismeretlen hiba: %(reason)s)", "Warning!": "Figyelem!", - "WARNING: Device already verified, but keys do NOT MATCH!": "Figyelem: Az eszköz már ellenőrzött, de a kulcsok NEM EGYEZNEK!", "Who can access this room?": "Ki éri el ezt a szobát?", "Who can read history?": "Ki olvashatja a régi üzeneteket?", - "Who would you like to communicate with?": "Kivel szeretnél beszélgetni?", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s visszavonta %(targetName)s meghívóját.", "You are already in a call.": "Már hívásban vagy.", "You cannot place a call with yourself.": "Nem hívhatod fel saját magadat.", @@ -355,7 +323,6 @@ "You need to be able to invite users to do that.": "Hogy ezt csinálhasd meg kell tudnod hívni felhasználókat.", "You need to be logged in.": "Be kell jelentkezz.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ez az e-mail cím, úgy néz ki, nincs összekötve a Matrix azonosítóval ezen a Matrix szerveren.", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "A jelszavadat sikeresen megváltoztattuk. Addig nem fogsz leküldéses értesítéseket kapni, amíg a többi eszközön vissza nem jelentkezel", "You seem to be in a call, are you sure you want to quit?": "Úgy tűnik hívásban vagy, biztosan kilépsz?", "You seem to be uploading files, are you sure you want to quit?": "Úgy tűnik fájlokat töltesz fel, biztosan kilépsz?", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Nem leszel képes visszavonni ezt a változtatást mivel a felhasználót ugyanarra a szintre emeled amin te vagy.", @@ -393,8 +360,6 @@ "(~%(count)s results)|one": "(~%(count)s db eredmény)", "(~%(count)s results)|other": "(~%(count)s db eredmény)", "Active call": "Folyamatban lévő hívás", - "bold": "félkövér", - "italic": "dőlt", "Please select the destination room for this message": "Kérlek add meg az üzenet cél szobáját", "New Password": "Új jelszó", "Start automatically after system login": "Rendszerindításkor automatikus elindítás", @@ -416,13 +381,8 @@ "Unknown error": "Ismeretlen hiba", "Incorrect password": "Helytelen jelszó", "To continue, please enter your password.": "A folytatáshoz, kérlek add meg a jelszavadat.", - "Device name": "Eszköz neve", - "Device key": "Eszköz kulcsa", - "Verify device": "Eszköz ellenőrzése", "I verify that the keys match": "Megerősítem, hogy a kulcsok egyeznek", "Unable to restore session": "A kapcsolatot nem lehet visszaállítani", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" szobában olyan eszközök vannak amiket még nem láttál.", - "Unknown devices": "Ismeretlen eszköz", "Unknown Address": "Ismeretlen cím", "Unblacklist": "Tiltólistáról kivesz", "Blacklist": "Tiltólistára", @@ -458,16 +418,11 @@ "Do you want to set an email address?": "Meg szeretnéd adni az e-mail címet?", "This will allow you to reset your password and receive notifications.": "Ezzel alaphelyzetbe tudod állítani a jelszavad és értesítéseket fogadhatsz.", "Deops user with given id": "A megadott azonosítójú felhasználó lefokozása", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "FIGYELEM: A KULCS ELLENŐRZÉS SIKERTELEN! A %(userId)s felhasználóhoz és %(deviceId)s eszközhöz tartozó \"%(fprint)s\" ujjlenyomat nem egyezik meg az ismert \"%(fingerprint)s\" ujjlenyomattal. Ez azt jelenti hogy a kapcsolatot lehallgathatják!", "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Ezzel a folyamattal kimentheted a titkosított szobák üzeneteihez tartozó kulcsokat egy helyi fájlba. Ez után be tudod tölteni ezt a fájlt egy másik Matrix kliensbe, így az a kliens is vissza tudja fejteni az üzeneteket.", "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "A kimentett fájlal bárki el tudja olvasni a titkosított üzeneteket amiket te is, ezért tartsd biztonságban. Ehhez segítségül írj be egy jelmondatot amivel a kimentett adatok titkosításra kerülnek. Az adatok betöltése csak a jelmondat megadásával lehetséges később.", "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Ezzel a folyamattal lehetőséged van betölteni a titkosítási kulcsokat amiket egy másik Matrix kliensből mentettél ki. Ez után minden üzenetet vissza tudsz fejteni amit a másik kliens tudott.", "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Biztos hogy eltávolítod (törlöd) ezt az eseményt? Figyelem, ha törlöd vagy megváltoztatod a szoba nevét vagy a témát ez a változtatás érvényét vesztheti.", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Az eszköz megbízhatóságának ellenőrzéséhez, lépj kapcsolatba a tulajdonossal valami más csatornán (pl. személyesen vagy telefon hívással) és kérdezd meg, hogy a kulcs amit a Felhasználói Beállításoknál látnak az eszközhöz megegyezik-e a kulccsal itt:", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Ha megegyezik, nyomd meg az megerősítő gombot alul. Ha nem akkor valaki más használja az eszközt és inkább a Feketelista gombot szeretnéd használni.", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Ha egy újabb Riot verziót használtál valószínűleg ez kapcsolat nem lesz kompatibilis vele. Zárd be az ablakot és térj vissza az újabb verzióhoz.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Jelenleg fekete listára teszel minden ismeretlen eszközt. Ha üzenetet szeretnél küldeni ezekre az eszközökre először ellenőrizned kell őket.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Azt javasoljuk, hogy menj végig ellenőrző folyamaton minden eszköznél, hogy meg megerősítsd minden eszköz a jogos tulajdonosához tartozik, de újraküldheted az üzenetet ellenőrzés nélkül, ha úgy szeretnéd.", "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Ha nem állítasz be e-mail címet nem fogod tudni a jelszavadat alaphelyzetbe állítani. Biztos vagy benne?", "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?": "Azonosítás céljából egy harmadik félhez leszel irányítva (%(integrationsUrl)s). Folytatod?", "This will be your account name on the homeserver, or you can pick a different server.": "Ez lesz a felhasználói neved a Matrix szerveren, vagy választhatsz egy másik szervert.", @@ -475,8 +430,6 @@ "Start verification": "Ellenőrzés megkezdése", "Share without verifying": "Megosztás ellenőrzés nélkül", "Ignore request": "Kérés figyelmen kívül hagyása", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Hozzáadtál egy új eszközt '%(displayName)s', ami titkosítási kulcsokat kér.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Az ellenőrizetlen eszközöd '%(displayName)s' titkosítási kulcsokat kér.", "Encryption key request": "Titkosítási kulcs kérés", "Check for update": "Frissítések keresése", "Add a widget": "Kisalkalmazás hozzáadása", @@ -491,8 +444,6 @@ "Unable to create widget.": "Nem lehet kisalkalmazást létrehozni.", "You are not in this room.": "Nem vagy ebben a szobában.", "You do not have permission to do that in this room.": "Nincs jogod ezt tenni ebben a szobában.", - "Verifies a user, device, and pubkey tuple": "A felhasználó, eszköz és publikus kulcs hármas ellenőrzése", - "Loading device info...": "Eszköz információk betöltése...", "Example": "Példa", "Create": "Létrehoz", "Featured Rooms:": "Kiemelt szobák:", @@ -702,8 +653,6 @@ "Idle for %(duration)s": "%(duration)s óta tétlen", "Offline for %(duration)s": "%(duration)s óta elérhetetlen", "Unknown for %(duration)s": "%(duration)s óta az állapota ismeretlen", - "Delete %(count)s devices|other": "%(count)s darab eszköz törlése", - "Delete %(count)s devices|one": "Eszköz törlése", "Flair": "Jelvény", "Showing flair for these communities:": "Ezekben a közösségekben mutassa a jelvényt:", "This room is not showing flair for any communities": "Ez a szoba nem mutat jelvényt egyetlen közösséghez sem", @@ -713,7 +662,6 @@ "collapse": "becsuk", "expand": "kinyit", "Call Failed": "Sikertelen hívás", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Ismeretlen eszközök vannak ebben a szobában: ha ellenőrzés nélkül folytatod lehetséges, hogy valaki belehallgat a hívásba.", "Review Devices": "Eszközök áttekintése", "Call Anyway": "Mindenképpen hívj", "Answer Anyway": "Mindenképpen felvesz", @@ -746,7 +694,6 @@ "Your identity server's URL": "Az azonosítási szerver URL-t", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(fullYear)s. %(monthName)s %(day)s, %(weekDayName)s", "This room is not public. You will not be able to rejoin without an invite.": "Ez a szoba nem nyilvános. Kilépés után csak újabb meghívóval tudsz újra belépni a szobába.", - "Show devices, send anyway or cancel.": "Eszközök listája, mindenképpen küld vagy szakítsd meg.", "Community IDs cannot be empty.": "A közösségi azonosító nem lehet üres.", "In reply to ": "Válasz neki ", "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s megváltoztatta a nevét erre: %(displayName)s.", @@ -756,11 +703,7 @@ "Clear filter": "Szűrő törlése", "Did you know: you can use communities to filter your Riot.im experience!": "Tudtad, hogy a Riot.im élmény fokozásához használhatsz közösségeket!", "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "A szűrő beállításához húzd a közösség avatarját a szűrő panel fölé a képernyő bal szélén. A szűrő panelen az avatarra kattintva bármikor leszűrheted azokat a szobákat és embereket akik a megadott közösséghez tartoznak.", - "Your key share request has been sent - please check your other devices for key share requests.": "A kulcs megosztási kérést elküldtük - ellenőrizd a többi eszközödön a kulcs megosztási kéréseket.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "A kulcs megosztási kérelem automatikusan el lett küldve a többi eszközödre. Ha elutasítottad vagy törölted a kérést a másik eszközön ide kattintva újra kérheted a kulcsokat.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Ha a másik eszközödön nincs meg a kulcs az üzenet visszafejtéséhez akkor nem tudod visszafejteni.", "Key request sent.": "Kulcs kérés elküldve.", - "Re-request encryption keys from your other devices.": "Kulcsok újrakérése a többi eszközödtől.", "Code": "Kód", "If you've submitted a bug via GitHub, debug logs can help us track down the problem. 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.": "Ha a GitHubon keresztül küldted be a hibát, a hibakeresési napló segíthet nekünk a javításban. A napló felhasználási adatokat tartalmaz mint a felhasználói neved, az általad meglátogatott szobák vagy csoportok azonosítóját vagy alternatív nevét és mások felhasználói nevét. De nem tartalmazzák az üzeneteket.", "Submit debug logs": "Hibakeresési napló küldése", @@ -823,7 +766,6 @@ "Noisy": "Hangos", "Collecting app version information": "Alkalmazás verzió információk összegyűjtése", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Törlöd a szoba nevét (%(alias)s) és eltávolítod a listából ezt: %(name)s?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Így kijelentkezés után is vissza tudsz lépni a fiókodba, illetve más készülékekről is be tudsz lépni.", "Keywords": "Kulcsszavak", "Enable notifications for this account": "Értesítések engedélyezése ehhez a fiókhoz", "Invite to this community": "Meghívás ebbe a közösségbe", @@ -918,8 +860,6 @@ "Refresh": "Frissítés", "We encountered an error trying to restore your previous session.": "Hibába ütköztünk megpróbáljuk visszaállítani az előző munkamenetet.", "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "A böngésződ tárhelyének a törlése megoldhatja a problémát, de ezzel kijelentkezel és a titkosított beszélgetések előzményei olvashatatlanná válnak.", - "Unable to reply": "Nem lehet válaszolni", - "At this time it is not possible to reply with an emote.": "Jelenleg nem lehet emodzsival válaszolni.", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Nem lehet betölteni azt az eseményt amire válaszoltál, mert vagy nem létezik, vagy nincs jogod megnézni.", "Collapse Reply Thread": "Beszélgetés szál becsukása", "Enable widget screenshots on supported widgets": "Ahol az a kisalkalmazásban támogatott ott képernyőkép készítés engedélyezése", @@ -962,12 +902,6 @@ "Demote yourself?": "Lefokozod magad?", "Demote": "Lefokozás", "This event could not be displayed": "Az eseményt nem lehet megjeleníteni", - "deleted": "törölt", - "underlined": "aláhúzott", - "inline-code": "kód", - "block-quote": "idézet", - "bulleted-list": "rendezetlen lista", - "numbered-list": "rendezett lista", "Permission Required": "Engedély szükséges", "You do not have permission to start a conference call in this room": "Nincs jogosultságod konferencia hívást kezdeményezni ebben a szobában", "A call is currently being placed!": "A hívás indítás alatt!", @@ -1031,11 +965,6 @@ "Unable to load! Check your network connectivity and try again.": "A betöltés sikertelen! Ellenőrizd a hálózati kapcsolatot és próbáld újra.", "Delete Backup": "Mentés törlése", "Unable to load key backup status": "A mentett kulcsok állapotát nem lehet lekérdezni", - "Backup has a valid signature from this device": "A mentés érvényes aláírást tartalmaz az eszközről", - "Backup has a valid signature from unverified device ": "A mentés érvényes aláírást tartalmaz erről az ellenőrizetlen eszközről: ", - "Backup has an invalid signature from verified device ": "A mentés érvénytelen aláírást tartalmaz erről az ellenőrzött eszközről: ", - "Backup has an invalid signature from unverified device ": "A mentés érvénytelen aláírást tartalmaz erről az ellenőrizetlen eszközről: ", - "Backup is not signed by any of your devices": "A mentés nincs aláírva egyetlen eszközöd által sem", "Backup version: ": "Mentés verzió: ", "Algorithm: ": "Algoritmus: ", "Enter a passphrase...": "Add meg a jelmondatot...", @@ -1048,12 +977,9 @@ "Your Recovery Key": "A Helyreállítási kulcsod", "Copy to clipboard": "Másolás a vágólapra", "Download": "Letölt", - "Your Recovery Key has been copied to your clipboard, paste it to:": "A Helyreállítási kulcsod a vágólapra lett másolva, beillesztés ide:", - "Your Recovery Key is in your Downloads folder.": "A Helyreállítási kulcs a Letöltések mappádban van.", "Print it and store it somewhere safe": "Nyomtad ki és tárold biztonságos helyen", "Save it on a USB key or backup drive": "Mentsd el egy Pendrive-ra vagy a biztonsági mentésekhez", "Copy it to your personal cloud storage": "Másold fel a személyes felhődbe", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "A Biztonságos üzenet-visszaállítás beállítása nélkül ha kijelentkezel vagy másik eszközt használsz, akkor nem tudod visszaállítani a régi titkosított üzeneteidet.", "Set up Secure Message Recovery": "Biztonságos Üzenet Visszaállítás beállítása", "Keep it safe": "Tartsd biztonságban", "Create Key Backup": "Kulcs mentés készítése", @@ -1072,7 +998,6 @@ "This looks like a valid recovery key!": "Ez érvényes helyreállítási kulcsnak tűnik!", "Not a valid recovery key": "Nem helyreállítási kulcs", "Access your secure message history and set up secure messaging by entering your recovery key.": "A helyreállítási kulcs megadásával hozzáférhetsz a régi biztonságos üzeneteidhez és beállíthatod a biztonságos üzenetküldést.", - "If you've forgotten your recovery passphrase you can ": "Ha elfelejtetted a helyreállítási jelmondatot ", "Failed to perform homeserver discovery": "A Matrix szerver felderítése sikertelen", "Invalid homeserver discovery response": "A Matrix szerver felderítésére kapott válasz érvénytelen", "Use a few words, avoid common phrases": "Néhány szót használj és kerüld el a szokásos szövegeket", @@ -1120,7 +1045,6 @@ "Checking...": "Ellenőrzés...", "Invalid identity server discovery response": "Azonosító szerver felderítésére érkezett válasz érvénytelen", "General failure": "Általános hiba", - "Backup has a valid signature from verified device ": "A mentésnek ellenőrzött eszköztől származó érvényes aláírása van", "New Recovery Method": "Új Visszaállítási Eljárás", "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.": "Ha nem te állítottad be a visszaállítási eljárást akkor lehet, hogy egy támadó próbálja elérni a fiókodat. Változtasd meg a fiókod jelszavát és állítsd be az új visszaállítási eljárást a Beállításokban amint lehet.", "Set up Secure Messages": "Biztonságos Üzenetek beállítása", @@ -1170,13 +1094,11 @@ "Email Address": "E-mail cím", "Backing up %(sessionsRemaining)s keys...": "Kulcsok biztonsági mentése... (%(sessionsRemaining)s)", "All keys backed up": "Minden kulcs elmentve", - "Backup has a signature from unknown device with ID %(deviceId)s.": "A biztonsági mentésnek ismeretlen (azonosító: %(deviceId)s) eszköztől van aláírása.", "Add an email address to configure email notifications": "E-mail értesítésekhez e-mail cím hozzáadása", "Unable to verify phone number.": "A telefonszámot nem sikerült ellenőrizni.", "Verification code": "Ellenőrző kód", "Phone Number": "Telefonszám", "Profile picture": "Profilkép", - "Upload profile picture": "Profilkép feltöltése", "Display Name": "Megjelenítési név", "Room information": "Szoba információk", "Internal room ID:": "Belső szoba azonosító:", @@ -1218,19 +1140,15 @@ "Voice & Video": "Hang & Videó", "Main address": "Fő cím", "Room avatar": "Szoba képe", - "Upload room avatar": "Szoba kép feltöltése", - "No room avatar": "A szobának nincs képe", "Room Name": "Szoba neve", "Room Topic": "Szoba témája", "Join": "Belép", "Use Legacy Verification (for older clients)": "Hagyományos hitelesítés használata (régi kliensekhez)", "Verify by comparing a short text string.": "Rövid szöveggel való hitelesítés.", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "A maximális biztonság érdekében ezt tedd meg személyesen vagy egy másik biztonságos csatornán.", "Begin Verifying": "Hitelesítés megkezdése", "Waiting for partner to accept...": "Várjuk, hogy a partner elfogadja...", "Use two-way text verification": "Kétirányú hitelesítés", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Ellenőrizd ezt a felhasználót, hogy megbízhatónak tekinthessük. Megbízható felhasználók további nyugalmat jelenthetnek ha végpontól végpontig titkosítást használsz.", - "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "A felhasználó hitelesítése a eszközeit megbízhatónak fogja jelölni és az eszközeidet hitelesnek fogja minősíteni nála.", "Waiting for partner to confirm...": "Várakozás a partner megerősítésére...", "Incoming Verification Request": "Bejövő Hitelesítési Kérés", "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "A duplikált jegyek elkerülése végett kérünk nézd meg a létező jegyeket először (és adj neki +1-et) vagy készíts egy új jegyet ha nem találsz hasonlót.", @@ -1266,10 +1184,7 @@ "Keep going...": "Így tovább...", "Starting backup...": "Mentés indul...", "A new recovery passphrase and key for Secure Messages have been detected.": "A Biztonságos Üzenetekhez új visszaállítási jelmondatot és kulcsot észleltünk.", - "This device is encrypting history using the new recovery method.": "Az eszköz az új visszaállítási eljárással titkosítja az üzenet naplót.", "Recovery Method Removed": "Visszaállítási eljárás törölve", - "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "Ez az eszköz észrevette, hogy a visszaállítási jelmondatot és kulcsot a Biztonságos Üzenetekhez törölték.", - "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "Ha véletlenül tetted, a Biztonságos Üzeneteket beállíthatod ezen az eszközön ami újra titkosítja az eszköz üzenet naplóját az új visszaállítási eljárással.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Ha nem te törölted a visszaállítási eljárást, akkor egy támadó hozzá akar férni a fiókodhoz. Azonnal változtasd meg a jelszavadat és állíts be egy visszaállítási eljárást a Beállításokban.", "Chat with Riot Bot": "Csevegés a Riot Robottal", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "'%(fileName)s' mérete nagyobb mint amekkorát a Matrix szerver megenged feltölteni", @@ -1329,7 +1244,6 @@ "Book": "Könyv", "Pencil": "Toll", "Paperclip": "Gémkapocs", - "Padlock": "Lakat", "Key": "Kulcs", "Hammer": "Kalapács", "Telephone": "Telefon", @@ -1347,12 +1261,6 @@ "Headphones": "Fejhallgató", "Folder": "Dosszié", "Pin": "Gombostű", - "Your homeserver does not support device management.": "A Matrix szervered nem támogatja a eszközkezelést.", - "This backup is trusted because it has been restored on this device": "Ez a mentés megbízható mert ezen az eszközön lett visszaállítva", - "Some devices for this user are not trusted": "A felhasználó néhány eszköze nem megbízható", - "Some devices in this encrypted room are not trusted": "Néhány eszköz nem megbízható ebben a titkosított szobában", - "All devices for this user are trusted": "A felhasználó minden eszköze megbízható", - "All devices in this encrypted room are trusted": "A szobában minden eszköz megbízható", "Recovery Key Mismatch": "Visszaállítási Kulcs eltérés", "Incorrect Recovery Passphrase": "Visszaállítási jelmondat hiba", "Backup could not be decrypted with this passphrase: please verify that you entered the correct recovery passphrase.": "A mentést nem lehet visszafejteni a jelmondattal: kérlek ellenőrizd, hogy helyesen adtad meg a visszaállítási jelmondatot.", @@ -1362,16 +1270,13 @@ "This homeserver does not support communities": "Ez a Matrix szerver nem támogatja a közösségeket", "A verification email will be sent to your inbox to confirm setting your new password.": "Egy ellenőrző e-mail lesz elküldve a címedre, hogy megerősíthesd az új jelszó beállításodat.", "Your password has been reset.": "A jelszavad újra beállításra került.", - "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Minden eszközödről ki vagy jelentkeztetve és „push” értesítéseket sem fogsz kapni. Az értesítések újbóli engedélyezéséhez újra be kell jelentkezned minden eszközön.", "This homeserver does not support login using email address.": "Ezen a Matrix szerveren nem tudsz e-mail címmel bejelentkezni.", "Registration has been disabled on this homeserver.": "A fiókkészítés le van tiltva ezen a Matrix szerveren.", "Unable to query for supported registration methods.": "A támogatott regisztrációs módokat nem lehet lekérdezni.", "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Biztos vagy benne? Ha a kulcsaid nincsenek megfelelően elmentve elveszted a titkosított üzeneteidet.", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "A titkosított üzenetek végponttól végpontig titkosítással védettek. Csak neked és a címzetteknek lehet meg a kulcs az üzenet visszafejtéséhez.", "Restore from Backup": "Visszaállítás mentésből", - "This device is backing up your keys. ": "Ez az eszköz elmenti a kulcsaidat. ", "Back up your keys before signing out to avoid losing them.": "Ments el a kulcsaidat mielőtt kijelentkezel, hogy ne veszítsd el őket.", - "Your keys are not being backed up from this device.": "A kulcsaid erről az eszközről nem lesznek mentve.", "Start using Key Backup": "Kulcs mentés használatának megkezdése", "Never lose encrypted messages": "Soha ne veszíts el titkosított üzenetet", "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "A szobában az üzenetek végponttól végpontig titkosítva vannak. Csak neked és a címzetteknek vannak meg a kulcsok az üzenetek visszafejtéséhez.", @@ -1390,7 +1295,6 @@ "Set up with a Recovery Key": "Beállítás Visszaállítási Kulccsal", "Please enter your passphrase a second time to confirm.": "Kérlek add meg a jelmondatot másodszor is a biztonság kedvéért.", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "A Visszaállítási Kulcs egy olyan biztonsági elem amivel visszaállíthatod a hozzáférésed a titkosított üzenetekhez még akkor is, ha a jelmondatot elfelejtetted.", - "Keep your recovery key somewhere very secure, like a password manager (or a safe)": "A Visszaállítási Kulcsot nagyon biztonságos helyen tárold, mint pl. egy jelszókezelőben (vagy széfben)", "Your keys are being backed up (the first backup could take a few minutes).": "A kulcsaid mentése folyamatban van (az első mentés több percig is eltarthat).", "Secure your backup with a passphrase": "Védd a mentést egy jelmondattal", "Confirm your passphrase": "Erősítsd meg a jelmondatot", @@ -1448,18 +1352,11 @@ "Power level": "Hozzáférési szint", "Want more than a community? Get your own server": "Többet szeretnél, mint egy közösség? Szerezz saját szervert", "Please install Chrome, Firefox, or Safari for the best experience.": "Kérlek telepíts Chromeot, Firefoxot vagy Safarit a jegjobb élményhez.", - "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "A jelszóváltoztatás megváltoztatja minden eszközön az összes végponttól végpontig titkosításhoz használt kulcsodat; így a titkosított csevegések olvashatatlanok lesznek. Készíts biztonsági másolatot vagy mentsd ki a szoba kulcsaidat minden eszközödön mielőtt megváltoztatod a jelszavad.", - "Room upgrade confirmation": "Szoba frissítés megerősítése", - "Upgrading a room can be destructive and isn't always necessary.": "A szoba frissítése lehet, hogy elront benne dolgokat és nem is feltétlen szükséges.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Szoba frissítése akkor ajánlott ha a szoba verziója instabilnak tekintendő. Az instabil verziójú szobák hibákat tartalmazhatnak, funkciók hiányozhatnak belőlük vagy biztonsági hibák lehetnek bennük.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "A szoba frissítések általában csak szerver oldali feldolgozásban térnek el. Ha a Riot klienssel hibát észlelsz, jelezd azt egy hibajegyben: .", "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.": "Figyelmeztetés: A szoba frissítése nem fogja automatikusan átvinni a szoba résztvevőit az új verziójú szobába. A régi szobába bekerül egy link az új szobához - a tagoknak rá kell kattintani a linkre az új szobába való belépéshez.", "Adds a custom widget by URL to the room": "Egyedi kisalkalmazás hozzáadása a szobához URL-lel", "Please supply a https:// or http:// widget URL": "Kérlek add meg a https:// vagy http:// kisalkalmazás URL-t", "You cannot modify widgets in this room.": "A kisalkalmazásokat nem módosíthatod a szobában.", "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s visszavonta %(targetDisplayName)s a szobába való belépéséhez szükséges meghívóját.", - "Enable desktop notifications for this device": "Asztali értesítések engedélyezése ehhez az eszközhöz", - "Enable audible notifications for this device": "Hallható értesítések engedélyezése ehhez az eszközhöz", "Upgrade this room to the recommended room version": "A szoba fejlesztése a javasolt verzióra", "This room is running room version , which this homeserver has marked as unstable.": "A szoba verziója: , amit a Matrix szerver instabilnak tekint.", "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "A szoba fejlesztése bezárja ezt a szobát és új, frissített verzióval ugyanezen a néven létrehoz egy újat.", @@ -1502,16 +1399,11 @@ "Cancel All": "Mindent megszakít", "Upload Error": "Feltöltési hiba", "The server does not support the room version specified.": "A szerver nem támogatja a megadott szoba verziót.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Kérlek erősítsd meg, hogy a szobát frissíted a verzióról verzióra.", "Changes your avatar in this current room only": "A profilképedet csak ebben a szobában változtatja meg", "Sends the given message coloured as a rainbow": "A megadott üzenetet szivárvány színben küldi el", "Sends the given emote coloured as a rainbow": "A megadott hangulatjelet szivárvány színben küldi el", "The user's homeserver does not support the version of the room.": "A felhasználó matrix szervere nem támogatja a megadott szoba verziót.", "When rooms are upgraded": "Ha a szobák fejlesztésre kerülnek", - "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Ez az eszköz nem menti el a kulcsaidat, de létezik mentés amit visszaállíthatsz és folytathatod.", - "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Csatlakozz ezzel az eszközzel a kulcs mentéshez kilépés előtt, hogy ne veszíts el kulcsot ami esetleg csak ezen az eszközön van meg.", - "Connect this device to Key Backup": "Csatlakozz ezzel az eszközzel a Kulcs Mentéshez", - "Backup has an invalid signature from this device": "A mentés érvénytelen aláírással rendelkezik erről az eszközről", "this room": "ez a szoba", "View older messages in %(roomName)s.": "Régebbi üzenetek megjelenítése itt: %(roomName)s.", "Joining room …": "Szobához csatlakozás …", @@ -1561,7 +1453,6 @@ "Identity server URL does not appear to be a valid identity server": "Az Azonosító szerver URL nem tűnik érvényesnek", "A conference call could not be started because the integrations server is not available": "A konferencia hívást nem lehet elkezdeni mert az integrációs szerver nem érhető el", "Name or Matrix ID": "Név vagy Matrix azon.", - "Email, name or Matrix ID": "E-mail, név vagy Matrix azon.", "Unbans user with given ID": "Visszaengedi a megadott azonosítójú felhasználót", "reacted with %(shortName)s": "ezzel reagált: %(shortName)s", "edited": "szerkesztve", @@ -1611,8 +1502,6 @@ "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)snem változtatott semmit", "Changes your avatar in all rooms": "A profilképed megváltozik minden szobában", "Removing…": "Eltávolítás…", - "Clear all data on this device?": "Az eszközön minden adat törlése?", - "Clearing all data from this device is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Minden adat végleges törlése az eszközről. A titkosított üzenetek elvesznek hacsak a kulcsok nincsenek elmentve.", "Clear all data": "Minden adat törlése", "Your homeserver doesn't seem to support this feature.": "A matrix szervered úgy tűnik nem támogatja ezt a szolgáltatást.", "Resend edit": "Szerkesztés újraküldése", @@ -1620,14 +1509,12 @@ "Resend removal": "Törlés újraküldése", "Failed to re-authenticate due to a homeserver problem": "Az újra bejelentkezés a matrix szerver hibájából meghiusúlt", "Failed to re-authenticate": "Újra bejelentkezés sikertelen", - "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.": "Szerezd vissza a fiókodat és állítsd vissza a titkosítási kulcsokat amiket ezen az eszközön tároltál. Nélkülük nem tudod elolvasni a titkosított üzeneteidet semmilyen eszközön.", "Enter your password to sign in and regain access to your account.": "Add meg a jelszavadat a belépéshez, hogy visszaszerezd a hozzáférésed a fiókodhoz.", "Forgotten your password?": "Elfelejtetted a jelszavad?", "Sign in and regain access to your account.": "Jelentkezz be és szerezd vissza a hozzáférésed a fiókodhoz.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "A fiókodba nem tudsz bejelentkezni. További információkért kérlek vedd fel a kapcsolatot a matrix szerver adminisztrátorával.", "You're signed out": "Kijelentkeztél", "Clear personal data": "Személyes adatok törlése", - "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.": "Figyelmeztetés: A személyes adataid (beleértve a titkosító kulcsokat is) továbbra is az eszközön vannak tárolva. Ha az eszközt nem használod tovább vagy másik fiókba szeretnél bejelentkezni, töröld őket.", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Kérlek mond el nekünk mi az ami nem működött, vagy még jobb, ha egy GitHub jegyben leírod a problémát.", "Identity Server": "Azonosítási szerver", "Find others by phone or email": "Keress meg másokat telefonszám vagy e-mail cím alapján", @@ -1640,7 +1527,6 @@ "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Kérd meg a matrix szerver (%(homeserverDomain)s) adminisztrátorát, hogy a hívások megfelelő működéséhez állítson be egy TURN szervert.", "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.": "Másik lehetőségként használhatod a nyilvános szervert: turn.matrix.org, de ez nem lesz annyira megbízható és megosztja az IP címedet a szerverrel. A Beállításokban állíthatod be.", "Try using turn.matrix.org": "Próbáld meg használni a turn.matrix.org-ot", - "Failed to start chat": "A beszélgetést nem lehet elkezdeni", "Messages": "Üzenetek", "Actions": "Műveletek", "Displays list of commands with usages and descriptions": "Parancsok megjelenítése példával és leírással", @@ -1668,7 +1554,6 @@ "Discovery": "Felkutatás", "Deactivate account": "Fiók zárolása", "Always show the window menu bar": "Az ablak menüsávjának folyamatos mutatása", - "A device's public name is visible to people you communicate with": "Az eszközöd nyilvános neve látható azoknál az embereknél akikkel beszélgetsz", "Unable to revoke sharing for email address": "Az e-mail cím megosztását nem sikerült visszavonni", "Unable to share email address": "Az e-mail címet nem sikerült megosztani", "Revoke": "Visszavon", @@ -1681,7 +1566,6 @@ "Remove %(email)s?": "%(email)s törlése?", "Remove %(phone)s?": "%(phone)s törlése?", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "A szöveges üzenetet elküldtük a +%(msisdn)s számra. Kérlek add meg az ellenőrző kódot amit tartalmazott.", - "To verify that this device can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Az eszköz megbízhatóságának ellenőrzéséhez kérlek ellenőrizd, hogy amit a Felhasználó Beállításoknál látsz az eszközön kulcsot megegyezik az alábbi kulccsal:", "Command Help": "Parancs Segítség", "No identity server is configured: add one in server settings to reset your password.": "Nincs azonosítási szerver beállítva: adj meg egyet a szerver beállításoknál, hogy a jelszavadat vissza tudd állítani.", "This account has been deactivated.": "Ez a fiók zárolva van.", @@ -1768,7 +1652,6 @@ "Show advanced": "Haladó megmutatása", "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Felhasználók más matrix szerverekről a szobába való belépésének megakadályozása (Ezt a beállítást később nem lehet megváltoztatni!)", "Close dialog": "Ablak bezárása", - "Use the new, faster, composer for writing messages": "Az új gyorsabb szerkesztő használata az üzenetek írásához", "Show previews/thumbnails for images": "Előnézet/bélyegkép mutatása a képekhez", "Clear cache and reload": "Gyorsítótár ürítése és újratöltés", "%(count)s unread messages including mentions.|other": "%(count)s olvasatlan üzenet megemlítéssel.", @@ -1872,11 +1755,7 @@ "Custom (%(level)s)": "Egyedi (%(level)s)", "Trusted": "Megbízható", "Not trusted": "Megbízhatatlan", - "Hide verified Sign-In's": "Ellenőrzött belépések elrejtése", - "%(count)s verified Sign-In's|other": "%(count)s ellenőrzött belépés", - "%(count)s verified Sign-In's|one": "1 ellenőrzött belépés", "Direct message": "Közvetlen beszélgetés", - "Unverify user": "Ellenőrizetlen felhasználó", "%(role)s in %(roomName)s": "%(role)s a szobában: %(roomName)s", "Messages in this room are end-to-end encrypted.": "Az üzenetek a szobában végponttól végpontig titkosítottak.", "Security": "Biztonság", @@ -1893,7 +1772,6 @@ "Using this widget may share data with %(widgetDomain)s.": "Ennek a kisalkalmazásnak a használata adatot oszthat meg %(widgetDomain)s domain-nel.", "Widget added by": "A kisalkalmazást hozzáadta", "This widget may use cookies.": "Ez a kisalkalmazás sütiket használhat.", - "Send verification requests in direct message, including a new verification UX in the member panel.": "Ellenőrzés küldése közvetlen üzenetben, beleértve az új ellenőrzési felhasználói élményt a résztvevői panelen.", "Enable local event indexing and E2EE search (requires restart)": "Helyi esemény indexálás és végponttól végpontig titkosított események keresésének engedélyezése (újraindítás szükséges)", "More options": "További beállítások", "Reload": "Újratölt", @@ -1916,7 +1794,6 @@ "Manage integrations": "Integrációk kezelése", "Verification Request": "Ellenőrzési kérés", " (1/%(totalCount)s)": " (1/%(totalCount)s)", - "Enable cross-signing to verify per-user instead of per-device (in development)": "Kereszt-aláírás engedélyezése a felhasználó alapú azonosításhoz az eszköz alapú helyett (fejlesztés alatt)", "%(senderName)s placed a voice call.": "%(senderName)s hanghívást kezdeményezett.", "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s hanghívást kezdeményezett. (ebben a böngészőben nem támogatott)", "%(senderName)s placed a video call.": "%(senderName)s videóhívást kezdeményezett.", @@ -1926,7 +1803,6 @@ "Customise your experience with experimental labs features. Learn more.": "Kísérleti labor tulajdonságokkal egyénre szabhatod az élményt. Tudj meg többet.", "Error upgrading room": "A szoba verziófrissítésénél hiba történt", "Double check that your server supports the room version chosen and try again.": "Ellenőrizd még egyszer, hogy a szervered támogatja-e a szoba verzióját és próbáld újra.", - "Invite joined members to the new room automatically": "Tagok meghívása automatikusan az új szobába", "This message cannot be decrypted": "Ezt az üzenetet nem lehet visszafejteni", "Unencrypted": "Titkosítatlan", "Automatically invite users": "Felhasználók automatikus meghívása", @@ -1944,13 +1820,11 @@ "Start chatting": "Beszélgetés elkezdése", "Send cross-signing keys to homeserver": "Kereszt-aláírás kulcsok küldése a matrix szervernek", "Cross-signing public keys:": "Kereszt-aláírás nyilvános kulcsok:", - "on device": "eszközön", "not found": "nem található", "Cross-signing private keys:": "Kereszt-aláírás privát kulcsok:", "in secret storage": "biztonsági tárolóban", "Secret storage public key:": "Biztonsági tároló nyilvános kulcs:", "in account data": "fiók adatokban", - "Bootstrap Secure Secret Storage": "Biztonsági Titok Tároló megnyitása", "Cross-signing": "Kereszt-aláírás", "Enter secret storage passphrase": "Add meg a jelmondatot a biztonsági tárolóhoz", "Unable to access secret storage. Please verify that you entered the correct passphrase.": "A biztonsági tárolóhoz nem lehet hozzáférni. Kérlek ellenőrizd, hogy jó jelmondatot adtál-e meg.", @@ -1961,16 +1835,12 @@ "If you've forgotten your recovery key you can .": "Ha elfelejtetted a visszaállítási kulcsot .", "Warning: You should only set up key backup from a trusted computer.": "Figyelmeztetés: Csak biztonságos számítógépről állíts be kulcs mentést.", "If you've forgotten your recovery key you can ": "Ha elfelejtetted a visszaállítási kulcsot ", - "Warning: You should only set up secret storage from a trusted computer.": "Figyelem: Csak biztonságos eszközről állíts be biztonságos tárolót.", "Set up with a recovery key": "Beállítás visszaállítási kulccsal", "As a safety net, you can use it to restore your access to encrypted messages if you forget your passphrase.": "Mint egy biztonsági háló, ha elfelejted a jelmondatot akkor felhasználhatod ahhoz, hogy hozzáférj a titkosított üzeneteidhez.", "As a safety net, you can use it to restore your access to encrypted messages.": "Használhatod egy biztonsági hálóként a titkosított üzenetekhez való hozzáférés visszaállításához.", "Keep your recovery key somewhere very secure, like a password manager (or a safe).": "A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókezelő (vagy széf).", "Your recovery key has been copied to your clipboard, paste it to:": "A visszaállítási kulcsod a vágólapra lett másolva, illeszd be ide:", "Your recovery key is in your Downloads folder.": "A visszaállítási kulcsod a Letöltések mappában van.", - "Your access to encrypted messages is now protected.": "A titkosított üzenetekhez való hozzáférésed védve van.", - "Set up secret storage": "Biztonságos tároló beállítása", - "Secure your encrypted messages with a passphrase": "Biztosítsd a titkosított üzeneteidet jelmondattal", "Storing secrets...": "Titkok tárolása...", "Unable to set up secret storage": "A biztonsági tárolót nem sikerült beállítani", "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s törölte azt a szabályt amivel ilyen felhasználók voltak kitiltva: %(glob)s", @@ -1991,50 +1861,27 @@ "%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s megváltoztatta a szabályt amivel szerverek voltak kitiltva erről: %(oldGlob)s erre: %(newGlob)s ezért: %(reason)s", "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s megváltoztatta a kitiltó szabályt erről: %(oldGlob)s erre: %(newGlob)s ezért: %(reason)s", "Cross-signing and secret storage are enabled.": "Kereszt-aláírás és a biztonsági tároló engedélyezve van.", - "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this device.": "A fiókod a biztonsági tárolóban tartalmaz egy személyazonosságot a kereszt-aláíráshoz de egyenlőre nincs megbízhatónak jelölve ezen az eszközön.", "Cross-signing and secret storage are not yet set up.": "Kereszt-aláírás és a biztonsági tároló egyenlőre nincs beállítva.", "Bootstrap cross-signing and secret storage": "Kereszt-aláírás és biztonsági tároló beállítása", "not stored": "nincs mentve", "Backup has a valid signature from this user": "A mentés érvényes aláírást tartalmaz a felhasználótól", "Backup has a invalid signature from this user": "A mentés érvénytelen aláírást tartalmaz a felhasználótól", "Backup has a signature from unknown user with ID %(deviceId)s": "A mentésnek ismeretlen felhasználótól származó aláírása van ezzel az azonosítóval: %(deviceId)s", - "Backup has a signature from unknown device with ID %(deviceId)s": "A mentésnek ismeretlen eszköztől származó aláírása van ezzel az azonosítóval: %(deviceId)s", "Backup key stored: ": "Visszaállítási kulcs tárolva: ", - "Start using Key Backup with Secure Secret Storage": "Kulcs Mentés és Biztonsági Titok Tároló használatának megkezdése", "Hide verified sessions": "Ellenőrzött munkamenetek eltakarása", "%(count)s verified sessions|other": "%(count)s ellenőrzött munkamenet", "%(count)s verified sessions|one": "1 ellenőrzött munkamenet", - "Backup key stored in secret storage, but this feature is not enabled on this device. Please enable cross-signing in Labs to modify key backup state.": "Visszaállítási kulcs a biztonsági tárolóban van elmentve, de ezen az eszközön ez a lehetőség nincs engedélyezve. Engedélyezd a kulcs mentés állapotának módosításához a kereszt-aláírást a Laborban.", "Close preview": "Előnézet bezárása", - "Access your secure message history and your cross-signing identity for verifying other devices by entering your passphrase.": "A jelmondat megadásával hozzáférhetsz a titkosított üzeneteidhez és a kereszt-aláíráshoz tartozó azonosítódhoz amivel más eszközöket ellenőrizhetsz.", - "Access your secure message history and your cross-signing identity for verifying other devices by entering your recovery key.": "A visszaállítási kulcs megadásával hozzáférhetsz a titkosított üzeneteidhez és a kereszt-aláíráshoz tartozó azonosítódhoz amivel más eszközöket ellenőrizhetsz.", - "We'll use secret storage to optionally store an encrypted copy of your cross-signing identity for verifying other devices and message keys on our server. Protect your access to encrypted messages with a passphrase to keep it secure.": "Biztonsági tárolót fogunk használni, hogy tárolhassuk a kereszt-aláíráshoz tartozó azonosítót titkosított formában, amivel más eszközöket és üzenet kulcsokat lehet ellenőrizni. Védd a titkosított üzenetekhez való hozzáférést jelmondattal és azt tartsd titokban.", - "Without setting up secret storage, you won't be able to restore your access to encrypted messages or your cross-signing identity for verifying other devices if you log out or use another device.": "A biztonsági tároló beállítása nélkül ha kijelentkezel és egy másik eszközön lépsz be nem fogsz hozzáférni a titkosított üzeneteidhez és a kereszt-aláíráshoz tartozó azonosítódhoz amivel más eszközöket ellenőrizhetsz.", - "This user has not verified all of their devices.": "Ez a felhasználó még ellenőrizte az összes eszközét.", - "You have not verified this user. This user has verified all of their devices.": "Ezt a felhasználót még nem ellenőrizted. Minden eszközét ellenőrizte ez a felhasználó.", - "You have verified this user. This user has verified all of their devices.": "Ezt a felhasználót ellenőrizted. Minden eszközét ellenőrizte ez a felhasználó.", - "Some users in this encrypted room are not verified by you or they have not verified their own devices.": "Néhány felhasználót még nem ellenőriztél ebben a titkosított szobában vagy még ők nem ellenőrizték az összes eszközüket.", - "All users in this encrypted room are verified by you and they have verified their own devices.": "Minden felhasználót ellenőriztél ebben a titkosított szobában és ők ellenőrizték az összes eszközüket.", "Language Dropdown": "Nyelvválasztó lenyíló menü", "Country Dropdown": "Ország lenyíló menü", "The message you are trying to send is too large.": "Túl nagy képet próbálsz elküldeni.", - "Secret Storage will be set up using your existing key backup details.Your secret storage passphrase and recovery key will be the same as they were for your key backup": "A Biztonsági Tároló a már létező kulcs mentés adatai felhasználásával lesz létrehozva. A biztonsági tároló jelmondata és a visszaállítási kulcs meg fog egyezni a kulcs mentésénél használttal", - "Migrate from Key Backup": "Mozgatás a Kulcs Mentésből", "Help": "Segítség", - "New DM invite dialog (under development)": "Új KB (DM) meghívó párbeszédablak (fejlesztés alatt)", "Show more": "Mutass többet", "Recent Conversations": "Legújabb Beszélgetések", "Direct Messages": "Közvetlen Beszélgetések", - "If you can't find someone, ask them for their username, or share your username (%(userId)s) or profile link.": "Ha nem találsz meg valakit, kérdezd meg a felhasználói nevét vagy oszd meg a te felhasználói nevedet (%(userId)s) vagy a profil hivatkozást.", "Go": "Menj", "Show info about bridges in room settings": "Híd információk megmutatása a szoba beállításoknál", - "This bridge was provisioned by ": "Ezt a hidat ez a felhasználó hozta létre: ", "This bridge is managed by .": "Ezt a hidat ez a felhasználó kezeli: .", - "Bridged into , on ": "Híd ide: , ezzel a protokollal: ", - "Connected to on ": "Ide csatlakozva: itt: ", - "Connected via %(protocolName)s": "Ezzel a protokollal csatlakozva: %(protocolName)s", - "Bridge Info": "Híd információ", - "Below is a list of bridges connected to this room.": "Alább látható a lista a szobához kapcsolódó hidakról.", "Suggestions": "Javaslatok", "Failed to find the following users": "Az alábbi felhasználók nem találhatók", "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "Az alábbi felhasználók nem léteznek vagy hibásan vannak megadva és nem lehet őket meghívni: %(csvNames)s", @@ -2054,21 +1901,14 @@ "%(num)s hours from now": "%(num)s óra múlva", "about a day from now": "egy nap múlva", "%(num)s days from now": "%(num)s nap múlva", - "Key Backup is enabled on your account but has not been set up from this session. To set up secret storage, restore your key backup.": "A Kulcs Mentés a fiókhoz igen de ehhez a munkamenethez nincs beállítva. A Biztonsági tároló beállításához állítsd vissza a kulcs mentést.", "Restore": "Visszaállít", - "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup": "A Biztonsági Tároló a meglévő kulcs mentés adatai alapján lesz beállítva. A biztonsági tárolóhoz tartozó jelmondat és a visszaállítási kulcs azonos lesz ahogy azok a kulcs mentéshez voltak", - "Restore your Key Backup": "Kulcs Mentés visszaállítása", "Complete security": "Biztonság beállítása", "Verify this session to grant it access to encrypted messages.": "A titkosított üzenetekhez való hozzáféréshez hitelesítsd ezt a munkamenetet.", "Start": "Indít", "Session verified": "Munkamenet hitelesítve", "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Ez a munkameneted hitelesítve van. A titkosított üzenetekhez hozzáférése van és más felhasználók megbízhatónak látják.", "Done": "Kész", - "Without completing security on this device, it won’t have access to encrypted messages.": "Az eszköz biztonságának beállítása nélkül nem férhet hozzá a titkosított üzenetekhez.", "Go Back": "Vissza", - "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup.": "A Biztonsági Tároló a kulcs mentés adatainak felhasználásával lesz beállítva. A biztonsági tároló jelmondata és a visszaállítási kulcs ugyanaz lesz mint a kulcs mentéshez használt.", - "New invite dialog": "Új meghívó párbeszédablak", - "New Session": "Új Munkamenet", "Other users may not trust it": "Más felhasználók lehet, hogy nem bíznak benne", "Later": "Később", "Failed to invite the following users to chat: %(csvUsers)s": "Az alábbi felhasználókat nem sikerült meghívni a beszélgetésbe: %(csvUsers)s", @@ -2079,9 +1919,7 @@ "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.": "Ha nem találsz valakit, akkor kérdezd meg a felhasználói nevét (pl.: @felhasználó:szerver.com) vagy oszd meg ezt a szobát.", "Verify User": "Felhasználó ellenőrzése", "For extra security, verify this user by checking a one-time code on both of your devices.": "A biztonság fokozásáért ellenőrizd ezt a felhasználót egy egyszeri kód egyeztetésével mindkettőtök készülékén.", - "For maximum security, do this in person.": "A legnagyobb biztonság érdekében ezt személyesen tedd meg.", "Start Verification": "Ellenőrzés elindítása", - "Encrypted by a deleted device": "Egy már törölt eszköz titkosította", "Unknown Command": "Ismeretlen Parancs", "Unrecognised command: %(commandText)s": "Ismeretlen parancs: %(commandText)s", "You can use /help to list available commands. Did you mean to send this as a message?": "Használhatod a /help-et az elérhető parancsok kilistázásához. Ezt üzenetként akartad küldeni?", @@ -2090,7 +1928,6 @@ "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s szoba címnek, %(count)s másikkal együtt, hozzáadta: %(addedAddresses)s", "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s %(count)s másikkal együtt törölte a szoba címek közül: %(removedAddresses)s", "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s %(countRemoved)s darabot törölt és %(countAdded)s darabot hozzáadott a szoba címekhez", - "Someone is using an unknown device": "Valaki ismeretlen eszközt használ", "This room is end-to-end encrypted": "Ez a szoba végpontok közötti titkosítást használ", "Everyone in this room is verified": "A szobába mindenki ellenőrizve van", "Invite only": "Csak meghívóval", @@ -2112,9 +1949,7 @@ "%(senderName)s turned on end-to-end encryption.": "%(senderName)s bekapcsolta a végpontok közötti titkosítást.", "%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s bekapcsolta a végpontok közötti titkosítást (ismeretlen algoritmus: %(algorithm)s).", "Enable message search in encrypted rooms": "Üzenetek keresésének engedélyezése titkosított szobákban", - "Review & verify your new session": "Az új munkameneted átnézése és ellenőrzése", "Review": "Átnéz", - "Verify your other devices easier": "Ellenőrizd egyszerűbben a többi eszközöd", "This bridge was provisioned by .": "Ezt a hidat az alábbi felhasználó készítette: .", "Workspace: %(networkName)s": "Munkahely: %(networkName)s", "Channel: %(channelName)s": "Csatorna: %(channelName)s", @@ -2135,10 +1970,7 @@ "Use this session to verify your new one, granting it access to encrypted messages:": "Az új munkamenet ellenőrzéséhez használd ezt, amivel hozzáférést adsz a titkosított üzenetekhez:", "If you didn’t sign in to this session, your account may be compromised.": "Ha nem te jelentkeztél be ebbe a munkamenetbe akkor a fiókodat feltörték.", "This wasn't me": "Nem én voltam", - "Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Fejleszd ezt az eszközt, hogy ellenőrizhesd a többi eszközödet vele amivel hozzáférést adhatsz a titkosított üzeneteidhez és megbízhatónak jelölheted őket más felhasználók számára.", - "Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Állítsd be a titkosítást ezen az eszközön, hogy ellenőrizhesd a többi eszközödet vele, amivel hozzáférést adhatsz a titkosított üzeneteidhez és megbízhatónak jelölheted őket más felhasználók számára.", "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Helyezd biztonságba a titkosítási kulcsaidat egy jelmondattal. A maximális biztonság érdekében ez térjen el a felhasználói fióknál használt jelszótól:", - "This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Ezzel az eszközzel most már ellenőrizheted a többi eszközödet, hozzáférést adhatsz a titkosított üzeneteidhez és megbízhatónak jelölheted őket más felhasználók számára.", "If disabled, messages from encrypted rooms won't appear in search results.": "Ha nincs engedélyezve akkor a titkosított szobák üzenetei nem jelennek meg a keresések között.", "Disable": "Tiltás", "Not currently downloading messages for any room.": "Jelenleg egy szobából sem folyik üzenet letöltés.", diff --git a/src/i18n/strings/id.json b/src/i18n/strings/id.json index 9b53b6e100..38d2693500 100644 --- a/src/i18n/strings/id.json +++ b/src/i18n/strings/id.json @@ -21,7 +21,6 @@ "Current password": "Password sekarang", "Deactivate Account": "Nonaktifkan Akun", "Device ID": "ID Perangkat", - "Devices": "Perangkat", "Email": "Email", "Email address": "Alamat email", "Enable Notifications": "Aktifkan Notifikasi", @@ -30,7 +29,6 @@ "Command error": "Perintah gagal", "Decline": "Tolak", "Default": "Bawaan", - "Device ID:": "ID Perangkat:", "Direct chats": "Obrolan langsung", "Download %(text)s": "Unduh %(text)s", "Event information": "Informasi Event", @@ -49,8 +47,6 @@ "Leave room": "Meninggalkan ruang", "Logout": "Keluar", "Low priority": "Prioritas rendah", - "Markdown is disabled": "Markdown dinonaktifkan", - "Markdown is enabled": "Markdown diaktifkan", "Mute": "Bisu", "Name": "Nama", "New passwords don't match": "Password baru tidak cocok", @@ -59,7 +55,6 @@ "No results": "Tidak ada hasil", "OK": "OK", "Operation failed": "Operasi gagal", - "People": "Orang", "Passwords can't be empty": "Password tidak boleh kosong", "Permissions": "Izin", "Private Chat": "Obrolan Privat", @@ -83,13 +78,11 @@ "Sign out": "Keluar", "Someone": "Seseorang", "Submit": "Kirim", - "Start Chat": "Mulai Obrolan", "Success": "Sukses", "This email address was not found": "Alamat email ini tidak ada", "This room": "Ruang ini", "Unable to add email address": "Tidak dapat menambahkan alamat email", "Unable to verify email address.": "Tidak dapat memverifikasi alamat email.", - "Unable to load device list": "Tidak dapat memuat daftar perangkat", "unencrypted": "tidak terenkripsi", "unknown error code": "kode kesalahan tidak diketahui", "unknown device": "perangkat tidak diketahui", @@ -151,15 +144,12 @@ "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s telah menghapus nama ruang.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s telah mengubah nama ruang menjadi %(roomName)s.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s telah mengubah topik menjadi \"%(topic)s\".", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Mengubah password saat ini akan mengatur ulang semua kunci enkripsi end-to-end di semua perangkat, menyebabkan sejarah obrolan yang terenkripsi menjadi tidak dapat dibaca, kecuali sebelumnya Anda ekspor dahulu kunci ruang lalu kemudian impor ulang setelahnya. Ke depan hal ini akan diperbaiki.", "click to reveal": "Klik untuk menampilkan", "Could not connect to the integration server": "Tidak dapat terhubung ke server integrasi", "Cryptography": "Kriptografi", "Decrypt %(text)s": "Dekrip %(text)s", "Decryption error": "Dekripsi gagal", - "Device already verified!": "Perangkat telah terverifikasi!", "device id: ": "id perangkat: ", - "Device key:": "Kunci Perangkat:", "Ban": "Blokir", "Bans user with given id": "Blokir pengguna dengan id", "Fetching third party location failed": "Gagal mengambil lokasi pihak ketiga", @@ -212,7 +202,6 @@ "Files": "Files", "Collecting app version information": "Mengumpukan informasi versi aplikasi", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Hapus alias ruang %(alias)s dan hapus %(name)s dari direktori?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Hal ini akan memperbolehkan anda kembali ke akun setelah keluar dan masuk kembali di perangkat lain.", "Enable notifications for this account": "Aktifkan notifikasi untuk akun ini", "Messages containing keywords": "Pesan mengandung kata kunci", "Room not found": "Ruang tidak ditemukan", @@ -305,7 +294,6 @@ "The information being sent to us to help make Riot.im better includes:": "Informasi yang dikirim membantu kami memperbaiki Riot.im, termasuk:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Apabila terdapat informasi yang dapat digunakan untuk pengenalan pada halaman ini, seperti ruang, pengguna, atau ID grup, kami akan menghapusnya sebelum dikirim ke server.", "Call Failed": "Panggilan Gagal", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Ada perangkat yang belum dikenal di ruang ini: apabila Anda melanjutkan tanpa memverifikasi terlebih dahulu, pembicaraan Anda dapat disadap orang yang tidak diinginkan.", "Review Devices": "Telaah Perangkat", "Call Anyway": "Tetap Panggil", "Answer Anyway": "Tetap Jawab", diff --git a/src/i18n/strings/is.json b/src/i18n/strings/is.json index 94b311ed0a..2e13f4b231 100644 --- a/src/i18n/strings/is.json +++ b/src/i18n/strings/is.json @@ -46,7 +46,6 @@ "Moderator": "Umsjónarmaður", "Admin": "Stjórnandi", "Start a chat": "Hefja spjall", - "Start Chat": "Hefja spjall", "Operation failed": "Aðgerð tókst ekki", "You need to be logged in.": "Þú þarft að vera skráð/ur inn.", "Unable to create widget.": "Gat ekki búið til viðmótshluta.", @@ -70,8 +69,6 @@ "Show timestamps in 12 hour format (e.g. 2:30pm)": "Birta tímamerki á 12 stunda sniði (t.d. 2:30 fh)", "Always show message timestamps": "Alltaf birta tímamerki skilaboða", "Send analytics data": "Senda greiningargögn", - "Never send encrypted messages to unverified devices from this device": "Aldrei senda dulrituð skilaboð af þessu tæki til ósannvottaðra tækja", - "Never send encrypted messages to unverified devices in this room from this device": "Aldrei senda dulrituð skilaboð af þessu tæki til ósannvottaðra tækja á þessari spjallrás", "Enable inline URL previews by default": "Sjálfgefið virkja forskoðun innfelldra vefslóða", "Room Colour": "Litur spjallrásar", "Collecting app version information": "Safna upplýsingum um útgáfu forrits", @@ -101,8 +98,6 @@ "Confirm password": "Staðfestu lykilorðið", "Change Password": "Breyta lykilorði", "Authentication": "Auðkenning", - "Delete %(count)s devices|other": "Eyða %(count)s tækjum", - "Delete %(count)s devices|one": "Eyða tæki", "Device ID": "Auðkenni tækis", "Last seen": "Sást síðast", "Enable Notifications": "Virkja tilkynningar", @@ -133,7 +128,6 @@ "%(senderName)s sent a video": "%(senderName)s sendi myndskeið", "%(senderName)s uploaded a file": "%(senderName)s sendi inn skrá", "Options": "Valkostir", - "Unencrypted message": "Ódulrituð skilaboð", "Blacklisted": "Á bannlista", "device id: ": "Auðkenni tækis: ", "Kick": "Sparka", @@ -142,7 +136,6 @@ "Unban this user?": "Taka þennan notanda úr banni?", "Ban this user?": "Banna þennan notanda?", "Are you sure?": "Ertu viss?", - "Devices": "Tæki", "Unignore": "Byrja að fylgjast með á ný", "Ignore": "Hunsa", "Mention": "Minnst á", @@ -165,8 +158,6 @@ "You do not have permission to post to this room": "Þú hefur ekki heimild til að senda skilaboð á þessa spjallrás", "Server error": "Villa á þjóni", "Command error": "Skipanavilla", - "bold": "feitletrað", - "italic": "skáletrað", "Loading...": "Hleð inn...", "Online": "Nettengt", "Idle": "Iðjulaust", @@ -183,7 +174,6 @@ "Search": "Leita", "Invites": "Boðsgestir", "Favourites": "Eftirlæti", - "People": "Fólk", "Rooms": "Spjallrásir", "Low priority": "Lítill forgangur", "Historical": "Ferilskráning", @@ -210,7 +200,6 @@ "Cancel": "Hætta við", "Jump to first unread message.": "Fara í fyrstu ólesin skilaboð.", "Close": "Loka", - "Invalid alias format": "Ógilt snið samnefnis", "not specified": "ekki tilgreint", "Invalid community ID": "Ógilt auðkenni samfélags", "Flair": "Hlutverksmerki", @@ -291,9 +280,6 @@ "Incorrect password": "Rangt lykilorð", "Deactivate Account": "Gera notandaaðgang óvirkann", "To continue, please enter your password:": "Til að halda áfram, settu inn lykilorðið þitt:", - "Device name": "Heiti tækis", - "Device key": "Dulritunarlykill tækis", - "Verify device": "Sannreyna tæki", "I verify that the keys match": "Ég staðfesti að dulritunarlyklarnir samsvari", "Back": "Til baka", "Send Account Data": "Senda upplýsingar um notandaaðgang", @@ -319,8 +305,6 @@ "Failed to change password. Is your password correct?": "Mistókst að breyta lykilorðinu. Er lykilorðið rétt?", "(HTTP status %(httpStatus)s)": "(HTTP staða %(httpStatus)s)", "Please set a password!": "Stilltu lykilorð!", - "Room contains unknown devices": "Spjallrás inniheldur óþekkt tæki", - "Unknown devices": "Óþekkt tæki", "Custom": "Sérsniðið", "Alias (optional)": "Samnefni (valfrjálst)", "You cannot delete this message. (%(code)s)": "Þú getur ekki eytt þessum skilaboðum. (%(code)s)", @@ -371,8 +355,6 @@ "Success": "Tókst", "Import E2E room keys": "Flytja inn E2E dulritunarlykla spjallrásar", "Cryptography": "Dulritun", - "Device ID:": "Auðkenni tækis:", - "Device key:": "Dulritunarlykill tækis:", "Riot collects anonymous analytics to allow us to improve the application.": "Riot safnar nafnlausum greiningargögnum til að gera okkur kleift að bæta forritið.", "Labs": "Tilraunir", "Check for update": "Athuga með uppfærslu", @@ -385,7 +367,6 @@ "Access Token:": "Aðgangsteikn:", "click to reveal": "smelltu til að birta", "Identity Server is": "Auðkennisþjónn er", - "matrix-react-sdk version:": "Útgáfa matrix-react-sdk:", "riot-web version:": "Útgáfa riot-web:", "olm version:": "Útgáfa olm:", "Failed to send email": "Mistókst að senda tölvupóst", @@ -414,7 +395,6 @@ "Session ID": "Auðkenni setu", "End-to-end encryption information": "Enda-í-enda dulritunarupplýsingar", "Event information": "Upplýsingar um atburð", - "Sender device information": "Upplýsingar um tæki sendanda", "Export room keys": "Flytja út dulritunarlykla spjallrásar", "Enter passphrase": "Settu inn lykilsetningu (passphrase)", "Confirm passphrase": "Staðfestu lykilsetningu", @@ -439,15 +419,11 @@ "You are already in a call.": "Þú ert nú þegar í samtali.", "Invite new community members": "Bjóða nýjum meðlimum í samfélag", "Which rooms would you like to add to this community?": "Hvaða spjallrásum myndir þú vilja bæta í þetta samfélag?", - "Invite new room members": "Bjóða nýjum meðlimum á spjallrás", - "Send Invites": "Senda boðskort", "Failed to invite": "Mistókst að bjóða", "Missing roomId.": "Vantar spjallrásarauðkenni.", "/ddg is not a command": "/ddg er ekki skipun", "Ignored user": "Hunsaður notandi", - "Device already verified!": "Tæki er þegar sannreynt!", "Verified key": "Staðfestur dulritunarlykill", - "Unrecognised command:": "Óþekkt skipun:", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s breytti umræðuefninu í \"%(topic)s\".", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s fjarlægði heiti spjallrásarinnar.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s breytti heiti spjallrásarinnar í %(roomName)s.", @@ -469,9 +445,6 @@ "State Key": "Stöðulykill", "Explore Room State": "Skoða stöðu spjallrásar", "Explore Account Data": "Skoða aðgangsgögn", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Þú bættir við nýju tæki '%(displayName)s', sem er að krefjast dulritunarlykla.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "ósannvottaða tækið þitt '%(displayName)s' er að krefjast dulritunarlykla.", - "Loading device info...": "Hleð inn upplýsingum um tæki...", "Clear Storage and Sign Out": "Hreinsa gagnageymslu og skrá út", "Unable to restore session": "Tókst ekki að endurheimta setu", "This doesn't appear to be a valid email address": "Þetta lítur ekki út eins og gilt tölvupóstfang", @@ -480,7 +453,6 @@ "Username invalid: %(errMessage)s": "Notandanafn er ógilt: %(errMessage)s", "An error occurred: %(error_string)s": "Villa kom upp: %(error_string)s", "To get started, please pick a username!": "Til að komast í gang, veldu fyrst notandanafn!", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" inniheldur tæki sem þú hefur ekki séð áður.", "Private Chat": "Einkaspjall", "Public Chat": "Opinbert spjall", "Collapse Reply Thread": "Fella saman svarþráð", diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index d60190ec66..5a3f122ad2 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -95,7 +95,6 @@ "The information being sent to us to help make Riot.im better includes:": "Le informazioni inviate per aiutarci a migliorare Riot.im includono:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Se questa pagina include informazioni identificabili, come una stanza, un utente o un ID di un gruppo, tali dati saranno rimossi prima di essere inviati al server.", "Call Failed": "Chiamata fallita", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Ci sono dispositivi sconosciuti in questa stanza: se procedi senza verificarli, qualcuno avrà la possibilità di intercettare la tua chiamata.", "Review Devices": "Controlla i dispositivi", "Call Anyway": "Chiama comunque", "Answer Anyway": "Rispondi comunque", @@ -129,10 +128,6 @@ "Restricted": "Limitato", "Moderator": "Moderatore", "Start a chat": "Inizia una conversazione", - "Who would you like to communicate with?": "Con chi vorresti comunicare?", - "Start Chat": "Inizia conversazione", - "Invite new room members": "Invita nuovi membri nella stanza", - "Send Invites": "Manda inviti", "Failed to invite": "Invito fallito", "Failed to invite the following users to the %(roomName)s room:": "Invito nella stanza %(roomName)s fallito per i seguenti utenti:", "You need to be logged in.": "Devi aver eseguito l'accesso.", @@ -153,13 +148,7 @@ "You are now ignoring %(userId)s": "Ora stai ignorando %(userId)s", "Unignored user": "Utente non più ignorato", "You are no longer ignoring %(userId)s": "Non stai più ignorando %(userId)s", - "Unknown (user, device) pair:": "Coppia (utente, dispositivo) sconosciuta:", - "Device already verified!": "Dispositivo già verificato!", - "WARNING: Device already verified, but keys do NOT MATCH!": "ATTENZIONE: dispositivo già verificato, ma le chiavi NON CORRISPONDONO!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ATTENZIONE: VERIFICA CHIAVI FALLITA! La chiave per %(userId)s e il dispositivo %(deviceId)s è \"%(fprint)s\" , la quale non corrisponde con la chiave fornita \"%(fingerprint)s\". Potrebbe significare che le tue comunicazioni vengono intercettate!", "Verified key": "Chiave verificata", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "La chiave che hai fornito corrisponde alla chiave che hai ricevuto dal dispositivo %(deviceId)s di %(userId)s . Dispositivo segnato come verificato.", - "Unrecognised command:": "Comando non riconosciuto:", "Reason": "Motivo", "%(senderName)s invited %(targetName)s.": "%(senderName)s ha invitato %(targetName)s.", "%(senderName)s banned %(targetName)s.": "%(senderName)s ha bandito %(targetName)s.", @@ -192,7 +181,6 @@ "%(senderName)s made future room history visible to all room members.": "%(senderName)s ha reso visibile la futura cronologia della stanza a tutti i membri della stanza.", "%(senderName)s made future room history visible to anyone.": "%(senderName)s ha reso visibile la futura cronologia della stanza a tutti.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s ha reso visibile la futura cronologia della stanza a sconosciuti (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ha attivato la crittografia end-to-end (algoritmo %(algorithm)s).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s da %(fromPowerLevel)s a %(toPowerLevel)s", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s ha cambiato i messaggi ancorati della stanza.", "%(widgetName)s widget modified by %(senderName)s": "Widget %(widgetName)s modificato da %(senderName)s", @@ -212,8 +200,6 @@ "Autoplay GIFs and videos": "Riproduzione automatica di GIF e video", "Enable automatic language detection for syntax highlighting": "Attiva la rilevazione automatica della lingua per l'evidenziazione della sintassi", "Automatically replace plain text Emoji": "Sostituisci automaticamente le emoji testuali", - "Never send encrypted messages to unverified devices from this device": "Non inviare mai da questo dispositivo messaggi cifrati a dispositivi non verificati", - "Never send encrypted messages to unverified devices in this room from this device": "Non inviare mai da questo dispositivo messaggi cifrati a dispositivi non verificati in questa stanza", "Enable inline URL previews by default": "Attiva le anteprime URL in modo predefinito", "Enable URL previews for this room (only affects you)": "Attiva le anteprime URL in questa stanza (riguarda solo te)", "Enable URL previews by default for participants in this room": "Attiva le anteprime URL in modo predefinito per i partecipanti in questa stanza", @@ -233,7 +219,6 @@ "No display name": "Nessun nome visibile", "New passwords don't match": "Le nuove password non corrispondono", "Passwords can't be empty": "Le password non possono essere vuote", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "La modifica della password ripristinerà qualsiasi chiave di cifratura end-to-end su tutti i dispositivi, rendendo illeggibile la cronologia delle chat, a meno che prima non esporti le tue chiavi della stanza e poi le importi. In futuro ciò verrà migliorato.", "Export E2E room keys": "Esporta chiavi E2E della stanza", "Do you want to set an email address?": "Vuoi impostare un indirizzo email?", "Current password": "Password attuale", @@ -241,9 +226,6 @@ "New Password": "Nuova password", "Confirm password": "Conferma password", "Change Password": "Modifica password", - "Unable to load device list": "Impossibile caricare l'elenco dei dispositivi", - "Delete %(count)s devices|other": "Elimina %(count)s dispositivi", - "Delete %(count)s devices|one": "Elimina dispositivo", "Device ID": "ID dispositivo", "Last seen": "Visto l'ultima volta", "Failed to set display name": "Impostazione nome visibile fallita", @@ -259,14 +241,7 @@ "%(senderName)s sent a video": "%(senderName)s ha inviato un video", "%(senderName)s uploaded a file": "%(senderName)s ha inviato un file", "Options": "Opzioni", - "Your key share request has been sent - please check your other devices for key share requests.": "Richiesta di condivisione chiavi inviata - controlla i tuoi altri dispositivi per richieste di condivisione chiavi.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Le richieste di condivisione chiavi sono inviate automaticamente ai tuoi altri dispositivi. Se hai rifiutato o annullato la richiesta negli altri dispositivi, clicca qui per richiederle nuovamente.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Se i tuoi altri dispositivi non hanno la chiave per questo messaggio non potrai decriptarli.", "Key request sent.": "Richiesta chiave inviata.", - "Re-request encryption keys from your other devices.": "Chiedi di nuovo le chiavi di cifratura dai tuoi altri dispositivi.", - "Undecryptable": "Indecifrabile", - "Encrypted by an unverified device": "Criptato da un dispositivo non verificato", - "Unencrypted message": "Messaggio non criptato", "Please select the destination room for this message": "Seleziona la stanza di destinazione per questo messaggio", "Blacklisted": "In lista nera", "device id: ": "ID dispositivo: ", @@ -286,8 +261,6 @@ "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.": "Non potrai annullare questa modifica dato che ti stai declassando, se sei l'ultimo utente privilegiato nella stanza sarà impossibile ottenere di nuovo i privilegi.", "Are you sure?": "Sei sicuro?", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Non potrai annullare questa modifica dato che stai promuovendo l'utente al tuo stesso grado.", - "No devices with registered encryption keys": "Nessun dispositivo con chiavi di cifratura registrate", - "Devices": "Dispositivi", "Unignore": "Non ignorare più", "Ignore": "Ignora", "Mention": "Cita", @@ -307,20 +280,14 @@ "Voice call": "Chiamata vocale", "Video call": "Chiamata video", "Upload file": "Invia file", - "Show Text Formatting Toolbar": "Mostra barra di formattazione testo", "Send an encrypted reply…": "Invia una risposta criptata…", "Send a reply (unencrypted)…": "Invia una risposta (non criptata)…", "Send an encrypted message…": "Invia un messaggio criptato…", "Send a message (unencrypted)…": "Invia un messaggio (non criptato)…", "You do not have permission to post to this room": "Non hai il permesso di inviare in questa stanza", - "Hide Text Formatting Toolbar": "Nascondi barra di formattazione testo", "Server error": "Errore del server", "Server unavailable, overloaded, or something else went wrong.": "Server non disponibile, sovraccarico o qualcos'altro è andato storto.", "Command error": "Errore nel comando", - "bold": "grassetto", - "italic": "corsivo", - "Markdown is disabled": "Il markdown è disattivato", - "Markdown is enabled": "Il markdown è attivato", "Jump to message": "Salta al messaggio", "No pinned messages.": "Nessun messaggio ancorato.", "Loading...": "Caricamento...", @@ -349,7 +316,6 @@ "Community Invites": "Inviti della comunità", "Invites": "Inviti", "Favourites": "Preferiti", - "People": "Persone", "Low priority": "Bassa priorità", "Historical": "Cronologia", "Power level must be positive integer.": "Il livello di poteri deve essere un intero positivo.", @@ -379,8 +345,6 @@ "Members only (since they joined)": "Solo i membri (da quando sono entrati)", "Permissions": "Autorizzazioni", "Jump to first unread message.": "Salta al primo messaggio non letto.", - "Invalid alias format": "Formato alias non valido", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' non è un formato valido per un alias", "not specified": "non specificato", "Remote addresses for this room:": "Indirizzi remoti di questa stanza:", "Local addresses for this room:": "Indirizzi locali di questa stanza:", @@ -539,19 +503,11 @@ "Unknown error": "Errore sconosciuto", "Incorrect password": "Password sbagliata", "Deactivate Account": "Disattiva l'account", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Per verificare se questo dispositivo è fidato, contatta il suo proprietario usando altri metodi (es. di persona o telefonando) e chiedigli se la chiave che vede nelle sue impostazioni utente per questo dispositivo coincide con la chiave sotto:", - "Device name": "Nome del dispositivo", - "Device key": "Chiave del dispositivo", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Se coincide, premi il pulsante di verifica sotto. Se non coincide, allora qualcuno sta intercettando questo dispositivo e dovresti premere il pulsante di lista nera.", - "Verify device": "Verifica dispositivo", "I verify that the keys match": "Confermo che le chiavi coincidono", "An error has occurred.": "Si è verificato un errore.", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Hai aggiunto un nuovo dispositivo '%(displayName)s', che sta richiedendo chiavi di cifratura.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Il dispositivo non verificato '%(displayName)s' sta richiedendo chiavi di cifratura.", "Start verification": "Inizia la verifica", "Share without verifying": "Condividi senza verificare", "Ignore request": "Ignora la richiesta", - "Loading device info...": "Caricamento info dispositivo...", "Encryption key request": "Richiesta chiave di cifratura", "Unable to restore session": "Impossibile ripristinare la sessione", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Se hai usato precedentemente una versione più recente di Riot, la tua sessione potrebbe essere incompatibile con questa versione. Chiudi questa finestra e torna alla versione più recente.", @@ -570,11 +526,6 @@ "To get started, please pick a username!": "Per iniziare, scegli un nome utente!", "This will be your account name on the homeserver, or you can pick a different server.": "Questo sarà il tuo account nell'homeserver , o puoi scegliere un server diverso.", "If you already have a Matrix account you can log in instead.": "Se invece hai già un account Matrix puoi accedere.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Attualmente stai bloccando i dispositivi non verificati; per inviare messaggi a questi dispositivi devi verificarli.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Ti consigliamo di eseguire il processo di verifica per ogni dispositivo per confermare che appartiene al legittimo proprietario, ma puoi reinviare il messaggio senza verifica se lo preferisci.", - "Room contains unknown devices": "La stanza contiene dispositivi sconosciuti", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contiene dispositivi che non hai mai visto prima.", - "Unknown devices": "Dispositivi sconosciuti", "Private Chat": "Conversazione privata", "Public Chat": "Chat pubblica", "Custom": "Personalizzato", @@ -634,8 +585,6 @@ "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Crea una comunità per raggruppare utenti e stanze! Crea una pagina iniziale personalizzata per stabilire il tuo spazio nell'universo di Matrix.", "You have no visible notifications": "Non hai alcuna notifica visibile", "Scroll to bottom of page": "Scorri in fondo alla pagina", - "Message not sent due to unknown devices being present": "Messaggio non inviato data la presenza di dispositivi sconosciuti", - "Show devices, send anyway or cancel.": "Mostra dispositivi, invia comunque o annulla.", "%(count)s of your messages have not been sent.|other": "Alcuni dei tuoi messaggi non sono stati inviati.", "%(count)s of your messages have not been sent.|one": "Il tuo messaggio non è stato inviato.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Reinvia tutti o annulla tutti adesso. Puoi anche selezionare i singoli messaggi da reinviare o annullare.", @@ -668,13 +617,10 @@ "Dark theme": "Tema scuro", "Sign out": "Disconnetti", "Success": "Successo", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "La tua password è stata cambiata correttamente. Non riceverai notifiche push su altri dispositivi finchè non riesegui l'accesso su di essi", "Unable to remove contact information": "Impossibile rimuovere le informazioni di contatto", "": "", "Import E2E room keys": "Importa chiavi E2E stanza", "Cryptography": "Crittografia", - "Device ID:": "ID dispositivo:", - "Device key:": "Chiave dispositivo:", "If you've submitted a bug via GitHub, debug logs can help us track down the problem. 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.": "Se hai segnalato un errore via Github, i log di debug possono aiutarci a identificare il problema. I log di debug contengono dati di utilizzo dell'applicazione inclusi il nome utente, gli ID o alias delle stanze o gruppi visitati e i nomi degli altri utenti. Non contengono messaggi.", "Submit debug logs": "Invia log di debug", "Riot collects anonymous analytics to allow us to improve the application.": "Riot raccoglie statistiche anonime per permetterci di migliorare l'applicazione.", @@ -690,7 +636,6 @@ "click to reveal": "clicca per mostrare", "Homeserver is": "L'homeserver è", "Identity Server is": "Il server di identità è", - "matrix-react-sdk version:": "versione matrix-react-sdk:", "riot-web version:": "versione riot-web:", "olm version:": "versione olm:", "Failed to send email": "Invio dell'email fallito", @@ -722,7 +667,6 @@ "Kicks user with given id": "Caccia un utente per ID", "Changes your display nickname": "Modifica il tuo nick visualizzato", "Searches DuckDuckGo for results": "Cerca risultati su DuckDuckGo", - "Verifies a user, device, and pubkey tuple": "Verifica una tupla di utente, dispositivo e chiave pubblica", "Ignores a user, hiding their messages from you": "Ignora un utente, non mostrandoti i suoi messaggi", "Stops ignoring a user, showing their messages going forward": "Smetti di ignorare un utente, mostrando i suoi messaggi successivi", "Opens the Developer Tools dialog": "Apre la finestra di strumenti per sviluppatori", @@ -746,7 +690,6 @@ "Session ID": "ID sessione", "End-to-end encryption information": "Informazioni di cifratura end-to-end", "Event information": "Informazioni evento", - "Sender device information": "Informazioni dispositivo mittente", "Passphrases must match": "Le password devono coincidere", "Passphrase must not be empty": "La password non può essere vuota", "Export room keys": "Esporta chiavi della stanza", @@ -820,7 +763,6 @@ "Resend": "Reinvia", "Collecting app version information": "Raccolta di informazioni sulla versione dell'applicazione", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Eliminare l'alias %(alias)s e rimuovere %(name)s dalla lista?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Questo ti permetterà di ritornare al tuo account dopo esserti disconnesso e accedere in altri dispositivi.", "Keywords": "Parole chiave", "Enable notifications for this account": "Abilita le notifiche per questo account", "Invite to this community": "Invita a questa comunità", @@ -910,8 +852,6 @@ "Missing roomId.": "ID stanza mancante.", "Always show encryption icons": "Mostra sempre icone di cifratura", "Enable widget screenshots on supported widgets": "Attiva le schermate dei widget sui widget supportati", - "Unable to reply": "Impossibile rispondere", - "At this time it is not possible to reply with an emote.": "Al momento non è possibile rispondere con una emoticon.", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Impossibile caricare l'evento a cui si è risposto, o non esiste o non hai il permesso di visualizzarlo.", "Refresh": "Aggiorna", "We encountered an error trying to restore your previous session.": "Abbiamo riscontrato un errore tentando di ripristinare la tua sessione precedente.", @@ -958,12 +898,6 @@ "This event could not be displayed": "Questo evento non può essere mostrato", "Demote yourself?": "Retrocedi?", "Demote": "Retrocedi", - "deleted": "cancellato", - "underlined": "sottolineato", - "inline-code": "codice in linea", - "block-quote": "citazione", - "bulleted-list": "lista a punti", - "numbered-list": "lista a numeri", "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.": "Nelle stanze criptate, come questa, le anteprime degli URL sono disabilitate di default per garantire che il tuo server di casa (dove vengono generate le anteprime) non possa raccogliere informazioni sui collegamenti che vedi in questa stanza.", "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.": "Quando qualcuno inserisce un URL nel proprio messaggio, è possibile mostrare un'anteprima dell'URL per fornire maggiori informazioni su quel collegamento, come il titolo, la descrizione e un'immagine dal sito web.", "The email field must not be blank.": "Il campo email non deve essere vuoto.", @@ -1055,11 +989,6 @@ "Unknown server error": "Errore sconosciuto del server", "Delete Backup": "Elimina backup", "Unable to load key backup status": "Impossibile caricare lo stato del backup delle chiavi", - "Backup has a valid signature from this device": "Il backup ha una firma valida da questo dispositivo", - "Backup has a valid signature from unverified device ": "Il backup ha una firma valida dal dispositivo non verificato ", - "Backup has an invalid signature from verified device ": "Il backup ha una firma non valida dal dispositivo verificato ", - "Backup has an invalid signature from unverified device ": "Il backup ha una firma non valida dal dispositivo non verificato ", - "Backup is not signed by any of your devices": "Il backup non è firmato da alcun tuo dispositivo", "Backup version: ": "Versione backup: ", "Algorithm: ": "Algoritmo: ", "Please review and accept all of the homeserver's policies": "Si prega di rivedere e accettare tutte le politiche dell'homeserver", @@ -1081,7 +1010,6 @@ "This looks like a valid recovery key!": "Sembra essere una chiave di recupero valida!", "Not a valid recovery key": "Non è una chiave di recupero valida", "Access your secure message history and set up secure messaging by entering your recovery key.": "Accedi alla cronologia sicura dei messaggi e imposta la messaggistica sicura inserendo la tua chiave di recupero.", - "If you've forgotten your recovery passphrase you can ": "Se hai dimenticato la password di recupero puoi ", "Failed to load group members": "Caricamento membri del gruppo fallito", "Failed to perform homeserver discovery": "Ricerca dell'homeserver fallita", "Invalid homeserver discovery response": "Risposta della ricerca homeserver non valida", @@ -1097,12 +1025,9 @@ "Your Recovery Key": "La tua chiave di recupero", "Copy to clipboard": "Copia negli appunti", "Download": "Scarica", - "Your Recovery Key has been copied to your clipboard, paste it to:": "La tua chiave di recupero è stata copiata negli appunti, incollala in:", - "Your Recovery Key is in your Downloads folder.": "La tua chiave di recupero è nella cartella Download.", "Print it and store it somewhere safe": "Stampala e conservala in un luogo sicuro", "Save it on a USB key or backup drive": "Salvala in una chiave USB o disco di backup", "Copy it to your personal cloud storage": "Copiala nel tuo archivio cloud personale", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "Senza impostare un ripristino sicuro dei messaggi, non potrai ripristinare la cronologia dei messaggi cifrati se ti disconnetti o utilizzi un altro dispositivo.", "Set up Secure Message Recovery": "Imposta ripristino sicuro dei messaggi", "Keep it safe": "Tienila al sicuro", "Create Key Backup": "Crea backup chiave", @@ -1123,7 +1048,6 @@ "Straight rows of keys are easy to guess": "Sequenze di tasti in riga sono facili da indovinare", "Short keyboard patterns are easy to guess": "Sequenze di tasti brevi sono facili da indovinare", "Custom user status messages": "Messaggi di stato utente personalizzati", - "Backup has a valid signature from verified device ": "Il backup ha una firma valida dal dispositivo verificato ", "Unable to load commit detail: %(msg)s": "Caricamento dettagli del commit fallito: %(msg)s", "Set a new status...": "Imposta un nuovo stato...", "Clear status": "Elimina stato", @@ -1186,7 +1110,6 @@ "Verify this user by confirming the following emoji appear on their screen.": "Verifica questo utente confermando che la seguente emoji appare sul suo schermo.", "Verify this user by confirming the following number appears on their screen.": "Verifica questo utente confermando che il seguente numero appare sul suo schermo.", "Unable to find a supported verification method.": "Impossibile trovare un metodo di verifica supportato.", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "Per la massima sicurezza, ti consigliamo di farlo di persona o di utilizzare un altro mezzo di comunicazione fidato.", "Dog": "Cane", "Cat": "Gatto", "Lion": "Leone", @@ -1233,7 +1156,6 @@ "Pencil": "Matita", "Paperclip": "Graffetta", "Scissors": "Forbici", - "Padlock": "Lucchetto", "Key": "Chiave", "Hammer": "Martello", "Telephone": "Telefono", @@ -1251,7 +1173,6 @@ "Headphones": "Auricolari", "Folder": "Cartella", "Pin": "Spillo", - "Your homeserver does not support device management.": "Il tuo homeserver non supporta la gestione dei dispositivi.", "Yes": "Sì", "No": "No", "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "Ti abbiamo inviato un'email per verificare il tuo indirizzo. Segui le istruzioni contenute e poi clicca il pulsante sotto.", @@ -1259,20 +1180,15 @@ "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Sei sicuro? Perderai i tuoi messaggi cifrati se non hai salvato adeguatamente le tue chiavi.", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "I messaggi criptati sono resi sicuri con una cifratura end-to-end. Solo tu e il/i destinatario/i avete le chiavi per leggere questi messaggi.", "Restore from Backup": "Ripristina da un backup", - "This device is backing up your keys. ": "Questo dispositivo sta facendo una copia delle tue chiavi. ", "Back up your keys before signing out to avoid losing them.": "Fai una copia delle tue chiavi prima di disconnetterti per evitare di perderle.", "Backing up %(sessionsRemaining)s keys...": "Copia di %(sessionsRemaining)s chiavi...", "All keys backed up": "Tutte le chiavi sono state copiate", - "Backup has a signature from unknown device with ID %(deviceId)s.": "Il backup ha una firma dal dispositivo sconosciuto con ID %(deviceId)s.", - "This backup is trusted because it has been restored on this device": "Questo backup è fidato perchè è stato ripristinato su questo dispositivo", - "Your keys are not being backed up from this device.": "Le tue chiavi non stanno venendo copiate da questo dispositivo.", "Start using Key Backup": "Inizia ad usare il backup chiavi", "Add an email address to configure email notifications": "Aggiungi un indirizzo email per configurare le notifiche via email", "Unable to verify phone number.": "Impossibile verificare il numero di telefono.", "Verification code": "Codice di verifica", "Phone Number": "Numero di telefono", "Profile picture": "Immagine del profilo", - "Upload profile picture": "Invia immagine del profilo", "Upgrade to your own domain": "Aggiorna ad un tuo dominio personale", "Display Name": "Nome visualizzato", "Set a new account password...": "Imposta una nuova password dell'account...", @@ -1335,10 +1251,6 @@ "Encryption": "Cifratura", "Once enabled, encryption cannot be disabled.": "Una volta attivata, la cifratura non può essere disattivata.", "Encrypted": "Cifrato", - "Some devices for this user are not trusted": "Alcuni dispositivi di questo utente non sono fidati", - "Some devices in this encrypted room are not trusted": "Alcuni dispositivi in questa stanza cifrata non sono fidati", - "All devices for this user are trusted": "Tutti i dispositivi di questo utente sono fidati", - "All devices in this encrypted room are trusted": "Tutti i dispositivi in questa stanza cifrata sono fidati", "Never lose encrypted messages": "Non perdere mai i messaggi cifrati", "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "I messaggi in questa stanza sono protetti con crittografia end-to-end. Solo tu e i destinatari avete le chiavi per leggere questi messaggi.", "Securely back up your keys to avoid losing them. Learn more.": "Fai una copia sicura delle chiavi per evitare di perderle. Maggiori informazioni.", @@ -1354,8 +1266,6 @@ "Error updating flair": "Errore aggiornamento predisposizione", "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "Si è verificato un errore nell'aggiornamento della predisposizione di questa stanza. Potrebbe non essere permesso dal server o si è verificato un errore temporaneo.", "Room avatar": "Avatar della stanza", - "Upload room avatar": "Invia avatar della stanza", - "No room avatar": "Nessun avatar della stanza", "Room Name": "Nome stanza", "Room Topic": "Argomento stanza", "Join": "Entra", @@ -1367,7 +1277,6 @@ "Nothing appearing? Not all clients support interactive verification yet. .": "Non compare niente? Non tutti i client supportano ancora la verifica interattiva. .", "Use two-way text verification": "Usa la verifica testuale bidirezionale", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Verifica questo utente per contrassegnarlo come affidabile. La fiducia degli utenti offre una maggiore tranquillità quando si utilizzano messaggi cifrati end-to-end.", - "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "La verifica di questo utente contrassegna il suo dispositivo come affidabile a te e viceversa.", "Waiting for partner to confirm...": "In attesa che il partner confermi...", "Incoming Verification Request": "Richiesta di verifica in arrivo", "I don't want my encrypted messages": "Non voglio i miei messaggi cifrati", @@ -1418,12 +1327,10 @@ "This homeserver does not support communities": "Questo homeserver non supporta le comunità", "Guest": "Ospite", "Could not load user profile": "Impossibile caricare il profilo utente", - "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "La modifica della password reimposta qualsiasi chiave di cifratura end-to-end su tutti i dispositivi, rendendo illeggibile la cronologia della chat cifrata. Imposta il backup chiavi o esporta le chiavi della stanza da un altro dispositivo prima di reimpostare la password.", "Your Matrix account on %(serverName)s": "Il tuo account Matrix su %(serverName)s", "A verification email will be sent to your inbox to confirm setting your new password.": "Ti verrà inviata un'email di verifica per confermare la tua nuova password.", "Sign in instead": "Oppure accedi", "Your password has been reset.": "La tua password è stata reimpostata.", - "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Sei stato disconnesso da tutti i dispositivi e non riceverai più notifiche push. Per riattivare le notifiche, accedi di nuovo su ogni dispositivo.", "Set a new password": "Imposta un nuova password", "This homeserver does not support login using email address.": "Questo homeserver non supporta l'accesso tramite indirizzo email.", "Create account": "Crea account", @@ -1436,7 +1343,6 @@ "Set up with a Recovery Key": "Imposta con una chiave di ripristino", "Please enter your passphrase a second time to confirm.": "Inserisci la tua password un'altra volta per confermare.", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "La tua chiave di ripristino è una rete di sicurezza - puoi usarla per recuperare l'accesso ai tuoi messaggi cifrati se dimentichi la tua password.", - "Keep your recovery key somewhere very secure, like a password manager (or a safe)": "Conserva la chiave di ripristino in un luogo molto sicuro, come un password manager (o una cassaforte)", "Your keys are being backed up (the first backup could take a few minutes).": "Il backup delle chiavi è in corso (il primo backup potrebbe richiedere qualche minuto).", "Secure your backup with a passphrase": "Proteggi il tuo backup con una password", "Confirm your passphrase": "Conferma la tua password", @@ -1444,22 +1350,13 @@ "Starting backup...": "Avvio del backup...", "Success!": "Completato!", "A new recovery passphrase and key for Secure Messages have been detected.": "Sono state rilevate una nuova password di ripristino e una chiave per i messaggi sicuri.", - "This device is encrypting history using the new recovery method.": "Questo dispositivo sta criptando la cronologia utilizzando il nuovo metodo di ripristino.", "Recovery Method Removed": "Metodo di ripristino rimosso", - "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "Questo dispositivo ha rilevato che la password di ripristino e la chiave per i messaggi sicuri sono stati rimossi.", - "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "Se l'hai fatto per sbaglio, è possibile impostare Messaggi Sicuri su questo dispositivo che cripterà nuovamente la cronologia dei messaggi con un nuovo metodo di ripristino.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Se non hai rimosso il metodo di ripristino, è possibile che un aggressore stia cercando di accedere al tuo account. Cambia la password del tuo account e imposta immediatamente un nuovo metodo di recupero nelle impostazioni.", - "Room upgrade confirmation": "Conferma di aggiornamento stanza", - "Upgrading a room can be destructive and isn't always necessary.": "Aggiornare una stanza può essere distruttivo e non sempre è necessario.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Gli aggiornamenti delle stanze sono solitamente consigliati quando una versione è considerata non stabile. Le versioni di stanza non stabili possono avere errori, funzioni mancanti o vulnerabilità di sicurezza.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Gli aggiornamenti della stanza di solito influenzano solo l'elaborazione lato-server della stanza. Se riscontri un problema con il tuo client Riot, segnalalo con .", "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.": "Attenzione: aggiornare una stanza non migrerà automaticamente i membri della stanza alla nuova versione. Inseriremo un link alla nuova stanza nella vecchia versione - i membri dovranno cliccare questo link per unirsi alla nuova stanza.", "Adds a custom widget by URL to the room": "Aggiunge alla stanza un widget personalizzato da URL", "Please supply a https:// or http:// widget URL": "Fornisci un URL https:// o http:// per il widget", "You cannot modify widgets in this room.": "Non puoi modificare i widget in questa stanza.", "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s ha revocato l'invito a %(targetDisplayName)s di unirsi alla stanza.", - "Enable desktop notifications for this device": "Attiva le notifiche desktop per questo dispositivo", - "Enable audible notifications for this device": "Attiva le notifiche audio per questo dispositivo", "Upgrade this room to the recommended room version": "Aggiorna questa stanza alla versione consigliata", "This room is running room version , which this homeserver has marked as unstable.": "La versione di questa stanza è , che questo homeserver ha segnalato come non stabile.", "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Aggiornare questa stanza spegnerà l'istanza attuale della stanza e ne creerà una aggiornata con lo stesso nome.", @@ -1484,8 +1381,6 @@ "The file '%(fileName)s' failed to upload.": "Invio del file '%(fileName)s' fallito.", "The server does not support the room version specified.": "Il server non supporta la versione di stanza specificata.", "Name or Matrix ID": "Nome o ID Matrix", - "Email, name or Matrix ID": "Email, nome o ID Matrix", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Conferma di volere continuare nell'aggiornamento di questa stanza dalla alla .", "Changes your avatar in this current room only": "Cambia il tuo avatar solo nella stanza attuale", "Unbans user with given ID": "Riammette l'utente con l'ID dato", "Sends the given message coloured as a rainbow": "Invia il messaggio dato colorato come un arcobaleno", @@ -1493,10 +1388,6 @@ "The user's homeserver does not support the version of the room.": "L'homeserver dell'utente non supporta la versione della stanza.", "Show hidden events in timeline": "Mostra eventi nascosti nella timeline", "When rooms are upgraded": "Quando le stanze vengono aggiornate", - "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Questo dispositivo non sta facendo backup delle tue chiavi, ma hai un backup esistente che puoi ripristinare e aggiungere da adesso in poi.", - "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Connetti questo dispositivo al backup chiavi prima di disconnetterti per evitare di perdere chiavi che potrebbero essere solo in questo dispositivo.", - "Connect this device to Key Backup": "Connetti questo dispositibo al Backup Chiavi", - "Backup has an invalid signature from this device": "Il backup ha un firma non valida da questo dispositivo", "this room": "questa stanza", "View older messages in %(roomName)s.": "Vedi messaggi più vecchi in %(roomName)s.", "Joining room …": "Ingresso nella stanza …", @@ -1613,22 +1504,18 @@ "Resend %(unsentCount)s reaction(s)": "Reinvia %(unsentCount)s reazione/i", "Resend removal": "Reinvia la rimozione", "Changes your avatar in all rooms": "Cambia il tuo avatar in tutte le stanze", - "Clear all data on this device?": "Eliminare tutti i dati in questo dispositivo?", "Your homeserver doesn't seem to support this feature.": "Il tuo homeserver non sembra supportare questa funzione.", "You're signed out": "Sei disconnesso", "Clear all data": "Elimina tutti i dati", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Per favore dicci cos'è andato storto, o meglio, crea una segnalazione su GitHub che descriva il problema.", "Removing…": "Rimozione…", - "Clearing all data from this device is permanent. Encrypted messages will be lost unless their keys have been backed up.": "L'eliminazione di tutti i dati dal dispositivo è permanente. I messaggi cifrati andranno persi a meno che non si abbia un backup delle loro chiavi.", "Failed to re-authenticate due to a homeserver problem": "Riautenticazione fallita per un problema dell'homeserver", "Failed to re-authenticate": "Riautenticazione fallita", - "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.": "Ottieni l'accesso al tuo account e ripristina le chiavi di cifratura salvate nel dispositivo. Senza di esse, non potrai leggere tutti i tuoi messaggi sicuri su qualsiasi dispositivo.", "Enter your password to sign in and regain access to your account.": "Inserisci la tua password per accedere ed ottenere l'accesso al tuo account.", "Forgotten your password?": "Hai dimenticato la password?", "Sign in and regain access to your account.": "Accedi ed ottieni l'accesso al tuo account.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Non puoi accedere al tuo account. Contatta l'admin del tuo homeserver per maggiori informazioni.", "Clear personal data": "Elimina dati personali", - "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.": "Attenzione: i tuoi dati personali (incluse le chiavi di cifratura) sono ancora in questo dispositivo. Eliminali se hai finito di usare il dispositivo o se vuoi accedere ad un altro account.", "Identity Server": "Server identità", "Find others by phone or email": "Trova altri per telefono o email", "Be found by phone or email": "Trovato per telefono o email", @@ -1640,7 +1527,6 @@ "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Chiedi all'amministratore del tuo homeserver(%(homeserverDomain)s) per configurare un server TURN affinché le chiamate funzionino in modo affidabile.", "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.": "In alternativa, puoi provare a utilizzare il server pubblico all'indirizzo turn.matrix.org, ma questo non sarà così affidabile e condividerà il tuo indirizzo IP con quel server. Puoi anche gestirlo in Impostazioni.", "Try using turn.matrix.org": "Prova a usare turn.matrix.org", - "Failed to start chat": "Impossibile avviare la chat", "Messages": "Messaggi", "Actions": "Azioni", "Displays list of commands with usages and descriptions": "Visualizza l'elenco dei comandi con usi e descrizioni", @@ -1670,7 +1556,6 @@ "Please enter verification code sent via text.": "Inserisci il codice di verifica inviato via SMS.", "Discovery options will appear once you have added a phone number above.": "Le opzioni di scoperta appariranno dopo aver aggiunto un numero di telefono sopra.", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "È stato inviato un SMS a +%(msisdn)s. Inserisci il codice di verifica contenuto.", - "To verify that this device can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Per verificare che questo dispositivo sia affidabile, controlla che la chiave che vedi nelle Impostazioni Utente su quel dispositivo corrisponde alla chiave sotto:", "Command Help": "Aiuto comando", "No identity server is configured: add one in server settings to reset your password.": "Nessun server di identità configurato: aggiungine uno nelle impostazioni server per ripristinare la password.", "This account has been deactivated.": "Questo account è stato disattivato.", @@ -1682,7 +1567,6 @@ "Terms of service not accepted or the identity server is invalid.": "Condizioni di servizio non accettate o server di identità non valido.", "Enter a new identity server": "Inserisci un nuovo server di identità", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Accetta le condizioni di servizio del server di identità (%(serverName)s) per poter essere trovabile tramite indirizzo email o numero di telefono.", - "A device's public name is visible to people you communicate with": "Il nome pubblico di un dispositivo è visibile dalle persone con cui comunichi", "Remove %(email)s?": "Rimuovere %(email)s?", "Remove %(phone)s?": "Rimuovere %(phone)s?", "Multiple integration managers": "Gestori di integrazione multipli", @@ -1780,7 +1664,6 @@ "Notification Autocomplete": "Autocompletamento notifiche", "Room Autocomplete": "Autocompletamento stanze", "User Autocomplete": "Autocompletamento utenti", - "Use the new, faster, composer for writing messages": "Usa il compositore nuovo e più veloce per scrivere messaggi", "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|one": "Stai per rimuovere 1 messaggio da %(user)s. Non può essere annullato. Vuoi continuare?", "Remove %(count)s messages|one": "Rimuovi 1 messaggio", "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.": "Chiave pubblica di Captcha mancante nella configurazione dell'homeserver. Segnalalo all'amministratore dell'homeserver.", @@ -1870,11 +1753,7 @@ "Custom (%(level)s)": "Personalizzato (%(level)s)", "Trusted": "Fidato", "Not trusted": "Non fidato", - "Hide verified Sign-In's": "Nascondi accessi verificati", - "%(count)s verified Sign-In's|other": "%(count)s accessi verificati", - "%(count)s verified Sign-In's|one": "1 accesso verificato", "Direct message": "Messaggio diretto", - "Unverify user": "Revoca verifica utente", "%(role)s in %(roomName)s": "%(role)s in %(roomName)s", "Messages in this room are end-to-end encrypted.": "I messaggi in questa stanza sono cifrati end-to-end.", "Security": "Sicurezza", @@ -1891,7 +1770,6 @@ "Using this widget may share data with %(widgetDomain)s.": "Usando questo widget i dati possono essere condivisi con %(widgetDomain)s.", "Widget added by": "Widget aggiunto da", "This widget may use cookies.": "Questo widget può usare cookie.", - "Send verification requests in direct message, including a new verification UX in the member panel.": "Invia le richieste di verifica via messaggio diretto, inclusa una nuova esperienza utente per la verifica nel pannello membri.", "Enable local event indexing and E2EE search (requires restart)": "Attiva l'indicizzazione di eventi locali e la ricerca E2EE (richiede riavvio)", "Connecting to integration manager...": "Connessione al gestore di integrazioni...", "Cannot connect to integration manager": "Impossibile connettere al gestore di integrazioni", @@ -1916,7 +1794,6 @@ "Ignored/Blocked": "Ignorati/Bloccati", "Verification Request": "Richiesta verifica", " (1/%(totalCount)s)": " (1/%(totalCount)s)", - "Enable cross-signing to verify per-user instead of per-device (in development)": "Attiva la firma incrociata per la verifica per-utente invece che per-dispositivo (in sviluppo)", "Match system theme": "Usa il tema di sistema", "%(senderName)s placed a voice call.": "%(senderName)s ha effettuato una chiamata vocale.", "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s ha effettuato una chiamata vocale. (non supportata da questo browser)", @@ -1958,7 +1835,6 @@ "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ha modificato una regola di ban che corrispondeva a %(oldGlob)s per corrispondere a %(newGlob)s perchè %(reason)s", "Send cross-signing keys to homeserver": "Invia chiavi di firma incrociata all'homeserver", "Cross-signing public keys:": "Chiavi pubbliche di firma incrociata:", - "on device": "sul dispositivo", "not found": "non trovato", "Cross-signing private keys:": "Chiavi private di firma incrociata:", "in secret storage": "in un archivio segreto", @@ -1971,67 +1847,40 @@ "Unable to access secret storage. Please verify that you entered the correct passphrase.": "Impossibile accedere all'archivio segreto. Controlla di avere inserito la password corretta.", "Warning: You should only access secret storage from a trusted computer.": "Attenzione: dovresti accedere all'archivio segreto solo da un computer fidato.", "Cross-signing and secret storage are enabled.": "La firma incrociata e l'archivio segreto sono attivi.", - "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this device.": "Il tuo account ha un'identità a firma incrociata in archivio segreto, ma non è ancora fidata da questo dispositivo.", "Cross-signing and secret storage are not yet set up.": "La firma incrociata e l'archivio segreto non sono ancora impostati.", "not stored": "non salvato", "Backup has a valid signature from this user": "Il backup ha una firma valida da questo utente", "Backup has a invalid signature from this user": "Il backup ha una firma non valida da questo utente", "Backup has a signature from unknown user with ID %(deviceId)s": "Il backup ha una firma dall'utente sconosciuto con ID %(deviceId)s", - "Backup has a signature from unknown device with ID %(deviceId)s": "Il backup ha una firma dal dispositivo sconosciuto con ID %(deviceId)s", - "Backup key stored in secret storage, but this feature is not enabled on this device. Please enable cross-signing in Labs to modify key backup state.": "Backup chiavi presente nell'archivio segreto, ma questa funzione non è attiva sul dispositivo. Attiva la firma incrociata in Labs per modificare lo stato del backup.", "Backup key stored: ": "Backup chiavi salvato: ", - "Start using Key Backup with Secure Secret Storage": "Inizia ad usare il Backup Chiavi con l'Archivio Segreto", "Hide verified sessions": "Nascondi sessioni verificate", "%(count)s verified sessions|other": "%(count)s sessioni verificate", "%(count)s verified sessions|one": "1 sessione verificata", - "Access your secure message history and your cross-signing identity for verifying other devices by entering your passphrase.": "Accedi alla cronologia sicura dei tuoi messaggi e all'identità a firma incrociata per verificare altri dispositivi inserendo la tua password.", "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.": "Se hai dimenticato la password puoi usare la tua chiave di recupero o impostare nuove opzioni di recupero.", "Enter secret storage recovery key": "Inserisci la chiave di recupero dell'archivio segreto", "Unable to access secret storage. Please verify that you entered the correct recovery key.": "Impossibile accedere all'archivio segreto. Controlla di avere inserito la chiave di recupero corretta.", - "Access your secure message history and your cross-signing identity for verifying other devices by entering your recovery key.": "Accedi alla cronologia sicura dei tuoi messaggi e all'identità a firma incrociata per verificare altri dispositivi inserendo la tua chiave di recupero.", "If you've forgotten your recovery key you can .": "Se hai dimenticato la tua chiave di recupero puoi .", "Warning: You should only set up key backup from a trusted computer.": "Attenzione: dovresti impostare il backup chiavi solo da un computer fidato.", "If you've forgotten your recovery key you can ": "Se hai dimenticato la tua chiave di recupero puoi ", - "Warning: You should only set up secret storage from a trusted computer.": "Attenzione: dovresti impostare l'archivio segreto solo da un computer fidato.", - "We'll use secret storage to optionally store an encrypted copy of your cross-signing identity for verifying other devices and message keys on our server. Protect your access to encrypted messages with a passphrase to keep it secure.": "Utilizzeremo l'archivio segreto per memorizzare facoltativamente una copia criptata della tua identità a firma incrociata per verificare altri dispositivi e chiavi dei messaggi sul nostro server. Proteggi il tuo accesso ai messaggi cifrati con una password per tenerlo al sicuro.", "Set up with a recovery key": "Imposta con una chiave di recupero", "As a safety net, you can use it to restore your access to encrypted messages if you forget your passphrase.": "Come àncora di salvezza, puoi usarla per recuperare l'accesso ai tuoi messaggi cifrati se dimentichi la password.", "As a safety net, you can use it to restore your access to encrypted messages.": "Come àncora di salvezza, puoi usarla per recuperare l'accesso ai tuoi messaggi cifrati.", "Keep your recovery key somewhere very secure, like a password manager (or a safe).": "Tieni la chiave di recupero in un posto molto sicuro, come un gestore di password (o una cassaforte).", "Your recovery key has been copied to your clipboard, paste it to:": "La tua chiave di recupero è stata copiata negli appunti, incollala in:", "Your recovery key is in your Downloads folder.": "La chiave di recupero è nella tua cartella Scaricati.", - "Your access to encrypted messages is now protected.": "L'accesso ai tuoi messaggi cifrati è ora protetto.", - "Without setting up secret storage, you won't be able to restore your access to encrypted messages or your cross-signing identity for verifying other devices if you log out or use another device.": "Senza l'impostazione dell'archivio segreto, non sarà possibile recuperare l'accesso ai messaggi cifrati o l'identità a firma incrociata per verificare altri dispositivi se ti disconnetti o utilizzi un altro dispositivo.", - "Set up secret storage": "Imposta l'archivio segreto", - "Secure your encrypted messages with a passphrase": "Proteggi i tuoi messaggi cifrati con una password", "Storing secrets...": "Memorizzo i segreti...", "Unable to set up secret storage": "Impossibile impostare un archivio segreto", "Close preview": "Chiudi anteprima", - "This user has not verified all of their devices.": "Questo utente non ha verificato tutti i suoi dispositivi.", - "You have not verified this user. This user has verified all of their devices.": "Non hai verificato questo utente. Questo utente ha verificato tutti i suoi dispositivi.", - "You have verified this user. This user has verified all of their devices.": "Hai verificato questo utente. Questo utente ha verificato tutti i suoi dispositivi.", - "Some users in this encrypted room are not verified by you or they have not verified their own devices.": "Non hai verificato alcuni utenti in questa stanza criptata o essi non hanno verificato i loro dispositivi.", - "All users in this encrypted room are verified by you and they have verified their own devices.": "Hai verificato tutti gli utenti in questa stanza criptata ed essi hanno verificato i loro dispositivi.", "Language Dropdown": "Lingua a tendina", "Country Dropdown": "Nazione a tendina", "The message you are trying to send is too large.": "Il messaggio che stai tentando di inviare è troppo grande.", - "Secret Storage will be set up using your existing key backup details.Your secret storage passphrase and recovery key will be the same as they were for your key backup": "L'archivio segreto verrà impostato usando i dettagli del tuo backup chiavi. La password dell'archivio segreto e la chiave di ripristino saranno le stesse del tuo backup chiavi", - "Migrate from Key Backup": "Migra dal backup chiavi", "Help": "Aiuto", - "New DM invite dialog (under development)": "Nuovo invito via messaggio diretto (in sviluppo)", "Show info about bridges in room settings": "Mostra info sui bridge nelle impostazioni stanza", - "This bridge was provisioned by ": "Questo bridge è stato fornito da ", "This bridge is managed by .": "Questo bridge è gestito da .", - "Bridged into , on ": "Bridge in , su ", - "Connected to on ": "Connesso a su ", - "Connected via %(protocolName)s": "Connesso via %(protocolName)s", - "Bridge Info": "Info bridge", - "Below is a list of bridges connected to this room.": "Sotto vedi una lista di brdige connessi a questa stanza.", "Recent Conversations": "Conversazioni recenti", "Suggestions": "Suggerimenti", "Show more": "Mostra altro", "Direct Messages": "Messaggi diretti", - "If you can't find someone, ask them for their username, or share your username (%(userId)s) or profile link.": "Se non riesci a trovare qualcuno, chiedigli il nome utente o condividi il tuo (%(userId)s) o il link al profilo.", "Go": "Vai", "a few seconds ago": "pochi secondi fa", "about a minute ago": "circa un minuto fa", @@ -2052,12 +1901,7 @@ "Bootstrap cross-signing and secret storage": "Inizializza firma incrociata e archivio segreto", "Failed to find the following users": "Impossibile trovare i seguenti utenti", "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "I seguenti utenti potrebbero non esistere o non sono validi, perciò non possono essere invitati: %(csvNames)s", - "Key Backup is enabled on your account but has not been set up from this session. To set up secret storage, restore your key backup.": "Il Backup Chiavi è attivo sul tuo account ma non è stato impostato da questa sessione. Per impostare un archivio segreto, ripristina il tuo backup chiavi.", "Restore": "Ripristina", - "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup": "L'archivio segreto verrà impostato usando i dettagli esistenti del backup chiavi. La password dell'archivio segreto e la chiave di recupero saranno le stesse del backup chiavi", - "Restore your Key Backup": "Ripristina il tuo Backup Chiavi", - "New Session": "Nuova sessione", - "New invite dialog": "Nuova finestra di invito", "Other users may not trust it": "Altri utenti potrebbero non fidarsi", "Later": "Più tardi", "Failed to invite the following users to chat: %(csvUsers)s": "Impossibile invitare i seguenti utenti alla chat: %(csvUsers)s", @@ -2072,18 +1916,13 @@ "Session verified": "Sessione verificata", "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "La tua sessione ora è verificata. Ha accesso ai tuoi messaggi cifrati e gli altri utenti la vedranno come fidata.", "Done": "Fatto", - "Without completing security on this device, it won’t have access to encrypted messages.": "Se non completi la sicurezza su questo dispositivo, esso non avrà accesso ai messaggi cifrati.", "Go Back": "Torna", - "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup.": "L'archivio segreto verrà impostato usando i dettagli del backup chiavi esistente. La password dell'archivio segreto e la chiave di ripristino saranno le stesse del backup chiavi.", - "Encrypted by a deleted device": "Cifrato da un dispositivo eliminato", "Verify User": "Verifica utente", "For extra security, verify this user by checking a one-time code on both of your devices.": "Per maggiore sicurezza, verifica questo utente controllando un codice univoco sui vostri dispositivi.", - "For maximum security, do this in person.": "Per massima sicurezza, fatelo di persona.", "Start Verification": "Inizia la verifica", "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s ha aggiunto %(addedAddresses)s e %(count)s altri indirizzi a questa stanza", "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s ha rimosso %(removedAddresses)s e %(count)s altri indirizzi da questa stanza", "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s ha rimosso %(countRemoved)s e aggiunto %(countAdded)s indirizzi a questa stanza", - "Someone is using an unknown device": "Qualcuno sta usando un dispositivo sconosciuto", "This room is end-to-end encrypted": "Questa stanza è cifrata end-to-end", "Everyone in this room is verified": "Tutti in questa stanza sono verificati", "Invite only": "Solo a invito", @@ -2097,12 +1936,9 @@ "Send as message": "Invia come messaggio", "Enter your account password to confirm the upgrade:": "Inserisci la password del tuo account per confermare l'aggiornamento:", "You'll need to authenticate with the server to confirm the upgrade.": "Dovrai autenticarti con il server per confermare l'aggiornamento.", - "Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Aggiorna il dispositivo per consentirgli di verificare altri dispositivi, dando loro accesso ai messaggi cifrati e contrassegnandoli come fidati per gli altri utenti.", - "Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Imposta la cifratura sul dispositivo per consentirgli di verificare altri dispositivi, dando loro accesso ai messaggi cifrati e contrassegnandoli come fidati per gli altri utenti.", "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Proteggi le chiavi di cifratura con una password. Per massima sicurezza questa dovrebbe essere diversa da quella del tuo account:", "Enter a passphrase": "Inserisci una password", "Enter your passphrase a second time to confirm it.": "Inserisci di nuovo la tua password per confermarla.", - "This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Questo dispositivo ora può verificare altri dispositivi, dando loro accesso ai messaggi cifrati e contrassegnandoli come fidati per gli altri utenti.", "Verify other users in their profile.": "Verifica gli altri utenti nel loro profilo.", "Upgrade your encryption": "Aggiorna la tua cifratura", "Set up encryption": "Imposta la cifratura", @@ -2116,10 +1952,7 @@ "Waiting for %(displayName)s to verify…": "In attesa della verifica da %(displayName)s …", "They match": "Corrispondono", "They don't match": "Non corrispondono", - "For ultimate security, do this in person or use another way to communicate.": "Per la massima sicurezza, fatelo di persona o usate un'altra via di comunicazione.", - "Review & verify your new session": "Controlla e verifica la tua nuova sessione", "Review": "Controlla", - "Verify your other devices easier": "Verifica più facilmente gli altri tuoi dispositivi", "This bridge was provisioned by .": "Questo bridge è stato fornito da .", "Workspace: %(networkName)s": "Spazio di lavoro: %(networkName)s", "Channel: %(channelName)s": "Canale: %(channelName)s", diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 787dcbc4ca..43e4d5544a 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -30,7 +30,6 @@ "Upload avatar": "アイコン画像を変更", "Upload file": "添付ファイル送信", "Use compact timeline layout": "会話表示の行間を狭くする", - "Start Chat": "対話へ招待", "Riot collects anonymous analytics to allow us to improve the application.": "Riotはアプリケーションを改善するために匿名の分析情報を収集しています。", "Add": "追加", "No Microphones detected": "マイクが見つかりません", @@ -150,7 +149,6 @@ "Filter results": "絞り込み結果", "Noisy": "音量大", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "部屋のエイリアス %(alias)s を削除し、ディレクトリから %(name)s を消去しますか?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "これにより、サインアウト後にあなたのアカウントに戻る、また、他の端末でサインインすることができます。", "Invite to this community": "このコミュニティに招待する", "View Source": "ソースコードを表示する", "Back": "戻る", @@ -206,7 +204,6 @@ "e.g. ": "凡例: ", "Your device resolution": "端末の解像度", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "このページに部屋、ユーザー、グループIDなどの識別可能な情報が含まれている場合、そのデータはサーバーに送信される前に削除されます。", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "この部屋には未知の端末があります。確認せずに進むと、誰かがあなたの呼び出しを盗聴する可能性があります。", "Answer Anyway": "とにかく応答", "Call Anyway": "とにかく通話", "Call Timeout": "通話タイムアウト", @@ -274,9 +271,6 @@ "Moderator": "仲裁者", "Admin": "管理者", "Start a chat": "チャットを開始する", - "Who would you like to communicate with?": "誰と通信しますか?", - "Invite new room members": "新しい部屋のメンバーを招待します", - "Send Invites": "招待状を送る", "Failed to invite": "招待できませんでした", "Failed to invite the following users to the %(roomName)s room:": "次のユーザーを %(roomName)s の部屋に招待できませんでした:", "You need to be logged in.": "ログインする必要があります。", @@ -311,16 +305,9 @@ "Define the power level of a user": "ユーザーの権限レベルを定義", "Deops user with given id": "指定されたIDのユーザーを非表示", "Opens the Developer Tools dialog": "開発者ツールダイアログを開きます", - "Verifies a user, device, and pubkey tuple": "ユーザー、端末、および公開鍵タプルを検証します", - "Unknown (user, device) pair:": "不明な(ユーザー、端末) ペア:", - "Device already verified!": "端末はすでに確認済みです!", - "WARNING: Device already verified, but keys do NOT MATCH!": "警告:端末はすでに検証済みですが、キーは一致しません!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "警告: キー確認が失敗しました! %(userId)s と端末 %(deviceId)s の署名鍵は、提供された鍵 \"%(fingerprint)s\" と一致しない \"%(fprint)s\" です。 通信が傍受されている可能性があります!", "Verified key": "確認済みのキー", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "指定した署名鍵は、%(userId)s の端末%(deviceId)s から受け取った署名鍵と一致します。端末を検証済みとしてマークしました。", "Displays action": "アクションを表示", "Forces the current outbound group session in an encrypted room to be discarded": "暗号化されたルーム内の現在のアウトバウンドグループセッションを強制的に破棄します", - "Unrecognised command:": "認識できないコマンド:", "Reason": "理由", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s は %(displayName)s の招待を受け入れました。", "%(targetName)s accepted an invitation.": "%(targetName)s は招待を受け入れました。", @@ -364,7 +351,6 @@ "%(senderName)s made future room history visible to all room members.": "%(senderName)s は、部屋のメンバー全員に部屋履歴を参照できるようにしました。", "%(senderName)s made future room history visible to anyone.": "%(senderName)s は、部屋履歴を誰でも参照できるようにしました。", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s は 見知らぬ (%(visibility)s) に部屋履歴を参照できるようにしました。", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s はエンドツーエンドの暗号化をオンにしました (アルゴリズム %(algorithm)s)。", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s は %(fromPowerLevel)s から %(toPowerLevel)s", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s は %(powerLevelDiffText)s の権限レベルを変更しました。", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s は、その部屋の固定メッセージを変更しました。", @@ -390,8 +376,6 @@ "Enable automatic language detection for syntax highlighting": "構文強調表示の自動言語検出を有効にする", "Mirror local video feed": "ローカルビデオ映像送信", "Send analytics data": "分析データを送信する", - "Never send encrypted messages to unverified devices from this device": "この端末から未認証の端末に暗号化されたメッセージを送信しない", - "Never send encrypted messages to unverified devices in this room from this device": "この端末からこの部屋の未認証の端末に暗号化されたメッセージを送信しないでください", "Enable inline URL previews by default": "デフォルトでインラインURLプレビューを有効にする", "Enable URL previews for this room (only affects you)": "この部屋のURLプレビューを有効にする (あなたにのみ影響する)", "Enable URL previews by default for participants in this room": "この部屋の参加者のためにデフォルトでURLプレビューを有効にする", @@ -413,15 +397,11 @@ "New passwords don't match": "新しいパスワードが一致しません", "Passwords can't be empty": "パスワードを空にすることはできません", "Warning!": "警告!", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "パスワードを変更すると、すべての端末のエンドツーエンドの暗号化キーがリセットされ、暗号化されたチャット履歴は読み取れなくなります (最初にルームキーをエクスポートしてから再インポートする場合を除く)。 将来これは改善されるでしょう。", "Export E2E room keys": "E2Eルームキーをエクスポートする", "Do you want to set an email address?": "メールアドレスを設定しますか?", "Password": "パスワード", "Confirm password": "確認のパスワード", - "Unable to load device list": "端末リストを読み込めません", "Authentication": "認証", - "Delete %(count)s devices|other": "%(count)s 件の端末を削除する", - "Delete %(count)s devices|one": "端末を削除する", "Device ID": "端末ID", "Last seen": "最後に表示した時刻", "Failed to set display name": "表示名の設定に失敗しました", @@ -442,14 +422,7 @@ "%(senderName)s sent a video": "%(senderName)s が動画を送信しました", "%(senderName)s uploaded a file": "%(senderName)s がファイルをアップロードしました", "Options": "オプション", - "Your key share request has been sent - please check your other devices for key share requests.": "共有キーリクエストが送信されました - 共有キーリクエスト用の他の端末を確認してください。", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "共有キーリクエストは、他の端末に自動的に送信されます。 他の端末での共有キーリクエストを拒否または却下した場合は、ここをクリックしてこのセッションのキーを再度要求してください。", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "他の端末にこのメッセージのキーがない場合、それらの端末を復号化することはできません。", "Key request sent.": "キーリクエストが送信されました。", - "Re-request encryption keys from your other devices.": "他の端末から暗号化キーを再リクエストします。", - "Undecryptable": "解読不能", - "Encrypted by an unverified device": "未検証の端末によって暗号化されました", - "Unencrypted message": "暗号化されていないメッセージ", "Please select the destination room for this message": "このメッセージを送り先部屋を選択してください", "Blacklisted": "ブラックリストに載せた", "device id: ": "端末id: ", @@ -471,8 +444,6 @@ "Failed to toggle moderator status": "モデレータステータスを切り替えることができませんでした", "Failed to change power level": "権限レベルの変更に失敗しました", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "この変更を元に戻すことはできません。そのユーザーが自分と同じ権限レベルを持つように促します。", - "No devices with registered encryption keys": "登録された暗号化キーを持つ端末はありません", - "Devices": "端末", "Ignore": "無視", "Jump to read receipt": "既読へジャンプ", "Invite": "招待", @@ -485,12 +456,10 @@ "and %(count)s others...|other": "そして、他 %(count)s ...", "and %(count)s others...|one": "そして、もう1つ...", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (パワー %(powerLevelNumber)s)", - "deleted": "deleted", "Attachment": "付属品", "Hangup": "電話を切る", "Voice call": "音声通話", "Video call": "ビデオ通話", - "Show Text Formatting Toolbar": "テキストの書式設定ツールバーを表示する", "Send an encrypted reply…": "暗号化された返信を送信する…", "Send a reply (unencrypted)…": "(暗号化されていない) 返信を送信する…", "Send an encrypted message…": "暗号化されたメッセージを送信する…", @@ -498,14 +467,9 @@ "This room has been replaced and is no longer active.": "この部屋は交換されており、もうアクティブではありません。", "The conversation continues here.": "会話はここで続けられます。", "You do not have permission to post to this room": "この部屋に投稿する権限がありません", - "Hide Text Formatting Toolbar": "テキストの書式設定ツールバーを隠す", "Server error": "サーバーエラー", "Server unavailable, overloaded, or something else went wrong.": "サーバーが使用できない、オーバーロードされている、または何かが間違っていました。", "Command error": "コマンドエラー", - "Unable to reply": "返信できません", - "At this time it is not possible to reply with an emote.": "現時点では、エモートで返信することはできません。", - "Markdown is disabled": "マークダウンは無効です", - "Markdown is enabled": "マークダウンは有効です", "Jump to message": "メッセージにジャンプ", "No pinned messages.": "固定メッセージはありません。", "Loading...": "読み込み中...", @@ -566,8 +530,6 @@ "Hide Stickers": "ステッカーを隠す", "Show Stickers": "ステッカーを表示", "Jump to first unread message.": "最初の未読メッセージにジャンプします。", - "Invalid alias format": "無効なエイリアス形式", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' はエイリアスの有効な形式ではありません", "not specified": "指定なし", "Remote addresses for this room:": "この部屋のリモートアドレス:", "Local addresses for this room:": "この部屋のローカルアドレス:", @@ -746,19 +708,11 @@ "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.": "Matrixのメッセージの可視性は電子メールと似ています。メッセージを忘れると、新規または未登録のユーザーと共有することができませんが、既にこれらのメッセージにアクセスしている登録ユーザーは、依然としてそのコピーにアクセスできます。", "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)": "アカウントを無効する際、送信したすべてのメッセージを削除(警告:これにより、今後のユーザーは会話履歴の全文を見ることができなくなります)", "To continue, please enter your password:": "続行するには、パスワードを入力してください:", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "この端末が信頼できることを確認するには、他の方法 (個人や電話など) で所有者に連絡し、端末のユーザー設定で表示される鍵が以下のキーと一致するかどうかを尋ねてください:", - "Device name": "端末名", - "Device key": "端末キー", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "一致する場合は下の確認ボタンを押し、そうでない場合は他の誰かがこのデバイスを傍受しているので、代わりにブラックリストボタンを押してください。", - "Verify device": "デバイスの検証", "I verify that the keys match": "キーが一致することを確認します", "An error has occurred.": "エラーが発生しました。", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "暗号化キーを要求している新しい端末 '%(displayName)s' を追加しました。", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "未確認の端末 '%(displayName)s' が暗号化キーを要求しています。", "Start verification": "検証を開始する", "Share without verifying": "検証せずに共有する", "Ignore request": "要求を無視する", - "Loading device info...": "端末情報を読み込んでいます...", "Encryption key request": "暗号化キー要求", "You've previously used Riot 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, Riot needs to resync your account.": "以前 %(host)s にて、メンバーの遅延ロードを有効にしたRiotを使用していました。このバージョンでは、遅延ロードは無効です。ローカルキャッシュはこれらの2つの設定の間で互換性がないため、Riotはアカウントを再同期する必要があります。", "If the other version of Riot is still open in another tab, please close it as using Riot on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "他のバージョンのRiotがまだ別のタブで開いている場合は、同じホスト上でRiotを使用するように閉じてください。遅延ロードが同時に有効と無効になっていると問題が発生します。", @@ -808,11 +762,6 @@ "Share Room Message": "部屋のメッセージを共有", "Link to selected message": "選択したメッセージにリンクする", "COPY": "コピー", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "現在、未検証の端末をブラックリストに登録しています。 これらの端末にメッセージを送信するには、それらの端末を検証する必要があります。", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "各端末の正当な所有者に属していることを確認するために各端末の検証プロセスを進めることをおすすめしますが、あなたが好むかどうかを確認せずにメッセージを再送信することができます。", - "Room contains unknown devices": "部屋には未知の端末が含まれています", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\"には以前見たことのない端末が含まれています。", - "Unknown devices": "未知の端末", "Private Chat": "プライベートチャット", "Public Chat": "パブリックチャット", "Custom": "カスタム", @@ -887,8 +836,6 @@ "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "ユーザーと部屋をグループ化するコミュニティを作成してください! Matrixユニバースにあなたの空間を目立たせるためにカスタムホームページを作成してください。", "You have no visible notifications": "表示される通知はありません", "Scroll to bottom of page": "ページの一番下にスクロールする", - "Message not sent due to unknown devices being present": "未知の端末が存在するためにメッセージが送信されない", - "Show devices, send anyway or cancel.": "端末表示とにかく送信または キャンセル。", "You can't send any messages until you review and agree to our terms and conditions.": "利用規約 を確認して同意するまでは、いかなるメッセージも送信できません。", "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.": "このホームサーバーが月間アクティブユーザー制限を超えたため、メッセージは送信されませんでした。 サービスを引き続き使用するには、サービス管理者にお問い合わせください。", "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.": "このホームサーバーがリソース制限を超えたため、メッセージは送信されませんでした。 サービスを引き続き使用するには、サービス管理者にお問い合わせください。", @@ -920,13 +867,10 @@ "Uploading %(filename)s and %(count)s others|zero": "%(filename)s アップロード中", "Uploading %(filename)s and %(count)s others|one": "%(filename)s アップロード中、他 %(count)s 件", "Success": "成功", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "パスワードが変更されました。再ログインするまで、他の端末のプッシュ通知を受け取ることはありません", "Unable to remove contact information": "連絡先情報を削除できません", "": "<サポート対象外>", "Import E2E room keys": "E2Eルームキーのインポート", "Cryptography": "暗号", - "Device ID:": "端末ID:", - "Device key:": "端末キー:", "If you've submitted a bug via GitHub, debug logs can help us track down the problem. 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.": "GitHub経由でバグを提出した場合、デバッグログは問題の追跡に役立ちます。 デバッグログには、ユーザー名、訪問した部屋またはグループIDまたはエイリアス、および他のユーザーのユーザー名を含むアプリケーション使用データが含まれます。 それらはメッセージを含んでいません。", "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "プライバシーは私たちにとって重要なので、私たちは分析のための個人情報や識別可能なデータを収集しません。", "Learn more about how we use analytics.": "アナリティクスの使用方法の詳細については、こちらをご覧ください。", @@ -947,7 +891,6 @@ "click to reveal": "クリックすると表示されます", "Homeserver is": "ホームサーバーは", "Identity Server is": "アイデンティティ・サーバー", - "matrix-react-sdk version:": "matrix-react-sdk のバージョン:", "riot-web version:": "riot-web のバージョン:", "olm version:": "olm のバージョン:", "Failed to send email": "メールを送信できませんでした", @@ -991,7 +934,6 @@ "Session ID": "セッションID", "End-to-end encryption information": "エンドツーエンド暗号化情報", "Event information": "イベント情報", - "Sender device information": "送信者端末情報", "Passphrases must match": "パスフレーズは一致する必要があります", "Passphrase must not be empty": "パスフレーズは空であってはいけません", "Export room keys": "ルームキーのエクスポート", @@ -1009,14 +951,6 @@ "Failed to remove tag %(tagName)s from room": "部屋からタグ %(tagName)s を削除できませんでした", "Failed to add tag %(tagName)s to room": "部屋にタグ %(tagName)s を追加できませんでした", "Open Devtools": "開発ツールを開く", - "bold": "bold", - "italic": "italic", - "underlined": "underlined", - "inline-code": "inline-code", - "block-quote": "block-quote", - "bulleted-list": "bulleted-list", - "numbered-list": "numbered-list", - "People": "人々", "Flair": "バッジ", "Fill screen": "フィルスクリーン", "Light theme": "明るいテーマ", @@ -1059,8 +993,6 @@ "The server does not support the room version specified.": "このサーバは指定された部屋バージョンに対応していません。", "Name or Matrix ID": "名前またはMatrix ID", "Identity server has no terms of service": "IDサーバーは利用規約を持っていません", - "Email, name or Matrix ID": "メールアドレス、名前、またはMatrix ID", - "Failed to start chat": "対話開始に失敗しました", "Messages": "メッセージ", "Actions": "アクション", "Other": "その他", @@ -1068,7 +1000,6 @@ "Sends a message as plain text, without interpreting it as markdown": "メッセージをマークダウンと解釈せずプレーンテキストとして送信する", "Upgrades a room to a new version": "部屋を新しいバージョンへアップグレードする", "You do not have the required permissions to use this command.": "このコマンドを実行するのに必要な権限がありません。", - "Room upgrade confirmation": "部屋のアップグレードの確認", "Changes your display nickname in the current room only": "表示されるニックネームをこの部屋に関してのみ変更する", "Changes the avatar of the current room": "現在の部屋のアバターを変更する", "Changes your avatar in this current room only": "アバターをこの部屋に関してのみ変更する", @@ -1114,7 +1045,6 @@ "A word by itself is easy to guess": "単語一つだけだと簡単に特定されます", "Custom user status messages": "ユーザーステータスのメッセージをカスタマイズする", "Render simple counters in room header": "部屋のヘッダーに簡単なカウンターを表示する", - "Use the new, faster, composer for writing messages": "メッセージの編集に新しい高速なコンポーザーを使う", "Enable Emoji suggestions while typing": "入力中の絵文字提案機能を有効にする", "Show avatar changes": "アバターの変更を表示する", "Show display name changes": "表示名の変更を表示する", @@ -1125,7 +1055,6 @@ "Show recently visited rooms above the room list": "最近訪問した部屋をリストの上位に表示する", "Low bandwidth mode": "低帯域通信モード", "Public Name": "公開名", - "Upload profile picture": "プロフィール画像をアップロード", "Upgrade to your own domain": "あなた自身のドメインにアップグレード", "Phone numbers": "電話番号", "Set a new account password...": "アカウントの新しいパスワードを設定...", @@ -1134,7 +1063,6 @@ "General": "一般", "Preferences": "環境設定", "Security & Privacy": "セキュリティとプライバシー", - "A device's public name is visible to people you communicate with": "デバイスの公開名はあなたと会話するすべての人が閲覧できます", "Room information": "部屋の情報", "Internal room ID:": "内部 部屋ID:", "Room version": "部屋のバージョン", @@ -1185,7 +1113,6 @@ "Remove messages": "メッセージの削除", "Notify everyone": "全員に通知", "Select the roles required to change various parts of the room": "部屋の様々な部分の変更に必要な役割を選択", - "Upload room avatar": "部屋アバターをアップロード", "Room Topic": "部屋のトピック", "reacted with %(shortName)s": "%(shortName)s とリアクションしました", "Next": "次へ", @@ -1206,8 +1133,6 @@ "Delete Backup": "バックアップを削除", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "暗号化されたメッセージは、エンドツーエンドの暗号化によって保護されています。これらの暗号化されたメッセージを読むための鍵を持っているのは、あなたと参加者だけです。", "Restore from Backup": "バックアップから復元", - "This device is backing up your keys. ": "このデバイスは鍵をバックアップしています。 ", - "Enable desktop notifications for this device": "このデバイスでデスクトップ通知を有効にする", "Credits": "クレジット", "For help with using Riot, click here.": "Riotの使用方法に関するヘルプはこちらをご覧ください。", "Help & About": "ヘルプと概要", diff --git a/src/i18n/strings/jbo.json b/src/i18n/strings/jbo.json index e2183cabd1..8bb052cfe2 100644 --- a/src/i18n/strings/jbo.json +++ b/src/i18n/strings/jbo.json @@ -18,7 +18,6 @@ "The information being sent to us to help make Riot.im better includes:": ".i ti liste lo datni poi se dunda fi lo favgau te zu'e lo nu xagzengau la nu zunti", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": ".i pu lo nu benji fi lo samtcise'u cu vimcu lo datni poi termi'u no'u mu'a lo termi'u be lo kumfa pe'a .o nai lo pilno .o nai lo girzu", "Call Failed": ".i pu fliba lo nu fonjo'e", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": ".i da poi no'e slabu samtciselse'u cu zvati le kumfa pe'a .i je lo nu lo drata cu tirna lo nu fonjo'e cu cumki lo nu do na'e lacri da", "Review Devices": "za'u re'u viska lo liste be lo samtciselse'u", "Call Anyway": "je'e fonjo'e", "Answer Anyway": "je'e spuda", @@ -95,10 +94,6 @@ "Moderator": "li so'i", "Admin": "li ro", "Start a chat": "lo nu co'a tavla", - "Who would you like to communicate with?": ".i .au dai do tavla ma", - "Start Chat": "co'a tavla", - "Invite new room members": "vi'ecpe lo cnino prenu", - "Send Invites": "mrilu lo ve vi'ecpe", "Power level must be positive integer.": ".i .ei lo ni vlipa cu kacna'u", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": ".i la'o ly. %(senderName)s .ly. gafygau %(powerLevelDiffText)s", "Failed to change power level": ".i pu fliba lo nu gafygau lo ni vlipa", @@ -136,16 +131,9 @@ "Define the power level of a user": ".i ninga'igau lo ni lo pilno cu vlipa", "Deops user with given id": ".i xruti lo ni lo pilno poi se judri ti cu vlipa", "Opens the Developer Tools dialog": ".i samymo'i lo favgau se pilno uidje", - "Verifies a user, device, and pubkey tuple": ".i xusra lo du'u do lacri lo pilno joi lo samtciselse'u joi lo gubni termifckiku", - "Unknown (user, device) pair:": "lo pilno ce'o lo samtciselse'u vu'o poi na te djuno", - "Device already verified!": ".i do ca'o pu lacri le samtciselse'u", - "WARNING: Device already verified, but keys do NOT MATCH!": ".i ju'i cai do ca'o pu lacri le samtciselse'u .i je ku'i lo termifckiku ba'e na mapti", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": ".i ju'i cai pu fliba lo nu lacri lo termifckiku .i zoi ny. %(fprint)s .ny. noi se ponse la'o ny. %(userId)s .ny. .e la'o ny. %(deviceId)s .ny. noi samtciselse'u cu termi'u termifckiku gi'e na mapti le termifckiku poi do dunda no'u zoi ny. %(fingerprint)s .ny. .i la'a cu'i lo drata ju'i prenu cu tcidu lo se mrilu be do", "Verified key": "lo termifckiku poi se lacri", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": ".i lo termi'u termifckiku poi do dunda cu mapti lo termi'u termifckiku poi do te benji la'o ny. %(deviceId)s .ny. noi samtciselse'u po'e la'o ny. %(userId)s .ny. .i do co'a lacri le samtciselse'u", "Displays action": ".i mrilu lo nu do gasnu", "Forces the current outbound group session in an encrypted room to be discarded": ".i macnu vimcu lo ca barkla termifckiku gunma lo kumfa pe'a poi mifra", - "Unrecognised command:": "lo se minde poi na te djuno", "Reason": "lo krinu", "%(targetName)s accepted the invitation for %(displayName)s.": ".i la'o ly. %(targetName)s .ly. fitytu'i lo ve vi'ecpe be fi la'o ly. %(displayName)s .ly.", "%(targetName)s accepted an invitation.": ".i la'o ly. %(targetName)s .ly. fitytu'i lo ve vi'ecpe", @@ -190,7 +178,6 @@ "%(senderName)s made future room history visible to all room members.": ".i la'o ly. %(senderName)s .ly. gasnu lo nu ro lo cmima ka'e viska ro lo ba notci", "%(senderName)s made future room history visible to anyone.": ".i la'o ly. %(senderName)s .ly. gasnu lo nu ro lo prenu ka'e viska ro lo ba notci", "%(senderName)s made future room history visible to unknown (%(visibility)s).": ".i la'o ly. %(senderName)s .ly. gasnu lo nu zo'e ka'e viska lo notci to cuxna zoi ny. %(visibility)s .ny. toi", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": ".i gau la'o ly. %(senderName)s .ly. co'a mulno mifra fi la'o ny. %(algorithm)s .ny.", "%(senderName)s changed the pinned messages for the room.": ".i la'o ly. %(senderName)s .ly. gafygau lo vitno notci pe le kumfa pe'a", "%(widgetName)s widget modified by %(senderName)s": ".i la'o ly. %(senderName)s .ly. gafygau la'o ny. %(widgetName)s .ny. noi uidje", "%(widgetName)s widget added by %(senderName)s": ".i la'o ly. %(senderName)s .ly. jmina la'o ny. %(widgetName)s .ny. noi uidje", @@ -215,8 +202,6 @@ "Automatically replace plain text Emoji": "lo du'u xu kau zmiku basti lo cinmo lerpoi", "Mirror local video feed": "lo du'u xu kau minra lo diklo vidvi", "Send analytics data": "lo du'u xu kau benji lo se lanli datni", - "Never send encrypted messages to unverified devices from this device": "lo du'u xu kau no roi benji lo notci poi mifra ku lo samtciselse'u poi na'e lacri ku ti poi samtciselse'u", - "Never send encrypted messages to unverified devices in this room from this device": "lo du'u xu kau no roi benji lo notci poi mifra ku lo samtciselse'u poi na'e lacri poi zvati le kumfa pe'a ku'o ti poi samtciselse'u", "Enable inline URL previews by default": "lo zmiselcu'a pe lo du'u xu kau zmiku purzga lo se urli", "Enable URL previews for this room (only affects you)": "lo du'u xu kau do zmiku purzga lo se urli ne'i le kumfa pe'a", "Enable URL previews by default for participants in this room": "lo zmiselcu'a pe lo du'u xu kau lo cmima be le kumfa pe'a cu zmiku purzga lo se urli", @@ -249,7 +234,6 @@ "New passwords don't match": ".i le'i japyvla poi cnino na simxu lo nu mintu", "Passwords can't be empty": ".i lu li'u .e'a nai japyvla", "Warning!": ".i ju'i", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": ".i lo nu galfi lo japyvla cu rinka lo nu galfi ro lo termifckiku pe lo samtciselse'u kei .e lo nu na kakne lo nu tolmifygau .i ja do barbei lo do kumfa pe'a termifckiku gi'e ba nerbei ri .i ta'o le ti pruce ba zenba lo ka frili", "Export E2E room keys": "barbei lo kumfa pe'a termifckiku", "Continue": "", "Do you want to set an email address?": ".i .au pei do jmina lo te samymri", @@ -258,10 +242,7 @@ "New Password": "lo japyvla poi cnino", "Confirm password": "lo za'u re'u japyvla poi cnino", "Change Password": "galfi lo japyvla", - "Unable to load device list": ".i na kakne lo nu samymo'i lo liste be lo'i samtciselse'u", "Authentication": "lo nu facki lo du'u do du ma kau", - "Delete %(count)s devices|other": "vimcu %(count)s lo samtciselse'u", - "Delete %(count)s devices|one": "vimcu le samtciselse'u", "Device ID": "lo judri be lo samtciselse'u", "Last seen": "lo ro re'u nu viska", "Failed to set display name": ".i pu fliba lo nu galfi lo cmene", diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json index 0cad0514ed..1e3eced284 100644 --- a/src/i18n/strings/ko.json +++ b/src/i18n/strings/ko.json @@ -49,9 +49,7 @@ "Custom": "사용자 지정", "Device ID": "기기 ID", "Default": "기본", - "Device already verified!": "이미 인증한 기기입니다!", "device id: ": "기기 ID: ", - "Devices": "기기", "Direct chats": "다이렉트 대화", "Disable Notifications": "알림 끄기", "Email": "이메일", @@ -83,7 +81,6 @@ "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s님이 방 이름을 %(roomName)s(으)로 바꿨습니다.", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s님이 방 이름을 제거했습니다.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s님이 주제를 \"%(topic)s\"(으)로 바꿨습니다.", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "비밀번호를 바꾸면 현재 모든 기기의 종단간 암호화 키가 다시 설정되고, 먼저 방의 키를 내보내고 나중에 다시 불러오지 않는 한, 암호화한 대화 기록을 읽을 수 없게 됩니다. 이 부분은 향상시키겠습니다.", "Claimed Ed25519 fingerprint key": "Ed25519 핑거프린트 키가 필요함", "Click here to fix": "해결하려면 여기를 누르세요", "Click to mute audio": "소리를 끄려면 클릭", @@ -104,8 +101,6 @@ "Decrypt %(text)s": "%(text)s 복호화", "Decryption error": "암호 복호화 오류", "Deops user with given id": "받은 ID로 사용자의 등급을 낮추기", - "Device ID:": "기기 ID:", - "Device key:": "기기 키:", "Disinvite": "초대 취소", "Displays action": "활동 표시하기", "Download %(text)s": "%(text)s 다운로드", @@ -113,7 +108,6 @@ "Ed25519 fingerprint": "Ed25519 핑거프린트", "Emoji": "이모지", "Enable Notifications": "알림 켜기", - "Encrypted by an unverified device": "인증되지 않은 기기로 암호화됨", "%(senderName)s ended the call.": "%(senderName)s님이 전화를 끊었습니다.", "End-to-end encryption information": "종단간 암호화 정보", "Enter passphrase": "암호 입력", @@ -149,7 +143,6 @@ "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s를 %(fromPowerLevel)s에서 %(toPowerLevel)s로", "Guests cannot join this room even if explicitly invited.": "명시적으로 초대 받은 손님이라도 이 방에는 들어가실 수 없습니다.", "Hangup": "전화 끊기", - "Hide Text Formatting Toolbar": "문자 서식 도구 숨기기", "Historical": "기록", "Home": "홈", "Homeserver is": "홈서버:", @@ -163,15 +156,12 @@ "Incoming voice call from %(name)s": "%(name)s님으로부터 음성 통화가 왔습니다", "Incorrect username and/or password.": "사용자 이름 혹은 비밀번호가 맞지 않습니다.", "Incorrect verification code": "맞지 않은 인증 코드", - "Invalid alias format": "잘못된 별칭 형식입니다", "Invalid Email Address": "잘못된 이메일 주소", "Invalid file%(extra)s": "잘못된 파일%(extra)s", "%(senderName)s invited %(targetName)s.": "%(senderName)s님이 %(targetName)s님을 초대했습니다.", - "Invite new room members": "새 구성원 초대하기", "Invited": "초대받음", "Invites": "초대", "Invites user with given id to current room": "받은 ID로 사용자를 현재 방에 초대하기", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s'이(가) 별칭에 올바른 형식이 아님", "Sign in with": "이것으로 로그인", "Join as voice or video.": "음성 또는 영상으로 참가하세요.", "Join Room": "방에 참가", @@ -194,16 +184,10 @@ "%(senderName)s made future room history visible to anyone.": "%(senderName)s님이 이후 누구나 방의 기록을 볼 수 있게 했습니다.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s님이 이후 알 수 없음 (%(visibility)s)이 방의 기록을 볼 수 있게 했습니다.", "Manage Integrations": "통합 관리", - "Markdown is disabled": "마크다운이 꺼져 있음", - "Markdown is enabled": "마크다운이 켜져 있음", - "matrix-react-sdk version:": "matrix-react-sdk 버전:", - "Message not sent due to unknown devices being present": "알 수 없는 기기가 있어 메시지를 보낼 수 없음", "Missing room_id in request": "요청에서 room_id가 빠짐", "Missing user_id in request": "요청에서 user_id이(가) 빠짐", "Moderator": "조정자", "Name": "이름", - "Never send encrypted messages to unverified devices from this device": "이 기기에서 절대 인증받지 않은 기기에게 암호화한 메시지를 보내지 않기", - "Never send encrypted messages to unverified devices in this room from this device": "이 기기에서 이 방의 인증받지 않은 기기로 암호화한 메시지를 보내지 않기", "New address (e.g. #foo:%(localDomain)s)": "새 주소 (예: #foo:%(localDomain)s)", "New passwords don't match": "새 비밀번호가 맞지 않음", "New passwords must match each other.": "새 비밀번호는 서로 같아야 합니다.", @@ -212,7 +196,6 @@ "(not supported by this browser)": "(이 브라우저에서 지원하지 않습니다)", "": "<지원하지 않음>", "NOT verified": "인증하지 않음", - "No devices with registered encryption keys": "등록된 암호화 키가 있는 기기가 없음", "No display name": "표시 이름 없음", "No more results": "더 이상 결과 없음", "No results": "결과 없음", @@ -221,7 +204,6 @@ "Password": "비밀번호", "Passwords can't be empty": "비밀번호를 입력해주세요", "Permissions": "권한", - "People": "사람", "Phone": "전화", "Only people who have been invited": "초대받은 사람만", "Please check your email and click on the link it contains. Once this is done, click continue.": "이메일을 확인하고 안의 링크를 클릭합니다. 모두 마치고 나서, 계속하기를 누르세요.", @@ -249,7 +231,6 @@ "riot-web version:": "Riot 웹 버전:", "Room %(roomId)s not visible": "방 %(roomId)s이(가) 보이지 않음", "Room Colour": "방 색", - "Room contains unknown devices": "알 수 없는 기기가 있는 방", "%(roomName)s does not exist.": "%(roomName)s은 없는 방이에요.", "%(roomName)s is not accessible at this time.": "현재는 %(roomName)s에 들어갈 수 없습니다.", "Rooms": "방", @@ -259,8 +240,6 @@ "Searches DuckDuckGo for results": "DuckDuckGo에서 검색하기", "Seen by %(userName)s at %(dateTime)s": "%(userName)s님이 %(dateTime)s에 확인함", "Send anyway": "무시하고 보내기", - "Sender device information": "발신자 기기 정보", - "Send Invites": "초대 보내기", "Send Reset Email": "초기화 이메일 보내기", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s님이 사진을 보냈습니다.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "방에 들어오라고 %(senderName)s님이 %(targetDisplayName)s님에게 초대를 보냈습니다.", @@ -270,7 +249,6 @@ "Server unavailable, overloaded, or something else went wrong.": "서버를 쓸 수 없거나 과부하거나, 다른 문제가 있습니다.", "Session ID": "세션 ID", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s님이 표시 이름을 %(displayName)s(으)로 설정했습니다.", - "Show Text Formatting Toolbar": "문자 서식 도구 보이기", "Show timestamps in 12 hour format (e.g. 2:30pm)": "시간을 12시간제로 보이기(예: 오후 2:30)", "Signed Out": "로그아웃함", "Sign in": "로그인", @@ -279,11 +257,9 @@ "Someone": "다른 사람", "Start a chat": "대화 시작하기", "Start authentication": "인증 시작", - "Start Chat": "대화 시작", "Submit": "제출", "Success": "성공", "The phone number entered looks invalid": "입력한 전화번호가 잘못됨", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "입력한 서명 키는 %(userId)s님의 기기 %(deviceId)s에서 받은 서명 키와 같습니다. 기기가 확인되었습니다.", "This email address is already in use": "이 이메일 주소는 이미 사용 중입니다", "This email address was not found": "이 이메일 주소를 찾을 수 없음", "The email address linked to your account must be entered.": "계정에 연결한 이메일 주소를 입력해야 합니다.", @@ -297,7 +273,6 @@ "To use it, just wait for autocomplete results to load and tab through them.": "이 기능을 사용하려면, 자동 완성 결과가 나오길 기다린 뒤에 탭으로 움직여주세요.", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "이 방의 타임라인에서 특정 시점을 불러오려고 했지만, 문제의 메시지를 볼 수 있는 권한이 없습니다.", "Tried to load a specific point in this room's timeline, but was unable to find it.": "이 방의 타임라인에서 특정 시점을 불러오려고 했지만, 찾을 수 없었습니다.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s님이 종단간 암호화를 켰습니다 (%(algorithm)s 알고리즘).", "Unable to add email address": "이메일 주소를 추가할 수 없음", "Unable to remove contact information": "연락처 정보를 제거할 수 없음", "Unable to verify email address.": "이메일 주소를 인증할 수 없습니다.", @@ -305,17 +280,12 @@ "%(senderName)s unbanned %(targetName)s.": "%(senderName)s님이 %(targetName)s님에 대한 출입 금지를 풀었습니다.", "Unable to capture screen": "화면을 찍을 수 없음", "Unable to enable Notifications": "알림을 사용할 수 없음", - "Unable to load device list": "기기 목록을 불러올 수 없음", - "Undecryptable": "복호화할 수 없음", "unencrypted": "암호화하지 않음", - "Unencrypted message": "암호화하지 않은 메시지", "unknown caller": "알 수 없는 발신자", "unknown device": "알 수 없는 기기", "Unknown room %(roomId)s": "알 수 없는 방 %(roomId)s", - "Unknown (user, device) pair:": "알 수 없는 (사용자, 기기) 연결:", "Unmute": "음소거 끄기", "Unnamed Room": "이름 없는 방", - "Unrecognised command:": "인식 할 수 없는 명령:", "Unrecognised room alias:": "인식할 수 없는 방 별칭:", "Uploading %(filename)s and %(count)s others|zero": "%(filename)s을(를) 올리는 중", "Uploading %(filename)s and %(count)s others|one": "%(filename)s 외 %(count)s개를 올리는 중", @@ -342,13 +312,10 @@ "(no answer)": "(응답 없음)", "(unknown failure: %(reason)s)": "(알 수 없는 오류: %(reason)s)", "Warning!": "주의!", - "WARNING: Device already verified, but keys do NOT MATCH!": "경고: 기기는 이미 인증했지만, 키가 맞지 않습니다!", "Who can access this room?": "누가 이 방에 들어올 수 있나요?", "Who can read history?": "누가 기록을 읽을 수 있나요?", - "Who would you like to communicate with?": "누구와 대화하고 싶으세요?", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s님이 %(targetName)s님의 초대를 거절했습니다.", "You are already in a call.": "이미 통화 중입니다.", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "경고: 열쇠 확인 실패! %(userId)s와 %(deviceId)s 기기의 서명 키 \"%(fprint)s\"는 주어진 키 \"%(fingerprint)s\"와 맞지 않습니다. 누군가 대화를 엿듣는 중일 수도 있습니다!", "You cannot place a call with yourself.": "자기 자신에게는 전화를 걸 수 없습니다.", "You cannot place VoIP calls in this browser.": "이 브라우저에서는 VoIP 전화를 걸 수 없습니다.", "You do not have permission to post to this room": "이 방에 글을 올릴 권한이 없습니다", @@ -359,7 +326,6 @@ "You need to be able to invite users to do that.": "그러려면 사용자를 초대할 수 있어야 합니다.", "You need to be logged in.": "로그인을 해야 합니다.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "이메일 주소가 이 홈서버의 Matrix ID와 관련이 없는 것 같습니다.", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "비밀번호를 바꿨습니다. 다른 기기에서는 다시 로그인할 때까지 푸시 알림을 받지 않을 겁니다", "You seem to be in a call, are you sure you want to quit?": "전화 중인데, 끊겠습니까?", "You seem to be uploading files, are you sure you want to quit?": "파일을 업로드 중인데, 그만두겠습니까?", "Sun": "일", @@ -396,8 +362,6 @@ "(~%(count)s results)|one": "(~%(count)s개의 결과)", "(~%(count)s results)|other": "(~%(count)s개의 결과)", "Active call": "전화 중", - "bold": "굵게", - "italic": "기울게", "Please select the destination room for this message": "이 메시지를 보낼 방을 골라주세요", "New Password": "새 비밀번호", "Start automatically after system login": "컴퓨터를 시작할 때 자동으로 실행하기", @@ -422,18 +386,9 @@ "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "이 과정으로 다른 Matrix 클라이언트에서 내보낸 암호화 키를 가져올 수 있습니다. 그런 다음 이전 클라이언트에서 복호화할 수 있는 모든 메시지를 복호화할 수 있습니다.", "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "내보낸 파일이 암호로 보호되어 있습니다. 파일을 복호화하려면, 여기에 암호를 입력해야 합니다.", "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "이 이벤트를 감추길(삭제하길) 원하세요? 방 이름을 삭제하거나 주제를 바꾸면, 다시 생길 수도 있습니다.", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "이 기기를 신뢰할 수 있는 지 인증하려면, 다른 방법(예를 들자면 직접 만나거나 전화를 걸어서)으로 소유자 분에게 연락해, 사용자 설정에 있는 키가 아래 키와 같은지 물어보세요:", - "Device name": "기기 이름", - "Device key": "기기 키", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "키가 동일하다면, 아래의 인증 버튼을 누르세요. 혹시 키가 다르다면, 이 기기가 누군가의 공격을 받고 있는 중인 것이므로 블랙리스트에 올려야 합니다.", - "Verify device": "기기 인증", "I verify that the keys match": "열쇠가 맞는지 인증합니다", "Unable to restore session": "세션을 복구할 수 없음", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "이전에 최근 버전의 Riot을 썼다면, 세션이 이 버전과 맞지 않을 것입니다. 창을 닫고 최근 버전으로 돌아가세요.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "현재 인증되지 않은 기기를 블랙리스트에 올리고 있습니다. 인증되지 않은 기기로 메시지를 보내려면 기기를 인증해야 합니다.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "각 기기가 알맞은 소유자에게 속해 있는지 인증 과정을 거치길 추천하지만, 원한다면 그러지 않고도 메시지를 다시 보낼 수 있습니다.", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" 방에 본 적 없는 기기가 있습니다.", - "Unknown devices": "알 수 없는 기기", "Unknown Address": "알 수 없는 주소", "Unblacklist": "블랙리스트 제외", "Blacklist": "블랙리스트 등록", @@ -476,8 +431,6 @@ "Start verification": "인증 시작", "Share without verifying": "인증하지 않고 공유", "Ignore request": "요청 무시하기", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "암호화 키를 요청하고 있는 새 기기 '%(displayName)s'을(를) 추가했습니다.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "인증되지 않은 기기 '%(displayName)s'이(가) 암호화 키를 요청하고 있습니다.", "Encryption key request": "암호화 키 요청", "Edit": "편집", "Fetching third party location failed": "제 3자 위치를 가져오지 못함", @@ -527,7 +480,6 @@ "Files": "파일", "Collecting app version information": "앱 버전 정보를 수집하는 중", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "방 별칭 %(alias)s을(를) 삭제하고 목록에서 %(name)s 방을 제거하겠습니까?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "이런 식으로 로그아웃한 뒤 계정으로 돌아가, 다른 기기에서 로그인할 수 있습니다.", "Enable notifications for this account": "이 계정의 알림 사용하기", "Messages containing keywords": "키워드가 적힌 메시지", "Room not found": "방을 찾을 수 없음", @@ -637,7 +589,6 @@ "The information being sent to us to help make Riot.im better includes:": "Riot.im을 발전시키기 위해 저희에게 보내는 정보는 다음을 포함합니다:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "이 페이지에서 방, 사용자, 혹은 그룹 ID와 같은 식별 가능한 정보를 포함하는 부분이 있는 데이터는 서버에 보내지기 전에 제거됩니다.", "Call Failed": "전화 실패", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "이 방에 모르는 기기가 있습니다: 확인하지 않는다면 누군가가 당신의 대화를 엿들을 가능성이 있습니다.", "Review Devices": "기기 검증하기", "Call Anyway": "무시하고 걸기", "Answer Anyway": "무시하고 받기", @@ -674,7 +625,6 @@ "You are no longer ignoring %(userId)s": "%(userId)s님을 더 이상 무시하고 있지 않습니다", "Define the power level of a user": "사용자의 권한 등급 정의하기", "Opens the Developer Tools dialog": "개발자 도구 대화 열기", - "Verifies a user, device, and pubkey tuple": "사용자, 기기, 그리고 공개키 튜플 인증하기", "%(widgetName)s widget modified by %(senderName)s": "%(senderName)s님이 수정한 %(widgetName)s 위젯", "%(widgetName)s widget added by %(senderName)s": "%(senderName)s님이 추가한 %(widgetName)s 위젯", "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s님이 제거한 %(widgetName)s 위젯", @@ -699,7 +649,6 @@ "Automatically replace plain text Emoji": "일반 문자로 된 이모지 자동으로 변환하기", "Mirror local video feed": "보고 있는 비디오 전송 상태 비추기", "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "다른 사용자는 커뮤니티 이름아바타 변경 내역을 최대 30분까지 보지 못할 수 있습니다.", - "Delete %(count)s devices|one": "기기 삭제", "Invalid community ID": "잘못된 커뮤니티 ID", "'%(groupId)s' is not a valid community ID": "'%(groupId)s'은(는) 올바른 커뮤니티 ID가 아님", "New community ID (e.g. +foo:%(localDomain)s)": "새 커뮤니티 ID (예시: +foo:%(localDomain)s)", @@ -712,7 +661,6 @@ "%(senderName)s sent a video": "%(senderName)s님이 영상을 보냄", "%(senderName)s uploaded a file": "%(senderName)s님이 파일을 업로드함", "Key request sent.": "키 요청을 보냈습니다.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "당신의 다른 기기에 이 메시지를 읽기 위한 키가 없다면 메시지를 복호화할 수 없습니다.", "Disinvite this user?": "이 사용자에 대한 초대를 취소할까요?", "Kick this user?": "이 사용자를 추방할까요?", "Unban this user?": "이 사용자를 출입 금지에서 풀까요?", @@ -729,10 +677,8 @@ "Loading...": "로딩 중...", "Unpin Message": "메시지 고정 풀기", "No pinned messages.": "고정된 메시지가 없습니다.", - "At this time it is not possible to reply with an emote.": "지금은 감정 표현으로 답장할 수 없습니다.", "Send a message (unencrypted)…": "(암호화 안 된) 메시지를 보내세요…", "Send an encrypted message…": "암호화된 메시지를 보내세요…", - "Unable to reply": "답장할 수 없습니다", "Send an encrypted reply…": "암호화된 메시지를 보내세요…", "Send a reply (unencrypted)…": "(암호화 안 된) 답장을 보내세요…", "User Options": "사용자 옵션", @@ -752,7 +698,6 @@ "were unbanned %(count)s times|one": "의 출입 금지이 풀렸습니다", "was unbanned %(count)s times|other": "님의 출입 금지이 %(count)s번 풀렸습니다", "was unbanned %(count)s times|one": "님의 출입 금지이 풀렸습니다", - "Delete %(count)s devices|other": "%(count)s개의 기기 삭제", "You have entered an invalid address.": "잘못된 주소를 입력했습니다.", "This room is not public. You will not be able to rejoin without an invite.": "이 방은 공개되지 않았습니다. 초대 없이는 다시 들어올 수 없습니다.", "Enable URL previews for this room (only affects you)": "이 방에서 URL 미리보기 사용하기 (오직 나만 영향을 받음)", @@ -760,9 +705,6 @@ "Enable widget screenshots on supported widgets": "지원되는 위젯에 대해 위젯 스크린샷 사용하기", "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.": "누군가 메시지에 URL을 넣으면, URL 미리 보기로 웹사이트에서 온 제목, 설명, 그리고 이미지 등 그 링크에 대한 정보가 표시됩니다.", "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.": "지금 이 방처럼, 암호화된 방에서는 홈서버 (미리 보기가 만들어지는 곳)에서 이 방에서 보여지는 링크에 대해 알 수 없도록 기본으로 URL 미리 보기가 꺼집니다.", - "Your key share request has been sent - please check your other devices for key share requests.": "키 공유 요청을 보냈습니다. 키 공유 요청을 다른 기기에서 받아주세요.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "자동으로 다른 기기에 키 공유 요청을 보냈습니다. 다른 기기에서 키 공유 요청을 거절하거나 버렸다면, 여기를 눌러 이 세션으로 다시 키를 요청하세요.", - "Re-request encryption keys from your other devices.": "다른 기기에서 암호화 키를 다시 요청했습니다.", "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.": "자기 자신을 강등하는 것은 되돌릴 수 없고, 자신이 마지막으로 이 방에서 특권을 가진 사용자라면 다시 특권을 얻는 건 불가능합니다.", "Jump to read receipt": "읽은 기록으로 건너뛰기", "Jump to message": "메세지로 건너뛰기", @@ -788,8 +730,6 @@ "A call is currently being placed!": "현재 전화를 걸고 있습니다!", "Permission Required": "권한 필요", "You do not have permission to start a conference call in this room": "이 방에서는 회의 전화를 시작할 권한이 없습니다", - "deleted": "취소선", - "underlined": "밑줄", "

    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

    \n

    \n 새 구성원에게 커뮤니티에 대해 소개하거나\n 일부 중요한 링크를 나눠주기 위해 긴 설명을 사용\n

    \n

    \n 'img' 태그를 사용할 수도 있습니다\n

    \n", "Copied!": "복사했습니다!", "Failed to copy": "복사 실패함", @@ -830,10 +770,6 @@ "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)s님이 초대를 거절했습니다", "were invited %(count)s times|other": "이 %(count)s번 초대받았습니다", "were invited %(count)s times|one": "이 초대받았습니다", - "inline-code": "인라인 코드", - "block-quote": "인용 블록", - "bulleted-list": "글머리 기호 목록", - "numbered-list": "숫자 목록", "Event Content": "이벤트 내용", "Event Type": "이벤트 종류", "Failed to send custom event.": "맞춤 이벤트를 보내지 못했습니다.", @@ -931,7 +867,6 @@ "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "홈서버 %(homeserverDomain)s을(를) 계속 사용하기 위해서는 저희 이용 약관을 검토하고 동의해주세요.", "State Key": "상태 키", "Send Account Data": "계정 정보 보내기", - "Loading device info...": "기기 정보 받는 중...", "Clear Storage and Sign Out": "저장소를 지우고 로그아웃", "Send Logs": "로그 보내기", "We encountered an error trying to restore your previous session.": "이전 활동을 복구하는 중 에러가 발생했습니다.", @@ -993,20 +928,13 @@ "The server does not support the room version specified.": "서버가 지정된 방 버전을 지원하지 않습니다.", "Name or Matrix ID": "이름 혹은 Matrix ID", "Unable to load! Check your network connectivity and try again.": "불러올 수 없습니다! 네트워크 연결 상태를 확인한 후 다시 시도하세요.", - "Email, name or Matrix ID": "이메일, 이름 혹은 Matrix ID", - "Failed to start chat": "대화 시작 실패", "Failed to invite users to the room:": "방으로 사용자들을 초대하지 못했습니다:", "Messages": "메시지", "Actions": "활동", "Other": "기타", "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "¯\\_(ツ)_/¯ 앞에 일반 문자 메시지를 놓으세요", "Upgrades a room to a new version": "새 버전으로 방을 업그레이드하기", - "Room upgrade confirmation": "방 업그레이드 확인", - "Upgrading a room can be destructive and isn't always necessary.": "방을 업그레이드 하는 것이 파괴로 이어질 수 있으며, 필수적이지 않습니다.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "방 업그레이드는 보통 방 버전이 불안정으로 간주될 때 추천합니다. 불안정한 방 버전은 버그나 부족한 기능, 혹은 보안에 취약할 수 있습니다.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "방 업그레이드는 방의 서버 측 처리에만 영향을 줍니다. Riot 클라이언트에 문제가 있는 경우, 에 문제를 제기하세요.", "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.": "경고: 방을 업그레이드하는 것은 자동으로 방 구성원 방의 새 버전으로 마이그레이션하지 않습니다. 이전 버전의 방에 새 방의 링크를 게시합니다 - 방 구성원은 링크를 클릭해서 새 방에 들어가야 합니다.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "이 방을 에서 으로 업그레이드하길 원하는 지 확인해주세요.", "Changes your display nickname in the current room only": "현재 방에서만 표시 별명 변경하기", "Changes your avatar in this current room only": "현재 방에서만 아바타 변경하기", "Changes your avatar in all rooms": "모든 방에서 아바타 변경하기", @@ -1125,7 +1053,6 @@ "Pencil": "연필", "Paperclip": "클립", "Scissors": "가위", - "Padlock": "자물쇠", "Key": "열쇠", "Hammer": "망치", "Telephone": "전화기", @@ -1197,8 +1124,6 @@ "Verify this user by confirming the following emoji appear on their screen.": "다음 이모지가 상대방의 화면에 나타나는 것을 확인하는 것으로 이 사용자를 인증합니다.", "Verify this user by confirming the following number appears on their screen.": "다음 숫자가 상대방의 화면에 나타나는 것을 확인하는 것으로 이 사용자를 인증합니다.", "Unable to find a supported verification method.": "지원하는 인증 방식을 찾을 수 없습니다.", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "보안을 최대화하려면, 상대방과 직접 대면하거나 신뢰할 수 있는 다른 대화 수단을 사용하는 것이 좋습니다.", - "Your homeserver does not support device management.": "홈서버는 기기 관리를 지원하지 않습니다.", "ID": "ID", "Public Name": "공개 이름", "Delete Backup": "백업 삭제", @@ -1206,31 +1131,14 @@ "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "암호화된 메시지는 종단간 암호화로 보호됩니다. 오직 당신과 상대방만 이 메시지를 읽을 수 있는 키를 갖습니다.", "Unable to load key backup status": "키 백업 상태를 불러올 수 없음", "Restore from Backup": "백업에서 복구", - "This device is backing up your keys. ": "이 기기는 키를 백업하고 있습니다. ", - "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "이 기기는 키를 백업하지 않고 있습니다, 하지만 복구할 수 있는 기존 백업 키가 있습니다.", - "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "이 기기에만 있을 수 있는 키를 잃지 않도록 로그아웃하기 전에 이 기기를 키 백업에 연결하세요.", - "Connect this device to Key Backup": "이 기기를 키 백업에 연결", "Backing up %(sessionsRemaining)s keys...": "%(sessionsRemaining)s 키를 백업 중...", "All keys backed up": "모든 키 백업됨", - "Backup has a signature from unknown device with ID %(deviceId)s.": "백업에 ID %(deviceId)s인 알 수 없는 기기의 서명이 있습니다.", - "Backup has a valid signature from this device": "백업에 이 기기의 올바른 서명이 있습니다", - "Backup has an invalid signature from this device": "백업에 이 기기의 올바르지 않은 서명이 있습니다", - "Backup has a valid signature from verified device ": "백업에 인증된 기기올바른 서명이 있습니다", - "Backup has a valid signature from unverified device ": "백업에 인증되지 않은 기기올바른 서명이 있습니다", - "Backup has an invalid signature from verified device ": "백업에 인증된 기기올바르지 않은 서명이 있습니다", - "Backup has an invalid signature from unverified device ": "백업에 인증되지 않은 기기올바르지 않은 서명이 있습니다", - "Backup is not signed by any of your devices": "백업이 어떤 기기에도 서명되지 않았습니다", - "This backup is trusted because it has been restored on this device": "이 백업은 이 기기에서 복구했기에 신뢰할 수 있습니다", "Backup version: ": "백업 버전: ", "Algorithm: ": "알고리즘: ", - "Your keys are not being backed up from this device.": "키가 이 기기에서 백업되지 않았습니다.", "Back up your keys before signing out to avoid losing them.": "잃어버리지 않도록 로그아웃하기 전에 키를 백업하세요.", "Start using Key Backup": "키 백업 시작", "Add an email address to configure email notifications": "이메일 알림을 설정하려면 이메일 주소를 추가하세요", - "Enable desktop notifications for this device": "이 기기에 대해 데스크톱 알림 켜기", - "Enable audible notifications for this device": "이 기기에 대해 음성 알림 켜기", "Profile picture": "프로필 사진", - "Upload profile picture": "프로필 사진 업로드", "Upgrade to your own domain": "자체 도메인을 업그레이드하기", "Display Name": "표시 이름", "Identity Server URL must be HTTPS": "ID 서버 URL은 HTTPS이어야 함", @@ -1285,7 +1193,6 @@ "Accept all %(invitedRooms)s invites": "모든 %(invitedRooms)s개의 초대를 수락", "Key backup": "키 백업", "Security & Privacy": "보안 & 개인", - "A device's public name is visible to people you communicate with": "기기의 공개 이름은 대화하는 사람들에게 보입니다", "Missing media permissions, click the button below to request.": "미디어 권한이 없습니다, 권한 요청을 보내려면 아래 버튼을 클릭하세요.", "Request media permissions": "미디어 권한 요청", "Voice & Video": "음성 & 영상", @@ -1349,10 +1256,6 @@ "Remove %(phone)s?": "%(phone)s을(를) 제거하겠습니까?", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "문자 메시지를 +%(msisdn)s(으)로 보냈습니다. 메시지에 있는 인증 코드를 입력해주세요.", "Phone Number": "전화번호", - "Some devices for this user are not trusted": "이 사용자의 일부 기기를 신뢰할 수 없음", - "Some devices in this encrypted room are not trusted": "이 암호화된 방의 일부 기기를 신뢰할 수 없음", - "All devices for this user are trusted": "이 사용자의 모든 기기를 신뢰함", - "All devices in this encrypted room are trusted": "이 암호화된 방의 모든 기기를 신뢰함", "Edit message": "메시지 편집", "Joining room …": "방에 참가하는 중 …", "Loading …": "로딩 중 …", @@ -1402,8 +1305,6 @@ "Error updating flair": "재능 업데이트 중 오류", "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "재능을 업데이트하는 중 오류가 발생했습니다. 서버가 허용하지 않거나 일시적인 오류 발생일 수 있습니다.", "Room avatar": "방 아바타", - "Upload room avatar": "방 아바타 업로드", - "No room avatar": "방 아바타 없음", "Room Name": "방 이름", "Room Topic": "방 주제", "Show all": "전체 보기", @@ -1445,8 +1346,6 @@ "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.": "언제, 방 ID, 사용자 ID 등, 문제 분석에 도움이 되는 추가 문맥이 있다면, 그것들도 여기에 포함해주세요.", "Unable to load commit detail: %(msg)s": "커밋 세부 정보를 불러올 수 없음: %(msg)s", "Removing…": "제거 중…", - "Clear all data on this device?": "이 기기의 모든 데이터를 지우겠습니까?", - "Clearing all data from this device is permanent. Encrypted messages will be lost unless their keys have been backed up.": "이 기기에서 모든 데이터를 지우는 것은 영구적입니다. 암호화된 메시지는 키를 백업해 놓지 않았다면 읽을 수 없습니다.", "Clear all data": "모든 데이터 지우기", "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 Riot to do this": "대화 기록을 잃지 않으려면, 로그아웃하기 전에 방 키를 내보내야 합니다. 이 작업을 수행하려면 최신 버전의 Riot으로 가야 합니다", "You've previously used a newer version of Riot on %(host)s. To use this version again with end to end encryption, you will need to sign out and back in again. ": "이전에 %(host)s에서 Riot의 최신 버전을 사용했습니다. 종단간 암호화로 이 버전을 다시 사용하려면, 로그아웃한 후 다시 로그인하세요. ", @@ -1459,12 +1358,10 @@ "Waiting for partner to accept...": "상대방이 수락하기를 기다리는 중...", "Nothing appearing? Not all clients support interactive verification yet. .": "아무것도 안 나타나나요? 아직 모든 클라이언트가 상호작용 인증을 지원하지 않습니다. .", "Waiting for %(userId)s to confirm...": "%(userId)s님이 확인하기를 기다리는 중...", - "To verify that this device can be trusted, please check that the key you see in User Settings on that device matches the key below:": "이 기기를 신뢰할 수 있는 지 인증하려면, 해당 기기에서 사용자 설정에 들어가 보이는 키가 아래 키와 맞는 지 확인해주세요:", "Use two-way text verification": "양방향 문자 인증 사용", "Explore Room State": "방 상태 탐색", "View Servers in Room": "방에 있는 서버 보기", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "이 사용자를 신뢰할 수 있도록 인증합니다. 종단간 암호화 메시지를 사용할 때 사용자를 신뢰하면 안심이 듭니다.", - "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "이 사용자가 기기를 신뢰할 수 있다고 표시하고, 내 기기도 상대방에게 신뢰할 수 있다고 표시했는지 확인하세요.", "Waiting for partner to confirm...": "상대방이 확인하기를 기다리는 중...", "Incoming Verification Request": "수신 확인 요청", "You've previously used Riot 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, Riot needs to resync your account.": "이전에 구성원의 불러오기 지연이 켜진 %(host)s에서 Riot을 사용했습니다. 이 버전에서 불러오기 지연은 꺼집니다. 로컬 캐시가 이 두 설정 간에 호환되지 않으므로, Riot은 계정을 다시 동기화 해야 합니다.", @@ -1536,7 +1433,6 @@ "This looks like a valid recovery key!": "올바른 복구 키입니다!", "Not a valid recovery key": "올바르지 않은 복구 키", "Access your secure message history and set up secure messaging by entering your recovery key.": "복구 키를 입력해서 보안 메시지 기록에 접근하고 보안 메시지 설정하기.", - "If you've forgotten your recovery passphrase you can ": "복구 암호를 잊어버렸다면 할 수 있음", "Resend edit": "편집 다시 보내기", "Resend %(unsentCount)s reaction(s)": "%(unsentCount)s개의 리액션 다시 보내기", "Resend removal": "삭제 다시 보내기", @@ -1600,7 +1496,6 @@ "Riot failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.": "Riot이 홈서버에서 프로토콜 얻기에 실패했습니다. 홈서버가 제 3자 네트워크를 지원하기에 너무 오래된 것 같습니다.", "Riot failed to get the public room list.": "Riot이 공개 방 목록을 가져오는데 실패했습니다.", "The homeserver may be unavailable or overloaded.": "홈서버를 이용할 수 없거나 과부화된 상태입니다.", - "Show devices, send anyway or cancel.": "기기 보기, 무시하고 보내기 혹은 취소.", "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.": "이 홈서버가 리소스 한도를 초과했기 때문에 메시지를 보낼 수 없었습니다. 서비스를 계속 사용하려면 서비스 관리자에게 연락해주세요.", "Add room": "방 추가", "You have %(count)s unread notifications in a prior version of this room.|other": "이 방의 이전 버전에서 읽지 않은 %(count)s개의 알림이 있습니다.", @@ -1608,7 +1503,6 @@ "Guest": "손님", "Your profile": "당신의 프로필", "Could not load user profile": "사용자 프로필을 불러올 수 없음", - "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "비밀번호를 변경하면 모든 기기에서 종단간 암호화 키는 초기화되고, 암호화된 대화 기록을 읽을 수 없게 됩니다. 비밀번호를 초기화하기 전에 키 백업을 설정하거나 다른 기기에 방 키를 내보내 놓으세요.", "Your Matrix account on %(serverName)s": "%(serverName)s에서 당신의 Matrix 계정", "Your Matrix account on ": "에서 당신의 Matrix 계정", "No identity server is configured: add one in server settings to reset your password.": "ID 서버가 설정되지 않음: 비밀번호를 초기화하기 위해 서버 설정에서 하나를 추가하세요.", @@ -1616,7 +1510,6 @@ "A verification email will be sent to your inbox to confirm setting your new password.": "새 비밀번호 설정을 확인할 인증 이메일을 메일함으로 보냈습니다.", "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "%(emailAddress)s(으)로 이메일을 보냈습니다. 메일에 있는 링크를 따라갔다면, 아래를 클릭하세요.", "Your password has been reset.": "비밀번호가 초기화되었습니다.", - "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "모든 기기에서 로그아웃했고 더 이상 푸시 알림을 받을 수 없습니다. 알림을 다시 켜려면, 각 기기마다 다시 로그인하세요.", "Set a new password": "새 비밀번호 설정", "Invalid homeserver discovery response": "잘못된 홈서버 검색 응답", "Failed to get autodiscovery configuration from server": "서버에서 자동 검색 설정 얻기에 실패함", @@ -1642,14 +1535,12 @@ "Create your account": "당신의 계정 만들기", "Failed to re-authenticate due to a homeserver problem": "홈서버 문제로 다시 인증에 실패함", "Failed to re-authenticate": "다시 인증에 실패함", - "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.": "계정에 다시 접근하고 이 기기에 있는 암호화 키를 복구합니다. 키가 없으면 모든 기기에서 모든 보안 메시지를 읽을 수 없습닏다.", "Enter your password to sign in and regain access to your account.": "로그인하고 계정에 다시 접근하려면 비밀번호를 입력하세요.", "Forgotten your password?": "비밀번호를 잊었습니까?", "Sign in and regain access to your account.": "로그인하고 계정에 다시 접근하기.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "계정에 로그인할 수 없습니다. 자세한 정보는 홈서버 관리자에게 연락하세요.", "You're signed out": "로그아웃됬습니다", "Clear personal data": "개인 정보 지우기", - "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.": "경고: (암호화 키를 포함한) 개인 정보가 이 기기에 여전히 저장됩니다. 이 기기를 그만 사용하거나, 다른 계정으로 로그인하고 싶다면 개인 정보를 지우세요.", "Great! This passphrase looks strong enough.": "멋져요! 이 암호는 충분히 강합니다.", "We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.": "우리의 서버에 암호화된 키의 사본을 저장합니다. 보안을 유지하기 위해 백업을 암호로 보호하세요.", "For maximum security, this should be different from your account password.": "보안을 최대화하려면, 암호는 계정 비밀번호와 달라야 할 것입니다.", @@ -1663,17 +1554,13 @@ "As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.": "안전망처럼, 복구 암호를 잊어버렸다면 복구 키를 사용해 암호화된 메시지 기록을 복구할 수 있습니다.", "As a safety net, you can use it to restore your encrypted message history.": "안전망처럼, 복구 암호를 사용해 암호화된 메시지 기록을 복구할 수 있습니다.", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "복구 키는 안전망과 같습니다 - 복구 암호를 잊어버렸다면 복구 키를 사용해 암호화된 메시지에 접근할 수 있습니다.", - "Keep your recovery key somewhere very secure, like a password manager (or a safe)": "복구 키는 비밀번호 관리자 (혹은 금고)처럼 어딘가 매우 안전한 곳에 보관하세요", "Your Recovery Key": "당신의 복구 키", "Copy to clipboard": "클립보드로 복사", "Download": "다운로드", - "Your Recovery Key has been copied to your clipboard, paste it to:": "복구 키가 클립보드로 복사되었습니다, 여기에 붙여 넣으세요:", - "Your Recovery Key is in your Downloads folder.": "복구 키가 다운로드 폴더로 들어갔습니다.", "Print it and store it somewhere safe": "인쇄한 후 안전한 장소에 보관", "Save it on a USB key or backup drive": "USB 키나 백업 드라이브에 저장", "Copy it to your personal cloud storage": "개인 클라우드 저장소에 복사", "Your keys are being backed up (the first backup could take a few minutes).": "키를 백업했습니다 (처음 백업에는 시간이 걸릴 수 있습니다).", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "보안 메시지 복구를 설정하지 않으면, 로그아웃하거나 다른 기기를 사용하는 경우 암호화된 메시지 기록을 복구할 수 없게 됩니다.", "Set up Secure Message Recovery": "보안 메시지 복구 설정", "Secure your backup with a passphrase": "암호로 백업 보호", "Confirm your passphrase": "암호 확인", @@ -1691,12 +1578,9 @@ "New Recovery Method": "새 복구 방식", "A new recovery passphrase and key for Secure Messages have been detected.": "보안 메시지 용 새로운 복구 암호와 키가 감지되었습니다.", "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.": "새 복구 방식을 설정하지 않으면, 공격자가 계정에 접근을 시도할 지도 모릅니다. 설정에서 계정 비밀번호를 바꾸고 즉시 새 복구 방식을 설정하세요.", - "This device is encrypting history using the new recovery method.": "이 기기는 새 복구 방식을 사용해 기록을 암호화하고 있습니다.", "Go to Settings": "설정으로 가기", "Set up Secure Messages": "보안 메시지 설정", "Recovery Method Removed": "복구 방식 제거됨", - "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "이 기기에 제거했던 보안 메시지 용 복구 암호와 키가 감지되었습니다.", - "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "실수로 한 경우, 이 기기에서 새 복구 방식으로 이 기기의 메시지를 다시 암호화하도록 보안 메시지를 설정할 수 있습니다.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "이 복구 방식을 제거하지 않으면, 공격자가 계정에 접근을 시도할 지도 모릅니다. 설정에서 계정 비밀번호를 바꾸고 즉시 새 복구 방식을 설정하세요.", "Use an identity server": "ID 서버 사용", "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "ID 서버를 사용해 이메일로 초대하세요. 기본 ID 서버 (%(defaultIdentityServerName)s)를 사용하려면 계속을 클릭하거나 설정에서 관리하세요.", @@ -1782,7 +1666,6 @@ "%(count)s unread messages.|other": "%(count)s개의 읽지 않은 메시지.", "Unread mentions.": "읽지 않은 언급.", "Please create a new issue on GitHub so that we can investigate this bug.": "이 버그를 조사할 수 있도록 GitHub에 새 이슈를 추가해주세요.", - "Use the new, faster, composer for writing messages": "메시지 입력으로 새롭고 더 빠른 작성기를 사용하기", "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|one": "%(user)s님의 1개의 메시지를 삭제합니다. 이것은 되돌릴 수 없습니다. 계속하겠습니까?", "Remove %(count)s messages|one": "1개의 메시지 삭제", "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.": "홈서버 설정에서 캡챠 공개 키가 없습니다. 홈서버 관리자에게 이것을 신고해주세요.", @@ -1871,17 +1754,12 @@ "Subscribe": "구독", "Trusted": "신뢰함", "Not trusted": "신뢰하지 않음", - "Hide verified Sign-In's": "확인 로그인 숨기기", - "%(count)s verified Sign-In's|other": "확인된 %(count)s개의 로그인", - "%(count)s verified Sign-In's|one": "확인된 1개의 로그인", "Direct message": "다이렉트 메시지", - "Unverify user": "사용자 확인 취소", "%(role)s in %(roomName)s": "%(roomName)s 방의 %(role)s", "Messages in this room are end-to-end encrypted.": "이 방의 메시지는 종단간 암호화되었습니다.", "Security": "보안", "Verify": "확인", "You have ignored this user, so their message is hidden. Show anyways.": "이 사용자를 무시했습니다. 사용자의 메시지는 숨겨집니다. 무시하고 보이기.", - "Send verification requests in direct message, including a new verification UX in the member panel.": "다이렉트 메시지에서 구성원 패널에 새 확인 UX가 적용된 확인 요청을 보냅니다.", "Any of the following data may be shared:": "다음 데이터가 공유됩니다:", "Your display name": "당신의 표시 이름", "Your avatar URL": "당신의 아바타 URL", @@ -1894,7 +1772,6 @@ "Using this widget may share data with %(widgetDomain)s.": "이 위젯을 사용하면 %(widgetDomain)s와(과) 데이터를 공유합니다.", "Widget added by": "위젯을 추가했습니다", "This widget may use cookies.": "이 위젯은 쿠키를 사용합니다.", - "Enable cross-signing to verify per-user instead of per-device (in development)": "기기 당 확인이 아닌 사용자 당 확인을 위한 교차 서명 켜기 (개발 중)", "Enable local event indexing and E2EE search (requires restart)": "로컬 이벤트 인덱싱 및 종단간 암호화 켜기 (다시 시작해야 합니다)", "Decline (%(counter)s)": "거절 (%(counter)s)", "Connecting to integration manager...": "통합 관리자로 연결 중...", diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json index 71b46d67f3..eeb1871a8a 100644 --- a/src/i18n/strings/lt.json +++ b/src/i18n/strings/lt.json @@ -69,7 +69,6 @@ "Noisy": "Triukšmingas", "Collecting app version information": "Renkama programėlės versijos informacija", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Ar ištrinti kambarį %(alias)s ir %(name)s kambario pavadinimą iš katalogo?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Tai leis Jums grįžti prie paskyros po atsijungimo ir prisijungti kituose įrenginiuose.", "Keywords": "Raktažodžiai", "Unpin Message": "Atsegti žinutę", "Enable notifications for this account": "Įjungti pranešimus šiai paskyrai", @@ -221,8 +220,6 @@ "This email address was not found": "Šis el. pašto adresas nebuvo rastas", "Admin": "Administratorius", "Start a chat": "Pradėti pokalbį", - "Start Chat": "Pradėti pokalbį", - "Send Invites": "Siųsti pakvietimus", "Failed to invite": "Nepavyko pakviesti", "Failed to invite the following users to the %(roomName)s room:": "Nepavyko pakviesti šių vartotojų į kambarį %(roomName)s:", "You need to be logged in.": "Turite būti prisijungę.", @@ -237,12 +234,8 @@ "Invites user with given id to current room": "Pakviečia naudotoją su nurodytu id į esamą kambarį", "You are now ignoring %(userId)s": "Dabar ignoruojate %(userId)s", "Opens the Developer Tools dialog": "Atveria programuotojo įrankių dialogą", - "Unknown (user, device) pair:": "Nežinoma pora (naudotojas, įrenginys):", - "Device already verified!": "Įrenginys jau patvirtintas!", - "WARNING: Device already verified, but keys do NOT MATCH!": "ĮSPĖJIMAS: Įrenginys jau patvirtintas, tačiau raktai NESUTAMPA!", "Verified key": "Patvirtintas raktas", "Displays action": "Rodo veiksmą", - "Unrecognised command:": "Neatpažinta komanda:", "Reason": "Priežastis", "%(targetName)s accepted an invitation.": "%(targetName)s priėmė pakvietimą.", "%(senderName)s invited %(targetName)s.": "%(senderName)s pakvietė %(targetName)s.", @@ -282,8 +275,6 @@ "Current password": "Dabartinis slaptažodis", "Password": "Slaptažodis", "New Password": "Naujas slaptažodis", - "Unable to load device list": "Nepavyko įkelti įrenginių sąrašo", - "Delete %(count)s devices|one": "Ištrinti įrenginį", "Device ID": "Įrenginio ID", "Failed to set display name": "Nepavyko nustatyti rodomą vardą", "Disable Notifications": "Išjungti pranešimus", @@ -298,30 +289,23 @@ "%(senderName)s uploaded a file": "%(senderName)s įkėlė failą", "Options": "Parametrai", "Key request sent.": "Rakto užklausa išsiųsta.", - "Unencrypted message": "Nešifruota žinutė", "device id: ": "įrenginio id: ", "Failed to mute user": "Nepavyko nutildyti naudotoją", "Are you sure?": "Ar tikrai?", - "Devices": "Įrenginiai", "Ignore": "Ignoruoti", "Invite": "Pakviesti", "User Options": "Naudotojo parametrai", "Admin Tools": "Administratoriaus įrankiai", - "bold": "pusjuodis", - "italic": "kursyvas", "Attachment": "Priedas", "Voice call": "Balso skambutis", "Video call": "Vaizdo skambutis", "Upload file": "Įkelti failą", - "Show Text Formatting Toolbar": "Rodyti teksto formatavimo įrankių juostą", "Send an encrypted reply…": "Siųsti šifruotą atsakymą…", "Send a reply (unencrypted)…": "Siųsti atsakymą (nešifruotą)…", "Send an encrypted message…": "Siųsti šifruotą žinutę…", "Send a message (unencrypted)…": "Siųsti žinutę (nešifruotą)…", - "Hide Text Formatting Toolbar": "Slėpti teksto formatavimo įrankių juostą", "Server error": "Serverio klaida", "Command error": "Komandos klaida", - "Unable to reply": "Nepavyko atsakyti", "Loading...": "Įkeliama...", "Pinned Messages": "Prisegtos žinutės", "Unknown": "Nežinoma", @@ -331,7 +315,6 @@ "Upload avatar": "Įkelti avatarą", "Settings": "Nustatymai", "Community Invites": "Bendruomenės pakvietimai", - "People": "Žmonės", "%(roomName)s does not exist.": "%(roomName)s neegzistuoja.", "%(roomName)s is not accessible at this time.": "%(roomName)s šiuo metu nėra pasiekiamas.", "Muted Users": "Nutildyti naudotojai", @@ -386,7 +369,6 @@ "Delete widget": "Ištrinti valdiklį", "Failed to remove widget": "Nepavyko pašalinti valdiklį", "Scroll to bottom of page": "Slinkti į puslapio apačią", - "Show devices, send anyway or cancel.": "Rodyti įrenginius, vis tiek siųsti ar atsisakyti.", "%(count)s of your messages have not been sent.|other": "Kai kurios iš jūsų žinučių nebuvo išsiųstos.", "%(count)s of your messages have not been sent.|one": "Jūsų žinutė nebuvo išsiųsta.", "Connectivity to the server has been lost.": "Jungiamumas su šiuo serveriu buvo prarastas.", @@ -415,8 +397,6 @@ "Success": "Pavyko", "Unable to remove contact information": "Nepavyko pašalinti kontaktinę informaciją", "": "", - "Device ID:": "Įrenginio ID:", - "Device key:": "Įrenginio raktas:", "Check for update": "Tikrinti, ar yra atnaujinimų", "Reject all %(invitedRooms)s invites": "Atmesti visus %(invitedRooms)s pakvietimus", "You may need to manually permit Riot to access your microphone/webcam": "Jums gali tekti rankiniu būdu leisti Riot prieigą prie savo mikrofono/kameros", @@ -431,7 +411,6 @@ "Profile": "Profilis", "Account": "Paskyra", "click to reveal": "spustelėkite, norėdami atskleisti", - "matrix-react-sdk version:": "matrix-react-sdk versija:", "riot-web version:": "riot-web versija:", "olm version:": "olm versija:", "Failed to send email": "Nepavyko išsiųsti el. laiško", @@ -458,7 +437,6 @@ "Session ID": "Seanso ID", "End-to-end encryption information": "Ištisinio šifravimo informacija", "Event information": "Įvykio informacija", - "Sender device information": "Siuntėjo įrenginio informacija", "Passphrases must match": "Slaptafrazės privalo sutapti", "Passphrase must not be empty": "Slaptafrazė negali būti tuščia", "Export room keys": "Eksportuoti kambario raktus", @@ -474,16 +452,12 @@ "You do not have permission to start a conference call in this room": "Jūs neturite leidimo šiame kambaryje pradėti konferencinį pokalbį", "Room name or alias": "Kambario pavadinimas ar slapyvardis", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Neatrodo, kad jūsų el. pašto adresas šiame serveryje būtų susietas su Matrix ID.", - "Who would you like to communicate with?": "Su kuo norėtumėte susisiekti?", "Missing room_id in request": "Užklausoje trūksta room_id", "Missing user_id in request": "Užklausoje trūksta user_id", "Unrecognised room alias:": "Neatpažintas kambario slapyvardis:", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ĮSPĖJIMAS: RAKTO PATVIRTINIMAS NEPAVYKO! Pasirašymo raktas, skirtas %(userId)s ir įrenginiui %(deviceId)s yra \"%(fprint)s\", o tai nesutampa su pateiktu raktu \"%(fingerprint)s\". Tai gali reikšti, kad jūsų komunikacijos yra perimamos!", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Jūsų pateiktas pasirašymo raktas sutampa su pasirašymo raktu, kurį gavote iš vartotojo %(userId)s įrenginio %(deviceId)s. Įrenginys pažymėtas kaip patvirtintas.", "VoIP conference started.": "VoIP konferencija pradėta.", "VoIP conference finished.": "VoIP konferencija užbaigta.", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s pašalino kambario pavadinimą.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s įjungė end-to-end šifravimą (%(algorithm)s algoritmas).", "%(widgetName)s widget modified by %(senderName)s": "%(senderName)s modifikavo %(widgetName)s valdiklį", "%(widgetName)s widget added by %(senderName)s": "%(senderName)s pridėjo %(widgetName)s valdiklį", "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s pašalino %(widgetName)s valdiklį", @@ -491,14 +465,7 @@ "Server may be unavailable, overloaded, or you hit a bug.": "Serveris gali būti neprieinamas, per daug apkrautas, arba susidūrėte su klaida.", "Use compact timeline layout": "Naudoti kompaktišką laiko juostos išdėstymą", "Autoplay GIFs and videos": "Automatiškai atkurti GIF ir vaizdo įrašus", - "Never send encrypted messages to unverified devices from this device": "Niekada nesiųsti iš šio įrenginio šifruotų žinučių į nepatvirtintus įrenginius", - "Never send encrypted messages to unverified devices in this room from this device": "Niekada nesiųsti iš šio įrenginio šifruotas žinutes į nepatvirtintus įrenginius šiame kambaryje", - "Delete %(count)s devices|other": "Ištrinti %(count)s įrenginius", "This event could not be displayed": "Nepavyko parodyti šio įvykio", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Jeigu jūsų kituose įrenginiuose nėra rakto šiai žinutei, tuomet jūs negalėsite jos iššifruoti.", - "Re-request encryption keys from your other devices.": "Iš naujo užklausti šifravimo raktus iš jūsų kitų įrenginių.", - "Undecryptable": "Neiššifruojama", - "Encrypted by an unverified device": "Šifruota nepatvirtintu įrenginiu", "Kick": "Išmesti", "Kick this user?": "Išmesti šį naudotoją?", "Failed to kick": "Nepavyko išmesti", @@ -518,7 +485,6 @@ "Seen by %(userName)s at %(dateTime)s": "%(userName)s matė ties %(dateTime)s", "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "%(displayName)s (%(userName)s) matė ties %(dateTime)s", "Show these rooms to non-members on the community page and room list?": "Rodyti šiuos kambarius ne nariams bendruomenės puslapyje ir kambarių sąraše?", - "Invite new room members": "Pakviesti naujus kambario dalyvius", "Kicks user with given id": "Išmeta vartotoją su nurodytu id", "Bans user with given id": "Užblokuoja vartotoją su nurodytu id", "%(senderName)s banned %(targetName)s.": "%(senderName)s užblokavo %(targetName)s.", @@ -536,14 +502,10 @@ "Incoming voice call from %(name)s": "Gaunamasis balso skambutis nuo %(name)s", "Incoming video call from %(name)s": "Gaunamasis vaizdo skambutis nuo %(name)s", "Incoming call from %(name)s": "Gaunamasis skambutis nuo %(name)s", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Šiuo metu slaptažodžio pakeitimas atstatys bet kokius ištisinio šifravimo raktus visuose įrenginiuose ir tokiu būdu pavers šifruotą pokalbių istoriją neperskaitoma, nebent, iš pradžių, savo kambario raktus eksportuosite, o po to, juos importuosite iš naujo. Ateityje tai bus patobulinta.", "Change Password": "Keisti slaptažodį", "Authentication": "Tapatybės nustatymas", "The maximum permitted number of widgets have already been added to this room.": "Į šį kambarį jau yra pridėtas didžiausias leidžiamas valdiklių skaičius.", - "Your key share request has been sent - please check your other devices for key share requests.": "Jūsų rakto bendrinimo užklausa išsiųsta - patikrinkite kitus savo įrenginius, ar juose nėra rakto bendrinimo užklausų.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Rakto bendrinimo užklausos yra išsiunčiamos į jūsų kitus įrenginius automatiškai. Jeigu savo kitame įrenginyje atmetėte ar nepaisėte rakto užklausos, spustelėkite čia, norėdami dar kartą užklausti raktų šiam seansui.", "Please select the destination room for this message": "Pasirinkite šiai žinutei paskirties kambarį", - "No devices with registered encryption keys": "Nėra jokių įrenginių su registruotais šifravimo raktais", "Make Moderator": "Padaryti moderatoriumi", "Hangup": "Padėti ragelį", "No pinned messages.": "Nėra jokių prisegtų žinučių.", @@ -554,7 +516,6 @@ "Offline": "Atsijungęs", "Forget room": "Pamiršti kambarį", "Share room": "Bendrinti kambarį", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Šiame kambaryje yra nežinomų įrenginių: jei tęsite jų nepatvirtinę, kam nors bus įmanoma slapta klausytis jūsų skambučio.", "Usage": "Naudojimas", "Searches DuckDuckGo for results": "Atlieka rezultatų paiešką sistemoje DuckDuckGo", "To use it, just wait for autocomplete results to load and tab through them.": "Norėdami tai naudoti, tiesiog palaukite, kol bus įkelti automatiškai užbaigti rezultatai, tuomet pereikite per juos naudodami Tab klavišą.", @@ -619,11 +580,8 @@ "Unknown error": "Nežinoma klaida", "Incorrect password": "Neteisingas slaptažodis", "To continue, please enter your password:": "Norėdami tęsti, įveskite savo slaptažodį:", - "Device name": "Įrenginio pavadinimas", - "Device key": "Įrenginio raktas", "An error has occurred.": "Įvyko klaida.", "Ignore request": "Nepaisyti užklausos", - "Loading device info...": "Įkeliama įrenginio informacija...", "Failed to upgrade room": "Nepavyko atnaujinti kambarį", "The room upgrade could not be completed": "Nepavyko užbaigti kambario naujinimo", "Sign out": "Atsijungti", @@ -650,8 +608,6 @@ "Mention": "Paminėti", "This room has been replaced and is no longer active.": "Šis kambarys buvo pakeistas ir daugiau nebėra aktyvus.", "You do not have permission to post to this room": "Jūs neturite leidimų rašyti šiame kambaryje", - "Markdown is disabled": "Markdown yra išjungta", - "Markdown is enabled": "Markdown yra įjungta", "System Alerts": "Sistemos įspėjimai", "Failed to unban": "Nepavyko atblokuoti", "not specified": "nenurodyta", @@ -691,12 +647,6 @@ "Ignores a user, hiding their messages from you": "Ignoruoja vartotoją, slepiant nuo jūsų jo žinutes", "Stops ignoring a user, showing their messages going forward": "Sustabdo vartotojo ignoravimą, rodant jums jo tolimesnes žinutes", "Revoke Moderator": "Panaikinti moderatorių", - "deleted": "perbrauktas", - "underlined": "pabrauktas", - "inline-code": "įterptas kodas", - "block-quote": "citatos blokas", - "bulleted-list": "suženklintasis sąrašas", - "numbered-list": "sąrašas su numeriais", "Invites": "Pakvietimai", "Historical": "Istoriniai", "Every page you use in the app": "Kiekvienas puslapis, kurį jūs naudojate programoje", @@ -771,9 +721,6 @@ "Username available": "Naudotojo vardas yra prieinamas", "To get started, please pick a username!": "Norėdami pradėti, pasirinkite naudotojo vardą!", "If you already have a Matrix account you can log in instead.": "Jeigu jau turite Matrix paskyrą, tuomet vietoj to, galite prisijungti.", - "Room contains unknown devices": "Kambaryje yra nežinomų įrenginių", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "Kambaryje \"%(RoomName)s\" yra jums anksčiau nematytų įrenginių.", - "Unknown devices": "Nežinomi įrenginiai", "Unable to restore backup": "Nepavyko atkurti atsarginės kopijos", "No backup found!": "Nerasta jokios atsarginės kopijos!", "Backup Restored": "Atsarginė kopija atkurta", @@ -793,7 +740,6 @@ "Your Communities": "Jūsų bendruomenės", "Create a new community": "Sukurti naują bendruomenę", "You have no visible notifications": "Jūs neturite matomų pranešimų", - "Message not sent due to unknown devices being present": "Žinutė neišsiųsta dėl to, kad yra nežinomų įrenginių", "Failed to perform homeserver discovery": "Nepavyko atlikti namų serverio aptikimo", "Error: Problem communicating with the given homeserver.": "Klaida: Problemos susisiekiant su nurodytu namų serveriu.", "This server does not support authentication with a phone number.": "Šis serveris nepalaiko tapatybės nustatymo telefono numeriu.", @@ -832,8 +778,6 @@ "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.": "Šiam veiksmui reikalinga prieiti numatytąjį tapatybės serverį , kad patvirtinti el. pašto adresą arba telefono numerį, bet serveris neturi jokių paslaugos teikimo sąlygų.", "Only continue if you trust the owner of the server.": "Tęskite tik tada, jei pasitikite serverio savininku.", "Trust": "Pasitikėti", - "Email, name or Matrix ID": "El. paštas, vardas arba Matrix ID", - "Failed to start chat": "Nepavyko pradėti pokalbio", "Failed to invite users to the room:": "Nepavyko pakviesti vartotojų į kambarį:", "You need to be able to invite users to do that.": "Norėdami tai atlikti jūs turite turėti galimybę pakviesti vartotojus.", "Power level must be positive integer.": "Galios lygis privalo būti teigiamas sveikasis skaičius.", @@ -844,12 +788,7 @@ "Sends a message as plain text, without interpreting it as markdown": "SIunčia žinutę, kaip paprastą tekstą, jo neinterpretuodamas kaip pažymėto", "Upgrades a room to a new version": "Atnaujina kambarį į naują versiją", "You do not have the required permissions to use this command.": "Jūs neturite reikalingų leidimų naudoti šią komandą.", - "Room upgrade confirmation": "Kambario atnaujinimo patvirtinimas", - "Upgrading a room can be destructive and isn't always necessary.": "Kambario atnaujinimas gali būti destruktyvus ir nėra visada reikalingas.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Kambario atnaujinimai paprastai rekomenduojami, kada kambario versija yra laikoma nestabili. Nestabilios kambario versijos gali turėti klaidų, trūkstamų funkcijų, arba saugumo spragų.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Kambario atnaujinimai paprastai paveikia tik serverio pusės kambario apdorojimą. Jei jūs turite problemų su jūsų Riot klientu, prašome užregistruoti problemą .", "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.": "Įspėjimas: Kambario atnaujinimas automatiškai nemigruos kambario dalyvių į naują kambario versiją. Mes paskelbsime nuorodą į naują kambarį senojoje kambario versijoje - kambario dalyviai turės ją paspausti, norėdami prisijungti prie naujo kambario.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Prašome patvirtinti, kad jūs norite tęsti šio kambario atnaujinimą iš į .", "Changes your display nickname in the current room only": "Pakeičia jūsų rodomą slapyvardį tik esamame kambaryje", "Changes the avatar of the current room": "Pakeičia esamo kambario avatarą", "Changes your avatar in this current room only": "Pakeičia jūsų avatarą tik esamame kambaryje", @@ -870,7 +809,6 @@ "Adds a custom widget by URL to the room": "Į kambarį prideda pasirinktinį valdiklį pagal URL", "Please supply a https:// or http:// widget URL": "Prašome pateikti https:// arba http:// valdiklio URL", "You cannot modify widgets in this room.": "Jūs negalite keisti valdiklių šiame kambaryje.", - "Verifies a user, device, and pubkey tuple": "Patikrina vartotoją, įrenginį ir pubkey seką", "Forces the current outbound group session in an encrypted room to be discarded": "Priverčia išmesti esamą užsibaigiančią grupės sesiją šifruotame kambaryje", "Sends the given message coloured as a rainbow": "Išsiunčia nurodytą žinutę nuspalvintą kaip vaivorykštė", "Sends the given emote coloured as a rainbow": "Išsiunčia nurodytą emociją nuspalvintą kaip vaivorykštė", diff --git a/src/i18n/strings/lv.json b/src/i18n/strings/lv.json index d44a26651d..03777f4870 100644 --- a/src/i18n/strings/lv.json +++ b/src/i18n/strings/lv.json @@ -48,7 +48,6 @@ "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s dzēsa istabas nosaukumu.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s nomainīja tēmas nosaukumu uz \"%(topic)s\".", "Changes your display nickname": "Nomaina Tavu publisko segvārdu (niku)", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Paroles maiņa dzēsīs pašreizējās šifrēšanas atslēgas visās savstarpēji saistītajās ierīcēs, padarot čata vēsturi neizlasāmu, ja vien vien istabas atslēgas nav tikušas iepriekš eksportētas un no jauna importētas atpakaļ. Nākotnē to plānojam uzlabot.", "Claimed Ed25519 fingerprint key": "Ed25519 pieprasītā nospieduma (fingerprint) atslēga", "Click here to fix": "Klikšķini šeit, lai salabotu", "Click to mute audio": "Klikšķini, lai audio skaņu izslēgtu", @@ -75,12 +74,8 @@ "Decryption error": "Atšifrēšanas kļūda", "Deops user with given id": "Atceļ operatora statusu lietotājam ar norādīto Id", "Default": "Noklusējuma", - "Device already verified!": "Ierīce ir jau verificēta!", "Device ID": "Ierīces Id", - "Device ID:": "Ierīces Id:", "device id: ": "ierīces id: ", - "Device key:": "Ierīces atslēga:", - "Devices": "Ierīces", "Direct chats": "Tiešie čati", "Disable Notifications": "Izslēgt paziņojumus", "Disinvite": "Atsaukt", @@ -92,7 +87,6 @@ "Email address": "Epasta adrese", "Emoji": "Emocīši (emoji)", "Enable Notifications": "Ieslēgt paziņojumus", - "Encrypted by an unverified device": "Šifrēts ar neverificētu ierīci", "%(senderName)s ended the call.": "%(senderName)s beidza zvanu.", "End-to-end encryption information": "\"End-to-End\" (ierīce-ierīce) šifrēšanas informācija", "Enter passphrase": "Ievadi paroles frāzi", @@ -134,7 +128,6 @@ "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s no %(fromPowerLevel)s uz %(toPowerLevel)s", "Guests cannot join this room even if explicitly invited.": "Viesi nevar pievienoties šai istabai, pat ja ir uzaicināti.", "Hangup": "Beigt zvanu", - "Hide Text Formatting Toolbar": "Slēpt teksta formatēšanas rīkjoslu", "Historical": "Bijušie", "Home": "Mājup", "Homeserver is": "Bāzes serveris ir", @@ -147,15 +140,12 @@ "Incoming voice call from %(name)s": "Ienākošs AUDIO zvans no %(name)s", "Incorrect username and/or password.": "Nepareizs lietotājvārds un/vai parole.", "Incorrect verification code": "Nepareizs verifikācijas kods", - "Invalid alias format": "Nepareizs aliases (aizstājējvārda) formāts", "Invalid Email Address": "Nepareiza epasta adrese", "Invalid file%(extra)s": "Nederīgs fails %(extra)s", "%(senderName)s invited %(targetName)s.": "%(senderName)s uzaicināja %(targetName)s.", - "Invite new room members": "Uzaicināt jaunus istabas biedrus", "Invited": "Uzaicināts/a", "Invites": "Uzaicinājumi", "Invites user with given id to current room": "Uzaicina lietotāju ar norādīto id uz pašreizējo istabu", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' nav pareizā aliases (aizstājējvārda) formātā", "Sign in with": "Pierakstīties ar", "Join as voice or video.": "Pievienoties kā AUDIO vai VIDEO.", "Join Room": "Pievienoties istabai", @@ -178,17 +168,11 @@ "%(senderName)s made future room history visible to anyone.": "%(senderName)s padarīja istabas ziņu turpmāko vēsturi redzamu ikvienam.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s padarīja istabas ziņu turpmāko vēsturi redzamu nepazīstamajiem (%(visibility)s).", "Manage Integrations": "Pārvaldīt integrācijas", - "Markdown is disabled": "\"Markdown\" formatēšana izslēgta", - "Markdown is enabled": "\"Markdown\" formatēšana ieslēgta", - "matrix-react-sdk version:": "Matrix-react-sdk versija:", - "Message not sent due to unknown devices being present": "Ziņa nav nosūtīta, jo tika konstatēta nezināmu ierīču klātbūtne", "Missing room_id in request": "Iztrūkstošs room_id pieprasījumā", "Missing user_id in request": "Iztrūkstošs user_id pieprasījumā", "Moderator": "Moderators", "Mute": "Noklusināt (izslēgt skaņu)", "Name": "Vārds", - "Never send encrypted messages to unverified devices from this device": "Nekad nesūtīt no šīs ierīces šifrētas ziņas uz neverificētām ierīcēm", - "Never send encrypted messages to unverified devices in this room from this device": "Nekad nesūtīt no šīs ierīces šifrētas ziņas neverificētām ierīcēm šajā istabā", "New address (e.g. #foo:%(localDomain)s)": "Jaunā adrese (piemēram #kautkas:%(localDomain)s)", "New passwords don't match": "Jaunās paroles nesakrīt", "New passwords must match each other.": "Jaunajām parolēm ir jāsakrīt vienai ar otru.", @@ -198,7 +182,6 @@ "(not supported by this browser)": "(netiek atbalstīts šajā pārlūkā)", "": "", "NOT verified": "NAV verificēts", - "No devices with registered encryption keys": "Nav ierīču ar reģistrētām šifrēšanas atslēgām", "No display name": "Nav publiski redzamā vārda", "No more results": "Nav tālāko rezultātu", "No results": "Nav rezultātu", @@ -209,7 +192,6 @@ "Operation failed": "Darbība neizdevās", "Password": "Parole", "Passwords can't be empty": "Paroles nevar būt tukšas", - "People": "Cilvēki", "Permissions": "Atļaujas", "Phone": "Telefons", "Please check your email and click on the link it contains. Once this is done, click continue.": "Lūdzu pārbaudi savu epastu un noklikšķini tajā esošo saiti. Tiklīdz tas ir izdarīts, klikšķini \"turpināt\".", @@ -234,7 +216,6 @@ "riot-web version:": "Riot-web versija:", "Unable to enable Notifications": "Nav iespējams iespējot paziņojumus", "You have no visible notifications": "Tev nav redzamo paziņojumu", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Tava parole tika veiksmīgi nomainīta. Tu vairs nesaņemsi pašpiegādes (push) paziņojumus citās ierīcēs kamēr tajās nebūs veikta atkārtota pierakstīšanās", "This will allow you to reset your password and receive notifications.": "Tas atļaus Tev atiestatīt paroli un saņemt paziņojumus.", "Room %(roomId)s not visible": "Istaba %(roomId)s nav redzama", "%(roomName)s does not exist.": "%(roomName)s neeksistē.", @@ -244,8 +225,6 @@ "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s nosūtīja uzaicinājumu %(targetDisplayName)s pievienoties istabai.", "%(senderName)s set a profile picture.": "%(senderName)s uzstādīja profila attēlu.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s nomainīja attēlojamo/redzamo vārdu uz: %(displayName)s.", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Tevis uzdotā pierakstīšanās atslēga sakrīt ar atslēgu, kuru Tu saņēmi no %(userId)s ierīces %(deviceId)s. Ierīce tika atzīmēta kā verificēta.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ieslēdza \"end-to-end\" (ierīce-ierīce) šifrēšanu (algorithm %(algorithm)s).", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s atcēla pieejas ierobežojumu (atbanoja) %(targetName)s.", "Unknown room %(roomId)s": "Nezināma istaba %(roomId)s", "Uploading %(filename)s and %(count)s others|zero": "Tiek augšuplādēts %(filename)s", @@ -254,7 +233,6 @@ "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (power %(powerLevelNumber)s)", "Username invalid: %(errMessage)s": "Neatbilstošs lietotājvārds: %(errMessage)s", "(unknown failure: %(reason)s)": "(nezināma kļūda: %(reason)s)", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "BRĪDINĀJUMS: NEIZDEVĀS VERIFICĒT ATSLĒGU! Pierakstīšanās atslēga priekš %(userId)s un ierīces %(deviceId)s ir \"%(fprint)s\", kura nesakrīt ar ievadīto atslēgu \"%(fingerprint)s\". Tas var nozīmēt, ka Tava saziņa var tikt pārtverta!", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s atsauca %(targetName)s uzaicinājumu.", "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(time)s", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s", @@ -264,15 +242,11 @@ "(~%(count)s results)|other": "(~%(count)s rezultāti)", "Reject all %(invitedRooms)s invites": "Noraidīt visus %(invitedRooms)s uzaicinājumus", "Failed to invite the following users to the %(roomName)s room:": "Neizdevās uzaicināt sekojošos lietotājus uz %(roomName)s istabu:", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" atrodas ierīces, kuras Tu neesi iepriekš redzējis/usi.", "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?": "Notiek Tevis novirzīšana uz ārēju trešās puses vietni. Tu vari atļaut savam kontam piekļuvi ar %(integrationsUrl)s. Vai vēlies turpināt?", "Ongoing conference call%(supportedText)s.": "Notiekošs konferences zvans %(supportedText)s.", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s dzēsa istabas avataru.", "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s nomainīja istabas avataru %(roomName)s", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Tu pievienoji jaunu ierīci '%(displayName)s', kas prasa šifrēšanas atslēgas.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Tava neverificētā ierīce '%(displayName)s' pieprasa šifrēšanas atslēgas.", "Room Colour": "Istabas krāsa", - "Room contains unknown devices": "Istabā konstatētas nepārbaudītas ierīces", "Rooms": "Istabas", "Save": "Saglabāt", "Scroll to bottom of page": "Aizritināt uz lapas apakšu", @@ -280,8 +254,6 @@ "Search failed": "Meklēšana neizdevās", "Searches DuckDuckGo for results": "Meklēšanai izmanto DuckDuckGo", "Send anyway": "Nosūtīt jebkurā gadījumā", - "Sender device information": "Nosūtītāja ierīces informācija", - "Send Invites": "Nosūtīt uzaicinājumus", "Send Reset Email": "Nosūtīt atiestatīšanas epastu", "Server error": "Servera kļūda", "Server may be unavailable, overloaded, or search timed out :(": "Serveris izskatās nesasniedzams, ir pārslogots, vai arī meklēšana beigusies ar savienojuma noildzi :(", @@ -289,7 +261,6 @@ "Server unavailable, overloaded, or something else went wrong.": "Serveris ir nesasniedzams, pārslogots, vai arī esi uzdūries kļūdai.", "Session ID": "Sesijas Id", "Settings": "Iestatījumi", - "Show Text Formatting Toolbar": "Rādīt teksta formatēšanas rīkjoslu", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Rādīt laiku 12 stundu formātā (piemēram 2:30pm)", "Signed Out": "Izrakstījās", "Sign in": "Pierakstīties", @@ -298,7 +269,6 @@ "Someone": "Kāds", "Start a chat": "Sākt čatu", "Start authentication": "Sākt autentifikāciju", - "Start Chat": "Sākt čatu", "Submit": "Iesniegt", "Success": "Izdevās", "The phone number entered looks invalid": "Ievadītais telefona numurs izskatās nepareizs", @@ -320,14 +290,10 @@ "Unable to verify email address.": "Nav iespējams apstiprināt epasta adresi.", "Unban": "Atbanot/atcelt pieejas liegumu", "Unable to capture screen": "Neizdevās uzņemt ekrānattēlu", - "Unable to load device list": "Nav iespējams ielādēt ierīču sarakstu", - "Undecryptable": "Neatšifrējams", "unencrypted": "nešifrēts", - "Unencrypted message": "Nešifrēta ziņa", "unknown caller": "nezināms zvanītājs", "unknown device": "nezināma ierīce", "unknown error code": "nezināms kļūdas kods", - "Unknown (user, device) pair:": "Nezināms (lietotājs, ierīce) pāris:", "Unmute": "Ieslēgt skaņu", "Unnamed Room": "Istaba bez nosaukuma", "Cancel": "Atcelt", @@ -335,7 +301,6 @@ "Custom Server Options": "Iestatāmās servera opcijas", "Dismiss": "Atteikt", "You have enabled URL previews by default.": "URL priekšskats pēc noklusējuma Tev iriespējots .", - "Unrecognised command:": "Neatpazīta komanda:", "Unrecognised room alias:": "Neatpazīta istabas aliase:", "Upload avatar": "Augšuplādēt avataru (profila attēlu)", "Upload Failed": "Augšupielāde (nosūtīšana) neizdevās", @@ -349,9 +314,6 @@ "Verification": "Verifikācija", "verified": "verificēts", "Verified key": "Verificēta atslēga", - "WARNING: Device already verified, but keys do NOT MATCH!": "BRĪDINĀJUMS: Ierīce ir jau verificēta, bet NESAKRĪT atslēgas!", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Tu šobrīd esi iekļāvis/usi neverificētas ierīces melnajā sarakstā. Lai nosūtītu ziņas uz šādām ierīcēm, Tev tās ir jāverificē.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Mēs rekomendējam Tev pārskatīt verifikācijas procesu katrai ierīcei, lai apstiprinātu tās piederību īstajam īpašniekam, bet Tu vari nosūtīt ziņu vēlreiz bez verificēšanas, ja vēlies.", "Start verification": "Sākt verifikāciju", "Video call": "VIDEO zvans", "Voice call": "AUDIO zvans", @@ -363,7 +325,6 @@ "Warning!": "Brīdinājums!", "Who can access this room?": "Kurš var piekļūt istabai?", "Who can read history?": "Kas var lasīt vēsturi?", - "Who would you like to communicate with?": "Ar kuru vēlies komunicēt?", "You are already in a call.": "Tu jau šobrīd esi sarunā.", "You cannot place a call with yourself.": "Nav iespējams piezvanīt sev.", "You cannot place VoIP calls in this browser.": "VoIP zvani šajā pārlūkā netiek atbalstīti.", @@ -404,8 +365,6 @@ "Connectivity to the server has been lost.": "Savienojums ar serveri pārtrūka.", "Sent messages will be stored until your connection has returned.": "Nosūtītās ziņas tiks saglabātas tiklīdz savienojums tiks atjaunots.", "Active call": "Aktīvs zvans", - "bold": "treknraksts", - "italic": "kursīvs", "Please select the destination room for this message": "Lūdzu izvēlies šīs ziņas mērķa istabu", "Room directory": "Istabu katalogs", "Start chat": "Uzsākt čalošanu", @@ -431,15 +390,9 @@ "Unknown error": "Nezināma kļūda", "Incorrect password": "Nepareiza parole", "To continue, please enter your password.": "Lai turpinātu, ievadi savu paroli.", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Lai verificētu šīs ierīces uzticamību, lūdzu sazinies ar tās īpašnieku, izmantojot citu saziņas veidu (piemēram, sazinoties personiski vai telefoniski) un pajautā, vai atslēga, kuru īpašnieks redz savos lietotāja iestatījumos, sakrīt ar šo atslēgu:", - "Device name": "Ierīces nosaukums", - "Device key": "Ierīces atslēga", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Ja tā sakrīt, tad nospied zemāk esošo verifikācijas pogu . Ja nesakrīt, tad kāds cits ir piekļuvis šai ierīcei un šādā gadījumā Tu, iespējams, vēlies izmantot \"melnais saraksts\" iespēju.", - "Verify device": "Verificēt ierīci", "I verify that the keys match": "Es apstiprinu, ka atslēgas sakrīt", "Unable to restore session": "Nav iespējams atjaunot sesiju", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Ja Tu iepriekš izmantoji jaunāku Riot versiju, tava sesija var nebūt saderīga ar šo versiju. Aizver šo logu un atgriezies jaunākajā versijā.", - "Unknown devices": "Nezināmas ierīces", "Unknown Address": "Nezināma adrese", "Unblacklist": "Atbloķēšanas saraksts", "Blacklist": "Melnais saraksts", @@ -494,8 +447,6 @@ "Unable to create widget.": "Nav iespējams izveidot widžetu.", "You are not in this room.": "Tu neatrodies šajā istabā.", "You do not have permission to do that in this room.": "Tev nav atļaujas šai darbībai šajā istabā.", - "Verifies a user, device, and pubkey tuple": "Verificē lietotāju, ierīci, un publiskās atslēgas", - "Loading device info...": "Ielādē ierīces informāciju...", "Example": "Piemērs", "Create": "Izveidot", "Featured Rooms:": "Ieteiktās istabas:", @@ -522,7 +473,6 @@ "The information being sent to us to help make Riot.im better includes:": "Informācija, kura mums tiek nosūtīta, lai ļautu padarīt Riot.im labāku, ietver:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Ja šī lapa ietver identificējamu informāciju, tādu kā istaba, lietotājs, grupas Id, šie dati tiek noņemti pirms nosūtīšanas uz serveri.", "Call Failed": "Zvans neizdevās", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Šajā istabā ir nepazīstamas ierīces: ja Tu turpināsi bez to pārbaudes, ir iespējams, ka kāda nepiederoša persona var noklausīties Tavas sarunas.", "Review Devices": "Ierīču pārskats", "Call Anyway": "Vienalga zvanīt", "Answer Anyway": "Vienalga atbildēt", @@ -555,8 +505,6 @@ "Enable inline URL previews by default": "URL priekšskats pēc noklusējuma", "Enable URL previews for this room (only affects you)": "URL priekšskati šai istabai (ietekmē tikai Tevi pašu)", "Enable URL previews by default for participants in this room": "URL priekšskati pēc noklusējuma visiem šīs istabas dalībniekiem", - "Delete %(count)s devices|other": "Dzēst %(count)s ierīces", - "Delete %(count)s devices|one": "Dzēst ierīci", "%(senderName)s sent an image": "%(senderName)s nosūtīja bildi", "%(senderName)s sent a video": "%(senderName)s nosūtīja video", "%(senderName)s uploaded a file": "%(senderName)s augšupielādēja failu", @@ -707,7 +655,6 @@ "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Radi kopienu, lai apvienotu lietotājus un istabas. Izveido mājaslapu, lai iezīmētu Matrix visumā savu klātbūtni, vietu un telpu.", "Error whilst fetching joined communities": "Ielādējot kopienas radās kļūda", "%(count)s of your messages have not been sent.|one": "Tava ziņa netika nosūtīta.", - "Show devices, send anyway or cancel.": "Parādīt ierīces, vienalga nosūtīt vai sūtīšanu atcelt.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Atkārtoti sūtīt ziņu vai atcelt sūtīšanu.", "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Šeit neviena nav. Ja vēlies kādu uzaicināt vai atslēgt paziņojumu par tukšu istabu?", "Light theme": "Gaiša ādiņa", @@ -721,11 +668,7 @@ "Stops ignoring a user, showing their messages going forward": "Atceļ lietotāja ignorēšanu, rādot viņa turpmāk sūtītās ziņas", "Notify the whole room": "Paziņot visai istabai", "Room Notification": "Istabas paziņojums", - "Your key share request has been sent - please check your other devices for key share requests.": "Tavs atslēgu apmaiņas pieprasījums nosūtīts - lūdzu pārbaudi citas savas ierīces attiecībā uz atslēgu apmaiņu.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Atslēgu apmaiņas pieprasījumi Tavām citām ierīcēm tiek nosūtīti automātiski. Ja citās savās ierīcēs atslēdzi vai noraidīji atslēgu apmaiņas pieprasījumu, spiediet šeit lai pieprasītu atslēgas šai sesijai atkārtoti.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Ja citās Tavās ierīcēs nav atslēgas priekš šīs ziņas, Tu nevarēsi to atšifrēt.", "Key request sent.": "Atslēgas pieprasījums nosūtīts.", - "Re-request encryption keys from your other devices.": "Atkārtoti pieprasīt šifrēšanas atslēgas no citām savām ierīcēm.", "Code": "Kods", "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)snoraidīja viņu uzaicinājumu %(count)s reizes", "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)snoraidīja uzaicinājumu", @@ -812,7 +755,6 @@ "Files": "Faili", "Collecting app version information": "Tiek iegūta programmas versijas informācija", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Dzēst istabas aliasi/aizstājējvārdu %(alias)s un dzēst %(name)s no kataloga?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Tas atļaus Tev atgriezties savā kontā pēc izrakstīšanās, un pierakstīties no citām ierīcēm.", "Keywords": "Atslēgvārdi", "Enable notifications for this account": "Iespējot paziņojumus šim kontam", "Invite to this community": "Uzaicināt šajā kopienā", diff --git a/src/i18n/strings/ml.json b/src/i18n/strings/ml.json index cc4a1a64c2..f181e0d65a 100644 --- a/src/i18n/strings/ml.json +++ b/src/i18n/strings/ml.json @@ -68,7 +68,6 @@ "Files": "ഫയലുകള്‍", "Collecting app version information": "ആപ്പ് പതിപ്പു വിവരങ്ങള്‍ ശേഖരിക്കുന്നു", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "റൂം ഏലിയാസ് %(alias)s നീക്കം ചെയ്യുകയും %(name)s കള്‍ ഡയറക്ടറിയില്‍ നിന്നും നീക്കം ചെയ്യുകയും ചെയ്യുക ?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "സൈന്‍ ഔട്ട് ചെയ്ത ശേഷം വീണ്ടും നിങ്ങളുടെ അക്കൌണ്ടിലേക്ക് മടങ്ങി വരാനും, മറ്റ് ഡിവൈസുകളില്‍ സൈന്‍ ഇന്‍ ചെയ്യാനും ഇത് സഹായിക്കും.", "Keywords": "കീവേഡുകള്‍", "Enable notifications for this account": "ഈ അക്കൌണ്ടില്‍ നോട്ടിഫിക്കേഷനുകള്‍ ഇനേബിള്‍ ചെയ്യുക", "Messages containing keywords": "കീവേഡുകള്‍അടങ്ങിയ സന്ദേശങ്ങള്‍ക്ക്", diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json index 733d3ebb04..66e453e697 100644 --- a/src/i18n/strings/nb_NO.json +++ b/src/i18n/strings/nb_NO.json @@ -112,7 +112,6 @@ "The information being sent to us to help make Riot.im better includes:": "Informasjonen som blir sendt til oss for å hjelpe oss med å lage Riot.im bedre inkluderer:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Hvor denne siden inkluderer identifiserende informasjon, sånn som navnet på rommet, brukeren, og gruppe ID, men denne informasjonen blir fjernet før den blir sendt til tjeneren.", "Call Failed": "Oppringning mislyktes", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Det er ukjente enheter i dette rommet: Hvis du fortsetter uten å verifisere dem vil det være mulig for noen å tyvlytte på samtalen din.", "Review Devices": "Se over enheter", "Call Anyway": "Ring likevel", "Answer Anyway": "Svar likevel", @@ -191,10 +190,6 @@ "Moderator": "Moderator", "Admin": "Admin", "Start a chat": "Start en samtale", - "Who would you like to communicate with?": "Hvem vil du prate med?", - "Start Chat": "Start Samtale", - "Invite new room members": "Inviter nye rom-medlemmer", - "Send Invites": "Send invitasjoner", "Operation failed": "Operasjon mislyktes", "Failed to invite": "Klarte ikke invitere", "Failed to invite users to the room:": "Klarte ikke invitere brukere til rommet:", @@ -218,10 +213,6 @@ "Upgrades a room to a new version": "Oppgraderer et rom til en ny versjon", "Changes your display nickname": "Endrer visningsnavnet ditt", "Chat with Riot Bot": "Chat med Riot Bot", - "Email, name or Matrix ID": "Epost, navn eller Matrix ID", - "Room upgrade confirmation": "Rom oppgradering bekreftelse", - "Upgrading a room can be destructive and isn't always necessary.": "Oppgraderingen av et rom kan være destruktivt, og er ikke alltid nødvendig.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Vennligst bekreft at du vil fortsette med oppgraderingen av dette rommet fra til .", "Changes your display nickname in the current room only": "Endrer visningsnavnet ditt kun i det nåværende rommet", "Changes your avatar in this current room only": "Endrer avataren din kun i det nåværende rommet", "Call failed due to misconfigured server": "Oppringingen feilet på grunn av feil-konfigurert tjener", @@ -236,15 +227,12 @@ "The file '%(fileName)s' failed to upload.": "Filen '%(fileName)s' kunne ikke lastes opp.", "The server does not support the room version specified.": "Tjeneren støtter ikke rom versjonen som ble spesifisert.", "Name or Matrix ID": "Navn eller Matrix ID", - "Failed to start chat": "Feilet å starte samtale", "Messages": "Meldinger", "Actions": "Handlinger", "Advanced": "Avansert", "Other": "Andre", "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Forbereder ¯\\_(ツ)_/¯ til en ren-tekst melding", "You do not have the required permissions to use this command.": "Du har ikke de rette tilgangene til å bruke denne kommandoen.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Oppgradering av rom anbefales vanligvis når en rom versjon anses som ustabil. Ustabile rom versjoner kan ha feil, manglende funksjoner eller sikkerhetsproblemer.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Oppgraderinger av rommet påvirker vanligvis bare tjenerside behandlingen av rommet. Hvis du har problemer med Riot-klienten din, kan du sende inn et problem med .", "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.": "Advarsel: Oppgradering av et rom vil ikke automatisk migrere rom medlemmer til den nye versjonen av rommet. Vi legger ut en lenke til det nye rommet i den gamle versjonen av rommet - rom medlemmer må klikke på denne lenken for å bli med i det nye rommet.", "Changes your avatar in all rooms": "Endrer avataren din i alle rom", "Gets or sets the room topic": "Henter eller setter rommets overskrift", @@ -269,18 +257,12 @@ "Adds a custom widget by URL to the room": "Legger til en tilpasset widget med URL i rommet", "Please supply a https:// or http:// widget URL": "Oppgi en https: // eller http: // widget-URL", "You cannot modify widgets in this room.": "Du kan ikke endre widgets i dette rommet.", - "Unknown (user, device) pair:": "Ukjent (bruker,enhet) par:", - "Device already verified!": "Enhet allerede verifisert!", - "WARNING: Device already verified, but keys do NOT MATCH!": "ADVARSEL: Enheten er allerede verifisert, men nøkler er IKKE LIKE!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ADVARSEL: Nøkkelverifisering mislyktes! Signeringsnøkkelen for %(userId)s og enhet %(deviceId)s er \"%(fprint)s\" som ikke samsvarer med den oppgitte nøkkelen \"%(fingerprint)s\". Dette kan bety at kommunikasjonene dine blir fanget opp!", "Verified key": "Verifisert nøkkel", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Signeringsnøkkelen du oppgav stemmer med signeringsnøkkelen du mottok fra %(userId)s enhet %(deviceId)s. Enheten er merket som bekreftet.", "Displays action": "Viser handling", "Forces the current outbound group session in an encrypted room to be discarded": "Tvinger den gjeldende utgående gruppeøkten i et kryptert rom til å stoppe", "Sends the given message coloured as a rainbow": "Sender gitte melding i regnbuens farger", "Sends the given emote coloured as a rainbow": "Sender gitte emote i regnbuens farger", "Displays list of commands with usages and descriptions": "Viser liste over kommandoer med bruks eksempler og beskrivelser", - "Unrecognised command:": "Ukjent kommando:", "Reason": "Årsak", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s aksepterte invitasjonen til %(displayName)s.", "%(targetName)s accepted an invitation.": "%(targetName)s aksepterte en invitasjon." diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 3dcd215ab4..5fcaf0d71a 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -33,7 +33,6 @@ "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s heeft de gespreksnaam gewijzigd naar %(roomName)s.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s heeft het onderwerp gewijzigd naar ‘%(topic)s’.", "Changes your display nickname": "Verandert uw weergavenaam", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Momenteel stellen wachtwoordveranderingen nog alle sleutels voor eind-tot-eind-versleuteling op alle apparaten opnieuw in, waardoor de versleutelde gespreksgeschiedenis onleesbaar wordt, tenzij u eerst uw gesprekssleutels exporteert en na afloop opnieuw importeert. Dit zal in de toekomst verbeterd worden.", "Click here to fix": "Klik hier om dit op te lossen", "Click to mute audio": "Klik om het geluid uit te zetten", "Click to mute video": "Klik om het geluid van de video uit te zetten", @@ -87,7 +86,6 @@ "(not supported by this browser)": "(niet ondersteund door deze browser)", "": "", "NOT verified": "NIET geverifieerd", - "No devices with registered encryption keys": "Geen apparaten met geregistreerde versleutelingssleutels", "No display name": "Geen weergavenaam", "No more results": "Geen resultaten meer", "No results": "Geen resultaten", @@ -95,7 +93,6 @@ "olm version:": "olm-versie:", "Password": "Wachtwoord", "Passwords can't be empty": "Wachtwoorden kunnen niet leeg zijn", - "People": "Personen", "Permissions": "Toestemmingen", "Phone": "Telefoonnummer", "Private Chat": "Privégesprek", @@ -108,10 +105,8 @@ "%(targetName)s rejected the invitation.": "%(targetName)s heeft de uitnodiging geweigerd.", "Reject invitation": "Uitnodiging weigeren", "Remote addresses for this room:": "Externe adressen voor dit gesprek:", - "Send Invites": "Uitnodigingen versturen", "Start a chat": "Gesprek beginnen", "Start authentication": "Authenticatie starten", - "Start Chat": "Gesprek beginnen", "Submit": "Bevestigen", "Success": "Klaar", "Sun": "Zo", @@ -149,12 +144,8 @@ "Decline": "Weigeren", "Decrypt %(text)s": "%(text)s ontcijferen", "Decryption error": "Ontsleutelingsfout", - "Device already verified!": "Apparaat reeds geverifieerd!", "Device ID": "Apparaats-ID", - "Device ID:": "Apparaats-ID:", "device id: ": "apparaats-ID: ", - "Device key:": "Apparaatssleutel:", - "Devices": "Apparaten", "Direct chats": "Tweegesprekken", "Disable Notifications": "Meldingen uitschakelen", "Disinvite": "Uitnodiging intrekken", @@ -171,7 +162,6 @@ "Displays action": "Toont actie", "Emoji": "Emoticons", "Enable Notifications": "Meldingen inschakelen", - "Encrypted by an unverified device": "Versleuteld door een ongeverifieerd apparaat", "%(senderName)s ended the call.": "%(senderName)s heeft opgehangen.", "End-to-end encryption information": "Info over eind-tot-eind-versleuteling", "Enter passphrase": "Voer wachtwoord in", @@ -206,7 +196,6 @@ "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s van %(fromPowerLevel)s naar %(toPowerLevel)s", "Guests cannot join this room even if explicitly invited.": "Gasten - zelfs speficiek uitgenodigde - kunnen niet aan dit gesprek deelnemen.", "Hangup": "Ophangen", - "Hide Text Formatting Toolbar": "Tekstopmaakwerkbalk verbergen", "Historical": "Historisch", "Home": "Thuis", "Homeserver is": "Thuisserver is", @@ -219,15 +208,12 @@ "Incoming voice call from %(name)s": "Inkomende spraakoproep van %(name)s", "Incorrect username and/or password.": "Onjuiste gebruikersnaam en/of wachtwoord.", "Incorrect verification code": "Onjuiste verificatiecode", - "Invalid alias format": "Ongeldig bijnaamformaat", "Invalid Email Address": "Ongeldig e-mailadres", "Invalid file%(extra)s": "Ongeldig bestand %(extra)s", "%(senderName)s invited %(targetName)s.": "%(senderName)s heeft %(targetName)s uitgenodigd.", - "Invite new room members": "Nieuwe gespreksleden uitnodigen", "Invited": "Uitgenodigd", "Invites": "Uitnodigingen", "Invites user with given id to current room": "Nodigt de gebruiker met de gegeven ID uit in het huidige gesprek", - "'%(alias)s' is not a valid format for an alias": "‘%(alias)s’ is geen geldig formaat voor een bijnaam", "Sign in with": "Aanmelden met", "Join as voice or video.": "Deelnemen met spraak of video.", "Join Room": "Gesprek toetreden", @@ -247,14 +233,8 @@ "%(senderName)s made future room history visible to anyone.": "%(senderName)s heeft de toekomstige gespreksgeschiedenis zichtbaar gemaakt voor iedereen.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s heeft de toekomstige gespreksgeschiedenis zichtbaar gemaakt voor onbekend (%(visibility)s).", "Manage Integrations": "Integraties beheren", - "Markdown is disabled": "Markdown is uitgeschakeld", - "Markdown is enabled": "Markdown is ingeschakeld", - "matrix-react-sdk version:": "matrix-react-sdk-versie:", - "Message not sent due to unknown devices being present": "Bericht niet verstuurd doordat er onbekende apparaten aanwezig zijn", "Missing room_id in request": "room_id ontbreekt in verzoek", "Missing user_id in request": "user_id ontbreekt in verzoek", - "Never send encrypted messages to unverified devices from this device": "Versleutelde berichten vanaf dit apparaat nooit naar ongeverifieerde apparaten versturen", - "Never send encrypted messages to unverified devices in this room from this device": "Nooit vanaf dit apparaat versleutelde berichten naar ongeverifieerde apparaten in dit gesprek versturen", "New address (e.g. #foo:%(localDomain)s)": "Nieuw adres (bv. #foo:%(localDomain)s)", "New passwords don't match": "Nieuwe wachtwoorden komen niet overeen", "New passwords must match each other.": "Nieuwe wachtwoorden moeten overeenkomen.", @@ -272,7 +252,6 @@ "riot-web version:": "riot-web-versie:", "Room %(roomId)s not visible": "Gesprek %(roomId)s is niet zichtbaar", "Room Colour": "Gesprekskleur", - "Room contains unknown devices": "Aan het gesprek nemen onbekende apparaten deel", "%(roomName)s does not exist.": "%(roomName)s bestaat niet.", "%(roomName)s is not accessible at this time.": "%(roomName)s is op dit moment niet toegankelijk.", "Rooms": "Gesprekken", @@ -282,7 +261,6 @@ "Searches DuckDuckGo for results": "Zoekt op DuckDuckGo voor resultaten", "Seen by %(userName)s at %(dateTime)s": "Gezien door %(userName)s om %(dateTime)s", "Send anyway": "Alsnog versturen", - "Sender device information": "Info over apparaat van afzender", "Send Reset Email": "E-mail voor opnieuw instellen versturen", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s heeft een afbeelding gestuurd.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s heeft %(targetDisplayName)s in het gesprek uitgenodigd.", @@ -296,7 +274,6 @@ "Kicks user with given id": "Stuurt de gebruiker met de gegeven ID uit het gesprek", "%(senderName)s set a profile picture.": "%(senderName)s heeft een profielfoto ingesteld.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s heeft %(displayName)s als weergavenaam aangenomen.", - "Show Text Formatting Toolbar": "Tekstopmaakwerkbalk weergeven", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Tijd in 12-uursformaat weergeven (bv. 2:30pm)", "Signed Out": "Afgemeld", "Sign in": "Aanmelden", @@ -304,7 +281,6 @@ "%(count)s of your messages have not been sent.|other": "Enkele van uw berichten zijn niet verstuurd.", "Someone": "Iemand", "The phone number entered looks invalid": "Het ingevoerde telefoonnummer ziet er ongeldig uit", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "De versleutelingssleutel die u heeft verstrekt komt overeen met de versleutelingssleutel die u heeft ontvangen van het apparaat %(deviceId)s van %(userId)s. Het apparaat is gemarkeerd als geverifieerd.", "This email address is already in use": "Dit e-mailadres is al in gebruik", "This email address was not found": "Dit e-mailadres is niet gevonden", "The email address linked to your account must be entered.": "Het e-mailadres dat met uw account verbonden is moet ingevoerd worden.", @@ -318,7 +294,6 @@ "To use it, just wait for autocomplete results to load and tab through them.": "Om het te gebruiken, wacht u tot de automatisch aangevulde resultaten geladen zijn en tabt u erdoorheen.", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "U heeft gepoogd een gegeven punt in de tijdslijn van dit gesprek te laden, maar u bent niet bevoegd het desbetreffende bericht te zien.", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Geprobeerd een gegeven punt in de tijdslijn van dit gesprek te laden, maar kon dit niet vinden.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s heeft eind-tot-eind-versleuteling aangezet (%(algorithm)s-algoritme).", "Unable to add email address": "Kan e-mailadres niet toevoegen", "Unable to remove contact information": "Kan contactinformatie niet verwijderen", "Unable to verify email address.": "Kan e-mailadres niet verifiëren.", @@ -326,17 +301,12 @@ "%(senderName)s unbanned %(targetName)s.": "%(senderName)s heeft %(targetName)s ontbannen.", "Unable to capture screen": "Kan geen schermafdruk maken", "Unable to enable Notifications": "Kan meldingen niet inschakelen", - "Unable to load device list": "Kan lijst van apparaten niet laden", - "Undecryptable": "Onontsleutelbaar", "unencrypted": "onversleuteld", - "Unencrypted message": "Onversleuteld bericht", "unknown caller": "onbekende beller", "unknown device": "onbekend apparaat", "Unknown room %(roomId)s": "Onbekend gesprek %(roomId)s", - "Unknown (user, device) pair:": "Onbekend paar (gebruiker, apparaat):", "Unmute": "Niet dempen", "Unnamed Room": "Naamloos gesprek", - "Unrecognised command:": "Onbekende opdracht:", "Unrecognised room alias:": "Onbekende gespreksbijnaam:", "Uploading %(filename)s and %(count)s others|zero": "%(filename)s wordt geüpload", "Uploading %(filename)s and %(count)s others|one": "%(filename)s en %(count)s ander worden geüpload", @@ -364,11 +334,8 @@ "(no answer)": "(geen antwoord)", "(unknown failure: %(reason)s)": "(onbekende fout: %(reason)s)", "Warning!": "Let op!", - "WARNING: Device already verified, but keys do NOT MATCH!": "LET OP: apparaat reeds geverifieerd, maar de sleutels KOMEN NIET OVEREEN!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "LET OP: SLEUTELVERIFICATIE IS MISLUKT! De ondertekende sleutel voor %(userId)s en apparaat %(deviceId)s is ‘%(fprint)s’, wat niet overeenkomt met de verschafte sleutel ‘%(fingerprint)s’. Dit kan betekenen dat uw communicatie onderschept wordt!", "Who can access this room?": "Wie mag er deelnemen aan dit gesprek?", "Who can read history?": "Wie kan de geschiedenis lezen?", - "Who would you like to communicate with?": "Met wie zou u willen communiceren?", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s heeft de uitnodiging van %(targetName)s ingetrokken.", "You are already in a call.": "U bent al in gesprek.", "You cannot place a call with yourself.": "U kunt uzelf niet bellen.", @@ -381,7 +348,6 @@ "You need to be able to invite users to do that.": "Dit vereist de bevoegdheid gebruikers uit te nodigen.", "You need to be logged in.": "Hiervoor dient u aangemeld te zijn.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Zo te zien is uw e-mailadres op deze thuisserver niet aan een Matrix-ID gekoppeld.", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Uw wachtwoord is gewijzigd. U zult op andere apparaten pas weer pushmeldingen ontvangen nadat u zich er opnieuw op aangemeld heeft", "You seem to be in a call, are you sure you want to quit?": "Het ziet er naar uit dat u in gesprek bent, weet u zeker dat u wilt afsluiten?", "You seem to be uploading files, are you sure you want to quit?": "Het ziet er naar uit dat u bestanden aan het uploaden bent, weet u zeker dat u wilt afsluiten?", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "U kunt deze veranderingen niet ongedaan maken aangezien u de gebruiker tot hetzelfde niveau als uzelf promoveert.", @@ -395,8 +361,6 @@ "(~%(count)s results)|one": "(~%(count)s resultaat)", "(~%(count)s results)|other": "(~%(count)s resultaten)", "Active call": "Actieve oproep", - "bold": "vetgedrukt", - "italic": "schuingedrukt", "Please select the destination room for this message": "Selecteer het bestemmingsgesprek voor dit bericht", "New Password": "Nieuw wachtwoord", "Start automatically after system login": "Automatisch starten na systeemaanmelding", @@ -422,20 +386,11 @@ "Unknown error": "Onbekende fout", "Incorrect password": "Onjuist wachtwoord", "To continue, please enter your password.": "Voer uw wachtwoord in om verder te gaan.", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Neem op een andere manier (bv. persoonlijk of telefonisch) contact op met de eigenaar om te controleren of dit apparaat vertrouwd kan worden, en vraag of de sleutel voor dit apparaat in hun Gebruikersinstellingen gelijk is aan onderstaande sleutel:", - "Device name": "Apparaatnaam", - "Device key": "Apparaatssleutel", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Klik hieronder op de knop ‘Verifiëren’ als de sleutels overeenkomen. Zo niet drukt u op de knop ‘Blokkeren’, want dan onderschept iemand berichten naar dit apparaat.", "Blacklist": "Blokkeren", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Momenteel sluit u ongeverifieerde apparaten uit; om daar berichten aan te sturen dient u ze te verifiëren.", "Unblacklist": "Deblokkeren", - "Verify device": "Apparaat verifiëren", "I verify that the keys match": "Ik verifieer dat de sleutels overeenkomen", "Unable to restore session": "Sessieherstel lukt niet", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Als u reeds een recentere versie van Riot heeft gebruikt is uw sessie mogelijk onverenigbaar met deze versie. Sluit dit venster en ga terug naar die recentere versie.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "We raden u aan ieder apparaat te verifiëren om zo vast te stellen of ze tot de rechtmatige eigenaar behoren, maar u kunt het bericht desgewenst ook zonder verificatie versturen.", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "Aan ‘%(RoomName)s’ nemen apparaten deel die u nog niet eerder heeft gezien.", - "Unknown devices": "Onbekende apparaten", "Unknown Address": "Onbekend adres", "Unverify": "Ontverifiëren", "Verify...": "Verifiëren…", @@ -476,8 +431,6 @@ "Start verification": "Verificatie starten", "Share without verifying": "Delen zonder verificatie", "Ignore request": "Verzoek negeren", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "U heeft een nieuw apparaat ‘%(displayName)s’ toegevoegd, dat om versleutelingssleutels vraagt.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Uw ongeverifieerde apparaat ‘%(displayName)s’ vraagt naar versleutelingssleutels.", "Encryption key request": "Verzoek voor versleutelingssleutel", "Define the power level of a user": "Bepaal het machtsniveau van een gebruiker", "Add a widget": "Widget toevoegen", @@ -494,8 +447,6 @@ "Unable to create widget.": "Kan widget niet aanmaken.", "You are not in this room.": "U maakt geen deel uit van dit gesprek.", "You do not have permission to do that in this room.": "U bent niet bevoegd dat in dit gesprek te doen.", - "Verifies a user, device, and pubkey tuple": "Verifieert een combinatie van gebruiker, apparaat en publieke sleutel", - "Loading device info...": "Apparaatinformatie wordt geladen…", "Example": "Voorbeeld", "Create": "Aanmaken", "Featured Rooms:": "Prominente gesprekken:", @@ -517,7 +468,6 @@ "Which rooms would you like to add to this community?": "Welke gesprekken wilt u toevoegen aan deze gemeenschap?", "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Widgets verwijderen geldt voor alle deelnemers aan dit gesprek. Weet u zeker dat u deze widget wilt verwijderen?", "Delete Widget": "Widget verwijderen", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Dit gesprek bevat onbekende apparaten: tenzij u die verifieert zou iemand uw oproep kunnen afluisteren.", "Review Devices": "Apparaten nakijken", "Call Anyway": "Toch bellen", "Answer Anyway": "Toch beantwoorden", @@ -543,8 +493,6 @@ "Enable inline URL previews by default": "Inline URL-voorvertoning standaard inschakelen", "Enable URL previews for this room (only affects you)": "URL-voorvertoning in dit gesprek inschakelen (geldt alleen voor u)", "Enable URL previews by default for participants in this room": "URL-voorvertoning standaard voor alle deelnemers aan dit gesprek inschakelen", - "Delete %(count)s devices|other": "%(count)s apparaten verwijderen", - "Delete %(count)s devices|one": "Apparaat verwijderen", "%(senderName)s sent an image": "%(senderName)s heeft een afbeelding gestuurd", "%(senderName)s sent a video": "%(senderName)s heeft een video gestuurd", "%(senderName)s uploaded a file": "%(senderName)s heeft een bestand geüpload", @@ -721,7 +669,6 @@ "Error whilst fetching joined communities": "Er is een fout opgetreden bij het ophalen van de gemeenschappen waarvan u lid bent", "Create a new community": "Maak een nieuwe gemeenschap aan", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Maak een gemeenschap aan om gebruikers en gesprekken bijeen te brengen! Schep met een startpagina op maat uw eigen plaats in het Matrix-universum.", - "Show devices, send anyway or cancel.": "Apparaten weergeven, toch versturen of annuleren.", "%(count)s of your messages have not been sent.|one": "Uw bericht is niet verstuurd.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Alles nu opnieuw versturen of annuleren. U kunt ook individuele berichten selecteren om opnieuw te versturen of te annuleren.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Bericht opnieuw versturen of bericht annuleren.", @@ -751,11 +698,7 @@ "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.", "were unbanned %(count)s times|one": "zijn ontbannen", "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s heeft %(displayName)s als weergavenaam aangenomen.", - "Your key share request has been sent - please check your other devices for key share requests.": "Uw sleuteldeelverzoek is verstuurd - controleer uw andere apparaten voor sleuteldeelverzoeken.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Sleuteldeelverzoeken worden automatisch naar andere apparaten verstuurd. Als u het verzoek heeft afgewezen of gesloten, klik dan hier om de sleutels van deze sessie opnieuw aan te vragen.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "U zult dit bericht niet kunnen ontcijferen als geen van uw andere apparaten er de sleutel voor heeft.", "Key request sent.": "Sleutelverzoek verstuurd.", - "Re-request encryption keys from your other devices.": "Versleutelingssleutels opnieuw aanvragen van uw andere apparaten.", "Did you know: you can use communities to filter your Riot.im experience!": "Wist u dat: u gemeenschappen kunt gebruiken om uw Riot.im-beleving te filteren!", "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Versleep een gemeenschapsavatar naar het filterpaneel helemaal links op het scherm om een filter in te stellen. Daarna kunt u op de avatar in het filterpaneel klikken wanneer u zich wilt beperken tot de gesprekken en mensen uit die gemeenschap.", "Clear filter": "Filter wissen", @@ -824,7 +767,6 @@ "Noisy": "Lawaaierig", "Collecting app version information": "App-versieinformatie wordt verzameld", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "De bijnaam %(alias)s verwijderen en %(name)s uit de catalogus verwijderen?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Hiermee kunt u naar uw account terugkeren nadat u zich heeft afgemeld, en u aanmelden op andere apparaten.", "Keywords": "Trefwoorden", "Enable notifications for this account": "Meldingen inschakelen voor deze account", "Invite to this community": "Uitnodigen in deze gemeenschap", @@ -915,8 +857,6 @@ "Always show encryption icons": "Versleutelingspictogrammen altijd tonen", "Send analytics data": "Statistische gegevens (analytics) versturen", "Enable widget screenshots on supported widgets": "Widget-schermafbeeldingen inschakelen op ondersteunde widgets", - "Unable to reply": "Kan niet reageren", - "At this time it is not possible to reply with an emote.": "Het is nog niet mogelijk met een emoticon te reageren.", "Muted Users": "Gedempte gebruikers", "Please help improve Riot.im by sending anonymous usage data. This will use a cookie (please see our Cookie Policy).": "Help Riot.im te verbeteren door anonieme gebruiksgegevens te versturen. Dit zal een cookie gebruiken (bekijk hiervoor ons cookiebeleid).", "Please help improve Riot.im by sending anonymous usage data. This will use a cookie.": "Help Riot.im te verbeteren door anonieme gebruiksgegevens te versturen. Dit zal een cookie gebruiken.", @@ -948,12 +888,6 @@ "Demote yourself?": "Uzelf degraderen?", "Demote": "Degraderen", "Share Link to User": "Koppeling naar gebruiker delen", - "deleted": "verwijderd", - "underlined": "onderstreept", - "inline-code": "code", - "block-quote": "citaat", - "bulleted-list": "opsomming", - "numbered-list": "genummerde lijst", "Share room": "Gesprek delen", "System Alerts": "Systeemmeldingen", "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 versleutelde gesprekken zoals deze zijn URL-voorvertoningen standaard uitgeschakeld, om te voorkomen dat uw thuisserver (waar de voorvertoningen worden gemaakt) informatie kan verzamelen over de koppelingen die u hier ziet.", @@ -1080,7 +1014,6 @@ "Verify this user by confirming the following emoji appear on their screen.": "Verifieer deze gebruiker door te bevestigen dat hun scherm de volgende emoji toont.", "Verify this user by confirming the following number appears on their screen.": "Verifieer deze gebruiker door te bevestigen dat hun scherm het volgende getal toont.", "Unable to find a supported verification method.": "Kan geen ondersteunde verificatiemethode vinden.", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "Voor maximale veiligheid kunt u dit het beste persoonlijk, of via een ander vertrouwd communicatiemedium, doen.", "Dog": "Hond", "Cat": "Kat", "Lion": "Leeuw", @@ -1127,7 +1060,6 @@ "Pencil": "Potlood", "Paperclip": "Paperclip", "Scissors": "Schaar", - "Padlock": "Hangslot", "Key": "Sleutel", "Hammer": "Hamer", "Telephone": "Telefoon", @@ -1145,7 +1077,6 @@ "Headphones": "Koptelefoon", "Folder": "Map", "Pin": "Speld", - "Your homeserver does not support device management.": "Uw thuisserver ondersteunt geen apparaatbeheer.", "Yes": "Ja", "No": "Nee", "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "We hebben u een e-mail gestuurd om uw adres te verifiëren. Gelieve de daarin gegeven aanwijzingen op te volgen en dan op de knop hieronder te klikken.", @@ -1155,30 +1086,19 @@ "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Versleutelde berichten zijn beveiligd met eind-tot-eind-versleuteling. Enkel de ontvanger(s) en u hebben de sleutels om deze berichten te lezen.", "Unable to load key backup status": "Kan sleutelback-upstatus niet laden", "Restore from Backup": "Herstellen uit back-up", - "This device is backing up your keys. ": "Dit apparaat maakt een back-up van uw sleutels. ", "Back up your keys before signing out to avoid losing them.": "Maak een back-up van uw sleutels vooraleer u zich afmeldt om ze niet te verliezen.", "Backing up %(sessionsRemaining)s keys...": "%(sessionsRemaining)s sleutels worden geback-upt…", "All keys backed up": "Alle sleutels zijn geback-upt", - "Backup has a valid signature from this device": "De back-up heeft een geldige ondertekening van dit apparaat", - "Backup is not signed by any of your devices": "De back-up is door geen van uw apparaten ondertekend", - "This backup is trusted because it has been restored on this device": "Deze back-up wordt vertrouwd, omdat hij op dit apparaat hersteld is", "Backup version: ": "Back-upversie: ", "Algorithm: ": "Algoritme: ", "Chat with Riot Bot": "Met Riot-robot chatten", "Forces the current outbound group session in an encrypted room to be discarded": "Dwingt tot verwerping van de huidige uitwaartse groepssessie in een versleuteld gesprek", - "Backup has a signature from unknown device with ID %(deviceId)s.": "De back-up heeft een ondertekening van een onbekend apparaat met ID %(deviceId)s.", - "Backup has a valid signature from verified device ": "De back-up heeft een geldige ondertekening van een geverifieerd apparaat ", - "Backup has a valid signature from unverified device ": "De back-up heeft een geldige ondertekening van een ongeverifieerd apparaat ", - "Backup has an invalid signature from verified device ": "De back-up heeft een ongeldige ondertekening van een geverifieerd apparaat ", - "Backup has an invalid signature from unverified device ": "De back-up heeft een ongeldige ondertekening van een ongeverifieerd apparaat ", - "Your keys are not being backed up from this device.": "Uw sleutels worden niet geback-upt van dit apparaat.", "Start using Key Backup": "Begin sleutelback-up te gebruiken", "Add an email address to configure email notifications": "Voeg een e-mailadres toe om e-mailmeldingen in te stellen", "Unable to verify phone number.": "Kan telefoonnummer niet verifiëren.", "Verification code": "Verificatiecode", "Phone Number": "Telefoonnummer", "Profile picture": "Profielfoto", - "Upload profile picture": "Profielfoto uploaden", "Upgrade to your own domain": "Waardeer op naar uw eigen domein", "Display Name": "Weergavenaam", "Set a new account password...": "Stel een nieuw accountwachtwoord in…", @@ -1240,10 +1160,6 @@ "Encryption": "Versleuteling", "Once enabled, encryption cannot be disabled.": "Eenmaal ingeschakeld kan versleuteling niet meer worden uitgeschakeld.", "Encrypted": "Versleuteld", - "Some devices for this user are not trusted": "Er worden enkele apparaten van deze gebruiker niet vertrouwd", - "Some devices in this encrypted room are not trusted": "Er worden enkele apparaten in dit versleutelde gesprek niet vertrouwd", - "All devices for this user are trusted": "Alle apparaten van deze gebruiker worden vertrouwd", - "All devices in this encrypted room are trusted": "Alle apparaten in dit versleutelde gesprek worden vertrouwd", "This room has been replaced and is no longer active.": "Dit gesprek is vervangen en niet langer actief.", "The conversation continues here.": "Het gesprek gaat hier verder.", "Never lose encrypted messages": "Verlies nooit uw versleutelde berichten", @@ -1263,8 +1179,6 @@ "Error updating flair": "Fout bij bijwerken van badge", "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "Er is een fout opgetreden bij het bijwerken van de badge voor dit gesprek. Wellicht ondersteunt de server dit niet, of er is een tijdelijke fout opgetreden.", "Room avatar": "Gespreksavatar", - "Upload room avatar": "Gespreksavatar uploaden", - "No room avatar": "Geen gespreksavatar", "Room Name": "Gespreksnaam", "Room Topic": "Gespreksonderwerp", "This room is a continuation of another conversation.": "Dit gesprek is een voortzetting van een ander gesprek.", @@ -1294,7 +1208,6 @@ "Waiting for %(userId)s to confirm...": "Wachten op bevestiging van %(userId)s…", "Use two-way text verification": "Tweerichtingstekstverificatie gebruiken", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Verifieer deze gebruiker om hem/haar als vertrouwd te markeren. Gebruikers vertrouwen geeft u extra gemoedsrust bij het gebruik van eind-tot-eind-versleutelde berichten.", - "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "Deze gebruiker verifiëren zal hun apparaat als vertrouwd markeren, en ook uw apparaat voor hen als vertrouwd markeren.", "Waiting for partner to confirm...": "Wachten op bevestiging van partner…", "Incoming Verification Request": "Inkomend verificatieverzoek", "You've previously used Riot 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, Riot needs to resync your account.": "U heeft voorheen Riot op %(host)s gebruikt met lui laden van leden ingeschakeld. In deze versie is lui laden uitgeschakeld. Omdat de lokale cache niet compatibel is tussen deze twee instellingen, moet Riot uw account opnieuw synchroniseren.", @@ -1341,7 +1254,6 @@ "This looks like a valid recovery key!": "Dit is een geldige herstelsleutel!", "Not a valid recovery key": "Geen geldige herstelsleutel", "Access your secure message history and set up secure messaging by entering your recovery key.": "Verkrijg toegang tot uw beveiligde berichtgeschiedenis en stel beveiligd chatten in door uw herstelsleutel in te voeren.", - "If you've forgotten your recovery passphrase you can ": "Als u uw herstelwachtwoord vergeten bent, kunt u ", "Share Permalink": "Permalink delen", "Clear status": "Status wissen", "Update status": "Status bijwerken", @@ -1382,12 +1294,10 @@ "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.": "Uw bericht is niet verstuurd omdat deze thuisserver een systeembronlimiet heeft overschreden. Gelieve contact op te nemen met uw dienstbeheerder om de dienst te blijven gebruiken.", "Guest": "Gast", "Could not load user profile": "Kon gebruikersprofiel niet laden", - "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "Uw wachtwoord opnieuw instellen zal alle sleutels voor eind-tot-eind-versleuteling op al uw apparaten opnieuw instellen, waardoor uw versleutelde gesprekgeschiedenis onleesbaar wordt. Stel sleutelback-up in of exporteer uw gesprekssleutels vanaf een ander apparaat vooraleer u uw wachtwoord opnieuw instelt.", "Your Matrix account on %(serverName)s": "Uw Matrix-account op %(serverName)s", "A verification email will be sent to your inbox to confirm setting your new password.": "Er is een verificatie-e-mail naar u gestuurd om het instellen van uw nieuwe wachtwoord te bevestigen.", "Sign in instead": "Aanmelden", "Your password has been reset.": "Uw wachtwoord is opnieuw ingesteld.", - "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "U bent afgemeld op al uw apparaten en zult geen pushmeldingen meer ontvangen. Meld u op elk apparaat opnieuw aan om weer meldingen te ontvangen.", "Set a new password": "Stel een nieuw wachtwoord in", "Invalid homeserver discovery response": "Ongeldig thuisserverontdekkingsantwoord", "Invalid identity server discovery response": "Ongeldig identiteitsserverontdekkingsantwoord", @@ -1414,17 +1324,13 @@ "As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.": "Als veiligheidsnet kunt u dit gebruiken om uw versleutelde berichtgeschiedenis te herstellen indien u uw herstelwachtwoord zou vergeten.", "As a safety net, you can use it to restore your encrypted message history.": "Als veiligheidsnet kunt u het gebruiken om uw versleutelde berichtgeschiedenis te herstellen.", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "Uw herstelsleutel is een veiligheidsnet - u kunt hem gebruiken om de toegang tot uw versleutelde berichten te herstellen indien u uw wachtwoord zou vergeten.", - "Keep your recovery key somewhere very secure, like a password manager (or a safe)": "Bewaar uw herstelsleutel op een heel veilige plaats, zoals een wachtwoordbeheerder (of een kluis)", "Your Recovery Key": "Uw herstelsleutel", "Copy to clipboard": "Kopiëren naar klembord", "Download": "Downloaden", - "Your Recovery Key has been copied to your clipboard, paste it to:": "Uw herstelsleutel is gekopieerd naar uw klembord, plak hem in:", - "Your Recovery Key is in your Downloads folder.": "Uw herstelsleutel bevindt zich in uw Downloads-map.", "Print it and store it somewhere safe": "Druk hem af en bewaar hem op een veilige plaats", "Save it on a USB key or backup drive": "Sla hem op op een USB-stick of een back-upschijf", "Copy it to your personal cloud storage": "Kopieer hem naar uw persoonlijke cloudopslag", "Your keys are being backed up (the first backup could take a few minutes).": "Er wordt een back-up van uw sleutels gemaakt (de eerste back-up kan enkele minuten duren).", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "Zonder veilig berichtherstel in te stellen, zult u uw versleutelde berichtgeschiedenis niet kunnen herstellen indien u zich afmeldt of een ander apparaat gebruikt.", "Set up Secure Message Recovery": "Veilig berichtherstel instellen", "Secure your backup with a passphrase": "Beveilig uw back-up met een wachtwoord", "Confirm your passphrase": "Bevestig uw wachtwoord", @@ -1442,24 +1348,15 @@ "New Recovery Method": "Nieuwe herstelmethode", "A new recovery passphrase and key for Secure Messages have been detected.": "Er zijn een nieuw herstelwachtwoord en een nieuwe herstelsleutel voor beveiligde berichten gedetecteerd.", "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.": "Als u deze nieuwe herstelmethode niet heeft ingesteld, is het mogelijk dat er een aanvaller toegang tot uw account probeert te verkrijgen. Wijzig onmiddellijk uw accountwachtwoord en stel een nieuwe herstelmethode in in de instellingen.", - "This device is encrypting history using the new recovery method.": "Dit apparaat versleutelt de geschiedenis met de nieuwe herstelmethode.", "Go to Settings": "Ga naar instellingen", "Set up Secure Messages": "Beveiligde berichten instellen", "Recovery Method Removed": "Herstelmethode verwijderd", - "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "Dit apparaat heeft gedetecteerd dat uw herstelwachtwoord en -sleutel voor beveiligde berichten verwijderd zijn.", - "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "Als u dit per ongeluk heeft gedaan, kunt u beveiligde berichten instellen op dit apparaat, waarmee de berichtgeschiedenis van dit apparaat herversleuteld zal worden met een nieuwe herstelmethode.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Als u de herstelmethode niet heeft verwijderd, is het mogelijk dat er een aanvaller toegang tot uw account probeert te verkrijgen. Wijzig onmiddellijk uw accountwachtwoord en stel een nieuwe herstelmethode in in de instellingen.", - "Room upgrade confirmation": "Bevestiging voor bijwerken van gesprek", - "Upgrading a room can be destructive and isn't always necessary.": "Het bijwerken van een gesprek is niet altijd nodig, en soms destructief.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Gespreksopwaarderingen worden meestal aanbevolen wanneer een bepaalde groepsgespreksversie als onstabiel wordt beschouwd. Onstabiele groepsgespreksversies bevatten mogelijk bugs of beveiligingsproblemen, of beschikken niet over alle functies.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Gespreksopwaarderingen beïnvloeden meestal enkel de verwerking van het gesprek aan serverzijde. Indien u problemen ondervindt met uw Riot-cliënt, gelieve dit dan te melden op .", "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.": "Let op: gesprekken bijwerken voegt gespreksleden niet automatisch toe aan de nieuwe versie van het gesprek. Er komt in het oude gesprek een koppeling naar het nieuwe, waarop gespreksleden moeten klikken om aan het nieuwe gesprek deel te nemen.", "Adds a custom widget by URL to the room": "Voegt met een URL een aangepaste widget toe aan het gesprek", "Please supply a https:// or http:// widget URL": "Voer een https://- of http://-widget-URL in", "You cannot modify widgets in this room.": "U kunt de widgets in dit gesprek niet aanpassen.", "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s heeft de uitnodiging voor %(targetDisplayName)s om toe te treden tot het gesprek ingetrokken.", - "Enable desktop notifications for this device": "Bureaubladmeldingen inschakelen voor dit apparaat", - "Enable audible notifications for this device": "Geluidsmeldingen inschakelen voor dit apparaat", "Upgrade this room to the recommended room version": "Werk dit gesprek bij tot de aanbevolen versie", "This room is running room version , which this homeserver has marked as unstable.": "Dit gesprek draait op groepsgespreksversie , die door deze thuisserver als onstabiel is gemarkeerd.", "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Bijwerken zal de huidige versie van dit gesprek sluiten, en onder dezelfde naam een bijgewerkte versie starten.", @@ -1504,8 +1401,6 @@ "A conference call could not be started because the integrations server is not available": "Daar de integratieserver onbereikbaar is kon het groepsaudiogesprek niet gestart worden", "The server does not support the room version specified.": "De server ondersteunt deze versie van gesprekken niet.", "Name or Matrix ID": "Naam of Matrix-ID", - "Email, name or Matrix ID": "E-mailadres, naam, of matrix-ID", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Gelieve het bijwerken van dit gesprek van tot te bevestigen.", "Changes your avatar in this current room only": "Verandert uw avatar enkel in het huidige gesprek", "Unbans user with given ID": "Ontbant de gebruiker met de gegeven ID", "Sends the given message coloured as a rainbow": "Verstuurt het gegeven bericht in regenboogkleuren", @@ -1515,10 +1410,6 @@ "The user's homeserver does not support the version of the room.": "De thuisserver van de gebruiker biedt geen ondersteuning voor de gespreksversie.", "Show hidden events in timeline": "Verborgen gebeurtenissen op de tijdslijn weergeven", "When rooms are upgraded": "Wanneer gesprekken bijgewerkt worden", - "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Dit apparaat maakt geen back-up van uw sleutels, maar u heeft wel een bestaande back-up die u kunt herstellen, en waaraan u vervolgens nieuwe sleutels kunt toevoegen.", - "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Verbind dit apparaat met de sleutelback-up vooraleer u zich afmeldt om sleutels die zich enkel op dit apparaat bevinden niet te verliezen.", - "Connect this device to Key Backup": "Dit apparaat verbinden met sleutelback-up", - "Backup has an invalid signature from this device": "De back-up heeft een ongeldige ondertekening van dit apparaat", "this room": "dit gesprek", "View older messages in %(roomName)s.": "Bekijk oudere berichten in %(roomName)s.", "Joining room …": "Deelnemen aan gesprek…", @@ -1611,8 +1502,6 @@ "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)s heeft niets gewijzigd", "Changes your avatar in all rooms": "Verandert uw avatar in alle gesprekken", "Removing…": "Bezig met verwijderen…", - "Clear all data on this device?": "Alle gegevens op dit apparaat wissen?", - "Clearing all data from this device is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Gewiste gegevens kunnen niet teruggehaald worden. Versleutelde berichten zullen verloren gaan, tenzij hun sleutels geback-upt zijn.", "Clear all data": "Alle gegevens wissen", "Your homeserver doesn't seem to support this feature.": "Uw thuisserver biedt geen ondersteuning voor deze functie.", "Resend edit": "Bewerking opnieuw versturen", @@ -1624,7 +1513,6 @@ "Forgotten your password?": "Wachtwoord vergeten?", "You're signed out": "U bent afgemeld", "Clear personal data": "Persoonlijke gegevens wissen", - "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.": "Let op: uw persoonlijke gegevens (inclusief versleutelingssleutels) worden nog steeds op dit apparaat opgeslagen. Wis deze wanneer u klaar bent met het apparaat te gebruiken, of wanneer u zich wilt aanmelden met een andere account.", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Laat ons weten wat er verkeerd is gegaan, of nog beter, maak een foutrapport aan op GitHub, waarin u het probleem beschrijft.", "Identity Server": "Identiteitsserver", "Find others by phone or email": "Vind anderen via telefoonnummer of e-mailadres", @@ -1633,11 +1521,9 @@ "Terms of Service": "Gebruiksvoorwaarden", "Service": "Dienst", "Summary": "Samenvatting", - "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.": "Verkrijg opnieuw toegang tot uw account en herstel de versleutelingssleutels die opgeslagen zijn op dit apparaat. Zonder deze sleutels zult u uw versleutelde berichten niet kunnen lezen op andere apparaten.", "Sign in and regain access to your account.": "Meld u aan en verkrijg opnieuw toegang tot uw account.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "U kunt zich niet aanmelden met uw account. Neem contact op met de beheerder van uw thuisserver voor meer informatie.", "This account has been deactivated.": "Deze account is gedeactiveerd.", - "Failed to start chat": "Gesprek beginnen is mislukt", "Messages": "Berichten", "Actions": "Acties", "Displays list of commands with usages and descriptions": "Toont een lijst van beschikbare opdrachten, met hun gebruiken en beschrijvingen", @@ -1665,7 +1551,6 @@ "Please enter verification code sent via text.": "Voer de verificatiecode in die werd verstuurd via sms.", "Discovery options will appear once you have added a phone number above.": "Ontdekkingsopties zullen verschijnen wanneer u een telefoonnummer hebt toegevoegd.", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "Er is een sms verstuurd naar +%(msisdn)s. Voor de verificatiecode in die in het bericht staat.", - "To verify that this device can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Controleer of de sleutel die u in uw Gebruikersinstellingen op dat apparaat ziet overeenkomt met de sleutel hieronder om te verifiëren dat het apparaat vertrouwd kan worden:", "Command Help": "Hulp bij opdrachten", "No identity server is configured: add one in server settings to reset your password.": "Er is geen identiteitsserver geconfigureerd: voeg er één toe in de serverinstellingen om uw wachtwoord opnieuw in te stellen.", "Call failed due to misconfigured server": "Oproep mislukt door verkeerd geconfigureerde server", @@ -1703,7 +1588,6 @@ "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Aanvaard de gebruiksvoorwaarden van de identiteitsserver (%(serverName)s) om vindbaar te zijn op e-mailadres of telefoonnummer.", "Read Marker lifetime (ms)": "Levensduur van leesbevestigingen (ms)", "Read Marker off-screen lifetime (ms)": "Levensduur van levensbevestigingen, niet op scherm (ms)", - "A device's public name is visible to people you communicate with": "De openbare naam van een apparaat is zichtbaar aan alle mensen met wie u communiceert", "Upgrade the room": "Werk het gesprek bij", "Enable room encryption": "Gespreksversleuteling inschakelen", "Error changing power level requirement": "Fout bij wijzigen van machtsniveauvereiste", @@ -1752,7 +1636,6 @@ "Find a room… (e.g. %(exampleRoom)s)": "Zoek een gesprek… (bv. %(exampleRoom)s)", "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Als u het gesprek dat u zoekt niet kunt vinden, vraag dan een uitnodiging, of Maak een nieuw gesprek aan.", "Explore rooms": "Gesprekken ontdekken", - "Use the new, faster, composer for writing messages": "Gebruik de nieuwe, snellere opsteller om berichten te schrijven", "Show previews/thumbnails for images": "Toon voorbeelden voor afbeeldingen", "Clear cache and reload": "Cache wissen en herladen", "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|one": "U staat op het punt 1 bericht door %(user)s te verwijderen. Dit kan niet ongedaan worden gemaakt. Wilt u doorgaan?", diff --git a/src/i18n/strings/nn.json b/src/i18n/strings/nn.json index fc0b042bab..dd95ea89bf 100644 --- a/src/i18n/strings/nn.json +++ b/src/i18n/strings/nn.json @@ -6,7 +6,6 @@ "The information being sent to us to help make Riot.im better includes:": "Informasjonen som vert send til oss for å gjera Riot.im betre er mellom anna:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Der denne sida inneheld gjenkjenneleg informasjon, slik som ein rom-, brukar- eller gruppeID, vert denne informasjonen sletta før han sendast til tenar.", "Call Failed": "Oppringjing Mislukkast", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Det finst ukjende einingar i dette rommet: viss du gjeng frama utan å godkjenna dei, kan nokon mogelegvis tjuvlytta på samtala.", "Review Devices": "Sjå Over Einingar", "Call Anyway": "Ring Likevel", "Answer Anyway": "Svar Likevel", @@ -71,10 +70,6 @@ "Moderator": "Moderator", "Admin": "Administrator", "Start a chat": "Start ei samtale", - "Who would you like to communicate with?": "Kven vil du koma i kontakt med?", - "Start Chat": "Start ei Samtale", - "Invite new room members": "Byd nye rommedlemer inn", - "Send Invites": "Send Innbydingar", "Operation failed": "Handling mislukkast", "Failed to invite": "Fekk ikkje til å byda inn", "Failed to invite the following users to the %(roomName)s room:": "Dei fylgjande brukarane lét seg ikkje byda inn til %(roomName)s:", @@ -122,17 +117,12 @@ "To use it, just wait for autocomplete results to load and tab through them.": "For å bruka han, vent på at resultata fyller seg ut og tab gjennom dei.", "Deops user with given id": "AvOPar brukarar med den gjevne IDen", "Opens the Developer Tools dialog": "Opnar Utviklarverktøy-tekstboksen", - "Verifies a user, device, and pubkey tuple": "Godkjenner ein brukar, eining og offentleg-nykeltuppel", "Unverify": "Fjern godkjenning", "Verify...": "Godkjenn...", "Which officially provided instance you are using, if any": "Kva offisielt gjevne instanse du brukar, viss nokon", "The remote side failed to pick up": "Den andre sida tok ikkje røret", - "Unknown (user, device) pair:": "Ukjend (brukar, eining)-par:", - "Device already verified!": "Eininga er allereie godkjend!", - "WARNING: Device already verified, but keys do NOT MATCH!": "ÅTVARING: Eininga er allereie godkjend, men nyklane SAMSVARER IKKJE!", "Verified key": "Godkjend nykel", "Displays action": "Visar handlingar", - "Unrecognised command:": "Ukjend påbod:", "Reason": "Grunnlag", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s sa ja til innbydinga frå %(displayName)s.", "%(targetName)s accepted an invitation.": "%(targetName)s sa ja til ei innbyding.", @@ -170,7 +160,6 @@ "%(senderName)s made future room history visible to all room members.": "%(senderName)s gjorde den framtidige romhistoria tilgjengeleg for alle rommedlemer.", "%(senderName)s made future room history visible to anyone.": "%(senderName)s gjorde den framtidige romhistoria tilgjengelg for kven som helst.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s gjorde den framtidige romhistoria tilgjengeleg til ukjende (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s skrudde ende-til-ende-kryptering på (%(algorithm)s-algoritmen).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s frå %(fromPowerLevel)s til %(toPowerLevel)s", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s endra makthøgda til %(powerLevelDiffText)s.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s endra dei festa meldingane i rommet.", @@ -197,8 +186,6 @@ "Automatically replace plain text Emoji": "Erstatt Emojiar i plaintekst av seg sjølv", "Mirror local video feed": "Spegl den lokale videofeeden", "Send analytics data": "Send statistikkdata", - "Never send encrypted messages to unverified devices from this device": "Send aldri krypterte meldingar til ikkje-godkjende einingar frå denne eininga", - "Never send encrypted messages to unverified devices in this room from this device": "Send aldri krypterte meldingar til ikkje-godkjende einingar i dette rommet frå denne eininga", "Enable URL previews for this room (only affects you)": "Skru URL-førehandsvisingar på for dette rommet (påverkar deg åleine)", "Enable URL previews by default for participants in this room": "Skru URL-førehandsvisingar på som utgangspunkt for deltakarar i dette rommet", "Room Colour": "Romfarge", @@ -238,10 +225,7 @@ "New Password": "Nytt Passord", "Confirm password": "Stadfest passord", "Change Password": "Endra Passord", - "Unable to load device list": "Klarte ikkje å lasta einingslista", "Authentication": "Godkjenning", - "Delete %(count)s devices|other": "Slett %(count)s einingar", - "Delete %(count)s devices|one": "Slett eining", "Device ID": "EiningsID", "Last seen": "Sist sedd", "Failed to set display name": "Fekk ikkje til å setja visingsnamn", @@ -280,13 +264,7 @@ "%(senderName)s sent a video": "%(senderName)s sende ein video", "%(senderName)s uploaded a file": "%(senderName)s lasta ei fil opp", "Options": "Innstillingar", - "Your key share request has been sent - please check your other devices for key share requests.": "Nykeldelingsforespurnaden din vart send - ver venleg og sjekk dei andre einingane dine for nykeldelingsforespurnadar.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Viss dei andre einingane dine ikkje har nykelen til denne meldinga kan du ikkje dekryptera ho.", "Key request sent.": "Nykelforespurnad er send.", - "Re-request encryption keys from your other devices.": "Spør på nytt om krypteringsnyklar frå dei andre einingane dine.", - "Undecryptable": "Kan ikkje dekrypterast", - "Encrypted by an unverified device": "Kryptert av ei ikkje-godkjent eining", - "Unencrypted message": "Ikkje-kryptert melding", "Please select the destination room for this message": "Ver venleg og vel målrommet for denne meldinga", "Blacklisted": "Svartelista", "device id: ": "einingsID: ", @@ -308,8 +286,6 @@ "Failed to change power level": "Fekk ikkje til å endra makthøgda", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Du kjem ikkje til å kunna gjera om på denne endringa sidan du set brukaren si høgd opp til di eiga.", "Are you sure?": "Er du sikker?", - "No devices with registered encryption keys": "Ingen einingar med oppskrivne krypteringsnykler", - "Devices": "Einingar", "Unignore": "Slutt å oversjå", "Ignore": "Oversjå", "Mention": "Nemn", @@ -327,32 +303,20 @@ "and %(count)s others...|one": "og ein til...", "Invited": "Innboden", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (makthøgd %(powerLevelNumber)s)", - "bold": "feit", - "italic": "skeiv", - "deleted": "sletta", - "underlined": "understreka", - "bulleted-list": "punktliste", - "numbered-list": "talliste", "Attachment": "Vedlegg", "Hangup": "Legg på", "Voice call": "Røystesamtale", "Video call": "Videosamtale", "Upload file": "Last ei fil opp", - "Show Text Formatting Toolbar": "Vis Tekstformverktøylinje", "Send an encrypted reply…": "Send eit kryptert svar…", "Send a reply (unencrypted)…": "Send eit svar (ikkje-kryptert)…", "Send an encrypted message…": "Send ei kryptert melding…", "Send a message (unencrypted)…": "Send ei melding (ikkje-kryptert)…", "You do not have permission to post to this room": "Du har ikkje tillating til å senda meldingar i dette rommet", - "Hide Text Formatting Toolbar": "Gøym Tekstformverktøylinje", "Server error": "Noko gjekk gale med tenaren", "Server unavailable, overloaded, or something else went wrong.": "tenaren var utilgjengeleg, overlasta, elles so gjekk noko anna galt.", "Command error": "Noko gjekk gale med påbodet", "The maximum permitted number of widgets have already been added to this room.": "Det største mogelege talet widgets finst allereie på dette rommet.", - "Unable to reply": "Klarte ikkje å svara", - "At this time it is not possible to reply with an emote.": "Det er førebels ikkje mogeleg å svara med ein emote.", - "Markdown is disabled": "Markdown er skrudd av", - "Markdown is enabled": "Markdown er skrudd på", "Unpin Message": "Tak ned festa Melding", "Jump to message": "Hopp til melding", "No pinned messages.": "Inga festa meldingar.", @@ -388,7 +352,6 @@ "Community Invites": "Samfunnsinnbydingar", "Invites": "Innbydingar", "Favourites": "Yndlingar", - "People": "Folk", "Rooms": "Rom", "Low priority": "Lågrett", "System Alerts": "Systemvarsel", @@ -430,8 +393,6 @@ "Show Stickers": "Vis Klistremerkar", "Jump to first unread message.": "Hopp til den fyrste ulesne meldinga.", "Close": "Lukk", - "Invalid alias format": "Ugangbar aliasform", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' er ikkje ei gangbar aliasform", "Remote addresses for this room:": "Fjernadresser for dette rommet:", "Local addresses for this room:": "Lokaladresser for dette rommet:", "This room has no local addresses": "Dette rommer har ingen lokaladresser", @@ -633,10 +594,6 @@ "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.": "Meldingssynlegheit på Matrix liknar på epost. At vi gløymer meldingane dine tyder at meldingar du har send ikkje vil verta delt med nye, ikkje-innmeldte brukarar, men brukare som er meldt på som allereie har tilgang til desse meldingane vil fortsatt kunne sjå kopien deira.", "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)": "Ver venleg og gløym alle meldingane eg har send når brukaren min vert avliven (Åtvaring: dette gjer at framtidige brukarar ikkje fær eit fullstendig oversyn av samtalene)", "To continue, please enter your password:": "For å gå fram, ver venleg og skriv passordet ditt inn:", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "For å godkjenna at denne eininga er til å stola på, ver venleg og snakk med eiaren på ei anna måte (t.d. ansikt til ansikt eller på telefon) og spør dei om nykelen dei ser i Brukarinnstillingane for denne eininga samsvarar med nykelen under:", - "Device name": "Einingsnamn", - "Device key": "Einingsnykel", - "Verify device": "Godkjenn eining", "I verify that the keys match": "Eg stadfestar at nyklane samsvarar", "Back": "Attende", "Event sent!": "Hending send!", @@ -648,12 +605,9 @@ "Toolbox": "Verktøykasse", "Developer Tools": "Utviklarverktøy", "An error has occurred.": "Noko gjekk gale.", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Du la til den nye eininga '%(displayName)s', som spør om krypteringsnyklar.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Den ikkje-godkjende eininga di '%(displayName)s' spør om krypteringsnyklar.", "Start verification": "Byrj godkjenning", "Share without verifying": "Del utan å godkjenna", "Ignore request": "Oversjå førespurnad", - "Loading device info...": "Lastar einingsinfo inn...", "Encryption key request": "Krypteringsnykel-førespurnad", "Sign out": "Logg ut", "Clear Storage and Sign Out": "Tøm Lager og Logg Ut", @@ -685,7 +639,6 @@ "Failed to change password. Is your password correct?": "Fekk ikkje til å skifta passord. Er passordet rett?", "(HTTP status %(httpStatus)s)": "(HTTP-tilstand %(httpStatus)s)", "Please set a password!": "Ver venleg og set eit passord!", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Dette tillèt deg å fara attende til brukaren din etter å ha logga ut, og å logga inn på andre einingar.", "Share Room": "Del Rom", "Link to most recent message": "Lenk til den nyaste meldinga", "Share User": "Del Brukar", @@ -693,11 +646,6 @@ "Share Room Message": "Del Rommelding", "Link to selected message": "Lenk til den valde meldinga", "COPY": "KOPIER", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Du set for augeblunket ikkje-godkjende einingar på svartelista; for å senda meldingar til desse einingane må du godkjenna dei.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Vi tilrår deg å gå gjennom godkjenninga for kvar av einingane for å vera sikker på at dei tilhøyrer sine rettmessige eigarar, men du kan senda meldinga på nytt utan å godkjenna viss du vil.", - "Room contains unknown devices": "Rommet inneheld ukjende einingar", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" inneheld einingar som du ikkje har sett før.", - "Unknown devices": "Ukjende einingar", "Private Chat": "Lukka Samtale", "Public Chat": "Offentleg Samtale", "Alias (optional)": "Alias (valfritt)", @@ -808,8 +756,6 @@ "Couldn't find a matching Matrix room": "Kunne ikkje finna eit samsvarande Matrixrom", "Fetching third party location failed": "Noko gjekk gale med hentinga tredjepartiplasseringa", "Scroll to bottom of page": "Blad til botnen", - "Message not sent due to unknown devices being present": "Meldinga vart ikkje send fordi ukjende einingar er til stades", - "Show devices, send anyway or cancel.": "Vis einingar, Send likevel eller Bryt av.", "You can't send any messages until you review and agree to our terms and conditions.": "Du kan ikkje senda meldingar før du ser over og seier deg einig i våre Vilkår og Føresetnader.", "%(count)s of your messages have not been sent.|other": "Nokre av meldingane dine vart ikkje sende.", "%(count)s of your messages have not been sent.|one": "Meldinga di vart ikkje send.", @@ -840,13 +786,10 @@ "Light theme": "Ljost preg", "Dark theme": "Dimt preg", "Success": "Det gjekk", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Passordet ditt vert endra. Du får ikkje push-varsel på andre einingar før du loggar inn att på dei", "Unable to remove contact information": "Klarte ikkje å fjerna kontaktinfo", "": "", "Import E2E room keys": "Hent E2E-romnyklar inn", "Cryptography": "Kryptografi", - "Device ID:": "Einings-ID:", - "Device key:": "Einingsnykel:", "If you've submitted a bug via GitHub, debug logs can help us track down the problem. 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.": "Viss du har sendt inn ein bøgg gjennom GitHub, kan debøgg-loggar hjelpa oss med å finna problemet. Debøgg-loggar inneheld data om æpp-bruk, b.a. Brukarnamnet ditt, IDane eller aliasa på romma eller gruppene du har vitja og brukarnamna til andre brukarar. Dei inneheld ikkje meldingar.", "Riot collects anonymous analytics to allow us to improve the application.": "Riot samlar anonym statistikk inn slik at vi kan forbetre æppen.", "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Personvern er viktig for oss, so vi samlar ikkje på personleg eller attkjenneleg data for statistikken vår.", @@ -869,7 +812,6 @@ "click to reveal": "klikk for å visa", "Homeserver is": "Heimtenaren er", "Identity Server is": "Identitetstenaren er", - "matrix-react-sdk version:": "matrix-react-sdk-utgåve:", "riot-web version:": "riot-web-utgåve:", "olm version:": "olm-utgåve:", "Failed to send email": "Fekk ikkje til å senda eposten", @@ -910,7 +852,6 @@ "Session ID": "Økt-ID", "End-to-end encryption information": "Ende-til-ende-krypteringsinfo", "Event information": "Hendingsinfo", - "Sender device information": "Info om avsendareininga", "Passphrases must match": "Passfrasane må vere identiske", "Passphrase must not be empty": "Passefrasefeltet kan ikkje vera tomt", "Enter passphrase": "Skriv inn passfrase", @@ -918,14 +859,10 @@ "You must specify an event type!": "Du må oppgje ein handlingssort!", "Call Timeout": "Tidsavbrot i Samtala", "Enable automatic language detection for syntax highlighting": "Skru automatisk måloppdaging på for syntax-understreking", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Å endra passordet ditt attendestiller førebelst alle ende-til-ende-krypteringsnyklar på alle einingar, slik at kryptert pratehistorie vert uleseleg, med mindre du fyrst hentar romnyklane dine ut og hentar dei inn att etterpå. I framtida vil denne prosessen vera betre.", "Export E2E room keys": "Hent E2E-romnyklar ut", "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Det kan henda at du stilte dei inn på ein annan klient enn Riot. Du kan ikkje stilla på dei i Riot men dei gjeld framleis", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Nykeldelingsførespurnader vert sende til dei andre einingane dine av seg sjølv. Viss du sa nei til eller avviste førespurnadene på dei andre einingane, klikk her for å beda om nyklane for denne øykta på nytt.", "Jump to read receipt": "Hopp til lesen-lappen", "Filter room members": "Filtrer rommedlemer", - "inline-code": "kode-i-tekst", - "block-quote": "blokk-sitat", "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.": "Når nokon legg ein URL med i meldinga si, kan ei URL-førehandsvising visast for å gje meir info om lenkja slik som tittelen, skildringa, og eit bilete frå nettsida.", "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?": "Du held på å verta teken til ei tredje-partisside so du kan godkjenna brukaren din til bruk med %(integrationsUrl)s. Vil du gå fram?", "Token incorrect": "Teiknet er gale", @@ -935,8 +872,6 @@ "Please help improve Riot.im by sending anonymous usage data. This will use a cookie (please see our Cookie Policy).": "Ver venleg og hjelp oss å forbetra Riot.im ved å senda anonym brukardata. Dette brukar ei datakake (ver venleg og sjå på Datakakeretningslinene våre).", "Please help improve Riot.im by sending anonymous usage data. This will use a cookie.": "Ver venleg og hjelp oss å forbetra Riot.im ved å senda anonym brukardata. Dette brukar ei datakake.", "Whether or not you're using the Richtext mode of the Rich Text Editor": "Om du brukar Riktekst-innstillinga på Riktekstfeltet", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ÅTVARING: NOKO GJEKK GALT MED NYKELGODKJENNINGA! Signeringsnykelen til %(userId)s og eininga %(deviceId)s er \"%(fprint)s\", som ikkje er lik den gjevne nykelen \"%(fingerprint)s\". Dette kan tyda at nokon tjuvlyttar på kommuniseringa!", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Signeringsnykelen du oppgav er lik signeringsnykelen du fekk frå %(userId)s si eining %(deviceId)s. Eininga merkast som godkjend.", "This room is not accessible by remote Matrix servers": "Rommet er ikkje tilgjengeleg for andre Matrix-heimtenarar", "Add an Integration": "Legg tillegg til", "Popout widget": "Popp widget ut", @@ -945,7 +880,6 @@ "Custom level": "Sjølvsett høgd", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Klarte ikkje å lasta handlinga som vert svara til. Anten finst ho ikkje elles har du ikkje tilgang til å sjå ho.", "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.": "Debøgg-loggar inneheld æppbrukdata slik som brukarnamnet ditt, IDane eller aliasane på romma eller gruppene du har vore i og brukarnamna til andre brukarar. Dei inneheld ikkje meldingar.", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Vis dei er like, trykk på godkjenn-knappen under. Viss dei ikkje gjer det, tjuvlyttar nokon på eininga og du bør sannsynlegvis trykkja på svartelisting-knappen i staden.", "Send Custom Event": "Send Sjølvsett Hending", "Failed to send custom event.": "Fekk ikkje til å senda sjølvsett hending.", "State Key": "Tilstandsnykel", @@ -992,14 +926,12 @@ "Guest": "Gjest", "Your profile": "Din profil", "Could not load user profile": "Klarde ikkje å laste brukarprofilen", - "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "Endring av passordet vil nullstille nøklar for ende-til-ende kryptering på alle eningane dine. Alle tidligare meldingar og historikk vil bli ulesbar. Aktiver sikkerheitskopiering for nøklar (Key Backup) eller eksporter romnøklane på ein annan eining før du nullstiller passordet.", "Your Matrix account on %(serverName)s": "Din Matrix-konto på %(serverName)s", "Your Matrix account on ": "Din Matrix-konto på ", "No identity server is configured: add one in server settings to reset your password.": "Ingen identitetsserver er konfigurert: legg til ein i innstillingane for å nullstille passordet ditt.", "Sign in instead": "Logg inn istaden", "A verification email will be sent to your inbox to confirm setting your new password.": "For å stadfeste tilbakestilling av passordet, vil ein e-post vil bli sendt til din innboks.", "Your password has been reset.": "Passodet ditt vart nullstilt.", - "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Du har blitt logga av frå alle einingane og vil ikkje lengre motta push-varslingar. For a reaktivere slike varsel, logg inn på nytt på kvar separate eining.", "Set a new password": "Sett nytt passord", "Invalid homeserver discovery response": "Ugyldig svar frå heimeserveren (discovery response)", "Failed to get autodiscovery configuration from server": "Kladte ikkje å hente automatisk oppsett frå server", @@ -1025,14 +957,12 @@ "Create your account": "Lag din konto", "Failed to re-authenticate due to a homeserver problem": "Fekk ikkje til å re-authentisere grunna ein feil på heimeserveren", "Failed to re-authenticate": "Fekk ikkje til å re-autentisere", - "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.": "Ta tilbake tilgang til din konto og gjenopprett krypteringsnøklar lagra på denne eininga. Du kan ikkje lese krypterte meldingar viss du ikkje har desse.", "Enter your password to sign in and regain access to your account.": "Skriv inn ditt passord for å logge på og ta tilbake tilgang til kontoen din.", "Forgotten your password?": "Gløymt passord ?", "Sign in and regain access to your account.": "Logg på og ta tilbake tilgang til din konto.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Du har ikkje muligheit til å logge på kontoen din. Kontakt systemadministratoren for meir informasjon.", "You're signed out": "Du er no avlogga", "Clear personal data": "Fjern personlege data", - "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.": "Åtvaring: Dine personelge data (inklusive krypteringsnøklar) er fortsatt lagra på denne eininga. Fjern dette viss du ikkje skal bruke kontoen på denne eininga, eller logge på med ein annan konto.", "Great! This passphrase looks strong enough.": "Flott! Denne passfrasen virkar til å vere sterk nok.", "We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.": "Vi vil lagre ein kryptert kopi av nøklane dine på vår server. Vern sikkerheitskopien din med ein passfrase.", "For maximum security, this should be different from your account password.": "For maksimal sikkerheit, bør dette vere noko anna enn kontopassordet ditt.", @@ -1046,17 +976,13 @@ "As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.": "Som eit sikkerheitsnett, kan du bruke den til å gjenopprette den krypterte meldingshistorikken i tilfelle du gløymer gjennopprettingsnøkkelen.", "As a safety net, you can use it to restore your encrypted message history.": "Som eit sikkerheitsnett, kan du bruke den til å gjenopprette den krypterte meldingshistorikken.", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "Gjennopprettingsnøkkelen eit sikkerheitsnett, kan du bruke den til å gjenopprette den krypterte meldingshistorikken i tilfelle du gløymer passfrasen.", - "Keep your recovery key somewhere very secure, like a password manager (or a safe)": "Ta vare på gjenopprettingsnøkkelen din på ein trygg plass, som for eksempel i eit passordhandteringsprogram (eller ein safe)", "Your Recovery Key": "Gjenopprettingsnøkkelen din", "Copy to clipboard": "Kopier til utklippstavle", "Download": "Last ned", - "Your Recovery Key has been copied to your clipboard, paste it to:": "Gjenopprettingsnøkkelen din har blitt kopiert til utklippstavla, lim den til:", - "Your Recovery Key is in your Downloads folder.": "Gjenopprettingsnøkkelen ligg i Nedlastnings-mappa.", "Print it and store it somewhere safe": "Skriv ut og ta vare på den på ein trygg stad", "Save it on a USB key or backup drive": "Lagre til ein USB-pinne eller sikkerheitskopidisk", "Copy it to your personal cloud storage": "Kopier den til personleg skylagring", "Your keys are being backed up (the first backup could take a few minutes).": "Nøklane dine blir sikkerheitskopiert (den første kopieringa kan ta nokre minutt).", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "Loggar du av eller brukar ein annan einheit, vil du ikkje ha mulegheit til å hente fram historikk for krypterte meldingar med mindre sikker gjenoppretting for meldingar (Secure Message Recovery) er satt opp.", "Set up Secure Message Recovery": "Sett opp sikker gjenoppretting for meldingar", "Secure your backup with a passphrase": "Gjer sikkerheitskopien trygg med ein passfrase", "Confirm your passphrase": "Stadfest passfrasen din", @@ -1074,12 +1000,9 @@ "New Recovery Method": "Ny gjenopprettingsmetode", "A new recovery passphrase and key for Secure Messages have been detected.": "Ein ny gjenopprettingspassfrase og nøkkel for sikre meldingar vart funne.", "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.": "Har du ikkje satt opp den nye gjenopprettingsmetoden, kan ein angripar prøve å bryte seg inn på kontoen din. Endre ditt kontopassord og sett opp gjenoppretting umiddelbart under instillingane.", - "This device is encrypting history using the new recovery method.": "Denne eininga krypterer meldingshistorikken med den nye gjenopprettingsmetoden.", "Go to Settings": "Gå til innstillingar", "Set up Secure Messages": "Sett opp sikre meldingar (Secure Messages)", "Recovery Method Removed": "Gjenopprettingsmetode fjerna", - "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "Denne eininga har oppdaga at gjenopprettingspassfrasen og nøkkelen for sikre meldingar er fjerna.", - "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "Gjorde du dette ved eit uhell, kan du sette opp sikre meldingar på denne eininga. Dette vil kryptere all meldingshistorikk med ein ny gjenopprettingsmetode.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Viss du ikkje fjerna gjenopprettingsmetoden, kan ein angripar prøve å bryte seg inn på kontoen din. Endre kontopassordet ditt og sett ein opp ein ny gjenopprettingsmetode umidellbart under Innstillingar.", "Add Email Address": "Legg til e-postadresse", "Add Phone Number": "Legg til telefonnummer", @@ -1095,8 +1018,6 @@ "Name or Matrix ID": "Namn eller Matrix ID", "Registration Required": "Registrering er obligatorisk", "You need to register to do this. Would you like to register now?": "Du må registrera for å gjera dette. Ynskjer du å registrera no?", - "Email, name or Matrix ID": "E-post, namn eller Matrix ID", - "Failed to start chat": "Fekk ikkje til å starte samtalen", "Failed to invite users to the room:": "Fekk ikkje til å invitera brukarar til rommet:", "Messages": "Meldingar", "Actions": "Handlingar", @@ -1105,12 +1026,7 @@ "Sends a message as plain text, without interpreting it as markdown": "Sender ein melding som rein-tekst, utan å tolka den som markdown", "Upgrades a room to a new version": "Oppgraderer eit rom til ein ny versjon", "You do not have the required permissions to use this command.": "Du har ikkje tilgang til å utføra denne kommandoen.", - "Room upgrade confirmation": "Stadfesting for rom-oppgradering", - "Upgrading a room can be destructive and isn't always necessary.": "Oppgradering av eit rom kan vera destruktivt og er ikkje alltid naudsynt.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Oppgradering av rom er som regel tilrådd når ein versjon av rommet er å rekne som ustabil. Ustabile rom kan ha kodefeil, mangle funksjonar eller ha sikkerheitproblem.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Oppgradering av rom påverkar normalt berre prosessering av rommet på tenar-sida . Om du opplever problem med Riot-klienten din, meld gjerne inn problemet med .", "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.": "Åtvaring: Oppgradering av eit rom vil ikkje automatisk overføre rom-medlemane til den nye versjonen av rommet. Vi vil leggje ut ein link til det nye romme i den gamle utgåva av rommet - rom-medlemane må då klikka på denne linken for å medlem av det nye rommet.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Stadfest at du vil fortsetje med å oppgradere dette rommet frå til .", "Changes your display nickname in the current room only": "Endrar kallenamnet ditt som er synleg i det gjeldande rommet", "Changes the avatar of the current room": "Endrar avataren for det gjeldande rommet", "Changes your avatar in this current room only": "Endrar din avatar for det gjeldande rommet", diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index ed5f0143e9..aed7f01170 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -10,10 +10,6 @@ "Add User": "Dodaj użytkownika", "Verify...": "Zweryfikuj...", "Unknown Address": "Nieznany adres", - "Unknown devices": "Nieznane urządzenia", - "Verify device": "Zweryfikuj urządzenie", - "Device key": "Klucz urządzenia", - "Device name": "Nazwa urządzenia", "To continue, please enter your password.": "Aby kontynuować, proszę wprowadzić swoje hasło.", "Incorrect password": "Nieprawidłowe hasło", "Unknown error": "Nieznany błąd", @@ -66,7 +62,6 @@ "Create Room": "Stwórz Pokój", "Cryptography": "Kryptografia", "Current password": "Aktualne hasło", - "Devices": "Urządzenia", "Error": "Błąd", "Notifications": "Powiadomienia", "Operation failed": "Operacja nie udała się", @@ -126,7 +121,6 @@ "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s usunął(-ęła) nazwę pokoju.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s zmienił(a) temat na \"%(topic)s\".", "Changes your display nickname": "Zmienia Twój wyświetlany pseudonim", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Zmiana hasła zresetuje klucze szyfrowania end-to-end na wszystkich urządzeniach, co spowoduje, że nie będzie się dało odczytać zaszyfrowanej historii czatu, chyba że najpierw wyeksportujesz swoje klucze i ponownie je zaimportujesz. W przyszłości będzie to poprawione.", "Claimed Ed25519 fingerprint key": "Zażądano odcisk klucza Ed25519", "Click here to fix": "Kliknij tutaj, aby naprawić", "Click to mute audio": "Kliknij, aby wyciszyć dźwięk", @@ -148,11 +142,8 @@ "Delete widget": "Usuń widżet", "Default": "Domyślny", "Define the power level of a user": "Określ poziom uprawnień użytkownika", - "Device already verified!": "Urządzenie jest już zweryfikowane!", "Device ID": "Identyfikator urządzenia", - "Device ID:": "Identyfikator urządzenia:", "device id: ": "identyfikator urządzenia: ", - "Device key:": "Klucz urządzenia:", "Direct chats": "Rozmowy bezpośrednie", "Disable Notifications": "Wyłącz powiadomienia", "Disinvite": "Anuluj zaproszenie", @@ -166,7 +157,6 @@ "Emoji": "Emoji", "Enable automatic language detection for syntax highlighting": "Włącz automatyczne rozpoznawanie języka dla podświetlania składni", "Enable Notifications": "Włącz powiadomienia", - "Encrypted by an unverified device": "Zaszyfrowane przez niezweryfikowane urządzenie", "%(senderName)s ended the call.": "%(senderName)s zakończył połączenie.", "End-to-end encryption information": "Informacje o szyfrowaniu end-to-end", "Enter passphrase": "Wpisz frazę", @@ -203,7 +193,6 @@ "Deops user with given id": "Usuwa prawa administratora użytkownikowi o danym ID", "Guests cannot join this room even if explicitly invited.": "Goście nie mogą dołączać do tego pokoju, nawet jeśli zostali specjalnie zaproszeni.", "Hangup": "Rozłącz się", - "Hide Text Formatting Toolbar": "Ukryj pasek formatowania tekstu", "Home": "Strona startowa", "Homeserver is": "Serwer domowy to", "Identity Server is": "Serwer Identity to", @@ -215,15 +204,12 @@ "Incoming voice call from %(name)s": "Przychodzące połączenie głosowe od %(name)s", "Incorrect username and/or password.": "Nieprawidłowa nazwa użytkownika i/lub hasło.", "Incorrect verification code": "Nieprawidłowy kod weryfikujący", - "Invalid alias format": "Nieprawidłowy format aliasu", "Invalid Email Address": "Nieprawidłowy adres e-mail", "Invalid file%(extra)s": "Nieprawidłowy plik %(extra)s", "%(senderName)s invited %(targetName)s.": "%(senderName)s zaprosił(a) %(targetName)s.", - "Invite new room members": "Zaproś nowych członków do pokoju", "Invited": "Zaproszeni", "Invites": "Zaproszenia", "Invites user with given id to current room": "Zaprasza użytkownika o danym ID do obecnego pokoju", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' nie jest poprawnym formatem aliasu", "Sign in with": "Zaloguj się używając", "Join as voice or video.": "Dołącz głosowo lub przez wideo.", "Join Room": "Dołącz do pokoju", @@ -247,16 +233,10 @@ "%(senderName)s made future room history visible to anyone.": "%(senderName)s uczynił przyszłą historię pokoju widoczną dla kazdego.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s uczynił przyszłą historię pokoju widoczną dla nieznany (%(visibility)s).", "Manage Integrations": "Zarządzaj integracjami", - "Markdown is disabled": "Markdown jest wyłączony", - "Markdown is enabled": "Markdown jest włączony", - "matrix-react-sdk version:": "Wersja matrix-react-sdk:", - "Message not sent due to unknown devices being present": "Wiadomość nie została wysłana z powodu obecności nieznanych urządzeń", "Missing room_id in request": "Brakujące room_id w żądaniu", "Missing user_id in request": "Brakujące user_id w żądaniu", "Moderator": "Moderator", "Name": "Nazwa", - "Never send encrypted messages to unverified devices from this device": "Nigdy nie wysyłaj zaszyfrowanych wiadomości do niezweryfikowanych urządzeń z tego urządzenia", - "Never send encrypted messages to unverified devices in this room from this device": "Nigdy nie wysyłaj niezaszyfrowanych wiadomości do niezweryfikowanych urządzeń z tego urządzenia", "New address (e.g. #foo:%(localDomain)s)": "Nowy adres (np. #foo:%(localDomain)s)", "New passwords don't match": "Nowe hasła nie zgadzają się", "New passwords must match each other.": "Nowe hasła muszą się zgadzać.", @@ -267,7 +247,6 @@ "AM": "AM", "PM": "PM", "NOT verified": "NIEzweryfikowany", - "No devices with registered encryption keys": "Brak urządzeń z zarejestrowanymi kluczami szyfrującymi", "No display name": "Brak nazwy ekranowej", "No more results": "Nie ma więcej wyników", "No results": "Brak wyników", @@ -276,7 +255,6 @@ "Only people who have been invited": "Tylko ludzie, którzy zostali zaproszeni", "Password": "Hasło", "Passwords can't be empty": "Hasła nie mogą być puste", - "People": "Ludzie", "Permissions": "Uprawnienia", "Phone": "Telefon", "Please check your email and click on the link it contains. Once this is done, click continue.": "Sprawdź swój e-mail i kliknij link w nim zawarty. Kiedy już to zrobisz, kliknij \"kontynuuj\".", @@ -302,7 +280,6 @@ "riot-web version:": "wersja riot-web:", "Room %(roomId)s not visible": "Pokój %(roomId)s nie jest widoczny", "Room Colour": "Kolor pokoju", - "Room contains unknown devices": "Pokój zawiera nieznane urządzenia", "%(roomName)s does not exist.": "%(roomName)s nie istnieje.", "%(roomName)s is not accessible at this time.": "%(roomName)s nie jest dostępny w tym momencie.", "Rooms": "Pokoje", @@ -312,8 +289,6 @@ "Searches DuckDuckGo for results": "Używa DuckDuckGo dla wyników", "Seen by %(userName)s at %(dateTime)s": "Widziane przez %(userName)s o %(dateTime)s", "Send anyway": "Wyślij mimo to", - "Sender device information": "Informacja o urządzeniu nadawcy", - "Send Invites": "Wyślij zaproszenia", "Send Reset Email": "Wyślij e-mail resetujący hasło", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s wysłał obraz.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s wysłał zaproszenie do %(targetDisplayName)s do dołączenia do pokoju.", @@ -324,7 +299,6 @@ "Session ID": "Identyfikator sesji", "%(senderName)s set a profile picture.": "%(senderName)s ustawił zdjęcie profilowe.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s ustawił swoją nazwę na %(displayName)s.", - "Show Text Formatting Toolbar": "Pokaż pasek narzędzi formatowania tekstu", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Pokaż czas w formacie 12-sto godzinnym (n.p. 2:30pm)", "Signed Out": "Wylogowano", "Sign in": "Zaloguj", @@ -333,12 +307,10 @@ "Someone": "Ktoś", "Start a chat": "Rozpocznij chat", "Start authentication": "Rozpocznij uwierzytelnienie", - "Start Chat": "Rozpocznij chat", "Submit": "Wyślij", "Success": "Sukces", "The maximum permitted number of widgets have already been added to this room.": "Do tego pokoju dodano już maksymalną dozwoloną liczbę widżetów.", "The phone number entered looks invalid": "Wprowadzony numer telefonu wygląda na niepoprawny", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Podany klucz podpisu odpowiada kluczowi podpisania otrzymanemu z urządzenia %(userId)s %(deviceId)s. Urządzenie oznaczone jako zweryfikowane.", "This email address is already in use": "Podany adres e-mail jest już w użyciu", "This email address was not found": "Podany adres e-mail nie został znaleziony", "The email address linked to your account must be entered.": "Musisz wpisać adres e-mail połączony z twoim kontem.", @@ -350,7 +322,6 @@ "This room": "Ten pokój", "This room is not accessible by remote Matrix servers": "Ten pokój nie jest dostępny na zdalnych serwerach Matrix", "To get started, please pick a username!": "Aby rozpocząć, wybierz nazwę użytkownika!", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s włączył(a) szyfrowanie end-to-end (algorytm %(algorithm)s).", "Unable to add email address": "Nie można dodać adresu e-mail", "Unable to create widget.": "Nie można utworzyć widżetu.", "Unable to remove contact information": "Nie można usunąć informacji kontaktowych", @@ -358,16 +329,12 @@ "%(senderName)s unbanned %(targetName)s.": "%(senderName)s odblokował(a) %(targetName)s.", "Unable to capture screen": "Nie można zrobić zrzutu ekranu", "Unable to enable Notifications": "Nie można włączyć powiadomień", - "Unable to load device list": "Nie można załadować listy urządzeń", - "Undecryptable": "Odszyfrowanie niemożliwe", "To use it, just wait for autocomplete results to load and tab through them.": "Żeby tego użyć, należy poczekać na załadowanie się autouzupełnienia i naciskać przycisk \"Tab\", by wybierać.", - "Unencrypted message": "Niezaszyfrowana wiadomość", "unknown caller": "nieznany dzwoniący", "unknown device": "nieznane urządzenie", "Unknown room %(roomId)s": "Nieznany pokój %(roomId)s", "Unmute": "Wyłącz wyciszenie", "Unnamed Room": "Pokój bez nazwy", - "Unrecognised command:": "Nierozpoznane polecenie:", "Unrecognised room alias:": "Nierozpoznany alias pokoju:", "Uploading %(filename)s and %(count)s others|zero": "Przesyłanie %(filename)s", "Uploading %(filename)s and %(count)s others|one": "Przesyłanie %(filename)s oraz %(count)s innych", @@ -389,10 +356,7 @@ "(could not connect media)": "(brak możliwości połączenia się z mediami)", "(no answer)": "(brak odpowiedzi)", "(unknown failure: %(reason)s)": "(nieznany błąd: %(reason)s)", - "WARNING: Device already verified, but keys do NOT MATCH!": "OSTRZEŻENIE: Urządzenie już zweryfikowane, ale klucze NIE PASUJĄ DO SIEBIE!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "OSTRZEŻENIE: BŁĄD WERYFIKACJI KLUCZA! Klucz podpisujący dla %(userId)s i urządzenia %(deviceId)s to \"%(fprint)s\", który nie pasuje do dostarczonego klucza \"%(fingerprint)s\". To może oznaczać, że twoje komunikaty są przejmowane!", "Who can access this room?": "Kto może uzyskać dostęp do tego pokoju?", - "Who would you like to communicate with?": "Z kim chcesz się komunikować?", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s wycofał(a) zaproszenie %(targetName)s.", "You are already in a call.": "Jesteś już w trakcie połączenia.", "You are not in this room.": "Nie jesteś w tym pokoju.", @@ -406,22 +370,18 @@ "You need to be able to invite users to do that.": "Aby to zrobić musisz mieć możliwość zapraszania użytkowników.", "You need to be logged in.": "Musisz być zalogowany.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Twój adres e-mail zdaje się nie być powiązany z żadnym Matrix ID na tym serwerze.", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Zmiana Twojego hasła powiodła się. Nie będziesz otrzymywał powiadomień push na inne urządzenia aż do momentu ponownego zalogowania się na nich", "You seem to be in a call, are you sure you want to quit?": "Wygląda na to, że prowadzisz z kimś rozmowę; jesteś pewien że chcesz wyjść?", "You seem to be uploading files, are you sure you want to quit?": "Wygląda na to, że jesteś w trakcie przesyłania plików; jesteś pewien, że chcesz wyjść?", "Set a display name:": "Ustaw nazwę ekranową:", "This server does not support authentication with a phone number.": "Ten serwer nie wspiera autentykacji za pomocą numeru telefonu.", "There are no visible files in this room": "Nie ma widocznych plików w tym pokoju", "Connectivity to the server has been lost.": "Połączenie z serwerem zostało utracone.", - "bold": "wytłuszczenie", - "italic": "kursywa", "Create": "Utwórz", "Online": "Dostępny(-a)", "Offline": "Niedostępny(-a)", "Add an Integration": "Dodaj integrację", "Token incorrect": "Niepoprawny token", "unencrypted": "niezaszyfrowany", - "Unknown (user, device) pair:": "Nieznana para (użytkownik, urządzenie):", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Nie będziesz mógł cofnąć tej zmiany, ponieważ nadajesz użytkownikowi uprawnienia administratorskie równe Twoim.", "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(time)s", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s %(time)s", @@ -451,15 +411,10 @@ "Failed to invite the following users to the %(roomName)s room:": "Wysłanie zaproszenia do następujących użytkowników do pokoju %(roomName)s nie powiodło się:", "Confirm Removal": "Potwierdź usunięcie", "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Jesteś pewien że chcesz usunąć to wydarzenie? Pamiętaj, że jeśli usuniesz nazwę pokoju lub aktualizację tematu pokoju, zmiana może zostać cofnięta.", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Aby sprawdzić czy to urządzenie jest zaufane, skontaktuj się z jego właścicielem używając innych środków (np. osobiście lub telefonicznie) i zapytaj ich czy klucz, który widzą w ustawieniach użytkownika dla tego urządzenia pasuje do klucza poniżej:", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Jeśli klucz pasuje, naciśnij na przycisk \"Zweryfikuj\" poniżej. Jeśli nie, to ktoś inny najprawdopodobniej przejmuje lub podszywa się pod to urządzenie i powinieneś nacisnąć przycisk dodania do czarnej listy.", "I verify that the keys match": "Upewnię się, że klucze się zgadzają", "Unable to restore session": "Przywrócenie sesji jest niemożliwe", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Jeśli wcześniej używałeś/aś nowszej wersji Riot, Twoja sesja może być niekompatybilna z tą wersją. Zamknij to okno i powróć do nowszej wersji.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Aktualnie wpisujesz niezweryfikowane urządzenia na czarną listę; aby wysłać wiadomość do tych urządzeń musisz je zweryfikować.", "Riot collects anonymous analytics to allow us to improve the application.": "Riot zbiera anonimowe dane analityczne, aby umożliwić nam rozwijanie aplikacji.", - "Verifies a user, device, and pubkey tuple": "Weryfikuje krotkę(tuple) użytkownika, urządzenia i klucza publicznego", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" zawiera niewidziane przez Ciebie wcześniej urządzenia.", "ex. @bob:example.com": "np. @jan:example.com", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Nastąpiła próba załadowania danego punktu w historii tego pokoju, lecz nie masz uprawnień, by zobaczyć określoną wiadomość.", "Use compact timeline layout": "Użyj kompaktowego stylu linii czasu", @@ -485,15 +440,11 @@ "Authentication check failed: incorrect password?": "Próba autentykacji nieudana: nieprawidłowe hasło?", "Do you want to set an email address?": "Czy chcesz ustawić adres e-mail?", "Share without verifying": "Udostępnij bez weryfikacji", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Dodałeś(-aś) nowe urządzenie '%(displayName)s', które żąda kluczy szyfrujących.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Twoje niezweryfikowane urządzenie '%(displayName)s' żąda kluczy szyfrujących.", "Encryption key request": "Żądanie klucza szyfrującego", - "Loading device info...": "Wczytywanie informacji o urządzeniu...", "Example": "Przykład", "Drop file here to upload": "Upuść plik tutaj, aby go przesłać", "Automatically replace plain text Emoji": "Automatycznie zastępuj tekstowe emotikony", "Failed to upload image": "Przesyłanie obrazka nie powiodło się", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Zalecamy Ci przejście przez proces weryfikacyjny dla każdego urządzenia aby potwierdzić, że należy ono do ich prawdziwego właściciela. Możesz jednak wysłać tę wiadomość bez potwierdzania.", "Unblacklist": "Usuń z czarnej listy", "Blacklist": "Dodaj do czarnej listy", "Unverify": "Usuń weryfikację", @@ -519,7 +470,6 @@ "Your identity server's URL": "Adres URL Twojego Serwera Tożsamości", "The information being sent to us to help make Riot.im better includes:": "Informacje przesyłane do nas, by poprawić Riot.im zawierają:", "The platform you're on": "Platforma na której jesteś", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "W tym pokoju są nieznane urządzenia: jeżeli będziesz kontynuować bez ich weryfikacji, możliwe będzie podsłuchiwanie Twojego połączenia.", "Answer": "Odbierz", "Review Devices": "Przegląd urządzeń", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s %(monthName)s %(fullYear)s", @@ -543,16 +493,10 @@ "Enable inline URL previews by default": "Włącz domyślny podgląd URL w tekście", "Enable URL previews for this room (only affects you)": "Włącz podgląd URL dla tego pokoju (dotyczy tylko Ciebie)", "Enable URL previews by default for participants in this room": "Włącz domyślny podgląd URL dla uczestników w tym pokoju", - "Delete %(count)s devices|other": "Usuń %(count)s urządzeń", - "Delete %(count)s devices|one": "Usuń urządzenie", "%(senderName)s sent an image": "%(senderName)s wysłał(a) obrazek", "%(senderName)s sent a video": "%(senderName)s wysłał(a) wideo", "%(senderName)s uploaded a file": "%(senderName)s wysłał(a) plik", - "Your key share request has been sent - please check your other devices for key share requests.": "Twoja prośba o podzielenie się kluczem została wysłana - sprawdź swoje inne urządzenie w celu spełnienia prośby.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Prośby o podzielenie się kluczem są wysyłane do Twoich innych urządzeń automatycznie. Jeżeli prośba została odrzucona na innym urządzeniu, kliknij tutaj aby ponownie poprosić o podzielenie się kluczem dla tej sesji.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Jeżeli inne Twoje urządzenia nie mają klucza dla tej wiadomości, nie będziesz w stanie ich odszyfrować.", "Key request sent.": "Prośba o klucz wysłana.", - "Re-request encryption keys from your other devices.": "Poproś ponownie o klucze szyfrujące z Twojego innego urządzenia.", "Kick this user?": "Wyrzucić tego użytkownika?", "Unban this user?": "Odbanować tego użytkownika?", "Ban this user?": "Zbanować tego użytkownika?", @@ -628,7 +572,6 @@ "Files": "Pliki", "Collecting app version information": "Zbieranie informacji o wersji aplikacji", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Usuń alias %(alias)s i usuń %(name)s z katalogu?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "To pozwoli Ci powrócić do Twojego konta po wylogowaniu i ponownym zalogowaniu się na innych urządzeniach.", "Keywords": "Słowa kluczowe", "Enable notifications for this account": "Włącz powiadomienia na tym koncie", "Invite to this community": "Zaproś do tej społeczności", @@ -760,8 +703,6 @@ "Unignore": "Przestań ignorować", "Jump to read receipt": "Przeskocz do potwierdzenia odczytu", "Share Link to User": "Udostępnij odnośnik do użytkownika", - "Unable to reply": "Nie udało się odpowiedzieć", - "At this time it is not possible to reply with an emote.": "W tej chwili nie można odpowiedzieć emotikoną.", "Replying": "Odpowiadanie", "Share room": "Udostępnij pokój", "Community Invites": "Zaproszenia do społeczności", @@ -866,7 +807,6 @@ "Error whilst fetching joined communities": "Błąd podczas pobierania dołączonych społeczności", "Create a new community": "Utwórz nową Społeczność", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Utwórz Społeczność, aby grupować użytkowników i pokoje! Zbuduj niestandardową stronę główną, aby zaznaczyć swoją przestrzeń we wszechświecie Matrix.", - "Show devices, send anyway or cancel.": "Pokaż urządzenia, wyślij mimo to lub anuluj.", "%(count)s of your messages have not been sent.|one": "Twoja wiadomość nie została wysłana.", "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Nikogo tu nie ma! Czy chcesz zaprosić inne osoby lub przestać ostrzegać o pustym pokoju?", "Clear filter": "Wyczyść filtr", @@ -906,11 +846,6 @@ "Permission Required": "Wymagane Uprawnienia", "Registration Required": "Wymagana Rejestracja", "You need to register to do this. Would you like to register now?": "Musisz się zarejestrować, aby to zrobić. Czy chcesz się teraz zarejestrować?", - "underlined": "podkreślenie", - "deleted": "przekreślenie", - "numbered-list": "lista numerowana", - "bulleted-list": "wykropkowana lista", - "block-quote": "blok cytowany", "A call is currently being placed!": "W tej chwili trwa rozmowa!", "A call is already in progress!": "Połączenie już trwa!", "You do not have permission to start a conference call in this room": "Nie posiadasz uprawnień do rozpoczęcia rozmowy grupowej w tym pokoju", @@ -1050,7 +985,6 @@ "Messages containing @room": "Wiadomości zawierające @room", "This is similar to a commonly used password": "Jest to podobne do powszechnie stosowanego hasła", "Print it and store it somewhere safe": "Wydrukuj przechowuj w bezpiecznym miejscu", - "Your Recovery Key is in your Downloads folder.": "Twój Klucz Odzyskiwania znajduje się w Twoim katalogu Pobrane.", "That doesn't match.": "To się nie zgadza.", "Go to Settings": "Przejdź do ustawień", "%(displayName)s is typing …": "%(displayName)s pisze…", @@ -1107,7 +1041,6 @@ "Pencil": "Ołówek", "Paperclip": "Spinacz", "Scissors": "Nożyczki", - "Padlock": "Kłódka", "Key": "Klucz", "Telephone": "Telefon", "Flag": "Flaga", @@ -1122,7 +1055,6 @@ "Anchor": "Kotwica", "Headphones": "Słuchawki", "Folder": "Folder", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "W celu zapewnienia maksymalnego bezpieczeństwa zalecamy, abyś zrobił to osobiście lub skorzystał z innego zaufanego środka komunikacji.", "Phone Number": "Numer telefonu", "Display Name": "Wyświetlana nazwa", "Set a new account password...": "Ustaw nowe hasło do konta…", @@ -1155,7 +1087,6 @@ "%(roomName)s can't be previewed. Do you want to join it?": "%(roomName)s nie może być wyświetlony. Chcesz do niego dołączyć?", "Main address": "Główny adres", "Room avatar": "Awatar pokoju", - "Upload room avatar": "Prześlij awatar pokoju", "Room Name": "Nazwa pokoju", "Room Topic": "Temat pokoju", "Power level": "Poziom uprawnień", @@ -1220,17 +1151,10 @@ "No homeserver URL provided": "Nie podano URL serwera głównego", "The server does not support the room version specified.": "Serwer nie wspiera tej wersji pokoju.", "Name or Matrix ID": "Imię lub identyfikator Matrix", - "Email, name or Matrix ID": "E-mail, imię lub Matrix ID", - "Failed to start chat": "Nie udało się rozpocząć chatu", "Messages": "Wiadomości", "Actions": "Akcje", "Other": "Inne", - "Room upgrade confirmation": "Potwierdzenie aktualizacji pokoju", - "Upgrading a room can be destructive and isn't always necessary.": "Aktualizacja pokoju może mieć negatywne skutki a nie zawsze jest wymagana.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Aktualizacje pokoi są zazwyczaj rekomendowane, gdy wersja pokoju jest niestabilna. Niestabilne pokoje mogą mieć błędy, luki bezpieczeństwa lub nie mieć wszystkich funkcjonalności.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Aktualizacje pokoi zazwyczaj mają wpływ tylko na serwer obsługujący pokój. Jeśli masz problemy ze swoim klientem Riot, proszę zgłoś błąd: .", "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.": "Uwaga!: Aktualizacja pokoju nie przeniesie członków do nowej wersji pokoju automatycznie. Użytkownicy muszą kliknąć link w starym, nieaktywnym pokoju by dołączyć do nowej wersji pokoju.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Potwierdź, że chcesz zaktualizować pokój z do .", "Changes your avatar in this current room only": "Zmienia Twój awatar w bieżącym pokoju", "Changes your avatar in all rooms": "Zmienia Twój awatar we wszystkich pokojach", "Gets or sets the room topic": "Wyświetla lub ustawia temat pokoju", @@ -1295,35 +1219,17 @@ "Ball": "Piłka", "Pin": "Pinezka", "Accept to continue:": "Zaakceptuj aby kontynuować:", - "Your homeserver does not support device management.": "Twój serwer domowy nie wspiera zarządzania urządzeniami.", "ID": "ID", "Public Name": "Nazwa publiczna", "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Czy jesteś pewien? Stracisz dostęp do wszystkich swoich zaszyfrowanych wiadomości, jeżeli nie utworzyłeś poprawnej kopii zapasowej kluczy.", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Zaszyfrowane wiadomości są zabezpieczone przy użyciu szyfrowania end-to-end. Tylko Ty oraz ich adresaci posiadają klucze do ich rozszyfrowania.", "Unable to load key backup status": "Nie można załadować stanu kopii zapasowej klucza", - "This device is backing up your keys. ": "Kopia zapasowa twoich kluczy jest tworzona. ", - "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "To urządzenie nie tworzy kopii zapasowej twoich kluczy, ale jest dostępna kopia zapasowa którą można przywrócić i dodać do dalszego działania.", - "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Podłącz to urządzenie do kopii zapasowej kluczy przed wylogowaniem, aby zapobiec utracie kluczy, które mogą być jedyne na tym urządzeniu.", - "Connect this device to Key Backup": "Podłącz to urządzenie do kopii zapasowej kluczy", "Backing up %(sessionsRemaining)s keys...": "Tworzenie kopii zapasowej %(sessionsRemaining)s kluczy...", "All keys backed up": "Utworzono kopię zapasową wszystkich kluczy", - "Backup has a signature from unknown device with ID %(deviceId)s.": "Kopia zapasowa posiada sygnaturę z nieznanego urządzenia z ID %(deviceId)s.", - "Backup has a valid signature from this device": "Kopia zapasowa posiada prawidłową sygnaturę z tego urządzenia", - "Backup has an invalid signature from this device": "Kopia zapasowa posiada nieprawidłową sygnaturę z tego urządzenia", - "Backup has a valid signature from verified device ": "Kopia zapasowa posiada prawidłową sygnaturę ze zweryfikowanego urządzenia ", - "Backup has a valid signature from unverified device ": "Kopia zapasowa posiada prawidłową sygnaturę z niezweryfikowanego urządzenia ", - "Backup has an invalid signature from verified device ": "Kopia zapasowa posiada nieprawidłową sygnaturę ze zweryfikowanego urządzenia ", - "Backup has an invalid signature from unverified device ": "Kopia zapasowa posiada nieprawidłową sygnaturę z niezweryfikowanego urządzenia ", - "Backup is not signed by any of your devices": "Kopia zapasowa nie jest podpisana przez jakiekolwiek z twoich urządzeń", - "This backup is trusted because it has been restored on this device": "Kopia zapasowa jest zaufana, ponieważ może być przywrócona na tym urządzeniu", - "Your keys are not being backed up from this device.": "Twoje klucze nie są zapisane na tym urządzeniu.", "Back up your keys before signing out to avoid losing them.": "Utwórz kopię zapasową kluczy przed wylogowaniem, aby ich nie utracić.", "Start using Key Backup": "Rozpocznij z użyciem klucza kopii zapasowej", "Add an email address to configure email notifications": "Dodaj adres poczty elektronicznej, aby skonfigurować powiadomienia pocztowe", - "Enable desktop notifications for this device": "Włącz powiadomienia na pulpicie dla tego urządzenia", - "Enable audible notifications for this device": "Włącz dźwiękowe powiadomienia dla tego urządzenia", "Profile picture": "Obraz profilowy", - "Upload profile picture": "Wgraj obraz profilowy", "Identity Server URL must be HTTPS": "URL serwera tożsamości musi być HTTPS", "Not a valid Identity Server (status code %(code)s)": "Nieprawidłowy serwer tożsamości (kod statusu %(code)s)", "Could not connect to Identity Server": "Nie można połączyć z Serwerem Tożsamości", @@ -1367,7 +1273,6 @@ "Use an identity server to invite by email. Manage in Settings.": "Użyj serwera tożsamości, by zaprosić za pomocą adresu e-mail. Zarządzaj w ustawieniach.", "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", "Try out new ways to ignore people (experimental)": "Wypróbuj nowe sposoby na ignorowanie ludzi (eksperymentalne)", - "Use the new, faster, composer for writing messages": "Używaj nowego, szybszego kompozytora do pisania wiadomości", "My Ban List": "Moja lista zablokowanych", "This is your list of users/servers you have blocked - don't leave the room!": "To jest Twoja lista zablokowanych użytkowników/serwerów – nie opuszczaj tego pokoju!", "Change identity server": "Zmień serwer tożsamości", @@ -1395,7 +1300,6 @@ "Explore": "Przeglądaj", "Filter": "Filtruj", "Add room": "Dodaj pokój", - "A device's public name is visible to people you communicate with": "Publiczna nazwa urządzenia jest widoczna dla ludzi, z którymi się komunikujesz", "Request media permissions": "Zapytaj o uprawnienia", "Voice & Video": "Głos & Wideo", "this room": "ten pokój", @@ -1412,7 +1316,6 @@ "Verification code": "Kod weryfikacyjny", "Remove %(email)s?": "Usunąć %(email)s?", "Remove %(phone)s?": "Usunąć %(phone)s?", - "Some devices in this encrypted room are not trusted": "Niektóre urządzenia w tym zaszyfrowanym pokoju nie są zaufane", "Loading …": "Ładowanie…", "Loading room preview": "Wczytywanie podglądu pokoju", "Try to join anyway": "Spróbuj dołączyć mimo tego", diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index 1a85eb752d..f0f1ce9860 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -52,7 +52,6 @@ "I have verified my email address": "Eu verifiquei o meu endereço de email", "Import E2E room keys": "Importar chave de criptografia ponta-a-ponta (E2E) da sala", "Invalid Email Address": "Endereço de email inválido", - "Invite new room members": "Convidar novas pessoas para ingressar na sala", "Invites": "Convidar", "Invites user with given id to current room": "Convidar usuários com um dado identificador para esta sala", "Sign in with": "Quero entrar", @@ -65,8 +64,6 @@ "Manage Integrations": "Gerenciar integrações", "Moderator": "Moderador/a", "Name": "Nome", - "Never send encrypted messages to unverified devices from this device": "Nunca envie mensagens criptografada para um dispositivo não verificado a partir deste dispositivo", - "Never send encrypted messages to unverified devices in this room from this device": "Nunca envie mensagens criptografadas para dispositivos não verificados nesta sala a partir deste dispositivo", "New passwords must match each other.": "As novas senhas informadas precisam ser idênticas.", "none": "nenhum", "Notifications": "Notificações", @@ -76,7 +73,6 @@ "Only people who have been invited": "Apenas pessoas que tenham sido convidadas", "Password": "Senha", "Passwords can't be empty": "As senhas não podem estar em branco", - "People": "Pessoas", "Permissions": "Permissões", "Phone": "Telefone", "Please check your email and click on the link it contains. Once this is done, click continue.": "Por favor verifique seu email e clique no link enviado. Quando finalizar este processo, clique para continuar.", @@ -89,8 +85,6 @@ "Rooms": "Salas", "Scroll to bottom of page": "Ir para o fim da página", "Searches DuckDuckGo for results": "Buscar por resultados no buscador DuckDuckGo", - "Sender device information": "Informação do dispositivo emissor", - "Send Invites": "Enviar convites", "Send Reset Email": "Enviar email para redefinição de senha", "Server may be unavailable, overloaded, or you hit a bug.": "O servidor pode estar indisponível ou sobrecarregado, ou então você encontrou uma falha no sistema.", "Session ID": "Identificador de sessão", @@ -100,7 +94,6 @@ "Sign out": "Sair", "Someone": "Alguém", "Start a chat": "Começar uma conversa", - "Start Chat": "Começar conversa", "Success": "Sucesso", "The email address linked to your account must be entered.": "O endereço de email relacionado a sua conta precisa ser informado.", "This doesn't appear to be a valid email address": "Este não aparenta ser um endereço de email válido", @@ -125,10 +118,8 @@ "VoIP conference started.": "Conferência VoIP iniciada.", "Who can access this room?": "Quem pode acessar esta sala?", "Who can read history?": "Quem pode ler o histórico da sala?", - "Who would you like to communicate with?": "Com quem você gostaria de se comunicar?", "You do not have permission to post to this room": "Você não tem permissão de postar nesta sala", "You have no visible notifications": "Voce não possui notificações visíveis", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Sua senha foi alterada com sucesso. Você não receberá notificações em outros dispositivos até que você logue novamente por eles", "Sun": "Dom", "Mon": "Seg", "Tue": "Ter", @@ -198,7 +189,6 @@ "This room is not recognised.": "Esta sala não é reconhecida.", "This phone number is already in use": "Este número de telefone já está sendo usado", "To use it, just wait for autocomplete results to load and tab through them.": "Para usar esta funcionalidade, espere o carregamento dos resultados de autocompletar e então escolha entre as opções.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ativou criptografia ponta a ponta (algoritmo %(algorithm)s).", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s desfez o banimento de %(targetName)s.", "Unable to capture screen": "Não foi possível capturar a imagem da tela", "Unable to enable Notifications": "Não foi possível ativar as notificações", @@ -236,7 +226,6 @@ "Click to unmute audio": "Clique para retirar áudio do mudo", "Command error": "Erro de comando", "Decrypt %(text)s": "Descriptografar %(text)s", - "Devices": "Dispositivos", "Direct chats": "Conversas pessoais", "Disinvite": "Desconvidar", "Download %(text)s": "Baixar %(text)s", @@ -250,20 +239,13 @@ "Failed to set display name": "Houve falha ao definir o nome público", "Failed to toggle moderator status": "Houve falha ao alterar o status de moderador/a", "Fill screen": "Tela cheia", - "Hide Text Formatting Toolbar": "Ocultar a barra de formatação de texto", "Incorrect verification code": "Código de verificação incorreto", - "Invalid alias format": "Formato de alias é inválido", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' não é um formato válido para um alias", "Join Room": "Ingressar na sala", "Jump to first unread message.": "Ir diretamente para a primeira das mensagens não lidas.", "Kick": "Remover", "Local addresses for this room:": "Endereço local desta sala:", - "Markdown is disabled": "A formatação 'Markdown' está desabilitada", - "Markdown is enabled": "A formatação 'Markdown' está habilitada", - "Message not sent due to unknown devices being present": "A mensagem não foi enviada por causa da presença de dispositivos desconhecidos", "New address (e.g. #foo:%(localDomain)s)": "Novo endereço (p.ex: #algo:%(localDomain)s)", "not specified": "não especificado", - "No devices with registered encryption keys": "Não há dispositivos com chaves de criptografia registradas", "No more results": "Não há mais resultados", "No results": "Sem resultados", "OK": "OK", @@ -278,7 +260,6 @@ "This room has no local addresses": "Esta sala não tem endereços locais", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Tentei carregar um ponto específico na linha do tempo desta sala, mas parece que você não tem permissões para ver a mensagem em questão.", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Tentei carregar um ponto específico na linha do tempo desta sala, mas não o encontrei.", - "Unable to load device list": "Não foi possível carregar a lista de dispositivos", "Unknown room %(roomId)s": "A sala %(roomId)s é desconhecida", "You seem to be in a call, are you sure you want to quit?": "Parece que você está em uma chamada. Tem certeza que quer sair?", "You seem to be uploading files, are you sure you want to quit?": "Parece que você está enviando arquivos. Tem certeza que quer sair?", @@ -286,19 +267,15 @@ "Make Moderator": "Tornar moderador(a)", "Room": "Sala", "Cancel": "Cancelar", - "bold": "negrito", - "italic": "itálico", "Ban": "Banir", "Access Token:": "Token de acesso:", "Always show message timestamps": "Sempre mostrar as datas das mensagens", "Authentication": "Autenticação", "An error has occurred.": "Ocorreu um erro.", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Alterar a senha irá atualmente apagar todas as chaves de criptografia ponta-a-ponta em todos os dispositivos, fazendo com que o histórico da conversa fique ilegível, a não ser que você exporte antes as chaves de sala e então as reimporte depois. No futuro, isso vai melhorar.", "Email": "Email", "Email address": "Endereço de email", "Error decrypting attachment": "Erro ao descriptografar o anexo", "Invalid file%(extra)s": "Arquivo inválido %(extra)s", - "matrix-react-sdk version:": "versão do matrix-react-sdk:", "Mute": "Silenciar", "olm version:": "versão do olm:", "Operation failed": "A operação falhou", @@ -329,18 +306,9 @@ "Unknown error": "Erro desconhecido", "Incorrect password": "Senha incorreta", "To continue, please enter your password.": "Para continuar, por favor insira a sua senha.", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Para verificar que este dispositivo é confiável, por favor entre em contato com a(o) sua(seu) dona(o) usando outros meios, como por exemplo pessoalmente ou por uma chamada telefônica, e pergunte a esta pessoa se a chave que ela está vendo nas suas configurações de usuário para este dispositivo é igual a esta:", - "Device name": "Nome do dispositivo", - "Device key": "Chave do dispositivo", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Se a chave for a mesma, clique no botão \"verificar\" abaixo. Se não for a mesma, então alguma outra pessoa está interceptando este dispositivo e você provavelmente vai querer clicar no botão \"colocar na lista negra\".", - "Verify device": "Verificar o dispositivo", "I verify that the keys match": "Eu confirmo que as chaves são iguais", "Unable to restore session": "Não foi possível restaurar a sessão", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Se você já usou antes uma versão mais recente do Riot, a sua sessão pode ser incompatível com esta versão. Feche esta janela e tente abrir com a versão mais recente.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Você está atualmente bloqueando dispositivos não verificados. Para enviar mensagens para estes dispositivos, você necessita antes verificá-los.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Nós recomendamos que você passe pelo processo de verificação para cada dispositivo para confirmar que eles pertencem às pessoas que efetivamente são suas donas, mas você pode reenviar a mensagem sem verificar isso, se assim o desejar.", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contém dispositivos que você não viu antes.", - "Unknown devices": "Dispositivos desconhecidos", "Unknown Address": "Endereço desconhecido", "Unblacklist": "Tirar da lista de bloqueados", "Blacklist": "Colocar na lista de bloqueados", @@ -371,20 +339,14 @@ "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Este processo faz com que você possa importar as chaves de criptografia que tinha previamente exportado de outro cliente Matrix. Você poderá então descriptografar todas as mensagens que o outro cliente pôde criptografar.", "Start automatically after system login": "Iniciar automaticamente ao iniciar o sistema", "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?": "Você será levado agora a um site de terceiros para poder autenticar a sua conta para uso com o serviço %(integrationsUrl)s. Você quer continuar?", - "Device already verified!": "Dispositivo já verificado!", "Export": "Exportar", "Import": "Importar", "Incorrect username and/or password.": "Nome de usuária(o) e/ou senha incorreto.", "Invited": "Convidada(o)", "Results from DuckDuckGo": "Resultados de DuckDuckGo", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "A chave de assinatura que você forneceu é a mesma que a chave de assinatura que você recebeu do dispositivo %(deviceId)s de %(userId)s . O dispositivo foi portanto marcado como verificado.", - "Unknown (user, device) pair:": "Par usuária(o)-dispositivo desconhecido:", - "Unrecognised command:": "Comando não reconhecido:", "Unrecognised room alias:": "Apelido de sala não reconhecido:", "Use compact timeline layout": "Usar o layout de linha do tempo compacta", "Verified key": "Chave verificada", - "WARNING: Device already verified, but keys do NOT MATCH!": "ATENÇÃO: O dispositivo já foi verificado, mas as chaves NÃO SÃO IGUAIS!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ATENÇÃO: VERIFICAÇÃO DE CHAVE FALHOU! A chave de assinatura para a(o) usuária(o) %(userId)s e dispositivo %(deviceId)s é \"%(fprint)s\", que não é igual à chave fornecida \"%(fingerprint)s\". Isso pode significar que suas comunicações estão sendo interceptadas!", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removeu a imagem da sala.", "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s alterou a imagem da sala %(roomName)s", "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s alterou a imagem da sala para ", @@ -399,9 +361,7 @@ "Anyone": "Qualquer pessoa", "Are you sure you want to leave the room '%(roomName)s'?": "Você tem certeza que deseja sair da sala '%(roomName)s'?", "Custom level": "Nível personalizado", - "Device ID:": "ID do dispositivo:", "device id: ": "id do dispositivo: ", - "Device key:": "Chave do dispositivo:", "Register": "Registre-se", "Remote addresses for this room:": "Endereços remotos para esta sala:", "Save": "Salvar", @@ -418,15 +378,12 @@ "You must register to use this functionality": "Você deve se registrar para poder usar esta funcionalidade", "Public Chat": "Conversa pública", "Uploading %(filename)s and %(count)s others|zero": "Enviando o arquivo %(filename)s", - "Room contains unknown devices": "Esta sala contém dispositivos desconhecidos", "Admin Tools": "Ferramentas de administração", - "Undecryptable": "Não é possível descriptografar", "Incoming video call from %(name)s": "Chamada de vídeo de %(name)s recebida", "Alias (optional)": "Apelido (opcional)", "Active call (%(roomName)s)": "Chamada ativa (%(roomName)s)", "Error: Problem communicating with the given homeserver.": "Erro: problema de comunicação com o Servidor de Base fornecido.", "Failed to upload profile picture!": "Falha ao enviar a imagem de perfil!", - "Show Text Formatting Toolbar": "Exibir barra de formatação de texto", "Room directory": "Lista de salas", "Failed to fetch avatar URL": "Falha ao obter a URL da imagem de perfil", "Incoming call from %(name)s": "Chamada de %(name)s recebida", @@ -446,8 +403,6 @@ "Incoming voice call from %(name)s": "Chamada de voz de %(name)s recebida", "If you already have a Matrix account you can log in instead.": "Se você já tem uma conta Matrix, pode também fazer login.", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Não foi possível conectar ao Servidor de Base. Por favor, confira sua conectividade à internet, garanta que o certificado SSL do Servidor de Base é confiável, e que uma extensão do navegador não esteja bloqueando as requisições de rede.", - "Encrypted by an unverified device": "Criptografado por um dispositivo não verificado", - "Unencrypted message": "Mensagem não criptografada", "Join as voice or video.": "Participar por voz ou por vídeo.", "Uploading %(filename)s and %(count)s others|other": "Enviando o arquivo %(filename)s e %(count)s outros arquivos", "Username available": "Nome de usuária(o) disponível", @@ -483,7 +438,6 @@ "You do not have permission to do that in this room.": "Não tem permissão para fazer isso nesta sala.", "Copied!": "Copiado!", "Failed to copy": "Falha ao copiar", - "Verifies a user, device, and pubkey tuple": "Verifica um utilizador, o dispositivo e o tuplo da chave pública", "Check for update": "Procurar atualizações", "Your browser does not support the required cryptography extensions": "O seu browser não suporta as extensões de criptografia necessárias", "Not a valid Riot keyfile": "Não é um ficheiro de chaves Riot válido", @@ -494,10 +448,7 @@ "Start verification": "Iniciar verificação", "Share without verifying": "Partilhar sem verificar", "Ignore request": "Ignorar pedido", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Adicionou um novo dispositivo '%(displayName)s', que está a pedir chaves de encriptação.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "O seu dispositivo não verificado '%(displayName)s' está a pedir chaves de encriptação.", "Encryption key request": "Pedido de chave de encriptação", - "Loading device info...": "A carregar as informações do dispositivo...", "Example": "Exemplo", "Create": "Criar", "Featured Rooms:": "Salas em destaque:", @@ -575,7 +526,6 @@ "Files": "Ficheiros", "Collecting app version information": "A recolher informação da versão da app", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Apagar o apelido %(alias)s da sala e remover %(name)s da lista pública?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Isto irá permitir-lhe voltar à sua conta depois de terminar sessão, assim como iniciar sessão noutros dispositivos.", "Keywords": "Palavras-chave", "Enable notifications for this account": "Ativar notificações para esta conta", "Messages containing keywords": "Mensagens contendo palavras-chave", @@ -669,7 +619,6 @@ "The information being sent to us to help make Riot.im better includes:": "As informações que estão sendo enviadas para ajudar a melhorar o Riot.im incluem:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Quando esta página contém informação de que permitam a sua identificação, como uma sala, ID de utilizador ou de grupo, estes dados são removidos antes de serem enviados ao servidor.", "Call Failed": "A chamada falhou", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Há dispositivos desconhecidos nesta sala: se continuar sem os verificar, será possível que alguém espie a sua chamada.", "Review Devices": "Rever dispositivos", "Call Anyway": "Ligar na mesma", "Answer Anyway": "Responder na mesma", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 8027bb577f..97245ef025 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -52,7 +52,6 @@ "I have verified my email address": "Eu verifiquei o meu endereço de email", "Import E2E room keys": "Importar chave de criptografia ponta-a-ponta (E2E) da sala", "Invalid Email Address": "Endereço de email inválido", - "Invite new room members": "Convidar novas pessoas para ingressar na sala", "Invites": "Convidar", "Invites user with given id to current room": "Convidar usuários com um dado identificador para esta sala", "Sign in with": "Quero entrar", @@ -65,8 +64,6 @@ "Manage Integrations": "Gerenciar integrações", "Moderator": "Moderador/a", "Name": "Nome", - "Never send encrypted messages to unverified devices from this device": "Nunca envie mensagens criptografada para um dispositivo não verificado a partir deste dispositivo", - "Never send encrypted messages to unverified devices in this room from this device": "Nunca envie mensagens criptografadas para dispositivos não verificados nesta sala a partir deste dispositivo", "New passwords must match each other.": "As novas senhas informadas precisam ser idênticas.", "none": "nenhum", "Notifications": "Notificações", @@ -76,7 +73,6 @@ "Only people who have been invited": "Apenas pessoas que tenham sido convidadas", "Password": "Senha", "Passwords can't be empty": "As senhas não podem estar em branco", - "People": "Pessoas", "Permissions": "Permissões", "Phone": "Telefone", "Please check your email and click on the link it contains. Once this is done, click continue.": "Por favor verifique seu email e clique no link enviado. Quando finalizar este processo, clique para continuar.", @@ -89,8 +85,6 @@ "Rooms": "Salas", "Scroll to bottom of page": "Ir para o fim da página", "Searches DuckDuckGo for results": "Buscar por resultados no buscador DuckDuckGo", - "Sender device information": "Informação do dispositivo emissor", - "Send Invites": "Enviar convites", "Send Reset Email": "Enviar email para redefinição de senha", "Server may be unavailable, overloaded, or you hit a bug.": "O servidor pode estar indisponível ou sobrecarregado, ou então você encontrou uma falha no sistema.", "Session ID": "Identificador de sessão", @@ -100,7 +94,6 @@ "Sign out": "Sair", "Someone": "Alguém", "Start a chat": "Começar uma conversa", - "Start Chat": "Começar conversa", "Success": "Sucesso", "The email address linked to your account must be entered.": "O endereço de email relacionado a sua conta precisa ser informado.", "This doesn't appear to be a valid email address": "Este não aparenta ser um endereço de email válido", @@ -125,10 +118,8 @@ "VoIP conference started.": "Conferência VoIP iniciada.", "Who can access this room?": "Quem pode acessar esta sala?", "Who can read history?": "Quem pode ler o histórico da sala?", - "Who would you like to communicate with?": "Com quem você gostaria de se comunicar?", "You do not have permission to post to this room": "Você não tem permissão de postar nesta sala", "You have no visible notifications": "Voce não possui notificações visíveis", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Sua senha foi alterada com sucesso. Você não receberá notificações em outros dispositivos até que você logue novamente por eles", "Sun": "Dom", "Mon": "Seg", "Tue": "Ter", @@ -198,7 +189,6 @@ "This room is not recognised.": "Esta sala não é reconhecida.", "This phone number is already in use": "Este número de telefone já está sendo usado", "To use it, just wait for autocomplete results to load and tab through them.": "Para usar esta funcionalidade, espere o carregamento dos resultados de autocompletar e então escolha entre as opções.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ativou criptografia ponta a ponta (algoritmo %(algorithm)s).", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s desfez o banimento de %(targetName)s.", "Unable to capture screen": "Não foi possível capturar a imagem da tela", "Unable to enable Notifications": "Não foi possível ativar as notificações", @@ -236,7 +226,6 @@ "Click to unmute audio": "Clique para retirar áudio do mudo", "Command error": "Erro de comando", "Decrypt %(text)s": "Descriptografar %(text)s", - "Devices": "Dispositivos", "Direct chats": "Conversas pessoais", "Disinvite": "Desconvidar", "Download %(text)s": "Baixar %(text)s", @@ -250,20 +239,13 @@ "Failed to set display name": "Houve falha ao definir o nome público", "Failed to toggle moderator status": "Houve falha ao alterar o status de moderador/a", "Fill screen": "Tela cheia", - "Hide Text Formatting Toolbar": "Ocultar a barra de formatação de texto", "Incorrect verification code": "Código de verificação incorreto", - "Invalid alias format": "Formato de alias é inválido", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' não é um formato válido para um alias", "Join Room": "Ingressar na sala", "Jump to first unread message.": "Ir diretamente para a primeira das mensagens não lidas.", "Kick": "Remover", "Local addresses for this room:": "Endereço local desta sala:", - "Markdown is disabled": "A formatação 'Markdown' está desabilitada", - "Markdown is enabled": "A formatação 'Markdown' está habilitada", - "Message not sent due to unknown devices being present": "A mensagem não foi enviada por causa da presença de dispositivos desconhecidos", "New address (e.g. #foo:%(localDomain)s)": "Novo endereço (p.ex: #algo:%(localDomain)s)", "not specified": "não especificado", - "No devices with registered encryption keys": "Não há dispositivos com chaves de criptografia registradas", "No more results": "Não há mais resultados", "No results": "Sem resultados", "OK": "Ok", @@ -278,7 +260,6 @@ "This room has no local addresses": "Esta sala não tem endereços locais", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Tentei carregar um ponto específico na linha do tempo desta sala, mas parece que você não tem permissões para ver a mensagem em questão.", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Tentei carregar um ponto específico na linha do tempo desta sala, mas não o encontrei.", - "Unable to load device list": "Não foi possível carregar a lista de dispositivos", "Unknown room %(roomId)s": "A sala %(roomId)s é desconhecida", "You seem to be in a call, are you sure you want to quit?": "Parece que você está em uma chamada. Tem certeza que quer sair?", "You seem to be uploading files, are you sure you want to quit?": "Parece que você está enviando arquivos. Tem certeza que quer sair?", @@ -286,19 +267,15 @@ "Make Moderator": "Tornar moderador(a)", "Room": "Sala", "Cancel": "Cancelar", - "bold": "negrito", - "italic": "itálico", "Ban": "Banir", "Access Token:": "Token de acesso:", "Always show message timestamps": "Sempre mostrar as datas das mensagens", "Authentication": "Autenticação", "An error has occurred.": "Ocorreu um erro.", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Alterar a senha irá atualmente apagar todas as chaves de criptografia ponta-a-ponta em todos os dispositivos, fazendo com que o histórico da conversa fique ilegível, a não ser que você exporte antes as chaves de sala e então as reimporte depois. No futuro, isso vai melhorar.", "Email": "Email", "Email address": "Endereço de email", "Error decrypting attachment": "Erro ao descriptografar o anexo", "Invalid file%(extra)s": "Arquivo inválido %(extra)s", - "matrix-react-sdk version:": "versão do matrix-react-sdk:", "Mute": "Mudo", "olm version:": "versão do olm:", "Operation failed": "A operação falhou", @@ -329,18 +306,9 @@ "Unknown error": "Erro desconhecido", "Incorrect password": "Senha incorreta", "To continue, please enter your password.": "Para continuar, por favor insira a sua senha.", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Para verificar que este dispositivo é confiável, por favor entre em contato com a(o) sua(seu) dona(o) usando outros meios, como por exemplo pessoalmente ou por uma chamada telefônica, e pergunte a esta pessoa se a chave que ela está vendo nas suas configurações de usuário para este dispositivo é igual a esta:", - "Device name": "Nome do dispositivo", - "Device key": "Chave do dispositivo", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Se a chave for a mesma, clique no botão \"verificar\" abaixo. Se não for a mesma, então alguma outra pessoa está interceptando este dispositivo e você provavelmente vai querer clicar no botão \"colocar na lista negra\".", - "Verify device": "Verificar o dispositivo", "I verify that the keys match": "Eu confirmo que as chaves são iguais", "Unable to restore session": "Não foi possível restaurar a sessão", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Se você já usou antes uma versão mais recente do Riot, a sua sessão pode ser incompatível com esta versão. Feche esta janela e tente abrir com a versão mais recente.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Você está atualmente bloqueando dispositivos não verificados. Para enviar mensagens para estes dispositivos, você necessita antes verificá-los.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Nós recomendamos que você passe pelo processo de verificação para cada dispositivo para confirmar que eles pertencem às pessoas que efetivamente são suas donas, mas você pode reenviar a mensagem sem verificar isso, se assim o desejar.", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contém dispositivos que você não viu antes.", - "Unknown devices": "Dispositivos desconhecidos", "Unknown Address": "Endereço desconhecido", "Unblacklist": "Tirar da lista de bloqueados", "Blacklist": "Colocar na lista de bloqueados", @@ -371,20 +339,14 @@ "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Este processo faz com que você possa importar as chaves de criptografia que tinha previamente exportado de outro cliente Matrix. Você poderá então descriptografar todas as mensagens que o outro cliente pôde criptografar.", "Start automatically after system login": "Iniciar automaticamente ao iniciar o sistema", "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?": "Você será levado agora a um site de terceiros para poder autenticar a sua conta para uso com o serviço %(integrationsUrl)s. Você quer continuar?", - "Device already verified!": "Dispositivo já verificado!", "Export": "Exportar", "Import": "Importar", "Incorrect username and/or password.": "Nome de usuária(o) e/ou senha incorreto.", "Invited": "Convidada(o)", "Results from DuckDuckGo": "Resultados de DuckDuckGo", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "A chave de assinatura que você forneceu é a mesma que a chave de assinatura que você recebeu do dispositivo %(deviceId)s de %(userId)s . O dispositivo foi portanto marcado como verificado.", - "Unknown (user, device) pair:": "Par usuária(o)-dispositivo desconhecido:", - "Unrecognised command:": "Comando não reconhecido:", "Unrecognised room alias:": "Apelido de sala não reconhecido:", "Use compact timeline layout": "Usar o layout de linha do tempo compacta", "Verified key": "Chave verificada", - "WARNING: Device already verified, but keys do NOT MATCH!": "ATENÇÃO: O dispositivo já foi verificado, mas as chaves NÃO SÃO IGUAIS!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ATENÇÃO: VERIFICAÇÃO DE CHAVE FALHOU! A chave de assinatura para a(o) usuária(o) %(userId)s e dispositivo %(deviceId)s é \"%(fprint)s\", que não é igual à chave fornecida \"%(fingerprint)s\". Isso pode significar que suas comunicações estão sendo interceptadas!", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removeu a imagem da sala.", "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s alterou a imagem da sala %(roomName)s", "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s alterou a imagem da sala para ", @@ -399,9 +361,7 @@ "Anyone": "Qualquer pessoa", "Are you sure you want to leave the room '%(roomName)s'?": "Você tem certeza que deseja sair da sala '%(roomName)s'?", "Custom level": "Nível personalizado", - "Device ID:": "ID do dispositivo:", "device id: ": "id do dispositivo: ", - "Device key:": "Chave do dispositivo:", "Register": "Registre-se", "Remote addresses for this room:": "Endereços remotos para esta sala:", "Save": "Salvar", @@ -437,7 +397,6 @@ "Disable Notifications": "Desabilitar notificações", "Drop File Here": "Arraste o arquivo aqui", "Enable Notifications": "Habilitar notificações", - "Encrypted by an unverified device": "Criptografado por um dispositivo não verificado", "Failed to upload profile picture!": "Falha ao enviar a imagem de perfil!", "Incoming call from %(name)s": "Recebendo chamada de %(name)s", "Incoming video call from %(name)s": "Recebendo chamada de vídeo de %(name)s", @@ -447,16 +406,12 @@ "No display name": "Sem nome público de usuária(o)", "Private Chat": "Conversa privada", "Public Chat": "Conversa pública", - "Room contains unknown devices": "Esta sala contém dispositivos desconhecidos", "%(roomName)s does not exist.": "%(roomName)s não existe.", "%(roomName)s is not accessible at this time.": "%(roomName)s não está acessível neste momento.", "Seen by %(userName)s at %(dateTime)s": "Visto por %(userName)s em %(dateTime)s", "Send anyway": "Enviar de qualquer maneira", - "Show Text Formatting Toolbar": "Exibir barra de formatação de texto", "Start authentication": "Iniciar autenticação", "This room": "Esta sala", - "Undecryptable": "Não é possível descriptografar", - "Unencrypted message": "Mensagem não criptografada", "unknown caller": "a pessoa que está chamando é desconhecida", "Unnamed Room": "Sala sem nome", "Upload new:": "Enviar novo:", @@ -475,8 +430,6 @@ "Start verification": "Iniciar a verificação", "Share without verifying": "Compartilhar sem verificar", "Ignore request": "Ignorar o pedido", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Você adicionou um novo dispositivo '%(displayName)s', que está solicitando chaves de criptografia.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Seu dispositivo não verificado '%(displayName)s' está solicitando chaves de criptografia.", "Encryption key request": "Solicitação de chave de criptografia", "Invite to Community": "Convidar à comunidade", "Restricted": "Restrito", @@ -503,7 +456,6 @@ "The information being sent to us to help make Riot.im better includes:": "As informações que estão sendo enviadas para ajudar a melhorar o Riot.im incluem:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Quando esta página tem informação de identificação, como uma sala, ID de usuária/o ou de grupo, estes dados são removidos antes de serem enviados ao servidor.", "Call Failed": "A chamada falhou", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Há dispositivos desconhecidos nesta sala: se você continuar sem verificá-los, será possível alguém espiar sua chamada.", "Review Devices": "Revisar dispositivos", "Call Anyway": "Ligar assim mesmo", "Answer Anyway": "Responder assim mesmo", @@ -534,8 +486,6 @@ "Enable inline URL previews by default": "Ativar, por padrão, a visualização de resumo de links", "Enable URL previews for this room (only affects you)": "Ativar, para esta sala, a visualização de links (só afeta você)", "Enable URL previews by default for participants in this room": "Ativar, para todas/os as/os integrantes desta sala, a visualização de links", - "Delete %(count)s devices|other": "Removar %(count)s dispositivos", - "Delete %(count)s devices|one": "Remover dispositivo", "Cannot add any more widgets": "Não é possível adicionar novos widgets", "The maximum permitted number of widgets have already been added to this room.": "O número máximo de widgets permitidos já foi atingido nesta sala.", "Add a widget": "Adicionar um widget", @@ -688,7 +638,6 @@ "Community ID": "ID da comunidade", "example": "exemplo", "Create": "Criar", - "Loading device info...": "Carregando informações do dispositivo...", "To get started, please pick a username!": "Para começar, escolha um nome de usuária/o!", "

    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 para a página da sua comunidade

    \n

    \n Use a descrição longa para apresentar a comunidade para novas/os integrantes ou partilhe links importantes.\n

    \n

    \n Você pode até mesmo usar tags 'img' do HTML\n

    \n", "Add rooms to the community summary": "Adicionar salas para o índice da comunidade", @@ -730,7 +679,6 @@ "Error whilst fetching joined communities": "Erro baixando comunidades das quais você faz parte", "Create a new community": "Criar nova comunidade", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Crie uma comunidade para agrupar em um mesmo local pessoas e salas! Monte uma página inicial personalizada para dar uma identidade ao seu espaço no universo Matrix.", - "Show devices, send anyway or cancel.": "Exibir dispositivos, enviar assim mesmo ou cancelar.", "%(count)s of your messages have not been sent.|one": "Sua mensagem não foi enviada.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Reenviar todas ou cancelar todas agora. Você também pode selecionar mensagens individualmente a serem reenviadas ou canceladas.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Reenviar mensagem ou cancelar mensagem agora.", @@ -746,7 +694,6 @@ "Please note you are logging into the %(hs)s server, not matrix.org.": "Note que você está se conectando ao servidor %(hs)s, e não ao servidor matrix.org.", "This homeserver doesn't offer any login flows which are supported by this client.": "Este servidor de base (homeserver) não oferece fluxos de login que funcionem neste cliente.", "Define the power level of a user": "Definir o nível de permissões de um(a) usuário(a)", - "Verifies a user, device, and pubkey tuple": "Verifica um(a) usuário(a), dispositivo ou tuplo da chave pública", "Ignores a user, hiding their messages from you": "Ignora um(a) usuário(a), ocultando suas mensagens de você", "Stops ignoring a user, showing their messages going forward": "Deixa de ignorar um(a) usuário(a), exibindo suas mensagens daqui para frente", "Notify the whole room": "Notifica a sala inteira", @@ -756,11 +703,7 @@ "Failed to add tag %(tagName)s to room": "Falha ao adicionar a tag %(tagName)s para a sala", "Did you know: you can use communities to filter your Riot.im experience!": "Você sabia? Você pode usar as comunidades para filtrar a sua experiência no Riot!", "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Para criar um filtro, arraste a imagem de uma comunidade sobre o painel de filtros na extrema esquerda da sua tela. Você pode clicar na imagem de uma comunidade no painel de filtros a qualquer momento para ver apenas as salas e pessoas associadas com esta comunidade.", - "Your key share request has been sent - please check your other devices for key share requests.": "Seu pedido de confirmação de chaves foi realizado - favor verificar seus outros dispositivos.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Pedidos de confirmação de chaves são enviados aos outros dispositivos automaticamente. Se você rejeitou ou negou uma confirmação de chaves em seus outros dispositivos, clique aqui para enviar novamente.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Se seus outros dispositivos não têm a chave para esta mensagem, você não poderá decriptá-las.", "Key request sent.": "Requisição de chave enviada.", - "Re-request encryption keys from your other devices.": "Requisitar novamente chaves de encriptação de seus outros dispositivos.", "Fetching third party location failed": "Falha ao acessar localização de terceiros", "A new version of Riot is available.": "Uma nova versão do Riot está disponível.", "I understand the risks and wish to continue": "Entendo os riscos e desejo continuar", @@ -808,7 +751,6 @@ "Files": "Arquivos", "Collecting app version information": "Coletando informação sobre a versão do app", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Apagar o apelido %(alias)s da sala e remover %(name)s da lista pública?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Isso permitirá que você possa retornar à sua conta após fazer logout, e também fazer login em outros dispositivos.", "Keywords": "Palavras-chave", "Enable notifications for this account": "Ativar notificações para esta conta", "Invite to this community": "Convidar para essa comunidade", @@ -957,20 +899,13 @@ "Encrypted messages in group chats": "Mensagens criptografadas em bate-papos de grupo", "Delete Backup": "Deletar Backup", "Unable to load key backup status": "Não é possível carregar o status da chave de backup", - "Backup has a valid signature from this device": "O backup tem uma assinatura válida deste dispositivo", "Backup version: ": "Versão do Backup: ", "Algorithm: ": "Algoritmo: ", "This event could not be displayed": "O evento não pôde ser exibido", "Use a longer keyboard pattern with more turns": "Use um padrão de teclas em diferentes direções e sentido", "Share Link to User": "Compartilhar Link com Usuário", - "underlined": "sublinhado", - "inline-code": "código inline", - "numbered-list": "lista ordenada", - "bulleted-list": "lista não-ordenada", "This room has been replaced and is no longer active.": "Esta sala foi substituída e não está mais ativa.", "The conversation continues here.": "A conversa continua aqui.", - "Unable to reply": "Não é possível responder", - "At this time it is not possible to reply with an emote.": "Neste momento não é possível responder com um emote.", "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Visto por %(displayName)s (%(userName)s) em %(dateTime)s", "Share room": "Compartilhar sala", "System Alerts": "Alertas do Sistema", @@ -982,13 +917,6 @@ "You don't currently have any stickerpacks enabled": "Atualmente, você não tem nenhum stickerpacks ativado", "Demote": "Reduzir privilégio", "Demote yourself?": "Reduzir seu próprio privilégio?", - "Backup has a valid signature from verified device ": "O backup tem uma assinatura válida do dispositivo verificado", - "Backup has a valid signature from unverified device ": "O backup tem uma assinatura válida do dispositivo não verificado", - "Backup is not signed by any of your devices": "O backup não está assinado por nenhum dos seus dispositivos", - "deleted": "excluído", - "Backup has an invalid signature from verified device ": "O backup tem uma assinatura inválida do dispositivo verificado ", - "Backup has an invalid signature from unverified device ": "O backup tem uma assinatura inválida do dispositivo não verificado ", - "block-quote": "bloco de citação", "Add some now": "Adicione alguns agora", "Stickerpack": "Stickerpack", "Hide Stickers": "Esconder Stickers", @@ -1067,7 +995,6 @@ "This looks like a valid recovery key!": "Isso parece uma chave de recuperação válida!", "Not a valid recovery key": "Não é uma chave de recuperação válida", "Access your secure message history and set up secure messaging by entering your recovery key.": "Acesse seu histórico seguro de mensagens e configure mensagens seguras inserindo sua chave de recuperação.", - "If you've forgotten your recovery passphrase you can ": "Se você esqueceu sua senha de recuperação, você pode ": "Если вы забыли пароль для восстановления, вы можете ", "Share Permalink": "Поделиться постоянной ссылкой", "Clear status": "Удалить статус", "Update status": "Обновить статус", @@ -1525,13 +1424,11 @@ "Guest": "Гость", "Your profile": "Ваш профиль", "Could not load user profile": "Не удалось загрузить профиль пользователя", - "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "Смена пароля приведет к сбросу любых сквозных ключей шифрования на всех ваших устройствах, что сделает историю зашифрованного чата нечитаемой. Настройте Резервное копирование ключей или экспортируйте ключи от вашей комнаты с другого устройства перед сбросом пароля.", "Your Matrix account on %(serverName)s": "Ваша учётная запись Matrix на %(serverName)s", "Your Matrix account on ": "Ваша учётная запись Matrix на ", "A verification email will be sent to your inbox to confirm setting your new password.": "Письмо с подтверждением будет отправлено на ваш почтовый ящик, чтобы подтвердить установку нового пароля.", "Sign in instead": "Войдите, вместо этого", "Your password has been reset.": "Ваш пароль был сброшен.", - "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Вы вышли из всех устройств и больше не будете получать push-уведомления. Чтобы снова включить уведомления, войдите в систему повторно на каждом устройстве.", "Set a new password": "Установить новый пароль", "Invalid homeserver discovery response": "Неверное обнаружения сервера", "Failed to get autodiscovery configuration from server": "Не удалось получить конфигурацию автообнаружения с сервера", @@ -1567,11 +1464,7 @@ "As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.": "Как сеть безопасности, вы можете использовать ее для восстановления истории зашифрованных сообщений, если вы забыли свой пароль восстановления.", "As a safety net, you can use it to restore your encrypted message history.": "Как сеть безопасности, вы можете использовать ее для восстановления истории зашифрованных сообщений.", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "Ключ восстановления - это сеть безопасности, с помощью которой можно восстановить доступ к зашифрованным сообщениям, если вы забудете пароль.", - "Keep your recovery key somewhere very secure, like a password manager (or a safe)": "Храните ключ восстановления в надежном месте, например в менеджере паролей (или в сейфе)", - "Your Recovery Key has been copied to your clipboard, paste it to:": "Ваш ключ восстановления скопирован в буфер обмена, вставьте его в:", - "Your Recovery Key is in your Downloads folder.": "Ваш ключ восстановления находится в папке Загрузки.", "Print it and store it somewhere safe": "Распечатайте его и храните в безопасном месте", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "Без настройки безопасного восстановления сообщений вы не сможете восстановить историю зашифрованных сообщений, если выйдете из системы или используете другое устройство.", "Secure your backup with a passphrase": "Защитите вашу резервную копию паролем", "Confirm your passphrase": "Подтвердите свой пароль", "Recovery key": "Ключ восстановления", @@ -1580,8 +1473,6 @@ "Retry": "Попробуйте снова", "Without setting up Secure Message Recovery, you'll lose your secure message history when you log out.": "Без настройки безопасного восстановления сообщений при выходе из системы вы потеряете историю защищенных сообщений.", "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.": "Если вы не установили новый метод восстановления, злоумышленник может попытаться получить доступ к вашей учётной записи. Измените пароль учётной записи и сразу установите новый способ восстановления в настройках.", - "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "Это устройство обнаружило, что ваш пароль восстановления и ключ для безопасных сообщений были удалены.", - "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "Если вы сделали это случайно, вы можете настроить безопасные сообщения на этом устройстве, которые будут повторно зашифровать историю сообщений этого устройства с новым методом восстановления.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Если вы не удалили метод восстановления, злоумышленник может попытаться получить доступ к вашей учётной записи. Измените пароль учётной записи и сразу установите новый способ восстановления в настройках.", "Cannot reach homeserver": "Не удаётся связаться с сервером", "Ensure you have a stable internet connection, or get in touch with the server admin": "Убедитесь, что у вас есть стабильное подключение к интернету, или свяжитесь с администратором сервера", @@ -1607,8 +1498,6 @@ "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)sне внёс изменений", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Пожалуйста, расскажите нам что пошло не так, либо, ещё лучше, создайте отчёт в GitHub с описанием проблемы.", "Removing…": "Удаление…", - "Clear all data on this device?": "Очистить все данные на этом устройстве?", - "Clearing all data from this device is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Очистка данных на этом устройстве необратима. Шифрованные сообщения будут утеряны, если не было сделано резервной копии их ключей шифрования.", "Clear all data": "Очистить все данные", "Your homeserver doesn't seem to support this feature.": "Ваш сервер похоже не поддерживает эту возможность.", "Message edits": "Правки сообщения", @@ -1628,18 +1517,15 @@ "Continue with previous account": "Продолжить с предыдущей учётной записью", "Failed to re-authenticate due to a homeserver problem": "Ошибка повторной аутентификации из-за проблем на сервере", "Failed to re-authenticate": "Ошибка повторной аутентификации", - "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.": "Восстановить доступ к Вашей учётной записи и восстановить ключи шифрования, сохранённые на этом устройстве. Без них Вы не сможете читать все ваши зашифрованные сообщения на любом устройстве.", "Enter your password to sign in and regain access to your account.": "Введите Ваш пароль для входа и восстановления доступа к Вашей учётной записи.", "Forgotten your password?": "Забыли Ваш пароль?", "Sign in and regain access to your account.": "Войти и восстановить доступ к Вашей учётной записи.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Вы не можете войти в Вашу учётную запись. Пожалуйста свяжитесь с администратором вашего сервера для более подробной информации.", "You're signed out": "Вы вышли из учётной записи", "Clear personal data": "Очистить персональные данные", - "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.": "Внимание: Ваши персональные данные (включая ключи шифрования) всё ещё хранятся на этом устройстви. Очистите их, если Вы закончили использовать это устройство, либо хотите войти в другую учётную запись.", "This account has been deactivated.": "Этот аккаунт был деактивирован.", "Call failed due to misconfigured server": "Вызов не состоялся из-за неправильно настроенного сервера", "Try using turn.matrix.org": "Попробуйте использовать turn.matrix.org", - "Failed to start chat": "Не удалось начать чат", "Messages": "Сообщения", "Actions": "Действия", "Displays list of commands with usages and descriptions": "Отображает список команд с описанием и использованием", @@ -1683,7 +1569,6 @@ "Create a private room": "Создать приватную комнату", "Topic (optional)": "Тема (опционально)", "Make this room public": "Сделать комнату публичной", - "Use the new, faster, composer for writing messages": "Используйте новый, более быстрый, редактор для написания сообщений", "Send read receipts for messages (requires compatible homeserver to disable)": "Отправлять подтверждения о прочтении сообщений (требуется отключение совместимого домашнего сервера)", "Show previews/thumbnails for images": "Показать превью / миниатюры для изображений", "Disconnect from the identity server and connect to instead?": "Отключиться от сервера идентификации и вместо этого подключиться к ?", @@ -1703,7 +1588,6 @@ "Always show the window menu bar": "Всегда показывать строку меню", "Read Marker lifetime (ms)": "Читать маркер время жизни (мс)", "Read Marker off-screen lifetime (ms)": "Читать маркер вне экрана время жизни (мс)", - "A device's public name is visible to people you communicate with": "Публичное имя устройства видно людям, с которыми вы общаетесь", "Upgrade the room": "Обновить эту комнату", "Enable room encryption": "Включить шифрование комнаты", "You should remove your personal data from identity server before disconnecting. Unfortunately, identity server is currently offline or cannot be reached.": "Вы должны удалить свои личные данные с сервера идентификации перед отключением. К сожалению, идентификационный сервер в данный момент отключен или недоступен.", @@ -1780,7 +1664,6 @@ "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "Используйте идентификационный сервер для приглашения по электронной почте. Используйте значение по умолчанию (%(defaultIdentityServerName)s) или управляйте в Настройках.", "Use an identity server to invite by email. Manage in Settings.": "Используйте идентификационный сервер для приглашения по электронной почте. Управление в Настройки.", "Block users on other matrix homeservers from joining this room (This setting cannot be changed later!)": "Запретить пользователям других Matrix-Серверов присоединяться к этой комнате (этот параметр нельзя изменить позже!)", - "To verify that this device can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Чтобы убедиться, что этому устройству можно доверять, проверьте ключ, который вы видите в настройках пользователя на этом устройстве, соответствует указанному ниже ключу:", "Reporting this message will send its unique 'event ID' to the administrator of your homeserver. If messages in this room are encrypted, your homeserver administrator will not be able to read the message text or view any files or images.": "Отчет о данном сообщении отправит свой уникальный 'event ID' администратору вашего домашнего сервера. Если сообщения в этой комнате зашифрованы, администратор вашего домашнего сервера не сможет прочитать текст сообщения или просмотреть какие-либо файлы или изображения.", "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.": "Отсутствует Капча открытого ключа в конфигурации домашнего сервера. Пожалуйста, сообщите об этом администратору вашего домашнего сервера.", "Set an email for account recovery. Use email or phone to optionally be discoverable by existing contacts.": "Установка адреса электронной почты для восстановления учетной записи. Используйте электронную почту или телефон, чтобы опционально быть обнаруженными существующими контактами.", diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index 8befc3c18c..f6f0cd3a74 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -57,10 +57,6 @@ "Moderator": "Moderátor", "Admin": "Správca", "Start a chat": "Začať konverzáciu", - "Who would you like to communicate with?": "S kým si želáte komunikovať?", - "Start Chat": "Začať konverzáciu", - "Invite new room members": "Pozvať nových členov do miestnosti", - "Send Invites": "Poslať pozvánky", "Operation failed": "Operácia zlyhala", "Failed to invite": "Pozvanie zlyhalo", "Failed to invite the following users to the %(roomName)s room:": "Do miestnosti %(roomName)s sa nepodarilo pozvať nasledujúcich používateľov:", @@ -83,13 +79,7 @@ "You are now ignoring %(userId)s": "Od teraz ignorujete používateľa %(userId)s", "Unignored user": "Ignorácia zrušená", "You are no longer ignoring %(userId)s": "Od teraz viac neignorujete používateľa %(userId)s", - "Unknown (user, device) pair:": "Neznámy pár (používateľ, zariadenie):", - "Device already verified!": "Zariadenie už overené!", - "WARNING: Device already verified, but keys do NOT MATCH!": "POZOR: Zariadenie je už overené, ale kľúče SA NEZHODUJÚ!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "POZOR: OVERENIE KĽÚČOV ZLYHALO! Podpisovací kľúč zo zariadenia %(deviceId)s používateľa %(userId)s je \"%(fprint)s\" čo sa nezhoduje s poskytnutým kľúčom \"%(fingerprint)s\". Mohlo by to znamenať, že vaša komunikácia je práve odpočúvaná!", "Verified key": "Kľúč overený", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Podpisovací kľúč, ktorý ste poskytli súhlasí s podpisovacím kľúčom, ktorý ste dostali zo zariadenia %(deviceId)s používateľa %(userId)s's. Zariadenie je považované za overené.", - "Unrecognised command:": "Nerozpoznaný príkaz:", "Reason": "Dôvod", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s prijal pozvanie do %(displayName)s.", "%(targetName)s accepted an invitation.": "%(targetName)s prijal pozvanie.", @@ -126,7 +116,6 @@ "%(senderName)s made future room history visible to all room members.": "%(senderName)s sprístupnil budúcu históriu miestnosti pre všetkých členov.", "%(senderName)s made future room history visible to anyone.": "%(senderName)s sprístupnil budúcu históriu miestnosti pre každého.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s sprístupnil budúcu históriu miestnosti neznámym (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s povolil E2E šifrovanie (algoritmus %(algorithm)s).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s z %(fromPowerLevel)s na %(toPowerLevel)s", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s zmenil úroveň moci pre %(powerLevelDiffText)s.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s zmenil pripnuté správy pre túto miestnosť.", @@ -159,7 +148,6 @@ "No display name": "Žiadne zobrazované meno", "New passwords don't match": "Nové heslá sa nezhodujú", "Passwords can't be empty": "Heslá nemôžu byť prázdne", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Zmena hesla momentálne obnoví šifrovacie kľúče na všetkých vašich zariadeniach, čo spôsobí, že história vašich šifrovaných konverzácií sa stane nečitateľná, jedine že si pred zmenou hesla exportujete kľúče miestností do súboru a po zmene kľúče importujete naspäť. V budúcnosti bude táto funkcia vylepšená.", "Continue": "Pokračovať", "Export E2E room keys": "Exportovať E2E šifrovacie kľúče miestností", "Do you want to set an email address?": "Želáte si nastaviť emailovú adresu?", @@ -168,7 +156,6 @@ "New Password": "Nové heslo", "Confirm password": "Potvrdiť heslo", "Change Password": "Zmeniť heslo", - "Unable to load device list": "Nie je možné načítať zoznam zariadení", "Device ID": "ID zariadenia", "Last seen": "Naposledy aktívne", "Failed to set display name": "Nepodarilo sa nastaviť zobrazované meno", @@ -187,9 +174,6 @@ "%(senderName)s sent a video": "%(senderName)s poslal video", "%(senderName)s uploaded a file": "%(senderName)s nahral súbor", "Options": "Možnosti", - "Undecryptable": "Nedešifrovateľné", - "Encrypted by an unverified device": "Zašifrované neovereným zariadením", - "Unencrypted message": "Nešifrovaná správa", "Please select the destination room for this message": "Prosím, vyberte cieľovú miestnosť pre túto správu", "Blacklisted": "Na čiernej listine", "device id: ": "ID zariadenia: ", @@ -208,8 +192,6 @@ "Failed to change power level": "Nepodarilo sa zmeniť úroveň moci", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Túto zmenu nebudete môcť vrátiť späť pretože tomuto používateľovi udeľujete rovnakú úroveň moci, akú máte vy.", "Are you sure?": "Ste si istí?", - "No devices with registered encryption keys": "Žiadne zariadenia so zaregistrovanými šifrovacími kľúčmi", - "Devices": "Zariadenia", "Unignore": "Prestať ignorovať", "Ignore": "Ignorovať", "Jump to read receipt": "Preskočiť na potvrdenie o prečítaní", @@ -232,16 +214,10 @@ "Voice call": "Audio hovor", "Video call": "Video hovor", "Upload file": "Nahrať súbor", - "Show Text Formatting Toolbar": "Zobraziť lištu formátovania textu", "You do not have permission to post to this room": "Nemáte povolenie posielať do tejto miestnosti", - "Hide Text Formatting Toolbar": "Skryť lištu formátovania textu", "Server error": "Chyba servera", "Server unavailable, overloaded, or something else went wrong.": "Server je nedostupný, preťažený, alebo sa pokazilo niečo iné.", "Command error": "Chyba príkazu", - "bold": "tučné", - "italic": "kurzíva", - "Markdown is disabled": "Markdown je zakázaný", - "Markdown is enabled": "Markdown je povolený", "Unpin Message": "Zrušiť pripnutie správy", "Jump to message": "Preskočiť na správu", "No pinned messages.": "Žiadne pripnuté správy.", @@ -267,7 +243,6 @@ "Community Invites": "Pozvánky do komunity", "Invites": "Pozvánky", "Favourites": "Obľúbené", - "People": "Ľudia", "Rooms": "Miestnosti", "Low priority": "Nízka priorita", "Historical": "Historické", @@ -278,7 +253,6 @@ "Banned by %(displayName)s": "Vstup zakázal %(displayName)s", "unknown error code": "neznámy kód chyby", "Failed to forget room %(errCode)s": "Nepodarilo sa zabudnúť miestnosť %(errCode)s", - "Never send encrypted messages to unverified devices in this room from this device": "Z tohoto zariadenia nikdy v tejto miestnosti neposielať šifrované správy na neoverené zariadenia", "Privileged Users": "Poverení používatelia", "No users have specific privileges in this room": "Žiadny používatelia nemajú v tejto miestnosti pridelené konkrétne poverenia", "Banned users": "Používatelia, ktorým bol zakázaný vstup", @@ -304,8 +278,6 @@ "Cancel": "Zrušiť", "Jump to first unread message.": "Preskočiť na prvú neprečítanú správu.", "Close": "Zatvoriť", - "Invalid alias format": "Nesprávny formát aliasu", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' nie je platný formát pre alias", "not specified": "nezadané", "Remote addresses for this room:": "Vzdialené adresy do tejto miestnosti:", "Local addresses for this room:": "Lokálne adresy do tejto miestnosti:", @@ -458,20 +430,12 @@ "Unknown error": "Neznáma chyba", "Incorrect password": "Nesprávne heslo", "Deactivate Account": "Deaktivovať účet", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Ak chcete overiť, či toto zariadenie je skutočne dôverihodné, kontaktujte jeho vlastníka iným spôsobom (napr. osobne alebo cez telefón) a opýtajte sa ho, či kľúč, ktorý má pre toto zariadenie zobrazený v nastaveniach sa zhoduje s kľúčom zobrazeným nižšie:", - "Device name": "Názov zariadenia", - "Device key": "Kľúč zariadenia", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Ak sa kľúče zhodujú, stlačte tlačidlo Overiť nižšie. Ak sa nezhodujú, niekto ďalší odpočúva toto zariadenie a v takomto prípade by ste asi mali namiesto toho stlačiť tlačidlo Pridať na čiernu listinu.", - "Verify device": "Overiť zariadenie", "I verify that the keys match": "Overil som, kľúče sa zhodujú", "An error has occurred.": "Vyskytla sa chyba.", "OK": "OK", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Pridali ste nové zariadenie nazvané '%(displayName)s', ktoré žiada o šifrovacie kľúče.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Vaše neoverené zariadenie nazvané '%(displayName)s' žiada o šifrovacie kľúče.", "Start verification": "Spustiť overenie", "Share without verifying": "Zdieľať bez overenia", "Ignore request": "Ignorovať žiadosť", - "Loading device info...": "Načítanie informácií o zariadení…", "Encryption key request": "Žiadosť o šifrovacie kľúče", "Unable to restore session": "Nie je možné obnoviť reláciu", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Ak ste sa v minulosti prihlásili s novšou verziou programu Riot, vaša relácia nemusí byť kompatibilná s touto verziou. Zatvorte prosím toto okno a vráťte sa cez najnovšiu verziu Riot.", @@ -490,11 +454,6 @@ "To get started, please pick a username!": "Začnite tým, že si zvolíte používateľské meno!", "This will be your account name on the homeserver, or you can pick a different server.": "Toto bude názov vašeho účtu na domovskom serveri , alebo si môžete zvoliť iný server.", "If you already have a Matrix account you can log in instead.": "Ak už máte Matrix účet, môžete sa hneď Prihlásiť.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Momentálne sa ku všetkym neovereným zariadeniam správate ako by boli na čiernej listine; aby ste na tieto zariadenia mohli posielať správy, mali by ste ich overiť.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Odporúčame vám prejsť procesom overenia pre všetky tieto zariadenia aby ste si potvrdili, že skutočne patria ich pravým vlastníkom, ak si to však želáte, môžete tiež znovu poslať správu bez overovania.", - "Room contains unknown devices": "V miestnosti sú neznáme zariadenia", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "V miestnosti \"%(RoomName)s\" sa našli zariadenia, s ktorými ste doposiaľ nikdy nekomunikovali.", - "Unknown devices": "Neznáme zariadenia", "Send anyway": "Napriek tomu odoslať", "Private Chat": "Súkromná konverzácia", "Public Chat": "Verejná konverzácia", @@ -559,7 +518,6 @@ "You seem to be uploading files, are you sure you want to quit?": "Zdá sa, že práve nahrávate súbory, ste si istí, že chcete skončiť?", "You seem to be in a call, are you sure you want to quit?": "Zdá sa, že máte prebiehajúci hovor, ste si istí, že chcete skončiť?", "%(count)s of your messages have not been sent.|other": "Niektoré vaše správy ešte neboli odoslané.", - "Message not sent due to unknown devices being present": "Neodoslaná správa kvôli nájdeným neznámym zariadeniam", "Search failed": "Hľadanie zlyhalo", "Server may be unavailable, overloaded, or search timed out :(": "Server môže byť nedostupný, preťažený, alebo vypršal časový limit hľadania :(", "No more results": "Žiadne ďalšie výsledky", @@ -584,19 +542,15 @@ "Enable automatic language detection for syntax highlighting": "Povoliť automatickú detegciu jazyka pre zvýrazňovanie syntaxe", "Automatically replace plain text Emoji": "Automaticky nahrádzať textové Emoji", "Mirror local video feed": "Zrkadliť lokálne video", - "Never send encrypted messages to unverified devices from this device": "Z tohoto zariadenia nikdy neposielať šifrované správy neovereným zariadeniam", "Light theme": "Svetlý vzhľad", "Dark theme": "Tmavý vzhľad", "Sign out": "Odhlásiť sa", "Failed to change password. Is your password correct?": "Nepodarilo sa zmeniť heslo. Zadali ste správne heslo?", "Success": "Úspech", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Úspešne ste si zmenili heslo. Na ostatných zariadeniach sa vám nebudú zobrazovať okamžité oznámenia, kým sa aj na nich opätovne neprihlásite", "Unable to remove contact information": "Nie je možné odstrániť kontaktné informácie", "": "", "Import E2E room keys": "Importovať E2E šifrovacie kľúče miestností", "Cryptography": "Kryptografia", - "Device ID:": "ID zariadenia:", - "Device key:": "Kľúč zariadenia:", "Analytics": "Analytické údaje", "Riot collects anonymous analytics to allow us to improve the application.": "Riot zbiera anonymné analytické údaje, čo nám umožňuje aplikáciu ďalej zlepšovať.", "Labs": "Experimenty", @@ -618,7 +572,6 @@ "click to reveal": "Odkryjete kliknutím", "Homeserver is": "Domovský server je", "Identity Server is": "Server totožností je", - "matrix-react-sdk version:": "Verzia matrix-react-sdk:", "riot-web version:": "Verzia riot-web:", "olm version:": "Verzia olm:", "Failed to send email": "Nepodarilo sa odoslať email", @@ -647,7 +600,6 @@ "Kicks user with given id": "Vykáže používateľa so zadaným ID", "Changes your display nickname": "Zmení vaše zobrazované meno", "Searches DuckDuckGo for results": "Vyhľadá výsledky na DuckDuckGo", - "Verifies a user, device, and pubkey tuple": "Overí zadané údaje používateľa, zariadenie a verejný kľúč", "Ignores a user, hiding their messages from you": "Ignoruje používateľa a skrije všetky jeho správy", "Stops ignoring a user, showing their messages going forward": "Prestane ignorovať používateľa a začne zobrazovať jeho správy", "Commands": "Príkazy", @@ -671,7 +623,6 @@ "Session ID": "ID relácie", "End-to-end encryption information": "Informácie o šifrovaní E2E", "Event information": "Informácie o udalosti", - "Sender device information": "Informácie o zariadení odosielateľa", "Passphrases must match": "Heslá sa musia zhodovať", "Passphrase must not be empty": "Heslo nesmie byť prázdne", "Export room keys": "Exportovať kľúče miestností", @@ -695,15 +646,12 @@ "URL previews are disabled by default for participants in this room.": "Náhľady URL adries sú predvolene zakázané pre členov tejto miestnosti.", "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Okrem vás v tejto miestnosti nie je nik iný! Želáte si Pozvať ďalších alebo Prestať upozorňovať na prázdnu miestnosť?", "Call Failed": "Zlyhanie hovoru", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "V tejto miestnosti sú neznáme zariadenia: Ak budete pokračovať bez ich overenia, niekto získa možnosť odpočúvať váš hovor.", "Review Devices": "Prezrieť zariadenia", "Call Anyway": "Napriek tomu zavolať", "Answer Anyway": "Napriek tomu prijať", "Call": "Hovor", "Answer": "Prijať", "Send": "Odoslať", - "Delete %(count)s devices|other": "Vymazať %(count)s zariadení", - "Delete %(count)s devices|one": "Vymazať zariadenie", "%(duration)ss": "%(duration)ss", "%(duration)sm": "%(duration)sm", "%(duration)sh": "%(duration)sh", @@ -752,12 +700,7 @@ "Failed to add tag %(tagName)s to room": "Miestnosti sa nepodarilo pridať značku %(tagName)s", "In reply to ": "Odpoveď na ", "Community IDs cannot be empty.": "ID komunity nemôže ostať prázdne.", - "Show devices, send anyway or cancel.": "Zobraziť zariadenia, napriek tomu odoslať alebo zrušiť.", - "Your key share request has been sent - please check your other devices for key share requests.": "Žiadosť o zdieľanie kľúčov bola odoslaná - Overte si zobrazenie žiadosti o zdieľanie kľúčov na vašich ostatných zariadeniach.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Žiadosť o zdieľanie kľúčov je automaticky odoslaná na vaše ďalšie zariadenia. Ak ste žiadosť odmietli alebo zrušili dialógové okno so žiadosťou na ostatných zariadeniach, kliknutím sem môžete opätovne vyžiadať kľúče pre túto reláciu.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Ak kľúče pre tieto správy nemáte uložené na ostatných vašich zariadeniach, nebudete ich môcť dešifrovať.", "Key request sent.": "Žiadosť o kľúče odoslaná.", - "Re-request encryption keys from your other devices.": "Znovu vyžiadať šifrovacie kľúče z vašich ostatných zariadení.", "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "%(displayName)s (%(userName)s) videl %(dateTime)s", "Code": "Kód", "Unable to join community": "Nie je možné vstúpiť do komunity", @@ -823,7 +766,6 @@ "Noisy": "Hlučné", "Collecting app version information": "Získavajú sa informácie o verzii aplikácii", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Vymazať alias %(alias)s a odstrániť miestnosť %(name)s z adresára?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Toto vám v budúcnosti umožní vrátiť sa k vašemu účtu aj po odhlásení, alebo tiež prihlásiť sa na iných zariadeniach.", "Keywords": "Kľúčové slová", "Enable notifications for this account": "Povoliť oznámenia pre tento účet", "Invite to this community": "Pozvať do tejto komunity", @@ -913,8 +855,6 @@ "Popout widget": "Otvoriť widget v novom okne", "Missing roomId.": "Chýba ID miestnosti.", "Always show encryption icons": "Vždy zobrazovať ikony stavu šifrovania", - "Unable to reply": "Nie je možné odpovedať", - "At this time it is not possible to reply with an emote.": "V odpovedi zatiaľ nie je možné vijadriť pocit.", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Nie je možné načítať udalosť odkazovanú v odpovedi. Takáto udalosť buď neexistuje alebo nemáte povolenie na jej zobrazenie.", "Send Logs": "Odoslať záznamy", "Clear Storage and Sign Out": "Vymazať úložisko a Odhlásiť sa", @@ -964,12 +904,6 @@ "This event could not be displayed": "Nie je možné zobraziť túto udalosť", "Demote yourself?": "Znížiť vlastnú úroveň moci?", "Demote": "Znížiť", - "deleted": "Odstránené", - "underlined": "Podčiarknuté", - "inline-code": "Vnorený kód", - "block-quote": "Citácia", - "bulleted-list": "Odrážkový zoznam", - "numbered-list": "Číselný zoznam", "Failed to remove widget": "Nepodarilo sa odstrániť widget", "An error ocurred whilst trying to remove the widget from the room": "Pri odstraňovaní widgetu z miestnosti sa vyskytla chyba", "You can't send any messages until you review and agree to our terms and conditions.": "Nemôžete posielať žiadne správy, kým si neprečítate a neodsúhlasíte naše zmluvné podmienky.", @@ -1056,12 +990,6 @@ "Encrypted messages in group chats": "Šifrované správy v skupinových konverzáciách", "Delete Backup": "Vymazať zálohu", "Unable to load key backup status": "Nie je možné načítať stav zálohy kľúčov", - "Backup has a valid signature from this device": "Záloha je podpísaná platným kľúčom z tohoto zariadenia", - "Backup has a valid signature from verified device ": "Podpis zálohy je platný a pochádza z overeného zariadenia ", - "Backup has a valid signature from unverified device ": "Podpis zálohy je platný a pochádza z neovereného zariadenia ", - "Backup has an invalid signature from verified device ": "Podpis zálohy je neplatný a pochádza z overeného zariadenia ", - "Backup has an invalid signature from unverified device ": "Záloha je podpísaná neplatným kľúčom z neovereného zariadenia ", - "Backup is not signed by any of your devices": "Záloha nie je podpísaná žiadnym z vašich zariadení", "Backup version: ": "Verzia zálohy: ", "Algorithm: ": "Algoritmus: ", "Don't ask again": "Viac sa nepýtať", @@ -1102,7 +1030,6 @@ "This looks like a valid recovery key!": "Zdá sa, že toto je platný kľúč obnovenia!", "Not a valid recovery key": "Neplatný kľúč obnovenia", "Access your secure message history and set up secure messaging by entering your recovery key.": "Zabezpečte svoju komunikáciu a prístup k šifrovanej histórii konverzácií zadaním kľúča obnovenia.", - "If you've forgotten your recovery passphrase you can ": "Ak ste zabudli heslo obnovenia, ", "Set a new status...": "Nastaviť nový stav…", "Clear status": "Zrušiť stav", "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "Ste správcom tejto komunity. Nebudete môcť znovu vstúpiť bez pozvania od iného správcu.", @@ -1122,12 +1049,9 @@ "Your Recovery Key": "Váš kľúč obnovenia", "Copy to clipboard": "Kopírovať do schránky", "Download": "Stiahnuť", - "Your Recovery Key has been copied to your clipboard, paste it to:": "Váš kľúč obnovenia bol skopírovaný do schránky, vložte ho do:", - "Your Recovery Key is in your Downloads folder.": "Váš kľúč obnovenia je uložený v priečinku so stiahnutými súbormi.", "Print it and store it somewhere safe": "Vytlačte si ho a uchovajte na bezpečnom mieste", "Save it on a USB key or backup drive": "Uložte si ho na USB kľúč alebo iné zálohovacie médium", "Copy it to your personal cloud storage": "Skopírujte si ho na osobné úložisko v cloude", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "Ak si nenastavíte bezpečné obnovenie správ, nebudete si môcť po odhlásení alebo prihlásení sa na inom zariadení čítať históriu šifrovaných konverzácií.", "Set up Secure Message Recovery": "Nastaviť bezpečné obnovenie správ", "Keep it safe": "Bezpečne ho uchovajte", "Create Key Backup": "Vytvoriť zálohu kľúčov", @@ -1186,7 +1110,6 @@ "Verify this user by confirming the following emoji appear on their screen.": "Overte tohoto používateľa tým, že zistíte, či sa na jeho obrazovke objaví nasledujúci emoji.", "Verify this user by confirming the following number appears on their screen.": "Overte tohoto používateľa tým, že zistíte, či sa na jeho obrazovke objaví nasledujúce číslo.", "Unable to find a supported verification method.": "Nie je možné nájsť podporovanú metódu overenia.", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "Pre zachovanie maximálnej bezpečnosti odporúčame, aby ste toto vykonali osobne, alebo použili iný dôverihodný komunikačný kanál.", "Dog": "Hlava psa", "Cat": "Hlava mačky", "Lion": "Hlava leva", @@ -1233,7 +1156,6 @@ "Pencil": "Ceruzka", "Paperclip": "Sponka na papier", "Scissors": "Nožnice", - "Padlock": "Zatvorená zámka", "Key": "Kľúč", "Hammer": "Kladivo", "Telephone": "Telefón", @@ -1251,7 +1173,6 @@ "Headphones": "Slúchadlá", "Folder": "Fascikel", "Pin": "Špendlík", - "Your homeserver does not support device management.": "Váš domovský server nepodporuje správu zariadení.", "Yes": "Áno", "No": "Nie", "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "Poslali sme vám email, aby sme mohli overiť vašu adresu. Postupujte podľa odoslaných inštrukcií a potom klepnite na nižšie zobrazené tlačidlo.", @@ -1259,20 +1180,15 @@ "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Ste si istí? Ak nemáte správne zálohované šifrovacie kľúče, prídete o históriu šifrovaných konverzácií.", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Šifrované správy sú zabezpečené E2E šifrov. Ku kľúčom potrebných na ich čítanie máte prístup len vy a ich adresát(i).", "Restore from Backup": "Obnoviť zo zálohy", - "This device is backing up your keys. ": "Kľúče z tohoto zariadenia sú zálohované. ", "Back up your keys before signing out to avoid losing them.": "Zálohujte si šifrovacie kľúče pred odhlásením, aby ste zabránili ich strate.", "Backing up %(sessionsRemaining)s keys...": "Zálohovanie %(sessionsRemaining)s kľúčov…", "All keys backed up": "Všetky kľúče sú zálohované", - "Backup has a signature from unknown device with ID %(deviceId)s.": "Podpis zálohy pochádza z neznámeho zariadenia ID %(deviceId)s.", - "This backup is trusted because it has been restored on this device": "Táto záloha je dôverihodná, pretože ste z nej obnovili kľúče v tomto zariadení", - "Your keys are not being backed up from this device.": "Kľúče z tohoto zariadenia nemáte zálohované.", "Start using Key Backup": "Začnite používať zálohovanie kľúčov", "Add an email address to configure email notifications": "Oznámenia emailom nastavíte pridaním emailovej adresy", "Unable to verify phone number.": "Nie je možné overiť telefónne číslo.", "Verification code": "Overovací kód", "Phone Number": "Telefónne číslo", "Profile picture": "Obrázok v profile", - "Upload profile picture": "Nahrať obrázok v profile", "Upgrade to your own domain": "Použiť vlastnú doménu", "Display Name": "Zobrazované meno", "Set a new account password...": "Nastaviť nové heslo k účtu…", @@ -1335,10 +1251,6 @@ "Encryption": "Šifrovanie", "Once enabled, encryption cannot be disabled.": "Po aktivovaní šifrovanie nie je možné deaktivovať.", "Encrypted": "Zašifrované", - "Some devices for this user are not trusted": "Niektoré zariadenia tohoto používateľa nie sú dôverihodné", - "Some devices in this encrypted room are not trusted": "Niektoré zariadenia v tejto šifrovanej miestnosti nie sú dôverihodné", - "All devices for this user are trusted": "Všetky zariadenia tohoto používateľa sú dôverihodné", - "All devices in this encrypted room are trusted": "Všetky zariadenia v tejto šifrovanej miestnosti sú dôverihodné", "Never lose encrypted messages": "Nikdy neprídete o zašifrované správy", "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Správy v tejto miestnosti sú zabezpečené E2E šifrov. Ku kľúčom potrebných na ich čítanie máte prístup len vy a ich adresát(i).", "Securely back up your keys to avoid losing them. Learn more.": "Bezpečne si zálohujte šifrovacie kľúče, aby ste o ne neprišli. Zistiť viac.", @@ -1354,8 +1266,6 @@ "Error updating flair": "Chyba pri aktualizácii zobrazenia členstva", "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "Pri aktualizácii zobrazenia členstva v skupinách v tejto miestnosti nastala chyba. Nie je to povolené na servery, alebo sa jedná o dočasný problém.", "Room avatar": "Obrázok miestnosti", - "Upload room avatar": "Nahrať obrázok miestnosti", - "No room avatar": "Žiadny obrázok miestnosti", "Room Name": "Názov miestnosti", "Room Topic": "Téma miestnosti", "Join": "Vstúpiť", @@ -1367,7 +1277,6 @@ "Nothing appearing? Not all clients support interactive verification yet. .": "Nič sa nezobrazuje? Ešte nie všetky aplikácie podporujú interaktívne overenie. .", "Use two-way text verification": "Použiť obojsmerné textové overenie", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Overte tohoto používateľa a označte ho ako dôveryhodného. Dôverovanie používateľov pridáva pokoj na duši pri posielaní E2E šifrovaných správ.", - "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "Overením tohoto používateľa označíte jeho zariadenia ako dôverihodné pre vás a vaše zariadenia ako dôverihodné pre neho.", "Waiting for partner to confirm...": "Čakanie na potvrdenie od partnera…", "Incoming Verification Request": "Prichádzajúca žiadosť o overenie", "I don't want my encrypted messages": "Nezáleží mi na zašifrovaných správach", @@ -1418,12 +1327,10 @@ "This homeserver does not support communities": "Tento domovský server nepodporuje komunity", "Guest": "Hosť", "Could not load user profile": "Nie je možné načítať profil používateľa", - "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "Zmena hesla spôsobí obnovenie E2E šifrovacích kľúčov na všetkých vašich zariadeniach a história šifrovaných konverzácií sa tak pre vás môže stať nečitateľná. Pred obnovením hesla si prosím nastavte zálohovanie šifrovacích kľúčov alebo si E2E kľúče exportujte na inom zariadení.", "Your Matrix account on %(serverName)s": "Váš Matrix účet na serveri %(serverName)s", "A verification email will be sent to your inbox to confirm setting your new password.": "Na emailovú adresu vám odošleme overovaciu správu, aby bolo možné potvrdiť nastavenie vašeho nového hesla.", "Sign in instead": "Radšej sa prihlásiť", "Your password has been reset.": "Vaše heslo bolo obnovené.", - "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Boli ste odhlásení zo všetkých zariadení a nebudú sa vám viac zobrazovať okamžité oznámenia. Ak chcete zobrazovať oznámenia, musíte sa na každom zariadení znovu prihlásiť.", "Set a new password": "Nastaviť nové heslo", "This homeserver does not support login using email address.": "Tento domovský server nepodporuje prihlásenie sa zadaním emailovej adresy.", "Create account": "Vytvoriť účet", @@ -1436,7 +1343,6 @@ "Set up with a Recovery Key": "Nastaviť použitím kľúča obnovenia", "Please enter your passphrase a second time to confirm.": "Prosím zadajte heslo obnovenia ešte raz pre potvrdenie.", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "Kľúč obnovenia je bezpečnostný mechanizmus - môžete ho použiť na prístup k šifrovacím kľúčom v prípade, ak zabudnete vaše heslo obnovenia.", - "Keep your recovery key somewhere very secure, like a password manager (or a safe)": "Kľúč obnovenia si bezpečne uchovajte, použite napr. správcu hesiel (alebo ho schovajte v trezore)", "Your keys are being backed up (the first backup could take a few minutes).": "Zálohovanie kľúčov máte aktívne (prvé zálohovanie môže trvať niekoľko minút).", "Secure your backup with a passphrase": "Zabezpečte si zálohu zadaním hesla obnovenia", "Confirm your passphrase": "Potvrdiť heslo obnovenia", @@ -1444,10 +1350,7 @@ "Starting backup...": "Začína sa zálohovanie…", "Success!": "Hotovo!", "A new recovery passphrase and key for Secure Messages have been detected.": "Boli zistené nový kľúč a nové heslo obnovenia zálohovania šifrovacích kľúčov.", - "This device is encrypting history using the new recovery method.": "Toto zariadenie šifruje históriu použitím novej metódy obnovenia.", "Recovery Method Removed": "Odstránený spôsob obnovenia", - "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "Na tomto zariadení bolo zistené, že heslo a kľúč obnovenia šifrovacích kľúčov zo zálohy boli odstránené.", - "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "Ak ste ich odstránili omylom, môžete si obnovenie nastaviť znovu, čo zašifruje zálohy použitím novej metódy.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Ak ste spôsob obnovenia neodstránili vy, útočník sa pravdepodobne usiluje dostať k vašemu účtu. Zmente si prosím heslo na prihlásenie do Matrix účtu a znovu si ihneď nastavte možnosti obnovenia.", "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Či používate alebo nie funkcionalitu známu ako „omrvinky“ (obrázky nad zoznamom miestností)", "Call failed due to misconfigured server": "Hovor zlyhal kvôli nesprávne nakonfigurovanému serveru", @@ -1460,16 +1363,9 @@ "The file '%(fileName)s' failed to upload.": "Nepodarilo sa nahrať súbor „%(fileName)s“.", "The server does not support the room version specified.": "Server nepodporuje zadanú verziu miestnosti.", "Name or Matrix ID": "Meno alebo Matrix ID", - "Email, name or Matrix ID": "Email, meno alebo Matrix ID", - "Failed to start chat": "Nepodarilo sa začať konverzáciu", "Messages": "Správy", "Actions": "Akcie", - "Room upgrade confirmation": "Potvrdenie aktualizácii miestnosti", - "Upgrading a room can be destructive and isn't always necessary.": "Aktualizácia miestnosti nemusí byť bez následkov a nie je vždy nevyhnutná.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Aktualizácie miestnosti sú obyčajne odporúčané, keď je konkrétna verzia považovaná za nestabilnú. Nestabilné verzie miestností môžu obsahovať chyby, chýbajúce vlastnosti, alebo bezpečnostné zraniteľnosti.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Aktualizácie miestnosti majú vplyv len na spracovanie miestnosti na servery. Ak máte problémy s programom Riot, prosím nahláste chybu .", "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.": "Pozor: Aktualizáciou miestnosti do novej verzii neprenesiete členov miestnosti. Konverzácia v starej verzii miestnosti bude ukončená odkazom do novej verzii miestnosti - členovia budú môcť vstúpiť do novej verzii miestnosti kliknutím na tento odkaz.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Prosím, potvrďte, či naozaj chcete aktualizovať túto miestnosť z na .", "Changes your avatar in this current room only": "Zmení váš obrázok len pre túto miestnosť", "Changes your avatar in all rooms": "Zmení váš obrázok vo všetkých miestnostiach", "Unbans user with given ID": "Zruší zákaz vstúpiť používateľovi so zadaným ID", @@ -1501,12 +1397,6 @@ "Accept to continue:": "Ak chcete pokračovať, musíte prijať :", "ID": "ID", "Public Name": "Verejný názov", - "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Toto zariadenie nezálohuje vaše šifrovacie kľúče, ale máte existujúcu zálohu, z ktorej môžete kľúče obnoviť a pokračovať v zálohovaní.", - "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Nastavte zálohu šifrovacích kľúčov pred odhlásením, aby ste neprišli o kľúče, ktoré máte uložené len v tomto zariadení.", - "Connect this device to Key Backup": "Nastaviť zálohovanie kľúčov", - "Backup has an invalid signature from this device": "Podpis zálohy z tohoto zariadenia nie je platný", - "Enable desktop notifications for this device": "Povoliť oznámenia na pracovnej ploche pre toto zariadenie", - "Enable audible notifications for this device": "Povoliť zvukové oznámenia pre toto zariadenie", "Identity Server URL must be HTTPS": "URL adresa servera totožností musí začínať HTTPS", "Not a valid Identity Server (status code %(code)s)": "Toto nie je funkčný server totožností (kód stavu %(code)s)", "Could not connect to Identity Server": "Nie je možné sa pripojiť k serveru totožností", @@ -1553,10 +1443,7 @@ "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", "Multiple integration managers": "Viacej integračných serverov", "Try out new ways to ignore people (experimental)": "Vyskúšajte si nový spôsob ignorovania používateľov (experiment)", - "Send verification requests in direct message, including a new verification UX in the member panel.": "Požiadavky na overenie používateľov posielať v priamych konverzáciách, zahŕňa tiež nové rozhranie overenia v zozname používateľov.", - "Enable cross-signing to verify per-user instead of per-device (in development)": "Povoliť podpisovanie naprieč zariadeniami, umožňuje overovanie používateľov namiesto ich zariadení (vo vývoji)", "Enable local event indexing and E2EE search (requires restart)": "Povoliť lokálne indexovanie udalostí a vyhľadávanie v šifrovaných miestnostiach", - "Use the new, faster, composer for writing messages": "Používať nový, rýchly, editor pri písaní správ", "Match system theme": "Prispôsobiť sa vzhľadu systému", "Send read receipts for messages (requires compatible homeserver to disable)": "Odosielať potvrdenia o prečítaní správ (na zakázanie je vyžadovaný kompatibilný domovský server)", "Show previews/thumbnails for images": "Zobrazovať ukážky/náhľady obrázkov", @@ -1566,11 +1453,9 @@ "This is your list of users/servers you have blocked - don't leave the room!": "Toto je zoznam používateľov / serverov, ktorých ste zablokovali - neopúšťajte miestnosť!", "Upload": "Nahrať", "Cross-signing and secret storage are enabled.": "Podpisovanie naprieč zariadeniami a bezpečné úložisko sú aktívne.", - "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this device.": "Na bezpečnom úložisku vo vašom účte máte uloženú totožnosť podpisovania naprieč zariadeniami, ale v tomto zariadení zatiaľ tejto totožnosti nedôverujete.", "Cross-signing and secret storage are not yet set up.": "Podpisovanie naprieč zariadeniami a bezpečné úložisko zatiaľ nie sú nastavené.", "Bootstrap cross-signing and secret storage": "Zaviesť podpisovanie naprieč zariadeniami a bezpečné úložisko", "Cross-signing public keys:": "Verejné kľúče podpisovania naprieč zariadeniami:", - "on device": "na zariadení", "not found": "nenájdené", "Cross-signing private keys:": "Súkromné kľúče podpisovania naprieč zariadeniami:", "in secret storage": "na bezpečnom úložisku", @@ -1583,10 +1468,7 @@ "Backup has a valid signature from this user": "Záloha je podpísaná platným kľúčom od tohoto používateľa", "Backup has a invalid signature from this user": "Záloha je podpísaná neplatným kľúčom od tohoto používateľa", "Backup has a signature from unknown user with ID %(deviceId)s": "Podpis zálohy pochádza od neznámeho používateľa ID %(deviceId)s", - "Backup has a signature from unknown device with ID %(deviceId)s": "Podpis zálohy pochádza z neznámeho zariadenia ID %(deviceId)s", - "Backup key stored in secret storage, but this feature is not enabled on this device. Please enable cross-signing in Labs to modify key backup state.": "Záloha kľúčov je uložená na bezpečnom úložisku, ale funkcia podpisovanie naprieč zariadeniami nie je na tomto zariadení aktívna. Ak chcete zmeniť stav zálohy kľúčov, zapnite podpisovanie naprieč zariadeniami v časti experimenty.", "Backup key stored: ": "Záloha kľúčov uložená: ", - "Start using Key Backup with Secure Secret Storage": "Začnite používať zálohu kľúčov na bezpečnom úložisku", "Clear notifications": "Vymazať oznámenia", "Change identity server": "Zmeniť server totožností", "Disconnect from the identity server and connect to instead?": "Naozaj si želáte odpojiť od servera totožností a pripojiť sa namiesto toho k serveru ?", diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index db687780f4..eb0e8653cd 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -13,7 +13,6 @@ "The information being sent to us to help make Riot.im better includes:": "Të dhënat që na dërgohen për të na ndihmuar ta bëjmë më të mirë Riot.im-in përfshijnë:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Kur kjo faqe përfshin të dhëna të identifikueshme, të tilla si një ID dhome përdoruesi apo grupi, këto të dhëna hiqen përpara se të dërgohet te shërbyesi.", "Call Failed": "Thirrja Dështoi", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Në këtë dhomë ka pajisje të panjohura: nëse vazhdoni pa i verifikuar ato, për dikë do të jetë e mundur të përgjojë thirrjen tuaj.", "Review Devices": "Shqyrtoni Pajisje", "Call Anyway": "Thirre Sido Qoftë", "Answer Anyway": "Përgjigju Sido Qoftë", @@ -79,10 +78,6 @@ "Moderator": "Moderator", "Admin": "Përgjegjës", "Start a chat": "Nisni një fjalosje", - "Who would you like to communicate with?": "Me kë do të donit të komunikonit?", - "Start Chat": "Filloni Fjalosje", - "Invite new room members": "Ftoni anëtarë të rinj dhome", - "Send Invites": "Dërgoni Ftesa", "Operation failed": "Veprimi dështoi", "Failed to invite": "S’u arrit të ftohej", "Failed to invite the following users to the %(roomName)s room:": "S’u arrit të ftoheshin përdoruesit vijues te dhoma %(roomName)s:", @@ -159,7 +154,6 @@ "Noisy": "I zhurmshëm", "Collecting app version information": "Po grumbullohen të dhëna versioni aplikacioni", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Të fshihet aliasi i dhomës %(alias)s dhe të hiqet %(name)s nga drejtoria?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Kjo do t’ju lejojë të riktheheni te llogaria juaj pasi të keni bërë daljen, dhe të hyni që nga pajisje të tjera.", "Keywords": "Fjalëkyçe", "Unpin Message": "Shfiksojeni Mesazhin", "Enable notifications for this account": "Aktivizo njoftime për këtë llogari", @@ -263,10 +257,7 @@ "PM": "PM", "AM": "AM", "Room name or alias": "Emër dhome ose alias", - "Unknown (user, device) pair:": "Çift (përdorues, pajisje) i panjohur:", - "Device already verified!": "Pajisje tashmë e verifikuar!", "Verified key": "Kyç i verifikuar", - "Unrecognised command:": "Urdhër jo i pranuar:", "Reason": "Arsye", "%(senderName)s requested a VoIP conference.": "%(senderName)s kërkoi një konferencë VoIP.", "VoIP conference started.": "Konferenca VoIP filloi.", @@ -299,12 +290,10 @@ "Confirm password": "Ripohoni frazëkalimin", "Change Password": "Ndryshoni Fjalëkalimin", "Authentication": "Mirëfilltësim", - "Delete %(count)s devices|one": "Fshije pajisjen", "Device ID": "ID Pajisjeje", "Last seen": "Parë së fundi më", "Disable Notifications": "Çaktivizo Njoftimet", "Enable Notifications": "Aktivizo Njoftimet", - "Invalid alias format": "Format i pavlefshëm aliasesh", "not specified": "e papërcaktuar", "Remote addresses for this room:": "Adresa të largëta për këtë dhomë:", "Local addresses for this room:": "Adresa vendore për këtë dhomë:", @@ -319,8 +308,6 @@ "%(senderName)s sent a video": "%(senderName)s dërgoi një video", "Options": "Mundësi", "Key request sent.": "Kërkesa për kyç u dërgua.", - "Encrypted by an unverified device": "Fshehtëzuar nga një pajisje e paverifikuar", - "Unencrypted message": "Mesazh i pafshehtëzuar", "Please select the destination room for this message": "Ju lutemi, përzgjidhni dhomën vendmbërritje për këtë mesazh", "Blacklisted": "Në Listë të Zezë", "device id: ": "ID pajisjeje: ", @@ -331,8 +318,6 @@ "Ban this user?": "Të dëbohet ky përdorues?", "Are you sure?": "Jeni i sigurt?", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "S’do të jeni në gjendje ta zhbëni këtë ndryshim, ngaqë po e promovoni përdoruesin të ketë të njëjtën shkallë pushteti si ju vetë.", - "No devices with registered encryption keys": "S’ka pajisje me kyçe fshehtëzimi të regjistruar", - "Devices": "Pajisje", "Unignore": "Shpërfille", "Ignore": "Shpërfille", "Mention": "Përmendje", @@ -348,7 +333,6 @@ "Voice call": "Thirrje audio", "Video call": "Thirrje video", "Upload file": "Ngarkoni kartelë", - "Show Text Formatting Toolbar": "Shfaq Panel Formatimi Tekstesh", "Send an encrypted reply…": "Dërgoni një përgjigje të fshehtëzuar…", "Send a reply (unencrypted)…": "Dërgoni një përgjigje (të pafshehtëzuar)…", "Send an encrypted message…": "Dërgoni një mesazh të fshehtëzuar…", @@ -356,10 +340,6 @@ "You do not have permission to post to this room": "S’keni leje të postoni në këtë dhomë", "Server error": "Gabim shërbyesi", "Command error": "Gabim urdhri", - "bold": "të trasha", - "italic": "të pjerrta", - "Markdown is disabled": "Markdown është i çaktivizuar", - "Markdown is enabled": "Markdown është i aktivizuar", "Loading...": "Po ngarkohet…", "Pinned Messages": "Mesazhe të Fiksuar", "Jump to message": "Kalo te mesazhi", @@ -382,7 +362,6 @@ "Community Invites": "Ftesa Bashkësie", "Invites": "Ftesa", "Favourites": "Të parapëlqyer", - "People": "Persona", "Low priority": "Me përparësi të ulët", "This room": "Këtë dhomë", "%(roomName)s does not exist.": "%(roomName)s s’ekziston.", @@ -466,16 +445,10 @@ "Unknown error": "Gabim i panjohur", "Incorrect password": "Fjalëkalim i pasaktë", "Deactivate Account": "Çaktivizoje Llogarinë", - "Device name": "Emër pajisjeje", - "Device key": "Kyç pajisjeje", - "Verify device": "Verifiko pajisjen", "An error has occurred.": "Ndodhi një gabim.", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Shtuat një pajisje të re '%(displayName)s', e cila po kërkon kyçe fshehtëzimi.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Pajisja juaj e paverifikuar '%(displayName)s' po kërkon kyçe fshehtëzimi.", "Start verification": "Fillo verifikimin", "Share without verifying": "Ndajeni me të tjerë pa e verifikuar", "Ignore request": "Shpërfille kërkesën", - "Loading device info...": "Po ngarkohen të dhëna pajisjeje…", "Encryption key request": "Kërkesë kyçi fshehtëzimesh", "Invalid Email Address": "Adresë Email e Pavlefshme", "This doesn't appear to be a valid email address": "Kjo s’duket se është adresë email e vlefshme", @@ -484,8 +457,6 @@ "Username not available": "Emri i përdoruesit s’është i lirë", "Username invalid: %(errMessage)s": "Emër përdoruesi i pavlefshëm: %(errMessage)s", "Username available": "Emri i përdoruesit është i lirë", - "Room contains unknown devices": "Dhoma përmban pajisje të panjohura", - "Unknown devices": "Pajisje të panjohura", "Private Chat": "Fjalosje Private", "Public Chat": "Fjalosje Publike", "Custom": "Vetjak", @@ -531,8 +502,6 @@ "Sign out": "Dilni", "Success": "Sukses", "Cryptography": "Kriptografi", - "Device ID:": "ID Pajisjeje:", - "Device key:": "Kyç pajisjeje:", "Riot collects anonymous analytics to allow us to improve the application.": "Riot-i grumbullon të dhëna analitike anonime që të na lejojë ta përmirësojmë aplikacionin.", "Check for update": "Kontrollo për përditësime", "No media permissions": "S’ka leje mediash", @@ -577,7 +546,6 @@ "Session ID": "ID sesioni", "End-to-end encryption information": "Të dhëna fshehtëzimi skaj-më-skaj", "Event information": "Të dhëna akti", - "Sender device information": "Të dhëna pajisjeje dërguesi", "Passphrases must match": "Frazëkalimet duhet të përputhen", "Passphrase must not be empty": "Frazëkalimi s’mund të jetë i zbrazët", "Export room keys": "Eksporto kyçe dhome", @@ -592,13 +560,10 @@ "Missing user_id in request": "Mungon user_id te kërkesa", "Failed to join room": "S’u arrit të hyhej në dhomë", "Mirror local video feed": "Pasqyro prurje vendore videoje", - "Never send encrypted messages to unverified devices from this device": "Mos dërgo kurrë mesazhe të fshehtëzuar, nga kjo pajisje te pajisje të paverifikuara", - "Never send encrypted messages to unverified devices in this room from this device": "Mos dërgo kurrë mesazhe të fshehtëzuar, nga kjo pajisje te pajisje të paverifikuara në këtë dhomë", "Incoming voice call from %(name)s": "Thirrje audio ardhëse nga %(name)s", "Incoming video call from %(name)s": "Thirrje video ardhëse nga %(name)s", "Incoming call from %(name)s": "Thirrje ardhëse nga %(name)s", "Failed to upload profile picture!": "S’u arrit të ngarkohej foto profili!", - "Unable to load device list": "S’arrihet të ngarkohet listë pajisjesh", "New address (e.g. #foo:%(localDomain)s)": "Adresë e re (p.sh. #foo:%(localDomain)s)", "New community ID (e.g. +foo:%(localDomain)s)": "ID bashkësie të re (p.sh. +foo:%(localDomain)s)", "Ongoing conference call%(supportedText)s.": "Thirrje konference që po zhvillohet%(supportedText)s.", @@ -610,7 +575,6 @@ "Unmute": "Ktheji zërin", "Invited": "I ftuar", "Hangup": "Mbylle Thirrjen", - "Hide Text Formatting Toolbar": "Fshih Panel Formatimi Tekstesh", "No pinned messages.": "S’ka mesazhe të fiksuar.", "Replying": "Po përgjigjet", "Failed to unban": "S’u arrit t’i hiqej dëbimi", @@ -630,8 +594,6 @@ "Failed to remove room from community": "S’u arrit të hiqej dhoma nga bashkësia", "Minimize apps": "Minimizoji aplikacionet", "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)sndryshoi avatarin e vet", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Që të verifikoni se kësaj pajisje mund t’i zihet besë, ju lutemi, lidhuni me të zotët e saj përmes ndonjë rruge tjetër (p.sh., personalisht, ose përmes një thirrjeje telefonike) dhe kërkojuni nëse kyçi që shohin te Rregullime të tyret të Përdoruesit për këtë pajisje përputhet me kyçin më poshtë:", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Nëse përputhet, shtypni butonin e verifikimit më poshtë. Nëse jo, atëherë dikush tjetër po e përgjon këtë pajisje dhe duhet ta kaloni në listë të zezë.", "I verify that the keys match": "Verifikoj se kyçet përputhen", "Unable to restore session": "S’arrihet të rikthehet sesioni", "Please check your email and click on the link it contains. Once this is done, click continue.": "Ju lutemi, kontrolloni email-in tuaj dhe klikoni mbi lidhjen që përmban. Pasi të jetë bërë kjo, klikoni që të vazhdohet.", @@ -649,7 +611,6 @@ "Failed to reject invitation": "S’u arrit të hidhej poshtë ftesa", "Failed to leave room": "S’u arrit të braktisej", "Scroll to bottom of page": "Rrëshqit te fundi i faqes", - "Message not sent due to unknown devices being present": "Mesazhi s’u dërgua, për shkak të pranisë së pajisjeve të panjohura", "Unknown room %(roomId)s": "Dhomë e panjohur %(roomId)s", "Fill screen": "Mbushe ekranin", "Tried to load a specific point in this room's timeline, but was unable to find it.": "U provua të ngarkohej një pikë të dhënë prej rrjedhës kohore në këtë dhomë, por s’u arrit të gjendej.", @@ -657,7 +618,6 @@ "Unable to remove contact information": "S’arrihet të hiqen të dhëna kontakti", "Import E2E room keys": "Importo kyçe E2E dhome", "Homeserver is": "Shërbyesi Home është", - "matrix-react-sdk version:": "Version matrix-react-sdk:", "Failed to send email": "S’u arrit të dërgohej email", "I have verified my email address": "E kam verifikuar adresën time email", "Failed to fetch avatar URL": "S’u arrit të sillej URL avatari", @@ -684,12 +644,9 @@ "(could not connect media)": "(s’lidhi dot median)", "(unknown failure: %(reason)s)": "(dështim i panjohur: %(reason)s)", "%(senderName)s ended the call.": "%(senderName)s e përfundoi thirrjen.", - "Delete %(count)s devices|other": "Fshi %(count)s pajisje", "Failed to set display name": "S’u arrit të caktohej emër ekrani", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' s’është format i vlefshëm aliasesh", "'%(groupId)s' is not a valid community ID": "'%(groupId)s' s’është ID i vlefshëm bashkësish", "Cannot add any more widgets": "S’mund të shtohen më tepër widget-e", - "Re-request encryption keys from your other devices.": "Rikërkoni kyçe fshehtëzimi prej pajisjesh tuaja të tjera.", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (pushtet %(powerLevelNumber)si)", "(~%(count)s results)|other": "(~%(count)s përfundime)", "(~%(count)s results)|one": "(~%(count)s përfundim)", @@ -775,8 +732,6 @@ "%(widgetName)s widget modified by %(senderName)s": "Widget-i %(widgetName)s u modifikua nga %(senderName)s", "%(widgetName)s widget added by %(senderName)s": "Widget-i %(widgetName)s u shtua nga %(senderName)s", "Always show encryption icons": "Shfaq përherë ikona fshehtëzimi", - "block-quote": "bllok citimi", - "bulleted-list": "listë me toptha", "Add some now": "Shtohen ca tani", "Click here to see older messages.": "Klikoni këtu për të parë mesazhe më të vjetër.", "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)shynë dhe dolën %(count)s herë", @@ -801,9 +756,6 @@ "Please contact your homeserver administrator.": "Ju lutemi, lidhuni me përgjegjësin e shërbyesit tuaj Home.", "Send analytics data": "Dërgo të dhëna analitike", "This event could not be displayed": "Ky akt s’u shfaq dot", - "underlined": "nënvizuar", - "inline-code": "kod brendazi", - "numbered-list": "listë e numërtuar", "The conversation continues here.": "Biseda vazhdon këtu.", "System Alerts": "Sinjalizime Sistemi", "Muted Users": "Përdorues të Heshtur", @@ -851,9 +803,7 @@ "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s hoqi %(removedAddresses)s si adresa për këtë dhomë.", "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s hoqi %(removedAddresses)s si adresë për këtë dhomë.", "%(senderName)s removed the main address for this room.": "%(senderName)s hoqi adresën kryesore për këtë dhomë.", - "deleted": "u fshi", "This room has been replaced and is no longer active.": "Kjo dhomë është zëvendësuar dhe s’është më aktive.", - "At this time it is not possible to reply with an emote.": "Sot për sot s’është e mundur të përgjigjeni me një emote.", "Share room": "Ndani dhomë me të tjerë", "You don't currently have any stickerpacks enabled": "Hëpërhë, s’keni të aktivizuar ndonjë pako ngjitësesh", "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s ndryshoi avatarin e dhomës në ", @@ -880,7 +830,6 @@ "Every page you use in the app": "Çdo faqe që përdorni te aplikacioni", "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s shtoi %(addedAddresses)s si adresa për këtë dhomë.", "%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s shtoi %(addedAddresses)s dhe hoqi %(removedAddresses)s si adresa për këtë dhomë.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s aktivizoi fshehtëzimin skaj-më-skaj (algorithm %(algorithm)s).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s nga %(fromPowerLevel)s në %(toPowerLevel)s", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ndryshoi shkallën e pushtetit të %(powerLevelDiffText)s.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s ndryshoi mesazhin e fiksuar për këtë dhomë.", @@ -896,7 +845,6 @@ "Before submitting logs, you must create a GitHub issue to describe your problem.": "Përpara se të parashtroni regjistra, duhet të krijoni një çështje në GitHub issue që të përshkruani problemin tuaj.", "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "ID-të e bashkësive mund të përmbajnë vetëm shenjat a-z, 0-9, ose '=_-./'", "Create a new room with the same name, description and avatar": "Krijoni një dhomë të re me po atë emër, përshkrim dhe avatar", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" përmban pajisje që s’i keni parë më parë.", "

    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 për faqen e bashkësisë tuaj

    \n

    \n Përshkrimin e gjatë përdoreni për t’u paraqitur përdoruesve të rinj bashkësinë, ose për të dhënë\n një a disa lidhje të rëndësishme\n

    \n

    \n Mund të përdorni madje etiketa 'img'\n

    \n", "Failed to add the following rooms to the summary of %(groupId)s:": "S’u arrit të shtoheshin dhomat vijuese te përmbledhja e %(groupId)s:", "Failed to remove the room from the summary of %(groupId)s": "S’u arrit të hiqej dhoma prej përmbledhjes së %(groupId)s", @@ -907,7 +855,6 @@ "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Janë pikasur të dhëna nga një version i dikurshëm i Riot-it. Kjo do të bëjë që kriptografia skaj-më-skaj te versioni i dikurshëm të mos punojë si duhet. Mesazhet e fshehtëzuar skaj-më-skaj tani së fundi teksa përdorej versioni i dikurshëm mund të mos jenë të shfshehtëzueshëm në këtë version. Kjo mund bëjë edhe që mesazhet e shkëmbyera me këtë version të dështojnë. Nëse ju dalin probleme, bëni daljen dhe rihyni në llogari. Që të ruhet historiku i mesazheve, eksportoni dhe riimportoni kyçet tuaj.", "Did you know: you can use communities to filter your Riot.im experience!": "E dinit se: mund t’i përdorni bashkësitë për të filtruar punimin tuaj në Riot.im?", "Error whilst fetching joined communities": "Gabim teksa silleshin bashkësitë ku merret pjesë", - "Show devices, send anyway or cancel.": "Shfaq pajisje, dërgoje sido qoftë ose anuloje.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Ridërgojini krejt ose anulojini krejt tani. Për ridërgim ose anulim, mundeni edhe të përzgjidhni mesazhe individualë.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Ridërgojeni mesazhin ose anulojeni mesazhin tani.", "Audio Output": "Sinjal Audio", @@ -917,10 +864,7 @@ "Failed to remove tag %(tagName)s from room": "S’u arrit të hiqej etiketa %(tagName)s nga dhoma", "Failed to add tag %(tagName)s to room": "S’u arrit të shtohej në dhomë etiketa %(tagName)s", "Enable widget screenshots on supported widgets": "Aktivizo foto ekrani widget-esh për widget-e që e mbulojnë", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ndryshimi i fjalëkalimit do të sjellë zerimin e çfarëdo kyçesh fshehtëzimi skaj-më-skaj në krejt pajisjet, duke e bërë të palexueshëm historikun e fshehtëzuar të bisedave, hiq rastin kur i eksportoni më parë kyçet tuaj të dhomës dhe i ri-importoni ata më pas. Në të ardhmen kjo do të përmirësohet.", "Join as voice or video.": "Merrni pjesë me ose me video.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Kërkesat për ndarje kyçesh dërgohen automatikisht te pajisjet tuaja të tjera. Nëse s’e pranuat ose e hodhët tej kërkesën për ndarje kyçesh në pajisjet tuaja të tjera, klikoni këtu që të rikërkoni kyçe për këtë sesion.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Nëse pajisjet tuaja të tjera nuk kanë kyçin për këtë mesazh, s’do të jeni në gjendje ta shfshehtëzoni.", "Demote yourself?": "Të zhgradohet vetvetja?", "Demote": "Zhgradoje", "Failed to toggle moderator status": "S’u arrit të këmbehet gjendje moderatori", @@ -952,19 +896,12 @@ "Please note you are logging into the %(hs)s server, not matrix.org.": "Ju lutemi, kini parasysh se jeni futur te shërbyesi %(hs)s, jo te matrix.org.", "You need to register to do this. Would you like to register now?": "Për ta bërë këtë, lypset të regjistroheni. Doni të regjistroheni që tani?", "Stops ignoring a user, showing their messages going forward": "Resht shpërfilljen e një përdoruesi, duke i shfaqur mesazhet e tij të dërgohen", - "Verifies a user, device, and pubkey tuple": "Verifikon një përdorues, pajisje dhe një set kyçesh publikë", - "WARNING: Device already verified, but keys do NOT MATCH!": "KUJDES: Pajisje tashmë e verifikuar, por kyçet NUK PËRPUTHEN!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "KUJDES: VERIFIKIMI I KYÇIT DËSHTOI! Kyçi i nënshkrimit për %(userId)s dhe pajisjen %(deviceId)s është \"%(fprint)s\", që nuk përpythet me kyçin e dhënë \"%(fingerprint)s\". Kjo mund të jetë shenjë se komunikimet tuaja po përgjohen!", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Kyçi i nënshkrimit që dhatë përputhet me kyçin e nënshkrimit që morët nga pajisja e %(userId)s %(deviceId)s. Pajisja u shënua si e verifikuar.", "Your browser does not support the required cryptography extensions": "Shfletuesi juaj nuk mbulon zgjerimet kriptografike të domosdoshme", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Vulat kohore shfaqi në formatin 12 orësh (p.sh. 2:30pm)", "Enable inline URL previews by default": "Aktivizo, si parazgjedhje, paraparje URL-sh brendazi", "The maximum permitted number of widgets have already been added to this room.": "Në këtë dhomë është shtuar tashmë numri maksimum i lejuar për widget-et.", - "Your key share request has been sent - please check your other devices for key share requests.": "Kërkesa juaj për shkëmbim kyçesh u dërgua - ju lutemi, kontrolloni pajisjet tuaja të tjera për kërkesa shkëmbimi kyçesh.", - "Undecryptable": "I pashfshehtëzueshëm", "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.": "S’do të jeni në gjendje ta zhbëni këtë, ngaqë po zhgradoni veten, nëse jeni përdoruesi i fundit i privilegjuar te dhoma do të jetë e pamundur të rifitoni privilegjet.", "Jump to read receipt": "Hidhuni te leximi i faturës", - "Unable to reply": "S’arrihet të përgjigjet", "Unknown for %(duration)s": "I panjohur për %(duration)s", "This room is not accessible by remote Matrix servers": "Kjo dhomë nuk është e përdorshme nga shërbyes Matrix të largët", "Stickerpack": "Paketë ngjitësish", @@ -985,8 +922,6 @@ "We encountered an error trying to restore your previous session.": "Hasëm një gabim teksa provohej të rikthehej sesioni juaj i dikurshëm.", "This will allow you to reset your password and receive notifications.": "Kjo do t’ju lejojë të ricaktoni fjalëkalimin tuaj dhe të merrni njoftime.", "This will be your account name on the homeserver, or you can pick a different server.": "Ky do të jetë emri i llogarisë tuaj te shërbyesi home, ose mund të zgjidhni një shërbyes tjetër.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Po kaloni në listë të zezë pajisje të paverifikuara; që të dërgoni mesazhe te këto pajisje, duhet t’i verifikoni.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Këshillojmë të përshkoni procesin e verifikimit për çdo pajisje, që t’u bindur se u takojnë të zotëve të ligjshëm, por, nëse parapëlqeni, mund ta dërgoni mesazhin pa verifikuar gjë.", "You must join the room to see its files": "Duhet të hyni në dhomë, pa të shihni kartelat e saj", "The room '%(roomName)s' could not be removed from the summary.": "Dhoma '%(roomName)s' s’u hoq dot nga përmbledhja.", "The user '%(displayName)s' could not be removed from the summary.": "Përdoruesi '%(displayName)s' s’u hoq dot nga përmbledhja.", @@ -1001,7 +936,6 @@ "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.": "Mesazhi juaj s’u dërgua, ngaqë ky shërbyes Home ka tejkaluar kufirin e një burimi. Ju lutemi, që të vazhdoni ta përdorni këtë shërbim, lidhuni me përgjegjësin e shërbimit tuaj.", "There's no one else here! Would you like to invite others or stop warning about the empty room?": "S’ka njeri këtu! Do të donit të ftoni të tjerë apo të reshtet së njoftuari për dhomë të zbrazët?", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "U provua të ngarkohej një pikë e caktuar në kronologjinë e kësaj dhome, por nuk keni leje për ta parë mesazhin në fjalë.", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Fjalëkalimi juaj u ndryshua me sukses. Nuk do të merrni njoftime push në pajisjet tuaja të tjera, veç në hyfshi sërish në llogarinë tuaj në to", "Start automatically after system login": "Nisu vetvetiu pas hyrjes në sistem", "You may need to manually permit Riot to access your microphone/webcam": "Lypset të lejoni dorazi Riot-in të përdorë mikrofonin/kamerën tuaj web", "No Audio Outputs detected": "S’u pikasën Sinjale Audio Në Dalje", @@ -1024,11 +958,6 @@ "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", "Delete Backup": "Fshije Kopjeruajtjen", "Unable to load key backup status": "S’arrihet të ngarkohet gjendje kopjeruajtjeje kyçesh", - "Backup has a valid signature from this device": "Kopjeruajtja ka një nënshkrim të vlefshëm prej kësaj pajisjeje", - "Backup has a valid signature from unverified device ": "Kopjeruajtja ka një nënshkrim të vlefshëm prej pajisjes së paverifikuar ", - "Backup has an invalid signature from verified device ": "Kopjeruajtja ka një nënshkrim të pavlefshëm prej pajisjes së verifikuar ", - "Backup has an invalid signature from unverified device ": "Kopjeruajtja ka një nënshkrim të pavlefshëm prej pajisjes së paverifikuar ", - "Backup is not signed by any of your devices": "Kopjeruajtja s’është nënshkruar nga ndonjë prej pajisjeve tuaja", "Backup version: ": "Version kopjeruajtjeje: ", "Algorithm: ": "Algoritëm: ", "Enter a passphrase...": "Jepni një frazëkalim…", @@ -1041,12 +970,9 @@ "Your Recovery Key": "Kyçi Juaj i Rimarrjeve", "Copy to clipboard": "Kopjoje në të papastër", "Download": "Shkarkoje", - "Your Recovery Key has been copied to your clipboard, paste it to:": "Kyçi juaj i Fshehtëzimeve është kopjuar te e papastra juaj, ngjiteni te:", - "Your Recovery Key is in your Downloads folder.": "Kyçi juaj i Fshehtëzimeve gjendet te dosja juaj Shkarkime.", "Print it and store it somewhere safe": "Shtypeni dhe ruajeni diku pa rrezik", "Save it on a USB key or backup drive": "Ruajeni në një diskth USB ose disk kopjeruajtjesh", "Copy it to your personal cloud storage": "Kopjojeni te depoja juaj personale në re", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "Pa ujdisur Rimarrje të Sigurt Mesazhesh, s’do të jeni në gjendje të riktheni historikun e mesazheve tuaj të fshehtëzuar, nëse bëni daljen ose përdorni një pajisje tjetër.", "Set up Secure Message Recovery": "Rregulloni Rimarrje të Sigurt Mesazhesh", "Keep it safe": "Mbajeni të parrezikuar", "Create Key Backup": "Krijo Kopjeruajtje Kyçesh", @@ -1065,7 +991,6 @@ "This looks like a valid recovery key!": "Ky duket si kyç i vlefshëm rimarrjesh!", "Not a valid recovery key": "Kyç rimarrjesh jo i vlefshëm", "Access your secure message history and set up secure messaging by entering your recovery key.": "Hyni te historiku i mesazheve tuaj të siguruar dhe rregulloni shkëmbim mesazhesh të sigurt duke dhënë kyçin tuaj të rimarrjeve.", - "If you've forgotten your recovery passphrase you can ": "Nëse keni harruar frazëkalimin tuaj të rikthimeve, mund të ", "Sign in with single sign-on": "Bëni hyrjen me hyrje njëshe", "Failed to perform homeserver discovery": "S’u arrit të kryhej zbulim shërbyesi Home", "Invalid homeserver discovery response": "Përgjigje e pavlefshme zbulimi shërbyesi Home", @@ -1113,7 +1038,6 @@ "That doesn't look like a valid email address": "Kjo s’duket si adresë email e vlefshme", "Checking...": "Po kontrollohet…", "Invalid identity server discovery response": "Përgjigje e pavlefshme zbulimi identiteti shërbyesi", - "Backup has a valid signature from verified device ": "Kopjeruajtja ka një nënshkrim të vlefshëm prej pajisjes së verifikuar ", "New Recovery Method": "Metodë e Re Rimarrjesh", "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.": "Nëse metodën e re të rimarrjeve s’e keni caktuar ju, dikush mund të jetë duke u rrekur të hyjë në llogarinë tuaj. Ndryshoni menjëherë fjalëkalimin e llogarisë tuaj, te Rregullimet, dhe caktoni një metodë të re rimarrjesh.", "Set up Secure Messages": "Rregulloni Mesazhi të Sigurt", @@ -1163,13 +1087,11 @@ "Email Address": "Adresë Email", "Backing up %(sessionsRemaining)s keys...": "Po kopjeruhen kyçet për %(sessionsRemaining)s…", "All keys backed up": "U kopjeruajtën krejt kyçet", - "Backup has a signature from unknown device with ID %(deviceId)s.": "Kopjeruajtja ka nënshkrim nga pajisje e panjohur me ID %(deviceId)s.", "Add an email address to configure email notifications": "Shtoni një adresë email që të formësoni njoftime me email", "Unable to verify phone number.": "S’arrihet të verifikohet numër telefoni.", "Verification code": "Kod verifikimi", "Phone Number": "Numër Telefoni", "Profile picture": "Foto profili", - "Upload profile picture": "Ngarkoni foto profili", "Display Name": "Emër Në Ekran", "Room information": "Të dhëna dhome", "Internal room ID:": "ID e brendshme dhome:", @@ -1212,19 +1134,15 @@ "Share Link to User": "Ndajeni Lidhjen për te Përdoruesi", "Main address": "Adresë kryesore", "Room avatar": "Avatar dhome", - "Upload room avatar": "Ngarkoni avatar dhome", - "No room avatar": "S’ka avatar dhome", "Room Name": "Emër Dhome", "Room Topic": "Temë Dhome", "Join": "Bëhuni pjesë", "Use Legacy Verification (for older clients)": "Përdor Verifikim të Dikurshëm (për klientë të vjetër)", "Verify by comparing a short text string.": "Verifikoje duke krahasuar një varg të shkurtër teksti.", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "Për siguri maksimale, këshillojmë ta bëni këtë në prani të vetë personit, ose të përdorni një tjetër kanal të besuar komunikimesh.", "Begin Verifying": "Po verifikohet", "Waiting for partner to accept...": "Po pritet pranimi nga partneri…", "Use two-way text verification": "Përdor verifikim të anasjelltë me tekst", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Verifikojeni këtë përdorues që t’i vihet shenjë si i besuar. Përdoruesit e besuar ju më tepër siguri kur përdorni mesazhe të fshehtëzuar skaj-më-skaj.", - "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "Verifikimi i këtij përdoruesi do të shënojë pajisjen e tij si të besuar, dhe tuajën si të besuar kundrejt tyre.", "Waiting for partner to confirm...": "Po pritet ripohimi nga partneri…", "Incoming Verification Request": "Kërkesë Verifikimi e Ardhur", "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "Për të na ndihmuar të shmangim çështje të përsëdytura, ju lutemi, së pari shihni çështjet ekzistuese (dhe shtoni një +1) ose krijoni një çështje të re, nëse nuk gjeni gjë.", @@ -1261,10 +1179,7 @@ "Keep going...": "Vazhdoni kështu…", "Starting backup...": "Po fillohet kopjeruajtje…", "A new recovery passphrase and key for Secure Messages have been detected.": "Janë pikasur një frazëkalim dhe kyç i ri rimarrjesh për Mesazhe të Sigurt.", - "This device is encrypting history using the new recovery method.": "Kjo pajisje e fshehtëzon historikun duke përdorur metodë të re rimarrjesh.", "Recovery Method Removed": "U hoq Metodë Rimarrje", - "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "Kjo pajisje ka pikasur se frazëkalimi dhe kyçi juaj i rimarrjeve për Mesazhe të Sigurt janë hequr.", - "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "Nëse këtë e keni bërë pa dashje, mund të ujdisni Mesazhe të Sigurt në këtë pajisje, gjë që do të sjellë rifshehtëzimin e historikut të mesazheve të pajisjes me një metodë të re rimarrjesh.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Nëse metodën e re të rimarrjeve s’e keni hequr ju, dikush mund të jetë duke u rrekur të hyjë në llogarinë tuaj. Ndryshoni menjëherë fjalëkalimin e llogarisë tuaj, te Rregullimet, dhe caktoni një metodë të re rimarrjesh.", "Disinvite this user?": "T’i hiqet ftesa këtij përdoruesi?", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Kartela '%(fileName)s' tejkalon kufirin e këtij shërbyesi Home për madhësinë e ngarkimeve", @@ -1312,7 +1227,6 @@ "Book": "Libër", "Pencil": "Laps", "Paperclip": "Kapëse", - "Padlock": "Dry", "Hammer": "Çekiç", "Telephone": "Telefon", "Flag": "Flamur", @@ -1328,10 +1242,7 @@ "Anchor": "Spirancë", "Headphones": "Kufje", "Folder": "Dosje", - "Your homeserver does not support device management.": "Shërbyesi juaj Home nuk mbulon administrim pajisjesh.", "Chat with Riot Bot": "Fjalosuni me Robotin Riot", - "Some devices for this user are not trusted": "Disa pajisje për këtë përdorues nuk janë të besuara", - "All devices for this user are trusted": "Krejt pajisjet për këtë përdorues janë të besuara", "Recovery Key Mismatch": "Mospërputhje Kyçesh Rimarrjeje", "Incorrect Recovery Passphrase": "Frazëkalim Rimarrjeje i Pasaktë", "Backup could not be decrypted with this passphrase: please verify that you entered the correct recovery passphrase.": "S’u shfshehtëzua dot kopjeruajtja me këtë frazëkalim: ju lutemi, verifikoni që dhatë frazëkalimin e duhur të rimarrjeve.", @@ -1340,7 +1251,6 @@ "Couldn't load page": "S’u ngarkua dot faqja", "This homeserver does not support communities": "Ky shërbyes Home s’mbulon bashkësi", "Your password has been reset.": "Fjalëkalimi juaj u ricaktua.", - "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Jeni nxjerrë jashtë prej krejt pajisjeve dhe s’do të merrni më njoftime push. Që të riaktivizoni njoftimet, bëni sërish hyrjen në çdo pajisje.", "This homeserver does not support login using email address.": "Ky shërbyes Home nuk mbulon hyrje përmes adresash email.", "Registration has been disabled on this homeserver.": "Në këtë shërbyes Home regjistrimi është çaktivizuar.", "Unable to query for supported registration methods.": "S’arrihet të kërkohet për metoda regjistrimi që mbulohen.", @@ -1355,18 +1265,13 @@ "Santa": "Babagjyshi i Vitit të Ri", "Hourglass": "Klepsidër", "Key": "Kyç", - "This backup is trusted because it has been restored on this device": "Kjo kopjeruajtje është e besuar, ngaqë është rikthyer në këtë pajisje", - "Some devices in this encrypted room are not trusted": "Disa pajisje në këtë dhomë të fshehtëzuar s’janë të besuara", - "All devices in this encrypted room are trusted": "Krejt pajisjet në këtë dhomë të fshehtëzuar janë të besuara", "Disinvite": "Hiqi ftesën", "Disinvite this user from community?": "T’i hiqet ftesa për në bashkësi këtij përdoruesi?", "A verification email will be sent to your inbox to confirm setting your new password.": "Te mesazhet tuaj do të dërgohet një email verifikimi, për të ripohuar caktimin e fjalëkalimit tuaj të ri.", "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Jeni i sigurt? Do të humbni mesazhet tuaj të fshehtëzuar, nëse kopjeruajtja për kyçet tuaj nuk bëhet si duhet.", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Mesazhet e fshehtëzuar sigurohen me fshehtëzim skaj-më-skaj. Vetëm ju dhe marrësi(t) kanë kyçet për të lexuar këto mesazhe.", "Restore from Backup": "Riktheje prej Kopjeruajtje", - "This device is backing up your keys. ": "Kjo pajisje po bën kopjeruajtje të kyçeve tuaja. ", "Back up your keys before signing out to avoid losing them.": "Kopjeruajini kyçet tuaj, përpara se të dilni, që të shmangni humbjen e tyre.", - "Your keys are not being backed up from this device.": "Kyçet tuaj nuk po kopjeruhen nga kjo pajisje.", "Start using Key Backup": "Fillo të përdorësh Kopjeruajtje Kyçesh", "Never lose encrypted messages": "Mos humbni kurrë mesazhe të fshehtëzuar", "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Mesazhet në këtë dhomë janë të siguruar përmes fshehtëzimi skaj-më-skaj. Vetëm ju dhe marrësi(t) kanë kyçet për të lexuar këto mesazhe.", @@ -1385,7 +1290,6 @@ "Set up with a Recovery Key": "Rregullojeni me një Kyç Rimarrjesh", "Please enter your passphrase a second time to confirm.": "Ju lutemi, që të ripohohet, rijepeni frazëkalimin tuaj.", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "Kyçi juaj i rimarrjeve është një masë sigurie - mund ta përdorni për rimarrje hyrjeje te mesazhet tuaj të fshehtëzuar, nëse harroni frazëkalimin tuaj.", - "Keep your recovery key somewhere very secure, like a password manager (or a safe)": "Mbajeni kyçin tuaj të rikthimeve diku në një vend shumë të sigurt, bie fjala, nën një përgjegjës fjalëkalimesh (ose në një kasafortë)", "Your keys are being backed up (the first backup could take a few minutes).": "Kyçet tuaj po kopjeruhen (kopjeruajtja e parë mund të hajë disa minuta).", "Secure your backup with a passphrase": "Sigurojeni kopjeruajtjen tuaj me një frazëkalim", "Confirm your passphrase": "Ripohoni frazëkalimin tuaj", @@ -1444,23 +1348,16 @@ "Want more than a community? Get your own server": "Doni më shumë se një bashkësi? Merrni një shërbyes tuajin", "Power level": "Shkallë pushteti", "Please install Chrome, Firefox, or Safari for the best experience.": "Për funksionimin më të mirë, ju lutemi, instaloni Chrome, Firefox, ose Safari.", - "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "Ndryshimi i fjalëkalimit tuaj do të sjellë ricaktim të çfarëdo kyçesh fshehtëzimi skaj-më-skaj në krejt pajisjet tuaja, duke e bërë të palexueshëm historikun e bisedave të fshehtëzuara. Ujdisni një Kopjeruajtje Kyçesh ose eksportoni kyçet e dhomës tuaj prej një tjetër pajisjeje përpara se të ricaktoni fjalëkalimin tuaj.", "A conference call could not be started because the integrations server is not available": "S’u nis dot një thirrje konferencë, ngaqë shërbyesi i integrimit s’është i kapshëm", "Replying With Files": "Përgjigje Me Kartela", "The file '%(fileName)s' failed to upload.": "Dështoi ngarkimi i kartelës '%(fileName)s'.", "Name or Matrix ID": "Emër ose ID Matrix-i", - "Email, name or Matrix ID": "Email, emër ose ID matrix", - "Room upgrade confirmation": "Ripohim përmirësimi dhome", "Changes your avatar in this current room only": "Ndryshon avatarin tuaj vetëm në dhomën e tanishme", "Unbans user with given ID": "I heq dëbimin përdoruesit me ID-në e dhënë", "You cannot modify widgets in this room.": "S’mund të ndryshoni widget-e në këtë dhomë.", "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s shfuqizoi ftesën për %(targetDisplayName)s që të marrë pjesë në dhomë.", "No homeserver URL provided": "S’u dha URL shërbyesi Home", "When rooms are upgraded": "Kur përmirësohen dhomat", - "Connect this device to Key Backup": "Lidheni këtë pajisje me Kopjeruajtje Kyçesh", - "Backup has an invalid signature from this device": "Kopjeruajtja ka një nënshkrim të pavlefshëm prej kësaj pajisjeje", - "Enable desktop notifications for this device": "Aktivizo njoftime desktop për këtë pajisje", - "Enable audible notifications for this device": "Aktivizo njoftime audio për këtë pajisje", "Upgrade this room to the recommended room version": "Përmirësojeni këtë dhomë me versionin e rekomanduar të dhomës", "this room": "këtë dhomë", "View older messages in %(roomName)s.": "Shihni mesazhe më të vjetër në %(roomName)s.", @@ -1530,11 +1427,7 @@ "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Nëse përdorni apo jo veçorinë 'breadcrumbs' (avatarë sipër listës së dhomës)", "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Hëpërhë s’është e mundur përgjigja me një kartelë. Do të donit ta ngarkoni këtë kartelë pa u përgjigjur?", "The server does not support the room version specified.": "Shërbyesi nuk e mbulon versionin e specifikuar të dhomës.", - "Upgrading a room can be destructive and isn't always necessary.": "Përmirësimi i një dhome mund të jetë shkatërrimtar dhe s’është i nevojshëm përherë.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Përmirësimet e dhomave zakonisht janë të këshilluara kur një version dhome konsiderohet i paqëndrueshëm. Versionet e paqëndrueshëm të dhomave mund të kenë të meta, mungesa veçorish, ose cenueshmëri sigurie.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Përmirësimi i dhomave zakonisht prek vetëm pjesën më anë të shërbyesit të dhomës. Nëse keni probleme me klientin tuaj Riot , ju lutemi, parashtroni një problem me .", "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.": "Kujdes: Përmirësimi i një dhome s’do të shkaktojë migrim vetvetiu të anëtarëve të dhomës te versioni i ri i dhomës. Do të postojmë në versionin e vjetër të dhomë një lidhje për te dhoma e re - anëtarëve të dhomës do t’u duhet të klikojnë mbi këtë lidhje, që të bëhen pjesë e saj.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Ju lutemi, ripohoni se do të donit të ecej më tej me përmirësimin e kësaj dhome nga te .", "Adds a custom widget by URL to the room": "Shton te dhoma një widget vetjak përmes URL-je", "Please supply a https:// or http:// widget URL": "Ju lutemi, furnizoni një URL https:// ose http:// widget-i", "Sends the given message coloured as a rainbow": "E dërgon mesazhin e dhënë të ngjyrosur si ylber", @@ -1542,8 +1435,6 @@ "The user's homeserver does not support the version of the room.": "Shërbyesi Home i përdoruesit s’e mbulon versionin e dhomës.", "Show hidden events in timeline": "Shfaq te rrjedha kohore veprimtari të fshehura", "Low bandwidth mode": "Mënyrë gjerësi e ulët bande", - "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Kjo pajisje nuk po bën kopjeruajtje të kyçeve tuaja, por keni një kopjeruajtje ekzistuese që mund ta përdorni për rimarrje dhe ta shtoni më tej.", - "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Lidheni këtë pajisje me kopjeruajtje kyçesh, përpara se të dilni, që të shmangni humbje të çfarëdo kyçi që mund të gjendet vetëm në këtë pajisje.", "Something went wrong with your invite to %(roomName)s": "Diç shkoi ters me ftesën tuaj për te %(roomName)s", "You can only join it with a working invite.": "Mund të merrni pjesë në të vetëm me një ftesë funksionale.", "You can still join it because this is a public room.": "Mundeni prapëseprapë të merrni pjesë, ngaqë është një dhomë publike.", @@ -1607,11 +1498,9 @@ "Resend %(unsentCount)s reaction(s)": "Ridërgo %(unsentCount)s reagim(e)", "Resend removal": "Ridërgo heqjen", "Changes your avatar in all rooms": "Ndryshon avatarin tuaj në krejt dhomat", - "Clear all data on this device?": "Të spastrohen krejt të dhënat në këtë pajisje?", "Your homeserver doesn't seem to support this feature.": "Shërbyesi juaj Home nuk duket se e mbulon këtë veçori.", "You're signed out": "Keni bërë dalje", "Clear all data": "Spastro krejt të dhënat", - "Failed to start chat": "S’u arrit të nisej fjalosje", "Messages": "Mesazhe", "Actions": "Veprime", "Sends the given emote coloured as a rainbow": "E dërgon emote-n e dhënë të ngjyrosur si ylber", @@ -1628,7 +1517,6 @@ "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "Te +%(msisdn)s u dërgua një mesazh tekst. Ju lutemi, jepni kodin e verifikimit që përmban.", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Ju lutemi, na tregoni ç’shkoi keq ose, akoma më mirë, krijoni në GitHub një çështje që përshkruan problemin.", "Removing…": "Po hiqet…", - "Clearing all data from this device is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Spastrimi i krejt të dhënave prej kësaj pajisjeje është përfundimtar. Mesazhet e fshehtëzuar do të humbin, veç në qofshin kopjeruajtur kyçet e tyre.", "Share User": "Ndani Përdorues", "Command Help": "Ndihmë Urdhri", "Identity Server": "Shërbyes Identitetesh", @@ -1642,13 +1530,11 @@ "This account has been deactivated.": "Kjo llogari është çaktivizuar.", "Failed to re-authenticate due to a homeserver problem": "S’u arrit të ribëhej mirëfilltësimi, për shkak të një problemi me shërbyesin Home", "Failed to re-authenticate": "S’u arrit të ribëhej mirëfilltësimi", - "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.": "Rifitoni hyrjen te llogaria juaj dhe rimerrni kyçe fshehtëzimi të depozituar në këtë pajisje. Pa ta, s’do të jeni në gjendje të lexoni krejt mesazhet tuaj të siguruar në çfarëdo pajisje.", "Enter your password to sign in and regain access to your account.": "Jepni fjalëkalimin tuaj që të bëhet hyrja dhe të rifitoni hyrje në llogarinë tuaj.", "Forgotten your password?": "Harruat fjalëkalimin tuaj?", "Sign in and regain access to your account.": "Bëni hyrjen dhe rifitoni hyrje në llogarinë tuaj.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "S’mund të bëni hyrjen në llogarinë tuaj. Ju lutemi, për më tepër hollësi, lidhuni me përgjegjësin e shërbyesit tuaj Home.", "Clear personal data": "Spastro të dhëna personale", - "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.": "Kujdes: Të dhënat tuaja personale (përfshi kyçe fshehtëzimi) janë ende të depozituara në këtë pajisje. Spastrojini, nëse keni përfunduar së përdoruri këtë pajisje, ose dëshironi të bëni hyrjen në një tjetër llogari.", "Spanner": "Çelës", "Identity Server URL must be HTTPS": "URL-ja e Shërbyesit të Identiteteve duhet të jetë HTTPS", "Not a valid Identity Server (status code %(code)s)": "Shërbyes Identitetesh i pavlefshëm (kod gjendjeje %(code)s)", @@ -1675,10 +1561,8 @@ "Terms of service not accepted or the identity server is invalid.": "S’janë pranuar kushtet e shërbimit ose shërbyesi i identiteteve është i pavlefshëm.", "Enter a new identity server": "Jepni një shërbyes të ri identitetesh", "Integration Manager": "Përgjegjës Integrimesh", - "A device's public name is visible to people you communicate with": "Emri publik i një pajisjeje është i dukshëm për personat me të cilët komunikoni", "Remove %(email)s?": "Të hiqet %(email)s?", "Remove %(phone)s?": "Të hiqet %(phone)s?", - "To verify that this device can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Që të verifikohet se kjo pajisje mund të besohet, ju lutemi, kontrolloni që kyçi që shihni te Rregullime Përdoruesi në atë pajisje të përputhet me kyçin më poshtë:", "You do not have the required permissions to use this command.": "S’keni lejet e domosdoshme për përdorimin e këtij urdhri.", "Multiple integration managers": "Përgjegjës të shumtë integrimesh", "Accept to continue:": "Që të vazhdohet, pranoni :", @@ -1769,7 +1653,6 @@ "Community Autocomplete": "Vetëplotësim Nga të Bashkësisë", "Add Email Address": "Shtoni Adresë Email", "Add Phone Number": "Shtoni Numër Telefoni", - "Use the new, faster, composer for writing messages": "Përdorni për shkrim mesazhesh hartuesin e ri, më të shpejtë", "Show previews/thumbnails for images": "Shfaq për figurat paraparje/miniatura", "You should remove your personal data from identity server before disconnecting. Unfortunately, identity server is currently offline or cannot be reached.": "Përpara shkëputjes, duhet të hiqni të dhënat tuaja personale nga shërbyesi i identiteteve . Mjerisht, shërbyesi i identiteteve hëpërhë është jashtë funksionimi dhe s’mund të kapet.", "You should:": "Duhet:", @@ -1868,11 +1751,7 @@ "Custom (%(level)s)": "Vetjak (%(level)s)", "Trusted": "E besuar", "Not trusted": "Jo e besuar", - "Hide verified Sign-In's": "Fshihi Hyrjet e verifikuara", - "%(count)s verified Sign-In's|other": "%(count)s Hyrje të verifikuara", - "%(count)s verified Sign-In's|one": "1 Hyrje e verifikuar", "Direct message": "Mesazh i Drejtpërdrejtë", - "Unverify user": "Hiqi verifikimin përdoruesit", "%(role)s in %(roomName)s": "%(role)s në %(roomName)s", "Messages in this room are end-to-end encrypted.": "Mesazhet në këtë dhomë janë të fshehtëzuara skaj-më-skaj.", "Security": "Siguri", @@ -1889,7 +1768,6 @@ "Using this widget may share data with %(widgetDomain)s.": "Përdorimi i këtij widget-i mund të sjellë ndarje të dhënash me %(widgetDomain)s.", "Widget added by": "Widget i shtuar nga", "This widget may use cookies.": "Ky widget mund të përdorë cookies.", - "Send verification requests in direct message, including a new verification UX in the member panel.": "Dërgo kërkesa verifikimi në mesazhe të drejtpërdrejtë, përfshi një UX të ri verifikimesh te paneli i anëtarit.", "Decline (%(counter)s)": "Hidhe poshtë (%(counter)s)", "Connecting to integration manager...": "Po lidhet me përgjegjës integrimesh…", "Cannot connect to integration manager": "S’lidhet dot te përgjegjës integrimesh", @@ -1917,12 +1795,10 @@ "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s bëri një thirrje zanore. (e pambuluar nga ky shfletues)", "%(senderName)s placed a video call.": "%(senderName)s bëri një thirrje video.", "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s bëri një thirrje video. (e pambuluar nga ky shfletues)", - "Enable cross-signing to verify per-user instead of per-device (in development)": "Aktivizoni cross-signing për të verifikuar me bazë përdorues në vend se me bazë pajisje (në zhvillim)", "Enable local event indexing and E2EE search (requires restart)": "Aktivizoni indeksim aktesh vendore dhe kërkim E2EE (lyp rinisje)", "Match system theme": "Përputhe me temën e sistemit", "Send cross-signing keys to homeserver": "Dërgo te shërbyesi Home kyçe cross-signing", "Cross-signing public keys:": "Kyçe publikë për cross-signing:", - "on device": "në pajisje", "not found": "s’u gjet", "in secret storage": "në depozitë të fshehtë", "Secret storage public key:": "Kyç publik depozite të fshehtë:", @@ -1953,16 +1829,12 @@ "If you've forgotten your recovery key you can ": "Nëse keni harruar kyçin tuaj të rimarrjeve, mund të ", "Notification settings": "Rregullime njoftimesh", "User Status": "Gjendje Përdoruesi", - "Warning: You should only set up secret storage from a trusted computer.": "Kujdes: Duhet të ujdisni një depozitë të fshehtë vetëm nga një kompjuter i besuar.", "Set up with a recovery key": "Rregullojeni me një kyç rimarrjesh", "As a safety net, you can use it to restore your access to encrypted messages if you forget your passphrase.": "Si masë sigurie, mund ta përdorni për të rifituar hyrjen tuaj te mesazhe të fshehtëzuar, nëse harroni frazëkalimin tuaj.", "As a safety net, you can use it to restore your access to encrypted messages.": "Si një masë sigurie, mund ta përdorni për të rifituar hyrjen tuaj te mesazhe të fshehtëzuar.", "Keep your recovery key somewhere very secure, like a password manager (or a safe).": "Mbajeni kyçin tuaj të rimarrjeve diku në një vend shumë të sigurt, bie fjala, nën një përgjegjës fjalëkalimesh (ose në një kasafortë).", "Your recovery key has been copied to your clipboard, paste it to:": "Kyçi juaj i rimarrjeve është kopjuar te e papastra juaj, ngjiteni te:", "Your recovery key is in your Downloads folder.": "Kyçi juaj i rimarrjeve gjendet te dosja juaj Shkarkime.", - "Your access to encrypted messages is now protected.": "Hyrja juaj te mesazhe të fshehtëzuar tani është e mbrojtur.", - "Set up secret storage": "Ujdisni depozitë të fshehtë", - "Secure your encrypted messages with a passphrase": "Sigurojini mesazhet tuaj të fshehtëzuar me një frazëkalim", "Storing secrets...": "Po depozitohen të fshehta…", "Unable to set up secret storage": "S’u arrit të ujdiset depozitë e fshehtë", "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s hoqi rregullin për dëbim përdoruesish që kanë përputhje me %(glob)s", @@ -1983,19 +1855,11 @@ "%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s ndryshoi një rregull që dëbonte shërbyes me përputhje me %(oldGlob)s për përputhje me %(newGlob)s për %(reason)s", "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s përditësoi një rregull dëbimesh mbi përputhje me %(oldGlob)s për përputhje me %(newGlob)s për %(reason)s", "The message you are trying to send is too large.": "Mesazhi që po rrekeni të dërgoni është shumë i madh.", - "New DM invite dialog (under development)": "Dialog ftese të re për MD (në zhvillim)", "not stored": "e padepozituar", "Backup has a valid signature from this user": "Kopjeruajtja ka një nënshkrim të vlefshëm prej këtij përdoruesi", "Backup has a invalid signature from this user": "Kopjeruajtja ka një nënshkrim të pavlefshëm prej këtij përdoruesi", "Backup has a signature from unknown user with ID %(deviceId)s": "Kopjeruajtja ka një nënshkrim nga një përdorues i panjohur me ID %(deviceId)s", - "Backup has a signature from unknown device with ID %(deviceId)s": "Kopjeruajtja ka një nënshkrim nga një pajisje e panjohur me ID %(deviceId)s", "Backup key stored: ": "Kyç kopjeruajtjeje i depozituar: ", - "Start using Key Backup with Secure Secret Storage": "Fillo të përdorësh Kopejruajtje Kyçesh me Depozitim Kyçi të Fshehtë", - "This user has not verified all of their devices.": "Ky përdorues s’ka verifikuar krejt pajisjet e tij.", - "You have not verified this user. This user has verified all of their devices.": "S’e keni verifikuar këtë përdorues. Ky përdorues ka verifikuar krejt pajisjet e veta.", - "You have verified this user. This user has verified all of their devices.": "E keni verifikuar këtë përdorues. Ky përdorues ka verifikuar krejt pajisjet e veta.", - "Some users in this encrypted room are not verified by you or they have not verified their own devices.": "Disa përdorues në këtë dhomë të fshehtëzuar nuk janë verifikuar nga ju ose nuk kanë verifikuar pajisjet e tyre.", - "All users in this encrypted room are verified by you and they have verified their own devices.": "Krejt përdorues në këtë dhomë të fshehtëzuar janë verifikuar nga ju dhe kanë verifikuar pajisjet e tyre.", "Close preview": "Mbylle paraparjen", "Hide verified sessions": "Fshih sesione të verifikuar", "%(count)s verified sessions|other": "%(count)s sesione të verifikuar", @@ -2004,20 +1868,11 @@ "Show more": "Shfaq më tepër", "Recent Conversations": "Biseda Së Fundi", "Direct Messages": "Mesazhe të Drejtpërdrejtë", - "If you can't find someone, ask them for their username, or share your username (%(userId)s) or profile link.": "Nëse s’gjeni dot dikë, kërkojuni emrin e përdoruesit, ose jepuni emrin tuaj të përdoruesit (%(userId)s) ose profile link.", "Go": "Shko", "Help": "Ndihmë", "Country Dropdown": "Menu Hapmbyll Vendesh", - "Secret Storage will be set up using your existing key backup details.Your secret storage passphrase and recovery key will be the same as they were for your key backup": "Depozita e Fshehtë do të ujdiset duke përdorur hollësitë tuaja ekzistuese për kopjeruajtje kyçesh.Frazëkalimi juaj për në depozitën e fshehtë dhe kyçi i rimarrjes do të jenë të njëjtë me ata për kopjeruajtjen tuaj të kyçeve", - "Migrate from Key Backup": "Migroji prej Kopjeruajtje Kyçesh", "Show info about bridges in room settings": "Shfaq te rregullime dhome të dhëna rreth urash", - "This bridge was provisioned by ": "Kjo urë është dhënë nga ", "This bridge is managed by .": "Kjo urë administrohet nga .", - "Connected to on ": "Lidhur me ", - "Connected via %(protocolName)s": "Lidhur përmes %(protocolName)s", - "Bridge Info": "Të dhëna Ure", - "Below is a list of bridges connected to this room.": "Më poshtë keni një listë urash të lidhura në këtë dhomë.", - "New Session": "Sesion i Ri", "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s shtoi %(addedAddresses)s dhe dhe %(count)s adresa të tjera te kjo dhomë", "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s hoqi %(removedAddresses)s dhe %(count)s adresa të tjera nga kjo dhomë", "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s hoqi %(countRemoved)s dhe shtoi %(countAdded)s adresa te kjo dhomë", @@ -2041,16 +1896,12 @@ "Other users may not trust it": "Përdorues të tjerë mund të mos e besojnë", "Later": "Më vonë", "Cross-signing and secret storage are enabled.": "Cross-signing dhe depozitimi i fshehtë janë aktivizuar.", - "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this device.": "Llogaria juaj ka një identitet cross-signing në depozitë të fshehtë, por s’është ende i besuar në këtë pajisje.", "Cross-signing and secret storage are not yet set up.": "Cross-signing dhe depozitimi i fshehtë s’janë ujdisur ende.", "Cross-signing private keys:": "Kyçe privatë për cross-signing:", - "Backup key stored in secret storage, but this feature is not enabled on this device. Please enable cross-signing in Labs to modify key backup state.": "Kyçi i kopjeruajtjeve u depozitua në depozitë të fshehtë, po kjo veçori s’është e aktivizuar në këtë pajisje. Ju lutemi, aktivizoni në Labs cross-signing që të modifikoni gjendje kopjeruatjeje kyçesh.", "Labs": "Labs", "Complete": "E plotë", - "Someone is using an unknown device": "Dikush po përdor një pajisje të panjohur", "This room is end-to-end encrypted": "Kjo dhomë është e fshehtëzuar skaj-më-skaj", "Everyone in this room is verified": "Gjithkush në këtë dhomë është verifikuar", - "Encrypted by a deleted device": "Fshehtëzuar nga një pajisje e fshirë", "Invite only": "Vetëm me ftesa", "Send a reply…": "Dërgoni një përgjigje…", "Send a message…": "Dërgoni një mesazh…", @@ -2062,7 +1913,6 @@ "Send as message": "Dërgoni një mesazh", "Verify User": "Verifikoni Përdoruesin", "For extra security, verify this user by checking a one-time code on both of your devices.": "Për siguri ekstra, verifikojeni këtë përdorues duke kontrolluar në të dyja pajisjet tuaja një kod njëpërdorimsh.", - "For maximum security, do this in person.": "Për siguri maksimum, bëjeni këtë ju vetë.", "Start Verification": "Fillo Verifikimin", "Failed to invite the following users to chat: %(csvUsers)s": "S’u arrit të ftoheshin për bisedë përdoruesit vijues: %(csvUsers)s", "We couldn't create your DM. Please check the users you want to invite and try again.": "S’e krijuam dot DM-në tuaj. Ju lutemi, kontrolloni përdoruesit që doni të ftoni dhe riprovoni.", @@ -2073,38 +1923,27 @@ "Suggestions": "Sugjerime", "If you can't find someone, ask them for their username, share your username (%(userId)s) or profile link.": "Nëse s’gjeni dot dikë, kërkojini emrin e tij të përdoruesit, tregojuni emrin tuaj të përdoruesit (%(userId)s) ose lidhjen e profilit.", "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.": "Nëse s’gjeni dot dikë, kërkojini emrin e tij të përdoruesit (p.sh., @përdorues:shërbyes.com) ose tregojuni këtë dhomë.", - "Access your secure message history and your cross-signing identity for verifying other devices by entering your passphrase.": "Për verifikim pajisjesh të tjera përmes dhënies së frazëkalimit tuaj, hyni te historiku i mesazheve tuaj të sigurt dhe identiteti juaj për cross-signing.", - "Access your secure message history and your cross-signing identity for verifying other devices by entering your recovery key.": "Për verifikim pajisjesh të tjera përmes dhënies së kyçit tuaj të rimarrjes, hyni te historiku i mesazheve tuaj të sigurt dhe identiteti juaj për cross-signing.", "Complete security": "Siguri të plotë", "Verify this session to grant it access to encrypted messages.": "Verifikojeni këtë sesion që t’i akordohet hyrje te mesazhe të fshehtëzuar.", "Start": "Nise", "Session verified": "Sesion i verifikuar", "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Sesioni juaj i ri tani është i verifikuar. Ka hyrje te mesazhet tuaj të fshehtëzuar dhe përdoruesit e tjerë do ta shohin si të besuar.", "Done": "U bë", - "Without completing security on this device, it won’t have access to encrypted messages.": "Pa plotësuar sigurinë në këtë pajisje, s’do të ketë hyrje te mesazhe të fshehtëzuar.", "Go Back": "Shko Mbrapsht", - "Key Backup is enabled on your account but has not been set up from this session. To set up secret storage, restore your key backup.": "Kopjeruajtja e Kyçeve është e aktivizuar në llogarinë tuaj, por nuk është ujdisur që nga ky sesion. Që të ujdisni depozitim të fshehtë, riktheni kopjeruajtjen tuaj të kyçeve.", "Restore": "Riktheje", "Enter your account password to confirm the upgrade:": "Që të ripohohet përmirësimi, jepni fjalëkalimin e llogarisë tuaj:", "You'll need to authenticate with the server to confirm the upgrade.": "Do t’ju duhet të bëni mirëfilltësimin me shërbyesin që të ripohohet përmirësimi.", - "Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Përmirësojeni këtë pajisje për ta lejuar të verifikojë pajisje të tjera, duke u akorduar hyrje te mesazhe të fshehtëzuar dhe duke u vënë shenjë si të besuara për përdorues të tjerë.", - "Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Ujdisni fshehtëzim në këtë pajisje që ta lejoni të verifikojë pajisje të tjera, duke u akorduar atyre hyrje te mesazhe të fshehtëzuar dhe duke u vënë shenjë atyre si të besuara për përdorues të tjerë.", "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Sigurojini kyçet tuaj të fshehtëzimit me një frazëkalim. Për siguri maksimale, ky do të duhej të ishte i ndryshëm nga fjalëkalimi për llogarinë tuaj:", "Enter a passphrase": "Jepni një frazëkalim", "Enter your passphrase a second time to confirm it.": "Që të ripohohet, jepeni edhe një herë frazëkalimin tuaj.", - "This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Kjo pajisje mund të verifikojë pajisje të tjera, duke u akorduar hyrje te mesazhe të fshehtëzuar dhe duke u vënë shenjë si të besuara për përdorues të tjerë.", "Verify other users in their profile.": "Verifikoni përdorues të tjerë në profilin e tyre.", - "Without setting up secret storage, you won't be able to restore your access to encrypted messages or your cross-signing identity for verifying other devices if you log out or use another device.": "Pa ujdisur depozitim të fshehtë, s’do të jeni në gjendje të rimerrni hyrje te mesazhe të fshehtëzuar apo te identiteti juaj cross-signing për verifikim pajisjesh të tjera, nëse dilni nga llogaria juaj ose përdorni një pajisje tjetër.", - "Restore your Key Backup": "Riktheni Kopjeruajtjen tuaj të Kyçeve", "Upgrade your encryption": "Përmirësoni fshehtëzimin tuaj", "Set up encryption": "Ujdisni fshehtëzim", "Encryption upgraded": "U përmirësua fshehtëzimi", "Encryption setup complete": "Ujdisje fshehtëzimit e plotësuar", "Verify this session": "Verifikoni këtë sesion", "Encryption upgrade available": "Ka të gatshëm përmirësim fshehtëzimi", - "Review & verify your new session": "Shqyrtoni & verifikoni sesionin tuaj të ri", "Review": "Shqyrtojeni", - "Verify your other devices easier": "Verifikoni më lehtë pajisjet tuaja të tjera", "Enable message search in encrypted rooms": "Aktivizo kërkim mesazhesh në dhoma të fshehtëzuara", "Securely cache encrypted messages locally for them to appear in search results, using ": "Ruaj lokalisht në mënyrë të sigurt në fshehtinë mesazhet që të shfaqen në përfundime kërkimi, duke përdorur ", " to store messages from ": " për të depozituar mesazhe nga ", diff --git a/src/i18n/strings/sr.json b/src/i18n/strings/sr.json index 94e5225d20..e5bd6d6f1a 100644 --- a/src/i18n/strings/sr.json +++ b/src/i18n/strings/sr.json @@ -58,10 +58,6 @@ "Moderator": "Модератор", "Admin": "Админ", "Start a chat": "Крени са ћаскањем", - "Who would you like to communicate with?": "Са киме желите да разговарате?", - "Start Chat": "Ћаскај", - "Invite new room members": "Позови нове чланове у собу", - "Send Invites": "Пошаљи позивнице", "Operation failed": "Радња није успела", "Failed to invite": "Нисам успео да пошаљем позивницу", "Failed to invite the following users to the %(roomName)s room:": "Нисам успео да пошаљем позивницу корисницима за собу %(roomName)s:", @@ -77,7 +73,6 @@ "Room %(roomId)s not visible": "Соба %(roomId)s није видљива", "Missing user_id in request": "Недостаје user_id у захтеву", "Call Failed": "Позивање неуспешно", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Постоје непознати уређаји у овој соби: уколико наставите без проверавања, можда ће неко прислушкивати ваш позив.", "Review Devices": "Испрегледај уређаје", "Call Anyway": "Ипак позови", "Answer Anyway": "Ипак одговори", @@ -93,19 +88,13 @@ "You are now ignoring %(userId)s": "Сада занемарујете корисника %(userId)s", "Unignored user": "Незанемарени корисник", "You are no longer ignoring %(userId)s": "Више не занемарујете корисника %(userId)s", - "Unknown (user, device) pair:": "Непознати пар (корисника, уређаја):", - "Device already verified!": "Уређај је већ проверен!", - "WARNING: Device already verified, but keys do NOT MATCH!": "УПОЗОРЕЊЕ: Уређај је већ проверен али се кључеви НЕ ПОДУДАРАЈУ!", "Verified key": "Проверени кључ", - "Unrecognised command:": "Непрепозната наредба:", "Reason": "Разлог", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s је прихватио позивницу за %(displayName)s.", "%(targetName)s accepted an invitation.": "%(targetName)s је прихватио позивницу.", "%(senderName)s requested a VoIP conference.": "%(senderName)s је затражио VoIP конференцију.", "%(senderName)s invited %(targetName)s.": "%(senderName)s је позвао %(targetName)s.", "%(senderName)s banned %(targetName)s.": "%(senderName)s је бановао %(targetName)s.", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "УПОЗОРЕЊЕ: ПРОВЕРА КЉУЧА НИЈЕ УСПЕЛА! Кључ потписивања за корисника %(userId)s и уређај %(deviceId)s је „%(fprint)s“ а то се не подудара са достављеним кључем „%(fingerprint)s“. Ово можда значи да се ваши разговори прате!", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Кључ за потписивање који сте доставили се подудара са кључем за потписивање од корисника %(userId)s и уређаја %(deviceId)s. Уређај је означен као проверен.", "%(senderName)s set their display name to %(displayName)s.": "Корисник %(senderName)s је себи поставио приказно име %(displayName)s.", "%(senderName)s removed their display name (%(oldDisplayName)s).": "Корисник %(senderName)s је себи уклонио приказно име %(oldDisplayName)s.", "%(senderName)s removed their profile picture.": "Корисник %(senderName)s је себи уклонио профилну слику.", @@ -136,7 +125,6 @@ "%(senderName)s made future room history visible to all room members.": "Корисник %(senderName)s је учинио будући историјат собе видљивим свим члановима собе.", "%(senderName)s made future room history visible to anyone.": "Корисник %(senderName)s је учинио будући историјат собе видљивим свима.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "Корисник %(senderName)s је учинио будући историјат собе непознатим (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "Корисник %(senderName)s је укључио шифровање с краја на крај (алгоритам %(algorithm)s).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s са %(fromPowerLevel)s на %(toPowerLevel)s", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "Корисник %(senderName)s је променио ниво моћи од %(powerLevelDiffText)s.", "%(senderName)s changed the pinned messages for the room.": "Корисник %(senderName)s је променио закачене поруке у соби.", @@ -160,8 +148,6 @@ "Enable automatic language detection for syntax highlighting": "Омогући самостално препознавање језика за истицање синтаксе", "Automatically replace plain text Emoji": "Самостално замени емоџије писане обичним текстом", "Mirror local video feed": "Копирај довод локалног видеа", - "Never send encrypted messages to unverified devices from this device": "Никада не шаљи шифроване поруке са овог уређаја ка непровереним уређајима", - "Never send encrypted messages to unverified devices in this room from this device": "Никада не шаљи шифроване поруке са овог уређаја ка непровереним уређајима у овој соби", "Enable inline URL previews by default": "Подразумевано омогући претпрегледе адреса унутар линије", "Enable URL previews for this room (only affects you)": "Омогући претпрегледе адреса у овој соби (утиче само на вас)", "Enable URL previews by default for participants in this room": "Подразумевано омогући прегледе адреса за чланове ове собе", @@ -183,7 +169,6 @@ "No display name": "Нема приказног имена", "New passwords don't match": "Нове лозинке се не подударају", "Passwords can't be empty": "Лозинке не могу бити празне", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Промена лозинке ће тренутно ресетовати све кључеве за шифровање с краја на крај, на свим уређајима и тиме учинити шифровани историјат ћаскања нечитљивим осим ако прво не извезете кључеве ваше собе па их поново увезете после. Ово ће бити побољшано у будућности.", "Continue": "Настави", "Export E2E room keys": "Извези E2E кључеве собе", "Do you want to set an email address?": "Да ли желите да поставите мејл адресу?", @@ -192,10 +177,7 @@ "New Password": "Нова лозинка", "Confirm password": "Потврди лозинку", "Change Password": "Промени лозинку", - "Unable to load device list": "Нисам могао да учитам списак уређаја", "Authentication": "Идентификација", - "Delete %(count)s devices|other": "Обриши %(count)s уређај(а)", - "Delete %(count)s devices|one": "Обриши уређај", "Device ID": "ИБ уређаја", "Last seen": "Последњи пут виђен", "Failed to set display name": "Нисам успео да поставим приказно име", @@ -213,9 +195,6 @@ "%(senderName)s sent a video": "Корисник %(senderName)s је послао видео", "%(senderName)s uploaded a file": "Корисник %(senderName)s је отпремио датотеку", "Options": "Опције", - "Undecryptable": "Немогуће дешифровати", - "Encrypted by an unverified device": "Шифровано на непровереном уређају", - "Unencrypted message": "Нешифрована порука", "Please select the destination room for this message": "Изаберите одредишну собу за ову поруку", "Blacklisted": "На црном списку", "device id: ": "иб уређаја: ", @@ -235,8 +214,6 @@ "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.": "Нећете моћи да опозовете ове промене зато што снижавате себе, ако сте последњи овлашћени корисник у соби, немогуће је да поново добијете овлашћења.", "Are you sure?": "Да ли сте сигурни?", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Нећете моћи да опозовете ову измену јер унапређујете корисника тако да има исти ниво моћи као и ви.", - "No devices with registered encryption keys": "Нема уређаја са регистрованим кључевима за шифровање", - "Devices": "Уређаји", "Unignore": "Не занемаруј више", "Ignore": "Занемари", "Jump to read receipt": "Скочи на потврду о прочитаности", @@ -259,20 +236,14 @@ "Voice call": "Гласовни позив", "Video call": "Видео позив", "Upload file": "Отпреми датотеку", - "Show Text Formatting Toolbar": "Прикажи алатницу за форматирање текста", "Send an encrypted reply…": "Пошаљи шифровани одговор…", "Send a reply (unencrypted)…": "Пошаљи одговор (нешифровани)…", "Send an encrypted message…": "Пошаљи шифровану поруку…", "Send a message (unencrypted)…": "Пошаљи поруку (нешифровану)…", "You do not have permission to post to this room": "Немате овлашћење за писање у овој соби", - "Hide Text Formatting Toolbar": "Сакриј алатницу за форматирање текста", "Server error": "Грешка на серверу", "Server unavailable, overloaded, or something else went wrong.": "Сервер није доступан или је преоптерећен или је нешто пошло наопако.", "Command error": "Грешка у наредби", - "bold": "подебљано", - "italic": "искошено", - "Markdown is disabled": "Маркдаун је искључен", - "Markdown is enabled": "Маркдаун је укључен", "Unpin Message": "Откачи поруку", "Jump to message": "Скочи на поруку", "No pinned messages.": "Нема закачених порука.", @@ -307,7 +278,6 @@ "Community Invites": "Позивнице заједнице", "Invites": "Позивнице", "Favourites": "Омиљено", - "People": "Особе", "Rooms": "Собе", "Low priority": "Ниска важност", "Historical": "Историјско", @@ -342,8 +312,6 @@ "Cancel": "Откажи", "Jump to first unread message.": "Скочи на прву непрочитану поруку.", "Close": "Затвори", - "Invalid alias format": "Неисправан облик алијаса", - "'%(alias)s' is not a valid format for an alias": "„%(alias)s 1“ није исправан облик алијаса", "not specified": "није наведено", "Remote addresses for this room:": "Удаљене адресе за ову собу:", "Local addresses for this room:": "Локална адреса ове собе:", @@ -510,20 +478,12 @@ "Unknown error": "Непозната грешка", "Incorrect password": "Нетачна лозинка", "Deactivate Account": "Угаси налог", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Да бисте проверили да се овом уређају може веровати, контактирајте власника користећи друге начине (нпр.: лично или преко телефонског позива) и питајте га да ли се кључ који види у корисничким подешавањима подудара са кључем испод:", - "Device name": "Назив уређаја", - "Device key": "Кључ уређаја", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Ако се подудара, притисните дугме за потврду провере испод. Ако се не подудара, неко други прислушкује овај уређај и вероватно желите да притиснете дугме за стављање на црни списак.", - "Verify device": "Провери уређај", "I verify that the keys match": "Потврђујем да се кључеви подударају", "An error has occurred.": "Догодила се грешка.", "OK": "У реду", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Додали сте нови уређај „%(displayName)s“ који захтева кључеве за шифровање.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Ваш непроверени уређај „%(displayName)s“ захтева кључеве за шифровање.", "Start verification": "Започни проверу", "Share without verifying": "Подели без провере", "Ignore request": "Занемари захтев", - "Loading device info...": "Учитавам податке о уређају...", "Encryption key request": "Захтев за кључ шифровања", "Unable to restore session": "Не могу да повратим сесију", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Ако сте претходно користили новије издање Riot-а, ваша сесија може бити некомпатибилна са овим издањем. Затворите овај прозор и вратите се на новије издање.", @@ -542,11 +502,6 @@ "To get started, please pick a username!": "Да бисте кренули, изаберите корисничко име!", "This will be your account name on the homeserver, or you can pick a different server.": "Ово ће бити назив вашег налога на кућном серверу, или можете изабрати други сервер.", "If you already have a Matrix account you can log in instead.": "Ако већ имате Матрикс налог, можете се већ пријавити.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Тренутно убацујете непроверене уређаје на црни списак. Да бисте им слали поруке, морате их проверити.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Предлажемо да прођете кроз поступак провере сваког уређаја да бисте потврдили да они припадају њиховим стварним власницима али можете поново послати поруку без провере, ако то желите.", - "Room contains unknown devices": "Соба садржи непознате уређаје", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "Соба „%(RoomName)s“ садржи уређаје које нисте видели пре.", - "Unknown devices": "Непознати уређаји", "Private Chat": "Приватно ћаскање", "Public Chat": "Јавно ћаскање", "Custom": "Прилагођено", @@ -621,8 +576,6 @@ "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Направите заједницу да бисте спојили кориснике и собе! Направите прилагођену почетну страницу да бисте означили ваш кутак у Матрикс универзуму.", "You have no visible notifications": "Немате видљивих обавештења", "Scroll to bottom of page": "Превуци на дно странице", - "Message not sent due to unknown devices being present": "Порука се неће послати због присутности непознатих уређаја", - "Show devices, send anyway or cancel.": "Прикажи уређаје, ипак пошаљи или откажи.", "%(count)s of your messages have not been sent.|other": "Неке ваше поруке нису послате.", "%(count)s of your messages have not been sent.|one": "Ваша порука није послата.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Пошаљи поново или откажи све сада. Такође можете изабрати појединачне поруке за поновно слање или отказивање.", @@ -656,13 +609,10 @@ "Sign out": "Одјави ме", "Failed to change password. Is your password correct?": "Нисам успео да променим лозинку. Да ли је ваша лозинка тачна?", "Success": "Успех", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Ваша лозинка је успешно промењена. Нећете добијати пуш обавештења на вашим другим уређајима док се поново не пријавите на њима", "Unable to remove contact information": "Не могу да уклоним контакт податке", "": "<није подржано>", "Import E2E room keys": "Увези E2E кључеве собе", "Cryptography": "Криптографија", - "Device ID:": "ИБ уређаја:", - "Device key:": "Кључ уређаја:", "Riot collects anonymous analytics to allow us to improve the application.": "Riot прикупља анонимне податке о коришћењу да бисмо побољшали апликацију.", "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Приватност је веома важна нама те не сакупљамо било какве податке личне природе у нашој аналитици.", "Learn more about how we use analytics.": "Сазнајте више о нашем начину употребе аналитике.", @@ -685,7 +635,6 @@ "click to reveal": "кликни за приказ", "Homeserver is": "Кућни сервер је", "Identity Server is": "Идентитетски сервер је", - "matrix-react-sdk version:": "matrix-react-sdk издање:", "riot-web version:": "riot-web издање:", "olm version:": "olm издање:", "Failed to send email": "Нисам успео да пошаљем мејл", @@ -716,7 +665,6 @@ "Kicks user with given id": "Избацује корисника са датим иб-јем", "Changes your display nickname": "Мења ваш приказни надимак", "Searches DuckDuckGo for results": "Претражује DuckDuckGo за резултате", - "Verifies a user, device, and pubkey tuple": "Проверава корисника, уређај и торку јавног кључа", "Ignores a user, hiding their messages from you": "Занемарује корисника и тиме скрива њихове поруке од вас", "Stops ignoring a user, showing their messages going forward": "Престаје са занемаривањем корисника и тиме приказује њихове поруке одсад", "Commands": "Наредбе", @@ -740,7 +688,6 @@ "Session ID": "ИБ сесије", "End-to-end encryption information": "Подаци о шифровању с краја на крај", "Event information": "Подаци о догађају", - "Sender device information": "Подаци о уређају пошиљаоца", "Passphrases must match": "Фразе се морају подударати", "Passphrase must not be empty": "Фразе не смеју бити празне", "Export room keys": "Извези кључеве собе", @@ -756,11 +703,7 @@ "Import": "Увези", "Did you know: you can use communities to filter your Riot.im experience!": "Да ли сте знали: можете користити заједнице за филтрирање вашег Riot.im искуства!", "Clear filter": "Очисти филтер", - "Your key share request has been sent - please check your other devices for key share requests.": "Ваш захтев за дељење кључа је послат. Проверите да ли има захтева за дељење кључа на осталим вашим уређајима.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Захтеви за дељење кључа се самостално шаљу на остале ваше уређаје. Ако сте одбили или одбацили захтев за дељење кључа на неком другом вашем уређају, кликните овде да бисте затражили поново кључеве за ову сесију.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Ако остали ваши уређаји немају кључ за ову поруку, нећете моћи да је дешифрујете.", "Key request sent.": "Захтев за дељење кључа послат.", - "Re-request encryption keys from your other devices.": "Поново затражи кључеве за шифровање са осталих ваших уређаја.", "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Да бисте поставили филтер, повуците аватар заједнице на површ филтрирања скроз на леву страну екрана. Можете кликнути на аватар у површи филтрирања било када да бисте видели само собе и особе везане за ту заједницу.", "Fetching third party location failed": "Добављање локације треће стране није успело", "A new version of Riot is available.": "Ново издање RIot-а је доступно.", @@ -807,7 +750,6 @@ "Noisy": "Бучно", "Collecting app version information": "Прикупљам податке о издању апликације", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Обрисати алијас собе %(alias)s и уклонити %(name)s из фасцикле?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Ово ће вам омогућити да се вратите у ваш налог након што се одјавите и пријавите, на другим уређајима.", "Keywords": "Кључне речи", "Enable notifications for this account": "Омогући обавештења за овај налог", "Invite to this community": "Позови у ову заједницу", @@ -921,8 +863,6 @@ "e.g. %(exampleValue)s": "нпр.: %(exampleValue)s", "Send analytics data": "Пошаљи аналитичке податке", "Enable widget screenshots on supported widgets": "Омогући снимке екрана виџета у подржаним виџетима", - "Unable to reply": "Не могу да одговорим", - "At this time it is not possible to reply with an emote.": "У овом тренутку није могуће одговорити са емотиконом.", "Muted Users": "Утишани корисници", "Please help improve Riot.im by sending anonymous usage data. This will use a cookie (please see our Cookie Policy).": "Помозите побољшавање Riot.im програма тако што ћете послати анонимне податке о коришћењу. Ово ће захтевати коришћење колачића (погледајте нашу политику о колачићима).", "Please help improve Riot.im by sending anonymous usage data. This will use a cookie.": "Помозите побољшавање Riot.im програма тако што ћете послати анонимне податке о коришћењу. Ово ће захтевати коришћење колачића.", @@ -959,8 +899,6 @@ "This event could not be displayed": "Овај догађај не може бити приказан", "Demote yourself?": "Снизите чин себи?", "Demote": "Снизите чин", - "deleted": "обрисано", - "underlined": "подвучено", "Whether or not you're logged in (we don't record your username)": "Да ли сте пријављени (не бележимо ваше корисничко име)", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Датотека „%(fileName)s“ премашује ограничење величине отпремања на овом кућном серверу", "Unable to load! Check your network connectivity and try again.": "Нисам могао да учитам! Проверите вашу мрежну везу и пробајте поново.", diff --git a/src/i18n/strings/sr_Latn.json b/src/i18n/strings/sr_Latn.json index a1fc3afafd..810f2a97cf 100644 --- a/src/i18n/strings/sr_Latn.json +++ b/src/i18n/strings/sr_Latn.json @@ -58,12 +58,6 @@ "Moderator": "Moderator", "Admin": "Administrator", "Start a chat": "Pokreni ćaskanje", - "Who would you like to communicate with?": "Sa kim bi želeli da komunicirate?", - "Email, name or Matrix ID": "Adresa elektronske pošte, ime ili Matriks ID", - "Start Chat": "Započni ćaskanje", - "Invite new room members": "Pozovi nove članove u sobu", - "Send Invites": "Poštalji pozivnice", - "Failed to start chat": "Započinjanje ćaskanja nije uspelo", "Operation failed": "Operacija nije uspela", "Failed to invite": "Slanje pozivnice nije uspelo", "Failed to invite users to the room:": "Nije uspelo pozivanje korisnika u sobu:", diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 90c03b84f3..e65e4e2099 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -42,7 +42,6 @@ "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s tog bort rummets namn.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s bytte rummets ämne till \"%(topic)s\".", "Changes your display nickname": "Ändrar ditt visningsnamn", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Om du byter lösenord kommer för tillfället alla krypteringsnycklar på alla enheter att nollställas, vilket gör all krypterad meddelandehistorik omöjligt att läsa, om du inte först exporterar rumsnycklarna och sedan importerar dem efteråt. I framtiden kommer det här att förbättras.", "Claimed Ed25519 fingerprint key": "Påstådd Ed25519-fingeravtrycksnyckel", "Click here to fix": "Klicka här för att fixa", "Click to mute audio": "Klicka för att tysta ljud", @@ -66,12 +65,8 @@ "Decryption error": "Dekrypteringsfel", "Deops user with given id": "Degraderar användare med givet id", "Default": "Standard", - "Device already verified!": "Enheten är redan verifierad!", "Device ID": "Enhets-ID", - "Device ID:": "Enhets-ID:", "device id: ": "enhets-id: ", - "Device key:": "Enhetsnyckel:", - "Devices": "Enheter", "Direct chats": "Direkt-chattar", "Disinvite": "Häv inbjudan", "Displays action": "Visar åtgärd", @@ -120,7 +115,6 @@ "Disable Notifications": "Slå av aviseringar", "Drop File Here": "Dra filen hit", "Enable Notifications": "Aktivera aviseringar", - "Encrypted by an unverified device": "Krypterat av en overifierad enhet", "Enter passphrase": "Ange lösenfras", "Error: Problem communicating with the given homeserver.": "Fel: Det gick inte att kommunicera med den angivna hemservern.", "Failed to fetch avatar URL": "Det gick inte att hämta avatar-URL", @@ -134,7 +128,6 @@ "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s från %(fromPowerLevel)s till %(toPowerLevel)s", "Guests cannot join this room even if explicitly invited.": "Gäster kan inte gå med i det här rummet fastän de är uttryckligen inbjudna.", "Hangup": "Lägg på", - "Hide Text Formatting Toolbar": "Göm textformatteringsverktygsfältet", "Historical": "Historiska", "Home": "Hem", "Homeserver is": "Hemserver är", @@ -147,15 +140,12 @@ "Incoming voice call from %(name)s": "Inkommande röstsamtal från %(name)s", "Incorrect username and/or password.": "Fel användarnamn och/eller lösenord.", "Incorrect verification code": "Fel verifieringskod", - "Invalid alias format": "Fel alias-format", "Invalid Email Address": "Ogiltig epostadress", "Invalid file%(extra)s": "Felaktig fil%(extra)s", "%(senderName)s invited %(targetName)s.": "%(senderName)s bjöd in %(targetName)s.", - "Invite new room members": "Bjud in nya rumsmedlemmar", "Invited": "Inbjuden", "Invites": "Inbjudningar", "Invites user with given id to current room": "Bjuder in användare med givet id till nuvarande rum", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' är inte ett giltigt format för ett alias", "Sign in with": "Logga in med", "Join as voice or video.": "Gå med som röst eller video.", "Join Room": "Gå med i rum", @@ -177,17 +167,11 @@ "%(senderName)s made future room history visible to all room members.": "%(senderName)s gjorde framtida rumshistorik synligt för alla rumsmedlemmar.", "%(senderName)s made future room history visible to anyone.": "%(senderName)s gjorde framtida rumshistorik synligt för alla.", "Manage Integrations": "Hantera integrationer", - "Markdown is disabled": "Markdown är inaktiverat", - "Markdown is enabled": "Markdown är aktiverat", - "matrix-react-sdk version:": "matrix-react-sdk -version:", - "Message not sent due to unknown devices being present": "Meddelandet skickades inte eftersom det finns okända enheter i rummet", "Missing room_id in request": "room_id saknas i förfrågan", "Missing user_id in request": "user_id saknas i förfrågan", "Moderator": "Moderator", "Mute": "Tysta", "Name": "Namn", - "Never send encrypted messages to unverified devices from this device": "Skicka aldrig krypterade meddelanden till overifierade enheter från den här enheten", - "Never send encrypted messages to unverified devices in this room from this device": "Skicka aldrig krypterade meddelanden till overifierade enheter i det här rummet från den här enheten", "New address (e.g. #foo:%(localDomain)s)": "Ny address (t.ex. #foo:%(localDomain)s)", "New passwords don't match": "De nya lösenorden matchar inte", "New passwords must match each other.": "De nya lösenorden måste vara de samma.", @@ -197,7 +181,6 @@ "(not supported by this browser)": "(stöds inte av webbläsaren)", "": "", "NOT verified": "INTE verifierad", - "No devices with registered encryption keys": "Inga enheter med registrerade krypteringsnycklar", "No display name": "Inget visningsnamn", "No more results": "Inga fler resultat", "No results": "Inga resultat", @@ -208,7 +191,6 @@ "Operation failed": "Handlingen misslyckades", "Password": "Lösenord", "Passwords can't be empty": "Lösenorden kan inte vara tomma", - "People": "Personer", "Permissions": "Behörigheter", "Phone": "Telefon", "Please check your email and click on the link it contains. Once this is done, click continue.": "Öppna meddelandet i din epost och klicka på länken i meddelandet. När du har gjort detta, klicka vidare.", @@ -234,7 +216,6 @@ "riot-web version:": "riot-web -version:", "Room %(roomId)s not visible": "Rummet %(roomId)s är inte synligt", "Room Colour": "Rumsfärg", - "Room contains unknown devices": "Det finns okända enheter i rummet", "%(roomName)s does not exist.": "%(roomName)s finns inte.", "%(roomName)s is not accessible at this time.": "%(roomName)s är inte tillgängligt för tillfället.", "Rooms": "Rum", @@ -245,8 +226,6 @@ "Searches DuckDuckGo for results": "Söker efter resultat på DuckDuckGo", "Seen by %(userName)s at %(dateTime)s": "Sedd av %(userName)s %(dateTime)s", "Send anyway": "Skicka ändå", - "Sender device information": "Sändarens enhetsinformation", - "Send Invites": "Skicka inbjudningar", "Send Reset Email": "Skicka återställningsmeddelande", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s skickade en bild.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s bjöd in %(targetDisplayName)s med i rummet.", @@ -258,7 +237,6 @@ "%(senderName)s set a profile picture.": "%(senderName)s satte en profilbild.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s bytte sitt visningnamn till %(displayName)s.", "Settings": "Inställningar", - "Show Text Formatting Toolbar": "Visa textformatteringsverktygsfält", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Visa tidsstämplar i 12-timmarsformat (t.ex. 2:30pm)", "Signed Out": "Loggade ut", "Sign in": "Logga in", @@ -267,7 +245,6 @@ "Someone": "Någon", "Start a chat": "Starta en chatt", "Start authentication": "Starta autentisering", - "Start Chat": "Starta en chatt", "Cancel": "Avbryt", "Create new room": "Skapa nytt rum", "Custom Server Options": "Anpassade serverinställningar", @@ -289,7 +266,6 @@ "Submit": "Lämna in", "The maximum permitted number of widgets have already been added to this room.": "Den största tillåtna mängden widgetar har redan tillsats till rummet.", "The phone number entered looks invalid": "Det angivna telefonnumret är ogiltigt", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Signeringsnyckeln du angav matchar signeringsnyckeln som mottogs från enheten %(deviceId)s som tillhör %(userId)s. Enheten är markerad som verifierad.", "This email address is already in use": "Den här epostadressen används redan", "This email address was not found": "Den här epostadressen finns inte", "The email address linked to your account must be entered.": "Epostadressen som är kopplad till ditt konto måste anges.", @@ -386,7 +362,6 @@ "Files": "Filer", "Collecting app version information": "Samlar in appversionsinformation", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Radera rumsadressen %(alias)s och ta bort %(name)s från katalogen?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Detta kommer tillåta dig att återgå till ditt konto efter att ha loggat ut, och logga in på andra enheter.", "Keywords": "Nyckelord", "Enable notifications for this account": "Aktivera aviseringar för det här kontot", "Messages containing keywords": "Meddelanden som innehåller nyckelord", @@ -474,7 +449,6 @@ "You cannot place VoIP calls in this browser.": "Du kan inte ringa VoIP-samtal i den här webbläsaren.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Din epostadress verkar inte vara kopplad till något Matrix-ID på den här hemservern.", "Restricted": "Begränsad", - "Who would you like to communicate with?": "Vem vill du kommunicera med?", "Failed to invite the following users to the %(roomName)s room:": "Det gick inte att bjuda in följande användare till %(roomName)s-rummet:", "Unable to create widget.": "Det går inte att skapa widget.", "Ignored user": "Ignorerad användare", @@ -504,9 +478,6 @@ "Send an encrypted message…": "Skicka ett krypterat meddelande…", "Send a message (unencrypted)…": "Skicka ett meddelande (okrypterat)…", "You do not have permission to post to this room": "Du har inte behörighet att posta till detta rum", - "Unable to reply": "Det gick inte att svara", - "bold": "fet", - "italic": "kursiv", "Loading...": "Laddar...", "%(duration)ss": "%(duration)s", "%(duration)sm": "%(duration)sm", @@ -582,13 +553,9 @@ "Start automatically after system login": "Starta automatiskt vid systeminloggning", "This will allow you to reset your password and receive notifications.": "Det här låter dig återställa lösenordet och ta emot aviseringar.", "You have no visible notifications": "Du har inga synliga aviseringar", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Ditt lösenord har ändrats. Du kommer inte att få push-aviseringar på andra enheter förrän du har loggat in på dem igen", "Failed to upload image": "Det gick inte att ladda upp bild", "New Password": "Nytt lösenord", "Do you want to set an email address?": "Vill du ange en epostadress?", - "Unable to load device list": "Det gick inte att ladda enhetslista", - "Delete %(count)s devices|other": "Ta bort %(count)s enheter", - "Delete %(count)s devices|one": "Ta bort enhet", "Use compact timeline layout": "Använd kompakt tidslinjelayout", "Not a valid Riot keyfile": "Inte en giltig Riot-nyckelfil", "Authentication check failed: incorrect password?": "Autentiseringskontroll misslyckades: felaktigt lösenord?", @@ -604,7 +571,6 @@ "You seem to be uploading files, are you sure you want to quit?": "Du verkar ladda upp filer, är du säker på att du vill avsluta?", "You seem to be in a call, are you sure you want to quit?": "Du verkar vara i ett samtal, är du säker på att du vill avsluta?", "Active call": "Aktivt samtal", - "Show devices, send anyway or cancel.": "Visa enheter, skicka ändå eller avbryt.", "%(count)s of your messages have not been sent.|one": "Ditt meddelande skickades inte.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Skicka om alla eller ångra alla nu. Du kan även välja enskilda meddelanden för att skicka om eller ångra.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Skicka om meddelande eller ångra meddelande nu.", @@ -627,8 +593,6 @@ "Removed or unknown message type": "Borttagen eller okänd meddelandetyp", "Message removed by %(userId)s": "Meddelande borttaget av %(userId)s", "Message removed": "Meddelande borttaget", - "Unknown devices": "Okända enheter", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" innehåller enheter som du inte har sett tidigare.", "Delete Widget": "Ta bort widget", "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Widget tas bort för alla användare i rummet. Är du säker på att du vill ta bort den?", "Minimize apps": "Minimera appar", @@ -661,7 +625,6 @@ "%(senderName)s sent a video": "%(senderName)s skickade en video", "%(senderName)s uploaded a file": "%(senderName)s laddade upp en fil", "Options": "Alternativ", - "Unencrypted message": "Okrypterat meddelande", "Replying": "Svarar", "Kick this user?": "Kicka användaren?", "This room": "Detta rum", @@ -681,12 +644,7 @@ "Create": "Skapa", "Unknown error": "Okänt fel", "Incorrect password": "Felaktigt lösenord", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "För att verifiera att denna enhet kan litas på, vänligen kontakta ägaren på annat sätt (t ex personligen eller med ett telefonsamtal) och fråga om nyckeln ägaren har i sina användarinställningar för enheten matchar nyckeln nedan:", - "Device name": "Enhetsnamn", - "Device key": "Enhetsnyckel", - "Verify device": "Verifiera enhet", "I verify that the keys match": "Jag verifierar att nycklarna matchar", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Om det matchar, tryck på verifieringsknappen nedan. Om inte så är det risk att någon annan försöker avlyssna enheten och då vill du förmodligen trycka på svartlistsknappen istället.", "State Key": "Lägesnyckel", "Send Account Data": "Skicka kontodata", "Explore Account Data": "Utforska kontodata", @@ -694,12 +652,9 @@ "Developer Tools": "Utvecklarverktyg", "Unverify": "Ta bort verifiering", "Verify...": "Verifiera...", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Du har lagt till en ny enhet '%(displayName)s', som begär krypteringsnycklar.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Din overifierade enhet '%(displayName)s' begär krypteringsnycklar.", "Start verification": "Starta verifiering", "Share without verifying": "Dela utan att verifiera", "Ignore request": "Ignorera begäran", - "Loading device info...": "Laddar enhetsinfo...", "Encryption key request": "Begäran av krypteringsnyckel", "Clear Storage and Sign Out": "Rensa lagring och logga ut", "Send Logs": "Skicka loggar", @@ -708,25 +663,18 @@ "We encountered an error trying to restore your previous session.": "Ett fel uppstod vid återställning av din tidigare session.", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Om du nyligen har använt en senare version av Riot kan din session vara inkompatibel med den här versionen. Stäng det här fönstret och använd senare versionen istället.", "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Att rensa webbläsarens lagring kan lösa problemet, men då loggas du ut och krypterad chatthistorik blir oläslig.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "För tillfället svartlistar du overifierade enheter. För att skicka meddelanden till dessa enheter måste du verifiera dem.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Vi rekommenderar att du går igenom verifieringsprocessen för varje enhet för att bekräfta att de tillhör sina rätta ägare, men du kan skicka meddelandet utan att verifiera om du föredrar det.", "Collapse Reply Thread": "Dölj svarstråd", "Terms and Conditions": "Villkor", "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "För att fortsätta använda hemservern %(homeserverDomain)s måste du granska och godkänna våra villkor.", "Review terms and conditions": "Granska villkoren", "Old cryptography data detected": "Gammal krypteringsdata upptäckt", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Det finns okända enheter i rummet: om du fortsätter utan att verifiera dem, är det möjligt att någon kan avlyssna ditt samtal.", "Unable to capture screen": "Det gick inte att ta skärmdump", "Failed to add the following rooms to %(groupId)s:": "Det gick inte att lägga till följande rum till %(groupId)s:", "Missing roomId.": "Rums-ID saknas.", "This room is not recognised.": "Detta rum känns inte igen.", "Usage": "Användning", "Unrecognised room alias:": "Oigenkänt rumsalias:", - "Unknown (user, device) pair:": "Okänt (användare, enhet) par:", - "WARNING: Device already verified, but keys do NOT MATCH!": "VARNING: Enhet redan verifierad, men nycklarna MATCHAR INTE!", "Verified key": "Verifierad nyckel", - "Unrecognised command:": "Oigenkänt kommando:", - "Verifies a user, device, and pubkey tuple": "Verifierar en användare, enhet och offentlig nyckel-tupel", "VoIP conference started.": "VoIP-konferens startad.", "VoIP conference finished.": "VoIP-konferens avslutad.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s gjorde framtida rumshistorik synligt för okänd (%(visibility)s).", @@ -745,7 +693,6 @@ "Please help improve Riot.im by sending anonymous usage data. This will use a cookie (please see our Cookie Policy).": "Vänligen hjälp till att förbättra Riot.im genom att skicka anonyma användardata. Detta kommer att använda en cookie (se vår Cookiepolicy).", "Please help improve Riot.im by sending anonymous usage data. This will use a cookie.": "Vänligen hjälp till att förbättra Riot.im genom att skicka anonyma användardata. Detta kommer att använda en cookie.", "Yes, I want to help!": "Ja, jag vill hjälpa till!", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s aktiverade totalsträckskryptering (algoritm %(algorithm)s).", "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)slämnade och gick med igen %(count)s gånger", "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)slämnade och gick med igen", "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)slämnade och gick med igen %(count)s gånger", @@ -863,9 +810,7 @@ "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Du kommer inte att kunna ångra den här ändringen eftersom du höjer användaren till samma behörighetsnivå som dig själv.", "User Options": "Användaralternativ", "unknown caller": "okänd uppringare", - "At this time it is not possible to reply with an emote.": "Det är för närvarande inte möjligt att svara med en emoji.", "To use it, just wait for autocomplete results to load and tab through them.": "För att använda detta, vänta på att autokompletteringen laddas och tabba igenom resultatet.", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "VARNING: NYCKELVERIFIERINGEN MISSLYCKADES! Signeringsnyckeln för %(userId)s och enhet %(deviceId)s är \"%(fprint)s\" som inte matchar den angivna nyckeln \"%(fingerprint)s\". Detta kan betyda att dina kommunikationer avlyssnas!", "Enable inline URL previews by default": "Aktivera URL-förhandsvisning som standard", "Enable URL previews for this room (only affects you)": "Aktivera URL-förhandsvisning för detta rum (påverkar bara dig)", "Enable URL previews by default for participants in this room": "Aktivera URL-förhandsvisning som standard för deltagare i detta rum", @@ -888,12 +833,7 @@ "Unable to accept invite": "Det gick inte att acceptera inbjudan", "Leave %(groupName)s?": "Lämna %(groupName)s?", "Enable widget screenshots on supported widgets": "Aktivera widget-skärmdumpar för widgets som stöder det", - "Your key share request has been sent - please check your other devices for key share requests.": "Din nyckeldelningsbegäran har skickats - kolla efter nyckeldelningsbegäran på dina andra enheter.", - "Undecryptable": "Odekrypterbar", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Nyckeldelningsbegäran skickas automatiskt till dina andra enheter. Om du avvisat nyckelbegäran på dina andra enheter, klicka här för att begära nycklarna till den här sessionen igen.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Om dina andra enheter inte har nyckeln till detta meddelande kommer du du att kunna dekryptera det.", "Key request sent.": "Nyckelbegäran skickad.", - "Re-request encryption keys from your other devices.": "Begär krypteringsnycklar igen från dina andra enheter.", "Unban": "Avbanna", "Unban this user?": "Avbanna användaren?", "Unmute": "Ta bort dämpning", @@ -957,12 +897,6 @@ "Permission Required": "Behörighet krävs", "You do not have permission to start a conference call in this room": "Du har inte behörighet att starta ett konferenssamtal i detta rum", "This event could not be displayed": "Den här händelsen kunde inte visas", - "deleted": "borttagen", - "underlined": "understruken", - "inline-code": "kod", - "block-quote": "citat", - "bulleted-list": "punktlista", - "numbered-list": "nummerlista", "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.": "I krypterade rum, som detta, är URL-förhandsvisning inaktiverad som standard för att säkerställa att din hemserver (där förhandsvisningar genereras) inte kan samla information om länkar du ser i rummet.", "The email field must not be blank.": "Epost-fältet får inte vara tomt.", "The phone number field must not be blank.": "Telefonnummer-fältet får inte vara tomt.", @@ -1131,7 +1065,6 @@ "Pencil": "Penna", "Paperclip": "Gem", "Scissors": "Sax", - "Padlock": "Hänglås", "Key": "Nyckel", "Hammer": "Hammare", "Telephone": "Telefon", @@ -1156,7 +1089,6 @@ "Verification code": "Verifieringskod", "Phone Number": "Telefonnummer", "Profile picture": "Profilbild", - "Upload profile picture": "Ladda upp profilbild", "Display Name": "Visningsnamn", "Set a new account password...": "Ange ett nytt lösenord för kontot...", "Email addresses": "Epostadresser", @@ -1261,16 +1193,10 @@ "Encryption": "Kryptering", "Once enabled, encryption cannot be disabled.": "Efter aktivering kan kryptering inte inaktiveras igen.", "Encrypted": "Krypterat", - "Some devices for this user are not trusted": "Vissa enheter för den här användaren är inte betrodda", - "Some devices in this encrypted room are not trusted": "Vissa enheter i det här krypterade rummet är inte betrodda", - "All devices for this user are trusted": "Alla enheter för den här användaren är betrodda", - "All devices in this encrypted room are trusted": "Alla enheter i det här krypterade rummet är betrodda", "Not now": "Inte nu", "Don't ask me again": "Fråga mig inte igen", "Error updating main address": "Fel vid uppdatering av huvudadress", "Room avatar": "Rumsavatar", - "Upload room avatar": "Ladda upp rumsavatar", - "No room avatar": "Ingen rumsavatar", "Room Name": "Rumsnamn", "Room Topic": "Rumsämne", "The following users may not exist": "Följande användare kanske inte existerar", @@ -1289,8 +1215,6 @@ "Verify this user by confirming the following emoji appear on their screen.": "Verifiera den här användaren genom att bekräfta följande emoji visas på deras skärm.", "Verify this user by confirming the following number appears on their screen.": "Verifiera den här användaren genom att bekräfta att följande nummer visas på deras skärm.", "Unable to find a supported verification method.": "Det går inte att hitta en verifieringsmetod som stöds.", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "För maximal säkerhet rekommenderar vi att du gör det personligen eller använder ett annat betrott kommunikationsmedel.", - "Your homeserver does not support device management.": "Din hemserver stöder inte enhetshantering.", "Delete Backup": "Ta bort säkerhetskopia", "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Är du säker? Du kommer att förlora dina krypterade meddelanden om dina nycklar inte säkerhetskopieras ordentligt.", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Krypterade meddelanden är säkrade med totalsträckskryptering. Bara du och mottagaren/na har nycklarna för att läsa dessa meddelanden.", @@ -1323,15 +1247,10 @@ "Unable to load backup status": "Det går inte att ladda backupstatus", "Guest": "Gäst", "Could not load user profile": "Kunde inte ladda användarprofil", - "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "Om du ändrar ditt lösenord återställs eventuella krypteringsnycklar på alla dina enheter, vilket gör att krypterad chatthistorik inte kan läsas. Aktivera nyckelsäkerhetskopiering eller exportera dina rumsnycklar från en annan enhet innan du återställer ditt lösenord.", "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Om du använder 'breadcrumbs' eller inte (avatarer ovanför rumslistan)", "Replying With Files": "Svarar med filer", "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Just nu är det inte möjligt att svara med en fil. Vill du ladda upp filen utan att svara?", "The file '%(fileName)s' failed to upload.": "Filen '%(fileName)s' kunde inte laddas upp.", - "Room upgrade confirmation": "Bekräfta rumsuppgradering", - "Upgrading a room can be destructive and isn't always necessary.": "Uppgradering av ett rum kan vara destruktivt och är inte alltid nödvändigt.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Rumsuppgraderingar rekommenderas vanligtvis när en rumversion anses vara instabil. Instabila rumsversioner kan ha fel, sakna funktioner eller ha säkerhetsproblem.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Rumuppgraderingar påverkar vanligtvis bara bearbetningen av rummet på serversidan. Om du har problem med din Riot-klient, vänligen anmäl ett ärende på .", "Composer": "Meddelandefält", "Key backup": "Nyckelsäkerhetskopiering", "Never lose encrypted messages": "Förlora aldrig krypterade meddelanden", @@ -1377,13 +1296,11 @@ "Cancel All": "Avbryt alla", "Upload Error": "Uppladdningsfel", "Name or Matrix ID": "Namn eller Martix-ID", - "Email, name or Matrix ID": "Email, namn, eller Matrix-ID", "Your Riot is misconfigured": "Riot är felkonfigurerat", "Call failed due to misconfigured server": "Anrop misslyckades på grund av felkonfigurerad server", "Try using turn.matrix.org": "Prova att använda turn.matrix.org", "A conference call could not be started because the integrations server is not available": "Ett konferenssamtal kunde inte startas eftersom integrationsservern inte är tillgänglig", "The server does not support the room version specified.": "Servern stöder inte den angivna rumsversionen.", - "Failed to start chat": "Det gick inte att starta chatten", "Messages": "Meddelanden", "Actions": "Åtgärder", "Sends a message as plain text, without interpreting it as markdown": "Skickar ett meddelande som vanlig text, utan att tolka det som markdown", @@ -1440,7 +1357,6 @@ "Discovery": "Upptäckt", "Deactivate account": "Inaktivera konto", "Always show the window menu bar": "Visa alltid fönstermenyn", - "A device's public name is visible to people you communicate with": "En enhets offentliga namn är synligt för personer du kommunicerar med", "this room": "detta rum", "View older messages in %(roomName)s.": "Visa äldre meddelanden i %(roomName)s.", "Uploaded sound": "Uppladdat ljud", @@ -1478,8 +1394,6 @@ "Sign Up": "Registrera dig", "Sign In": "Logga in", "Prompt before sending invites to potentially invalid matrix IDs": "Fråga innan inbjudningar skickas till potentiellt ogiltiga matrix-IDn", - "Enable desktop notifications for this device": "Aktivera skrivbordsaviseringar för denna enhet", - "Enable audible notifications for this device": "Aktivera ljudaviseringar för denna enhet", "Show all": "Visa alla", "reacted with %(shortName)s": "reagerade med %(shortName)s", "Edited at %(date)s. Click to view edits.": "Ändrad %(date)s. Klicka för att visa ändringar.", @@ -1495,7 +1409,6 @@ "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Be administratören för din hemserver (%(homeserverDomain)s) att konfigurera en TURN-server för att samtal ska fungera pålitligt.", "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.": "Alternativt kan du testa att använda den offentliga servern turn.matrix.org, men det är inte lika pålitligt och det kommer att dela din IP-adress med den servern. Du kan också hantera detta under Inställningar.", "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.": "Varning: Uppgradering av ett rum flyttar inte automatiskt rumsmedlemmar till den nya versionen av rummet. Vi lägger ut en länk till det nya rummet i den gamla versionen av rummet - rumsmedlemmar måste klicka på den här länken för att gå med i det nya rummet.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Bekräfta att du vill gå vidare med att uppgradera detta rum från till .", "Changes the avatar of the current room": "Ändrar avataren i det aktuella rummet", "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Använd en identitetsserver för att bjuda in via epost. Klicka på Fortsätt för att använda standardidentitetsservern (%(defaultIdentityServerName)s) eller hantera det i Inställningar.", "Use an identity server to invite by email. Manage in Settings.": "Använd en identitetsserver för att bjuda in via epost. Hantera det i inställningar.", @@ -1504,13 +1417,8 @@ "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "Tillåt samtalsserver turn.matrix.org som reserv när din hemserver inte erbjuder en (din IP-adress delades under ett samtal)", "Unable to load key backup status": "Det går inte att ladda status för nyckelsäkerhetskopiering", "Restore from Backup": "Återställ från säkerhetskopiering", - "This device is backing up your keys. ": "Den här enheten säkerhetskopierar dina nycklar. ", - "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Den här enheten säkerhetskopierar inte dina nycklar, men du har en befintlig säkerhetskopia som du kan återställa från och lägga till i framöver.", - "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Anslut denna enhet till säkerhetskopiering innan du loggar ut för att undvika att förlora några nycklar som kanske bara finns på den här enheten.", - "Connect this device to Key Backup": "Anslut den här enheten till nyckelsäkerhetskopiering", "Backing up %(sessionsRemaining)s keys...": "Säkerhetskopierar %(sessionsRemaining)s nycklar...", "All keys backed up": "Alla nycklar säkerhetskopierade", - "Backup has a signature from unknown device with ID %(deviceId)s.": "Säkerhetskopian har en signatur från okänd enhet med ID %(deviceId)s.", "Add Email Address": "Lägg till e-postadress", "Add Phone Number": "Lägg till telefonnummer", "Identity server has no terms of service": "Identitetsserver har inga användarvillkor", @@ -1518,7 +1426,6 @@ "Trust": "Förtroende", "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", "Try out new ways to ignore people (experimental)": "Testa nya sätt att ignorera personer (experimentalt)", - "Use the new, faster, composer for writing messages": "Använd den nya, snabbare kompositören för att skriva meddelanden", "Show previews/thumbnails for images": "Visa förhandsvisning/tumnagel för bilder", "Send cross-signing keys to homeserver": "Skicka korssigneringsnycklar till hemserver", "Custom (%(level)s)": "Anpassad (%(level)s)", @@ -1533,7 +1440,6 @@ "%(senderName)s removed the rule banning servers matching %(glob)s": "%(senderName)s tog bort regeln som bannar servrar som matchar %(glob)s", "Match system theme": "Matcha systemtema", "Decline (%(counter)s)": "Avvisa (%(counter)s)", - "on device": "på enhet", "not found": "hittades inte", "Connecting to integration manager...": "Ansluter till integrationshanterare...", "Cannot connect to integration manager": "Det går inte att ansluta till integrationshanterare", @@ -1623,9 +1529,7 @@ "Suggestions": "Förslag", "Show more": "Visa mer", "Direct Messages": "Direktmeddelanden", - "If you can't find someone, ask them for their username, or share your username (%(userId)s) or profile link.": "Om det är någon du inte kan hitta, be dem om sitt användarnamn eller dela ditt användarnamn (%(userId)s) eller profillänk.", "Go": "Gå", - "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "Verifiering av den här användaren kommer att markera deras enhet som betrodd, men även markera din enhet som den är betrodd för dem.", "Waiting for partner to confirm...": "Väntar på att kompanjon ska bekräfta...", "Incoming Verification Request": "Inkommande verifieringsbegäran", "Integrations are disabled": "Integrationer är inaktiverade", @@ -1636,8 +1540,6 @@ "Message edits": "Meddelandedigeringar", "Preview": "Förhandsvisa", "The message you are trying to send is too large.": "Meddelandet du försöker skicka är för stort.", - "New DM invite dialog (under development)": "Ny inbjudningsdialog för direktmeddelanden (under utveckling)", - "Enable cross-signing to verify per-user instead of per-device (in development)": "Aktivera korssignering för att verifiera per användare istället för per enhet (under utveckling)", "Find others by phone or email": "Hitta andra via telefon eller epost", "Be found by phone or email": "Bli hittad via telefon eller e-post", "Terms of Service": "Användarvillkor", diff --git a/src/i18n/strings/ta.json b/src/i18n/strings/ta.json index a1c9cca93c..9bc5ccbfaf 100644 --- a/src/i18n/strings/ta.json +++ b/src/i18n/strings/ta.json @@ -151,7 +151,6 @@ "The information being sent to us to help make Riot.im better includes:": "Riot.im ஐ சிறப்பாகச் செய்ய எங்களுக்கு அனுப்பப்படும் தகவல்களில் பின்வருவன அடங்கும்:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "இந்த பக்கம் ஒரு அறை, பயனர் அல்லது குழு ஐடி போன்ற அடையாளம் காணக்கூடிய தகவல்களை உள்ளடக்கியது, அந்த தரவு சேவையகத்திற்கு அனுப்பப்படுவதற்கு முன்பு அகற்றப்படும்.", "Call Failed": "அழைப்பு தோல்வியுற்றது", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "இந்த அறையில் அறியப்படாத சாதனங்கள் உள்ளன: அவற்றைச் சரிபார்க்காமல் தொடர்ந்தால், உங்கள் அழைப்பில் யாராவது செவிமடுப்பது சாத்தியமாகும்.", "Review Devices": "சாதனங்களை மதிப்பாய்வு செய்யவும்", "Call Anyway": "எப்படியும் அழைக்கவும்", "Answer Anyway": "எப்படியும் பதில் சொல்லுங்கள்", diff --git a/src/i18n/strings/te.json b/src/i18n/strings/te.json index dfd5a5b1f4..c5afde7e24 100644 --- a/src/i18n/strings/te.json +++ b/src/i18n/strings/te.json @@ -47,7 +47,6 @@ "You cannot place VoIP calls in this browser.": "మీరు ఈ బ్రౌజర్లో కాల్లను చేయలేరు.", "You have no visible notifications": "మీకు కనిపించే నోటిఫికేషన్లు లేవు", "You need to be able to invite users to do that.": "మీరు దీన్ని చేయడానికి వినియోగదారులను ఆహ్వానించగలరు.", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "పాస్ వర్డ్ మార్చడం వల్ల ప్రస్తుతం అన్ని పరికరాల్లో ఏదైనా ఎండ్-టు-ఎండ్ ఎన్క్రిప్షన్ కీలను రీసెట్ చేస్తుంది, ఎన్క్రిప్టెడ్ చాట్ చరిత్రను చదవటానికి వీలెకుండ చెస్తుంది, మీరు మొదట మీ గది కీలను ఎగుమతి చేసి, తర్వాత వాటిని తిరిగి దిగుమతి చేసుకోకపోతే. భవిష్యత్తులో ఇది మెరుగవుతుంది.", "Claimed Ed25519 fingerprint key": "ఎడ్25519 వేలిముద్ర కీ ని పేర్కొన్నారు", "Click here to fix": "పరిష్కరించడానికి ఇక్కడ క్లిక్ చేయండి", "Click to mute audio": "ఆడియోను మ్యూట్ చేయడానికి క్లిక్ చేయండి", @@ -73,8 +72,6 @@ "Decryption error": "గుప్తలేఖన లోపం", "Deops user with given id": "ఇచ్చిన ID తో వినియోగదారుని విడదీస్తుంది", "Default": "డిఫాల్ట్", - "Device already verified!": "పరికరం ఇప్పటికే ధృవీకరించబడింది!", - "Devices": "పరికరాలు", "Sun": "ఆదివారం", "Mon": "సోమవారం", "Tue": "మంగళవారం", @@ -84,8 +81,6 @@ "Sat": "శనివారం", "Jan": "జనవరి", "Feb": "ఫిబ్రవరి", - "Markdown is disabled": "మార్క్డౌన్ నిలిపివేయబడింది", - "Markdown is enabled": "మార్క్డౌన్ ప్రారంభించబడింది", "Mar": "మార్చి", "Apr": "ఏప్రిల్", "Server may be unavailable, overloaded, or search timed out :(": "సర్వర్ అందుబాటులో లేకపోవచ్చు, ఓవర్లోడ్ లేదా శోధన సమయం ముగిసి ఉండవచ్చు :(", @@ -111,8 +106,6 @@ "Connectivity to the server has been lost.": "సెర్వెర్ కనెక్టివిటీని కోల్పోయారు.", "Sent messages will be stored until your connection has returned.": "మీ కనెక్షన్ తిరిగి వచ్చే వరకు పంపిన సందేశాలు నిల్వ చేయబడతాయి.", "Cancel": "రద్దు", - "bold": "బోల్డ్", - "italic": "ఇటాలిక్", "Failed to forget room %(errCode)s": "గది మర్చిపోవడం విఫలమైంది %(errCode)s", "Incorrect verification code": "ధృవీకరణ కోడ్ సరిగా లెదు", "unknown error code": "తెలియని కోడ్ లోపం", diff --git a/src/i18n/strings/th.json b/src/i18n/strings/th.json index 7cc6214592..333beca311 100644 --- a/src/i18n/strings/th.json +++ b/src/i18n/strings/th.json @@ -13,15 +13,12 @@ "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s เปลี่ยนหัวข้อเป็น \"%(topic)s\"", "Decrypt %(text)s": "ถอดรหัส %(text)s", "Device ID": "ID อุปกรณ์", - "Device ID:": "ID อุปกรณ์:", "device id: ": "id อุปกรณ์: ", - "Devices": "อุปกรณ์", "Download %(text)s": "ดาวน์โหลด %(text)s", "Emoji": "อีโมจิ", "Error": "ข้อผิดพลาด", "Kick": "เตะ", "Low priority": "ความสำคัญต่ำ", - "matrix-react-sdk version:": "เวอร์ชัน matrix-react-sdk:", "Name": "ชื่อ", "OK": "ตกลง", "Password": "รหัสผ่าน", @@ -88,8 +85,6 @@ "/ddg is not a command": "/ddg ไม่ใช่คำสั่ง", "Deactivate Account": "ปิดการใช้งานบัญชี", "Decryption error": "การถอดรหัสผิดพลาด", - "Device already verified!": "ยืนยันอุปกรณ์แล้ว!", - "Device key:": "Key อุปกรณ์:", "Direct chats": "แชทตรง", "Disinvite": "ถอนคำเชิญ", "Ed25519 fingerprint": "ลายนิ้วมือ Ed25519", @@ -124,15 +119,12 @@ "Import": "นำเข้า", "Incorrect username and/or password.": "ชื่อผู้ใช้และ/หรือรหัสผ่านไม่ถูกต้อง", "Incorrect verification code": "รหัสยืนยันไม่ถูกต้อง", - "Invalid alias format": "รูปแบบนามแฝงไม่ถูกต้อง", "Invalid Email Address": "ที่อยู่อีเมลไม่ถูกต้อง", "Invalid file%(extra)s": "ไฟล์ %(extra)s ไม่ถูกต้อง", "%(senderName)s invited %(targetName)s.": "%(senderName)s เชิญ %(targetName)s แล้ว", - "Invite new room members": "เชิญสมาชิกใหม่", "Invited": "เชิญแล้ว", "Invites": "คำเชิญ", "Invites user with given id to current room": "เชิญผู้ใช้ พร้อม id ของห้องปัจจุบัน", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' ไม่ใช่รูปแบบที่ถูกต้องสำหรับนามแฝง", "Sign in with": "เข้าสู่ระบบด้วย", "Join Room": "เข้าร่วมห้อง", "%(targetName)s joined the room.": "%(targetName)s เข้าร่วมห้องแล้ว", @@ -142,8 +134,6 @@ "Leave room": "ออกจากห้อง", "%(targetName)s left the room.": "%(targetName)s ออกจากห้องแล้ว", "Logout": "ออกจากระบบ", - "Markdown is disabled": "ปิดใช้งาน Markdown แล้ว", - "Markdown is enabled": "เปิดใช้งาน Markdown แล้ว", "Missing user_id in request": "ไม่พบ user_id ในคำขอ", "Moderator": "ผู้ช่วยดูแล", "New address (e.g. #foo:%(localDomain)s)": "ที่อยู่ใหม่ (เช่น #foo:%(localDomain)s)", @@ -157,7 +147,6 @@ "No more results": "ไม่มีผลลัพธ์อื่น", "No results": "ไม่มีผลลัพธ์", "Passwords can't be empty": "รหัสผ่านต้องไม่ว่าง", - "People": "บุคคล", "Permissions": "สิทธิ์", "Phone": "โทรศัพท์", "Please check your email and click on the link it contains. Once this is done, click continue.": "กรุณาเช็คอีเมลและคลิกลิงก์ข้างใน หลังจากนั้น คลิกดำเนินการต่อ", @@ -176,7 +165,6 @@ "Scroll to bottom of page": "เลื่อนลงไปล่างสุด", "Search failed": "การค้นหาล้มเหลว", "Searches DuckDuckGo for results": "ค้นหาบน DuckDuckGo", - "Send Invites": "ส่งคำเชิญ", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s ได้ส่งรูป", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s ได้ส่งคำเชิญให้ %(targetDisplayName)s เข้าร่วมห้อง", "Server error": "เซิร์ฟเวอร์ผิดพลาด", @@ -192,7 +180,6 @@ "Always show message timestamps": "แสดงเวลาในแชทเสมอ", "Show timestamps in 12 hour format (e.g. 2:30pm)": "แสดงเวลาในแชทในรูปแบบ 12 ชั่วโมง (เช่น 2:30pm)", "Start a chat": "เริ่มแชท", - "Start Chat": "เริ่มแชท", "Submit": "ส่ง", "Success": "สำเร็จ", "This email address is already in use": "ที่อยู่อีเมลถูกใช้แล้ว", @@ -209,19 +196,15 @@ "Import E2E room keys": "นำเข้ากุญแจถอดรหัส E2E", "The phone number entered looks invalid": "ดูเหมือนว่าหมายเลขโทรศัพท์ที่กรอกรมาไม่ถูกต้อง", "The email address linked to your account must be entered.": "กรุณากรอกที่อยู่อีเมลที่เชื่อมกับบัญชีของคุณ", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ได้เปิดใช้งานการเข้ารหัสจากปลายทางถึงปลายทาง (อัลกอริทึม%(algorithm)s).", "Unable to add email address": "ไมาสามารถเพิ่มที่อยู่อีเมล", "Unable to verify email address.": "ไม่สามารถยืนยันที่อยู่อีเมล", "Unban": "ปลดแบน", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s ปลดแบน %(targetName)s แล้ว", "Unable to capture screen": "ไม่สามารถจับภาพหน้าจอ", "Unable to enable Notifications": "ไม่สามารถเปิดใช้งานการแจ้งเตือน", - "Unable to load device list": "ไม่สามารถโหลดรายชื่ออุปกรณ์", "unencrypted": "ยังไม่ได้เข้ารหัส", "unknown device": "อุปกรณ์ที่ไม่รู้จัก", "Unknown room %(roomId)s": "ห้องที่ไม่รู้จัก %(roomId)s", - "Unknown (user, device) pair:": "คู่ (ผู้ใช้, อุปกรณ์) ที่ไม่รู้จัก:", - "Unrecognised command:": "คำสั่งที่ไม่รู้จัก:", "Unrecognised room alias:": "นามแฝงห้องที่ไม่รู้จัก:", "Uploading %(filename)s and %(count)s others|zero": "กำลังอัปโหลด %(filename)s", "Uploading %(filename)s and %(count)s others|one": "กำลังอัปโหลด %(filename)s และอีก %(count)s ไฟล์", @@ -233,12 +216,10 @@ "Warning!": "คำเตือน!", "Who can access this room?": "ใครสามารถเข้าถึงห้องนี้ได้?", "Who can read history?": "ใครสามารถอ่านประวัติแชทได้?", - "Who would you like to communicate with?": "คุณต้องการคุยกับใคร?", "You have disabled URL previews by default.": "ค่าเริ่มต้นของคุณปิดใช้งานตัวอย่าง URL เอาไว้", "You have enabled URL previews by default.": "ค่าเริ่มต้นของคุณเปิดใช้งานตัวอย่าง URL เอาไว้", "You must register to use this functionality": "คุณต้องลงทะเบียนเพื่อใช้ฟังก์ชันนี้", "You need to be logged in.": "คุณต้องเข้าสู่ระบบก่อน", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "การเปลี่ยนรหัสผ่านเสร็จสมบูณณ์ คุณจะไม่ได้รับการแจ้งเตือนบนอุปกรณ์อื่น ๆ จนกว่าคุณจะกลับเข้าสู่ระบบในอุปกรณ์เหล่านั้น", "Sun": "อา.", "Mon": "จ.", "Tue": "อ.", @@ -264,8 +245,6 @@ "Set a display name:": "ตั้งชื่อที่แสดง:", "Make Moderator": "เลื่อนขั้นเป็นผู้ช่วยดูแล", "Room": "ห้อง", - "bold": "หนา", - "italic": "เอียง", "New Password": "รหัสผ่านใหม่", "Options": "ตัวเลือก", "Export room keys": "ส่งออกกุณแจห้อง", @@ -277,9 +256,6 @@ "Confirm Removal": "ยืนยันการลบ", "Unknown error": "ข้อผิดพลาดที่ไม่รู้จัก", "Incorrect password": "รหัสผ่านไม่ถูกต้อง", - "Device name": "ชื่ออุปกรณ์", - "Device key": "Key อุปกรณ์", - "Unknown devices": "อุปกรณ์ที่ไม่รู้จัก", "Unknown Address": "ที่อยู่ที่ไม่รู้จัก", "Unblacklist": "ถอดบัญชีดำ", "Blacklist": "ขึ้นบัญชีดำ", @@ -311,8 +287,6 @@ "%(roomName)s does not exist.": "ไม่มีห้อง %(roomName)s อยู่จริง", "Enter passphrase": "กรอกรหัสผ่าน", "Seen by %(userName)s at %(dateTime)s": "%(userName)s เห็นแล้วเมื่อเวลา %(dateTime)s", - "Undecryptable": "ไม่สามารถถอดรหัสได้", - "Unencrypted message": "ข้อความไม่ได้เข้ารหัส", "unknown caller": "ไม่ทราบผู้โทร", "Upload new:": "อัปโหลดใหม่:", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (ระดับอำนาจ %(powerLevelNumber)s)", @@ -377,7 +351,6 @@ "Noisy": "เสียงดัง", "Collecting app version information": "กำลังรวบรวมข้อมูลเวอร์ชันแอป", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "ลบนามแฝง %(alias)s ของห้องและถอด %(name)s ออกจากไดเรกทอรี?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "เพื่อคุณจะได้กลับมายังบัญชีเดิมของคุณได้ หลังจากออกจากระบบ แล้วกลับเข้าสู่ระบบในอุปกรณ์อื่น ๆ", "Enable notifications for this account": "เปิดใช้งานการแจ้งเตือนสำหรับบัญชีนี้", "Messages containing keywords": "ข้อความที่มีคีย์เวิร์ด", "View Source": "ดูซอร์ส", diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 222d2802da..1e4650fc32 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -50,7 +50,6 @@ "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s oda adını kaldırdı.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s konuyu \"%(topic)s\" olarak değiştirdi.", "Changes your display nickname": "Görünen takma adınızı değiştirir", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Şifre değiştirme eğer oda anahtarlarınızı dışa aktarmaz ve daha sonra tekrar içe aktarmazsanız , şu anda tüm cihazlarda uçtan uca şifreleme anahtarlarını sıfırlayacak ve geçmişi okunamaz hale getirecek . Gelecekte bu geliştirilecek.", "Claimed Ed25519 fingerprint key": "Ed25519 parmak izi anahtarı istendi", "Click here to fix": "Düzeltmek için buraya tıklayın", "Click to mute audio": "Sesi kapatmak için tıklayın", @@ -77,12 +76,8 @@ "Decryption error": "Şifre çözme hatası", "Deops user with given id": "ID'leriyle birlikte , düşürülmüş kullanıcılar", "Default": "Varsayılan", - "Device already verified!": "Cihaz zaten doğrulandı!", "Device ID": "Cihaz ID", - "Device ID:": "Cihaz ID:", "device id: ": "cihaz id: ", - "Device key:": "Cihaz anahtarı:", - "Devices": "Cihazlar", "Direct chats": "Doğrudan Sohbetler", "Disable Notifications": "Bildirimleri Devre Dışı Bırak", "Disinvite": "Daveti İptal Et", @@ -94,7 +89,6 @@ "Email address": "E-posta Adresi", "Emoji": "Emoji (Karakter)", "Enable Notifications": "Bildirimleri Etkinleştir", - "Encrypted by an unverified device": "Doğrulanmamış bir cihaz tarafından şifrelendi", "%(senderName)s ended the call.": "%(senderName)s çağrıyı bitirdi.", "End-to-end encryption information": "Uçtan-uca şifreleme bilgileri", "Enter passphrase": "Şifre deyimi Girin", @@ -134,7 +128,6 @@ "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s %(fromPowerLevel)s den %(toPowerLevel)s ' ye", "Guests cannot join this room even if explicitly invited.": "Misafirler açıkca davet edilseler bile bu odaya katılamazlar.", "Hangup": "Sorun", - "Hide Text Formatting Toolbar": "Metin Biçimlendirme Araç Çubuğunu Gizle", "Historical": "Tarihi", "Home": "Ev", "Homeserver is": "Ana Sunucusu", @@ -147,15 +140,12 @@ "Incoming voice call from %(name)s": "%(name)s ' den gelen sesli arama", "Incorrect username and/or password.": "Yanlış kullanıcı adı ve / veya şifre.", "Incorrect verification code": "Yanlış doğrulama kodu", - "Invalid alias format": "Geçersiz Takma Ad(nickname) Formatı", "Invalid Email Address": "Geçersiz E-posta Adresi", "Invalid file%(extra)s": "Geçersiz dosya %(extra)s'ı", "%(senderName)s invited %(targetName)s.": "%(senderName)s %(targetName)s ' ı davet etti.", - "Invite new room members": "Yeni oda üyelerini davet et", "Invited": "Davet Edildi", "Invites": "Davetler", "Invites user with given id to current room": "Mevcut odaya verilen kimliği olan kullanıcıyı davet eder", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' bir takma ad(nickname) için geçerli değil", "Sign in with": "Şununla giriş yap", "Join as voice or video.": " ses veya video olarak katılın.", "Join Room": "Odaya Katıl", @@ -178,17 +168,11 @@ "%(senderName)s made future room history visible to anyone.": "%(senderName)s gelecekte oda geçmişini görünür yaptı herhangi biri.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s gelecekte oda geçmişini görünür yaptı bilinmeyen (%(visibility)s).", "Manage Integrations": "Entegrasyonları Yönet", - "Markdown is disabled": "Markdown devre dışı", - "Markdown is enabled": "Markdown aktif", - "matrix-react-sdk version:": "matrix-react-sdk versiyon:", - "Message not sent due to unknown devices being present": "Bilinmeyen cihazlar bulunduğundan mesaj gönderilemedi", "Missing room_id in request": "İstekte eksik room_id", "Missing user_id in request": "İstekte user_id eksik", "Moderator": "Moderatör", "Mute": "Sessiz", "Name": "İsim", - "Never send encrypted messages to unverified devices from this device": "Bu cihazdan doğrulanmamış cihazlara asla şifrelenmiş mesajlar göndermeyin", - "Never send encrypted messages to unverified devices in this room from this device": "Bu odada bu cihazdan doğrulanmamış cihazlara asla şifrelenmiş mesajlar göndermeyin", "New address (e.g. #foo:%(localDomain)s)": "Yeni adres (e.g. #foo:%(localDomain)s)", "New passwords don't match": "Yeni şifreler uyuşmuyor", "New passwords must match each other.": "Yeni şifreler birbirleriyle eşleşmelidir.", @@ -198,7 +182,6 @@ "(not supported by this browser)": "(Bu tarayıcı tarafından desteklenmiyor)", "": "", "NOT verified": "Doğrulanmadı", - "No devices with registered encryption keys": "Kayıtlı şifreleme anahtarlı cihazlar yok", "No display name": "Görünür isim yok", "No more results": "Başka sonuç yok", "No results": "Sonuç yok", @@ -209,7 +192,6 @@ "Operation failed": "Operasyon başarısız oldu", "Password": "Şifre", "Passwords can't be empty": "Şifreler boş olamaz", - "People": "İnsanlar", "Permissions": "İzinler", "Phone": "Telefon", "Please check your email and click on the link it contains. Once this is done, click continue.": "Lütfen e-postanızı kontrol edin ve içerdiği bağlantıya tıklayın . Bu işlem tamamlandıktan sonra , 'devam et' e tıklayın .", @@ -235,7 +217,6 @@ "riot-web version:": "riot-web versiyon:", "Room %(roomId)s not visible": "%(roomId)s odası görünür değil", "Room Colour": "Oda Rengi", - "Room contains unknown devices": "Oda bilinmeyen cihazlar içeriyor", "%(roomName)s does not exist.": "%(roomName)s mevcut değil.", "%(roomName)s is not accessible at this time.": "%(roomName)s şu anda erişilebilir değil.", "Rooms": "Odalar", @@ -246,8 +227,6 @@ "Searches DuckDuckGo for results": "Sonuçlar için DuckDuckGo'yu arar", "Seen by %(userName)s at %(dateTime)s": "%(dateTime)s ' de %(userName)s tarafından görüldü", "Send anyway": "Her durumda gönder", - "Sender device information": "Gönderen cihaz bilgileri", - "Send Invites": "Davetiye Gönder", "Send Reset Email": "E-posta Sıfırlama Gönder", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s bir resim gönderdi.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s %(targetDisplayName)s' a odaya katılması için bir davet gönderdi.", @@ -259,7 +238,6 @@ "%(senderName)s set a profile picture.": "%(senderName)s bir profil resmi ayarladı.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s görünür ismini %(displayName)s ' a ayarladı.", "Settings": "Ayarlar", - "Show Text Formatting Toolbar": "Metin Biçimlendirme Araç Çubuğunu Göster", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Zaman damgalarını 12 biçiminde göster (örn. 2:30 pm)", "Signed Out": "Oturum Kapatıldı", "Sign in": "Giriş Yap", @@ -268,11 +246,9 @@ "Someone": "Birisi", "Start a chat": "Bir Sohbet Başlat", "Start authentication": "Kimlik Doğrulamayı başlatın", - "Start Chat": "Sohbet Başlat", "Submit": "Gönder", "Success": "Başarılı", "The phone number entered looks invalid": "Girilen telefon numarası geçersiz görünüyor", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Sağladığınız imza anahtarı %(userId)s aygıtından %(deviceId)s ile eşleşiyor . Aygıt doğrulanmış olarak işaretlendi.", "This email address is already in use": "Bu e-posta adresi zaten kullanımda", "This email address was not found": "Bu e-posta adresi bulunamadı", "The email address linked to your account must be entered.": "Hesabınıza bağlı e-posta adresi girilmelidir.", @@ -286,7 +262,6 @@ "To use it, just wait for autocomplete results to load and tab through them.": "Kullanmak için , otomatik tamamlama sonuçlarının yüklenmesini ve bitmesini bekleyin.", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Bu odanın zaman çizelgesinde belirli bir nokta yüklemeye çalışıldı , ama geçerli mesajı görüntülemeye izniniz yok.", "Tried to load a specific point in this room's timeline, but was unable to find it.": "Bu odanın akışında belirli bir noktaya yüklemeye çalışıldı , ancak bulunamadı.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s uçtanuca şifrelemeyi açtı (algoritma -> %(algorithm)s).", "Unable to add email address": "E-posta adresi eklenemiyor", "Unable to remove contact information": "Kişi bilgileri kaldırılamıyor", "Unable to verify email address.": "E-posta adresi doğrulanamıyor.", @@ -294,18 +269,13 @@ "%(senderName)s unbanned %(targetName)s.": "%(senderName)s %(targetName)s 'in yasağını kaldırdı.", "Unable to capture screen": "Ekran yakalanamadı", "Unable to enable Notifications": "Bildirimler aktif edilemedi", - "Unable to load device list": "Cihaz listesi yüklenemedi", - "Undecryptable": "Şifresi çözülemez", "unencrypted": "şifrelenmemiş", - "Unencrypted message": "Şifrelenmemiş mesaj", "unknown caller": "bilinmeyen arayıcı", "unknown device": "bilinmeyen cihaz", "unknown error code": "bilinmeyen hata kodu", "Unknown room %(roomId)s": "Bilinmeyen oda %(roomId)s", - "Unknown (user, device) pair:": "Bilinmeyen (kullanıcı , cihaz) çifti :", "Unmute": "Sesi aç", "Unnamed Room": "İsimsiz Oda", - "Unrecognised command:": "Tanınmayan komut :", "Unrecognised room alias:": "Tanınmayan oda isimleri :", "Uploading %(filename)s and %(count)s others|zero": "%(filename)s yükleniyor", "Uploading %(filename)s and %(count)s others|one": "%(filename)s ve %(count)s kadarı yükleniyor", @@ -333,11 +303,8 @@ "(no answer)": "(cevap yok)", "(unknown failure: %(reason)s)": "(bilinmeyen hata : %(reason)s)", "Warning!": "Uyarı!", - "WARNING: Device already verified, but keys do NOT MATCH!": "UYARI: Cihaz zaten doğrulandı , ancak anahtarlar UYUŞMUYOR!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "UYARI: ANAHTAR DOĞRULAMA BAŞARISIZ! (key verification failure). %(userId)s ve %(deviceId)s imza anahtarı sağlanan imza anahtarı \"%(fingerprint)s\" ile uyuşmayan \"%(fprint)s\". Bu iletişiminizin kesiliyor olabileceği anlamına geliyor!", "Who can access this room?": "Bu odaya kimler erişebilir ?", "Who can read history?": "Geçmişi kimler okuyabilir ?", - "Who would you like to communicate with?": "Kimlerle iletişim kurmak istersiniz ?", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s %(targetName)s'nin davetinden çekildi.", "You are already in a call.": "Zaten bir çağrıdasınız.", "You cannot place a call with yourself.": "Kendinizle görüşme yapamazsınız .", @@ -350,7 +317,6 @@ "You need to be able to invite users to do that.": "Bunu yapmak için kullanıcıları davet etmeye ihtiyacınız var.", "You need to be logged in.": "Oturum açmanız gerekiyor.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "E-posta adresiniz bu Ana Sunucu'da ki Matrix ID'si ile ilişkili gözükmüyor.", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Parolanız başarıyla değiştirildi . Diğer cihazlara girene kadar onlara bildirim almayacaksınız", "You seem to be in a call, are you sure you want to quit?": "Bir çağrıda gözüküyorsunuz , çıkmak istediğinizden emin misiniz ?", "You seem to be uploading files, are you sure you want to quit?": "Dosya yüklüyorsunuz gibi görünüyor , çıkmak istediğinizden emin misiniz ?", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Kullanıcıyı sizinle aynı güç seviyesine yükseltirken , bu değişikliği geri alamazsınız.", @@ -389,8 +355,6 @@ "(~%(count)s results)|other": "(~%(count)s sonuçlar)", "Cancel": "İptal Et", "Active call": "Aktif çağrı", - "bold": "kalın", - "italic": "italik", "Please select the destination room for this message": "Bu ileti için lütfen hedef oda seçin", "Create new room": "Yeni Oda Oluştur", "Room directory": "Oda Rehberi", @@ -419,18 +383,9 @@ "Unknown error": "Bilinmeyen Hata", "Incorrect password": "Yanlış Şifre", "To continue, please enter your password.": "Devam etmek için , lütfen şifrenizi girin.", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Bu cihazın güvenilir olabileceğini doğrulamak için , lütfen sahibiyle başka yollarla iletişim kurun (örn. şahsen veya telefon görüşmesi) ve bu cihazın Kullanıcı Ayarları'nda gördükleri anahtarın aşağıdaki anahtarla eşleşip eşleşmediğini sorun :", - "Device name": "Cihaz ismi", - "Device key": "Cihaz anahtarı", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Eğer eşleşirse , aşağıdaki doğrulama butonuna basın . Eğer eşleşmezse , o zaman başkası bir bu cihazı tutuyor ve bunun yerine kara liste butonuna basmak istiyor olabilirsiniz.", - "Verify device": "Cihazı Doğrula", "I verify that the keys match": "Anahtarların uyuştuğunu doğruluyorum", "Unable to restore session": "Oturum geri yüklenemiyor", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Eğer daha önce Riot'un daha yeni bir versiyonunu kullandıysanız , oturumunuz bu sürümle uyumsuz olabilir . Bu pencereyi kapatın ve daha yeni sürüme geri dönün.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Şu anda doğrulanmamış cihazları kara listeye alıyorsunuz , bu cihazlara mesaj göndermek için onları doğrulamanız gerekir.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Her cihazın yasal sahiplerine ait olduklarını doğrulamak için doğrulama işlemini gerçekleştirmenizi öneririz, ancak tercih edip onaylamadan iletiyi tekrar gönderebilirsiniz.", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" daha önce görmediğiniz cihazları içeriyor.", - "Unknown devices": "Bilinmeyen cihazlar", "Unknown Address": "Bilinmeyen Adres", "Unblacklist": "Karaliste Dışı", "Blacklist": "Kara Liste", @@ -475,8 +430,6 @@ "Start verification": "Doğrulamayı başlat", "Share without verifying": "Doğrulamadan paylaş", "Ignore request": "İsteği yoksay", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "Şifreleme anahtarları isteyen , '%(displayName)s' isminde yeni bir cihaz eklediniz .", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Tanımlanmamış cihazınız '%(displayName)s' , şifreleme anahtarlarını istiyor.", "Encryption key request": "Şifreleme anahtarı isteği", "Fetching third party location failed": "Üçüncü parti konumunu çekemedi", "A new version of Riot is available.": "Riot'un yeni bir versiyonu mevcuttur.", @@ -520,7 +473,6 @@ "Files": "Dosyalar", "Collecting app version information": "Uygulama sürümü bilgileri toplanıyor", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "%(alias)s oda rumuzu silinsin ve %(name)s dizinden kaldırılsın mı ?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Bu oturumunuzu kapattıktan sonra hesabınıza dönmenizi ve diğer cihazlarda oturum açmanızı sağlar.", "Keywords": "Anahtar kelimeler", "Enable notifications for this account": "Bu hesap için bildirimleri etkinleştir", "Messages containing keywords": " anahtar kelimeleri içeren mesajlar", @@ -624,8 +576,6 @@ "Registration Required": "Kayıt Zorunlu", "You need to register to do this. Would you like to register now?": "Bunu yapabilmek için kayıt olmalısınız. Şimdi kayıt olmak ister misiniz?", "Restricted": "Sınırlı", - "Email, name or Matrix ID": "E-posta, isim yada Matrix ID", - "Failed to start chat": "Sohbet başlatma başarısız", "Failed to invite users to the room:": "Kullanıcıların odaya daveti başarısız oldu:", "Missing roomId.": "roomId eksik.", "You are not in this room.": "Bu odada değilsin.", @@ -708,7 +658,6 @@ "GitHub issue": "GitHub sorunu", "Notes": "Notlar", "Removing…": "Siliniyor…", - "Clear all data on this device?": "Bu cihazdaki bütün verileri sil?", "Clear all data": "Bütün verileri sil", "Community IDs cannot be empty.": "Topluluk ID leri boş bırakılamaz.", "Something went wrong whilst creating your community": "Topluluğunuz oluşturulurken bir şeyler yanlış gitti", @@ -740,7 +689,6 @@ "Developer Tools": "Geliştirici Araçları", "Integrations are disabled": "Bütünleştirmeler kapatılmış", "Integrations not allowed": "Bütünleştirmelere izin verilmiyor", - "Loading device info...": "Cihaz bilgileri yükleniyor...", "Incompatible local cache": "Yerel geçici bellek uyumsuz", "Clear cache and resync": "Geçici belleği temizle ve yeniden eşle", "Updating Riot": "Riot güncelleniyor", @@ -950,8 +898,6 @@ "Print it and store it somewhere safe": "Yazdır ve güvenli bir yerde sakla", "Save it on a USB key or backup drive": "Bir USB anahtara kaydet veya sürücüye yedekle", "Copy it to your personal cloud storage": "Kişisel bulut depolamaya kopyala", - "Your access to encrypted messages is now protected.": "Şifrelenmiş mesajlara erişiminiz şimdi korunuyor.", - "Migrate from Key Backup": "Anahtar Yedeğinden Göç Et", "Recovery key": "Kurtarma anahtarı", "Success!": "Başarılı!", "Retry": "Yeniden Dene", @@ -993,29 +939,21 @@ "Folder": "Klasör", "Accept to continue:": "Devam etmek için i kabul ediniz:", "Upload": "Yükle", - "on device": "cihaz üstünde", "not found": "bulunamadı", "in account data": "hesap verisinde", - "Your homeserver does not support device management.": "Aan sunucunuz aygıt yönetimini desteklemiyor.", - "Delete %(count)s devices|other": "%(count)s cihazı silin", - "Delete %(count)s devices|one": "Cihaz sil", "ID": "ID", "Connecting to integration manager...": "Entegrasyon yöneticisine bağlanın...", "Cannot connect to integration manager": "Entegrasyon yöneticisine bağlanılamadı", "Delete Backup": "Yedek Sil", "Unable to load key backup status": "Anahtar yedek durumu yüklenemiyor", "Restore from Backup": "Yedekten Geri Dön", - "This device is backing up your keys. ": "Bu cihaz anahtarlarınızı yedekliyor. ", - "Connect this device to Key Backup": "Anahtar Yedeği için bu cihazı bağlayın", "not stored": "depolanmadı", "Backing up %(sessionsRemaining)s keys...": "%(sessionsRemaining)s anahtar yedekleniyor...", "All keys backed up": "Bütün yedekler yedeklendi", - "Backup is not signed by any of your devices": "Yedek hiç bir cihazınız tarafından imzalanmadı", "Backup version: ": "Yedek sürümü: ", "Algorithm: ": "Algoritma: ", "Start using Key Backup": "Anahtar Yedekleme kullanmaya başla", "Clear notifications": "Bildirimleri temizle", - "Enable desktop notifications for this device": "Bu cihaz için masaüstü bildirimlerini aç", "Show message in desktop notification": "Masaüstü bildiriminde mesaj göster", "Display Name": "Ekran Adı", "Profile picture": "Profil resmi", @@ -1026,7 +964,6 @@ "Please contact your homeserver administrator.": "Lütfen anasunucu yöneticiniz ile bağlantıya geçin.", "Message Pinning": "Mesaj Sabitleme", "Multiple integration managers": "Çoklu entegrasyon yöneticileri", - "New DM invite dialog (under development)": "Yeni DM davet diyalog kutusu (geliştirilmekte)", "Enable Emoji suggestions while typing": "Yazarken Emoji önerilerini aç", "Show join/leave messages (invites/kicks/bans unaffected)": "Katılma/ayrılma mesajları göster (davetler/atılmalar/yasaklamalar etkilenmeyecek)", "Show avatar changes": "Avatar değişikliklerini göster", @@ -1157,10 +1094,6 @@ "Cannot add any more widgets": "Daha fazla görsel bileşen eklenemiyor", "The maximum permitted number of widgets have already been added to this room.": "İzin verilen maksimum sayıda görsel bileşen bu odaya zaten eklenmiş.", "Add a widget": "Bir görsel bileşen ekle", - "Some devices for this user are not trusted": "Bu kullanıcının bazı cihazları güvenilir değil", - "All devices for this user are trusted": "Bu kullanıcının tüm cihazları güvenilir", - "Some devices in this encrypted room are not trusted": "Bu şifrelenmiş odada bazı cihazlar şifrelenmemiş", - "All devices in this encrypted room are trusted": "Bu şifrelenmiş odadaki tüm cihazlar güvenilir", "Edit message": "Mesajı düzenle", "%(senderName)s sent an image": "%(senderName)s bir resim gönderdi", "%(senderName)s sent a video": "%(senderName)s bir video gönderdi", @@ -1175,7 +1108,6 @@ "Ban this user?": "Bu kullanıcıyı yasakla?", "Remove %(count)s messages|other": "%(count)s mesajı sil", "Remove %(count)s messages|one": "1 mesajı sil", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Bu odada bilinmeyen cihazlar var: bunları doğrulamadan devam ederseniz birilerinin çağrılarınıza göz atma ihtimali var.", "A conference call could not be started because the integrations server is not available": "Entegrasyon sunucusu mevcut olmadığından konferans çağrısı başlatılamadı", "Send cross-signing keys to homeserver": "Çapraz-imzalama anahtarlarını anasunucuya gönder", "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Uyarı: Topluluğa eklediğiniz her bir kişi topluluk IDsini bilen herhangi biri tarafından açıkça görünür olacaktır", @@ -1331,16 +1263,12 @@ "Upgrade this room to the recommended room version": "Bu odayı önerilen oda sürümüne yükselt", "View older messages in %(roomName)s.": "%(roomName)s odasında daha eski mesajları göster.", "This bridge is managed by .": "Bu köprü tarafından yönetiliyor.", - "Connected via %(protocolName)s": "%(protocolName)s yoluyla bağlandı", - "Bridge Info": "Köprü Bilgisi", "Set a new custom sound": "Özel bir ses ayarla", "Change main address for the room": "Oda için ana adresi değiştir", "Error changing power level requirement": "Güç düzey gereksinimi değiştirmede hata", "Error changing power level": "Güç düzeyi değiştirme hatası", "Send %(eventType)s events": "%(eventType)s olaylarını gönder", "To link to this room, please add an alias.": "Bu odaya bağlanmak için, lütfen bir lakap ekle.", - "This user has not verified all of their devices.": "Bu kullanıcı tüm cihazlarda doğrulanmadı.", - "You have verified this user. This user has verified all of their devices.": "Bu kullanıcıyı doğruladınız. Bu kullanıcı tüm cihazlarında doğrulandı.", "This event could not be displayed": "Bu olay görüntülenemedi", "Demote yourself?": "Kendinin rütbeni düşür?", "Demote": "Rütbe Düşür", @@ -1367,7 +1295,6 @@ "Session verified": "Oturum doğrulandı", "Done": "Bitti", "Go Back": "Geri dön", - "New Session": "Yeni Oturum", "Gets or sets the room topic": "Oda başlığını getirir yada ayarlar", "Unbans user with given ID": "Verilen ID ile kullanıcı yasağını kaldırır", "Ignores a user, hiding their messages from you": "Mesajlarını senden gizleyerek, bir kullanıcıyı yok sayar", @@ -1375,7 +1302,6 @@ "You are now ignoring %(userId)s": "Şimdi %(userId)s yı yoksayıyorsunuz", "Stops ignoring a user, showing their messages going forward": "Sonraki mesajlarını göstererek, bir kullanıcıyı yoksaymaktan vazgeç", "Adds a custom widget by URL to the room": "URL ile odaya özel bir görsel bileşen ekle", - "Verifies a user, device, and pubkey tuple": "Bir kullanıcıyı, cihazı ve açık anahtar ikilisini doğrular", "%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s misafirlerin odaya katılmasına izin verdi.", "%(senderName)s updated an invalid ban rule": "%(senderName)s bir geçersiz yasaklama kuralını güncelledi", "%(senderName)s updated a ban rule matching %(glob)s for %(reason)s": "%(senderName)s, %(reason)s nedeniyle %(glob)s ile eşleşen yasaklama kuralını güncelledi", @@ -1416,7 +1342,6 @@ "Group & filter rooms by custom tags (refresh to apply changes)": "Özel etiketler ile odaları grupla & filtrele ( değişiklikleri uygulamak için yenile)", "Render simple counters in room header": "Oda başlığında basit sayaçları görüntüle", "Try out new ways to ignore people (experimental)": "Kişileri yoksaymak için yeni yöntemleri dene (deneysel)", - "New invite dialog": "Yeni davet diyalogu", "Enable local event indexing and E2EE search (requires restart)": "E2EE arama ve yerel olay indeksini aç (yeniden başlatma gerekli)", "Mirror local video feed": "Yerel video beslemesi yansısı", "Enable Community Filter Panel": "Toluluk Filtre Panelini Aç", @@ -1434,9 +1359,6 @@ "You are not subscribed to any lists": "Herhangi bir listeye aboneliğiniz bulunmuyor", "⚠ These settings are meant for advanced users.": "⚠ Bu ayarlar ileri düzey kullanıcılar içindir.", "Unignore": "Yoksayma", - "This bridge was provisioned by ": "Bu körpü tarafından provize edildi", - "Connected to on ": " ağındaki kanala bağlandı", - "Below is a list of bridges connected to this room.": "Bu odaya bağlanmış köprülerin bir listesi alttadır.", "Change room avatar": "Oda resmini değiştir", "Members only (since the point in time of selecting this option)": "Sadece üyeler ( bu seçeneği seçtiğinizden itibaren)", "Unable to revoke sharing for email address": "E-posta adresi paylaşımı kaldırılamadı", @@ -1526,7 +1448,6 @@ "Repeats like \"abcabcabc\" are only slightly harder to guess than \"abc\"": "“abcabcabc” gibi tekrarlar “abc” yi tahmin etmekten çok az daha zor olur", "Sequences like abc or 6543 are easy to guess": "abc veya 6543 gibi diziler tahmin için oldukça kolaydır", "Common names and surnames are easy to guess": "Yaygın isimleri ve soyisimleri tahmin etmek oldukça kolay", - "Enable cross-signing to verify per-user instead of per-device (in development)": "Her cihaz yerine her kullanıcıyı doğrulamak için çarpraz-imzalamayı aç (geliştiriliyor)", "Show info about bridges in room settings": "Oda ayarlarındaki köprülerin bilgilerini göster", "Show a placeholder for removed messages": "Silinen mesajlar için bir yer tutucu göster", "Show display name changes": "Ekran isim değişikliklerini göster", @@ -1541,7 +1462,6 @@ "Got It": "Anlaşıldı", "Subscribing to a ban list will cause you to join it!": "Bir yasak listesine abonelik ona katılmanıza yol açar!", "Message search": "Mesaj arama", - "A device's public name is visible to people you communicate with": "Bir cihazın halka açık ismi iletişimde olduğunuz kişilere görünür", "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Mahremiyet bizim için önemli, bu yüzden hiç bir kişisel ve betimleyici veriyi analizlerimiz için toplamayız.", "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.": "Uyarı: Bir oda yükseltimi o oda üyelerinin otomatik olarak yeni sürüm odaya göç ettirilmesini sağlamaz. Odanın eski sürümünde yeni sürüm odaya gitmek için bir linki gönderilecektir - yeni odaya katılmak için oda üyeleri bu linke tıklamak zorunda olacaktır.", "Internal room ID:": "Dahili oda ID:", diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 7795060406..e1db73e8b1 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -137,7 +137,6 @@ "Files": "Файли", "Collecting app version information": "Збір інформації про версію застосунка", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Видалити псевдонім %(alias)s та прибрати з каталогу %(name)s?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Це дозволить вам повернутися до своєї обліковки після виходу з неї, та заходити з інших пристроїв.", "Keywords": "Ключові слова", "Enable notifications for this account": "Увімкнути сповіщення для цієї обліковки", "Invite to this community": "Запросити в це суспільство", @@ -243,7 +242,6 @@ "The information being sent to us to help make Riot.im better includes:": "Інформація, що надсилається нам, щоб допомогти зробити Riot.im кращим, включає в себе:", "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Введіть пароль для захисту експортованого файлу. Щоб розшифрувати файл потрібно буде ввести цей пароль.", "Call Failed": "Виклик не вдався", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "У цій кімнаті є невідомі пристрої: якщо ви продовжите без їхньої перевірки, зважайте на те, що вас можна буде прослуховувати.", "Review Devices": "Перевірити пристрої", "Call Anyway": "Подзвонити все одно", "Answer Anyway": "Відповісти все одно", @@ -313,10 +311,6 @@ "Restricted": "Обмежено", "Moderator": "Модератор", "Start a chat": "Розпочати балачку", - "Who would you like to communicate with?": "З ким бажаєте спілкуватися?", - "Start Chat": "Розпочати балачку", - "Invite new room members": "Запросити до кімнати", - "Send Invites": "Надіслати запрошення", "Failed to invite": "Не вдалося запросити", "Failed to invite the following users to the %(roomName)s room:": "Не вдалося запросити таких користувачів до кімнати %(roomName)s:", "You need to be logged in.": "Вам потрібно увійти.", @@ -350,15 +344,8 @@ "Define the power level of a user": "Вказати рівень прав користувача", "Deops user with given id": "Знімає права оператора з користувача з вказаним ідентифікатором", "Opens the Developer Tools dialog": "Відкриває вікно інструментів розробника", - "Verifies a user, device, and pubkey tuple": "Перевіряє комбінацію користувача, пристрою і публічного ключа", - "Unknown (user, device) pair:": "Невідома комбінація користувача і пристрою:", - "Device already verified!": "Пристрій вже перевірено!", - "WARNING: Device already verified, but keys do NOT MATCH!": "УВАГА: Пристрій уже перевірено, але ключі НЕ ЗБІГАЮТЬСЯ!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "УВАГА: КЛЮЧ НЕ ПРОЙШОВ ПЕРЕВІРКУ! Ключ підпису %(userId)s на пристрої %(deviceId)s — це «%(fprint)s», і він не збігається з наданим ключем «%(fingerprint)s». Це може означати, що ваші повідомлення перехоплюють!", "Verified key": "Перевірений ключ", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Ключ підпису, який ви вказали, збігається з ключем підпису, отриманим від пристрою %(deviceId)s користувача %(userId)s. Пристрій позначено як перевірений.", "Displays action": "Показує дію", - "Unrecognised command:": "Невідома команда:", "Reason": "Причина", "%(senderName)s requested a VoIP conference.": "%(senderName)s бажає розпочати дзвінок-конференцію.", "%(senderName)s invited %(targetName)s.": "%(senderName)s запросив/ла %(targetName)s.", @@ -397,7 +384,6 @@ "%(senderName)s made future room history visible to all room members.": "%(senderName)s зробив/ла майбутню історію видимою для всіх учасників кімнати.", "%(senderName)s made future room history visible to anyone.": "%(senderName)s зробив/ла майбутню історію кімнати видимою для всіх.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s зробив/ла майбутню історію видимою невідомим (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s увімкнув/ла наскрізне шифрування (алгоритм %(algorithm)s).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s з %(fromPowerLevel)s до %(toPowerLevel)s", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s змінив/ла прикріплені повідомлення для кімнати.", "%(widgetName)s widget modified by %(senderName)s": "%(senderName)s змінив/ла %(widgetName)s", @@ -425,8 +411,6 @@ "Automatically replace plain text Emoji": "Автоматично замінювати емоційки в простому тексті", "Mirror local video feed": "Показувати локальне відео віддзеркалено", "Send analytics data": "Надсилати дані аналітики", - "Never send encrypted messages to unverified devices from this device": "Ніколи не надсилати шифрованих повідомлень до неперевірених пристроїв з цього пристрою", - "Never send encrypted messages to unverified devices in this room from this device": "Ніколи не надсилати шифрованих повідомлень до неперевірених пристроїв у цій кімнаті з цього пристрою", "Enable inline URL previews by default": "Увімкнути вбудований перегляд гіперпосилань за умовчанням", "Enable URL previews for this room (only affects you)": "Увімкнути попередній перегляд гіперпосилань в цій кімнаті (стосується тільки вас)", "Enable URL previews by default for participants in this room": "Увімкнути попередній перегляд гіперпосилань за умовчанням для учасників цієї кімнати", @@ -443,16 +427,12 @@ "No display name": "Немає імені для показу", "New passwords don't match": "Нові паролі не збігаються", "Passwords can't be empty": "Пароль не може бути пустим", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Зміна пароля поки що також скидає ключі наскрізного шифрування на всіх пристроях, внаслідок чого шифрована історія балачки стає недоступною, якщо ви не експортуєте ключі шифрування кімнат і не імпортуєте їх після зміни пароля. У майбутньому це буде поліпшено.", "Export E2E room keys": "Експортувати ключі наскрізного шифрування кімнат", "Do you want to set an email address?": "Бажаєте вказати адресу електронної пошти?", "Current password": "Поточний пароль", "Password": "Пароль", "New Password": "Новий пароль", "Confirm password": "Підтвердження пароля", - "Unable to load device list": "Не вдалося завантажити перелік пристроїв", - "Delete %(count)s devices|other": "Вилучити %(count)s пристроїв", - "Delete %(count)s devices|one": "Вилучити пристрій", "Device ID": "ID пристрою", "Last seen": "Востаннє з'являвся", "Failed to set display name": "Не вдалося встановити ім'я для показу", @@ -469,14 +449,7 @@ "%(senderName)s sent a video": "%(senderName)s надіслав/ла відео", "%(senderName)s uploaded a file": "%(senderName)s надіслав/ла файл", "Options": "Налаштування", - "Your key share request has been sent - please check your other devices for key share requests.": "Ваш запит поширення ключа надіслано — гляньте запити поширення ключа на своїх інших пристроях.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Запити поширення ключа надсилаються на ваші пристрої автоматично. Якщо ви відкинули запит поширення ключа на своїх інших пристроях, натисніть тут, щоб наново надіслати запит поширення ключа для цього сеансу.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Якщо на ваших інших пристроях немає ключа для цього повідомлення, ви не зможете його прочитати.", "Key request sent.": "Запит ключа надіслано.", - "Re-request encryption keys from your other devices.": "Наново надіслати запит ключів шифрування на ваші інші пристрої.", - "Undecryptable": "Неможливо розшифрувати", - "Encrypted by an unverified device": "Зашифровано неперевіреним пристроєм", - "Unencrypted message": "Незашифроване повідомлення", "Please select the destination room for this message": "Будь ласка, виберіть кімнату, куди потрібно надіслати це повідомлення", "device id: ": "id пристрою: ", "Disinvite": "Скасувати запрошення", @@ -515,8 +488,6 @@ "Only continue if you trust the owner of the server.": "Продовжуйте тільки якщо довіряєте власнику сервера.", "Trust": "Довіра", "Unable to load! Check your network connectivity and try again.": "Завантаження неможливе! Перевірте інтернет-зʼєднання та спробуйте ще.", - "Email, name or Matrix ID": "Е-пошта, імʼя або Matrix ID", - "Failed to start chat": "Не вдалося розпочати чат", "Failed to invite users to the room:": "Не вдалося запросити користувачів до кімнати:", "Messages": "Повідомлення", "Actions": "Дії", @@ -525,12 +496,7 @@ "Sends a message as plain text, without interpreting it as markdown": "Надсилає повідомлення як чистий текст, не використовуючи markdown", "Upgrades a room to a new version": "Покращує кімнату до нової версії", "You do not have the required permissions to use this command.": "Вам бракує дозволу на використання цієї команди.", - "Room upgrade confirmation": "Підтвердження покращення кімнати", - "Upgrading a room can be destructive and isn't always necessary.": "Покращення кімнати може призвести до втрати даних та не є обовʼязковим.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Рекомендується покращувати кімнату, якщо поточна її версія вважається нестабільною. Нестабільні версії кімнат можуть мати вади, відсутні функції або вразливості безпеки.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Покращення кімнати загалом впливає лише на роботу з кімнатою на сервері. Якщо ви маєте проблему із вашим клієнтом Riot, надішліть свою проблему на .", "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.": "Увага!: Покращення кімнати не перенесе автоматично усіх учасників до нової версії кімнати. Ми опублікуємо посилання на нову кімнату у старій версії кімнати, а учасники мають власноруч клацнути це посилання, щоб приєднатися до нової кімнати.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Підтвердьте, що ви згодні продовжити покращення цієї кімнати з до .", "Changes your display nickname in the current room only": "Змінює ваше псевдо тільки для поточної кімнати", "Changes the avatar of the current room": "Змінює аватар поточної кімнати", "Changes your avatar in this current room only": "Змінює ваш аватар для поточної кімнати", diff --git a/src/i18n/strings/vi.json b/src/i18n/strings/vi.json index 407a0a9e6f..14575a61ff 100644 --- a/src/i18n/strings/vi.json +++ b/src/i18n/strings/vi.json @@ -19,7 +19,6 @@ "The information being sent to us to help make Riot.im better includes:": "Thông tin gửi lên máy chủ giúp cải thiện Riot.im bao gồm:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Trường hợp trang này chứa thông tin định danh như phòng chat, người dùng hoặc mã nhóm, dữ liệu định danh sẽ được loại bỏ trước khi gửi lên máy chủ.", "Call Failed": "Cuộc gọi thất bại", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Có thiết bị chưa được xác thực trong phòng này: nếu bạn tiếp tục mà không xác thực thiết bị, cuộc gọi có thể bị nghe lén.", "Review Devices": "Xác nhận thiết bị", "Call Anyway": "Vẫn gọi", "Answer Anyway": "Vẫn trả lời", @@ -107,11 +106,6 @@ "Moderator": "Quản trị viên", "Admin": "Admin", "Start a chat": "Bắt đầu chat", - "Who would you like to communicate with?": "Bạn muốn chat với ai?", - "Email, name or Matrix ID": "Email, tên hoặc Matrix ID", - "Start Chat": "Bắt đầu chat", - "Invite new room members": "Mời thành viên mới", - "Send Invites": "Gửi lời mời", "Operation failed": "Tác vụ thất bại", "Failed to invite": "Không thể mời", "Failed to invite users to the room:": "Mời thành viên vào phòng chat thất bại:", @@ -134,12 +128,7 @@ "/ddg is not a command": "/ddg không phải là một câu lệnh", "To use it, just wait for autocomplete results to load and tab through them.": "Để sử dụng, hãy đợi kết quả tìm kiếm được hiển thị và chọn đối tượng.", "Upgrades a room to a new version": "Cập nhật phòng lên phiên bản mới", - "Room upgrade confirmation": "Xác nhận phòng nâng cấp", - "Upgrading a room can be destructive and isn't always necessary.": "Nâng cấp phòng chat có thể làm hỏng và không phải luôn cần thiết.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Cập nhật phòng được khuyến nghị khi phòng chat được xem là không ổn định. Phòng không ổn định có thể gây lỗi, thiếu chức năng hoặc có nguy cơ bị tấn công.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Nâng cấp phòng thường chỉ ảnh hưởng ở phía máy chủ cần để xử lý phòng. Nếu bạn đang gặp vấn đề với Riot, vui lòng gửi thông báo lỗi tới .", "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.": "Cảnh báo: Nâng cấp phòng sẽ không tự động mời thành viên vào phòng mới. Thành viên sẽ phải click vào đường link đến phòng mới để tham gia.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Vui lòng xác nhận bạn muốn nâng cấp phòng từ phiên bản cũ lên .", "Changes your display nickname": "Đổi tên hiển thị của bạn", "Changes your display nickname in the current room only": "Chỉ đổi tên hiển thị của bạn trong phòng này mà thôi", "Changes your avatar in this current room only": "Chỉ đổi hình đại diện trong phòng này", @@ -164,20 +153,13 @@ "Adds a custom widget by URL to the room": "Thêm một URL widget vào phòng", "Please supply a https:// or http:// widget URL": "Vui lòng điền 1 widget với https:// hoặc http://", "You cannot modify widgets in this room.": "Bạn không thể sửa đổi widget trong phòng này.", - "Verifies a user, device, and pubkey tuple": "Xác thực người dùng hoặc thiết bị", - "Unknown (user, device) pair:": "Cặp người dùng - thiết bị chưa xác thực:", - "Device already verified!": "Thiết bị đã được xác thực!", - "WARNING: Device already verified, but keys do NOT MATCH!": "Cảnh báo: thiết bị đã được xác thực, nhưng bộ khóa không trùng khớp!", "Which officially provided instance you are using, if any": "Cung cấp máy chủ bạn đang sử dụng, nếu có", "Changes your avatar in all rooms": "Đổi hình đại diện của bạn trong mọi phòng", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "CẢNH BÁO: XÁC MINH KHÓA THẤT BẠI! Khóa của %(userId)s và thiết bị %(deviceId)s là \"%(fprint)s\" và không khớp với khóa cần xác minh \"%(fingerprint)s\". Điều này có nghĩa thông tin giao tiếp của bạn có thể bị nghe lén!", "Verified key": "Khóa được xác minh", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Khóa đăng nhập trùng với khóa bạn nhận được từ thiết bị %(deviceId)s của %(userId)s. Thiết bị được đánh dấu đã xác minh.", "Displays action": "Hiện thị thành động", "Forces the current outbound group session in an encrypted room to be discarded": "Buộc bỏ qua phiên làm việc trong phòng chat được mã hóa", "Sends the given message coloured as a rainbow": "Gửi nội dung tin nhắn được tô màu cầu vồng", "Sends the given emote coloured as a rainbow": "Gửi hình emote được tô màu cầu vồng", - "Unrecognised command:": "Lệnh không hợp lệ:", "Reason": "Lí do", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s chấp nhận lời mời cho %(displayName)s.", "%(targetName)s accepted an invitation.": "%(targetName)s chấp thuận lời mời.", @@ -234,7 +216,6 @@ "%(senderName)s made future room history visible to all room members.": "%(senderName)s đã đặt nội dung mới của phòng chat xem được bởi thành viên.", "%(senderName)s made future room history visible to anyone.": "%(senderName)s đã đặt nội dung mới của phòng chat xem được bởi bất kỳ ai.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s đã đặt lịch sử phòng chat xem được đối với đối tượng (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s đã bật mã hóa đầu cuối (thuật toán %(algorithm)s).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s đổi từ %(fromPowerLevel)s thành %(toPowerLevel)s", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s đã đổi mức quyền của %(powerLevelDiffText)s.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s đã đổi tin được treo trong phòng.", @@ -330,8 +311,6 @@ "Enable Community Filter Panel": "Bật khung bộ lọc cộng đồng", "Allow Peer-to-Peer for 1:1 calls": "Cho cuộc gọi trực tiếp 1:1", "Send analytics data": "Gửi dữ liệu phân tích", - "Never send encrypted messages to unverified devices from this device": "Không bao giờ gửi tin mã hóa từ thiết bị này đến thiết bị chưa được xác minh", - "Never send encrypted messages to unverified devices in this room from this device": "Không bao giờ gửi tin mã hóa từ thiết bị này đến các thiết bị chưa được xác minh", "Enable inline URL previews by default": "Bật hiển thị mặc định xem trước nội dung đường link", "Enable URL previews for this room (only affects you)": "Bật hiển thị xem trước nội dung đường link trong phòng này (chỉ tác dụng với bạn)", "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", diff --git a/src/i18n/strings/vls.json b/src/i18n/strings/vls.json index 4cfe5c437a..b705afc4fe 100644 --- a/src/i18n/strings/vls.json +++ b/src/i18n/strings/vls.json @@ -20,7 +20,6 @@ "The information being sent to us to help make Riot.im better includes:": "D’informoasje da noar uus wor verstuurd vo Riot.im te verbetern betreft:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Woar da da blad hier identificeerboare informoasje bevat, gelyk e gespreks-, gebruukers- of groeps-ID, goan deze gegevens verwyderd wordn voorda ze noa de server gestuurd wordn.", "Call Failed": "Iproep mislukt", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "’t Zyn ounbekende toestelln in da gesprek hier: a je deuregoat zounder ze te verifieern goa ’t meuglik zyn da ’t er etwien jen iproep afluustert.", "Review Devices": "Toestelln noakykn", "Call Anyway": "Algelyk belln", "Answer Anyway": "Algelyk beantwoordn", @@ -108,11 +107,6 @@ "Moderator": "Moderator", "Admin": "Beheerder", "Start a chat": "Gesprek beginn", - "Who would you like to communicate with?": "Me wien zou je willn communiceern?", - "Email, name or Matrix ID": "E-mailadresse, noame, of matrix-ID", - "Start Chat": "Gesprek beginn", - "Invite new room members": "Nieuwe gespreksleedn uutnodign", - "Send Invites": "Uutnodigiengn verstuurn", "Operation failed": "Handelienge es mislukt", "Failed to invite": "Uutnodign es mislukt", "Failed to invite users to the room:": "Kostege de volgende gebruukers hier nie uutnodign:", @@ -135,12 +129,7 @@ "/ddg is not a command": "/ddg is geen ipdracht", "To use it, just wait for autocomplete results to load and tab through them.": "Voor ’t te gebruukn, wacht je toutda de automatisch angevulde resultoatn zyn geloadn en tab je derdeure.", "Upgrades a room to a new version": "Actualiseert ’t gesprek tout e nieuwe versie", - "Room upgrade confirmation": "Bevestigienge vo ’t gesprek te actualiseern", - "Upgrading a room can be destructive and isn't always necessary.": "’t Ipwoardeern van e gesprek es meuglik destructief en is nie assan noodzoakelik.", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "Gespreksipwoarderiengn wordn meestal anbevooln wanneer da der e bepoalde groepsgespreksversie als ounstabiel wor beschouwd. Ounstabiele groepsgespreksversies bevattn meuglik fouten of beveiligiengsprobleemn, of beschikkn nie over alle functies.", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "Gespreksipwoarderiengn beïnvloedn meestal enkel de verwerkienge van ’t gesprek an serverzyde. Indien da je probleemn zoudt ounderviendn me je Riot-cliënt, gelieve da ton te meldn ip .", "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.": "Let ip: ’t ipwoardeern van e gesprek goa gespreksleedn nie automatisch verplatsn noa de nieuwe versie van ’t gesprek. We goan e koppelienge noa ’t nieuw gesprek in d’oude versie van ’t gesprek platsn - gespreksleedn goan ton ip deze koppeliengen moetn klikkn vo ’t nieuw gesprek toe te treedn.", - "Please confirm that you'd like to go forward with upgrading this room from to .": "Bevestigt da je da gesprek hier van wilt ipwoardeern noa .", "Changes your display nickname": "Verandert je weergavenoame", "Changes your display nickname in the current room only": "Stelt je weergavenoame alleene moa in ’t huudig gesprek in", "Changes your avatar in this current room only": "Verandert jen avatar alleene moa in ’t huudig gesprek", @@ -166,18 +155,11 @@ "Adds a custom widget by URL to the room": "Voegt met een URL een angepaste widget toe an ’t gesprek", "Please supply a https:// or http:// widget URL": "Gift een https://- of http://-widget-URL in", "You cannot modify widgets in this room.": "J’en kut de widgets in ’t gesprek hier nie anpassn.", - "Verifies a user, device, and pubkey tuple": "Verifieert e combinoasje van gebruuker, toestel en publieke sleuter", - "Unknown (user, device) pair:": "Ounbekend poar (gebruuker, toestel):", - "Device already verified!": "Toestel es al geverifieerd gewist!", - "WARNING: Device already verified, but keys do NOT MATCH!": "LET IP: toestel es al geverifieerd gewist, moa de sleuters KOMMN NIE OVEREEN!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "LET IP: SLEUTERVERIFICOASJE ES MISLUKT! Den oundertekende sleuter vo %(userId)s en toestel %(deviceId)s is ‘%(fprint)s’, wuk da nie overeenkomt me de verschafte sleuter ‘%(fingerprint)s’. Da zoudt hier kunn betekenn da je communicoasje ounderschept wordt!", "Verified key": "Geverifieerde sleuter", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "De versleuteriengssleuter da j’è verstrekt komt overeen me de versleuteriengssleuter da j’ountvangen èt van ’t toestel %(deviceId)s van %(userId)s. ’t Toestel es gemarkeerd als geverifieerd.", "Displays action": "Toogt actie", "Forces the current outbound group session in an encrypted room to be discarded": "Forceert de huudige uutwoartsche groepssessie in e versleuterd gesprek vo verworpn te wordn", "Sends the given message coloured as a rainbow": "Verstuurt ’t gegeevn bericht in regenboogkleurn", "Sends the given emote coloured as a rainbow": "Verstuurt de gegeevn emoticon in regenboogkleurn", - "Unrecognised command:": "Ounbekende ipdracht:", "Reason": "Reedn", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s èt d’uutnodigienge vo %(displayName)s anveird.", "%(targetName)s accepted an invitation.": "%(targetName)s èt een uutnodigienge anveird.", @@ -233,7 +215,6 @@ "%(senderName)s made future room history visible to all room members.": "%(senderName)s èt de toekomstige gespreksgeschiedenisse zichtboar gemakt voor alle gespreksleedn.", "%(senderName)s made future room history visible to anyone.": "%(senderName)s èt de toekomstige gespreksgeschiedenisse zichtboar gemakt voor iedereen.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s èt de toekomstige gespreksgeschiedenisse zichtboar gemakt voor ounbekend (%(visibility)s).", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s èt eind-tout-eind-versleuterienge angezet (%(algorithm)s-algoritme).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s van %(fromPowerLevel)s noa %(toPowerLevel)s", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s èt ’t machtsniveau van %(powerLevelDiffText)s gewyzigd.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s èt de vastgeprikte boodschappn vo ’t gesprek gewyzigd.", @@ -320,8 +301,6 @@ "Enable Community Filter Panel": "Gemeenschapsfilterpaneel inschoakeln", "Allow Peer-to-Peer for 1:1 calls": "Peer-to-peer toeloatn voor twigesprekkn", "Send analytics data": "Statistische gegeevns (analytics) verstuurn", - "Never send encrypted messages to unverified devices from this device": "Versleuterde berichtn vanaf dit toestel nooit noar oungeverifieerde toestelln verstuurn", - "Never send encrypted messages to unverified devices in this room from this device": "Versleuterde berichtn vanaf dit toestel nooit noar oungeverifieerde toestelln in dit gesprek verstuurn", "Enable inline URL previews by default": "Inline URL-voorvertoniengn standoard inschoakeln", "Enable URL previews for this room (only affects you)": "URL-voorvertoniengn in dit gesprek inschoakeln (geldt alleene vo joun)", "Enable URL previews by default for participants in this room": "URL-voorvertoniengn standoard vo de gebruukers in dit gesprek inschoakeln", @@ -363,7 +342,6 @@ "Verify this user by confirming the following emoji appear on their screen.": "Verifieert deze gebruuker deur te bevestign da zyn/heur scherm de volgende emoji toogt.", "Verify this user by confirming the following number appears on their screen.": "Verifieert deze gebruuker deur te bevestign da zyn/heur scherm ’t volgend getal toogt.", "Unable to find a supported verification method.": "Kan geen oundersteunde verificoasjemethode viendn.", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "Vo maximoale veiligheid ku je dit best ounder vier oogn, of via een ander vertrouwd communicoasjemedium, doen.", "Dog": "Hound", "Cat": "Katte", "Lion": "Leeuw", @@ -410,7 +388,6 @@ "Pencil": "Potlood", "Paperclip": "Paperclip", "Scissors": "Schoar", - "Padlock": "Hangslot", "Key": "Sleuter", "Hammer": "Oamer", "Telephone": "Telefong", @@ -434,7 +411,6 @@ "New passwords don't match": "Nieuwe paswoordn kommn nie overeen", "Passwords can't be empty": "Paswoordn kunn nie leeg zyn", "Warning!": "Let ip!", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "’t Verandern van ’t paswoord goa vooralsnog alle sleuters voor eind-tout-eind-versleuterienge ip alle toestelln herinstelln, woadeure da de versleuterde gespreksgeschiedenisse ounleesboar wordt, tenzy da je eest je gesprekssleuters exporteert en nadien herimporteert. Dit goat in den toekomst verbeterd wordn.", "Export E2E room keys": "E2E-gesprekssleuters exporteern", "Do you want to set an email address?": "Wil je een e-mailadresse instelln?", "Current password": "Huudig paswoord", @@ -442,11 +418,7 @@ "New Password": "Nieuw paswoord", "Confirm password": "Bevestig ’t paswoord", "Change Password": "Paswoord verandern", - "Your homeserver does not support device management.": "Je thuusserver oundersteunt geen toestelbeheer.", - "Unable to load device list": "Kan de lyste van toestelln nie loadn", "Authentication": "Authenticoasje", - "Delete %(count)s devices|other": "%(count)s toestelln verwydern", - "Delete %(count)s devices|one": "Toestel verwydern", "Device ID": "Toestel-ID", "Last seen": "Latst gezien", "Failed to set display name": "Instelln van weergavenoame es mislukt", @@ -469,25 +441,11 @@ "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Versleuterde berichtn zyn beveiligd me eind-tout-eind-versleuterienge. Alleene d’ountvanger(s) en gy èn de sleuters vo deze berichtn te leezn.", "Unable to load key backup status": "Kostege de sleuterback-upstatus nie loadn", "Restore from Backup": "Herstelln uut back-up", - "This device is backing up your keys. ": "Dit toestel makt een back-up van je sleuters. ", - "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Dit toestel makt geen back-up van je sleuters, ma j’èt wel een bestoande back-up da je kut herstelln, en da je vanaf ton nieuwe sleuters an kut toevoegn.", - "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Verbindt dit toestel me de sleuterback-up vooraleer da je jen afmeldt vo sleuters die hunder alleene mo ip dit toestel bevindn nie kwyt te speeln.", - "Connect this device to Key Backup": "Dit toestel verbindn me de sleuterback-up", "Backing up %(sessionsRemaining)s keys...": "%(sessionsRemaining)s sleuters wordn geback-upt…", "All keys backed up": "Alle sleuters zyn geback-upt", - "Backup has a signature from unknown device with ID %(deviceId)s.": "De back-up èt een oundertekenienge van een ounbekend toestel met ID %(deviceId)s.", - "Backup has a valid signature from this device": "De back-up èt e geldige oundertekenienge van dit toestel", - "Backup has an invalid signature from this device": "De back-up èt een oungeldige ondertekenienge van dit toestel", - "Backup has a valid signature from verified device ": "De back-up èt e geldige oundertekenienge van e geverifieerd toestel ", - "Backup has a valid signature from unverified device ": "De back-up èt e geldige oundertekenienge van een oungeverifieerd toestel ", - "Backup has an invalid signature from verified device ": "De back-up èt een oungeldige oundertekenienge van e geverifieerd toestel ", - "Backup has an invalid signature from unverified device ": "De back-up èt een oungeldige oundertekenienge van een oungeverifieerd toestel ", - "Backup is not signed by any of your devices": "De back-up es door geen van je toestelln oundertekend", - "This backup is trusted because it has been restored on this device": "Deze back-up wor vertrouwd, omda t'n ip dit toestel hersteld es gewist", "Advanced": "Geavanceerd", "Backup version: ": "Back-upversie: ", "Algorithm: ": "Algoritme: ", - "Your keys are not being backed up from this device.": "Je sleuters wordn nie geback-upt van dit toestel.", "Back up your keys before signing out to avoid losing them.": "Makt een back-up van je sleuters vooraleer da je jen afmeldt vo ze nie kwyt te speeln.", "Start using Key Backup": "Begint me de sleuterback-up te gebruukn", "Error saving email notification preferences": "Foute by ’t ipsloan van de meldingsvoorkeurn voor e-mail", @@ -511,9 +469,7 @@ "Advanced notification settings": "Geavanceerde meldiengsinstelliengn", "There are advanced notifications which are not shown here": "Der zyn geavanceerde meldiengn dat hier nie getoogd wordn", "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "J’è ze meuglik ingesteld in een andere cliënt als Riot. Je ku ze nie anpassn in Riot, moa ze zyn wel actief", - "Enable desktop notifications for this device": "Bureaubladmeldiengn inschoakeln vo dit toestel", "Show message in desktop notification": "Bericht toogn in bureaubladmeldienge", - "Enable audible notifications for this device": "Geluudsmeldiengn inschoakeln vo dit toestel", "Off": "Uut", "On": "An", "Noisy": "Lawoaierig", @@ -522,14 +478,12 @@ "Verification code": "Verificoasjecode", "Phone Number": "Telefongnumero", "Profile picture": "Profielfoto", - "Upload profile picture": "Profielfoto iploaden", "Upgrade to your own domain": "Ipwoardeert noa jen eigen domein", "Display Name": "Weergavenoame", "Save": "Ipsloan", "Flair": "Badge", "Failed to change password. Is your password correct?": "Wyzign van ’t paswoord es mislukt. Es je paswoord wel juste?", "Success": "Gereed", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Je paswoord es gewyzigd. Je goat ip andere toestelln geen pushmeldiengn nie meer ountvangn toutda je je der ip heranmeldt", "Profile": "Profiel", "Account": "Account", "Set a new account password...": "Stelt e nieuw accountpaswoord in…", @@ -555,7 +509,6 @@ "Submit debug logs": "Foutipsporiengslogboekn indienn", "FAQ": "VGV", "Versions": "Versies", - "matrix-react-sdk version:": "matrix-react-sdk-versie:", "riot-web version:": "riot-web-versie:", "olm version:": "olm-versie:", "Homeserver is": "Thuusserver es", @@ -574,15 +527,12 @@ "": "", "Import E2E room keys": "E2E-gesprekssleuters importeern", "Cryptography": "Cryptografie", - "Device ID:": "Toestel-ID:", - "Device key:": "Toestelsleuter:", "Ignored users": "Genegeerde gebruukers", "Bulk options": "Bulkopties", "Accept all %(invitedRooms)s invites": "Alle %(invitedRooms)s-uutnodigiengn anveirdn", "Reject all %(invitedRooms)s invites": "Alle %(invitedRooms)s-uutnodigiengn weigern", "Key backup": "Sleuterback-up", "Security & Privacy": "Veiligheid & privacy", - "Devices": "Toestelln", "Riot collects anonymous analytics to allow us to improve the application.": "Riot verzoamelt anonieme analysegegeevns da ’t meuglik moakn van de toepassienge te verbetern.", "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "Privacy es belangryk voor uus, dus me verzoameln geen persoonlike of identificeerboare gegeevns voor uzze gegeevnsanalyse.", "Learn more about how we use analytics.": "Leest meer over hoe da we joun gegeevns gebruukn.", @@ -663,22 +613,11 @@ " (unsupported)": " (nie oundersteund)", "Join as voice or video.": "Deelneemn me sproak of video.", "Ongoing conference call%(supportedText)s.": "Loopnd vergoaderiengsgesprek %(supportedText)s.", - "Some devices for this user are not trusted": "Der wordn enkele toestelln van deze gebruuker nie vertrouwd", - "Some devices in this encrypted room are not trusted": "Der wordn enkele toestelln in dit versleuterd gesprek nie vertrouwd", - "All devices for this user are trusted": "Alle toestelln van deze gebruuker wordn vertrouwd", - "All devices in this encrypted room are trusted": "Alle toestelln in dit versleuterd gesprek wordn vertrouwd", "This event could not be displayed": "Deze gebeurtenisse kostege nie weergegeevn wordn", "%(senderName)s sent an image": "%(senderName)s èt e fotootje gestuurd", "%(senderName)s sent a video": "%(senderName)s èt e filmtje gestuurd", "%(senderName)s uploaded a file": "%(senderName)s èt e bestand ipgeloaden", - "Your key share request has been sent - please check your other devices for key share requests.": "Je sleuterdeelverzoek es verstuurd - controleer jen andere toestelln vo sleuterdeelverzoekn.", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "Sleuterdeelverzoekn wordn automatisch noar andere toestelln verstuurd. A je ’t verzoek èt afgeweezn of geslootn, klikt ton hier vo de sleuters van deze sessie heran te vroagn.", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "Je goat dit bericht nie kunn ountsleutern als geen van jen andere toestellen der de sleuter voor èt.", "Key request sent.": "Sleuterverzoek verstuurd.", - "Re-request encryption keys from your other devices.": "Versleuteriengssleuters heranvroagn van jen andere toestelln.", - "Undecryptable": "Ounountsleuterboar", - "Encrypted by an unverified device": "Versleuterd deur een oungeverifieerd toestel", - "Unencrypted message": "Ounversleuterd bericht", "Please select the destination room for this message": "Selecteer ’t bestemmingsgesprek vo dit bericht", "Scroll to bottom of page": "Scrollt noa den onderkant van ’t blad", "device id: ": "toestel-ID: ", @@ -698,7 +637,6 @@ "Failed to toggle moderator status": "Anpassn van moderatorstatus es mislukt", "Failed to change power level": "Wyzign van ’t machtsniveau es mislukt", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Je kut deze veranderiengn nie oungedoan moakn angezien da je de gebruuker tout ’tzelfste niveau als jen eigen promoveert.", - "No devices with registered encryption keys": "Geen toestelln me geregistreerde versleuteriengssleuters", "Ignore": "Negeern", "Jump to read receipt": "Noar ’t latst geleezn bericht goan", "Mention": "Vermeldn", @@ -718,34 +656,20 @@ "Invited": "Uutgenodigd", "Filter room members": "Gespreksleedn filtern", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (macht %(powerLevelNumber)s)", - "bold": "vetgedrukt", - "italic": "scheefgedrukt", - "deleted": "verwyderd", - "underlined": "ounderstreept", - "inline-code": "code", - "block-quote": "citoat", - "bulleted-list": "ipsommienge", - "numbered-list": "genummerde lyste", "Voice call": "Sproakiproep", "Video call": "Video-iproep", "Hangup": "Iphangn", - "Show Text Formatting Toolbar": "Tekstipmoakwerkbalk toogn", "Upload file": "Bestand iploadn", "Send an encrypted reply…": "Verstuurt e versleuterd antwoord…", "Send a reply (unencrypted)…": "Verstuurt een antwoord (ounversleuterd)…", "Send an encrypted message…": "Verstuurt e versleuterd bericht…", "Send a message (unencrypted)…": "Verstuurt een bericht (ounversleuterd)…", - "Markdown is disabled": "Markdown is uutgeschoakeld", - "Hide Text Formatting Toolbar": "Tekstipmoakwerkbalk wegsteekn", "The conversation continues here.": "’t Gesprek goat hier verder.", "This room has been replaced and is no longer active.": "Dit gesprek is vervangn gewist en is nie langer actief.", "You do not have permission to post to this room": "J’èt geen toestemmienge voor in dit gesprek te postn", "Server error": "Serverfoute", "Server unavailable, overloaded, or something else went wrong.": "De server is ounbereikboar of overbelast, of der is etwat anders foutgegoan.", "Command error": "Ipdrachtfoute", - "Unable to reply": "Kostege nie reageern", - "At this time it is not possible to reply with an emote.": "’t Es nog nie meuglik met een emoticon te reageern.", - "Markdown is enabled": "Markdown es ingeschoakeld", "No pinned messages.": "Geen vastgeprikte berichtn.", "Loading...": "Bezig me loadn…", "Pinned Messages": "Vastgeprikte berichtn", @@ -781,7 +705,6 @@ "Community Invites": "Gemeenschapsuutnodigiengn", "Invites": "Uutnodigiengn", "Favourites": "Favorietn", - "People": "Menschn", "Start chat": "Gesprek beginn", "Rooms": "Gesprekkn", "Low priority": "Leige prioriteit", @@ -842,8 +765,6 @@ "There was an error updating the room's main address. It may not be allowed by the server or a temporary failure occurred.": "’t Es e foute ipgetreedn by ’t bywerkn van ’t hoofdadresse van ’t gesprek. Dit wor meugliks nie toegeloatn deur de server, of der es een tydelik probleem ipgetreedn.", "Error creating alias": "Foute by ’t anmoakn van de bynoame", "There was an error creating that alias. It may not be allowed by the server or a temporary failure occurred.": "’t Es e foute ipgetreedn by ’t anmoakn van die bynoame. Dit wor meugliks nie toegeloatn deur de server, of der is een tydelik probleem ipgetreedn.", - "Invalid alias format": "Oungeldig bynoamformoat", - "'%(alias)s' is not a valid format for an alias": "‘%(alias)s’ es geen geldig formoat voor e bynoame", "Error removing alias": "Foute by ’t verwydern van de bynoame", "There was an error removing that alias. It may no longer exist or a temporary error occurred.": "’t Es e foute ipgetreedn by ’t verwydern van die bynoame. Meugliks bestoa ze nie mi, of der es een tydelike foute ipgetreedn.", "Main address": "Hoofdadresse", @@ -860,8 +781,6 @@ "This room is not showing flair for any communities": "Dit gesprek toogt geen badges vo gemeenschappn", "New community ID (e.g. +foo:%(localDomain)s)": "Nieuwe gemeenschaps-ID (bv. +foo:%(localDomain)s)", "Room avatar": "Gespreksavatar", - "Upload room avatar": "Gespreksavatar iploadn", - "No room avatar": "Geen gespreksavatar", "Room Name": "Gespreksnoame", "Room Topic": "Gespreksounderwerp", "You have enabled URL previews by default.": "J’èt URL-voorvertoniengn standoard ingeschoakeld.", @@ -1080,7 +999,6 @@ "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.": "De zichtboarheid van berichtn in Matrix is lik by e-mails. ’t Vergeetn van je berichtn betekent da berichtn da je gy è verstuurd nie mi gedeeld goan wordn me nieuwe of oungeregistreerde gebruukers, mo geregistreerde gebruukers dat al toegank han tout deze berichtn goan nog assan toegank èn tout hunder eigen kopie dervan.", "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)": "Vergeet alle berichtn dan ’kik verstuurd ghed èn wanneer da myn account gedeactiveerd gewist es (Let ip: dit goat der voorn zorgn da toekomstige gebruukers een ounvolledig beeld krygn van gesprekkn)", "To continue, please enter your password:": "Gif je paswoord in vo verder te goan:", - "Verify device": "Toestel verifieern", "Use Legacy Verification (for older clients)": "Verouderde verificoasje gebruukn (voor oudere cliëntn)", "Verify by comparing a short text string.": "Verifieert deur e korte tekenreekse te vergelykn.", "Begin Verifying": "Verificoasje beginn", @@ -1088,10 +1006,6 @@ "Nothing appearing? Not all clients support interactive verification yet. .": "Verschynt er nietent? Nog nie alle cliëntn biedn oundersteunienge voor interactieve verificoasje. .", "Waiting for %(userId)s to confirm...": "Wachtn ip bevestigienge van %(userId)s…", "Use two-way text verification": "Twirichtiengstekstverificoasje gebruukn", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Neemt ip een andere manier (bv. ounder vier oogn of telefonisch) contact op me den eigenoar vo te controleern of da dit toestel vertrouwd ku wordn, en vroagt of da de sleuter vo dit toestel in hunder Gebruukersinstelliengn gelyk is an ounderstoande sleuter:", - "Device name": "Toestelnoame", - "Device key": "Toestelsleuter", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Klikt hieroundern ip de knop ‘Verifieern’ a de sleuters overeenkommn. Zo niet druk j’ip de knop ‘Blokkeern’, want ton is ’t er etwien da de berichtn noa dit toestel an ’t ounderscheppn is.", "I verify that the keys match": "’k Verifieern dan de sleuters overeenkommn", "Back": "Were", "Send Custom Event": "Angepaste gebeurtenisse verstuurn", @@ -1110,15 +1024,11 @@ "Developer Tools": "Ountwikkeliengsgereedschap", "An error has occurred.": "’t Is e foute ipgetreedn.", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Verifieert deze gebruuker vo n’hem/heur als vertrouwd te markeern. Gebruukers vertrouwn gift je extra gemoedsrust by ’t gebruuk van eind-tout-eind-versleuterde berichtn.", - "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "Deze gebruuker verifieern goat hunder toestel als vertrouwd markeern, en ook joun toestel voor hunder als vertrouwd markeern.", "Waiting for partner to confirm...": "Wachtn ip bevestigienge van partner…", "Incoming Verification Request": "Inkomend verificoasjeverzoek", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "J’èt e nieuw toestel ‘%(displayName)s’ toegevoegd, dat achter versleuteriengssleuters vroagt.", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "Jen oungeverifieerd toestel ‘%(displayName)s’ vroagt achter versleuteriengssleuters.", "Start verification": "Verificoasje beginn", "Share without verifying": "Deeln zounder verificoasje", "Ignore request": "Verzoek negeern", - "Loading device info...": "Toestelinformoasje wor geloadn…", "Encryption key request": "Verzoek vo versleuteriengssleuter", "You've previously used Riot 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, Riot needs to resync your account.": "J’èt al e ki Riot ip %(host)s gebruukt me lui loadn van leedn ingeschoakeld. In deze versie is lui laden uutgeschoakeld. Me da de lokoale cache nie compatibel is tusschn deze twi instelliengn, moe Riot jen account hersynchroniseern.", "If the other version of Riot is still open in another tab, please close it as using Riot on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Indien dat d’andere versie van Riot nog in een ander tabblad is geopend, sluut je da best, want Riot ip dezelfsten host tegelykertyd me lui loadn ingeschoakeld en uutgeschoakeld gebruukn goa vo probleemn zorgn.", @@ -1171,7 +1081,6 @@ "Remember, you can always set an email address in user settings if you change your mind.": "Onthoudt da je nog assan een e-mailadresse kut instelln in de gebruukersinstelliengn.", "(HTTP status %(httpStatus)s)": "(HTTP-status %(httpStatus)s)", "Please set a password!": "Stelt e paswoord in!", - "This will allow you to return to your account after signing out, and sign in on other devices.": "Hiermee ku je noa jen account werekeern nada je j’afgemeld èt, en jen anmeldn ip andere toestelln.", "Share Room": "Gesprek deeln", "Link to most recent message": "Koppelienge noa ’t recentste bericht", "Share User": "Gebruuker deeln", @@ -1183,11 +1092,6 @@ "Missing session data": "Sessiegegeevns ountbreekn", "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Sommige sessiegegeevns, inclusief sleuters vo versleuterde berichtn, ountbreekn. Meldt jen af en were an vo dit ip te lossn, en herstelt de sleuters uut den back-up.", "Your browser likely removed this data when running low on disk space.": "Je browser èt deze gegeevns meugliks verwyderd toen da de beschikboare ipslagruumte vul was.", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Vo de moment sluut je oungeverifieerde toestelln uut; vo berichtn noa deze toestelln te verstuurn moe je ze verifieern.", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "We roadn je an van ieder toestel te verifieern vo te kunn vastestelln of da ze tout de rechtmatigen eigenoar behoorn, moa je kut ’t bericht ook zounder verificoasje verstuurn.", - "Room contains unknown devices": "’t Gesprek bevat ounbekende toestelln", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "‘%(RoomName)s’ bevat toestelln da je nog nie gezien ghed èt.", - "Unknown devices": "Ounbekende toestelln", "Upload files (%(current)s of %(total)s)": "Bestandn wordn ipgeloadn (%(current)s van %(total)s)", "Upload files": "Bestandn iploadn", "Upload": "Iploadn", @@ -1221,7 +1125,6 @@ "This looks like a valid recovery key!": "Dit is e geldigen herstelsleuter!", "Not a valid recovery key": "Geen geldigen herstelsleuter", "Access your secure message history and set up secure messaging by entering your recovery key.": "Verkrygt toegank tout je beveiligde berichtgeschiedenisse en stel beveiligd chattn in door jen herstelsleuter in te geevn.", - "If you've forgotten your recovery passphrase you can ": "A je jen herstelpaswoord zy vergeetn, ku je ", "Private Chat": "Privégesprek", "Public Chat": "Openboar gesprek", "Custom": "Angepast", @@ -1407,8 +1310,6 @@ "Couldn't find a matching Matrix room": "Kostege geen byhoornd Matrix-gesprek viendn", "Fetching third party location failed": "’t Iphoaln van de locoasje van de derde party is mislukt", "Unable to look up room ID from server": "Kostege de gesprek-ID nie van de server iphoaln", - "Message not sent due to unknown devices being present": "Bericht nie verstuurd doorda der ounbekende toestelln anwezig zyn", - "Show devices, send anyway or cancel.": "Toestelln toogn, algelyk verstuurn of annuleern.", "You can't send any messages until you review and agree to our terms and conditions.": "Je ku geen berichtn stuurn toutda je uzze algemene voorwoardn geleezn en anveird ghed èt.", "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.": "Je bericht is nie verstuurd gewist omda deze thuusserver z’n limiet vo moandeliks actieve gebruukers bereikt ghed èt. Gelieve contact ip te neemn me jen dienstbeheerder vo de dienst te bluuvn gebruukn.", "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.": "Je bericht is nie verstuurd gewist omda deze thuusserver e systeembronlimiet overschreedn ghed èt. Gelieve contact ip te neemn me jen dienstbeheerder vo de dienst te bluuvn gebruukn.", @@ -1450,7 +1351,6 @@ "The email address linked to your account must be entered.": "’t E-mailadresse da me joun account verboundn is moet ingegeevn wordn.", "A new password must be entered.": "’t Moet e nieuw paswoord ingegeevn wordn.", "New passwords must match each other.": "Nieuwe paswoordn moetn overeenkommn.", - "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "Je paswoord herinstelln goat alle sleuters voor eind-tout-eind-versleuterienge ip al je toestelln herinstelln, woadeure da je versleuterde gesprekgeschiedenisse ounleesboar wordt. Stelt de sleuterback-up in of exporteer je gesprekssleuters van ip een ander toestel vooraleer da je je paswoord herinstelt.", "Your Matrix account on %(serverName)s": "Je Matrix-account ip %(serverName)s", "Your Matrix account on ": "Je Matrix-account ip ", "A verification email will be sent to your inbox to confirm setting your new password.": "’t Is e verificoasje-e-mail noa joun gestuurd gewist vo ’t instelln van je nieuw paswoord te bevestign.", @@ -1459,7 +1359,6 @@ "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "’t Is een e-mail noar %(emailAddress)s verstuurd gewist. Klikt hieroundern van zodra da je de koppelienge derin gevolgd ghed èt.", "I have verified my email address": "’k Èn myn e-mailadresse geverifieerd", "Your password has been reset.": "Je paswoord is heringesteld.", - "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Je zyt afgemeld ip al je toestelln en je goa geen pushmeldiengn nie mi ountvangn. Meldt jen ip ieder toestel heran vo were meldiengn t’ountvangn.", "Return to login screen": "Were noa ’t anmeldiengsscherm", "Set a new password": "Stelt e nieuw paswoord in", "Invalid homeserver discovery response": "Oungeldig thuusserverountdekkiengsantwoord", @@ -1511,7 +1410,6 @@ "Decryption error": "Ountsleuteriengsfoute", "Session ID": "Sessie-ID", "Event information": "Gebeurtenisinformoasje", - "Sender device information": "Info over toestel van afzender", "Passphrases must match": "Paswoordn moetn overeenkommn", "Passphrase must not be empty": "Paswoord meug nie leeg zyn", "Export room keys": "Gesprekssleuters exporteern", @@ -1538,17 +1436,13 @@ "As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.": "Als veiligheidsnet ku je dit gebruukn vo je versleuterde berichtgeschiedenisse t’herstelln indien da je jen herstelpaswoord zou vergeetn.", "As a safety net, you can use it to restore your encrypted message history.": "Als veiligheidsnet ku je ’t gebruukn vo je versleuterde berichtgeschiedenisse t’herstelln.", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "Jen herstelsleuter is e veiligheidsnet - je kut hem gebruukn vo de toegank tou je versleuterde berichtn t’herstelln indien da je je paswoord zou vergeetn.", - "Keep your recovery key somewhere very secure, like a password manager (or a safe)": "Bewoar jen herstelsleuter ip e heel veilige plekke, lik e paswoordbeheerder (of e kluuze)", "Your Recovery Key": "Jen herstelsleuter", "Copy to clipboard": "Kopieern noa ’t klembord", "Download": "Downloadn", - "Your Recovery Key has been copied to your clipboard, paste it to:": "Jen herstelsleuter is gekopieerd noa je klembord, plakt hem in:", - "Your Recovery Key is in your Downloads folder.": "Jen herstelsleuter bevindt hem in je Downloads-mappe.", "Print it and store it somewhere safe": "Print hem af en bewoart hem ip e veilige plekke", "Save it on a USB key or backup drive": "Sloat hem ip ip een USB-stick of e back-upschyf", "Copy it to your personal cloud storage": "Kopieert hem noa je persoonlike cloudipslag", "Your keys are being backed up (the first backup could take a few minutes).": "’t Wordt e back-up van je sleuters gemakt (den eesten back-up kut e poar minuutn deurn).", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "Zounder veilig berichtherstel in te stelln, goa je je versleuterde berichtgeschiedenisse nie kunn herstelln indien da je jen afmeldt of een ander toestel gebruukt.", "Set up Secure Message Recovery": "Veilig berichtherstel instelln", "Secure your backup with a passphrase": "Beveilig je back-up met e paswoord", "Confirm your passphrase": "Bevestig je paswoord", @@ -1566,12 +1460,9 @@ "New Recovery Method": "Nieuwe herstelmethode", "A new recovery passphrase and key for Secure Messages have been detected.": "’t Zyn e nieuw herstelpaswoord en e nieuwen herstelsleuter vo beveiligde berichtn gedetecteerd.", "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.": "A je gy deze nieuwe herstelmethode nie èt ingesteld, is ’t meuglik dat der een anvaller toegank tout jen account probeert te verkrygn. Wyzigt ounmiddellik jen accountpaswoord en stelt e nieuwe herstelmethode in in d’instelliengn.", - "This device is encrypting history using the new recovery method.": "Dit toestel versleutert de geschiedenisse met de nieuwe herstelmethode.", "Go to Settings": "Goa noa d’instelliengn", "Set up Secure Messages": "Beveiligde berichtn instelln", "Recovery Method Removed": "Herstelmethode verwyderd", - "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "Dit toestel è gedetecteerd da jen herstelpaswoord en -sleuter vo beveiligde berichtn zyn verwyderd.", - "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "A je dit per accident è gedoan, ku je beveiligde berichtn instelln ip dit toestel, woamee da de berichtgeschiedenisse van dit toestel herversleuterd goa wordn met e nieuwe herstelmethode.", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "A je de herstelmethode nie è verwyderd, is ’t meuglik dat der een anvaller toegank tout jen account probeert te verkrygn. Wyzigt ounmiddellik jen accountpaswoord en stelt e nieuwe herstelmethode in in d’instelliengn.", "Failed to set direct chat tag": "Instelln van twigesprekslabel is mislukt", "Failed to remove tag %(tagName)s from room": "Verwydern van %(tagName)s-label van gesprek is mislukt", @@ -1612,8 +1503,6 @@ "Changes your avatar in all rooms": "Verandert jen avatar in alle gesprekkn", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Vertelt uus wuk dat der verkeerd is geloopn, of nog beter, makt e foutmeldienge an ip GitHub woarin da je 't probleem beschryft.", "Removing…": "Bezig me te verwydern…", - "Clear all data on this device?": "Alle gegeevns ip dit toestel wissn?", - "Clearing all data from this device is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Gewiste gegeevns kunn nie weregehoald wirdn. Versleuterde berichtn goan verloorn goan, tenzy dad hunder sleuters geback-upt gewist zyn.", "Clear all data": "Alle gegeevns wissn", "Your homeserver doesn't seem to support this feature.": "Je thuusserver biedt geen oundersteunienge vo deze functie.", "Resend edit": "Bewerkienge herverstuurn", @@ -1629,15 +1518,12 @@ "Service": "Dienst", "Summary": "Soamnvattienge", "This account has been deactivated.": "Deezn account is gedeactiveerd gewist.", - "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.": "Herkrygt den toegank tou jen account en herstelt de versleuteriengssleuters dan ip dit toestel ipgesloagn gewist zyn. Zounder deze sleuters goa je je versleuterde berichtn nie kunn leezn ip andere toestelln.", "Enter your password to sign in and regain access to your account.": "Voert je paswoord in vo jen an te meldn en den toegank tou jen account te herkrygn.", "Forgotten your password?": "Paswoord vergeetn?", "Sign in and regain access to your account.": "Meldt jen heran en herkrygt den toegank tou jen account.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Je ku je nie anmeldn me jen account. Nimt contact ip me de beheerder van je thuusserver vo meer informoasje.", "You're signed out": "Je zyt afgemeld", "Clear personal data": "Persoonlike gegeevns wissn", - "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.": "Let ip: je persoonlike gegeevns (inclusief versleuteriengssleuters) wordn nog alsan ip dit toestel ipgesloagn. Wist ze a je gereed zyt me ’t toestel te gebruukn, of a je je wilt anmeldn me nen andern account.", - "Failed to start chat": "Gesprek beginn is mislukt", "Messages": "Berichtn", "Actions": "Acties", "Displays list of commands with usages and descriptions": "Toogt e lyste van beschikboare ipdrachtn, met hunder gebruukn en beschryviengn", @@ -1665,7 +1551,6 @@ "Please enter verification code sent via text.": "Gift de verificoasjecode in da je in een smse gekreegn ghed èt.", "Discovery options will appear once you have added a phone number above.": "Ountdekkiengsopties goan verschynn a j’e telefongnumero toegevoegd ghed èt.", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "’t Is een smse versteur noa +%(msisdn)s. Gift de verificoasjecode in da derin stoat.", - "To verify that this device can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Controleert of da de sleuter da j’in je Gebruukersinstelliengn ip da toestel ziet overeenkomt me de sleuter hierounder vo te verifieern da ’t toestel ku vertrouwd wordn:", "Command Help": "Hulp by ipdrachtn", "No identity server is configured: add one in server settings to reset your password.": "’t Is geen identiteitsserver geconfigureerd gewist: voegt der één toe in de serverinstelliengn vo je paswoord herin te stelln.", "Call failed due to misconfigured server": "Iproep mislukt door verkeerd gecounfigureerde server", diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 5043525676..58e4130d99 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -8,7 +8,6 @@ "Decryption error": "解密出错", "Default": "默认", "Device ID": "设备 ID", - "Devices": "设备列表", "Direct chats": "私聊", "Disinvite": "取消邀请", "Displays action": "显示操作", @@ -49,14 +48,12 @@ "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s 从 %(fromPowerLevel)s 变为 %(toPowerLevel)s", "Guests cannot join this room even if explicitly invited.": "即使有人主动邀请,游客也不能加入此聊天室。", "Hangup": "挂断", - "Hide Text Formatting Toolbar": "隐藏格式工具栏", "Historical": "历史", "Homeserver is": "主服务器是", "Identity Server is": "身份认证服务器是", "I have verified my email address": "我已经验证了我的邮箱地址", "Import E2E room keys": "导入聊天室端到端加密密钥", "Incorrect verification code": "验证码错误", - "Invalid alias format": "别名格式无效", "Invalid Email Address": "邮箱地址格式错误", "Invalid file%(extra)s": "非法文件%(extra)s", "Return to login screen": "返回登录页面", @@ -70,8 +67,6 @@ "Search": "搜索", "Search failed": "搜索失败", "Searches DuckDuckGo for results": "搜索 DuckDuckGo", - "Sender device information": "发送者的设备信息", - "Send Invites": "发送邀请", "Send Reset Email": "发送密码重设邮件", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s 发送了一张图片。", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s 向 %(targetDisplayName)s 发了加入聊天室的邀请。", @@ -90,7 +85,6 @@ "%(count)s of your messages have not been sent.|other": "部分消息未发送。", "Someone": "某位用户", "Start a chat": "创建聊天", - "Start Chat": "开始聊天", "Submit": "提交", "Success": "成功", "This email address is already in use": "此邮箱地址已被使用", @@ -111,7 +105,6 @@ "Confirm password": "确认密码", "Continue": "继续", "Ed25519 fingerprint": "Ed25519指纹", - "Invite new room members": "邀请新的聊天室成员", "Join Room": "加入聊天室", "%(targetName)s joined the room.": "%(targetName)s 已加入聊天室。", "Jump to first unread message.": "跳到第一条未读消息。", @@ -149,7 +142,6 @@ "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s 移除了聊天室名称。", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s 将话题修改为 “%(topic)s”。", "Changes your display nickname": "修改昵称", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "目前,修改密码会导致所有设备上的端到端密钥被重置,使得加密的聊天记录不再可读。除非事先导出你的密钥,并在密码修改后导入回去。此问题将会在未来得到改善。", "Click to mute audio": "点此静音", "Click to mute video": "点此静音", "click to reveal": "点击展开", @@ -161,14 +153,10 @@ "Custom": "自定义", "Custom level": "自定义级别", "Decline": "拒绝", - "Device already verified!": "设备已验证!", - "Device ID:": "设备 ID:", "device id: ": "设备 ID: ", - "Device key:": "设备密钥 :", "Disable Notifications": "关闭消息通知", "Drop File Here": "把文件拖拽到这里", "Enable Notifications": "启用消息通知", - "Encrypted by an unverified device": "由未验证设备加密", "Enter passphrase": "输入密码", "Error: Problem communicating with the given homeserver.": "错误: 与指定的主服务器通信时出错。", "Export": "导出", @@ -184,15 +172,12 @@ "Invited": "已邀请", "Invites": "邀请", "Invites user with given id to current room": "按照 ID 邀请指定用户加入当前聊天室", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' 不符合别名的格式", "Sign in with": "第三方登录", - "Message not sent due to unknown devices being present": "消息未发送,因为有未知的设备存在", "Missing room_id in request": "请求中没有 聊天室 ID", "Missing user_id in request": "请求中没有 user_id", "Moderator": "协管员", "Mute": "静音", "Name": "姓名", - "Never send encrypted messages to unverified devices from this device": "在此设备上,从不对未经验证的设备发送消息", "New passwords don't match": "两次输入的新密码不符", "none": "无", "not specified": "未指定", @@ -229,9 +214,6 @@ "%(targetName)s left the room.": "%(targetName)s 退出了聊天室。", "Logout": "登出", "Low priority": "低优先级", - "Markdown is disabled": "Markdown 已禁用", - "Markdown is enabled": "Markdown 已启用", - "matrix-react-sdk version:": "matrix-react-sdk 版本:", "No more results": "没有更多结果", "olm version:": "olm 版本:", "Only people who have been invited": "只有被邀请的人", @@ -256,8 +238,6 @@ "Make Moderator": "使成为主持人", "Room": "聊天室", "Connectivity to the server has been lost.": "到服务器的连接已经丢失。", - "bold": "加粗", - "italic": "斜体", "New Password": "新密码", "Options": "选项", "Passphrases must match": "密码必须匹配", @@ -270,9 +250,6 @@ "Unknown error": "未知错误", "Incorrect password": "密码错误", "To continue, please enter your password.": "请输入你的密码继续。", - "Device name": "设备名称", - "Device key": "设备密钥", - "Verify device": "验证设备", "I verify that the keys match": "我验证此密钥匹配", "Unable to restore session": "无法恢复会话", "Blacklist": "列入黑名单", @@ -290,7 +267,6 @@ "Skip": "跳过", "Start verification": "开始验证", "Ignore request": "忽略请求", - "Loading device info...": "正在加载设备信息...", "Example": "例子", "Create": "创建", "Failed to upload image": "上传图像失败", @@ -311,11 +287,9 @@ "Revoke Moderator": "撤销主持人", "Remote addresses for this room:": "此聊天室的远程地址:", "Results from DuckDuckGo": "来自 DuckDuckGo 的结果", - "Room contains unknown devices": "聊天室包含未知设备", "%(roomName)s does not exist.": "%(roomName)s 不存在。", "Save": "保存", "Send anyway": "仍然发送", - "Show Text Formatting Toolbar": "显示文本格式工具栏", "This room has no local addresses": "此聊天室没有本地地址", "This doesn't appear to be a valid email address": "这似乎不是有效的邮箱地址", "This phone number is already in use": "此手机号码已被使用", @@ -325,10 +299,7 @@ "Unban": "解除封禁", "Unable to capture screen": "无法录制屏幕", "Unable to enable Notifications": "无法启用通知", - "Unable to load device list": "无法加载设备列表", - "Undecryptable": "无法解密", "unencrypted": "未加密的", - "Unencrypted message": "未加密消息", "unknown caller": "未知呼叫者", "unknown device": "未知设备", "Unnamed Room": "未命名的聊天室", @@ -361,7 +332,6 @@ "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s 设定历史浏览功能为 未知的 (%(visibility)s).", "AM": "上午", "PM": "下午", - "People": "联系人", "Profile": "个人配置", "Public Chat": "公开的", "%(roomName)s is not accessible at this time.": "%(roomName)s 此时无法访问。", @@ -375,13 +345,9 @@ "Automatically replace plain text Emoji": "将符号表情转换为 Emoji", "Unable to verify email address.": "无法验证邮箱地址。", "Unknown room %(roomId)s": "未知聊天室 %(roomId)s", - "Unknown (user, device) pair:": "未知(用户,设备)对:", - "Unrecognised command:": "无法识别的命令:", "Unrecognised room alias:": "无法识别的聊天室别名:", "(no answer)": "(无回复)", - "WARNING: Device already verified, but keys do NOT MATCH!": "警告:设备已验证,但密钥不匹配!", "Who can access this room?": "谁有权访问此聊天室?", - "Who would you like to communicate with?": "你想和谁交流?", "You are already in a call.": "您正在通话。", "You do not have permission to do that in this room.": "您没有进行此操作的权限。", "You cannot place VoIP calls in this browser.": "无法在此浏览器中发起 VoIP 通话。", @@ -408,7 +374,6 @@ "Username invalid: %(errMessage)s": "用户名无效: %(errMessage)s", "Verification Pending": "验证等待中", "(unknown failure: %(reason)s)": "(未知错误:%(reason)s)", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "警告:密钥验证失败!%(userId)s 和 device %(deviceId)s 的签名密钥为 \"%(fprint)s\",与提供的密钥 \"%(fingerprint)s\" 不匹配。这可能意味着你的通信正在被窃听!", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s 收回了 %(targetName)s 的邀请。", "You cannot place a call with yourself.": "你怎么寂寞到要和自己打电话,不支持的啦。", "You have disabled URL previews by default.": "你已经默认 禁用 链接预览。", @@ -446,15 +411,10 @@ "You must join the room to see its files": "你必须加入聊天室以看到它的文件", "Failed to invite the following users to the %(roomName)s room:": "邀请以下用户到 %(roomName)s 聊天室失败:", "Confirm Removal": "确认移除", - "Verifies a user, device, and pubkey tuple": "验证用户、设备与公钥元组", - "Unknown devices": "未知设备", "Unknown Address": "未知地址", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s 删除了他们的昵称 (%(oldDisplayName)s).", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "您提供的签名密钥和你从 %(userId)s 的设备 %(deviceId)s 收到的签名密钥匹配。设备被标记为已验证。", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s 打开了端到端加密 (算法 %(algorithm)s).", "Unable to remove contact information": "无法移除联系人信息", "Riot collects anonymous analytics to allow us to improve the application.": "Riot 收集匿名的分析数据以允许我们改善它。", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" 包含你以前没见过的设备。", "Please check your email to continue registration.": "请查看你的电子邮件以继续注册。", "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "如果不指定一个邮箱地址,您将无法重置你的密码。你确定吗?", "Add an Integration": "添加集成", @@ -466,8 +426,6 @@ "Authentication check failed: incorrect password?": "身份验证失败:密码错误?", "This will allow you to reset your password and receive notifications.": "这将允许你重置你的密码和接收通知。", "Share without verifying": "不验证就分享", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "您添加了一个新的设备 '%(displayName)s',它正在请求加密密钥。", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "你的未经验证的设备 '%(displayName)s' 正在请求加密密钥。", "Encryption key request": "加密密钥请求", "%(widgetName)s widget added by %(senderName)s": "%(senderName)s 添加了 %(widgetName)s 小挂件", "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s 移除了 %(widgetName)s 小挂件", @@ -475,7 +433,6 @@ "Unpin Message": "取消置顶消息", "Add rooms to this community": "添加聊天室到此社区", "Call Failed": "呼叫失败", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "聊天室中有未知设备:如果您在不验证它们的情况下继续,您的通话可能会被人窃听。", "Review Devices": "复查设备", "Call Anyway": "仍然呼叫", "Answer Anyway": "仍然接听", @@ -494,11 +451,8 @@ "Send": "发送", "Message Pinning": "消息置顶", "Use compact timeline layout": "使用紧凑的时间线布局", - "Never send encrypted messages to unverified devices in this room from this device": "在此设备上、此聊天室中,从不对未经验证的设备发送加密的消息", "Enable URL previews for this room (only affects you)": "在此聊天室中启用链接预览(仅影响你)", "Enable URL previews by default for participants in this room": "对此聊天室的所有成员默认启用链接预览", - "Delete %(count)s devices|other": "删除了 %(count)s 个设备", - "Delete %(count)s devices|one": "删除设备", "%(senderName)s sent an image": "%(senderName)s 发送了一张图片", "%(senderName)s sent a video": "%(senderName)s 发送了一个视频", "%(senderName)s uploaded a file": "%(senderName)s 上传了一个文件", @@ -619,14 +573,9 @@ "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s 将他们的昵称修改成了 %(displayName)s 。", "Stickerpack": "贴图集", "You don't currently have any stickerpacks enabled": "您目前没有启用任何贴纸包", - "Your key share request has been sent - please check your other devices for key share requests.": "已请求共享密钥 - 请在您的其他设备上进行确认。", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "密钥共享请求将会自动发送到您的其他设备上。如果您在其他设备上拒绝了请求,请点击此处以再次请求此会话的密钥。", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "如果您的其他设备上没有此消息的密钥,您将依然无法解密。", "Key request sent.": "已发送密钥共享请求。", - "Re-request encryption keys from your other devices.": "从其他设备上 重新请求密钥。", "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.": "如果您是房间中最后一位有权限的用户,在您降低自己的权限等级后将无法撤回此修改,因为你将无法重新获得权限。", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "您将无法撤回此修改,因为您正在将此用户的滥权等级提升至与你相同。", - "No devices with registered encryption keys": "没有注册了加密密钥的设备", "Unmute": "取消静音", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s(滥权等级 %(powerLevelNumber)s)", "Hide Stickers": "隐藏贴图", @@ -687,7 +636,6 @@ "Community IDs cannot be empty.": "社区 ID 不能为空。", "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "社区 ID 只能包含 a-z、0-9 或 “=_-./” 等字符", "Something went wrong whilst creating your community": "创建社区时出现问题", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "您目前默认将未经验证的设备列入黑名单;在发送消息到这些设备上之前,您必须先验证它们。", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "如果您之前使用过较新版本的 Riot,则您的会话可能与当前版本不兼容。请关闭此窗口并使用最新版本。", "Showing flair for these communities:": "显示这些社区的个性徽章:", "This room is not showing flair for any communities": "此聊天室没有显示任何社区的个性徽章", @@ -698,9 +646,6 @@ "Please enter the code it contains:": "请输入其包含的代码:", "Matrix ID": "Matrix ID", "Matrix Room ID": "Matrix 聊天室 ID", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "为验证此设备是否可信,请通过其他方式(例如面对面交换或拨打电话)与其拥有者联系,并询问他们该设备的用户设置中的密钥是否与以下密钥匹配:", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "如果匹配,请点击下面的验证按钮。 如果不匹配,那么这可能说明其他人正在盗用此设备,而您应当点击黑名单按钮。", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "我们建议您对每台设备进行验证以保证它们属于其合法所有者,但是您可以在不验证它们的情况下重新发送消息。", "

    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 代码

    \n

    \n 你可以给社区的新成员们写些长长的社区简介来引导他们,或者放置\n 一些重要的链接\n

    \n

    \n 你甚至可以使用 标签\n

    \n", "Add rooms to the community summary": "将聊天室添加到社区简介中", "Which rooms would you like to add to this summary?": "您想要将哪个聊天室添加到社区简介?", @@ -729,7 +674,6 @@ "Create a new community": "创建新社区", "Error whilst fetching joined communities": "获取已加入社区列表时出现错误", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "创建社区,将用户与聊天室整合在一起!搭建自定义社区主页以在 Matrix 宇宙之中标出您的私人空间。", - "Show devices, send anyway or cancel.": "显示未信任的设备不经信任直接发送取消发送。", "%(count)s of your messages have not been sent.|one": "您的消息尚未发送。", "Uploading %(filename)s and %(count)s others|other": "正在上传 %(filename)s 与其他 %(count)s 个文件", "Uploading %(filename)s and %(count)s others|zero": "正在上传 %(filename)s", @@ -747,7 +691,6 @@ "Ignores a user, hiding their messages from you": "忽略用户,隐藏他们发送的消息", "Stops ignoring a user, showing their messages going forward": "解除忽略用户,显示他们的消息", "If you've submitted a bug via GitHub, debug logs can help us track down the problem. 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.": "如果你在 GitHub 提交了一个 bug,调试日志可以帮助我们追踪这个问题。 调试日志包含应用程序使用数据,也就包括您的用户名、您访问的房间或社区的 ID 或别名,以及其他用户的用户名,但不包括聊天记录。", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "密码修改成功。在您在其他设备上重新登录之前,其他设备不会收到推送通知", "Tried to load a specific point in this room's timeline, but was unable to find it.": "尝试加载此聊天室的时间线的特定时间点,但是无法找到。", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "现在 重新发送消息取消发送 。", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "現在 重新发送消息取消发送 。你也可以单独选择消息以重新发送或取消。", @@ -800,7 +743,6 @@ "Files": "文件", "Collecting app version information": "正在收集应用版本信息", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "确定要删除聊天室别名 %(alias)s 并将 %(name)s 从列表中删除吗?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "这将允许你可以在注销后回到您的账号,并在其他设备上登录。", "Keywords": "关键词", "Enable notifications for this account": "对此账号启用通知", "Invite to this community": "邀请加入此社区", @@ -891,8 +833,6 @@ "Your User Agent": "您的 User Agent", "Your device resolution": "您设备的分辨率", "Always show encryption icons": "总是显示加密标志", - "Unable to reply": "无法回复", - "At this time it is not possible to reply with an emote.": "目前无法使用表情符号作为回复内容。", "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?": "您将被带到一个第三方网站以便验证您的账号来使用 %(integrationsUrl)s 提供的集成。您希望继续吗?", "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "无法更新聊天室 %(roomName)s 在社区 “%(groupId)s” 中的可见性。", "Minimize apps": "最小化应用程序", @@ -912,12 +852,6 @@ "You do not have permission to start a conference call in this room": "您没有在此聊天室发起通话会议的权限", "This event could not be displayed": "无法显示此事件", "Share Link to User": "分享链接给其他用户", - "deleted": "删除线", - "underlined": "下划线", - "inline-code": "代码", - "block-quote": "引用", - "bulleted-list": "无序列表", - "numbered-list": "有序列表", "Share room": "分享聊天室", "System Alerts": "系统警告", "Muted Users": "被禁言的用户", @@ -1118,7 +1052,6 @@ "Verify this user by confirming the following emoji appear on their screen.": "通过在其屏幕上显示以下表情符号来验证此用户。", "Verify this user by confirming the following number appears on their screen.": "通过在其屏幕上显示以下数字来验证此用户。", "Unable to find a supported verification method.": "无法找到支持的验证方法。", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "为了最大限度地提高安全性,我们建议您亲自执行此操作或使用其他可信的通信方式。", "Dog": "狗", "Cat": "猫", "Lion": "狮子", @@ -1165,7 +1098,6 @@ "Pencil": "铅笔", "Paperclip": "回形针", "Scissors": "剪刀", - "Padlock": "挂锁", "Key": "钥匙", "Hammer": "锤子", "Telephone": "电话", @@ -1183,7 +1115,6 @@ "Headphones": "耳机", "Folder": "文件夹", "Pin": "别针", - "Your homeserver does not support device management.": "您的主服务器不支持设备管理。", "Yes": "是", "No": "否", "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "我们已向您发送了一封电子邮件,以验证您的地址。 请按照里面的说明操作,然后单击下面的按钮。", @@ -1192,26 +1123,15 @@ "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "加密消息已使用端对端加密保护。只有您和拥有密钥的收件人可以阅读这些消息。", "Unable to load key backup status": "无法载入密钥备份状态", "Restore from Backup": "从备份恢复", - "This device is backing up your keys. ": "此设备已备份您的密钥。 ", "Back up your keys before signing out to avoid losing them.": "在登出账号之前请备份密钥以免丢失。", "Backing up %(sessionsRemaining)s keys...": "正在备份 %(sessionsRemaining)s 个密钥...", "All keys backed up": "所有密钥都已备份", - "Backup has a signature from unknown device with ID %(deviceId)s.": "备份含有一个 ID 为 %(deviceId)s 的 未知 设备的签名。", - "Backup has a valid signature from this device": "备份含有此设备的一个 有效 签名", - "Backup has a valid signature from verified device ": "备份含有 已验证 设备 的一个 有效 签名", - "Backup has a valid signature from unverified device ": "备份含有 未验证 设备 的一个 有效 签名", - "Backup has an invalid signature from verified device ": "备份含有 已验证 设备 的一个 无效 签名", - "Backup has an invalid signature from unverified device ": "备份含有 未验证 设备 的一个 无效 签名", - "Backup is not signed by any of your devices": "您的任何设备均未对备份进行签名", - "This backup is trusted because it has been restored on this device": "此备份是受信任的,因为它已在此设备上还原", - "Your keys are not being backed up from this device.": "您的密钥 没有从此设备备份。", "Start using Key Backup": "开始使用密钥备份", "Add an email address to configure email notifications": "添加电子邮件地址以配置电子邮件通知", "Unable to verify phone number.": "无法验证电话号码。", "Verification code": "验证码", "Phone Number": "电话号码", "Profile picture": "个人资料头像", - "Upload profile picture": "上传个人头像", "Display Name": "昵称", "Set a new account password...": "设置一个新的账号密码...", "Email addresses": "电子邮箱地址", @@ -1253,10 +1173,6 @@ "Encryption": "加密", "Once enabled, encryption cannot be disabled.": "一旦启用加密就无法停止。", "Encrypted": "已加密", - "Some devices for this user are not trusted": "此用户的某些设备不被信任", - "Some devices in this encrypted room are not trusted": "此加密聊天室中的某些设备不被信任", - "All devices for this user are trusted": "此用户的所有设备都已被信任", - "All devices in this encrypted room are trusted": "此聊天室中的所有设备都已被信任", "Never lose encrypted messages": "永不丢失加密消息", "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "此聊天室中的消息已被端对端加密保护。只有您和拥有密钥的收件人才可以于都这些消息。", "Securely back up your keys to avoid losing them. Learn more.": "安全地备份您的密钥以免丢失。了解更多。", @@ -1273,8 +1189,6 @@ "Error updating flair": "更新个性徽章时发生错误", "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "更新此聊天室的个性徽章时发生错误。可能时该服务器不允许,也可能是发生了一个临时错误。", "Room avatar": "聊天室头像", - "Upload room avatar": "上传聊天室头像", - "No room avatar": "没有聊天室头像", "Room Name": "聊天室名称", "Room Topic": "聊天室话题", "Join": "加入", @@ -1295,7 +1209,6 @@ "Waiting for %(userId)s to confirm...": "等待 %(userId)s 确认中...", "Use two-way text verification": "使用双向文本验证", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "验证此用户并标记为受信任。在使用端到端加密消息时,信任用户可让您更加放心。", - "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "验证此用户将会标记其设备为受信任,而且您的设备也会被对方标记为受信任。", "Waiting for partner to confirm...": "等待对方确认中...", "Incoming Verification Request": "收到验证请求", "You've previously used Riot 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, Riot needs to resync your account.": "您之前在 %(host)s 上开启了 Riot 的成员列表延迟加载设置。目前版本中延迟加载功能已被停用。因为本地缓存在这两个设置项上不相容,Riot 需要重新同步您的账号。", @@ -1325,7 +1238,6 @@ "This looks like a valid recovery key!": "看起来是有效的恢复密钥!", "Not a valid recovery key": "不是有效的恢复密钥", "Access your secure message history and set up secure messaging by entering your recovery key.": "通过输入恢复密钥来访问您的安全消息历史记录和设置安全通信。", - "If you've forgotten your recovery passphrase you can ": "如果忘记了恢复密码,您可以 ", "Share Permalink": "分享永久链接", "Clear status": "清除状态", "Update status": "更新状态", @@ -1366,7 +1278,6 @@ "A verification email will be sent to your inbox to confirm setting your new password.": "一封验证电子邮件将发送到您的邮箱以确认您设置了新密码。", "Sign in instead": "登入", "Your password has been reset.": "您的密码已重置。", - "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "您已从所有设备登出且不会再收到推送通知。要重新开启通知,请在各个设备上再次登入。", "Set a new password": "设置新密码", "Invalid homeserver discovery response": "无效的主服务器搜索响应", "Invalid identity server discovery response": "无效的身份服务器搜索响应", @@ -1392,15 +1303,11 @@ "As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.": "作为一张安全网,您可以在忘记了恢复密码的时候使用它来还原您的加密消息历史记录。", "As a safety net, you can use it to restore your encrypted message history.": "作为一张安全网,您可以使用它来还原您的加密消息历史记录。", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "恢复密钥是您的一张安全网 - 如果忘记了密码,您可以用它来重获加密消息的访问权。", - "Keep your recovery key somewhere very secure, like a password manager (or a safe)": "请将您的恢复密钥保存在某个非常安全的地方,比如密码管理器(或保险箱)", "Your Recovery Key": "您的恢复密钥", - "Your Recovery Key has been copied to your clipboard, paste it to:": "您的恢复密钥已 复制到剪贴板,粘贴至:", - "Your Recovery Key is in your Downloads folder.": "您的恢复密钥保存在 下载 文件夹。", "Print it and store it somewhere safe": "打印 并存放在安全的地方", "Save it on a USB key or backup drive": "保存 在 U 盘或备份磁盘中", "Copy it to your personal cloud storage": "复制 到您的个人云端存储", "Your keys are being backed up (the first backup could take a few minutes).": "正在备份您的密钥(第一次备份可能会花费几分钟时间)。", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "如果您登出账号或使用其他设备而没有设置安全消息恢复,您将不能还原您的加密消息历史记录。", "Set up Secure Message Recovery": "设置安全消息恢复", "Secure your backup with a passphrase": "使用密码保护您的备份", "Confirm your passphrase": "确认你的密码", @@ -1415,11 +1322,8 @@ "New Recovery Method": "新恢复方式", "A new recovery passphrase and key for Secure Messages have been detected.": "检测到安全消息的一个新恢复密码和密钥。", "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.": "如果您没有设置新恢复方式,可能有攻击者正试图侵入您的账号。请立即更改您的账号密码并在设置中设定一个新恢复方式。", - "This device is encrypting history using the new recovery method.": "此设备正在使用新恢复方式来加密历史记录。", "Set up Secure Messages": "设置安全消息", "Recovery Method Removed": "恢复方式已移除", - "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "此设置已检测到您的安全消息的恢复密码和密钥被移除。", - "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "如果您意外执行了此操作,您可以在此设备上设置安全消息来使用新恢复方式重新加密此设备上的消息历史记录。", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "如果您没有移除该恢复方式,可能有攻击者正试图侵入您的账号。请立即更改您的账号密码并在设置中设定一个新的恢复方式。", "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "将 ¯\\_(ツ)_/¯ 添加到纯文本消息中", "User %(userId)s is already in the room": "用户 %(userId)s 已在聊天室中", @@ -1448,18 +1352,11 @@ "Power level": "权限级别", "Want more than a community? Get your own server": "想要的不只是社区? 架设您自己的服务器", "Please install Chrome, Firefox, or Safari for the best experience.": "请安装 ChromeFirefox,或 Safari 以获得最佳体验。", - "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "更改您的密码将会重置您所有设备上的端对端加密密钥,让已加密的聊天历史记录无法读取。在重设密码之前,请设置密钥备份或从其他设备导出您的聊天室密钥。", - "Room upgrade confirmation": "聊天室升级确认", - "Upgrading a room can be destructive and isn't always necessary.": "升级聊天室可能具有破坏性,并不总是必要的。", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "如果聊天室版本被视为是 不稳定 的,通常建议进行聊天室升级。不稳定的聊天室版本可能含有 bug ,缺少功能或有安全漏洞。", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "聊天室升级通常只会影响聊天室 服务器端 的处理。如果您的 Riot 客户端存在问题,请向 提 issue。", "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.": "警告:升级聊天室 不会自动将聊天室成员转移到新版聊天室中。 我们将会在旧版聊天室中发布一个新版聊天室的链接 - 聊天室成员必须点击该链接以加入新聊天室。", "Adds a custom widget by URL to the room": "用链接方式为聊天室添加自定义小部件", "Please supply a https:// or http:// widget URL": "请提供一个 https:// 或 http:// 形式的小部件链接", "You cannot modify widgets in this room.": "您无法修改此聊天室的小部件。", "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s 撤销了对 %(targetDisplayName)s 加入聊天室的邀请。", - "Enable desktop notifications for this device": "为此设备启用桌面通知", - "Enable audible notifications for this device": "为此设备启用通知声音", "Upgrade this room to the recommended room version": "升级此聊天室至推荐版本", "This room is running room version , which this homeserver has marked as unstable.": "此聊天室运行的聊天室版本是 ,该版本已被主服务器标记为 不稳定 。", "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "升级此聊天室将会关闭聊天室的当前实例并创建一个具有相同名称的升级版聊天室。", diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 4a70441317..35f4a14414 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -36,7 +36,6 @@ "Decryption error": "解密出錯", "Default": "預設", "Device ID": "裝置識別碼", - "Devices": "裝置列表", "Direct chats": "私聊", "Disinvite": "取消邀請", "Displays action": "顯示操作", @@ -78,17 +77,14 @@ "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s 從 %(fromPowerLevel)s 變為 %(toPowerLevel)s", "Guests cannot join this room even if explicitly invited.": "游客不能加入此聊天室,即使有人主動邀請。.", "Hangup": "掛斷", - "Hide Text Formatting Toolbar": "隱藏格式工具欄", "Historical": "歷史", "Homeserver is": "主伺服器是", "Identity Server is": "身分認證伺服器是", "I have verified my email address": "我已經驗證了我的電子郵件地址", "Import E2E room keys": "導入聊天室端對端加密密鑰", "Incorrect verification code": "驗證碼錯誤", - "Invalid alias format": "別名格式錯誤", "Invalid Email Address": "無效的電子郵件地址", "Invalid file%(extra)s": "非法文件%(extra)s", - "Invite new room members": "邀請新的聊天室成員", "Join Room": "加入聊天室", "%(targetName)s joined the room.": "%(targetName)s 加入了聊天室。.", "Jump to first unread message.": "跳到第一則未讀訊息。", @@ -105,8 +101,6 @@ "Search": "搜尋", "Search failed": "搜索失敗", "Searches DuckDuckGo for results": "搜尋 DuckDuckGo", - "Sender device information": "發送者的裝置資訊", - "Send Invites": "傳送邀請", "Send Reset Email": "發送密碼重設郵件", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s 傳了一張圖片。", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s 向 %(targetDisplayName)s 傳送了加入聊天室的邀請。", @@ -125,13 +119,11 @@ "%(count)s of your messages have not been sent.|other": "部分訊息未送出。", "Someone": "某人", "Start a chat": "建立聊天", - "Start Chat": "開始聊天", "Submit": "提交", "Success": "成功", "This email address is already in use": "這個電子郵件地址已被使用", "This email address was not found": "未找到此電子郵件地址", "The email address linked to your account must be entered.": "必須輸入和你帳號關聯的電子郵件地址。", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s 啟用端對端加密 (algorithm %(algorithm)s).", "Unable to add email address": "無法新增電郵地址", "Unable to capture screen": "無法截取畫面", "Unable to enable Notifications": "無法啟用通知功能", @@ -164,7 +156,6 @@ "Anyone": "任何人", "Command error": "指令出錯", "Commands": "指令", - "Device ID:": "裝置 ID:", "device id: ": "裝置 ID: ", "Reason": "原因", "Register": "註冊", @@ -202,7 +193,6 @@ "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s 已經移除了聊天室名稱。", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s 已經變更主題為「%(topic)s」。", "Changes your display nickname": "變更您的顯示暱稱", - "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "目前變更密碼將會重設在所有裝置上的端對端加密金鑰,讓加密的聊天歷史無法讀取,除非您先匯出您的房間金鑰,並在稍後重新匯入它們。這會在未來改進。", "Claimed Ed25519 fingerprint key": "已索取 Ed25519 指紋金鑰", "Click to mute audio": "點選以靜音", "Click to mute video": "點選以讓視訊靜音", @@ -215,12 +205,9 @@ "Custom level": "自訂等級", "Decline": "拒絕", "Deops user with given id": "取消指定 ID 使用者的管理員權限", - "Device already verified!": "裝置已驗證!", - "Device key:": "裝置金鑰:", "Disable Notifications": "停用通知", "Drop File Here": "在此放置檔案", "Enable Notifications": "啟用通知", - "Encrypted by an unverified device": "已透過未驗證過的裝置加密", "Enter passphrase": "輸入通關密語", "Error: Problem communicating with the given homeserver.": "錯誤:與指定的家伺服器有通訊問題。", "Export": "匯出", @@ -237,7 +224,6 @@ "Invited": "已邀請", "Invites": "邀請", "Invites user with given id to current room": "邀請指定 ID 的使用者到目前的聊天室", - "'%(alias)s' is not a valid format for an alias": "'%(alias)s' 不是別名的有效格式", "Sign in with": "登入使用", "Join as voice or video.": "加入為語音視訊。", "Joins room with given alias": "以指定的別名加入聊天室", @@ -254,16 +240,10 @@ "%(senderName)s made future room history visible to anyone.": "%(senderName)s 讓未來的聊天室歷史紀錄可見於任何人。", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s 讓未來的聊天室歷史紀錄可見於未知 (%(visibility)s) 。", "Manage Integrations": "管理整合", - "Markdown is disabled": "Markdown 已停用", - "Markdown is enabled": "Markdown 已啟用", - "matrix-react-sdk version:": "matrix-react-sdk 版本:", - "Message not sent due to unknown devices being present": "因為未知的裝置存在而未傳送", "Missing room_id in request": "在要求中遺失聊天室 ID", "Missing user_id in request": "在要求中遺失使用者 ID", "Moderator": "仲裁者", "Name": "名稱", - "Never send encrypted messages to unverified devices from this device": "從不自此裝置傳送加密的訊息到未驗證的裝置", - "Never send encrypted messages to unverified devices in this room from this device": "從不在此聊天室中從此裝置上傳送未加密的訊息到未驗證的裝置", "New address (e.g. #foo:%(localDomain)s)": "新地址(例如:#foo:%(localDomain)s)", "New passwords don't match": "新密碼不相符", "New passwords must match each other.": "新密碼必須互相符合。", @@ -272,7 +252,6 @@ "(not supported by this browser)": "(不被此瀏覽器支援)", "": "<不支援>", "NOT verified": "未驗證", - "No devices with registered encryption keys": "沒有已註冊的加密金鑰的裝置", "No display name": "沒有顯示名稱", "No more results": "沒有更多結果", "No results": "沒有結果", @@ -281,7 +260,6 @@ "Only people who have been invited": "僅有被邀請的夥伴", "Password": "密碼", "Passwords can't be empty": "密碼不能為空", - "People": "夥伴", "Permissions": "權限", "Phone": "電話", "Please check your email and click on the link it contains. Once this is done, click continue.": "請檢查您的電子郵件並點選其中包含的連結。只要這個完成了,就點選選繼續。", @@ -298,16 +276,13 @@ "%(senderName)s removed their profile picture.": "%(senderName)s 移除了他的基本資料圖片。", "%(senderName)s requested a VoIP conference.": "%(senderName)s 請求了一次 VoIP 會議。", "Results from DuckDuckGo": "DuckDuckGo 的結果", - "Room contains unknown devices": "包含了未知裝置的房間", "%(roomName)s does not exist.": "%(roomName)s 不存在。", "%(roomName)s is not accessible at this time.": "%(roomName)s 此時無法存取。", "Save": "儲存", "Seen by %(userName)s at %(dateTime)s": "%(userName)s 在 %(dateTime)s 時看過", "Send anyway": "無論如何都要傳送", - "Show Text Formatting Toolbar": "顯示文字格式化工具列", "Start authentication": "開始認證", "The phone number entered looks invalid": "輸入的電話號碼看起來無效", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "您提供的簽署金鑰與您從 %(userId)s 的裝置 %(deviceId)s 收到的簽署金鑰相符。裝置被標記為已驗證。", "The remote side failed to pick up": "遠端未能接聽", "This room has no local addresses": "此房間沒有本機地址", "This room is not recognised.": "此聊天室不被認可。", @@ -322,17 +297,12 @@ "Unable to verify email address.": "無法驗證電子郵件。", "Unban": "解除禁止", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s 解除阻擋 %(targetName)s。", - "Unable to load device list": "無法載入裝置清單", - "Undecryptable": "無法解密", "unencrypted": "未加密", - "Unencrypted message": "未加密的訊息", "unknown caller": "不明來電", "unknown device": "未知的裝置", "Unknown room %(roomId)s": "未知的房間 %(roomId)s", - "Unknown (user, device) pair:": "未知的(使用者,裝置)配對:", "Unmute": "解除靜音", "Unnamed Room": "未命名的聊天室", - "Unrecognised command:": "無法識別的命令:", "Unrecognised room alias:": "無法辨識的聊天室別名:", "Uploading %(filename)s and %(count)s others|zero": "正在上傳 %(filename)s", "Uploading %(filename)s and %(count)s others|one": "正在上傳 %(filename)s 與另外 %(count)s 個", @@ -360,11 +330,8 @@ "(no answer)": "(未回覆)", "(unknown failure: %(reason)s)": "(未知的錯誤:%(reason)s)", "Warning!": "警告!", - "WARNING: Device already verified, but keys do NOT MATCH!": "警告:裝置已驗證,但金鑰不符合!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "警告:金鑰驗證失敗!%(userId)s 與裝置 %(deviceId)s 的簽署金鑰是「%(fprint)s」,其並不符合提供的金鑰「%(fingerprint)s」。這可能代表您的通訊已被攔截!", "Who can access this room?": "誰可以存取此房間?", "Who can read history?": "誰可以讀取歷史紀錄?", - "Who would you like to communicate with?": "您想與誰通訊?", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s 撤回了 %(targetName)s 的邀請。", "You do not have permission to post to this room": "您沒有權限在此房間發言", "You have disabled URL previews by default.": "您已預設停用 URL 預覽。", @@ -374,7 +341,6 @@ "You need to be able to invite users to do that.": "您需要邀請使用者來做這件事。", "You need to be logged in.": "您需要登入。", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "您的電子郵件地址似乎未在此主伺服器上與 Matrix ID 關聯。", - "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "您的密碼已成功變更。您將不會在其他裝置上收到推送通知,一直到您登入回那些裝置為止", "You seem to be in a call, are you sure you want to quit?": "您似乎尚在通話中,您確定您想要結束通話嗎?", "You seem to be uploading files, are you sure you want to quit?": "您似乎正在上傳檔案,您確定您想要結束嗎?", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "您將無法復原此變更,因為您正在將其他使用者的權限等級提升到與您相同。", @@ -409,8 +375,6 @@ "(~%(count)s results)|one": "(~%(count)s 結果)", "(~%(count)s results)|other": "(~%(count)s 結果)", "Active call": "活躍的通話", - "bold": "粗體", - "italic": "斜體", "Please select the destination room for this message": "請選取此訊息的目標房間", "New Password": "新密碼", "Start automatically after system login": "在系統登入後自動開始", @@ -436,18 +400,9 @@ "Unknown error": "未知的錯誤", "Incorrect password": "不正確的密碼", "To continue, please enter your password.": "要繼續,請輸入您的密碼。", - "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "要驗證此裝置是否可信,請使用其他方式(例如:面對面或是打電話)聯絡它的擁有者並詢問他們在使用者設定中看到此裝置的金鑰是否與下列的金鑰相符:", - "Device name": "裝置名稱", - "Device key": "裝置金鑰", - "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "若其符合,按下下面的驗證按鈕。若其不符合,那麼就是有其他人試圖攔截此裝置,您應該按下黑名單按鈕。", - "Verify device": "驗證裝置", "I verify that the keys match": "我驗證金鑰相符", "Unable to restore session": "無法復原工作階段", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "若您先前使用過較新版本的 Riot,您的工作階段可能與此版本不相容。關閉此視窗並回到較新的版本。", - "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "您目前正把未驗證的裝置列入黑名單;要傳送訊息到這些裝置,您必須先驗證它們。", - "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "我們建議您對每一個裝置執行驗證過程以確認它們屬於其合法擁有者,但若您想要的話,您也可以重新傳送訊息而不必驗證它們。", - "\"%(RoomName)s\" contains devices that you haven't seen before.": "「%(RoomName)s」包含了您先前沒看過的裝置。", - "Unknown devices": "未知的裝置", "Unknown Address": "未知的地址", "Unblacklist": "解除黑名單", "Blacklist": "黑名單", @@ -474,8 +429,6 @@ "Start verification": "開始驗證", "Share without verifying": "不驗證就分享", "Ignore request": "忽略請求", - "You added a new device '%(displayName)s', which is requesting encryption keys.": "您加入了新裝置 '%(displayName)s',其將會要求加密金鑰。", - "Your unverified device '%(displayName)s' is requesting encryption keys.": "您未驗證的裝置 '%(displayName)s' 正在請求加密金鑰。", "Encryption key request": "加密金鑰請求", "Add a widget": "新增小工具", "Allow": "允許", @@ -494,8 +447,6 @@ "Unable to create widget.": "無法建立小工具。", "You are not in this room.": "您不在這個聊天室內。", "You do not have permission to do that in this room.": "您沒有在這個聊天室做這件事的權限。", - "Verifies a user, device, and pubkey tuple": "驗證使用者、裝置與公開金鑰變數組", - "Loading device info...": "正在載入裝置資訊……", "Example": "範例", "Create": "建立", "Featured Rooms:": "特色聊天室:", @@ -509,7 +460,6 @@ "Failed to copy": "複製失敗", "Add rooms to this community": "新增聊天室到此社群", "Call Failed": "通話失敗", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "此聊天室有未知的裝置:若您想要不驗證它們而繼續,可能會有其他人竊聽您的通話。", "Review Devices": "審閱裝置", "Call Anyway": "無論如何都通話", "Answer Anyway": "無論如何都回覆", @@ -540,8 +490,6 @@ "Enable inline URL previews by default": "預設啟用內嵌 URL 預覽", "Enable URL previews for this room (only affects you)": "對此聊天室啟用 URL 預覽(僅影響您)", "Enable URL previews by default for participants in this room": "對此聊天室中的參與者預設啟用 URL 預覽", - "Delete %(count)s devices|other": "刪除 %(count)s 個裝置", - "Delete %(count)s devices|one": "刪除裝置", "%(senderName)s sent an image": "%(senderName)s 傳送了一張圖片", "%(senderName)s sent a video": "%(senderName)s 傳送了一則視訊", "%(senderName)s uploaded a file": "%(senderName)s 上傳了一個檔案", @@ -747,7 +695,6 @@ "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s", "This room is not public. You will not be able to rejoin without an invite.": "這個聊天室並未公開。您在沒有邀請的情況下將無法重新加入。", "Community IDs cannot be empty.": "社群 ID 不能為空。", - "Show devices, send anyway or cancel.": "顯示裝置無論如何都要傳送取消。", "In reply to ": "回覆給 ", "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s 變更了他的顯示名稱為 %(displayName)s 。", "Failed to set direct chat tag": "設定直接聊天標籤失敗", @@ -756,11 +703,7 @@ "Did you know: you can use communities to filter your Riot.im experience!": "您知道嗎:您可以使用社群來強化您的 Riot.im 使用體驗!", "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "要設定過濾器,拖曳社群大頭貼到位於螢幕最左邊的過濾器面板。您可以在任何時候在過濾器面板中的大頭貼上點按以檢視與該社群關聯的聊天室與夥伴。", "Clear filter": "清除過濾器", - "Your key share request has been sent - please check your other devices for key share requests.": "您的金鑰分享請求已傳送,請檢查您的其他裝置來看看金鑰分享請求。", - "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "金鑰分享請求已自動傳送到您的其他裝置。若您在您的其他裝置上回絕了金鑰分享請求,點按這裡以再次請求這個工作階段的金鑰。", - "If your other devices do not have the key for this message you will not be able to decrypt them.": "若您的其他裝置沒有這個訊息的金鑰,您將無法將它們解密。", "Key request sent.": "金鑰請求已傳送。", - "Re-request encryption keys from your other devices.": "從您的其他裝置重新請求加密金鑰。", "Code": "代碼", "If you've submitted a bug via GitHub, debug logs can help us track down the problem. 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.": "如果您透過 GitHub 來回報錯誤,除錯訊息可以用來追蹤問題。除錯訊息包含應用程式的使用資料,包括您的使用者名稱、您所造訪的房間/群組的 ID 或別名、其他使用者的使用者名稱等,其中不包含訊息本身。", "Submit debug logs": "傳送除錯訊息", @@ -826,7 +769,6 @@ "Files": "檔案", "Collecting app version information": "收集應用程式版本資訊", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "刪除聊天室別名 %(alias)s 並從目錄移除 %(name)s?", - "This will allow you to return to your account after signing out, and sign in on other devices.": "這讓您可以在登入後回到您帳號,並在其他裝置上登入。", "Enable notifications for this account": "本帳號啟用通知", "Invite to this community": "邀請至此社群", "Messages containing keywords": "訊息包含 關鍵字", @@ -912,8 +854,6 @@ "Your User Agent": "您的使用者代理字串", "Your device resolution": "您的裝置解析度", "Always show encryption icons": "總是顯示加密圖示", - "Unable to reply": "無法回覆", - "At this time it is not possible to reply with an emote.": "目前無法使用表情符號回覆。", "Popout widget": "彈出式小工具", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "無法載入要回覆的活動,它可能不存在或是您沒有權限檢視它。", "Send Logs": "傳送紀錄", @@ -964,12 +904,6 @@ "Permission Required": "需要權限", "You do not have permission to start a conference call in this room": "您沒有在此聊天室啟動會議通話的權限", "This event could not be displayed": "此活動無法顯示", - "deleted": "刪除線", - "underlined": "底線", - "inline-code": "內嵌程式碼", - "block-quote": "區塊引用", - "bulleted-list": "項目符號清單", - "numbered-list": "編號清單", "A call is currently being placed!": "目前正在撥打電話!", "Failed to remove widget": "移除小工具失敗", "An error ocurred whilst trying to remove the widget from the room": "嘗試從聊天室移除小工具時發生錯誤", @@ -1025,11 +959,6 @@ "Unable to load! Check your network connectivity and try again.": "無法載入!請檢查您的網路連線狀態並再試一次。", "Delete Backup": "刪除備份", "Unable to load key backup status": "無法載入金鑰備份狀態", - "Backup has a valid signature from this device": "備份有從此裝置而來的有效簽章", - "Backup has a valid signature from unverified device ": "備份有從未驗證的 裝置而來的有效簽章", - "Backup has an invalid signature from verified device ": "備份有從已驗證的 裝置而來的無效簽章", - "Backup has an invalid signature from unverified device ": "備份有從未驗證的 裝置而來的無效簽章", - "Backup is not signed by any of your devices": "備份未被您的任何裝置簽署", "Backup version: ": "備份版本: ", "Algorithm: ": "演算法: ", "Please review and accept all of the homeserver's policies": "請審閱並接受家伺服器的所有政策", @@ -1047,12 +976,9 @@ "Your Recovery Key": "您的復原金鑰", "Copy to clipboard": "複製到剪貼簿", "Download": "下載", - "Your Recovery Key has been copied to your clipboard, paste it to:": "您的復原金鑰已複製到您的剪貼簿,將它貼上到:", - "Your Recovery Key is in your Downloads folder.": "您的復原金鑰在您的下載資料夾。", "Print it and store it somewhere safe": "列印它並存放在安全的地方", "Save it on a USB key or backup drive": "將它儲存到 USB 金鑰或備份磁碟上", "Copy it to your personal cloud storage": "將它複製 到您的個人雲端儲存", - "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "在沒有設定安全訊息復原的狀況下,您將無法在登出或使用其他裝置後復原您的已加密訊息歷史。", "Set up Secure Message Recovery": "設定安全訊息復原", "Keep it safe": "保持安全", "Create Key Backup": "建立金鑰備份", @@ -1071,7 +997,6 @@ "This looks like a valid recovery key!": "看起來是有效的復原金鑰!", "Not a valid recovery key": "不是有效的復原金鑰", "Access your secure message history and set up secure messaging by entering your recovery key.": "存取您的安全訊息歷史並趟過輸入您的復原金鑰來設定安全傳訊。", - "If you've forgotten your recovery passphrase you can ": "如果您忘記您的復原密碼,您可以", "Failed to perform homeserver discovery": "執行家伺服器探索失敗", "Invalid homeserver discovery response": "無效的家伺服器探索回應", "Sign in with single sign-on": "以單一登入來登入", @@ -1119,7 +1044,6 @@ "That doesn't look like a valid email address": "看起來不像有效的電子郵件地址", "Invalid identity server discovery response": "無效的身份伺服器探索回應", "General failure": "一般錯誤", - "Backup has a valid signature from verified device ": "備份有從驗證過的裝置而來的有效簽章", "Checking...": "正在檢查……", "New Recovery Method": "新復原方法", "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.": "如果您沒有設定新的復原方法,攻擊者可能會嘗試存取您的帳號。在設定中立刻變更您的密碼並設定新的復原方法。", @@ -1164,20 +1088,17 @@ "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "與此使用者的安全訊息是端到端加密的,無法被第三方讀取。", "Got It": "我了解了", "Verify this user by confirming the following number appears on their screen.": "透過確認在他們的螢幕上顯示的以下號碼來驗證此使用者。", - "For maximum security, we recommend you do this in person or use another trusted means of communication.": "為了最大限度地提高安全性,我們建議您面對面執行這個動作,或是使用其他可信的通訊方式。", "Yes": "是", "No": "否", "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "我們已經傳送給您一封電子郵件以驗證您的地址。請遵照那裡的指示,然後點選下面的按鈕。", "Email Address": "電子郵件地址", "Backing up %(sessionsRemaining)s keys...": "正在備份 %(sessionsRemaining)s 金鑰……", "All keys backed up": "所有金鑰都已備份", - "Backup has a signature from unknown device with ID %(deviceId)s.": "備份有從未知裝置,ID %(deviceId)s 而來的簽章。", "Add an email address to configure email notifications": "新增電子郵件地址以設定電子郵件通知", "Unable to verify phone number.": "無法驗證電話號碼。", "Verification code": "驗證碼", "Phone Number": "電話號碼", "Profile picture": "個人檔案照片", - "Upload profile picture": "上傳個人檔案照片", "Display Name": "顯示名稱", "Room information": "聊天室資訊", "Internal room ID:": "內部聊天室 ID:", @@ -1220,8 +1141,6 @@ "Voice & Video": "語音與視訊", "Main address": "主要地址", "Room avatar": "聊天室大頭貼", - "Upload room avatar": "上傳聊天室大頭貼", - "No room avatar": "沒有聊天室大頭貼", "Room Name": "聊天室名稱", "Room Topic": "聊天室主題", "Join": "加入", @@ -1231,7 +1150,6 @@ "Waiting for partner to accept...": "正在等待夥伴接受……", "Use two-way text verification": "使用雙向文字驗證", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "驗證此使用者以標記他們為受信任的。信任的使用者可以在使用端到端加密訊息時能更加放心。", - "Verifying this user will mark their device as trusted, and also mark your device as trusted to them.": "驗證此使用者會將他們的裝置標記為受信任,並為他們標記您的裝置為受信任。", "Waiting for partner to confirm...": "正在等待夥伴確認……", "Incoming Verification Request": "來到的驗證請求", "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "要協助避免重覆的問題,請先檢視既有的議題(並新增 a+1)或是如果您找不到的話,就建立新議題。", @@ -1267,10 +1185,7 @@ "Keep going...": "繼續……", "Starting backup...": "正在開始備份……", "A new recovery passphrase and key for Secure Messages have been detected.": "偵測到安全訊息的新復原通關密語與金鑰。", - "This device is encrypting history using the new recovery method.": "此裝置正在使用新的復原方法加密歷史紀錄。", "Recovery Method Removed": "已移除復原方法", - "This device has detected that your recovery passphrase and key for Secure Messages have been removed.": "此裝置已偵測到您的安全訊息復原通關密語與金鑰被移除。", - "If you did this accidentally, you can setup Secure Messages on this device which will re-encrypt this device's message history with a new recovery method.": "如果您意外執行了此動作,您可以在此裝置上設定安全訊息來使用新的復原方法重新加密此裝置上的訊息歷史。", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "如果您沒有移除復原方法,攻擊者可能會試圖存取您的帳號。請立刻在設定中變更您帳號的密碼並設定新的復原方式。", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "檔案 %(fileName)s 超過家伺服器的上傳限制", "Gets or sets the room topic": "取得或設定聊天室主題", @@ -1329,7 +1244,6 @@ "Book": "書", "Pencil": "鉛筆", "Paperclip": "迴紋針", - "Padlock": "掛鎖", "Key": "鑰匙", "Hammer": "鎚子", "Telephone": "電話", @@ -1347,12 +1261,6 @@ "Headphones": "耳機", "Folder": "資料夾", "Pin": "別針", - "Your homeserver does not support device management.": "您的家伺服器不支援裝置管理。", - "This backup is trusted because it has been restored on this device": "因為此備份已在此裝置上復原,所以其被信任", - "Some devices for this user are not trusted": "此使用者的某些裝置不被信任", - "Some devices in this encrypted room are not trusted": "此已加密的聊天室中的某些裝置不被信任", - "All devices for this user are trusted": "此使用者的所有裝置都被信任", - "All devices in this encrypted room are trusted": "此已加密的聊天室中的所有裝置都被信任", "Recovery Key Mismatch": "復原金鑰不符合", "Incorrect Recovery Passphrase": "不正確的復原通關密語", "Backup could not be decrypted with this passphrase: please verify that you entered the correct recovery passphrase.": "備份無法使用此通關密語解密:請驗證您是否輸入正確的復原通關密語。", @@ -1362,7 +1270,6 @@ "This homeserver does not support communities": "此家伺服器不支援社群", "A verification email will be sent to your inbox to confirm setting your new password.": "一封驗證用的電子郵件已經傳送到您的收件匣以確認您設定了新密碼。", "Your password has been reset.": "您的密碼已重設。", - "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "您已從所有裝置登出,不會再收到推播通知了。要重新啟用通知,請再次於每個裝置上登入。", "This homeserver does not support login using email address.": "此家伺服器不支援使用電子郵件地址登入。", "Registration has been disabled on this homeserver.": "註冊已在此家伺服器上停用。", "Unable to query for supported registration methods.": "無法查詢支援的註冊方法。", @@ -1370,9 +1277,7 @@ "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "您確定嗎?如果您的金鑰沒有正確備份的話,您將會遺失您的加密訊息。", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "加密訊息是使用端到端加密。只有您和接收者才有金鑰可以閱讀這些訊息。", "Restore from Backup": "從備份復原", - "This device is backing up your keys. ": "此裝置正在備份您的金鑰。 ", "Back up your keys before signing out to avoid losing them.": "在登出前備份您的金鑰以避免遺失它們。", - "Your keys are not being backed up from this device.": "您的金鑰並未從此裝置上備份。", "Start using Key Backup": "開始使用金鑰備份", "Credits": "感謝", "Never lose encrypted messages": "永不遺失加密訊息", @@ -1393,7 +1298,6 @@ "Set up with a Recovery Key": "使用復原金鑰設定", "Please enter your passphrase a second time to confirm.": "請再次輸入您的通關密語以確認。", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "您的復原金鑰是安全網,如果您忘記您的通關密語的話,您還可以使用它來復原您對加密訊息的存取權。", - "Keep your recovery key somewhere very secure, like a password manager (or a safe)": "把您的復原金鑰放在安全的地方,像是密碼管理員(或保險箱)", "Your keys are being backed up (the first backup could take a few minutes).": "您的金鑰正在備份(第一次備份會花費數分鐘)。", "Secure your backup with a passphrase": "使用通關密語保障您備份的安全", "Confirm your passphrase": "確認您的通關密語", @@ -1448,18 +1352,11 @@ "Power level": "權力等級", "Want more than a community? Get your own server": "想要的不只是社群?架設您自己的伺服器", "Please install Chrome, Firefox, or Safari for the best experience.": "請安裝 ChromeFirefoxSafari 以獲得最佳體驗。", - "Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.": "變更您的密碼將會重設在您所有裝置上的端到端加密金鑰,讓已加密的聊天歷史紀錄無法讀取。在重設您的密碼前,請設定金鑰備份或從其他裝置匯出您的聊天室金鑰。", - "Room upgrade confirmation": "確認聊天室升級", - "Upgrading a room can be destructive and isn't always necessary.": "升級聊天室可能會弄壞某些東西,而且不一定必要。", - "Room upgrades are usually recommended when a room version is considered unstable. Unstable room versions might have bugs, missing features, or security vulnerabilities.": "聊天室升級通常建議在聊天室版本不穩定時使用。不穩定的聊天室版本可能會有臭蟲、缺少功能或安全問題。", - "Room upgrades usually only affect server-side processing of the room. If you're having problems with your Riot client, please file an issue with .": "聊天室升級通常只會影響聊天室的伺服器端處理方式。如果您在使用 Riot 客戶端時發生問題,請使用 回報問題。", "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.": "警告:升級聊天室不會自動將聊天室成員遷移到新版的聊天室。我們會在舊版聊天室中貼出到新聊天室的連結,聊天室成員必須點選此連結以加入新聊天室。", "Adds a custom widget by URL to the room": "透過 URL 新增自訂小工具到聊天室", "Please supply a https:// or http:// widget URL": "請提供 https:// 或 http:// 小工具 URL", "You cannot modify widgets in this room.": "您無法在此聊天室中修改小工具。", "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s 撤銷了對 %(targetDisplayName)s 加入此聊天室的邀請。", - "Enable desktop notifications for this device": "為此裝置啟用桌面通知", - "Enable audible notifications for this device": "為此裝置啟用音訊通知", "Upgrade this room to the recommended room version": "升級此聊天室到建議的聊天室版本", "This room is running room version , which this homeserver has marked as unstable.": "此聊天室正在執行聊天室版本 ,此家伺服器已標記為不穩定。", "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "升級此聊天室將會關閉聊天室目前的實體,並建立一個同名的升級版。", @@ -1504,8 +1401,6 @@ "A conference call could not be started because the integrations server is not available": "因為沒有整合的伺服器,所以無法啟動會議通話", "The server does not support the room version specified.": "伺服器不支援指定的聊天室版本。", "Name or Matrix ID": "名稱或 Matrix ID", - "Email, name or Matrix ID": "電子郵件、名稱或 Matrix ID", - "Please confirm that you'd like to go forward with upgrading this room from to .": "請確認您想繼續升級此聊天室,從 。", "Changes your avatar in this current room only": "僅在目前的聊天室中變更您的大頭貼", "Unbans user with given ID": "取消阻擋指定 ID 的使用者", "Sends the given message coloured as a rainbow": "將給定的訊息以彩虹顏色的方式傳送", @@ -1515,10 +1410,6 @@ "The user's homeserver does not support the version of the room.": "使用者的主伺服器不支援此聊天室版本。", "Show hidden events in timeline": "顯示時間軸中隱藏的活動", "When rooms are upgraded": "當聊天室升級時", - "This device is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "此裝置並未備份您的金鑰,但您有既有的備份,可以從那裡復原並繼續。", - "Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "在登出前連線此裝置以避免遺失任何可能僅在此裝置上存在的金鑰。", - "Connect this device to Key Backup": "將此裝置連線到金鑰備份", - "Backup has an invalid signature from this device": "從此裝置而來的備份有無效的簽章", "this room": "此聊天室", "View older messages in %(roomName)s.": "檢視 %(roomName)s 中較舊的訊息。", "Joining room …": "正在加入聊天室……", @@ -1614,19 +1505,15 @@ "Resend removal": "重新傳送移除", "Your homeserver doesn't seem to support this feature.": "您的家伺服器似乎並不支援此功能。", "Changes your avatar in all rooms": "在所有聊天室變更您的大頭貼", - "Clear all data on this device?": "清除此裝置上所有的資料?", "You're signed out": "您已登出", "Clear all data": "清除所有資料", "Removing…": "正在移除……", - "Clearing all data from this device is permanent. Encrypted messages will be lost unless their keys have been backed up.": "清除從此裝置而來的所有資料將會是永久的。已加密的訊息將會遺失,除非它們的金鑰已備份。", "Failed to re-authenticate due to a homeserver problem": "因為家伺服器的問題,所以重新驗證失敗", "Failed to re-authenticate": "重新驗證失敗", "Enter your password to sign in and regain access to your account.": "輸入您的密碼以登入並取回對您帳號的控制權。", "Forgotten your password?": "忘記您的密碼了?", "Clear personal data": "清除個人資料", - "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.": "警告:您的個人資料(包含加密金鑰)仍儲存在此裝置上。如果您已不想要使用此裝置,或是想要登入其他帳號的話,就將其清除吧。", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "請告訴我們發生了什麼錯誤,或更好的是,在 GitHub 上建立描述問題的議題。", - "Regain access to your account and recover encryption keys stored on this device. Without them, you won’t be able to read all of your secure messages on any device.": "取回對您的帳號的控制權,並復原儲存在此裝置上的加密金鑰。沒有它們,您就無法在任何裝置上讀取您所有的安全訊息。", "Sign in and regain access to your account.": "登入並取回對您帳號的控制權。", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "您無法登入到您的帳號。請聯絡您的家伺服器管理員以取得更多資訊。", "Identity Server": "身份識別伺服器", @@ -1637,7 +1524,6 @@ "Service": "服務", "Summary": "摘要", "This account has been deactivated.": "此帳號已停用。", - "Failed to start chat": "啟動聊天失敗", "Messages": "訊息", "Actions": "動作", "Displays list of commands with usages and descriptions": "顯示包含用法與描述的指令清單", @@ -1667,7 +1553,6 @@ "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "您目前並未使用身份識別伺服器。要探索及被您所知既有的聯絡人探索,請在下方新增一個。", "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "從您的身份識別伺服器斷開連線代表您不再能被其他使用者探索到,而且您也不能透過電子郵件或電話邀請其他人。", "Integration Manager": "整合管理員", - "To verify that this device can be trusted, please check that the key you see in User Settings on that device matches the key below:": "要驗證此裝置是否可受信任,請檢查您在裝置上的使用者設定裡看到的金鑰是否與下方的金鑰相同:", "Call failed due to misconfigured server": "因為伺服器設定錯誤,所以通話失敗", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "請詢問您家伺服器的管理員(%(homeserverDomain)s)以設定 TURN 伺服器讓通話可以正常運作。", "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.": "或是您也可以試著使用公開伺服器 turn.matrix.org,但可能不夠可靠,而且會跟該伺服器分享您的 IP 位置。您也可以在設定中管理這個。", @@ -1680,7 +1565,6 @@ "The identity server you have chosen does not have any terms of service.": "您所選擇的身份識別伺服器沒有任何服務條款。", "Terms of service not accepted or the identity server is invalid.": "不接受服務條款或身份識別伺服器無效。", "Enter a new identity server": "輸入新的身份識別伺服器", - "A device's public name is visible to people you communicate with": "與您通訊的所有人都可以看到裝置的公開名稱", "Remove %(email)s?": "移除 %(email)s?", "Remove %(phone)s?": "移除 %(phone)s?", "Accept to continue:": "接受 以繼續:", @@ -1782,7 +1666,6 @@ "Unread mentions.": "未讀提及。", "Show image": "顯示圖片", "Please create a new issue on GitHub so that we can investigate this bug.": "請在 GitHub 上建立新議題,這樣我們才能調查這個臭蟲。", - "Use the new, faster, composer for writing messages": "使用更新更快的 composer 來編寫訊息", "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.": "家伺服器設定中遺失驗證碼公開金鑰。請向您的家伺服器管理員回報。", "Your email address hasn't been verified yet": "您的電子郵件位置尚未被驗證", "Click the link in the email you received to verify and then click continue again.": "點擊您收到的電子郵件中的連結以驗證然後再次點擊繼續。", @@ -1872,16 +1755,11 @@ "Custom (%(level)s)": "自訂 (%(level)s)", "Trusted": "已信任", "Not trusted": "不信任", - "Hide verified Sign-In's": "隱藏已驗證的登入", - "%(count)s verified Sign-In's|other": "%(count)s 個已驗證的登入", - "%(count)s verified Sign-In's|one": "1 個已驗證的登入", "Direct message": "直接訊息", - "Unverify user": "未驗證的使用者", "%(role)s in %(roomName)s": "%(role)s 在 %(roomName)s", "Messages in this room are end-to-end encrypted.": "在此聊天室中的訊息為端到端加密。", "Security": "安全", "Verify": "驗證", - "Send verification requests in direct message, including a new verification UX in the member panel.": "在直接訊息中傳送驗證請求,包含成員面板中新的驗證使用者體驗。", "Any of the following data may be shared:": "可能會分享以下資料:", "Your display name": "您的顯示名稱", "Your avatar URL": "您的大頭貼 URL", @@ -1916,7 +1794,6 @@ "Manage integrations": "管理整合", "Verification Request": "驗證請求", " (1/%(totalCount)s)": " (1/%(totalCount)s)", - "Enable cross-signing to verify per-user instead of per-device (in development)": "啟用交叉簽章以驗證每個使者而非每個裝置(開發中)", "Match system theme": "符合系統佈景主題", "%(senderName)s placed a voice call.": "%(senderName)s 撥打了語音通話。", "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s 撥打了語音通話。(不被此瀏覽器支援)", @@ -1960,89 +1837,57 @@ "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s 將封鎖符合 %(oldGlob)s 的規則更新為 %(newGlob)s,因為 %(reason)s", "Send cross-signing keys to homeserver": "將交叉簽章的金鑰傳送到家伺服器", "Cross-signing public keys:": "交叉簽章的公開金鑰:", - "on device": "在裝置上", "not found": "找不到", "Cross-signing private keys:": "交叉簽章的私密金鑰:", "in secret storage": "在秘密儲存空間中", "Secret storage public key:": "秘密儲存空間公開金鑰:", "in account data": "在帳號資料中", - "Bootstrap Secure Secret Storage": "Bootstrap 安全秘密儲存空間", "Cross-signing": "交叉簽章", "Enter secret storage passphrase": "輸入秘密儲存空間密碼", "Unable to access secret storage. Please verify that you entered the correct passphrase.": "無法存取秘密儲存空間。請驗證您是否輸入了正確的密碼。", "Warning: You should only access secret storage from a trusted computer.": "警告:您應該僅從信任的電腦存取秘密儲存空間。", "Cross-signing and secret storage are enabled.": "已啟用交叉簽章與秘密儲存空間。", - "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this device.": "您的帳號在秘密儲存空間中有交叉簽章的身份,但尚未被此裝置信任。", "Cross-signing and secret storage are not yet set up.": "尚未設定交叉簽章與秘密儲存空間。", "Bootstrap cross-signing and secret storage": "啟動交叉簽章與秘密儲存空間", "not stored": "未儲存", "Backup has a valid signature from this user": "備份有從此使用者而來的有效簽章", "Backup has a invalid signature from this user": "備份有從此使用者而來的無效簽章", "Backup has a signature from unknown user with ID %(deviceId)s": "備份有從未知的使用者而來,ID 為 %(deviceId)s 的簽章", - "Backup has a signature from unknown device with ID %(deviceId)s": "備份有從未知的裝置而來,ID 為 %(deviceId)s 的簽章", - "Backup key stored in secret storage, but this feature is not enabled on this device. Please enable cross-signing in Labs to modify key backup state.": "備份金鑰儲存於秘密儲存空間中,但此功能未在此裝置上啟用。請在實驗室中啟用交叉簽章以修改金鑰備份狀態。", "Backup key stored: ": "備份金鑰已儲存: ", - "Start using Key Backup with Secure Secret Storage": "開始將金鑰備份與安全秘密儲存空間一起使用", "Hide verified sessions": "隱藏已驗證的工作階段", "%(count)s verified sessions|other": "%(count)s 個已驗證的工作階段", "%(count)s verified sessions|one": "1 個已驗證的工作階段", - "Access your secure message history and your cross-signing identity for verifying other devices by entering your passphrase.": "透過輸入您的密碼來存取您的安全訊息歷史與您的交叉簽章身份並驗證其他裝置。", "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.": "如果您忘記您的密碼,您可以使用您的復原金鑰設定新的復原選項。", "Enter secret storage recovery key": "輸入秘密儲存空間復原金鑰", "Unable to access secret storage. Please verify that you entered the correct recovery key.": "無法存取秘密儲存空間。請驗證您是否輸入了正確的復原金鑰。", - "Access your secure message history and your cross-signing identity for verifying other devices by entering your recovery key.": "透過輸入您的復原金鑰來存取您的安全訊息歷史與您的交叉簽章身份並驗證其他裝置。", "If you've forgotten your recovery key you can .": "如果您忘記您的復原金鑰,您可以。", "Warning: You should only set up key backup from a trusted computer.": "警告:您應該只從信任的電腦設定金鑰備份。", "If you've forgotten your recovery key you can ": "如果您忘記您的復原金鑰,您可以", - "Warning: You should only set up secret storage from a trusted computer.": "警告:您應該只從信任的電腦設定秘密儲存空間。", - "We'll use secret storage to optionally store an encrypted copy of your cross-signing identity for verifying other devices and message keys on our server. Protect your access to encrypted messages with a passphrase to keep it secure.": "我們將會使用秘密儲存空間來選擇性儲存您用來驗證其他裝置與訊息金鑰的交叉簽章加密副本在我們的伺服器上。使用密碼來保護您對加密訊息的存取權以使其更安全。", "Set up with a recovery key": "設定復原金鑰", "As a safety net, you can use it to restore your access to encrypted messages if you forget your passphrase.": "作為安全網,如果您忘記您的密碼的話,您可以使用它來恢復您對加密訊息的存取。", "As a safety net, you can use it to restore your access to encrypted messages.": "作為安全網,您可以使用它來恢復您對加密訊息的存取。", "Keep your recovery key somewhere very secure, like a password manager (or a safe).": "將您的復原金鑰保留在某個非常安全的地方,如密碼管理員(或保險櫃)中。", "Your recovery key has been copied to your clipboard, paste it to:": "您的復原金鑰已被複製到您的剪貼簿,請將其貼到:", "Your recovery key is in your Downloads folder.": "您的復原金鑰在您的下載資料夾中。", - "Your access to encrypted messages is now protected.": "您對加密訊息的存取權已被保護。", - "Without setting up secret storage, you won't be able to restore your access to encrypted messages or your cross-signing identity for verifying other devices if you log out or use another device.": "沒有設定秘密儲存空間,您將無法恢復您的加密訊息的存取權,或是您在登出或使用其他裝置時,用以驗證其他裝置的交叉簽章身份。", - "Set up secret storage": "設定秘密儲存空間", - "Secure your encrypted messages with a passphrase": "使用密碼保護您的加密訊息", "Storing secrets...": "正在儲存秘密……", "Unable to set up secret storage": "無法設定秘密儲存空間", "Close preview": "關閉預覽", - "This user has not verified all of their devices.": "這個使用者尚未驗證所有裝置。", - "You have not verified this user. This user has verified all of their devices.": "您尚未驗證此使用者。此使用者已驗證所有裝置。", - "You have verified this user. This user has verified all of their devices.": "您已驗證此使用者。此使用者已驗證所有裝置。", - "Some users in this encrypted room are not verified by you or they have not verified their own devices.": "在此已加密的聊天室中的某些使用者尚未被您驗證,或是他們尚未驗證他們的裝置。", - "All users in this encrypted room are verified by you and they have verified their own devices.": "在此已加密的聊天室中的所有使用者已被您驗證,他們也已驗證所有裝置。", "Language Dropdown": "語言下拉式選單", "Country Dropdown": "國家下拉式選單", "The message you are trying to send is too large.": "您正試圖傳送的訊息太大了。", - "Secret Storage will be set up using your existing key backup details.Your secret storage passphrase and recovery key will be the same as they were for your key backup": "秘密儲存空間將使用你既有的金鑰備份資訊來設定。您的秘密儲存空間密碼與復原金鑰會與您的金鑰備份相同", - "Migrate from Key Backup": "從金鑰備份導入", "Help": "說明", - "New DM invite dialog (under development)": "新的直接訊息邀請對話框(開發中)", "Show more": "顯示更多", "Recent Conversations": "最近的對話", "Direct Messages": "直接訊息", - "If you can't find someone, ask them for their username, or share your username (%(userId)s) or profile link.": "如果您找不到某人,請向他們詢問他們的使用者名稱,或是分享您的使用者名稱 (%(userId)s) 或簡介連結。", "Go": "到", "Show info about bridges in room settings": "顯示關於聊天室設定中橋接相關的資訊", - "This bridge was provisioned by ": "此橋接由 配置", "This bridge is managed by .": "此橋接由 管理。", - "Bridged into , on ": "橋接於 ,在 上", - "Connected to on ": "連線到 ", - "Connected via %(protocolName)s": "透過 %(protocolName)s 連線", - "Bridge Info": "橋接資訊", - "Below is a list of bridges connected to this room.": "以下是連線到此聊天室的橋接列表。", "Suggestions": "建議", "Failed to find the following users": "找不到以下使用者", "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "以下使用者可能不存在或無效,且無法被邀請:%(csvNames)s", "Show a presence dot next to DMs in the room list": "在聊天室清單中的直接訊息旁顯示上線狀態點", "Lock": "鎖定", - "Key Backup is enabled on your account but has not been set up from this session. To set up secret storage, restore your key backup.": "您的帳號已啟用金鑰備份,但並在此工作階段中設定。要設定秘密儲存空間,請還原金鑰備份。", "Restore": "還原", - "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup": "秘密儲存空間將會使用您既有的金鑰備份詳細資訊設定。您的秘密儲存空間通關密語與復原金鑰會與您的金鑰備份相同", - "Restore your Key Backup": "復原您的金鑰備份", "a few seconds ago": "數秒前", "about a minute ago": "大約一分鐘前", "%(num)s minutes ago": "%(num)s 分鐘前", @@ -2065,11 +1910,7 @@ "Session verified": "工作階段已驗證", "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "您的新工作階段已驗證。其對您的已加密訊息有存取權,其他使用者也將會看到其受信任。", "Done": "完成", - "Without completing security on this device, it won’t have access to encrypted messages.": "此裝置上沒有完全安全性,其對已加密訊息沒有存取權。", "Go Back": "返回", - "Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup.": "秘密儲存空間將會使用您既有的金鑰備份詳細資訊設定。您的秘密儲存空間通關密語與復原金鑰將會與您的金鑰備份相同。", - "New Session": "新工作階段", - "New invite dialog": "新邀請對話框", "Other users may not trust it": "其他使用者可能不會信任它", "Later": "稍後", "Something went wrong trying to invite the users.": "在嘗試邀請使用者時發生錯誤。", @@ -2078,9 +1919,7 @@ "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.": "如果您找不到某人,請詢問他們的使用者名稱(範例:@user:server.com)或分享此聊天室。", "Verify User": "驗證使用者", "For extra security, verify this user by checking a one-time code on both of your devices.": "為了提高安全性,請透過檢查您兩個裝置上的一次性代碼來驗證此使用者。", - "For maximum security, do this in person.": "為了取得最強的安全性,請親自進行。", "Start Verification": "開始驗證", - "Encrypted by a deleted device": "被已刪除的裝置加密", "Unknown Command": "未知的指令", "Unrecognised command: %(commandText)s": "無法識別的指令:%(commandText)s", "You can use /help to list available commands. Did you mean to send this as a message?": "您可以使用 /help 來列出可用的指令。您是要傳送此訊息嗎?", @@ -2091,7 +1930,6 @@ "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s 對此聊天室移除了 %(countRemoved)s 個並新增了 %(countAdded)s 地址到此聊天室", "%(senderName)s turned on end-to-end encryption.": "%(senderName)s 開啟了端到端加密。", "%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s 開啟了端到端加密(無法識別的演算法 %(algorithm)s)。", - "Someone is using an unknown device": "某人正在使用未知的裝置", "This room is end-to-end encrypted": "此聊天室已端到端加密", "Everyone in this room is verified": "此聊天室中每個人都已驗證", "Invite only": "僅邀請", @@ -2101,12 +1939,9 @@ "If you can't find someone, ask them for their username, share your username (%(userId)s) or profile link.": "如果您找不到某人,請詢問他們以取得他們的使用者名稱,分享您的使用者名稱 (%(userId)s) 或簡介連結。", "Enter your account password to confirm the upgrade:": "輸入您的帳號密碼以確認升級:", "You'll need to authenticate with the server to confirm the upgrade.": "您必須透過伺服器驗證以確認升級。", - "Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "升級此裝置以允許其驗證其他裝置,並允許存取加密訊息以及將它們標記為受其他使用者信任。", - "Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "在此裝置上設定加密以允許其驗證其他裝置,並允許存取加密訊息以及將它們標記為受其他使用者信任。", "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "使用通關密語保護您的加密金鑰。為了取得最強的安全性,此通關密語應與您的帳號密碼不同:", "Enter a passphrase": "輸入通關密語", "Enter your passphrase a second time to confirm it.": "輸入您的通關密語兩次以確認。", - "This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "此裝置現在可以驗證其他裝置,並允許存取加密訊息以及將它們標記為受其他使用者信任。", "Verify other users in their profile.": "透過他們的簡介驗證其他使用者。", "Upgrade your encryption": "升級您的加密", "Set up encryption": "設定加密", From 6f0d88a1262e16771074100bd7960fe961c36e67 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 29 Jan 2020 16:54:08 +0000 Subject: [PATCH 377/906] Relax secret storage account data check If the homeserver is confused about account data or otherwise explodes here, we don't want to block login, so just warn in this case. --- src/components/structures/MatrixChat.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 1b4d0e9609..233ec9e7bb 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1864,7 +1864,9 @@ export default createReactClass({ try { masterKeyInStorage = !!await cli.getAccountDataFromServer("m.cross_signing.master"); } catch (e) { - if (e.errcode !== "M_NOT_FOUND") throw e; + if (e.errcode !== "M_NOT_FOUND") { + console.warn("Secret storage account data check failed", e); + } } if (masterKeyInStorage) { From e403169e135a207f921ad48b5b36d20aa04f9ea2 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 29 Jan 2020 16:56:12 +0000 Subject: [PATCH 378/906] Fix various races that prevented the right panel being in the right state for verifications Fixes https://github.com/vector-im/riot-web/issues/11989 --- src/components/structures/RightPanel.js | 22 ++++++++++++++++++- .../views/right_panel/EncryptionPanel.js | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/components/structures/RightPanel.js b/src/components/structures/RightPanel.js index be10ead7ca..8dd44e37d4 100644 --- a/src/components/structures/RightPanel.js +++ b/src/components/structures/RightPanel.js @@ -48,6 +48,7 @@ export default class RightPanel extends React.Component { phase: this._getPhaseFromProps(), isUserPrivilegedInGroup: null, member: this._getUserForPanel(), + verificationRequest: RightPanelStore.getSharedInstance().roomPanelPhaseParams.verificationRequest, }; this.onAction = this.onAction.bind(this); this.onRoomStateMember = this.onRoomStateMember.bind(this); @@ -68,15 +69,34 @@ export default class RightPanel extends React.Component { return this.props.user || lastParams['member']; } + // gets the current phase from the props and also maybe the store _getPhaseFromProps() { const rps = RightPanelStore.getSharedInstance(); + const userForPanel = this._getUserForPanel(); if (this.props.groupId) { if (!RIGHT_PANEL_PHASES_NO_ARGS.includes(rps.groupPanelPhase)) { dis.dispatch({action: "set_right_panel_phase", phase: RIGHT_PANEL_PHASES.GroupMemberList}); return RIGHT_PANEL_PHASES.GroupMemberList; } return rps.groupPanelPhase; - } else if (this._getUserForPanel()) { + } else if (userForPanel) { + // XXX FIXME AAAAAARGH: What is going on with this class!? It takes some of its state + // from its props and some from a store, expect if the contents of the store changes + // while it's mounted in which case it replaces all of its state with that of the store, + // expect it uses a dispatch instead of a normal store listener? + // Unfortunately rewriting this would almost certainly break showing the right panel + // in some of the many cases, and I don't have time to re-architect it and test all + // the flows now, so adding yet another special case so if the store thinks there is + // a verification going on for the member we're displaying, we show that, otherwise + // we race if a verification is started while the panel isn't displayed because we're + // not mounted in time to get the dispatch. + // Until then, let this code serve as a warning from history. + if ( + userForPanel.userId === rps.roomPanelPhaseParams.member.userId && + rps.roomPanelPhaseParams.verificationRequest + ) { + return rps.roomPanelPhase; + } return RIGHT_PANEL_PHASES.RoomMemberInfo; } else { if (!RIGHT_PANEL_PHASES_NO_ARGS.includes(rps.roomPanelPhase)) { diff --git a/src/components/views/right_panel/EncryptionPanel.js b/src/components/views/right_panel/EncryptionPanel.js index 6819db8e55..f25a55fa8a 100644 --- a/src/components/views/right_panel/EncryptionPanel.js +++ b/src/components/views/right_panel/EncryptionPanel.js @@ -36,7 +36,7 @@ const EncryptionPanel = ({verificationRequest, member, onClose}) => { setRequest(verificationRequest); }, [verificationRequest]); - const [phase, setPhase] = useState(undefined); + const [phase, setPhase] = useState(request.phase); const changeHandler = useCallback(() => { // handle transitions -> cancelled for mismatches which fire a modal instead of showing a card if (request && request.cancelled && MISMATCHES.includes(request.cancellationCode)) { From ad458722dcda6444edca663efba844e70c76e0c6 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Wed, 29 Jan 2020 17:58:23 +0100 Subject: [PATCH 379/906] evaluate on mount whether we need to call .verify() as the request might be in phase started already. --- src/components/views/right_panel/VerificationPanel.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index 6f580991f9..3527747a66 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -51,7 +51,7 @@ export default class VerificationPanel extends React.PureComponent { constructor(props) { super(props); this.state = {}; - this._hasVerifier = !!props.request.verifier; + this._hasVerifier = false; } renderQRPhase(pending) { @@ -234,6 +234,7 @@ export default class VerificationPanel extends React.PureComponent { componentDidMount() { this.props.request.on("change", this._onRequestChange); + this._onRequestChange(); } componentWillUnmount() { From de6ef9ec90536ac6e042e17502c3e3e174be85a1 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 29 Jan 2020 17:51:51 +0000 Subject: [PATCH 380/906] words Co-Authored-By: J. Ryan Stinnett --- src/components/structures/RightPanel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/RightPanel.js b/src/components/structures/RightPanel.js index 8dd44e37d4..bf4e99ee51 100644 --- a/src/components/structures/RightPanel.js +++ b/src/components/structures/RightPanel.js @@ -81,7 +81,7 @@ export default class RightPanel extends React.Component { return rps.groupPanelPhase; } else if (userForPanel) { // XXX FIXME AAAAAARGH: What is going on with this class!? It takes some of its state - // from its props and some from a store, expect if the contents of the store changes + // from its props and some from a store, except if the contents of the store changes // while it's mounted in which case it replaces all of its state with that of the store, // expect it uses a dispatch instead of a normal store listener? // Unfortunately rewriting this would almost certainly break showing the right panel From d63bb240aa45eaef28396f609eef7cb05dc1f98e Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 29 Jan 2020 17:52:12 +0000 Subject: [PATCH 381/906] those words again Co-Authored-By: J. Ryan Stinnett --- src/components/structures/RightPanel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/RightPanel.js b/src/components/structures/RightPanel.js index bf4e99ee51..45722caa98 100644 --- a/src/components/structures/RightPanel.js +++ b/src/components/structures/RightPanel.js @@ -83,7 +83,7 @@ export default class RightPanel extends React.Component { // XXX FIXME AAAAAARGH: What is going on with this class!? It takes some of its state // from its props and some from a store, except if the contents of the store changes // while it's mounted in which case it replaces all of its state with that of the store, - // expect it uses a dispatch instead of a normal store listener? + // except it uses a dispatch instead of a normal store listener? // Unfortunately rewriting this would almost certainly break showing the right panel // in some of the many cases, and I don't have time to re-architect it and test all // the flows now, so adding yet another special case so if the store thinks there is From 3ff3a3cebdff40e4e9890664c7a65aa5a427ec9a Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 29 Jan 2020 19:53:36 +0000 Subject: [PATCH 382/906] Fix delete button for one session --- src/i18n/strings/en_EN.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index e3738b1175..ea986e6324 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -561,6 +561,7 @@ "Unable to load session list": "Unable to load session list", "Authentication": "Authentication", "Delete %(count)s sessions|other": "Delete %(count)s sessions", + "Delete %(count)s sessions|one": "Delete %(count)s session", "ID": "ID", "Public Name": "Public Name", "Last seen": "Last seen", From d854afdfd436653b20ebc658ad07de75c3c0c668 Mon Sep 17 00:00:00 2001 From: catborise Date: Wed, 29 Jan 2020 18:27:40 +0000 Subject: [PATCH 383/906] Translated using Weblate (Turkish) Currently translated at 70.4% (1475 of 2095 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/tr/ --- src/i18n/strings/tr.json | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 1e4650fc32..a552296ac8 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -540,7 +540,7 @@ "There are advanced notifications which are not shown here": "Burada gösterilmeyen gelişmiş bildirimler var", "The platform you're on": "Bulunduğun platform", "The version of Riot.im": "Riot.im'in sürümü", - "Your language of choice": "", + "Your language of choice": "Dil seçeneği", "Which officially provided instance you are using, if any": "Hangi resmi destekli örneği(eğer varsa) kullanmaktasınız", "Add Email Address": "E-posta Adresi Ekle", "Add Phone Number": "Telefon Numarası Ekle", @@ -1467,5 +1467,14 @@ "Internal room ID:": "Dahili oda ID:", "An error occurred changing the user's power level. Ensure you have sufficient permissions and try again.": "Kullanıcının güç düzeyini değiştirirken bir hata oluştu. Yeterli izinlere sahip olduğunuza emin olun ve yeniden deneyin.", "Select the roles required to change various parts of the room": "Odanın çeşitli bölümlerini değişmek için gerekli rolleri seçiniz", - "Click the link in the email you received to verify and then click continue again.": "Aldığınız e-postaki bağlantıyı tıklayarak doğrulayın ve sonra tekrar tıklayarak devam edin." + "Click the link in the email you received to verify and then click continue again.": "Aldığınız e-postaki bağlantıyı tıklayarak doğrulayın ve sonra tekrar tıklayarak devam edin.", + "Verify this session": "Bu oturumu doğrula", + "Encryption upgrade available": "Şifreleme güncellemesi var", + "Set up encryption": "Şifrelemeyi ayarla", + "Unverified session": "Doğrulanmamış oturum", + "You are no longer ignoring %(userId)s": "%(userId)s artık yoksayılmıyor", + "Verifies a user, session, and pubkey tuple": "Bir kullanıcı, oturum ve açık anahtar çiftini doğrular", + "Unknown (user, session) pair:": "Bilinmeyen (kullanıcı, oturum) çifti:", + "Session already verified!": "Oturum zaten doğrulanmış!", + "WARNING: Session already verified, but keys do NOT MATCH!": "UYARI: Oturum zaten doğrulanmış, ama anahtarlar EŞLEŞMİYOR!" } From d362cc0f41b9713591a7001f4c6b7824c858a101 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 29 Jan 2020 19:55:27 +0000 Subject: [PATCH 384/906] Fix room device level send setting --- src/settings/Settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 83975dd8e9..0ab30e02e1 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -349,7 +349,7 @@ export const SETTINGS = { supportedLevelsAreOrdered: true, displayName: { "default": _td('Never send encrypted messages to unverified sessions from this session'), - "room-session": _td('Never send encrypted messages to unverified sessions in this room from this session'), + "room-device": _td('Never send encrypted messages to unverified sessions in this room from this session'), }, default: false, }, From 7a5bf8f1022562530fd0c1754728404f645f0ca3 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 29 Jan 2020 21:55:27 +0000 Subject: [PATCH 385/906] Update user info for device and trust changes This ensure the user info panel updates automatically for device and trust changes. Fixes https://github.com/vector-im/riot-web/issues/12134` --- src/DeviceListener.js | 4 +-- src/components/views/right_panel/UserInfo.js | 30 +++++++++++++------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/DeviceListener.js b/src/DeviceListener.js index 4bc6ce2097..4e7bc8470d 100644 --- a/src/DeviceListener.js +++ b/src/DeviceListener.js @@ -77,8 +77,8 @@ export default class DeviceListener { this._recheck(); } - _onDeviceVerificationChanged = (users) => { - if (!users.includes(MatrixClientPeg.get().getUserId())) return; + _onDeviceVerificationChanged = (userId) => { + if (userId !== MatrixClientPeg.get().getUserId()) return; this._recheck(); } diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index 5a5d9a577c..154d564f05 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -1092,22 +1092,32 @@ export const useDevices = (userId) => { // Listen to changes useEffect(() => { let cancel = false; - const onDeviceVerificationChanged = (_userId, device) => { - if (_userId === userId) { - // no need to re-download the whole thing; just update our copy of the list. - - // Promise.resolve to handle transition from static result to promise; can be removed in future - Promise.resolve(cli.getStoredDevicesForUser(userId)).then((devices) => { - if (cancel) return; - setDevices(devices); - }); - } + const updateDevices = async () => { + const newDevices = await cli.getStoredDevicesForUser(userId); + if (cancel) return; + setDevices(newDevices); }; + const onDevicesUpdated = (users) => { + if (!users.includes(userId)) return; + updateDevices(); + }; + const onDeviceVerificationChanged = (_userId, device) => { + if (_userId !== userId) return; + updateDevices(); + }; + const onUserTrustStatusChanged = (_userId, trustStatus) => { + if (_userId !== userId) return; + updateDevices(); + }; + cli.on("crypto.devicesUpdated", onDevicesUpdated); cli.on("deviceVerificationChanged", onDeviceVerificationChanged); + cli.on("userTrustStatusChanged", onUserTrustStatusChanged); // Handle being unmounted return () => { cancel = true; + cli.removeListener("crypto.devicesUpdated", onDevicesUpdated); cli.removeListener("deviceVerificationChanged", onDeviceVerificationChanged); + cli.removeListener("userTrustStatusChanged", onUserTrustStatusChanged); }; }, [cli, userId]); From eaa48665d2af50b4e09c9f81548e3c1d25017c9b Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 29 Jan 2020 21:59:30 +0000 Subject: [PATCH 386/906] Guard request input --- src/components/views/right_panel/EncryptionPanel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/right_panel/EncryptionPanel.js b/src/components/views/right_panel/EncryptionPanel.js index f25a55fa8a..2b3196f4c1 100644 --- a/src/components/views/right_panel/EncryptionPanel.js +++ b/src/components/views/right_panel/EncryptionPanel.js @@ -36,7 +36,7 @@ const EncryptionPanel = ({verificationRequest, member, onClose}) => { setRequest(verificationRequest); }, [verificationRequest]); - const [phase, setPhase] = useState(request.phase); + const [phase, setPhase] = useState(request && request.phase); const changeHandler = useCallback(() => { // handle transitions -> cancelled for mismatches which fire a modal instead of showing a card if (request && request.cancelled && MISMATCHES.includes(request.cancellationCode)) { From a180dddc669d9781bdd567c9c88d30b429ec7cdc Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 29 Jan 2020 22:31:19 +0000 Subject: [PATCH 387/906] Pass an ID to the as needed and fix div inside p nesting Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../dialogs/secretstorage/_CreateSecretStorageDialog.scss | 4 ++++ .../dialogs/secretstorage/CreateSecretStorageDialog.js | 8 +++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/res/css/views/dialogs/secretstorage/_CreateSecretStorageDialog.scss b/res/css/views/dialogs/secretstorage/_CreateSecretStorageDialog.scss index bbbf3fc1d3..a9ebd54b31 100644 --- a/res/css/views/dialogs/secretstorage/_CreateSecretStorageDialog.scss +++ b/res/css/views/dialogs/secretstorage/_CreateSecretStorageDialog.scss @@ -37,6 +37,10 @@ limitations under the License. flex: 0 0 auto; margin-left: 30px; } + + details .mx_AccessibleButton { + margin: 1em 0; // emulate paragraph spacing because we can't put this button in a paragraph due to HTML rules + } } .mx_CreateSecretStorageDialog .mx_Dialog_title { diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index c3b74381ff..64aff467a7 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -480,7 +480,9 @@ export default class CreateSecretStorageDialog extends React.PureComponent { )}

    - {_t("Advanced")} -

    + {_t("Set up with a recovery key")} -

    +
    ; } From 33ec73095e3a35b3399f9414753faee8d97f10ea Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 29 Jan 2020 22:44:49 +0000 Subject: [PATCH 388/906] Apply the Olympic effect to SAS Emoji Verification Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../verification/_VerificationShowSas.scss | 27 ++++++++++++++++--- .../views/verification/VerificationShowSas.js | 6 +++-- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/res/css/views/verification/_VerificationShowSas.scss b/res/css/views/verification/_VerificationShowSas.scss index a0da7e2539..72213072f9 100644 --- a/res/css/views/verification/_VerificationShowSas.scss +++ b/res/css/views/verification/_VerificationShowSas.scss @@ -28,21 +28,42 @@ limitations under the License. .mx_VerificationShowSas_emojiSas { text-align: center; + display: flex; + flex-wrap: wrap; + justify-content: center; + margin: 25px 0; } .mx_VerificationShowSas_emojiSas_block { display: inline-block; - margin-left: 15px; - margin-right: 15px; text-align: center; - margin-bottom: 20px; + margin-bottom: 30px; + position: relative; + // allow the blocks to grow to space themselves evenly up to a limit of 100px + flex-grow: 1; + max-width: 100px; } .mx_VerificationShowSas_emojiSas_emoji { font-size: 48px; } +.mx_UserInfo .mx_VerificationShowSas_emojiSas_emoji { + font-size: 32px; // in UserInfo use a smaller font-size to fit in a smaller space + width: 43px; + margin: 0 auto; +} + .mx_VerificationShowSas_emojiSas_label { text-align: center; font-weight: bold; + // allow the text to overflow the parent by 15px on each side + // this is to keep the width of the parent consistent for spacing centrally via flexbox + position: absolute; + left: -15px; + right: -15px; +} + +.mx_VerificationShowSas_emojiSas_break { + flex-basis: 100%; } diff --git a/src/components/views/verification/VerificationShowSas.js b/src/components/views/verification/VerificationShowSas.js index 40d3b96beb..38bc1bb40a 100644 --- a/src/components/views/verification/VerificationShowSas.js +++ b/src/components/views/verification/VerificationShowSas.js @@ -62,7 +62,9 @@ export default class VerificationShowSas extends React.Component {
    , ); sasDisplay =
    - {emojiBlocks} + {emojiBlocks.slice(0, 4)} +
    + {emojiBlocks.slice(4)}
    ; sasCaption = _t( "Verify this user by confirming the following emoji appear on their screen.", @@ -105,8 +107,8 @@ export default class VerificationShowSas extends React.Component { return

    {sasCaption}

    -

    {_t("To be secure, do this in person or use a trusted way to communicate.")}

    {sasDisplay} +

    {_t("To be secure, do this in person or use a trusted way to communicate.")}

    {confirm}
    ; } From d17a2ff80c6f89674323796bca82f3eacfcc80e3 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 29 Jan 2020 22:54:45 +0000 Subject: [PATCH 389/906] clean up unused CSS rules Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/verification/_VerificationShowSas.scss | 4 ---- 1 file changed, 4 deletions(-) diff --git a/res/css/views/verification/_VerificationShowSas.scss b/res/css/views/verification/_VerificationShowSas.scss index 72213072f9..32401bc446 100644 --- a/res/css/views/verification/_VerificationShowSas.scss +++ b/res/css/views/verification/_VerificationShowSas.scss @@ -36,7 +36,6 @@ limitations under the License. .mx_VerificationShowSas_emojiSas_block { display: inline-block; - text-align: center; margin-bottom: 30px; position: relative; // allow the blocks to grow to space themselves evenly up to a limit of 100px @@ -50,12 +49,9 @@ limitations under the License. .mx_UserInfo .mx_VerificationShowSas_emojiSas_emoji { font-size: 32px; // in UserInfo use a smaller font-size to fit in a smaller space - width: 43px; - margin: 0 auto; } .mx_VerificationShowSas_emojiSas_label { - text-align: center; font-weight: bold; // allow the text to overflow the parent by 15px on each side // this is to keep the width of the parent consistent for spacing centrally via flexbox From afecaa16622f4d2e42ee1842b19519df0cd154e9 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 29 Jan 2020 22:54:56 +0000 Subject: [PATCH 390/906] fix left margins in UserInfo Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/views/right_panel/_UserInfo.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/views/right_panel/_UserInfo.scss b/res/css/views/right_panel/_UserInfo.scss index 5e5b66f58a..81e4c396e7 100644 --- a/res/css/views/right_panel/_UserInfo.scss +++ b/res/css/views/right_panel/_UserInfo.scss @@ -211,7 +211,7 @@ limitations under the License. padding-bottom: 16px; } - .mx_UserInfo_scrollContainer:not(.mx_UserInfo_separator) { + .mx_UserInfo_container:not(.mx_UserInfo_separator) { padding-top: 16px; padding-bottom: 0; From 52ed55d887bacbbaf7f3117ce7ea4c2fc4cac18a Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 30 Jan 2020 00:23:19 +0000 Subject: [PATCH 391/906] Update placeholder when it changes, not sure how this ever worked Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/rooms/BasicMessageComposer.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/components/views/rooms/BasicMessageComposer.js b/src/components/views/rooms/BasicMessageComposer.js index d2b6f8cbc8..a2a01f4444 100644 --- a/src/components/views/rooms/BasicMessageComposer.js +++ b/src/components/views/rooms/BasicMessageComposer.js @@ -94,6 +94,17 @@ export default class BasicMessageEditor extends React.Component { this._emoticonSettingHandle = null; } + componentDidUpdate(prevProps) { + if (this.props.placeholder !== prevProps.placeholder && this.props.placeholder) { + const {isEmpty} = this.props.model; + if (isEmpty) { + this._showPlaceholder(); + } else { + this._hidePlaceholder(); + } + } + } + _replaceEmoticon = (caretPosition, inputType, diff) => { const {model} = this.props; const range = model.startRange(caretPosition); From 7038481394c7c5518f2b622cdb2640cf525b490e Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Thu, 30 Jan 2020 04:05:44 +0000 Subject: [PATCH 392/906] Translated using Weblate (Chinese (Traditional)) Currently translated at 94.8% (1988 of 2096 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 42 ++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 35f4a14414..c48b895fda 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -1946,5 +1946,45 @@ "Upgrade your encryption": "升級您的加密", "Set up encryption": "設定加密", "Encryption upgraded": "加密已升級", - "Encryption setup complete": "加密設定完成" + "Encryption setup complete": "加密設定完成", + "There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "聊天室中有未知的工作階段:如果您不驗證它們就繼續,就有可能讓人監聽的您的通話。", + "Verify this session": "驗證此工作階段", + "Encryption upgrade available": "已提供加密升級", + "Unverified session": "未驗證的工作階段", + "Verifies a user, session, and pubkey tuple": "驗證使用者、工作階段與公開金鑰組合", + "Unknown (user, session) pair:": "未知(使用者、工作階段)配對:", + "Session already verified!": "工作階段已驗證!", + "WARNING: Session already verified, but keys do NOT MATCH!": "警告:工作階段已驗證、但金鑰不符合!", + "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!": "警告:金鑰驗證失敗!%(userId)s 與工作階段 %(deviceId)s 簽署的金鑰是「%(fprint)s」,並不符合提供的金鑰「%(fingerprint)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 收到的簽署金鑰。工作階段標記為已驗證。", + "Enable cross-signing to verify per-user instead of per-session (in development)": "啟用交叉簽章以驗證使用者而非工作階段(開發中)", + "Never send encrypted messages to unverified sessions from this session": "不要從此工作階段傳送已加密的訊息給未驗證的工作階段", + "Never send encrypted messages to unverified sessions in this room from this session": "不要從此工作階段傳送已加密的訊息給此聊天室中未驗證的工作階段", + "Enable message search in encrypted rooms": "在已加密的聊天室中啟用訊息搜尋", + "Waiting for %(displayName)s to verify…": "正在等待 %(displayName)s 驗證……", + "They match": "它們符合", + "They don't match": "它們不符合", + "To be secure, do this in person or use a trusted way to communicate.": "為了安全,請親自進行或使用可信的通訊方式。", + "Verify your other sessions easier": "更容易地驗證您其他的工作階段", + "Review": "評論", + "This bridge was provisioned by .": "此橋接是由 設定。", + "Workspace: %(networkName)s": "工作空間:", + "Channel: %(channelName)s": "頻道:", + "Show less": "顯示較少", + "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.": "變更密碼將會重設所有工作階段上的所有端到端加密金鑰,讓已加密的聊天歷史無法讀取,除非您先匯出您的聊天室金鑰並在稍後重新匯入。未來會有所改善。", + "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "您的帳號在秘密儲存空間中有交叉簽章的身份,但尚未被此工作階段信任。", + "in memory": "在記憶體中", + "Your homeserver does not support session management.": "您的家伺服器不支援工作階段管理。", + "Unable to load session list": "無法載入工作階段清單", + "Delete %(count)s sessions|other": "刪除 %(count)s 個工作階段", + "Delete %(count)s sessions|one": "刪除 %(count)s 個工作階段", + "Securely cache encrypted messages locally for them to appear in search results, using ": "將加密的訊息安全地在本機快取以出現在顯示結果中,使用 ", + " to store messages from ": " 以儲存訊息從 ", + "rooms.": "聊天室。", + "Manage": "管理", + "Securely cache encrypted messages locally for them to appear in search results.": "將加密的訊息安全地在本機快取以出現在顯示結果中。", + "Enable": "啟用", + "Riot is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom Riot Desktop with search components added.": "Riot 缺少某些在本機快取已加密訊習所需的元件。如果您想要實驗此功能,請加入搜尋元件並自行建構 Riot 桌面版。", + "Riot can't securely cache encrypted messages locally while running in a web browser. Use Riot Desktop for encrypted messages to appear in search results.": "Riot 無法在網路瀏覽器中安全地在本機快取已加密的訊息。使用 Riot 桌面版來讓已加密的訊息出現在搜尋結果中。", + "This session is backing up your keys. ": "此工作階段正在備份您的金鑰。 " } From f2dda28ad3f03eb70c4268c3eaf1ad0377b3288d Mon Sep 17 00:00:00 2001 From: random Date: Thu, 30 Jan 2020 09:07:04 +0000 Subject: [PATCH 393/906] Translated using Weblate (Italian) Currently translated at 95.5% (2002 of 2096 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 5a3f122ad2..bf20a4f7dc 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -1963,5 +1963,42 @@ "Manage": "Gestisci", "Securely cache encrypted messages locally for them to appear in search results.": "Tieni in cache localmente i messaggi cifrati in modo sicuro affinché appaiano nei risultati di ricerca.", "Enable": "Attiva", - "Riot is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom Riot Desktop with search components added.": "A Riot mancano alcuni componenti richiesti per tenere in cache i messaggi cifrati in modo sicuro. Se vuoi sperimentare questa funzionalità, compila un Riot Desktop personale con i componenti di ricerca aggiunti." + "Riot is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom Riot Desktop with search components added.": "A Riot mancano alcuni componenti richiesti per tenere in cache i messaggi cifrati in modo sicuro. Se vuoi sperimentare questa funzionalità, compila un Riot Desktop personale con i componenti di ricerca aggiunti.", + "There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Ci sono sessioni sconosciute in questa stanza: se procedi senza verificarle, sarà possibile per qualcuno origliare la tua chiamata.", + "Unverified session": "Sessione non verificata", + "Verifies a user, session, and pubkey tuple": "Verifica un utente, una sessione e una tupla pubblica", + "Unknown (user, session) pair:": "Coppia (utente, sessione) sconosciuta:", + "Session already verified!": "Sessione già verificata!", + "WARNING: Session already verified, but keys do NOT MATCH!": "ATTENZIONE: sessione già verificata, ma le chiavi NON CORRISPONDONO!", + "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!": "ATTENZIONE: VERIFICA CHIAVI FALLITA! La chiave per %(userId)s e per la sessione %(deviceId)s è \"%(fprint)s\" la quale non corriponde con la chiave \"%(fingerprint)s\" fornita. Ciò può significare che le comunicazioni vengono intercettate!", + "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "La chiave che hai fornito corrisponde alla chiave che hai ricevuto dalla sessione di %(userId)s %(deviceId)s. Sessione contrassegnata come verificata.", + "Enable cross-signing to verify per-user instead of per-session (in development)": "Attiva la firma incrociata per la verifica per-utente invece di per-sessione (in sviluppo)", + "Never send encrypted messages to unverified sessions from this session": "Non inviare mai messaggi cifrati a sessioni non verificate da questa sessione", + "Never send encrypted messages to unverified sessions in this room from this session": "Non inviare mai messaggi cifrati a sessioni non verificate in questa stanza da questa sessione", + "To be secure, do this in person or use a trusted way to communicate.": "Per sicurezza, fatelo di persona o usate un metodo fidato per comunicare.", + "Verify your other sessions easier": "Verifica facilmente le tue altre sessioni", + "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.": "Il cambio della password reimposterà qualsiasi chiave di cifratura end-to-end in tutte le sessioni, rendendo illeggibile la cronologia di chat, a meno che prima non esporti le chiavi della stanza e le reimporti dopo. In futuro questa cosa verrà migliorata.", + "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Il tuo account ha un'identità a firma incrociata nell'archivio segreto, ma non è ancora fidata da questa sessione.", + "in memory": "in memoria", + "Your homeserver does not support session management.": "Il tuo homeserver non supporta la gestione della sessione.", + "Unable to load session list": "Impossibile caricare l'elenco sessioni", + "Delete %(count)s sessions|other": "Elimina %(count)s sessioni", + "Delete %(count)s sessions|one": "Elimina %(count)s sessione", + "Riot can't securely cache encrypted messages locally while running in a web browser. Use Riot Desktop for encrypted messages to appear in search results.": "Riot non può conservare in cache i messaggi cifrati in modo sicuro nella versione browser. Usa Riot Desktop affinché i messaggi cifrati appaiano nei risultati di ricerca.", + "This session is backing up your keys. ": "Questa sessione sta facendo il backup delle tue chiavi. ", + "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Questa sessione non sta facendo il backup delle tue chiavi, ma hai un backup esistente dal quale puoi ripristinare e che puoi usare da ora in poi.", + "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Connetti questa sessione al backup chiavi prima di disconnetterti per non perdere eventuali chiavi che possono essere solo in questa sessione.", + "Connect this session to Key Backup": "Connetti questa sessione al backup chiavi", + "Backup has a signature from unknown session with ID %(deviceId)s": "Il backup ha una firma da una sessione sconosciuta con ID %(deviceId)s", + "Backup has a valid signature from this session": "Il backup ha una firma valida da questa sessione", + "Backup has an invalid signature from this session": "Il backup ha una firma non valida da questa sessione", + "Backup has a valid signature from verified session ": "Il backup ha una firma valida da una sessione verificata ", + "Backup has a valid signature from unverified session ": "Il backup ha una firma valida da una sessione non verificata ", + "Backup has an invalid signature from verified session ": "il backup ha una firma non valida da una sessione verificata ", + "Backup has an invalid signature from unverified session ": "il backup ha una firma non valida da una sessione non verificata ", + "Backup is not signed by any of your sessions": "Il backup non è firmato da nessuna tua sessione", + "This backup is trusted because it has been restored on this session": "Questo backup è fidato perchè è stato ripristinato in questa sessione", + "Space used:": "Spazio usato:", + "Indexed messages:": "Messaggi indicizzati:", + "Number of rooms:": "Numero di stanze:" } From 2f4b3272da6aeebf6414399a56695b713ea03f75 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 30 Jan 2020 11:27:54 +0000 Subject: [PATCH 394/906] Send initial device display najme on register Fixes https://github.com/vector-im/riot-web/issues/12140 --- src/components/structures/MatrixChat.js | 1 + .../structures/auth/Registration.js | 20 +++++++++---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 233ec9e7bb..d6ef3341da 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1985,6 +1985,7 @@ export default createReactClass({ onLoggedIn={this.onRegisterFlowComplete} onLoginClick={this.onLoginClick} onServerConfigChange={this.onServerConfigChange} + defaultDeviceDisplayName={this.props.defaultDeviceDisplayName} {...this.getServerProperties()} /> ); diff --git a/src/components/structures/auth/Registration.js b/src/components/structures/auth/Registration.js index 171d3ada26..8593a4b1e2 100644 --- a/src/components/structures/auth/Registration.js +++ b/src/components/structures/auth/Registration.js @@ -2,7 +2,7 @@ Copyright 2015, 2016 OpenMarket Ltd Copyright 2017 Vector Creations Ltd Copyright 2018, 2019 New Vector Ltd -Copyright 2019 The Matrix.org Foundation C.I.C. +Copyright 2019, 2020 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. @@ -62,6 +62,7 @@ export default createReactClass({ // registration shouldn't know or care how login is done. onLoginClick: PropTypes.func.isRequired, onServerConfigChange: PropTypes.func.isRequired, + defaultDeviceDisplayName: PropTypes.string, }, getInitialState: function() { @@ -432,15 +433,14 @@ export default createReactClass({ // session). if (!this.state.formVals.password) inhibitLogin = null; - return this.state.matrixClient.register( - this.state.formVals.username, - this.state.formVals.password, - undefined, // session id: included in the auth dict already - auth, - null, - null, - inhibitLogin, - ); + const registerParams = { + username: this.state.formVals.username, + password: this.state.formVals.password, + initial_device_display_name: this.props.defaultDeviceDisplayName, + }; + if (auth) registerParams.auth = auth; + if (inhibitLogin !== undefined && inhibitLogin !== null) registerParams.inhibitLogin = inhibitLogin; + return this.state.matrixClient.registerRequest(registerParams); }, _getUIAuthInputs: function() { From 4c1cc6feba6c94ade8ef47dfa88f3ea3e68bd515 Mon Sep 17 00:00:00 2001 From: Zoe Date: Thu, 30 Jan 2020 12:21:13 +0000 Subject: [PATCH 395/906] fix SAS dialog width used fixedWidth to accomplish the same goal clean up css --- src/components/views/dialogs/IncomingSasDialog.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/views/dialogs/IncomingSasDialog.js b/src/components/views/dialogs/IncomingSasDialog.js index daaa1aff55..3bf7b83291 100644 --- a/src/components/views/dialogs/IncomingSasDialog.js +++ b/src/components/views/dialogs/IncomingSasDialog.js @@ -227,6 +227,7 @@ export default class IncomingSasDialog extends React.Component { {body} From fd5798aa87e9205213310fda3428894d91d70eb2 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 30 Jan 2020 13:21:51 +0000 Subject: [PATCH 396/906] Change verify user text --- src/components/views/right_panel/UserInfo.js | 2 +- src/i18n/strings/en_EN.json | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index 154d564f05..d1713991aa 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -1270,7 +1270,7 @@ const BasicUserInfo = ({room, member, groupId, devices, isRoomEncrypted}) => { if (isRoomEncrypted && !userVerified && !isMe) { verifyButton = ( verifyUser(member)}> - {_t("Learn more")} + {_t("Verify")} ); } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index ea986e6324..40d87bfdad 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1171,7 +1171,6 @@ "%(role)s in %(roomName)s": "%(role)s in %(roomName)s", "This client does not support end-to-end encryption.": "This client does not support end-to-end encryption.", "Messages in this room are not end-to-end encrypted.": "Messages in this room are not end-to-end encrypted.", - "Learn more": "Learn more", "Security": "Security", "Verify by emoji": "Verify by emoji", "Verify by comparing unique emoji.": "Verify by comparing unique emoji.", From 788cb2409390386d4d41c56aa52119ea165e2bf8 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 30 Jan 2020 14:18:12 +0000 Subject: [PATCH 397/906] Add advanced option to keep secret storage in memory for session This adds a default-off option to keep the secret storage passphrase cached in memory for the current session to avoid death by prompts. --- src/CrossSigningManager.js | 22 ++++++++++++++----- .../settings/tabs/user/LabsUserSettingsTab.js | 1 + src/i18n/strings/en_EN.json | 1 + src/settings/Settings.js | 5 +++++ 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/CrossSigningManager.js b/src/CrossSigningManager.js index 085764214f..6922214d19 100644 --- a/src/CrossSigningManager.js +++ b/src/CrossSigningManager.js @@ -20,6 +20,7 @@ import {MatrixClientPeg} from './MatrixClientPeg'; import { deriveKey } from 'matrix-js-sdk/src/crypto/key_passphrase'; import { decodeRecoveryKey } from 'matrix-js-sdk/src/crypto/recoverykey'; import { _t } from './languageHandler'; +import SettingsStore from './settings/SettingsStore'; // This stores the secret storage private keys in memory for the JS SDK. This is // only meant to act as a cache to avoid prompting the user multiple times @@ -27,7 +28,14 @@ import { _t } from './languageHandler'; // single secret storage operation, as it will clear the cached keys once the // operation ends. let secretStorageKeys = {}; -let cachingAllowed = false; +let secretStorageBeingAccessed = false; + +function isCachingAllowed() { + return ( + secretStorageBeingAccessed || + SettingsStore.getValue("keepSecretStoragePassphraseForSession") + ); +} async function getSecretStorageKey({ keys: keyInfos }) { const keyInfoEntries = Object.entries(keyInfos); @@ -37,7 +45,7 @@ async function getSecretStorageKey({ keys: keyInfos }) { const [name, info] = keyInfoEntries[0]; // Check the in-memory cache - if (cachingAllowed && secretStorageKeys[name]) { + if (isCachingAllowed() && secretStorageKeys[name]) { return [name, secretStorageKeys[name]]; } @@ -71,7 +79,7 @@ async function getSecretStorageKey({ keys: keyInfos }) { const key = await inputToKey(input); // Save to cache to avoid future prompts in the current session - if (cachingAllowed) { + if (isCachingAllowed()) { secretStorageKeys[name] = key; } @@ -104,7 +112,7 @@ export const crossSigningCallbacks = { */ export async function accessSecretStorage(func = async () => { }) { const cli = MatrixClientPeg.get(); - cachingAllowed = true; + secretStorageBeingAccessed = true; try { if (!await cli.hasSecretStorageKey()) { @@ -143,7 +151,9 @@ export async function accessSecretStorage(func = async () => { }) { return await func(); } finally { // Clear secret storage key cache now that work is complete - cachingAllowed = false; - secretStorageKeys = {}; + secretStorageBeingAccessed = false; + if (!isCachingAllowed()) { + secretStorageKeys = {}; + } } } diff --git a/src/components/views/settings/tabs/user/LabsUserSettingsTab.js b/src/components/views/settings/tabs/user/LabsUserSettingsTab.js index ec5f984d46..2b992c7add 100644 --- a/src/components/views/settings/tabs/user/LabsUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/LabsUserSettingsTab.js @@ -66,6 +66,7 @@ export default class LabsUserSettingsTab extends React.Component { +
    ); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index ea986e6324..ed660351f5 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -415,6 +415,7 @@ "Send read receipts for messages (requires compatible homeserver to disable)": "Send read receipts for messages (requires compatible homeserver to disable)", "Show previews/thumbnails for images": "Show previews/thumbnails for images", "Enable message search in encrypted rooms": "Enable message search in encrypted rooms", + "Keep secret storage passphrase in memory for this session": "Keep secret storage passphrase in memory for this session", "Collecting app version information": "Collecting app version information", "Collecting logs": "Collecting logs", "Uploading report": "Uploading report", diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 0ab30e02e1..5ea871dc69 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -485,4 +485,9 @@ export const SETTINGS = { displayName: _td("Enable message search in encrypted rooms"), default: true, }, + "keepSecretStoragePassphraseForSession": { + supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, + displayName: _td("Keep secret storage passphrase in memory for this session"), + default: false, + }, }; From 318689f40b4de4de1347f957235752836636d470 Mon Sep 17 00:00:00 2001 From: Zoe Date: Thu, 30 Jan 2020 15:06:36 +0000 Subject: [PATCH 398/906] Disable all inputs in login form while busy, not just the submit button --- src/components/views/auth/PasswordLogin.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/components/views/auth/PasswordLogin.js b/src/components/views/auth/PasswordLogin.js index c836b96a89..11717fac00 100644 --- a/src/components/views/auth/PasswordLogin.js +++ b/src/components/views/auth/PasswordLogin.js @@ -202,6 +202,7 @@ export default class PasswordLogin extends React.Component { value={this.state.username} onChange={this.onUsernameChanged} onBlur={this.onUsernameBlur} + disabled={this.props.disableSubmit} autoFocus />; case PasswordLogin.LOGIN_FIELD_MXID: @@ -216,6 +217,7 @@ export default class PasswordLogin extends React.Component { value={this.state.username} onChange={this.onUsernameChanged} onBlur={this.onUsernameBlur} + disabled={this.props.disableSubmit} autoFocus />; case PasswordLogin.LOGIN_FIELD_PHONE: { @@ -240,6 +242,7 @@ export default class PasswordLogin extends React.Component { prefix={phoneCountry} onChange={this.onPhoneNumberChanged} onBlur={this.onPhoneNumberBlur} + disabled={this.props.disableSubmit} autoFocus />; } @@ -291,6 +294,7 @@ export default class PasswordLogin extends React.Component { element="select" value={this.state.loginType} onChange={this.onLoginTypeChange} + disabled={this.props.disableSubmit} >
    {_t("Cross-signing public keys:")}{crossSigningPublicKeysOnDevice ? _t("on device") : _t("not found")}{crossSigningPublicKeysOnDevice ? _t("in memory") : _t("not found")}
    {_t("Cross-signing private keys:")}