From b644751ca1ac919d4b919a84f43c29388d6497eb Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 28 Aug 2017 00:16:22 +0100 Subject: [PATCH 001/289] skip direct chats which you have left in memberinfo --- src/components/views/rooms/MemberInfo.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js index 64eeddb406..4f7394fd91 100644 --- a/src/components/views/rooms/MemberInfo.js +++ b/src/components/views/rooms/MemberInfo.js @@ -620,17 +620,16 @@ module.exports = withMatrixClient(React.createClass({ const room = this.props.matrixClient.getRoom(roomId); if (room) { const me = room.getMember(this.props.matrixClient.credentials.userId); - const highlight = ( - room.getUnreadNotificationCount('highlight') > 0 || - me.membership == "invite" - ); + if (me.membership === 'leave') continue; + const highlight = room.getUnreadNotificationCount('highlight') > 0 || me.membership === 'invite'; + tiles.push( ); From 433cd505ee02977cf3ed2695f7d66f9f5c50212f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 28 Aug 2017 00:39:59 +0100 Subject: [PATCH 002/289] skip direct chats which either you or the target have left --- src/components/views/rooms/MemberInfo.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js index 4f7394fd91..6d38797a2d 100644 --- a/src/components/views/rooms/MemberInfo.js +++ b/src/components/views/rooms/MemberInfo.js @@ -620,7 +620,12 @@ module.exports = withMatrixClient(React.createClass({ const room = this.props.matrixClient.getRoom(roomId); if (room) { const me = room.getMember(this.props.matrixClient.credentials.userId); - if (me.membership === 'leave') continue; + // not a DM room if we have left it + if (!me.membership || me.membership === 'leave') continue; + // not a DM room if they have left it + const them = this.props.member; + if (!them.membership || them.membership === 'leave') continue; + const highlight = room.getUnreadNotificationCount('highlight') > 0 || me.membership === 'invite'; tiles.push( From 21af3fe189246b07f68a10d0174ae6d2723398b8 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 28 Aug 2017 00:46:28 +0100 Subject: [PATCH 003/289] modularize and invert logic, so banned etc will count as left --- src/components/views/rooms/MemberInfo.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js index 6d38797a2d..af32d60cef 100644 --- a/src/components/views/rooms/MemberInfo.js +++ b/src/components/views/rooms/MemberInfo.js @@ -40,6 +40,8 @@ import withMatrixClient from '../../../wrappers/withMatrixClient'; import AccessibleButton from '../elements/AccessibleButton'; import GeminiScrollbar from 'react-gemini-scrollbar'; +// States which both sides of the dmRoom must have for it to be considered relevant. +const joinStates = ['invite', 'join']; module.exports = withMatrixClient(React.createClass({ displayName: 'MemberInfo', @@ -620,11 +622,11 @@ module.exports = withMatrixClient(React.createClass({ const room = this.props.matrixClient.getRoom(roomId); if (room) { const me = room.getMember(this.props.matrixClient.credentials.userId); - // not a DM room if we have left it - if (!me.membership || me.membership === 'leave') continue; - // not a DM room if they have left it + // not a DM room if we have are not joined/invited + if (!me.membership || !joinStates.includes(me.membership)) continue; + // not a DM room if they are not joined/invited const them = this.props.member; - if (!them.membership || them.membership === 'leave') continue; + if (!them.membership || !joinStates.includes(them.membership)) continue; const highlight = room.getUnreadNotificationCount('highlight') > 0 || me.membership === 'invite'; From 9658efd6d7f160552a87d4f29622c42c8c283744 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 28 Aug 2017 01:04:18 +0100 Subject: [PATCH 004/289] add comment and remove redundant logic --- src/components/views/rooms/MemberInfo.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js index af32d60cef..8ed05023ad 100644 --- a/src/components/views/rooms/MemberInfo.js +++ b/src/components/views/rooms/MemberInfo.js @@ -40,9 +40,6 @@ import withMatrixClient from '../../../wrappers/withMatrixClient'; import AccessibleButton from '../elements/AccessibleButton'; import GeminiScrollbar from 'react-gemini-scrollbar'; -// States which both sides of the dmRoom must have for it to be considered relevant. -const joinStates = ['invite', 'join']; - module.exports = withMatrixClient(React.createClass({ displayName: 'MemberInfo', @@ -613,6 +610,10 @@ module.exports = withMatrixClient(React.createClass({ var startChat, kickButton, banButton, muteButton, giveModButton, spinner; if (this.props.member.userId !== this.props.matrixClient.credentials.userId) { const dmRoomMap = new DMRoomMap(this.props.matrixClient); + // dmRooms will not include dmRooms that we have been invited into but did not join. + // Because DMRoomMap runs off account_data[m.direct] which is only set on join of dm room. + // XXX: we potentially want DMs we have been invited to, to also show up here :L + // especially as logic below concerns specially if we haven't joined but have been invited const dmRooms = dmRoomMap.getDMRoomsForUserId(this.props.member.userId); const RoomTile = sdk.getComponent("rooms.RoomTile"); @@ -622,11 +623,11 @@ module.exports = withMatrixClient(React.createClass({ const room = this.props.matrixClient.getRoom(roomId); if (room) { const me = room.getMember(this.props.matrixClient.credentials.userId); - // not a DM room if we have are not joined/invited - if (!me.membership || !joinStates.includes(me.membership)) continue; - // not a DM room if they are not joined/invited + // not a DM room if we have are not joined + if (!me.membership || me.membership !== 'join') continue; + // not a DM room if they are not joined const them = this.props.member; - if (!them.membership || !joinStates.includes(them.membership)) continue; + if (!them.membership || them.membership !== 'join') continue; const highlight = room.getUnreadNotificationCount('highlight') > 0 || me.membership === 'invite'; From ba386e3417f5c1d86f46c08c2149a8f8dc1aaf36 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 11 Oct 2017 20:08:09 -0600 Subject: [PATCH 005/289] Singularise unsent message prompt, if applicable Adds vector-im/riot-web#1217 Signed-off-by: Travis Ralston --- src/components/structures/RoomStatusBar.js | 7 ++++++- src/components/structures/RoomView.js | 4 +++- src/i18n/strings/en_EN.json | 2 ++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/components/structures/RoomStatusBar.js b/src/components/structures/RoomStatusBar.js index 3a2ab33db8..68d25e9a2a 100644 --- a/src/components/structures/RoomStatusBar.js +++ b/src/components/structures/RoomStatusBar.js @@ -39,6 +39,9 @@ module.exports = React.createClass({ // string to display when there are messages in the room which had errors on send unsentMessageError: React.PropTypes.string, + // the number of messages not sent. + numUnsentMessages: React.PropTypes.number, + // this is true if we are fully scrolled-down, and are looking at // the end of the live timeline. atEndOfLiveTimeline: React.PropTypes.bool, @@ -252,6 +255,8 @@ module.exports = React.createClass({ } if (this.props.unsentMessageError) { + let resendStr = "Resend message or cancel message now."; + if (this.props.numUnsentMessages > 1) resendStr = "Resend all or cancel all now. You can also select individual messages to resend or cancel."; return (
/!\ @@ -259,7 +264,7 @@ module.exports = React.createClass({ { this.props.unsentMessageError }
- { _tJsx("Resend all or cancel all now. You can also select individual messages to resend or cancel.", + { _tJsx(resendStr, [/(.*?)<\/a>/, /(.*?)<\/a>/], [ (sub) => { sub }, diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 14273fc95f..9a1eb9ef31 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -748,7 +748,8 @@ module.exports = React.createClass({ for (const event of unsentMessages) { if (!event.error || event.error.name !== "UnknownDeviceError") { - return _t("Some of your messages have not been sent."); + if (unsentMessages.length > 1) return _t("Some of your messages have not been sent."); + return _t("Your message was not sent."); } } return _t("Message not sent due to unknown devices being present"); @@ -1570,6 +1571,7 @@ module.exports = React.createClass({ isStatusAreaExpanded = this.state.statusBarVisible; statusBar = Resend all or cancel all now. You can also select individual messages to resend or cancel.": "Resend all or cancel all now. You can also select individual messages to resend or cancel.", + "Resend message or cancel message now.": "Resend message or cancel message now.", "(~%(count)s results)|one": "(~%(count)s result)", "(~%(count)s results)|other": "(~%(count)s results)", "Cancel": "Cancel", From a29ab0976be9db9a98a535f67b396949495765e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Wed, 8 Nov 2017 10:23:11 +0100 Subject: [PATCH 006/289] Make the addresses heading on the aliases settings view translatable --- src/components/views/room_settings/AliasSettings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/room_settings/AliasSettings.js b/src/components/views/room_settings/AliasSettings.js index cb897c9daf..f1c5c0000c 100644 --- a/src/components/views/room_settings/AliasSettings.js +++ b/src/components/views/room_settings/AliasSettings.js @@ -253,7 +253,7 @@ module.exports = React.createClass({ return (
-

Addresses

+

{ _t('Addresses') }

{ _t('The main address for this room is') }: { canonical_alias_section }
From 1e7fc953b353cfce8c3a35cb0db9ec4f281e1de9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Wed, 8 Nov 2017 11:56:30 +0100 Subject: [PATCH 007/289] Ooops, also add the string to the default language file. --- 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 4746a11921..83793291c9 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -420,6 +420,7 @@ "not specified": "not specified", "not set": "not set", "Remote addresses for this room:": "Remote addresses for this room:", + "Addresses": "Addresses", "The main address for this room is": "The main address for this room is", "Local addresses for this room:": "Local addresses for this room:", "This room has no local addresses": "This room has no local addresses", From 820d9c1c25c2cfb1860bd5c407a490ab614af5e8 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 9 Nov 2017 15:58:15 +0000 Subject: [PATCH 008/289] Show staus bar on Unknown Device Error Don't pop up the dialog as soon as we can't send a message. Also removes dispatches used to keep the RoomStatusBar up to date. We can get the same events straight from the js-sdk via the pending events event. --- src/UnknownDeviceErrorHandler.js | 51 ------- src/components/structures/MatrixChat.js | 3 - src/components/structures/RoomStatusBar.js | 144 +++++++++++++++--- src/components/structures/RoomView.js | 49 ------ .../views/dialogs/UnknownDeviceDialog.js | 37 ++--- src/i18n/strings/en_EN.json | 8 +- 6 files changed, 140 insertions(+), 152 deletions(-) delete mode 100644 src/UnknownDeviceErrorHandler.js diff --git a/src/UnknownDeviceErrorHandler.js b/src/UnknownDeviceErrorHandler.js deleted file mode 100644 index e7d77b3b66..0000000000 --- a/src/UnknownDeviceErrorHandler.js +++ /dev/null @@ -1,51 +0,0 @@ -/* -Copyright 2017 Vector Creations 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 dis from './dispatcher'; -import sdk from './index'; -import Modal from './Modal'; - -let isDialogOpen = false; - -const onAction = function(payload) { - if (payload.action === 'unknown_device_error' && !isDialogOpen) { - const UnknownDeviceDialog = sdk.getComponent('dialogs.UnknownDeviceDialog'); - isDialogOpen = true; - Modal.createTrackedDialog('Unknown Device Error', '', UnknownDeviceDialog, { - devices: payload.err.devices, - room: payload.room, - onFinished: (r) => { - isDialogOpen = false; - // XXX: temporary logging to try to diagnose - // https://github.com/vector-im/riot-web/issues/3148 - console.log('UnknownDeviceDialog closed with '+r); - }, - }, 'mx_Dialog_unknownDevice'); - } -}; - -let ref = null; - -export function startListening() { - ref = dis.register(onAction); -} - -export function stopListening() { - if (ref) { - dis.unregister(ref); - ref = null; - } -} diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index e8ca8e82fc..72497f527f 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -41,7 +41,6 @@ require('../../stores/LifecycleStore'); import PageTypes from '../../PageTypes'; import createRoom from "../../createRoom"; -import * as UDEHandler from '../../UnknownDeviceErrorHandler'; import KeyRequestHandler from '../../KeyRequestHandler'; import { _t, getCurrentLanguage } from '../../languageHandler'; @@ -280,7 +279,6 @@ module.exports = React.createClass({ componentDidMount: function() { this.dispatcherRef = dis.register(this.onAction); - UDEHandler.startListening(); this.focusComposer = false; @@ -346,7 +344,6 @@ module.exports = React.createClass({ componentWillUnmount: function() { Lifecycle.stopMatrixClient(); dis.unregister(this.dispatcherRef); - UDEHandler.stopListening(); window.removeEventListener("focus", this.onFocus); window.removeEventListener('resize', this.handleResize); }, diff --git a/src/components/structures/RoomStatusBar.js b/src/components/structures/RoomStatusBar.js index cad55351d1..c37cc7deef 100644 --- a/src/components/structures/RoomStatusBar.js +++ b/src/components/structures/RoomStatusBar.js @@ -1,5 +1,6 @@ /* Copyright 2015, 2016 OpenMarket Ltd +Copyright 2017 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. @@ -16,16 +17,26 @@ limitations under the License. import React from 'react'; import { _t, _tJsx } from '../../languageHandler'; +import Matrix from 'matrix-js-sdk'; import sdk from '../../index'; import WhoIsTyping from '../../WhoIsTyping'; import MatrixClientPeg from '../../MatrixClientPeg'; import MemberAvatar from '../views/avatars/MemberAvatar'; +import Resend from '../../Resend'; +import Modal from '../../Modal'; const HIDE_DEBOUNCE_MS = 10000; const STATUS_BAR_HIDDEN = 0; const STATUS_BAR_EXPANDED = 1; const STATUS_BAR_EXPANDED_LARGE = 2; +function getUnsentMessages(room) { + if (!room) { return []; } + return room.getPendingEvents().filter(function(ev) { + return ev.status === Matrix.EventStatus.NOT_SENT; + }); +}; + module.exports = React.createClass({ displayName: 'RoomStatusBar', @@ -36,9 +47,6 @@ module.exports = React.createClass({ // the number of messages which have arrived since we've been scrolled up numUnreadMessages: React.PropTypes.number, - // string to display when there are messages in the room which had errors on send - unsentMessageError: React.PropTypes.string, - // this is true if we are fully scrolled-down, and are looking at // the end of the live timeline. atEndOfLiveTimeline: React.PropTypes.bool, @@ -99,12 +107,14 @@ module.exports = React.createClass({ return { syncState: MatrixClientPeg.get().getSyncState(), usersTyping: WhoIsTyping.usersTypingApartFromMe(this.props.room), + unsentMessages: [], }; }, componentWillMount: function() { MatrixClientPeg.get().on("sync", this.onSyncStateChange); MatrixClientPeg.get().on("RoomMember.typing", this.onRoomMemberTyping); + MatrixClientPeg.get().on("Room.localEchoUpdated", this.onRoomLocalEchoUpdated); this._checkSize(); }, @@ -119,6 +129,7 @@ module.exports = React.createClass({ if (client) { client.removeListener("sync", this.onSyncStateChange); client.removeListener("RoomMember.typing", this.onRoomMemberTyping); + client.removeListener("Room.localEchoUpdated", this.onRoomLocalEchoUpdated); } }, @@ -137,6 +148,57 @@ module.exports = React.createClass({ }); }, + _onResendAllClick: function() { + Resend.resendUnsentEvents(this.props.room); + }, + + _onCancelAllClick: function() { + Resend.cancelUnsentEvents(this.props.room); + }, + + _onShowDevicesClick: function() { + this._getUnknownDevices().then((unknownDevices) => { + const UnknownDeviceDialog = sdk.getComponent('dialogs.UnknownDeviceDialog'); + Modal.createTrackedDialog('Unknown Device Dialog', '', UnknownDeviceDialog, { + room: this.props.room, + devices: unknownDevices, + }, 'mx_Dialog_unknownDevice'); + }); + }, + + _getUnknownDevices: function() { + const roomMembers = this.props.room.getJoinedMembers().map((m) => { + return m.userId; + }); + return MatrixClientPeg.get().downloadKeys(roomMembers, false).then((devices) => { + if (this._unmounted) return; + + const unknownDevices = {}; + // This is all devices in this room, so find the unknown ones. + Object.keys(devices).forEach((userId) => { + Object.keys(devices[userId]).map((deviceId) => { + const device = devices[userId][deviceId]; + + if (device.isUnverified() && !device.isKnown()) { + if (unknownDevices[userId] === undefined) { + unknownDevices[userId] = {}; + } + unknownDevices[userId][deviceId] = device; + } + }); + }); + return unknownDevices; + }); + }, + + onRoomLocalEchoUpdated: function(event, room, oldEventId, oldStatus) { + if (room.roomId !== this.props.room.roomId) return; + + this.setState({ + unsentMessages: getUnsentMessages(this.props.room), + }); + }, + // Check whether current size is greater than 0, if yes call props.onVisible _checkSize: function() { if (this.props.onVisible && this._getSize()) { @@ -156,7 +218,7 @@ module.exports = React.createClass({ this.props.sentMessageAndIsAlone ) { return STATUS_BAR_EXPANDED; - } else if (this.props.unsentMessageError) { + } else if (this.state.unsentMessages.length > 0) { return STATUS_BAR_EXPANDED_LARGE; } return STATUS_BAR_HIDDEN; @@ -242,6 +304,60 @@ module.exports = React.createClass({ return avatars; }, + _getUnsentMessageContent: function(room) { + const unsentMessages = this.state.unsentMessages; + if (!unsentMessages.length) return null; + + let title; + let content; + + const hasUDE = unsentMessages.some((m) => { + return m.error && m.error.name === "UnknownDeviceError"; + }); + + if (hasUDE) { + title = _t("Message not sent due to unknown devices being present"); + content = _tJsx( + "Show devices or cancel all.", + [/(.*?)<\/a>/, /(.*?)<\/a>/], + [ + (sub) => { sub }, + (sub) => { sub }, + ], + ); + } else { + if ( + unsentMessages.length === 1 && + unsentMessages[0].error && + unsentMessages[0].error.data && + unsentMessages[0].error.data.error + ) { + title = unsentMessages[0].error.data.error; + } else { + title = _t("Some of your messages have not been sent."); + } + content = _tJsx( + "Resend all or cancel all now. "+ + "You can also select individual messages to resend or cancel.", + [/(.*?)<\/a>/, /(.*?)<\/a>/], + [ + (sub) => { sub }, + (sub) => { sub }, + ], + ); + } + + return
+ {_t("Warning")} +
+ { title } +
+
+ { content } +
+
; + }, + // return suitable content for the main (text) part of the status bar. _getContent: function() { const EmojiText = sdk.getComponent('elements.EmojiText'); @@ -264,24 +380,8 @@ module.exports = React.createClass({ ); } - if (this.props.unsentMessageError) { - return ( -
- /!\ -
- { this.props.unsentMessageError } -
-
- { _tJsx("Resend all or cancel all now. You can also select individual messages to resend or cancel.", - [/(.*?)<\/a>/, /(.*?)<\/a>/], - [ - (sub) => { sub }, - (sub) => { sub }, - ], - ) } -
-
- ); + if (this.state.unsentMessages.length > 0) { + return this._getUnsentMessageContent(); } // unread count trumps who is typing since the unread count is only diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 409b95947f..0f4531ecef 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -26,7 +26,6 @@ const React = require("react"); const ReactDOM = require("react-dom"); import Promise from 'bluebird'; const classNames = require("classnames"); -const Matrix = require("matrix-js-sdk"); import { _t } from '../../languageHandler'; const UserSettingsStore = require('../../UserSettingsStore'); @@ -35,7 +34,6 @@ const ContentMessages = require("../../ContentMessages"); const Modal = require("../../Modal"); const sdk = require('../../index'); const CallHandler = require('../../CallHandler'); -const Resend = require("../../Resend"); const dis = require("../../dispatcher"); const Tinter = require("../../Tinter"); const rate_limited_func = require('../../ratelimitedfunc'); @@ -110,7 +108,6 @@ module.exports = React.createClass({ draggingFile: false, searching: false, searchResults: null, - unsentMessageError: '', callState: null, guestsCanJoin: false, canPeek: false, @@ -204,7 +201,6 @@ module.exports = React.createClass({ if (initial) { newState.room = MatrixClientPeg.get().getRoom(newState.roomId); if (newState.room) { - newState.unsentMessageError = this._getUnsentMessageError(newState.room); newState.showApps = this._shouldShowApps(newState.room); this._onRoomLoaded(newState.room); } @@ -470,11 +466,6 @@ module.exports = React.createClass({ case 'message_send_failed': case 'message_sent': this._checkIfAlone(this.state.room); - // no break; to intentionally fall through - case 'message_send_cancelled': - this.setState({ - unsentMessageError: this._getUnsentMessageError(this.state.room), - }); break; case 'notifier_enabled': case 'upload_failed': @@ -754,35 +745,6 @@ module.exports = React.createClass({ this.setState({isAlone: joinedMembers.length === 1}); }, - _getUnsentMessageError: function(room) { - const unsentMessages = this._getUnsentMessages(room); - if (!unsentMessages.length) return ""; - - if ( - unsentMessages.length === 1 && - unsentMessages[0].error && - unsentMessages[0].error.data && - unsentMessages[0].error.data.error && - unsentMessages[0].error.name !== "UnknownDeviceError" - ) { - return unsentMessages[0].error.data.error; - } - - for (const event of unsentMessages) { - if (!event.error || event.error.name !== "UnknownDeviceError") { - return _t("Some of your messages have not been sent."); - } - } - return _t("Message not sent due to unknown devices being present"); - }, - - _getUnsentMessages: function(room) { - if (!room) { return []; } - return room.getPendingEvents().filter(function(ev) { - return ev.status === Matrix.EventStatus.NOT_SENT; - }); - }, - _updateConfCallNotification: function() { const room = this.state.room; if (!room || !this.props.ConferenceHandler) { @@ -827,14 +789,6 @@ module.exports = React.createClass({ } }, - onResendAllClick: function() { - Resend.resendUnsentEvents(this.state.room); - }, - - onCancelAllClick: function() { - Resend.cancelUnsentEvents(this.state.room); - }, - onInviteButtonClick: function() { // call AddressPickerDialog dis.dispatch({ @@ -1614,12 +1568,9 @@ module.exports = React.createClass({ statusBar = { Object.keys(this.props.devices[userId]).map((deviceId) => { MatrixClientPeg.get().setDeviceKnown(userId, deviceId, true); }); }); + this.props.onFinished(); + Resend.resendUnsentEvents(this.props.room); + }, - // XXX: temporary logging to try to diagnose - // https://github.com/vector-im/riot-web/issues/3148 - console.log('Opening UnknownDeviceDialog'); + _onDismissClicked: function() { + this.props.onFinished(); }, render: function() { @@ -139,12 +141,7 @@ export default React.createClass({ const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); return ( { - // XXX: temporary logging to try to diagnose - // https://github.com/vector-im/riot-web/issues/3148 - console.log("UnknownDeviceDialog closed by escape"); - this.props.onFinished(); - }} + onFinished={this.props.onFinished} title={_t('Room contains unknown devices')} > @@ -157,21 +154,13 @@ export default React.createClass({
-
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 4052d098c1..b83600ffb6 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -727,17 +727,19 @@ "To join an existing community you'll have to know its community identifier; this will look something like +example:matrix.org.": "To join an existing community you'll have to know its community identifier; this will look something like +example:matrix.org.", "You have no visible notifications": "You have no visible notifications", "Scroll to bottom of page": "Scroll to bottom of page", + "Message not sent due to unknown devices being present": "Message not sent due to unknown devices being present", + "Show devices or cancel all.": "Show devices or cancel all.", + "Some of your messages have not been sent.": "Some of your messages have not been sent.", + "Resend all or cancel all now. You can also select individual messages to resend or cancel.": "Resend all or cancel all now. You can also select individual messages to resend or cancel.", + "Warning": "Warning", "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.", - "Resend all or cancel all now. You can also select individual messages to resend or cancel.": "Resend all or cancel all now. You can also select individual messages to resend or cancel.", "%(count)s new messages|other": "%(count)s new messages", "%(count)s new messages|one": "%(count)s new message", "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?", "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?", - "Some of your messages have not been sent.": "Some of your messages have not been sent.", - "Message not sent due to unknown devices being present": "Message not sent due to unknown devices being present", "Failed to upload file": "Failed to upload file", "Server may be unavailable, overloaded, or the file too big": "Server may be unavailable, overloaded, or the file too big", "Search failed": "Search failed", From b1ec430523fffc0049d278b6167bdacf90c12817 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 9 Nov 2017 16:09:12 +0000 Subject: [PATCH 009/289] Remove now-unused dispatches --- src/CallHandler.js | 9 --------- src/Resend.js | 11 ----------- src/components/structures/MatrixChat.js | 7 ------- src/components/structures/RoomView.js | 6 +----- src/components/views/rooms/MessageComposerInput.js | 7 ------- 5 files changed, 1 insertion(+), 39 deletions(-) diff --git a/src/CallHandler.js b/src/CallHandler.js index a9539d40e1..e2241a4955 100644 --- a/src/CallHandler.js +++ b/src/CallHandler.js @@ -105,15 +105,6 @@ function _setCallListeners(call) { call.hangup(); _setCallState(undefined, call.roomId, "ended"); }); - call.on('send_event_error', function(err) { - if (err.name === "UnknownDeviceError") { - dis.dispatch({ - action: 'unknown_device_error', - err: err, - room: MatrixClientPeg.get().getRoom(call.roomId), - }); - } - }); call.on("hangup", function() { _setCallState(undefined, call.roomId, "ended"); }); diff --git a/src/Resend.js b/src/Resend.js index 1fee5854ea..4eaee16d1b 100644 --- a/src/Resend.js +++ b/src/Resend.js @@ -44,13 +44,6 @@ module.exports = { // XXX: temporary logging to try to diagnose // https://github.com/vector-im/riot-web/issues/3148 console.log('Resend got send failure: ' + err.name + '('+err+')'); - if (err.name === "UnknownDeviceError") { - dis.dispatch({ - action: 'unknown_device_error', - err: err, - room: room, - }); - } dis.dispatch({ action: 'message_send_failed', @@ -60,9 +53,5 @@ module.exports = { }, removeFromQueue: function(event) { MatrixClientPeg.get().cancelPendingEvent(event); - dis.dispatch({ - action: 'message_send_cancelled', - event: event, - }); }, }; diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 72497f527f..82b2200409 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1331,13 +1331,6 @@ module.exports = React.createClass({ cli.sendEvent(roomId, event.getType(), event.getContent()).done(() => { dis.dispatch({action: 'message_sent'}); }, (err) => { - if (err.name === 'UnknownDeviceError') { - dis.dispatch({ - action: 'unknown_device_error', - err: err, - room: cli.getRoom(roomId), - }); - } dis.dispatch({action: 'message_send_failed'}); }); }, diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 0f4531ecef..4a7229e7c5 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -932,11 +932,7 @@ module.exports = React.createClass({ file, this.state.room.roomId, MatrixClientPeg.get(), ).done(undefined, (error) => { if (error.name === "UnknownDeviceError") { - dis.dispatch({ - action: 'unknown_device_error', - err: error, - room: this.state.room, - }); + // Let the staus bar handle this return; } const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); diff --git a/src/components/views/rooms/MessageComposerInput.js b/src/components/views/rooms/MessageComposerInput.js index aa019de091..9c6644f9dd 100644 --- a/src/components/views/rooms/MessageComposerInput.js +++ b/src/components/views/rooms/MessageComposerInput.js @@ -74,13 +74,6 @@ function onSendMessageFailed(err, room) { // XXX: temporary logging to try to diagnose // https://github.com/vector-im/riot-web/issues/3148 console.log('MessageComposer got send failure: ' + err.name + '('+err+')'); - if (err.name === "UnknownDeviceError") { - dis.dispatch({ - action: 'unknown_device_error', - err: err, - room: room, - }); - } dis.dispatch({ action: 'message_send_failed', }); From 681f43913acc1a51b34ca63b1d188381b134be9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Fri, 10 Nov 2017 11:26:53 +0100 Subject: [PATCH 010/289] Make the disabled PowerSelector element showing custom value translatable. Fixes #5547 --- src/components/views/elements/PowerSelector.js | 12 ++++++------ src/i18n/strings/en_EN.json | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/components/views/elements/PowerSelector.js b/src/components/views/elements/PowerSelector.js index a0aaa12ff1..8e60a7066d 100644 --- a/src/components/views/elements/PowerSelector.js +++ b/src/components/views/elements/PowerSelector.js @@ -18,7 +18,7 @@ limitations under the License. import React from 'react'; import * as Roles from '../../../Roles'; -import { _t } from '../../../languageHandler'; +import { _t, _tJsx } from '../../../languageHandler'; let LEVEL_ROLE_MAP = {}; const reverseRoles = {}; @@ -85,13 +85,11 @@ module.exports = React.createClass({ render: function() { let customPicker; if (this.state.custom) { - let input; if (this.props.disabled) { - input = { this.props.value }; + customPicker = { _tJsx('Custom of ', [//], [(sub) => { this.props.value }]) }; } else { - input = ; + customPicker = ; } - customPicker = of { input }; } let selectValue; @@ -102,7 +100,9 @@ module.exports = React.createClass({ } let select; if (this.props.disabled) { - select = { selectValue }; + if (!this.state.custom) { + select = { selectValue }; + } } else { // Each level must have a definition in LEVEL_ROLE_MAP const levels = [0, 50, 100]; diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 83793291c9..cfc28e3432 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -581,6 +581,7 @@ "%(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", + "Custom of ": "Custom of ", "Custom level": "Custom level", "Room directory": "Room directory", "Start chat": "Start chat", From 0f8df97a475f02b73d9f7b33917de206d5f46fb2 Mon Sep 17 00:00:00 2001 From: Tong Hui Date: Fri, 10 Nov 2017 14:14:55 +0000 Subject: [PATCH 011/289] Translated using Weblate (Chinese (Simplified)) Currently translated at 70.4% (654 of 928 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hans/ --- src/i18n/strings/zh_Hans.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 474233909f..317f1b4396 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -710,5 +710,7 @@ "Autocomplete Delay (ms):": "自动完成延迟(毫秒):", "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s 小组建被 %(senderName)s 添加", "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s 小组建被 %(senderName)s 移除", - "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s 小组建被 %(senderName)s 修改" + "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s 小组建被 %(senderName)s 修改", + "Unpin Message": "取消置顶消息", + "Add rooms to this community": "添加聊天室到此社区" } From bce481585110f7676cf399eec6a17d76b8232eb9 Mon Sep 17 00:00:00 2001 From: David Baker Date: Sat, 11 Nov 2017 15:57:20 +0000 Subject: [PATCH 012/289] Initialise unread messages value correctly --- src/components/structures/RoomStatusBar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/RoomStatusBar.js b/src/components/structures/RoomStatusBar.js index c37cc7deef..30f6f3ee2a 100644 --- a/src/components/structures/RoomStatusBar.js +++ b/src/components/structures/RoomStatusBar.js @@ -107,7 +107,7 @@ module.exports = React.createClass({ return { syncState: MatrixClientPeg.get().getSyncState(), usersTyping: WhoIsTyping.usersTypingApartFromMe(this.props.room), - unsentMessages: [], + unsentMessages: getUnsentMessages(this.props.room), }; }, From a97f53099990a1002d19b58094bd6fae801bfa41 Mon Sep 17 00:00:00 2001 From: Krombel Date: Mon, 13 Nov 2017 12:50:27 +0000 Subject: [PATCH 013/289] Translated using Weblate (German) Currently translated at 100.0% (928 of 928 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 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index db12a69657..eca34954f9 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -963,12 +963,12 @@ "%(names)s and %(count)s others are typing|one": "%(names)s und eine weitere Person schreiben", "Disinvite this user?": "Einladung für diesen Benutzer zurückziehen?", "Kick this user?": "Diesen Benutzer kicken?", - "Unban this user?": "Verbannung dieses Benutzers aufheben?", + "Unban this user?": "Verbannung für diesen Benutzer aufheben?", "Ban this user?": "Diesen Benutzer verbannen?", "Drop here to favourite": "Hierher ziehen, um als Favorit zu markieren", "Drop here to tag direct chat": "Hierher ziehen, um als Direkt-Chat zu markieren", "Drop here to restore": "Hierher ziehen zum Wiederherstellen", - "Drop here to demote": "Hier loslassen um zurückzustufen", + "Drop here to demote": "Hierher ziehen, um herabzustufen", "You have been kicked from this room by %(userName)s.": "Du wurdest von %(userName)s aus diesem Raum gekickt.", "You are trying to access a room.": "Du versuchst, auf einen Raum zuzugreifen.", "Members only (since the point in time of selecting this option)": "Nur Mitglieder (ab dem Zeitpunkt, an dem diese Option ausgewählt wird)", @@ -993,13 +993,13 @@ "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Eine E-Mail wurde an %(emailAddress)s gesendet. Folge dem in der E-Mail enthaltenen Link und klicke dann unten.", "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Die Sichtbarkeit von '%(roomName)s' in %(groupId)s konnte nicht aktualisiert werden.", "Visibility in Room List": "Sichtbarkeit in Raum-Liste", - "Visible to everyone": "Für jeden sichtbar", + "Visible to everyone": "Für alle sichtbar", "Only visible to community members": "Nur für Community-Mitglieder sichtbar", "Community Invites": "Community-Einladungen", "Notify the whole room": "Den gesamten Raum benachrichtigen", "Room Notification": "Raum-Benachrichtigung", "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Diese Räume werden Community-Mitgliedern auf der Community-Seite angezeigt. Community-Mitglieder können diesen Räumen beitreten, indem sie auf diese klicken.", - "Show these rooms to non-members on the community page and room list?": "Sollen diese Räume Nicht-Mitgliedern auf der Community-Seite und Raum-Liste gezeigt werden?", - "

HTML for your community's page

\n

\n Use the long description to introduce new members to the community, or distribute\n some important links\n

\n

\n You can even use 'img' tags\n

\n": "

HTML für deine Community-Seite

\n

\n Nutze die lange Beschreibung um neuen Mitgliedern diese Community zu beschreiben\n oder um einige wichtige Informationen oder Links festzuhalten.\n

\n

\n Du kannst auch 'img'-Tags (HTML) verwenden\n

\n", - "Your community hasn't got a Long Description, a HTML page to show to community members.
Click here to open settings and give it one!": "Deine Community hat noch keine lange Beschreibung oder eine HTML-Seite die Community-Mitgliedern gezeigt wird.
Klicke hier um die Einstellungen zu öffnen und ihr eine zu geben!" + "Show these rooms to non-members on the community page and room list?": "Sollen diese Räume Nicht-Mitgliedern auf der Community-Seite und der Raum-Liste angezeigt werden?", + "

HTML for your community's page

\n

\n Use the long description to introduce new members to the community, or distribute\n some important links\n

\n

\n You can even use 'img' tags\n

\n": "

HTML für deine Community-Seite

\n

\n Nutze die ausführliche Beschreibung, um neuen Mitgliedern diese Community vorzustellen\n oder um wichtige Links bereitzustellen.\n

\n

\n Du kannst sogar 'img'-Tags (HTML) verwenden\n

\n", + "Your community hasn't got a Long Description, a HTML page to show to community members.
Click here to open settings and give it one!": "Deine Community hat noch keine ausführliche Beschreibung, d. h. eine HTML-Seite, die Community-Mitgliedern angezeigt wird.
Hier klicken, um die Einstellungen zu öffnen und eine Beschreibung zu erstellen!" } From beebe6b92b57339bee20a998097786b7cbaf75f0 Mon Sep 17 00:00:00 2001 From: Bamstam Date: Mon, 13 Nov 2017 14:05:02 +0000 Subject: [PATCH 014/289] Translated using Weblate (German) Currently translated at 100.0% (928 of 928 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index eca34954f9..05b9392079 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -996,7 +996,7 @@ "Visible to everyone": "Für alle sichtbar", "Only visible to community members": "Nur für Community-Mitglieder sichtbar", "Community Invites": "Community-Einladungen", - "Notify the whole room": "Den gesamten Raum benachrichtigen", + "Notify the whole room": "Alle im Raum benachrichtigen", "Room Notification": "Raum-Benachrichtigung", "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Diese Räume werden Community-Mitgliedern auf der Community-Seite angezeigt. Community-Mitglieder können diesen Räumen beitreten, indem sie auf diese klicken.", "Show these rooms to non-members on the community page and room list?": "Sollen diese Räume Nicht-Mitgliedern auf der Community-Seite und der Raum-Liste angezeigt werden?", From 6c8283b3a8fc1828b21663eb1cff7e8b9632c4d3 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Tue, 14 Nov 2017 06:40:59 +0000 Subject: [PATCH 015/289] Translated using Weblate (Hungarian) Currently translated at 100.0% (932 of 932 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 b316e994a1..8a30c176b3 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1001,5 +1001,9 @@ "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!": "A közösségednek nincs bő leírása, HTML oldala ami megjelenik a közösség tagjainak.
A létrehozáshoz kattints ide!", "Notify the whole room": "Az egész szoba értesítése", "Room Notification": "Szoba értesítések", - "Show these rooms to non-members on the community page and room list?": "Mutassuk meg ezeket a szobákat kívülállóknak a közösségi oldalon és a szobák listájában?" + "Show these rooms to non-members on the community page and room list?": "Mutassuk meg ezeket a szobákat kívülállóknak a közösségi oldalon és a szobák listájában?", + "Sign in to get started": "Az induláshoz jelentkezz be", + "Status.im theme": "Állapot.im téma", + "Please note you are logging into the %(hs)s server, not matrix.org.": "Figyelem, a %(hs)s szerverre jelentkezel be és nem a matrix.org szerverre.", + "Username on %(hs)s": "Felhasználónév a %(hs)s szerveren" } From acd2be4b68eeba251696894759be796cde2032c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Tue, 14 Nov 2017 10:53:44 +0000 Subject: [PATCH 016/289] Translated using Weblate (French) Currently translated at 100.0% (932 of 932 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 a9b7232e29..da224ce4e1 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -997,5 +997,9 @@ "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Ces salons sont affichés aux membres de la communauté sur la page de la communauté. Les membres de la communauté peuvent rejoindre ces salons en cliquant dessus.", "

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 pour votre page de communauté

\n

\n Utilisez la description longue pour présenter la communauté aux nouveaux membres\n ou pour diffuser des liens importants\n

\n

\n Vous pouvez même utiliser des balises \"img\"\n

\n", "Your community hasn't got a Long Description, a HTML page to show to community members.
Click here to open settings and give it one!": "Votre communauté n'a pas de description longue, une page HTML à montrer aux membres de la communauté.
Cliquez ici pour ouvrir les réglages et créez-la !", - "Show these rooms to non-members on the community page and room list?": "Afficher ces salons aux non-membres sur la page de communauté et la liste des salons ?" + "Show these rooms to non-members on the community page and room list?": "Afficher ces salons aux non-membres sur la page de communauté et la liste des salons ?", + "Sign in to get started": "Connectez-vous pour commencer", + "Status.im theme": "Thème Status.im", + "Please note you are logging into the %(hs)s server, not matrix.org.": "Veuillez noter que vous vous connecter au serveur %(hs)s, pas à matrix.org.", + "Username on %(hs)s": "Nom d'utilisateur sur %(hs)s" } From 85f002b21cc3145f35437c9f536f57c357fb6af8 Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 14 Nov 2017 03:16:09 +0000 Subject: [PATCH 017/289] Translated using Weblate (Russian) Currently translated at 98.4% (918 of 932 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 8ca50ec72f..d46076e2ff 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -986,5 +986,9 @@ "Community Invites": "Приглашения в сообщества", "Notify the whole room": "Уведомить всю комнату", "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Эти комнаты отображаются для участников сообщества на странице сообщества. Участники сообщества могут присоединиться к комнатам, щелкнув на них.", - "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?": "Следует ли показывать эти комнаты посторонним на странице сообщества и в комнате?", + "Sign in to get started": "Войдите, чтобы начать", + "Visibility in Room List": "Видимость в списке комнат", + "Visible to everyone": "Видимый для всех", + "Only visible to community members": "Только участникам сообщества" } From 9d1949601194fe995766e272b5027006691c3339 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Tue, 14 Nov 2017 13:19:43 +0000 Subject: [PATCH 018/289] Translated using Weblate (Slovak) Currently translated at 100.0% (932 of 932 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sk/ --- src/i18n/strings/sk.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index 837a55e380..11684c5488 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -926,5 +926,9 @@ "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Exportovaný súbor je chránený heslom. Súbor môžete importovať len ak zadáte zodpovedajúce heslo.", "File to import": "Importovať zo súboru", "Import": "Importovať", - "Show these rooms to non-members on the community page and room list?": "Zobrazovať tieto miestnosti na domovskej stránke komunity a v zozname miestností aj pre nečlenov?" + "Show these rooms to non-members on the community page and room list?": "Zobrazovať tieto miestnosti na domovskej stránke komunity a v zozname miestností aj pre nečlenov?", + "Sign in to get started": "Začnite prihlásením sa", + "Status.im theme": "Téma status.im", + "Please note you are logging into the %(hs)s server, not matrix.org.": "Všimnite si: Práve sa prihlasujete na server %(hs)s, nie na server matrix.org.", + "Username on %(hs)s": "Meno používateľa na servery %(hs)s" } From 3d677d84fe3292f7c430f98ded726ef5e84436f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Tue, 14 Nov 2017 14:05:15 +0000 Subject: [PATCH 019/289] Translated using Weblate (Slovak) Currently translated at 100.0% (932 of 932 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sk/ --- src/i18n/strings/sk.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index 11684c5488..ab2091d57b 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -140,7 +140,7 @@ "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s sprístupnil budúcu históriu miestnosti pre všetkých členov, od kedy boli pozvaní.", "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s sprístupnil budúcu históriu miestnosti pre všetkých členov, od kedy vstúpili.", "%(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 všetkých.", + "%(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", @@ -304,7 +304,7 @@ "Unknown": "Neznámy", "Seen by %(userName)s at %(dateTime)s": "%(userName)s videl %(dateTime)s", "Unnamed room": "Nepomenovaná miestnosť", - "World readable": "Viditeľné pre všetkých", + "World readable": "Viditeľné pre každého", "Guests can join": "Aj hostia môžu vstúpiť", "No rooms to show": "Žiadne miestnosti na zobrazenie", "Failed to set avatar.": "Nepodarilo sa nastaviť avatara.", @@ -505,7 +505,7 @@ "Something went wrong!": "Niečo sa pokazilo!", "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Nie je možné aktualizovať viditeľnosť miestnosti '%(roomName)s' v komunite %(groupId)s.", "Visibility in Room List": "Viditeľnosť v zozname miestností", - "Visible to everyone": "Viditeľná pre všetkých", + "Visible to everyone": "Viditeľná pre každého", "Only visible to community members": "Viditeľná len pre členov komunity", "Filter community rooms": "Filtrovať miestnosti v komunite", "Unknown Address": "Neznáma adresa", From 64958d05b9743ee9a1a9f49287ebe108853058dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Tue, 14 Nov 2017 14:18:09 +0000 Subject: [PATCH 020/289] Translated using Weblate (French) Currently translated at 100.0% (933 of 933 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index da224ce4e1..f252786732 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1001,5 +1001,7 @@ "Sign in to get started": "Connectez-vous pour commencer", "Status.im theme": "Thème Status.im", "Please note you are logging into the %(hs)s server, not matrix.org.": "Veuillez noter que vous vous connecter au serveur %(hs)s, pas à matrix.org.", - "Username on %(hs)s": "Nom d'utilisateur sur %(hs)s" + "Username on %(hs)s": "Nom d'utilisateur sur %(hs)s", + "Restricted": "Restreint", + "Custom of %(powerLevel)s": "Personnalisé de %(powerLevel)s" } From 20beb7990f4f23a6ddc3087e2c284580007f9373 Mon Sep 17 00:00:00 2001 From: Bamstam Date: Tue, 14 Nov 2017 14:21:05 +0000 Subject: [PATCH 021/289] Translated using Weblate (German) Currently translated at 99.4% (928 of 933 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 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 05b9392079..24036bde89 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -759,7 +759,7 @@ "Create": "Erstelle", "Room creation failed": "Raum-Erstellung fehlgeschlagen", "Featured Rooms:": "Hervorgehobene Räume:", - "Featured Users:": "Hervorgehobene Nutzer:", + "Featured Users:": "Hervorgehobene Benutzer:", "Automatically replace plain text Emoji": "Klartext-Emoji automatisch ersetzen", "Failed to upload image": "Bild-Hochladen fehlgeschlagen", "Hide avatars in user and room mentions": "Profilbilder in Benutzer- und Raum-Erwähnungen verbergen", @@ -880,7 +880,7 @@ "Filter community members": "Community-Mitglieder filtern", "Filter community rooms": "Community-Räume filtern", "Failed to remove room from community": "Entfernen des Raumes aus der Community fehlgeschlagen", - "Removing a room from the community will also remove it from the community page.": "Ein Entfernen eines Raumes aus der Community wird ihn auch von der Community-Seite entfernen.", + "Removing a room from the community will also remove it from the community page.": "Das Entfernen eines Raumes aus der Community wird ihn auch von der Community-Seite entfernen.", "Community IDs may only contain alphanumeric characters": "Community-IDs dürfen nur alphanumerische Zeichen enthalten", "Create Community": "Community erstellen", "Community Name": "Community-Name", @@ -1001,5 +1001,6 @@ "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Diese Räume werden Community-Mitgliedern auf der Community-Seite angezeigt. Community-Mitglieder können diesen Räumen beitreten, indem sie auf diese klicken.", "Show these rooms to non-members on the community page and room list?": "Sollen diese Räume Nicht-Mitgliedern auf der Community-Seite und der Raum-Liste angezeigt werden?", "

HTML for your community's page

\n

\n Use the long description to introduce new members to the community, or distribute\n some important links\n

\n

\n You can even use 'img' tags\n

\n": "

HTML für deine Community-Seite

\n

\n Nutze die ausführliche Beschreibung, um neuen Mitgliedern diese Community vorzustellen\n oder um wichtige Links bereitzustellen.\n

\n

\n Du kannst sogar 'img'-Tags (HTML) verwenden\n

\n", - "Your community hasn't got a Long Description, a HTML page to show to community members.
Click here to open settings and give it one!": "Deine Community hat noch keine ausführliche Beschreibung, d. h. eine HTML-Seite, die Community-Mitgliedern angezeigt wird.
Hier klicken, um die Einstellungen zu öffnen und eine Beschreibung zu erstellen!" + "Your community hasn't got a Long Description, a HTML page to show to community members.
Click here to open settings and give it one!": "Deine Community hat noch keine ausführliche Beschreibung, d. h. eine HTML-Seite, die Community-Mitgliedern angezeigt wird.
Hier klicken, um die Einstellungen zu öffnen und eine Beschreibung zu erstellen!", + "Custom of %(powerLevel)s": "benutzerdefiniert mit Wert %(powerLevel)s" } From 1038e44672d12b4b47232844399ac1a7621b7daa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Tue, 14 Nov 2017 14:10:14 +0000 Subject: [PATCH 022/289] Translated using Weblate (Slovak) Currently translated at 99.7% (931 of 933 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sk/ --- src/i18n/strings/sk.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index ab2091d57b..7a38caec82 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -8,7 +8,7 @@ "Existing Call": "Existujúci hovor", "You are already in a call.": "Už ste súčasťou iného hovoru.", "VoIP is unsupported": "VoIP nie je podporovaný", - "You cannot place VoIP calls in this browser.": "Použitím tohoto webového prehliadača nemôžete uskutočniť hovory.", + "You cannot place VoIP calls in this browser.": "Pomocou tohoto webového prehliadača nemôžete uskutočňovať VoIP hovory.", "You cannot place a call with yourself.": "Nemôžete uskutočniť hovor so samým sebou.", "Conference calls are not supported in this client": "Tento klient nepodporuje konferenčné hovory", "Conference calls are not supported in encrypted rooms": "Konferenčné hovory nie sú podporované v šifrovaných miestnostiach", @@ -107,7 +107,7 @@ "Reason": "Dôvod", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s prijal pozvanie pre %(displayName)s.", "%(targetName)s accepted an invitation.": "%(targetName)s prijal pozvanie.", - "%(senderName)s requested a VoIP conference.": "%(senderName)s požiadal o VOIP konferenciu.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s požiadal o VoIP konferenciu.", "%(senderName)s invited %(targetName)s.": "%(senderName)s pozval %(targetName)s.", "%(senderName)s banned %(targetName)s.": "%(senderName)s zakázal vstup %(targetName)s.", "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s si zmenil zobrazované meno z %(oldDisplayName)s na %(displayName)s.", From eb2d5d0ac515fbe8733966a74709b47d7e216048 Mon Sep 17 00:00:00 2001 From: Bamstam Date: Tue, 14 Nov 2017 14:32:13 +0000 Subject: [PATCH 023/289] Translated using Weblate (German) Currently translated at 99.4% (928 of 933 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 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 24036bde89..f6a9e00507 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -33,7 +33,7 @@ "Bans user with given id": "Verbannt den Benutzer mit der angegebenen ID", "Deops user with given id": "Entfernt OP beim Benutzer mit der angegebenen ID", "Invites user with given id to current room": "Lädt den Benutzer mit der angegebenen ID in den aktuellen Raum ein", - "Joins room with given alias": "Betrete Raum mit angegebenen Alias", + "Joins room with given alias": "Raum wird mit dem angegebenen Alias betreten", "Kicks user with given id": "Benutzer mit der angegebenen ID kicken", "Changes your display nickname": "Ändert deinen angezeigten Nicknamen", "Change Password": "Passwort ändern", @@ -904,7 +904,7 @@ "To join an existing community you'll have to know its community identifier; this will look something like +example:matrix.org.": "Um einer bereits bestehenden Community beitreten zu können, musst dir deren Community-ID bekannt sein. Diese sieht z. B. aus wie +example:matrix.org.", "Your Communities": "Deine Communities", "You're not currently a member of any communities.": "Du bist aktuell kein Mitglied einer Community.", - "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Erzeuge eine Community um Nutzer und Räume zu gruppieren! Erzeuge eine angepasste Homepage um dein Revier im Matrix-Universum zu markieren.", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Erstelle eine Community, um Benutzer und Räume miteinander zu verbinden! Erstelle zusätzlich eine eigene Homepage, um deinen individuellen Bereich im Matrix-Universum zu gestalten.", "Something went wrong whilst creating your community": "Beim Erstellen deiner Community ist ein Fehler aufgetreten", "%(names)s and %(count)s others are typing|other": "%(names)s und %(count)s weitere schreiben", "And %(count)s more...|other": "Und %(count)s weitere...", @@ -999,7 +999,7 @@ "Notify the whole room": "Alle im Raum benachrichtigen", "Room Notification": "Raum-Benachrichtigung", "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Diese Räume werden Community-Mitgliedern auf der Community-Seite angezeigt. Community-Mitglieder können diesen Räumen beitreten, indem sie auf diese klicken.", - "Show these rooms to non-members on the community page and room list?": "Sollen diese Räume Nicht-Mitgliedern auf der Community-Seite und der Raum-Liste angezeigt werden?", + "Show these rooms to non-members on the community page and room list?": "Sollen diese Räume Nicht-Mitgliedern auf der Community-Seite und in der Raum-Liste angezeigt werden?", "

HTML for your community's page

\n

\n Use the long description to introduce new members to the community, or distribute\n some important links\n

\n

\n You can even use 'img' tags\n

\n": "

HTML für deine Community-Seite

\n

\n Nutze die ausführliche Beschreibung, um neuen Mitgliedern diese Community vorzustellen\n oder um wichtige Links bereitzustellen.\n

\n

\n Du kannst sogar 'img'-Tags (HTML) verwenden\n

\n", "Your community hasn't got a Long Description, a HTML page to show to community members.
Click here to open settings and give it one!": "Deine Community hat noch keine ausführliche Beschreibung, d. h. eine HTML-Seite, die Community-Mitgliedern angezeigt wird.
Hier klicken, um die Einstellungen zu öffnen und eine Beschreibung zu erstellen!", "Custom of %(powerLevel)s": "benutzerdefiniert mit Wert %(powerLevel)s" From 07addbe1e025bbf6dc2abcb6f0aecfaed29830e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Tue, 14 Nov 2017 14:39:32 +0000 Subject: [PATCH 024/289] Translated using Weblate (Slovak) Currently translated at 99.7% (931 of 933 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sk/ --- src/i18n/strings/sk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index 7a38caec82..329af0e0a9 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -105,7 +105,7 @@ "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 pre %(displayName)s.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s prijal pozvanie do %(displayName)s.", "%(targetName)s accepted an invitation.": "%(targetName)s prijal pozvanie.", "%(senderName)s requested a VoIP conference.": "%(senderName)s požiadal o VoIP konferenciu.", "%(senderName)s invited %(targetName)s.": "%(senderName)s pozval %(targetName)s.", From 3a6e89584ce78824a6782744d10ca1c3820225d3 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Tue, 14 Nov 2017 20:32:13 +0000 Subject: [PATCH 025/289] Translated using Weblate (Hungarian) Currently translated at 100.0% (933 of 933 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 8a30c176b3..b6cebfc403 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1005,5 +1005,7 @@ "Sign in to get started": "Az induláshoz jelentkezz be", "Status.im theme": "Állapot.im téma", "Please note you are logging into the %(hs)s server, not matrix.org.": "Figyelem, a %(hs)s szerverre jelentkezel be és nem a matrix.org szerverre.", - "Username on %(hs)s": "Felhasználónév a %(hs)s szerveren" + "Username on %(hs)s": "Felhasználónév a %(hs)s szerveren", + "Restricted": "Korlátozott", + "Custom of %(powerLevel)s": "Egyedi beállítás: %(powerLevel)s" } From 955362ee2d38f31cf8d506140bb00341d1d8bb50 Mon Sep 17 00:00:00 2001 From: Bamstam Date: Wed, 15 Nov 2017 00:16:05 +0000 Subject: [PATCH 026/289] Translated using Weblate (German) Currently translated at 99.4% (929 of 934 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index f6a9e00507..6102fc884b 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1002,5 +1002,6 @@ "Show these rooms to non-members on the community page and room list?": "Sollen diese Räume Nicht-Mitgliedern auf der Community-Seite und in der Raum-Liste angezeigt werden?", "

HTML for your community's page

\n

\n Use the long description to introduce new members to the community, or distribute\n some important links\n

\n

\n You can even use 'img' tags\n

\n": "

HTML für deine Community-Seite

\n

\n Nutze die ausführliche Beschreibung, um neuen Mitgliedern diese Community vorzustellen\n oder um wichtige Links bereitzustellen.\n

\n

\n Du kannst sogar 'img'-Tags (HTML) verwenden\n

\n", "Your community hasn't got a Long Description, a HTML page to show to community members.
Click here to open settings and give it one!": "Deine Community hat noch keine ausführliche Beschreibung, d. h. eine HTML-Seite, die Community-Mitgliedern angezeigt wird.
Hier klicken, um die Einstellungen zu öffnen und eine Beschreibung zu erstellen!", - "Custom of %(powerLevel)s": "benutzerdefiniert mit Wert %(powerLevel)s" + "Custom of %(powerLevel)s": "benutzerdefiniert mit Wert %(powerLevel)s", + "Username on %(hs)s": "Benutzername auf %(hs)s" } From a226a4997be92c5debe67338f8d09b0d32c8082f Mon Sep 17 00:00:00 2001 From: Szimszon Date: Tue, 14 Nov 2017 20:33:16 +0000 Subject: [PATCH 027/289] Translated using Weblate (Hungarian) Currently translated at 100.0% (934 of 934 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 b6cebfc403..3cc3f3e9cd 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1007,5 +1007,6 @@ "Please note you are logging into the %(hs)s server, not matrix.org.": "Figyelem, a %(hs)s szerverre jelentkezel be és nem a matrix.org szerverre.", "Username on %(hs)s": "Felhasználónév a %(hs)s szerveren", "Restricted": "Korlátozott", - "Custom of %(powerLevel)s": "Egyedi beállítás: %(powerLevel)s" + "Custom of %(powerLevel)s": "Egyedi beállítás: %(powerLevel)s", + "Presence Management": "Jelenlét menedzsment" } From 63919befd0aad8772507765a382feb7f6a6e9e27 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 15 Nov 2017 10:49:29 +0000 Subject: [PATCH 028/289] Catch call failures due to unknown devices And show a specific dialog that you can then launch the UDD from (although currently with a 'Send Anyway' button which makes little sense for VoIP) --- src/CallHandler.js | 27 ++++++++++++++- src/components/structures/RoomStatusBar.js | 30 +++-------------- src/cryptodevices.js | 39 ++++++++++++++++++++++ src/i18n/strings/en_EN.json | 5 ++- 4 files changed, 73 insertions(+), 28 deletions(-) create mode 100644 src/cryptodevices.js diff --git a/src/CallHandler.js b/src/CallHandler.js index e2241a4955..66a84bafa7 100644 --- a/src/CallHandler.js +++ b/src/CallHandler.js @@ -59,6 +59,7 @@ import sdk from './index'; import { _t } from './languageHandler'; import Matrix from 'matrix-js-sdk'; import dis from './dispatcher'; +import { getUnknownDevicesForRoom } from './cryptodevices'; global.mxCalls = { //room_id: MatrixCall @@ -104,6 +105,31 @@ function _setCallListeners(call) { console.error(err.stack); call.hangup(); _setCallState(undefined, call.roomId, "ended"); + if (err.code === 'unknown_devices') { + const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); + + Modal.createTrackedDialog('Call Failed', '', QuestionDialog, { + title: _t('Call Failed'), + description: _t( + "There are unknown devices in this room: "+ + "if you proceed without verifying them, it will be "+ + "possible for someone to eavesdrop on your call" + ), + button: _t('Review Devices'), + onFinished: function(confirmed) { + if (confirmed) { + const room = MatrixClientPeg.get().getRoom(call.roomId); + getUnknownDevicesForRoom(MatrixClientPeg.get(), room).then((unknownDevices) => { + const UnknownDeviceDialog = sdk.getComponent('dialogs.UnknownDeviceDialog'); + Modal.createTrackedDialog('Unknown Device Dialog', '', UnknownDeviceDialog, { + room: room, + devices: unknownDevices, + }, 'mx_Dialog_unknownDevice'); + }); + } + }, + }); + } }); call.on("hangup", function() { _setCallState(undefined, call.roomId, "ended"); @@ -171,7 +197,6 @@ function _setCallState(call, roomId, status) { function _onAction(payload) { function placeCall(newCall) { _setCallListeners(newCall); - _setCallState(newCall, newCall.roomId, "ringback"); if (payload.type === 'voice') { newCall.placeVoiceCall(); } else if (payload.type === 'video') { diff --git a/src/components/structures/RoomStatusBar.js b/src/components/structures/RoomStatusBar.js index 30f6f3ee2a..4c45fd09a4 100644 --- a/src/components/structures/RoomStatusBar.js +++ b/src/components/structures/RoomStatusBar.js @@ -24,6 +24,7 @@ import MatrixClientPeg from '../../MatrixClientPeg'; import MemberAvatar from '../views/avatars/MemberAvatar'; import Resend from '../../Resend'; import Modal from '../../Modal'; +import { getUnknownDevicesForRoom } from '../../cryptodevices'; const HIDE_DEBOUNCE_MS = 10000; const STATUS_BAR_HIDDEN = 0; @@ -157,7 +158,9 @@ module.exports = React.createClass({ }, _onShowDevicesClick: function() { - this._getUnknownDevices().then((unknownDevices) => { + getUnknownDevicesForRoom(MatrixClientPeg.get(), this.props.room).then((unknownDevices) => { + if (this._unmounted) return; + const UnknownDeviceDialog = sdk.getComponent('dialogs.UnknownDeviceDialog'); Modal.createTrackedDialog('Unknown Device Dialog', '', UnknownDeviceDialog, { room: this.props.room, @@ -166,31 +169,6 @@ module.exports = React.createClass({ }); }, - _getUnknownDevices: function() { - const roomMembers = this.props.room.getJoinedMembers().map((m) => { - return m.userId; - }); - return MatrixClientPeg.get().downloadKeys(roomMembers, false).then((devices) => { - if (this._unmounted) return; - - const unknownDevices = {}; - // This is all devices in this room, so find the unknown ones. - Object.keys(devices).forEach((userId) => { - Object.keys(devices[userId]).map((deviceId) => { - const device = devices[userId][deviceId]; - - if (device.isUnverified() && !device.isKnown()) { - if (unknownDevices[userId] === undefined) { - unknownDevices[userId] = {}; - } - unknownDevices[userId][deviceId] = device; - } - }); - }); - return unknownDevices; - }); - }, - onRoomLocalEchoUpdated: function(event, room, oldEventId, oldStatus) { if (room.roomId !== this.props.room.roomId) return; diff --git a/src/cryptodevices.js b/src/cryptodevices.js new file mode 100644 index 0000000000..d580e6f7f2 --- /dev/null +++ b/src/cryptodevices.js @@ -0,0 +1,39 @@ +/* +Copyright 2017 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. +*/ + +export function getUnknownDevicesForRoom(matrixClient, room) { + const roomMembers = room.getJoinedMembers().map((m) => { + return m.userId; + }); + return matrixClient.downloadKeys(roomMembers, false).then((devices) => { + const unknownDevices = {}; + // This is all devices in this room, so find the unknown ones. + Object.keys(devices).forEach((userId) => { + Object.keys(devices[userId]).map((deviceId) => { + const device = devices[userId][deviceId]; + + if (device.isUnverified() && !device.isKnown()) { + if (unknownDevices[userId] === undefined) { + unknownDevices[userId] = {}; + } + unknownDevices[userId][deviceId] = device; + } + }); + }); + return unknownDevices; + }); +} + diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index b83600ffb6..28ac9281f4 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2,6 +2,9 @@ "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", "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", + "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 Timeout": "Call Timeout", "The remote side failed to pick up": "The remote side failed to pick up", "Unable to capture screen": "Unable to capture screen", @@ -150,7 +153,6 @@ "%(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", - "Communities": "Communities", "Message Pinning": "Message Pinning", "%(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", @@ -524,6 +526,7 @@ "Unverify": "Unverify", "Verify...": "Verify...", "No results": "No results", + "Communities": "Communities", "Home": "Home", "Integrations Error": "Integrations Error", "Could not connect to the integration server": "Could not connect to the integration server", From 93800be7425d1001851806939017312baab61961 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 15 Nov 2017 15:14:42 +0000 Subject: [PATCH 029/289] Factor out showing UnknownDeviceDialog So we can re-use it for calls that fail due to unknwon devices --- src/components/structures/RoomStatusBar.js | 14 ++------ .../views/dialogs/UnknownDeviceDialog.js | 35 +++++++------------ src/cryptodevices.js | 32 +++++++++++++++++ 3 files changed, 46 insertions(+), 35 deletions(-) diff --git a/src/components/structures/RoomStatusBar.js b/src/components/structures/RoomStatusBar.js index 4c45fd09a4..7443ff35cc 100644 --- a/src/components/structures/RoomStatusBar.js +++ b/src/components/structures/RoomStatusBar.js @@ -23,8 +23,7 @@ import WhoIsTyping from '../../WhoIsTyping'; import MatrixClientPeg from '../../MatrixClientPeg'; import MemberAvatar from '../views/avatars/MemberAvatar'; import Resend from '../../Resend'; -import Modal from '../../Modal'; -import { getUnknownDevicesForRoom } from '../../cryptodevices'; +import { getUnknownDevicesForRoom, showUnknownDeviceDialogForMessages } from '../../cryptodevices'; const HIDE_DEBOUNCE_MS = 10000; const STATUS_BAR_HIDDEN = 0; @@ -158,15 +157,7 @@ module.exports = React.createClass({ }, _onShowDevicesClick: function() { - getUnknownDevicesForRoom(MatrixClientPeg.get(), this.props.room).then((unknownDevices) => { - if (this._unmounted) return; - - const UnknownDeviceDialog = sdk.getComponent('dialogs.UnknownDeviceDialog'); - Modal.createTrackedDialog('Unknown Device Dialog', '', UnknownDeviceDialog, { - room: this.props.room, - devices: unknownDevices, - }, 'mx_Dialog_unknownDevice'); - }); + showUnknownDeviceDialogForMessages(MatrixClientPeg.get(), this.props.room); }, onRoomLocalEchoUpdated: function(event, room, oldEventId, oldStatus) { @@ -414,7 +405,6 @@ module.exports = React.createClass({ return null; }, - render: function() { const content = this._getContent(); const indicator = this._getIndicator(this.state.usersTyping.length > 0); diff --git a/src/components/views/dialogs/UnknownDeviceDialog.js b/src/components/views/dialogs/UnknownDeviceDialog.js index fac29fd37c..2e89459164 100644 --- a/src/components/views/dialogs/UnknownDeviceDialog.js +++ b/src/components/views/dialogs/UnknownDeviceDialog.js @@ -16,6 +16,7 @@ limitations under the License. */ import React from 'react'; +import PropTypes from 'prop-types'; import sdk from '../../../index'; import MatrixClientPeg from '../../../MatrixClientPeg'; import GeminiScrollbar from 'react-gemini-scrollbar'; @@ -39,10 +40,10 @@ function DeviceListEntry(props) { } DeviceListEntry.propTypes = { - userId: React.PropTypes.string.isRequired, + userId: PropTypes.string.isRequired, // deviceinfo - device: React.PropTypes.object.isRequired, + device: PropTypes.object.isRequired, }; @@ -62,10 +63,10 @@ function UserUnknownDeviceList(props) { } UserUnknownDeviceList.propTypes = { - userId: React.PropTypes.string.isRequired, + userId: PropTypes.string.isRequired, // map from deviceid -> deviceinfo - userDevices: React.PropTypes.object.isRequired, + userDevices: PropTypes.object.isRequired, }; @@ -84,7 +85,7 @@ function UnknownDeviceList(props) { UnknownDeviceList.propTypes = { // map from userid -> deviceid -> deviceinfo - devices: React.PropTypes.object.isRequired, + devices: PropTypes.object.isRequired, }; @@ -92,22 +93,12 @@ export default React.createClass({ displayName: 'UnknownDeviceDialog', propTypes: { - room: React.PropTypes.object.isRequired, + room: PropTypes.object.isRequired, // map from userid -> deviceid -> deviceinfo - devices: React.PropTypes.object.isRequired, - onFinished: React.PropTypes.func.isRequired, - }, - - _onSendAnywayClicked: function() { - // Mark the devices as known so messages get encrypted to them - Object.keys(this.props.devices).forEach((userId) => { - Object.keys(this.props.devices[userId]).map((deviceId) => { - MatrixClientPeg.get().setDeviceKnown(userId, deviceId, true); - }); - }); - this.props.onFinished(); - Resend.resendUnsentEvents(this.props.room); + devices: PropTypes.object.isRequired, + onFinished: PropTypes.func.isRequired, + sendAnywayButton: PropTypes.node, }, _onDismissClicked: function() { @@ -115,7 +106,7 @@ export default React.createClass({ }, render: function() { - if (this.state.devices === null) { + if (this.props.devices === null) { const Spinner = sdk.getComponent("elements.Spinner"); return ; } @@ -156,9 +147,7 @@ export default React.createClass({
- + {this.props.sendAnywayButton} + ), + }, 'mx_Dialog_unknownDevice'); + }); +} + +function markAllDevicesKnown(matrixClient, devices) { + Object.keys(devices).forEach((userId) => { + Object.keys(devices[userId]).map((deviceId) => { + matrixClient.setDeviceKnown(userId, deviceId, true); + }); + }); +} From aeca83ff2eca5ebd97632fe071531ddc3effda3d Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 15 Nov 2017 15:20:45 +0000 Subject: [PATCH 030/289] Unused import --- src/components/structures/RoomStatusBar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/RoomStatusBar.js b/src/components/structures/RoomStatusBar.js index 7443ff35cc..eabeef7a04 100644 --- a/src/components/structures/RoomStatusBar.js +++ b/src/components/structures/RoomStatusBar.js @@ -23,7 +23,7 @@ import WhoIsTyping from '../../WhoIsTyping'; import MatrixClientPeg from '../../MatrixClientPeg'; import MemberAvatar from '../views/avatars/MemberAvatar'; import Resend from '../../Resend'; -import { getUnknownDevicesForRoom, showUnknownDeviceDialogForMessages } from '../../cryptodevices'; +import { showUnknownDeviceDialogForMessages } from '../../cryptodevices'; const HIDE_DEBOUNCE_MS = 10000; const STATUS_BAR_HIDDEN = 0; From 648be26fb7618df081342e39f3a9c9d22c6eadf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Wed, 15 Nov 2017 16:27:03 +0000 Subject: [PATCH 031/289] Translated using Weblate (French) Currently translated at 100.0% (932 of 932 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 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index f252786732..cc6f500820 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1003,5 +1003,11 @@ "Please note you are logging into the %(hs)s server, not matrix.org.": "Veuillez noter que vous vous connecter au serveur %(hs)s, pas à matrix.org.", "Username on %(hs)s": "Nom d'utilisateur sur %(hs)s", "Restricted": "Restreint", - "Custom of %(powerLevel)s": "Personnalisé de %(powerLevel)s" + "Custom of %(powerLevel)s": "Personnalisé de %(powerLevel)s", + "Presence Management": "Gestion de présence", + "Hide avatar changes": "Masquer les changements d'avatar", + "Hide display name changes": "Masquer les changements de nom affiché", + "Enable inline URL previews by default": "Activer l'aperçu des URL par défaut", + "Enable URL previews for this room (only affects you)": "Activer l'aperçu des URL pour ce salon (n'affecte que vous)", + "Enable URL previews by default for participants in this room": "Activer l'aperçu des URL par défaut pour les participants de ce salon" } From b0027525f3bca80c30044d922333eb7ce8a6ef40 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 15 Nov 2017 17:21:04 +0000 Subject: [PATCH 032/289] Wire up Unknown Devices popup for outbound calls --- src/CallHandler.js | 38 ++++++++--- .../views/dialogs/UnknownDeviceDialog.js | 11 +++- src/cryptodevices.js | 24 +++++-- src/i18n/strings/en_EN.json | 66 +++++++++---------- 4 files changed, 92 insertions(+), 47 deletions(-) diff --git a/src/CallHandler.js b/src/CallHandler.js index c61794a940..eba1c9995e 100644 --- a/src/CallHandler.js +++ b/src/CallHandler.js @@ -1,5 +1,6 @@ /* Copyright 2015, 2016 OpenMarket Ltd +Copyright 2017 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. @@ -60,6 +61,7 @@ import Matrix from 'matrix-js-sdk'; import dis from './dispatcher'; import { getUnknownDevicesForRoom } from './cryptodevices'; import SettingsStore from "./settings/SettingsStore"; +import { showUnknownDeviceDialogForCalls } from './cryptodevices'; global.mxCalls = { //room_id: MatrixCall @@ -99,6 +101,18 @@ function pause(audioId) { } } +function _reAttemptCall(call) { + if (call.direction === 'outbound') { + dis.dispatch({ + action: 'place_call', + room_id: call.roomId, + type: call.type, + }); + } else { + call.answer(); + } +} + function _setCallListeners(call) { call.on("error", function(err) { console.error("Call error: %s", err); @@ -113,22 +127,30 @@ function _setCallListeners(call) { description: _t( "There are unknown devices in this room: "+ "if you proceed without verifying them, it will be "+ - "possible for someone to eavesdrop on your call" + "possible for someone to eavesdrop on your call." ), button: _t('Review Devices'), onFinished: function(confirmed) { if (confirmed) { const room = MatrixClientPeg.get().getRoom(call.roomId); - getUnknownDevicesForRoom(MatrixClientPeg.get(), room).then((unknownDevices) => { - const UnknownDeviceDialog = sdk.getComponent('dialogs.UnknownDeviceDialog'); - Modal.createTrackedDialog('Unknown Device Dialog', '', UnknownDeviceDialog, { - room: room, - devices: unknownDevices, - }, 'mx_Dialog_unknownDevice'); - }); + showUnknownDeviceDialogForCalls( + MatrixClientPeg.get(), + room, + () => { + _reAttemptCall(call); + }, + call.direction === 'outbound' ? _t("Call Anyway") : _t("Answer Anyway"), + ); } }, }); + } else { + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + + Modal.createTrackedDialog('Call Failed', '', ErrorDialog, { + title: _t('Call Failed'), + description: err.message, + }); } }); call.on("hangup", function() { diff --git a/src/components/views/dialogs/UnknownDeviceDialog.js b/src/components/views/dialogs/UnknownDeviceDialog.js index 2e89459164..d3f26d7536 100644 --- a/src/components/views/dialogs/UnknownDeviceDialog.js +++ b/src/components/views/dialogs/UnknownDeviceDialog.js @@ -98,13 +98,19 @@ export default React.createClass({ // map from userid -> deviceid -> deviceinfo devices: PropTypes.object.isRequired, onFinished: PropTypes.func.isRequired, - sendAnywayButton: PropTypes.node, + sendAnywayLabel: PropTypes.string.isRequired, + onSendAnyway: PropTypes.func.isRequired, }, _onDismissClicked: function() { this.props.onFinished(); }, + _onSendAnywayClicked: function() { + this.props.onFinished(); + this.props.onSendAnyway(); + }, + render: function() { if (this.props.devices === null) { const Spinner = sdk.getComponent("elements.Spinner"); @@ -148,6 +154,9 @@ export default React.createClass({
{this.props.sendAnywayButton} + - ), + sendAnywayLabel: _t("Send anyway"), + onSendAnyway: onSendAnywayClicked, + }, 'mx_Dialog_unknownDevice'); + }); +} + +export function showUnknownDeviceDialogForCalls(matrixClient, room, sendAnyway, sendAnywayLabel) { + getUnknownDevicesForRoom(matrixClient, room).then((unknownDevices) => { + const onSendAnywayClicked = () => { + markAllDevicesKnown(matrixClient, unknownDevices); + sendAnyway(); + }; + + const UnknownDeviceDialog = sdk.getComponent('dialogs.UnknownDeviceDialog'); + Modal.createTrackedDialog('Unknown Device Dialog', '', UnknownDeviceDialog, { + room: room, + devices: unknownDevices, + sendAnywayLabel: sendAnywayLabel, + onSendAnyway: onSendAnywayClicked, }, 'mx_Dialog_unknownDevice'); }); } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 46646aca83..05143e96b1 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -3,8 +3,10 @@ "This phone number is already in use": "This phone number is already in use", "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", "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 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 Timeout": "Call Timeout", "The remote side failed to pick up": "The remote side failed to pick up", "Unable to capture screen": "Unable to capture screen", @@ -153,24 +155,44 @@ "%(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", - "Message Pinning": "Message Pinning", - "Presence Management": "Presence Management", "%(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", "Failure to create room": "Failure to create room", "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", + "Send anyway": "Send anyway", "Unnamed Room": "Unnamed Room", "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?", "Failed to join room": "Failed to join room", + "Message Pinning": "Message Pinning", + "Presence Management": "Presence Management", + "Disable Emoji suggestions while typing": "Disable Emoji suggestions while typing", + "Use compact timeline layout": "Use compact timeline layout", + "Hide removed messages": "Hide removed messages", + "Hide join/leave messages (invites/kicks/bans unaffected)": "Hide join/leave messages (invites/kicks/bans unaffected)", "Hide avatar changes": "Hide avatar changes", "Hide display name changes": "Hide display name changes", + "Hide read receipts": "Hide read receipts", + "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", + "Enable automatic language detection for syntax highlighting": "Enable automatic language detection for syntax highlighting", + "Hide avatars in user and room mentions": "Hide avatars in user and room mentions", + "Disable big emoji in chat": "Disable big emoji in chat", + "Don't send typing notifications": "Don't send typing notifications", + "Automatically replace plain text Emoji": "Automatically replace plain text Emoji", + "Mirror local video feed": "Mirror local video feed", + "Disable Peer-to-Peer for 1:1 calls": "Disable Peer-to-Peer for 1:1 calls", + "Opt out of analytics": "Opt out of analytics", + "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", "Active call (%(roomName)s)": "Active call (%(roomName)s)", "unknown caller": "unknown caller", "Incoming voice call from %(name)s": "Incoming voice call from %(name)s", @@ -211,9 +233,6 @@ "Delete": "Delete", "Disable Notifications": "Disable Notifications", "Enable Notifications": "Enable Notifications", - "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": "URL Previews", "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", @@ -381,7 +400,6 @@ "Devices will not yet be able to decrypt history from before they joined the room": "Devices will not yet be able to decrypt history from before they joined the room", "Once encryption is enabled for a room it cannot be turned off again (for now)": "Once encryption is enabled for a room it cannot be turned off again (for now)", "Encrypted messages will not be visible on clients that do not yet implement encryption": "Encrypted messages will not be visible on clients that do not yet implement encryption", - "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 encryption": "Enable encryption", "(warning: cannot be disabled again!)": "(warning: cannot be disabled again!)", "Encryption is enabled in this room": "Encryption is enabled in this room", @@ -407,7 +425,6 @@ "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)", - "Room Colour": "Room Colour", "Permissions": "Permissions", "The default role for new room members is": "The default role for new room members is", "To send messages, you must be a": "To send messages, you must be a", @@ -441,6 +458,9 @@ "Related communities for this room:": "Related communities for this room:", "This room has no related communities": "This room has no related communities", "New community ID (e.g. +foo:%(localDomain)s)": "New community ID (e.g. +foo:%(localDomain)s)", + "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": "URL Previews", "Error decrypting audio": "Error decrypting audio", "Error decrypting attachment": "Error decrypting attachment", "Decrypt %(text)s": "Decrypt %(text)s", @@ -477,6 +497,7 @@ "Please enter the code it contains:": "Please enter the code it contains:", "Start authentication": "Start authentication", "powered by Matrix": "powered by Matrix", + "Username on %(hs)s": "Username on %(hs)s", "User name": "User name", "Mobile phone number": "Mobile phone number", "Forgot your password?": "Forgot your password?", @@ -484,7 +505,6 @@ "Sign in with": "Sign in with", "Email address": "Email address", "Sign in": "Sign in", - "Sign in to get started": "Sign in to get started", "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?", "Email address (optional)": "Email address (optional)", "You are registering with %(SelectedTeamName)s": "You are registering with %(SelectedTeamName)s", @@ -664,7 +684,6 @@ "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", - "Send anyway": "Send anyway", "Private Chat": "Private Chat", "Public Chat": "Public Chat", "Custom": "Custom", @@ -765,25 +784,9 @@ "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", - "Autoplay GIFs and videos": "Autoplay GIFs and videos", - "Hide read receipts": "Hide read receipts", - "Don't send typing notifications": "Don't send typing notifications", - "Always show message timestamps": "Always show message timestamps", - "Show timestamps in 12 hour format (e.g. 2:30pm)": "Show timestamps in 12 hour format (e.g. 2:30pm)", - "Hide join/leave messages (invites/kicks/bans unaffected)": "Hide join/leave messages (invites/kicks/bans unaffected)", - "Use compact timeline layout": "Use compact timeline layout", - "Hide removed messages": "Hide removed messages", - "Enable automatic language detection for syntax highlighting": "Enable automatic language detection for syntax highlighting", - "Automatically replace plain text Emoji": "Automatically replace plain text Emoji", - "Disable Emoji suggestions while typing": "Disable Emoji suggestions while typing", - "Hide avatars in user and room mentions": "Hide avatars in user and room mentions", - "Disable big emoji in chat": "Disable big emoji in chat", - "Mirror local video feed": "Mirror local video feed", - "Opt out of analytics": "Opt out of analytics", - "Disable Peer-to-Peer for 1:1 calls": "Disable Peer-to-Peer for 1:1 calls", - "Never send encrypted messages to unverified devices from this device": "Never send encrypted messages to unverified devices from this device", "Light theme": "Light theme", "Dark theme": "Dark theme", + "Status.im theme": "Status.im theme", "Can't load user settings": "Can't load user settings", "Server may be unavailable or overloaded": "Server may be unavailable or overloaded", "Sign out": "Sign out", @@ -798,7 +801,6 @@ "Interface Language": "Interface Language", "User Interface": "User Interface", "Autocomplete Delay (ms):": "Autocomplete Delay (ms):", - "Disable inline URL previews by default": "Disable inline URL previews by default", "": "", "Import E2E room keys": "Import E2E room keys", "Cryptography": "Cryptography", @@ -863,6 +865,7 @@ "Create an account": "Create an account", "This Home Server does not support login using email address.": "This Home Server does not support login using email address.", "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.", "Guest access is disabled on this Home Server.": "Guest access is disabled on this Home Server.", "The phone number entered looks invalid": "The phone number entered looks invalid", "Error: Problem communicating with the given homeserver.": "Error: Problem communicating with the given homeserver.", @@ -870,7 +873,7 @@ "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.", "Sorry, this homeserver is using a login which is not recognised ": "Sorry, this homeserver is using a login which is not recognised ", "Login as guest": "Login as guest", - "Return to app": "Return to app", + "Sign in to get started": "Sign in to get started", "Failed to fetch avatar URL": "Failed to fetch avatar URL", "Set a display name:": "Set a display name:", "Upload an avatar:": "Upload an avatar:", @@ -932,8 +935,5 @@ "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", - "Status.im theme": "Status.im theme", - "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.", - "Username on %(hs)s": "Username on %(hs)s" + "Import": "Import" } From 1f1ca152193e28e76b69cb9b34124c6c07d7d63b Mon Sep 17 00:00:00 2001 From: Bamstam Date: Wed, 15 Nov 2017 18:24:20 +0000 Subject: [PATCH 033/289] Translated using Weblate (German) Currently translated at 98.9% (922 of 932 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 | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 6102fc884b..6d4ef41132 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -124,7 +124,7 @@ "Phone": "Telefon", "Please check your email and click on the link it contains. Once this is done, click continue.": "Bitte prüfe deinen E-Mail-Posteingang und klicke auf den in der E-Mail enthaltenen Link. Anschließend auf \"Fortsetzen\" klicken.", "Privacy warning": "Datenschutzwarnung", - "Privileged Users": "Privilegierte Nutzer", + "Privileged Users": "Privilegierte Benutzer", "Profile": "Profil", "Refer a friend to Riot:": "Freunde zu Riot einladen:", "Once you've followed the link it contains, click below": "Nachdem du dem darin enthaltenen Link gefolgt bist, klicke unten", @@ -310,7 +310,7 @@ "Usage": "Verwendung", "Use with caution": "Mit Vorsicht zu verwenden", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s hat die Einladung für %(targetName)s zurückgezogen.", - "You need to be able to invite users to do that.": "Du musst die Berechtigung haben, Nutzer einzuladen, um diese Aktion ausführen zu können.", + "You need to be able to invite users to do that.": "Du musst die Berechtigung haben, Benutzer einzuladen, um diese Aktion ausführen zu können.", "You need to be logged in.": "Du musst angemeldet sein.", "There are no visible files in this room": "Es gibt keine sichtbaren Dateien in diesem Raum", "Connectivity to the server has been lost.": "Verbindung zum Server wurde unterbrochen.", @@ -390,7 +390,7 @@ "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?", - "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Du wirst diese Änderung nicht rückgängig machen können, da der Nutzer dasselbe Berechtigungslevel wie du selbst erhalten wird.", + "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Du wirst diese Änderung nicht rückgängig machen können, da der Benutzer dasselbe Berechtigungslevel wie du selbst erhalten wird.", "Make Moderator": "Zum Moderator ernennen", "Room": "Raum", "Cancel": "Abbrechen", @@ -541,7 +541,7 @@ "Error decrypting video": "Video-Entschlüsselung fehlgeschlagen", "Import room keys": "Raum-Schlüssel importieren", "File to import": "Zu importierende Datei", - "Failed to invite the following users to the %(roomName)s room:": "Das Einladen der folgenden Nutzer in den Raum \"%(roomName)s\" ist fehlgeschlagen:", + "Failed to invite the following users to the %(roomName)s room:": "Das Einladen der folgenden Benutzer in den Raum \"%(roomName)s\" ist fehlgeschlagen:", "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.": "Bist du sicher, dass du dieses Ereignis entfernen (löschen) möchtest? Wenn du die Änderung eines Raum-Namens oder eines Raum-Themas löscht, kann dies dazu führen, dass die ursprüngliche Änderung rückgängig gemacht wird.", "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.": "Dieser Prozess erlaubt es dir, die Schlüssel für die in verschlüsselten Räumen empfangenen Nachrichten in eine lokale Datei zu exportieren. In Zukunft wird es möglich sein, diese Datei in einen anderen Matrix-Client zu importieren, sodass dieser Client diese Nachrichten ebenfalls entschlüsseln kann.", "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.": "Mit der exportierten Datei kann jeder, der diese Datei lesen kann, jede verschlüsselte Nachricht entschlüsseln, die für dich lesbar ist. Du solltest die Datei also unbedingt sicher verwahren. Um den Vorgang sicherer zu gestalten, solltest du unten eine Passphrase eingeben, die dazu verwendet wird, die exportierten Daten zu verschlüsseln. Anschließend wird es nur möglich sein, die Daten zu importieren, wenn dieselbe Passphrase verwendet wird.", @@ -559,7 +559,7 @@ " (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.", "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Dies wird dein Benutzerkonto dauerhaft unbenutzbar machen. Du wirst nicht in der Lage sein, dich mit derselben Benutzer-ID erneut zu registrieren.", - "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 Telefon-Anruf) und vergewissere dich, dass der Schlüssel, den der Eigentümer in den Nutzer-Einstellungen für dieses Gerät sieht, mit dem folgenden Schlüssel identisch ist:", + "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.", "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Bei der Wiederherstellung deiner letzten Sitzung ist ein Fehler aufgetreten. Um fortzufahren, musst du dich erneut anmelden. Ein zuvor verschlüsselter Chatverlauf wird in der Folge nicht mehr lesbar sein.", "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.", @@ -616,7 +616,7 @@ "Save": "Speichern", "Tagged as: ": "Markiert als: ", "This Home Server does not support login using email address.": "Dieser Heimserver unterstützt den Login mittels E-Mail-Adresse nicht.", - "Unknown (user, device) pair:": "Unbekanntes (Nutzer-/Gerät-)Paar:", + "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:", @@ -649,7 +649,7 @@ "Start Chatting": "Starte Gespräche", "Click on the button below to start chatting!": "Unten auf den Button klicken, um einen Chat zu beginnen!", "Create a new chat or reuse an existing one": "Neuen Chat erstellen oder einen vorhandenen Chat fortsetzen", - "You already have existing direct chats with this user:": "Du hast bereits direkte Chats mit diesem Nutzer:", + "You already have existing direct chats with this user:": "Du hast bereits existierende direkte Chats mit diesem Benutzer:", "Username available": "Benutzername ist verfügbar", "Username not available": "Benutzername ist nicht verfügbar", "Something went wrong!": "Etwas ging schief!", @@ -752,11 +752,11 @@ "Unbans user with given id": "Verbannung aufheben für Benutzer mit angegebener ID", "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 keine Berechtigung, dies in diesem Raum zu tun.", - "Verifies a user, device, and pubkey tuple": "Verifiziert ein Tupel aus Nutzer, Gerät und öffentlichem Schlüssel", + "Verifies a user, device, and pubkey tuple": "Verifiziert ein Tupel aus Benutzer, Gerät und öffentlichem Schlüssel", "Autocomplete Delay (ms):": "Verzögerung bei Autovervollständigung (ms):", "Loading device info...": "Lädt Geräte-Info...", "Example": "Beispiel", - "Create": "Erstelle", + "Create": "Erstellen", "Room creation failed": "Raum-Erstellung fehlgeschlagen", "Featured Rooms:": "Hervorgehobene Räume:", "Featured Users:": "Hervorgehobene Benutzer:", From 45a90ef038e9a63d675d8a70434581247f9c17b7 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 15 Nov 2017 16:40:07 +0000 Subject: [PATCH 034/289] Translated using Weblate (Russian) Currently translated at 98.3% (917 of 932 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index d46076e2ff..db4174ec0d 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -990,5 +990,12 @@ "Sign in to get started": "Войдите, чтобы начать", "Visibility in Room List": "Видимость в списке комнат", "Visible to everyone": "Видимый для всех", - "Only visible to community members": "Только участникам сообщества" + "Only visible to community members": "Только участникам сообщества", + "Presence Management": "Управление присутствием", + "Hide avatar changes": "Скрыть изменения аватара", + "Hide display name changes": "Скрыть изменения отображаемого имени", + "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-адресов по умолчанию для участников этой комнаты", + "Status.im theme": "Тема status.im" } From 0596925a8632ce6bd5e9f304f43a98a5f0fd1b01 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Wed, 15 Nov 2017 19:05:05 +0000 Subject: [PATCH 035/289] Translated using Weblate (Hungarian) Currently translated at 100.0% (932 of 932 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 3cc3f3e9cd..7b57d306fd 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1008,5 +1008,10 @@ "Username on %(hs)s": "Felhasználónév a %(hs)s szerveren", "Restricted": "Korlátozott", "Custom of %(powerLevel)s": "Egyedi beállítás: %(powerLevel)s", - "Presence Management": "Jelenlét menedzsment" + "Presence Management": "Jelenlét menedzsment", + "Hide avatar changes": "Avatar változások elrejtése", + "Hide display name changes": "Név változások elrejtése", + "Enable inline URL previews by default": "Beágyazott URL előnézetek alapértelmezett engedélyezése", + "Enable URL previews for this room (only affects you)": "URL előnézet engedélyezése ebben a szobában (csak téged érint)", + "Enable URL previews by default for participants in this room": "URL előnézet alapértelmezett engedélyezése a szoba tagságának" } From af8ff1b88866aa392b94be5e2b3a0f59b76c8a24 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 16 Nov 2017 11:07:57 +0000 Subject: [PATCH 036/289] Don't blindly hangup on a call error. Not all errors means we want to send a hangup (in fact most don't, but the most notable being when we fail to answer a call: we should not then automatically reject it). --- src/CallHandler.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/CallHandler.js b/src/CallHandler.js index eba1c9995e..918f38976a 100644 --- a/src/CallHandler.js +++ b/src/CallHandler.js @@ -117,7 +117,6 @@ function _setCallListeners(call) { call.on("error", function(err) { console.error("Call error: %s", err); console.error(err.stack); - call.hangup(); _setCallState(undefined, call.roomId, "ended"); if (err.code === 'unknown_devices') { const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); From 843bdd6e13502d85a79ef197142664b64cd56346 Mon Sep 17 00:00:00 2001 From: Bamstam Date: Thu, 16 Nov 2017 00:25:51 +0000 Subject: [PATCH 037/289] Translated using Weblate (German) Currently translated at 99.5% (928 of 932 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 | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 6d4ef41132..9b7bc8f4a5 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -474,7 +474,7 @@ "Passwords can't be empty": "Passwortfelder dürfen nicht leer sein", "Report it": "Melden", "riot-web version:": "Version von riot-web:", - "Scroll to bottom of page": "Zum Ende der Seite springen", + "Scroll to bottom of page": "Zum Seitenende springen", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Zeitstempel im 12-Stunden-Format anzeigen (z. B. 2:30pm)", "Email address": "E-Mail-Adresse", "Error decrypting attachment": "Fehler beim Entschlüsseln des Anhangs", @@ -769,7 +769,7 @@ "Cannot add any more widgets": "Kann keine weiteren Widgets hinzufügen", "Do you want to load widget from URL:": "Möchtest du das Widget von folgender URL laden:", "Integrations Error": "Integrations-Error", - "NOTE: Apps are not end-to-end encrypted": "BEACHTE: Apps sind nicht Ende-zu-Ende verschlüsselt", + "NOTE: Apps are not end-to-end encrypted": "BEACHTE: Apps sind nicht Ende-zu-Ende-verschlüsselt", "%(widgetName)s widget added by %(senderName)s": "%(senderName)s hat das Widget %(widgetName)s hinzugefügt", "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s hat das Widget %(widgetName)s entfernt", "Robot check is currently unavailable on desktop - please use a web browser": "In der Desktop-Version kann derzeit nicht geprüft werden, ob ein Benutzer ein Roboter ist. Bitte einen Webbrowser verwenden", @@ -795,7 +795,7 @@ "Advanced options": "Erweiterte Optionen", "Block users on other matrix homeservers from joining this room": "Benutzer anderer Matrix-Heimserver das Betreten dieses Raumes verbieten", "This setting cannot be changed later!": "Diese Einstellung kann nachträglich nicht mehr geändert werden!", - "Unignore": "Entignorieren", + "Unignore": "Ignorieren aufheben", "User Options": "Benutzer-Optionen", "Unignored user": "Benutzer nicht mehr ignoriert", "Ignored user": "Benutzer ignoriert", @@ -1003,5 +1003,11 @@ "

HTML for your community's page

\n

\n Use the long description to introduce new members to the community, or distribute\n some important links\n

\n

\n You can even use 'img' tags\n

\n": "

HTML für deine Community-Seite

\n

\n Nutze die ausführliche Beschreibung, um neuen Mitgliedern diese Community vorzustellen\n oder um wichtige Links bereitzustellen.\n

\n

\n Du kannst sogar 'img'-Tags (HTML) verwenden\n

\n", "Your community hasn't got a Long Description, a HTML page to show to community members.
Click here to open settings and give it one!": "Deine Community hat noch keine ausführliche Beschreibung, d. h. eine HTML-Seite, die Community-Mitgliedern angezeigt wird.
Hier klicken, um die Einstellungen zu öffnen und eine Beschreibung zu erstellen!", "Custom of %(powerLevel)s": "benutzerdefiniert mit Wert %(powerLevel)s", - "Username on %(hs)s": "Benutzername auf %(hs)s" + "Username on %(hs)s": "Benutzername auf %(hs)s", + "Hide avatar changes": "Profilbild-Änderungen verbergen", + "Hide display name changes": "Anzeigenamen-Änderungen verbergen", + "Enable inline URL previews by default": "URL-Vorschau standardmäßig aktivieren", + "Enable URL previews for this room (only affects you)": "URL-Vorschau für diesen Raum aktivieren (betrifft nur dich)", + "Enable URL previews by default for participants in this room": "URL-Vorschau standardmäßig für Mitglieder dieses Raumes aktivieren", + "Please note you are logging into the %(hs)s server, not matrix.org.": "Hinweis: Du meldest dich auf dem %(hs)s-Server an, nicht auf matrix.org." } From 44e8a2cd545f0d2bea51abd1caa0925fde90c8d1 Mon Sep 17 00:00:00 2001 From: Bamstam Date: Thu, 16 Nov 2017 12:45:37 +0000 Subject: [PATCH 038/289] Translated using Weblate (German) Currently translated at 99.6% (927 of 930 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 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 9b7bc8f4a5..d4979767ba 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -266,7 +266,7 @@ "%(names)s and one other are typing": "%(names)s und ein weiteres Raum-Mitglied schreiben", "%(senderName)s answered the call.": "%(senderName)s hat den Anruf angenommen.", "%(senderName)s banned %(targetName)s.": "%(senderName)s hat %(targetName)s dauerhaft aus dem Raum verbannt.", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s hat den Anzeigenamen von \"%(oldDisplayName)s\" auf \"%(displayName)s\" geändert.", + "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s hat den Anzeigenamen von %(oldDisplayName)s auf %(displayName)s geändert.", "%(senderName)s changed their profile picture.": "%(senderName)s hat das Profilbild geändert.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s hat das Berechtigungslevel von %(powerLevelDiffText)s geändert.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s hat den Raumnamen geändert zu %(roomName)s.", @@ -1009,5 +1009,8 @@ "Enable inline URL previews by default": "URL-Vorschau standardmäßig aktivieren", "Enable URL previews for this room (only affects you)": "URL-Vorschau für diesen Raum aktivieren (betrifft nur dich)", "Enable URL previews by default for participants in this room": "URL-Vorschau standardmäßig für Mitglieder dieses Raumes aktivieren", - "Please note you are logging into the %(hs)s server, not matrix.org.": "Hinweis: Du meldest dich auf dem %(hs)s-Server an, nicht auf matrix.org." + "Please note you are logging into the %(hs)s server, not matrix.org.": "Hinweis: Du meldest dich auf dem %(hs)s-Server an, nicht auf matrix.org.", + "Resend all or cancel all now. You can also select individual messages to resend or cancel.": "Alle erneut senden oder alle verwerfen. Du kannst auch einzelne Nachrichten erneut senden oder verwerfen.", + "There's no one else here! Would you like to invite others or stop warning about the empty room?": "Sonst ist hier aktuell niemand. Möchtest du Benutzer einladen oder die Warnmeldung bezüglich des leeren Raums deaktivieren?", + "Sign in to get started": "Melde dich an, um loszulegen" } From 02ffa919c476c2404411db18e2b7c3c8aa82bcb3 Mon Sep 17 00:00:00 2001 From: Walter Date: Thu, 16 Nov 2017 12:48:03 +0000 Subject: [PATCH 039/289] Translated using Weblate (Russian) Currently translated at 98.7% (918 of 930 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index db4174ec0d..78d0f7b976 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -997,5 +997,10 @@ "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-адресов по умолчанию для участников этой комнаты", - "Status.im theme": "Тема status.im" + "Status.im theme": "Тема status.im", + "Restricted": "Ограниченный", + "Username on %(hs)s": "Имя пользователя на %(hs)s", + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Видимость '%(roomName)s' в %(groupId)s не может быть актуализирована.", + "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s ваше приглашение было отклонено %(count)s раз", + "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s ваше приглашение отклонил" } From f4b7741449e25b8ac6d1e51243e343d0573a521a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Thu, 16 Nov 2017 12:54:02 +0000 Subject: [PATCH 040/289] Translated using Weblate (Slovak) Currently translated at 99.7% (928 of 930 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sk/ --- src/i18n/strings/sk.json | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index 329af0e0a9..ae8dd9c336 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -266,7 +266,7 @@ "Hangup": "Zavesiť", "Voice call": "Audio hovor", "Video call": "Video hovor", - "Hide Apps": "Skriť aplikácie", + "Hide Apps": "Skryť aplikácie", "Show Apps": "Zobraziť aplikácie", "Upload file": "Nahrať súbor", "Show Text Formatting Toolbar": "Zobraziť lištu formátovania textu", @@ -275,7 +275,7 @@ "You do not have permission to post to this room": "Nemáte udelené právo posielať do tejto miestnosti", "Turn Markdown on": "Povoliť Markdown", "Turn Markdown off": "Zakázať Markdown", - "Hide Text Formatting Toolbar": "Skriť lištu formátovania textu", + "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", @@ -758,18 +758,18 @@ "Uploading %(filename)s and %(count)s others|zero": "Nahrávanie %(filename)s", "Uploading %(filename)s and %(count)s others|one": "Nahrávanie %(filename)s a %(count)s ďalší súbor", "Autoplay GIFs and videos": "Automaticky prehrávať animované GIF obrázky a videá", - "Hide read receipts": "Skriť potvrdenia o prečítaní", + "Hide read receipts": "Skryť potvrdenia o prečítaní", "Don't send typing notifications": "Neposielať oznámenia keď píšete", "Always show message timestamps": "Vždy zobrazovať časovú značku správ", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Pri zobrazovaní časových značiek používať 12 hodinový formát (napr. 2:30pm)", - "Hide join/leave messages (invites/kicks/bans unaffected)": "Skriť správy o vstupe a opustení miestnosti (netýka sa pozvaní/vykopnutí/zákazov vstupu)", + "Hide join/leave messages (invites/kicks/bans unaffected)": "Skryť správy o vstupe a opustení miestnosti (netýka sa pozvaní/vykopnutí/zákazov vstupu)", "Hide avatar and display name changes": "Skriť zmeny zobrazovaného mena a avatara", "Use compact timeline layout": "Použiť kompaktné rozloženie časovej osy", - "Hide removed messages": "Skriť odstránené správy", + "Hide removed messages": "Skryť odstránené správy", "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", "Disable Emoji suggestions while typing": "Zakázať návrhy Emoji počas písania", - "Hide avatars in user and room mentions": "Skriť avatarov pri zmienkach miestností a používateľov", + "Hide avatars in user and room mentions": "Skryť avatarov pri zmienkach miestností a používateľov", "Disable big emoji in chat": "Zakázať veľké Emoji v konverzácii", "Mirror local video feed": "Zrkadliť lokálne video", "Opt out of analytics": "Odhlásiť sa zo zberu analytických údajov", @@ -930,5 +930,13 @@ "Sign in to get started": "Začnite prihlásením sa", "Status.im theme": "Téma status.im", "Please note you are logging into the %(hs)s server, not matrix.org.": "Všimnite si: Práve sa prihlasujete na server %(hs)s, nie na server matrix.org.", - "Username on %(hs)s": "Meno používateľa na servery %(hs)s" + "Username on %(hs)s": "Meno používateľa na servery %(hs)s", + "Restricted": "Obmedzené", + "Presence Management": "Spravovanie prítomnosti", + "Hide avatar changes": "Skryť zmeny avatara", + "Hide display name changes": "Skryť zmeny zobrazovaného mena", + "Enable inline URL previews by default": "Predvolene povoliť náhľady URL adries", + "Enable URL previews for this room (only affects you)": "Povoliť náhľady URL adries pre túto miestnosť (ovplyvňuje len vás)", + "Enable URL previews by default for participants in this room": "Predvolene povoliť náhľady URL adries pre členov tejto miestnosti", + "Custom of %(powerLevel)s": "Vlastná úroveň %(powerLevel)s" } From 1d2e13f91dde17e13a0b7432fa9cf30a03cfcba2 Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 16 Nov 2017 13:21:52 +0000 Subject: [PATCH 041/289] Translated using Weblate (Russian) Currently translated at 98.7% (920 of 932 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 78d0f7b976..e9eba019c8 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -998,9 +998,11 @@ "Enable URL previews for this room (only affects you)": "Включить просмотр URL-адресов для этой комнаты (влияет только на вас)", "Enable URL previews by default for participants in this room": "Включить просмотр URL-адресов по умолчанию для участников этой комнаты", "Status.im theme": "Тема status.im", - "Restricted": "Ограниченный", + "Restricted": "Ограничен", "Username on %(hs)s": "Имя пользователя на %(hs)s", - "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Видимость '%(roomName)s' в %(groupId)s не может быть актуализирована.", - "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s ваше приглашение было отклонено %(count)s раз", - "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s ваше приглашение отклонил" + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "Видимость '%(roomName)s' в %(groupId)s не удалось обновить.", + "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s отклонили приглашения %(count)s раз", + "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s отклонили приглашения", + "URL previews are enabled by default for participants in this room.": "Предварительный просмотр URL-адресов для участников этой комнаты по умолчанию.", + "URL previews are disabled by default for participants in this room.": "Предварительный просмотр URL-адресов для участников этой комнаты по умолчанию." } From c9a66d375f44c99c6c93bc314e9f7761b34749b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Thu, 16 Nov 2017 14:45:01 +0000 Subject: [PATCH 042/289] Translated using Weblate (Slovak) Currently translated at 99.5% (928 of 932 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/sk/ --- src/i18n/strings/sk.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index ae8dd9c336..4ae115a4de 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -3,7 +3,7 @@ "This phone number is already in use": "Toto telefónne číslo sa už používa", "Failed to verify email address: make sure you clicked the link in the email": "Nepodarilo sa overiť emailovú adresu: Uistite sa, že ste správne klikli na odkaz v emailovej správe", "Call Timeout": "Časový limit hovoru", - "The remote side failed to pick up": "Vzdialenej strane sa nepodarilo priať hovor", + "The remote side failed to pick up": "Vzdialenej strane sa nepodarilo prijať hovor", "Unable to capture screen": "Nie je možné zachytiť obrazovku", "Existing Call": "Existujúci hovor", "You are already in a call.": "Už ste súčasťou iného hovoru.", @@ -469,7 +469,7 @@ "Password:": "Heslo:", "An email has been sent to %(emailAddress)s": "Na adresu %(emailAddress)s bola odoslaná správa", "Please check your email to continue registration.": "Prosím, skontrolujte si emaily, aby ste mohli pokračovať v registrácii.", - "Token incorrect": "Nesprávny token", + "Token incorrect": "Neplatný token", "A text message has been sent to %(msisdn)s": "Na číslo %(msisdn)s bola odoslaná textová správa", "Please enter the code it contains:": "Prosím, zadajte kód z tejto správy:", "Start authentication": "Spustiť overenie", @@ -870,7 +870,7 @@ "This server does not support authentication with a phone number.": "Tento server nepodporuje overenie telefónnym číslom.", "Missing password.": "Chýba heslo.", "Passwords don't match.": "Heslá sa nezhodujú.", - "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Heslo je veľmi krátke (minimálne %(MIN_PASSWORD_LENGTH)s).", + "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Heslo je veľmi krátke (minimálne %(MIN_PASSWORD_LENGTH)s znakov).", "This doesn't look like a valid email address.": "Zdá sa, že toto nie je platná emailová adresa.", "This doesn't look like a valid phone number.": "Zdá sa, že toto nie je platné telefónne číslo.", "You need to enter a user name.": "Musíte zadať používateľské meno.", From 8ba9d26d4b72b2aaca752718e5e03450887d04a8 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 16 Nov 2017 15:42:46 +0000 Subject: [PATCH 043/289] Don't set the call state to ended on error This isn't always the case, eg. just because we fail to pick up, the call is still ringing. --- src/CallHandler.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/CallHandler.js b/src/CallHandler.js index 918f38976a..5131473ec2 100644 --- a/src/CallHandler.js +++ b/src/CallHandler.js @@ -117,7 +117,6 @@ function _setCallListeners(call) { call.on("error", function(err) { console.error("Call error: %s", err); console.error(err.stack); - _setCallState(undefined, call.roomId, "ended"); if (err.code === 'unknown_devices') { const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); From eea8a41ef9d533e37d5ac6b4fa3e597a5e5ceab9 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 16 Nov 2017 16:20:13 +0000 Subject: [PATCH 044/289] Unused import --- src/CallHandler.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/CallHandler.js b/src/CallHandler.js index 5131473ec2..fa95b4400d 100644 --- a/src/CallHandler.js +++ b/src/CallHandler.js @@ -59,7 +59,6 @@ import sdk from './index'; import { _t } from './languageHandler'; import Matrix from 'matrix-js-sdk'; import dis from './dispatcher'; -import { getUnknownDevicesForRoom } from './cryptodevices'; import SettingsStore from "./settings/SettingsStore"; import { showUnknownDeviceDialogForCalls } from './cryptodevices'; From 65e1d49f374755f7f2d56d2e5d3defa29b080d9c Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 16 Nov 2017 17:59:42 +0000 Subject: [PATCH 045/289] More sensible buttons in UnknownDeviceDialog Just say 'Send' (or equiv) if you actually verify all the devices, rather than 'Send Anyway'. --- src/CallHandler.js | 1 + .../views/dialogs/UnknownDeviceDialog.js | 68 +++++++++++++++++-- src/cryptodevices.js | 24 ++----- src/i18n/strings/en_EN.json | 3 + 4 files changed, 72 insertions(+), 24 deletions(-) diff --git a/src/CallHandler.js b/src/CallHandler.js index fa95b4400d..3f1f48e9a9 100644 --- a/src/CallHandler.js +++ b/src/CallHandler.js @@ -137,6 +137,7 @@ function _setCallListeners(call) { _reAttemptCall(call); }, call.direction === 'outbound' ? _t("Call Anyway") : _t("Answer Anyway"), + call.direction === 'outbound' ? _t("Call") : _t("Answer"), ); } }, diff --git a/src/components/views/dialogs/UnknownDeviceDialog.js b/src/components/views/dialogs/UnknownDeviceDialog.js index d3f26d7536..8530ebac2e 100644 --- a/src/components/views/dialogs/UnknownDeviceDialog.js +++ b/src/components/views/dialogs/UnknownDeviceDialog.js @@ -24,6 +24,14 @@ import Resend from '../../../Resend'; import { _t } from '../../../languageHandler'; import SettingsStore from "../../../settings/SettingsStore"; +function markAllDevicesKnown(devices) { + Object.keys(devices).forEach((userId) => { + Object.keys(devices[userId]).map((deviceId) => { + MatrixClientPeg.get().setDeviceKnown(userId, deviceId, true); + }); + }); +} + function DeviceListEntry(props) { const {userId, device} = props; @@ -97,9 +105,33 @@ export default React.createClass({ // map from userid -> deviceid -> deviceinfo devices: PropTypes.object.isRequired, + onFinished: PropTypes.func.isRequired, + + // Label for the button that marks all devices known and tries the send again sendAnywayLabel: PropTypes.string.isRequired, - onSendAnyway: PropTypes.func.isRequired, + + // Label for the button that to send the event if you've verified all devices + sendLabel: PropTypes.string.isRequired, + + // function to retry the request once all devices are verified / known + onSend: PropTypes.func.isRequired, + }, + + componentWillMount: function() { + MatrixClientPeg.get().on("deviceVerificationChanged", this._onDeviceVerificationChanged); + }, + + componentWillUnmount: function() { + MatrixClientPeg.get().removeListener("deviceVerificationChanged", this._onDeviceVerificationChanged); + }, + + _onDeviceVerificationChanged: function(userId, deviceId, deviceInfo) { + if (this.props.devices[userId] && this.props.devices[userId][deviceId]) { + // XXX: Mutating props :/ + this.props.devices[userId][deviceId] = deviceInfo; + this.forceUpdate(); + } }, _onDismissClicked: function() { @@ -107,8 +139,15 @@ export default React.createClass({ }, _onSendAnywayClicked: function() { + markAllDevicesKnown(this.props.devices); + this.props.onFinished(); - this.props.onSendAnyway(); + this.props.onSend(); + }, + + _onSendClicked: function() { + this.props.onFinished(); + this.props.onSend(); }, render: function() { @@ -137,6 +176,26 @@ export default React.createClass({ ); } + let haveUnknownDevices = false; + Object.keys(this.props.devices).forEach((userId) => { + Object.keys(this.props.devices[userId]).map((deviceId) => { + const device = this.props.devices[userId][deviceId]; + if (device.isUnverified() && !device.isKnown()) { + haveUnknownDevices = true; + } + }); + }); + let sendButton; + if (haveUnknownDevices) { + sendButton = ; + } else { + sendButton = ; + } + const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); return (
- {this.props.sendAnywayButton} - + {sendButton}