Merge branch 'develop' into luke/fix-email-cancel-button-text
						commit
						f15292becf
					
				
							
								
								
									
										101
									
								
								CHANGELOG.md
								
								
								
								
							
							
						
						
									
										101
									
								
								CHANGELOG.md
								
								
								
								
							|  | @ -1,3 +1,104 @@ | |||
| Changes in [0.9.6](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.6) (2017-06-20) | ||||
| =================================================================================================== | ||||
| [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.5...v0.9.6) | ||||
| 
 | ||||
|  * Fix infinite spinner on email registration | ||||
|    [\#1120](https://github.com/matrix-org/matrix-react-sdk/pull/1120) | ||||
|  * Translate help promots in room list | ||||
|    [\#1121](https://github.com/matrix-org/matrix-react-sdk/pull/1121) | ||||
|  * Internationalise the drop targets | ||||
|    [\#1122](https://github.com/matrix-org/matrix-react-sdk/pull/1122) | ||||
|  * Fix another infinite spin on register | ||||
|    [\#1124](https://github.com/matrix-org/matrix-react-sdk/pull/1124) | ||||
| 
 | ||||
| 
 | ||||
| Changes in [0.9.5](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.5) (2017-06-19) | ||||
| =================================================================================================== | ||||
| [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.5-rc.2...v0.9.5) | ||||
| 
 | ||||
|  * Don't peek when creating a room | ||||
|    [\#1113](https://github.com/matrix-org/matrix-react-sdk/pull/1113) | ||||
|  * More translations & translation fixes | ||||
| 
 | ||||
| 
 | ||||
| Changes in [0.9.5-rc.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.5-rc.2) (2017-06-16) | ||||
| ============================================================================================================= | ||||
| [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.5-rc.1...v0.9.5-rc.2) | ||||
| 
 | ||||
|  * Avoid getting stuck in a loop in CAS login | ||||
|    [\#1109](https://github.com/matrix-org/matrix-react-sdk/pull/1109) | ||||
|  * Update from Weblate. | ||||
|    [\#1101](https://github.com/matrix-org/matrix-react-sdk/pull/1101) | ||||
|  * Correctly inspect state when rejecting invite | ||||
|    [\#1108](https://github.com/matrix-org/matrix-react-sdk/pull/1108) | ||||
|  * Make sure to pass the roomAlias to the preview header if we have it | ||||
|    [\#1107](https://github.com/matrix-org/matrix-react-sdk/pull/1107) | ||||
|  * Make sure captcha disappears when container does | ||||
|    [\#1106](https://github.com/matrix-org/matrix-react-sdk/pull/1106) | ||||
|  * Fix URL previews | ||||
|    [\#1105](https://github.com/matrix-org/matrix-react-sdk/pull/1105) | ||||
| 
 | ||||
| Changes in [0.9.5-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.5-rc.1) (2017-06-15) | ||||
| ============================================================================================================= | ||||
| [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.4...v0.9.5-rc.1) | ||||
| 
 | ||||
|  * Groundwork for tests including a teamserver login | ||||
|    [\#1098](https://github.com/matrix-org/matrix-react-sdk/pull/1098) | ||||
|  * Show a spinner when accepting an invite and waitingForRoom | ||||
|    [\#1100](https://github.com/matrix-org/matrix-react-sdk/pull/1100) | ||||
|  * Display a spinner until new room object after join success | ||||
|    [\#1099](https://github.com/matrix-org/matrix-react-sdk/pull/1099) | ||||
|  * Luke/attempt fix peeking regression | ||||
|    [\#1097](https://github.com/matrix-org/matrix-react-sdk/pull/1097) | ||||
|  * Show correct text in set email password dialog (2) | ||||
|    [\#1096](https://github.com/matrix-org/matrix-react-sdk/pull/1096) | ||||
|  * Don't create a guest login if user went to /login | ||||
|    [\#1092](https://github.com/matrix-org/matrix-react-sdk/pull/1092) | ||||
|  * Give password confirmation correct title, description | ||||
|    [\#1095](https://github.com/matrix-org/matrix-react-sdk/pull/1095) | ||||
|  * Make enter submit change password form | ||||
|    [\#1094](https://github.com/matrix-org/matrix-react-sdk/pull/1094) | ||||
|  * When not specified, remove roomAlias state in RoomViewStore | ||||
|    [\#1093](https://github.com/matrix-org/matrix-react-sdk/pull/1093) | ||||
|  * Update from Weblate. | ||||
|    [\#1091](https://github.com/matrix-org/matrix-react-sdk/pull/1091) | ||||
|  * Fixed pagination infinite loop caused by long messages | ||||
|    [\#1045](https://github.com/matrix-org/matrix-react-sdk/pull/1045) | ||||
|  * Clear persistent storage on login and logout | ||||
|    [\#1085](https://github.com/matrix-org/matrix-react-sdk/pull/1085) | ||||
|  * DM guessing: prefer oldest joined member | ||||
|    [\#1087](https://github.com/matrix-org/matrix-react-sdk/pull/1087) | ||||
|  * Ask for email address after setting password for the first time | ||||
|    [\#1090](https://github.com/matrix-org/matrix-react-sdk/pull/1090) | ||||
|  * i18n for setting password flow | ||||
|    [\#1089](https://github.com/matrix-org/matrix-react-sdk/pull/1089) | ||||
|  * remove mx_filterFlipColor from verified e2e icon so its not purple :/ | ||||
|    [\#1088](https://github.com/matrix-org/matrix-react-sdk/pull/1088) | ||||
|  * width and height must be int otherwise synapse cries | ||||
|    [\#1083](https://github.com/matrix-org/matrix-react-sdk/pull/1083) | ||||
|  * remove RoomViewStore listener from MatrixChat on unmount | ||||
|    [\#1084](https://github.com/matrix-org/matrix-react-sdk/pull/1084) | ||||
|  * Add script to copy translations between files | ||||
|    [\#1082](https://github.com/matrix-org/matrix-react-sdk/pull/1082) | ||||
|  * Only process user_directory response if it's for the current query | ||||
|    [\#1081](https://github.com/matrix-org/matrix-react-sdk/pull/1081) | ||||
|  * Fix regressions with starting a 1-1. | ||||
|    [\#1080](https://github.com/matrix-org/matrix-react-sdk/pull/1080) | ||||
|  * allow forcing of TURN | ||||
|    [\#1079](https://github.com/matrix-org/matrix-react-sdk/pull/1079) | ||||
|  * Remove a bunch of dead code from react-sdk | ||||
|    [\#1077](https://github.com/matrix-org/matrix-react-sdk/pull/1077) | ||||
|  * Improve error logging/reporting in megolm import/export | ||||
|    [\#1061](https://github.com/matrix-org/matrix-react-sdk/pull/1061) | ||||
|  * Delinting | ||||
|    [\#1064](https://github.com/matrix-org/matrix-react-sdk/pull/1064) | ||||
|  * Show reason for a call hanging up unexpectedly. | ||||
|    [\#1071](https://github.com/matrix-org/matrix-react-sdk/pull/1071) | ||||
|  * Add reason for ban in room settings | ||||
|    [\#1072](https://github.com/matrix-org/matrix-react-sdk/pull/1072) | ||||
|  * adds mx_filterFlipColor so that the dark theme will invert this image | ||||
|    [\#1070](https://github.com/matrix-org/matrix-react-sdk/pull/1070) | ||||
| 
 | ||||
| Changes in [0.9.4](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.4) (2017-06-14) | ||||
| =================================================================================================== | ||||
| [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.3...v0.9.4) | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
|   "name": "matrix-react-sdk", | ||||
|   "version": "0.9.4", | ||||
|   "version": "0.9.6", | ||||
|   "description": "SDK for matrix.org using React", | ||||
|   "author": "matrix.org", | ||||
|   "repository": { | ||||
|  | @ -64,7 +64,7 @@ | |||
|     "isomorphic-fetch": "^2.2.1", | ||||
|     "linkifyjs": "^2.1.3", | ||||
|     "lodash": "^4.13.1", | ||||
|     "matrix-js-sdk": "0.7.11", | ||||
|     "matrix-js-sdk": "0.7.12", | ||||
|     "optimist": "^0.6.1", | ||||
|     "prop-types": "^15.5.8", | ||||
|     "q": "^1.4.1", | ||||
|  |  | |||
|  | @ -0,0 +1,138 @@ | |||
| /* | ||||
| 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 sdk from './index'; | ||||
| import Modal from './Modal'; | ||||
| 
 | ||||
| export default class KeyRequestHandler { | ||||
|     constructor(matrixClient) { | ||||
|         this._matrixClient = matrixClient; | ||||
| 
 | ||||
|         // the user/device for which we currently have a dialog open
 | ||||
|         this._currentUser = null; | ||||
|         this._currentDevice = null; | ||||
| 
 | ||||
|         // userId -> deviceId -> [keyRequest]
 | ||||
|         this._pendingKeyRequests = Object.create(null); | ||||
|     } | ||||
| 
 | ||||
|     handleKeyRequest(keyRequest) { | ||||
|         const userId = keyRequest.userId; | ||||
|         const deviceId = keyRequest.deviceId; | ||||
|         const requestId = keyRequest.requestId; | ||||
| 
 | ||||
|         if (!this._pendingKeyRequests[userId]) { | ||||
|             this._pendingKeyRequests[userId] = Object.create(null); | ||||
|         } | ||||
|         if (!this._pendingKeyRequests[userId][deviceId]) { | ||||
|             this._pendingKeyRequests[userId][deviceId] = []; | ||||
|         } | ||||
| 
 | ||||
|         // check if we already have this request
 | ||||
|         const requests = this._pendingKeyRequests[userId][deviceId]; | ||||
|         if (requests.find((r) => r.requestId === requestId)) { | ||||
|             console.log("Already have this key request, ignoring"); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         requests.push(keyRequest); | ||||
| 
 | ||||
|         if (this._currentUser) { | ||||
|             // ignore for now
 | ||||
|             console.log("Key request, but we already have a dialog open"); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         this._processNextRequest(); | ||||
|     } | ||||
| 
 | ||||
|     handleKeyRequestCancellation(cancellation) { | ||||
|         // see if we can find the request in the queue
 | ||||
|         const userId = cancellation.userId; | ||||
|         const deviceId = cancellation.deviceId; | ||||
|         const requestId = cancellation.requestId; | ||||
| 
 | ||||
|         if (userId === this._currentUser && deviceId === this._currentDevice) { | ||||
|             console.log( | ||||
|                 "room key request cancellation for the user we currently have a" | ||||
|                 + " dialog open for", | ||||
|             ); | ||||
|             // TODO: update the dialog. For now, we just ignore the
 | ||||
|             // cancellation.
 | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         if (!this._pendingKeyRequests[userId]) { | ||||
|             return; | ||||
|         } | ||||
|         const requests = this._pendingKeyRequests[userId][deviceId]; | ||||
|         if (!requests) { | ||||
|             return; | ||||
|         } | ||||
|         const idx = requests.findIndex((r) => r.requestId === requestId); | ||||
|         if (idx < 0) { | ||||
|             return; | ||||
|         } | ||||
|         console.log("Forgetting room key request"); | ||||
|         requests.splice(idx, 1); | ||||
|         if (requests.length === 0) { | ||||
|             delete this._pendingKeyRequests[userId][deviceId]; | ||||
|             if (Object.keys(this._pendingKeyRequests[userId]).length === 0) { | ||||
|                 delete this._pendingKeyRequests[userId]; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     _processNextRequest() { | ||||
|         const userId = Object.keys(this._pendingKeyRequests)[0]; | ||||
|         if (!userId) { | ||||
|             return; | ||||
|         } | ||||
|         const deviceId = Object.keys(this._pendingKeyRequests[userId])[0]; | ||||
|         if (!deviceId) { | ||||
|             return; | ||||
|         } | ||||
|         console.log(`Starting KeyShareDialog for ${userId}:${deviceId}`); | ||||
| 
 | ||||
|         const finished = (r) => { | ||||
|             this._currentUser = null; | ||||
|             this._currentDevice = null; | ||||
| 
 | ||||
|             if (r) { | ||||
|                 for (const req of this._pendingKeyRequests[userId][deviceId]) { | ||||
|                     req.share(); | ||||
|                 } | ||||
|             } | ||||
|             delete this._pendingKeyRequests[userId][deviceId]; | ||||
|             if (Object.keys(this._pendingKeyRequests[userId]).length === 0) { | ||||
|                 delete this._pendingKeyRequests[userId]; | ||||
|             } | ||||
| 
 | ||||
|             this._processNextRequest(); | ||||
|         }; | ||||
| 
 | ||||
|         const KeyShareDialog = sdk.getComponent("dialogs.KeyShareDialog"); | ||||
|         Modal.createDialog(KeyShareDialog, { | ||||
|             matrixClient: this._matrixClient, | ||||
|             userId: userId, | ||||
|             deviceId: deviceId, | ||||
|             onFinished: finished, | ||||
|         }); | ||||
|         this._currentUser = userId; | ||||
|         this._currentDevice = deviceId; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -41,6 +41,7 @@ import PageTypes from '../../PageTypes'; | |||
| 
 | ||||
| import createRoom from "../../createRoom"; | ||||
| import * as UDEHandler from '../../UnknownDeviceErrorHandler'; | ||||
| import KeyRequestHandler from '../../KeyRequestHandler'; | ||||
| import { _t, getCurrentLanguage } from '../../languageHandler'; | ||||
| 
 | ||||
| /** constants for MatrixChat.state.view */ | ||||
|  | @ -133,11 +134,6 @@ module.exports = React.createClass({ | |||
|             // a thing to call showScreen with once login completes.
 | ||||
|             screenAfterLogin: this.props.initialScreenAfterLogin, | ||||
| 
 | ||||
|             // Stashed guest credentials if the user logs out
 | ||||
|             // whilst logged in as a guest user (so they can change
 | ||||
|             // their mind & log back in)
 | ||||
|             guestCreds: null, | ||||
| 
 | ||||
|             // What the LoggedInView would be showing if visible
 | ||||
|             page_type: null, | ||||
| 
 | ||||
|  | @ -385,13 +381,6 @@ module.exports = React.createClass({ | |||
|                 this._startRegistration(payload.params || {}); | ||||
|                 break; | ||||
|             case 'start_login': | ||||
|                 if (MatrixClientPeg.get() && | ||||
|                     MatrixClientPeg.get().isGuest() | ||||
|                 ) { | ||||
|                     this.setState({ | ||||
|                         guestCreds: MatrixClientPeg.getCredentials(), | ||||
|                     }); | ||||
|                 } | ||||
|                 this.setStateForNewView({ | ||||
|                     view: VIEWS.LOGIN, | ||||
|                 }); | ||||
|  | @ -545,12 +534,10 @@ module.exports = React.createClass({ | |||
|                 break; | ||||
|             case 'on_logging_in': | ||||
|                 // We are now logging in, so set the state to reflect that
 | ||||
|                 // and also that we're not ready (we'll be marked as logged
 | ||||
|                 // in once the login completes, then ready once the sync
 | ||||
|                 // completes).
 | ||||
|                 // NB. This does not touch 'ready' since if our dispatches
 | ||||
|                 // are delayed, the sync could already have completed
 | ||||
|                 this.setStateForNewView({ | ||||
|                     view: VIEWS.LOGGING_IN, | ||||
|                     ready: false, | ||||
|                 }); | ||||
|                 break; | ||||
|             case 'on_logged_in': | ||||
|  | @ -947,7 +934,6 @@ module.exports = React.createClass({ | |||
|     _onLoggedIn: function(teamToken) { | ||||
|         this.setState({ | ||||
|             view: VIEWS.LOGGED_IN, | ||||
|             guestCreds: null, | ||||
|         }); | ||||
| 
 | ||||
|         if (teamToken) { | ||||
|  | @ -1025,6 +1011,10 @@ module.exports = React.createClass({ | |||
|      */ | ||||
|     _onWillStartClient() { | ||||
|         const self = this; | ||||
|         // if the client is about to start, we are, by definition, not ready.
 | ||||
|         // Set ready to false now, then it'll be set to true when the sync
 | ||||
|         // listener we set below fires.
 | ||||
|         this.setState({ready: false}); | ||||
|         const cli = MatrixClientPeg.get(); | ||||
| 
 | ||||
|         // Allow the JS SDK to reap timeline events. This reduces the amount of
 | ||||
|  | @ -1095,6 +1085,14 @@ module.exports = React.createClass({ | |||
|                 } | ||||
|             } | ||||
|         }); | ||||
| 
 | ||||
|         const krh = new KeyRequestHandler(cli); | ||||
|         cli.on("crypto.roomKeyRequest", (req) => { | ||||
|             krh.handleKeyRequest(req); | ||||
|         }); | ||||
|         cli.on("crypto.roomKeyRequestCancellation", (req) => { | ||||
|             krh.handleKeyRequestCancellation(req); | ||||
|         }); | ||||
|     }, | ||||
| 
 | ||||
|     showScreen: function(screen, params) { | ||||
|  | @ -1270,14 +1268,9 @@ module.exports = React.createClass({ | |||
|         this.showScreen("forgot_password"); | ||||
|     }, | ||||
| 
 | ||||
|     onReturnToGuestClick: function() { | ||||
|         // reanimate our guest login
 | ||||
|         if (this.state.guestCreds) { | ||||
|             // TODO: this is probably a bit broken - we don't want to be
 | ||||
|             // clearing storage when we reanimate the guest creds.
 | ||||
|             Lifecycle.setLoggedIn(this.state.guestCreds); | ||||
|             this.setState({guestCreds: null}); | ||||
|         } | ||||
|     onReturnToAppClick: function() { | ||||
|         // treat it the same as if the user had completed the login
 | ||||
|         this._onLoggedIn(null); | ||||
|     }, | ||||
| 
 | ||||
|     // returns a promise which resolves to the new MatrixClient
 | ||||
|  | @ -1457,7 +1450,7 @@ module.exports = React.createClass({ | |||
|                     onLoggedIn={this.onRegistered} | ||||
|                     onLoginClick={this.onLoginClick} | ||||
|                     onRegisterClick={this.onRegisterClick} | ||||
|                     onCancelClick={this.state.guestCreds ? this.onReturnToGuestClick : null} | ||||
|                     onCancelClick={MatrixClientPeg.get() ? this.onReturnToAppClick : null} | ||||
|                     /> | ||||
|             ); | ||||
|         } | ||||
|  | @ -1491,7 +1484,7 @@ module.exports = React.createClass({ | |||
|                     defaultDeviceDisplayName={this.props.defaultDeviceDisplayName} | ||||
|                     onForgotPasswordClick={this.onForgotPasswordClick} | ||||
|                     enableGuest={this.props.enableGuest} | ||||
|                     onCancelClick={this.state.guestCreds ? this.onReturnToGuestClick : null} | ||||
|                     onCancelClick={MatrixClientPeg.get() ? this.onReturnToAppClick : null} | ||||
|                 /> | ||||
|             ); | ||||
|         } | ||||
|  |  | |||
|  | @ -160,10 +160,6 @@ module.exports = React.createClass({ | |||
|         this.checkFillState(); | ||||
|     }, | ||||
| 
 | ||||
|     componentWillUpdate: function(nextProps, nextState) { | ||||
|         this._saveScrollState(); | ||||
|     }, | ||||
| 
 | ||||
|     componentDidUpdate: function() { | ||||
|         // after adding event tiles, we may need to tweak the scroll (either to
 | ||||
|         // keep at the bottom of the timeline, or to maintain the view after
 | ||||
|  |  | |||
|  | @ -0,0 +1,172 @@ | |||
| /* | ||||
| 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 Modal from '../../../Modal'; | ||||
| import React from 'react'; | ||||
| import sdk from '../../../index'; | ||||
| 
 | ||||
| import { _t } from '../../../languageHandler'; | ||||
| 
 | ||||
| /** | ||||
|  * Dialog which asks the user whether they want to share their keys with | ||||
|  * an unverified device. | ||||
|  * | ||||
|  * onFinished is called with `true` if the key should be shared, `false` if it | ||||
|  * should not, and `undefined` if the dialog is cancelled. (In other words: | ||||
|  * truthy: do the key share. falsy: don't share the keys). | ||||
|  */ | ||||
| export default React.createClass({ | ||||
|     propTypes: { | ||||
|         matrixClient: React.PropTypes.object.isRequired, | ||||
|         userId: React.PropTypes.string.isRequired, | ||||
|         deviceId: React.PropTypes.string.isRequired, | ||||
|         onFinished: React.PropTypes.func.isRequired, | ||||
|     }, | ||||
| 
 | ||||
|     getInitialState: function() { | ||||
|         return { | ||||
|             deviceInfo: null, | ||||
|             wasNewDevice: false, | ||||
|         }; | ||||
|     }, | ||||
| 
 | ||||
|     componentDidMount: function() { | ||||
|         this._unmounted = false; | ||||
|         const userId = this.props.userId; | ||||
|         const deviceId = this.props.deviceId; | ||||
| 
 | ||||
|         // give the client a chance to refresh the device list
 | ||||
|         this.props.matrixClient.downloadKeys([userId], false).then((r) => { | ||||
|             if (this._unmounted) { return; } | ||||
| 
 | ||||
|             const deviceInfo = r[userId][deviceId]; | ||||
| 
 | ||||
|             if(!deviceInfo) { | ||||
|                 console.warn(`No details found for device ${userId}:${deviceId}`); | ||||
| 
 | ||||
|                 this.props.onFinished(false); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             const wasNewDevice = !deviceInfo.isKnown(); | ||||
| 
 | ||||
|             this.setState({ | ||||
|                 deviceInfo: deviceInfo, | ||||
|                 wasNewDevice: wasNewDevice, | ||||
|             }); | ||||
| 
 | ||||
|             // if the device was new before, it's not any more.
 | ||||
|             if (wasNewDevice) { | ||||
|                 this.props.matrixClient.setDeviceKnown( | ||||
|                     userId, | ||||
|                     deviceId, | ||||
|                     true, | ||||
|                 ); | ||||
|             } | ||||
|         }).done(); | ||||
|     }, | ||||
| 
 | ||||
|     componentWillUnmount: function() { | ||||
|         this._unmounted = true; | ||||
|     }, | ||||
| 
 | ||||
| 
 | ||||
|     _onVerifyClicked: function() { | ||||
|         const DeviceVerifyDialog = sdk.getComponent('views.dialogs.DeviceVerifyDialog'); | ||||
| 
 | ||||
|         console.log("KeyShareDialog: Starting verify dialog"); | ||||
|         Modal.createDialog(DeviceVerifyDialog, { | ||||
|             userId: this.props.userId, | ||||
|             device: this.state.deviceInfo, | ||||
|             onFinished: (verified) => { | ||||
|                 if (verified) { | ||||
|                     // can automatically share the keys now.
 | ||||
|                     this.props.onFinished(true); | ||||
|                 } | ||||
|             }, | ||||
|         }); | ||||
|     }, | ||||
| 
 | ||||
|     _onShareClicked: function() { | ||||
|         console.log("KeyShareDialog: User clicked 'share'"); | ||||
|         this.props.onFinished(true); | ||||
|     }, | ||||
| 
 | ||||
|     _onIgnoreClicked: function() { | ||||
|         console.log("KeyShareDialog: User clicked 'ignore'"); | ||||
|         this.props.onFinished(false); | ||||
|     }, | ||||
| 
 | ||||
|     _renderContent: function() { | ||||
|         const displayName = this.state.deviceInfo.getDisplayName() || | ||||
|             this.state.deviceInfo.deviceId; | ||||
| 
 | ||||
|         let text; | ||||
|         if (this.state.wasNewDevice) { | ||||
|             text = "You added a new device '%(displayName)s', which is" | ||||
|                 + " requesting encryption keys."; | ||||
|         } else { | ||||
|             text = "Your unverified device '%(displayName)s' is requesting" | ||||
|                 + " encryption keys."; | ||||
|         } | ||||
|         text = _t(text, {displayName: displayName}); | ||||
| 
 | ||||
|         return ( | ||||
|             <div> | ||||
|                 <p>{text}</p> | ||||
| 
 | ||||
|                 <div className="mx_Dialog_buttons"> | ||||
|                     <button onClick={this._onVerifyClicked}> | ||||
|                         {_t('Start verification')} | ||||
|                     </button> | ||||
|                     <button onClick={this._onShareClicked}> | ||||
|                         {_t('Share without verifying')} | ||||
|                     </button> | ||||
|                     <button onClick={this._onIgnoreClicked}> | ||||
|                         {_t('Ignore request')} | ||||
|                     </button> | ||||
|                 </div> | ||||
|             </div> | ||||
|         ); | ||||
|     }, | ||||
| 
 | ||||
|     render: function() { | ||||
|         const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); | ||||
|         const Spinner = sdk.getComponent('views.elements.Spinner'); | ||||
| 
 | ||||
|         let content; | ||||
| 
 | ||||
|         if (this.state.deviceInfo) { | ||||
|             content = this._renderContent(); | ||||
|         } else { | ||||
|             content = ( | ||||
|                 <div> | ||||
|                     <p>{_t('Loading device info...')}</p> | ||||
|                     <Spinner /> | ||||
|                 </div> | ||||
|             ); | ||||
|         } | ||||
| 
 | ||||
|         return ( | ||||
|             <BaseDialog className='mx_KeyShareRequestDialog' | ||||
|                 onFinished={this.props.onFinished} | ||||
|                 title={_t('Encryption key request')} | ||||
|             > | ||||
|                 {content} | ||||
|             </BaseDialog> | ||||
|         ); | ||||
|     }, | ||||
| }); | ||||
|  | @ -18,7 +18,7 @@ limitations under the License. | |||
| 'use strict'; | ||||
| var React = require("react"); | ||||
| var ReactDOM = require("react-dom"); | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import { _t, _tJsx } from '../../../languageHandler'; | ||||
| var GeminiScrollbar = require('react-gemini-scrollbar'); | ||||
| var MatrixClientPeg = require("../../../MatrixClientPeg"); | ||||
| var CallHandler = require('../../../CallHandler'); | ||||
|  | @ -33,11 +33,28 @@ var Receipt = require('../../../utils/Receipt'); | |||
| 
 | ||||
| const HIDE_CONFERENCE_CHANS = true; | ||||
| 
 | ||||
| const VERBS = { | ||||
|     'm.favourite': 'favourite', | ||||
|     'im.vector.fake.direct': 'tag direct chat', | ||||
|     'im.vector.fake.recent': 'restore', | ||||
|     'm.lowpriority': 'demote', | ||||
| function phraseForSection(section) { | ||||
|     // These would probably be better as individual strings,
 | ||||
|     // but for some reason we have translations for these strings
 | ||||
|     // as-is, so keeping it like this for now.
 | ||||
|     let verb; | ||||
|     switch (section) { | ||||
|         case 'm.favourite': | ||||
|             verb = _t('to favourite'); | ||||
|             break; | ||||
|         case 'im.vector.fake.direct': | ||||
|             verb = _t('to tag direct chat'); | ||||
|             break; | ||||
|         case 'im.vector.fake.recent': | ||||
|             verb = _t('to restore'); | ||||
|             break; | ||||
|         case 'm.lowpriority': | ||||
|             verb = _t('to demote'); | ||||
|             break; | ||||
|         default: | ||||
|             return _t('Drop here to tag %(section)s', {section: section}); | ||||
|     } | ||||
|     return _t('Drop here %(toAction)s', {toAction: verb}); | ||||
| }; | ||||
| 
 | ||||
| module.exports = React.createClass({ | ||||
|  | @ -478,17 +495,25 @@ module.exports = React.createClass({ | |||
|         switch (section) { | ||||
|             case 'im.vector.fake.direct': | ||||
|                 return <div className="mx_RoomList_emptySubListTip"> | ||||
|                     Press | ||||
|                     <StartChatButton size="16" callout={true}/> | ||||
|                     to start a chat with someone | ||||
|                     {_tJsx( | ||||
|                         "Press <StartChatButton> to start a chat with someone", | ||||
|                         [/<StartChatButton>/], | ||||
|                         [ | ||||
|                             (sub) => <StartChatButton size="16" callout={true}/> | ||||
|                         ] | ||||
|                     )} | ||||
|                 </div>; | ||||
|             case 'im.vector.fake.recent': | ||||
|                 return <div className="mx_RoomList_emptySubListTip"> | ||||
|                     You're not in any rooms yet! Press | ||||
|                     <CreateRoomButton size="16" callout={true}/> | ||||
|                     to make a room or | ||||
|                     <RoomDirectoryButton size="16" callout={true}/> | ||||
|                     to browse the directory | ||||
|                     {_tJsx( | ||||
|                         "You're not in any rooms yet! Press <CreateRoomButton> to make a room or"+ | ||||
|                         " <RoomDirectoryButton> to browse the directory", | ||||
|                         [/<CreateRoomButton>/, /<RoomDirectoryButton>/], | ||||
|                         [ | ||||
|                             (sub) => <CreateRoomButton size="16" callout={true}/>, | ||||
|                             (sub) => <RoomDirectoryButton size="16" callout={true}/> | ||||
|                         ] | ||||
|                     )} | ||||
|                 </div>; | ||||
|         } | ||||
| 
 | ||||
|  | @ -497,7 +522,7 @@ module.exports = React.createClass({ | |||
|             return null; | ||||
|         } | ||||
| 
 | ||||
|         const labelText = 'Drop here to ' + (VERBS[section] || 'tag ' + section); | ||||
|         const labelText = phraseForSection(section); | ||||
| 
 | ||||
|         return <RoomDropTarget label={labelText} />; | ||||
|     }, | ||||
|  |  | |||
|  | @ -76,14 +76,11 @@ function createRoom(opts) { | |||
|         } | ||||
|     ]; | ||||
| 
 | ||||
|     let modal; | ||||
|     setTimeout(()=>{ | ||||
|         modal = Modal.createDialog(Loader, null, 'mx_Dialog_spinner'); | ||||
|     }, 0); | ||||
|     const modal = Modal.createDialog(Loader, null, 'mx_Dialog_spinner'); | ||||
| 
 | ||||
|     let roomId; | ||||
|     return client.createRoom(createOpts).finally(function() { | ||||
|         if (modal) modal.close(); | ||||
|         modal.close(); | ||||
|     }).then(function(res) { | ||||
|         roomId = res.room_id; | ||||
|         if (opts.dmUserId) { | ||||
|  |  | |||
|  | @ -105,7 +105,7 @@ | |||
|     "Can't load user settings": "Benutzereinstellungen können nicht geladen werden", | ||||
|     "changed name": "änderte Namen", | ||||
|     "changed the power level of": "änderte Berechtigungslevel von", | ||||
|     "Clear Cache": "Leere Cache", | ||||
|     "Clear Cache": "Cache leeren", | ||||
|     "Click here to fix": "Zum reparieren hier klicken", | ||||
|     "*️⃣ Commands": "*️⃣ Befehle", | ||||
|     "Default": "Standard", | ||||
|  | @ -207,7 +207,7 @@ | |||
|     "since they joined": "ab dem Zeitpunkt, an dem sie beigetreten sind", | ||||
|     "since they were invited": "ab dem Zeitpunkt, an dem sie eingeladen wurden", | ||||
|     "Someone": "Jemand", | ||||
|     "Start a chat": "Starte einen Chat", | ||||
|     "Start a chat": "Chat starten", | ||||
|     "Start Chat": "Chat beginnen", | ||||
|     "Success": "Erfolg", | ||||
|     "tag direct chat": "Zum kennzeichnen als direkten Chat", | ||||
|  | @ -425,7 +425,7 @@ | |||
|     "to start a chat with someone": "um einen Chat mit jemandem zu starten", | ||||
|     "to tag direct chat": "als Direkt-Chat markieren", | ||||
|     "You're not in any rooms yet! Press": "Du bist noch keinem Raum beigetreten! Drücke", | ||||
|     "click to reveal": "Klicke zum anzeigen", | ||||
|     "click to reveal": "anzeigen", | ||||
|     "To remove other users' messages": "Um Nachrichten anderer Nutzer zu verbergen", | ||||
|     "You are trying to access %(roomName)s.": "Du versuchst, auf den Raum \"%(roomName)s\" zuzugreifen.", | ||||
|     "af": "Afrikaans", | ||||
|  | @ -671,7 +671,7 @@ | |||
|     "%(oneUser)srejected their invitation %(repeats)s times": "%(oneUser)shat die Einladung %(repeats)s mal abgelehnt", | ||||
|     "%(severalUsers)srejected their invitations": "%(severalUsers)shaben ihre Einladung abgelehnt", | ||||
|     "%(oneUser)srejected their invitation": "%(oneUser)shat die Einladung abgelehnt", | ||||
|     "%(severalUsers)shad their invitations withdrawn %(repeats)s times": "%(severalUsers)szogen ihre Einladungen %(repeats)s mal zurück", | ||||
|     "%(severalUsers)shad their invitations withdrawn %(repeats)s times": "%(severalUsers)swurden die ursprünglichen Einladungen %(repeats)s mal wieder entzogen", | ||||
|     "%(oneUser)shad their invitation withdrawn %(repeats)s times": "%(oneUser)swurde die Einladung %(repeats)s mal wieder entzogen", | ||||
|     "%(severalUsers)shad their invitations withdrawn": "%(severalUsers)szogen ihre Einladungen zurück", | ||||
|     "%(oneUser)shad their invitation withdrawn": "%(oneUser)swurde die ursprüngliche Einladung wieder entzogen", | ||||
|  | @ -710,7 +710,7 @@ | |||
|     "New passwords don't match": "Die neuen Passwörter stimmen nicht überein", | ||||
|     "olm version:": "Version von olm:", | ||||
|     "Passwords can't be empty": "Passwortfelder dürfen nicht leer sein", | ||||
|     "Report it": "Melde ihn", | ||||
|     "Report it": "Melden", | ||||
|     "riot-web version:": "Version von riot-web:", | ||||
|     "Scroll to bottom of page": "Zum Ende der Seite springen", | ||||
|     "Show timestamps in 12 hour format (e.g. 2:30pm)": "Zeitstempel im 12-Stunden-Format anzeigen (z. B. 2:30pm)", | ||||
|  | @ -815,14 +815,14 @@ | |||
|     "Ongoing conference call%(supportedText)s.": "Laufendes Konferenzgespräch%(supportedText)s.", | ||||
|     "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Du wirst jetzt auf die Website eines Drittanbieters weitergeleitet, damit du dein Konto  für die Verwendung von %(integrationsUrl)s authentifizieren kannst. Möchtest du fortfahren?", | ||||
|     "Disable URL previews for this room (affects only you)": "URL-Vorschau für diesen Raum deaktivieren (betrifft nur dich)", | ||||
|     "Start automatically after system login": "Starte automatisch nach System-Login", | ||||
|     "Start automatically after system login": "Nach System-Login automatisch starten", | ||||
|     "Desktop specific": "Desktopspezifisch", | ||||
|     "Jump to first unread message.": "Zur ersten ungelesenen Nachricht springen.", | ||||
|     "Options": "Optionen", | ||||
|     "disabled": "deaktiviert", | ||||
|     "enabled": "aktiviert", | ||||
|     "Invited": "Eingeladen", | ||||
|     "Set a Display Name": "Setze einen Anzeigenamen", | ||||
|     "Set a Display Name": "Anzeigenamen festlegen", | ||||
|     "for %(amount)ss": "für %(amount)ss", | ||||
|     "for %(amount)sm": "seit %(amount)smin", | ||||
|     "for %(amount)sh": "für %(amount)sh", | ||||
|  | @ -974,5 +974,7 @@ | |||
|     "Authentication check failed: incorrect password?": "Authentifizierung fehlgeschlagen: Falsches Passwort?", | ||||
|     "Disable Peer-to-Peer for 1:1 calls": "Peer-to-Peer-Verbindung für 1-zu-1-Anrufe deaktivieren", | ||||
|     "Do you want to set an email address?": "Möchtest du eine E-Mail-Adresse setzen?", | ||||
|     "This will allow you to reset your password and receive notifications.": "Dies erlaubt dir dein Passwort zurückzusetzen und Benachrichtigungen zu empfangen." | ||||
|     "This will allow you to reset your password and receive notifications.": "Dies erlaubt dir dein Passwort zurückzusetzen und Benachrichtigungen zu empfangen.", | ||||
|     "Press <StartChatButton> to start a chat with someone": "Klicke auf <StartChatButton> um einen Chat mit jemanden zu starten", | ||||
|     "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "Du bist bisher in keinem Raum! Klicke auf <CreateRoomButton> um einen Raum zu erstellen oder <RoomDirectoryButton> um das Verzeichnis zu durchsuchen" | ||||
| } | ||||
|  |  | |||
|  | @ -914,5 +914,7 @@ | |||
|     "were unbanned %(repeats)s times": "ξεμπλοκαρίστηκαν %(repeats)s φορές", | ||||
|     "was unbanned %(repeats)s times": "ξεμπλοκαρίστηκε %(repeats)s φορές", | ||||
|     "were unbanned": "ξεμπλοκαρίστηκαν", | ||||
|     "was unbanned": "ξεμπλοκαρίστηκε" | ||||
|     "was unbanned": "ξεμπλοκαρίστηκε", | ||||
|     "Press <StartChatButton> to start a chat with someone": "Πατήστε <StartChatButton> για να ξεκινήσετε μια συνομιλία", | ||||
|     "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "Δεν είστε σε κανένα δωμάτιο! Πατήστε <CreateRoomButton> για να δημιουργήσετε ένα δωμάτιο  ή <RoomDirectoryButton> για να δείτε το ευρετήριο" | ||||
| } | ||||
|  |  | |||
|  | @ -440,6 +440,7 @@ | |||
|   "Please Register": "Please Register", | ||||
|   "Power level must be positive integer.": "Power level must be positive integer.", | ||||
|   "Press": "Press", | ||||
|   "Press <StartChatButton> to start a chat with someone": "Press <StartChatButton> to start a chat with someone", | ||||
|   "Privacy warning": "Privacy warning", | ||||
|   "Private Chat": "Private Chat", | ||||
|   "Privileged Users": "Privileged Users", | ||||
|  | @ -648,7 +649,7 @@ | |||
|   "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?", | ||||
|   "You already have existing direct chats with this user:": "You already have existing direct chats with this user:", | ||||
|   "You are already in a call.": "You are already in a call.", | ||||
|   "You're not in any rooms yet! Press": "You're not in any rooms yet! Press", | ||||
|   "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory", | ||||
|   "You are trying to access %(roomName)s.": "You are trying to access %(roomName)s.", | ||||
|   "You cannot place a call with yourself.": "You cannot place a call with yourself.", | ||||
|   "You cannot place VoIP calls in this browser.": "You cannot place VoIP calls in this browser.", | ||||
|  | @ -911,5 +912,11 @@ | |||
|   "Disable Peer-to-Peer for 1:1 calls": "Disable Peer-to-Peer for 1:1 calls", | ||||
|   "Do you want to set an email address?": "Do you want to set an email address?", | ||||
|   "This will allow you to reset your password and receive notifications.": "This will allow you to reset your password and receive notifications.", | ||||
|   "Skip":"Skip" | ||||
|   "Skip":"Skip", | ||||
|   "Start verification": "Start verification", | ||||
|   "Share without verifying": "Share without verifying", | ||||
|   "Ignore request": "Ignore request", | ||||
|   "You added a new device '%(displayName)s', which is requesting encryption keys.": "You added a new device '%(displayName)s', which is requesting encryption keys.", | ||||
|   "Your unverified device '%(displayName)s' is requesting encryption keys.": "Your unverified device '%(displayName)s' is requesting encryption keys.", | ||||
|   "Encryption key request": "Encryption key request" | ||||
| } | ||||
|  |  | |||
|  | @ -557,7 +557,7 @@ | |||
|     "You're not in any rooms yet! Press": "Vous n’êtes dans aucun salon ! Cliquez", | ||||
|     "You are trying to access %(roomName)s.": "Vous essayez d'accéder à %(roomName)s.", | ||||
|     "You cannot place a call with yourself.": "Vous ne pouvez pas passer d'appel avec vous-même.", | ||||
|     "You cannot place VoIP calls in this browser.": "Vous ne pouvez pas passer d'appel voix dans cet explorateur.", | ||||
|     "You cannot place VoIP calls in this browser.": "Vous ne pouvez pas passer d'appel vocal dans ce navigateur.", | ||||
|     "You do not have permission to post to this room": "Vous n’avez pas la permission de poster dans ce salon", | ||||
|     "You have been invited to join this room by %(inviterName)s": "Vous avez été invité à joindre ce salon par %(inviterName)s", | ||||
|     "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "Vous avez été déconnecté de tous vos appareils et ne recevrez plus de notifications. Pour réactiver les notifications, identifiez vous à nouveau sur tous les appareils", | ||||
|  | @ -922,5 +922,7 @@ | |||
|     "Authentication check failed: incorrect password?": "Erreur d’identification: mot de passe incorrect ?", | ||||
|     "Disable Peer-to-Peer for 1:1 calls": "Désactiver les appels 1:1 pair-à-pair", | ||||
|     "Do you want to set an email address?": "Souhaitez-vous configurer une adresse e-mail ?", | ||||
|     "This will allow you to reset your password and receive notifications.": "Ceci va vous permettre de réinitialiser votre mot de passe et de recevoir des notifications." | ||||
|     "This will allow you to reset your password and receive notifications.": "Ceci va vous permettre de réinitialiser votre mot de passe et de recevoir des notifications.", | ||||
|     "Press <StartChatButton> to start a chat with someone": "Cliquez sur <StartChatButton> pour entamer une discussion avec quelqu'un", | ||||
|     "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "Vous n'avez pas encore rejoint de salle ! Cliquez sur <CreateRoomButton> pour créer une salle ou sur <RoomDirectoryButton> pour explorer l'annuaire" | ||||
| } | ||||
|  |  | |||
|  | @ -508,5 +508,175 @@ | |||
|     "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s képet küldött.", | ||||
|     "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s meghívót küldött %(targetDisplayName)s felhasználónak, hogy lépjen be a szobába.", | ||||
|     "sent a video": "videó küldve", | ||||
|     "Server error": "Szerver hiba" | ||||
|     "Server error": "Szerver hiba", | ||||
|     "Server may be unavailable or overloaded": "A szerver elérhetetlen vagy túlterhelt", | ||||
|     "Server may be unavailable, overloaded, or search timed out :(": "A szerver elérhetetlen, túlterhelt vagy a keresés túllépte az időkorlátot :(", | ||||
|     "Server may be unavailable, overloaded, or the file too big": "A szerver elérhetetlen, túlterhelt vagy a fájl túl nagy", | ||||
|     "Server may be unavailable, overloaded, or you hit a bug.": "A szerver elérhetetlen, túlterhelt vagy hibára futott.", | ||||
|     "Server unavailable, overloaded, or something else went wrong.": "A szerver elérhetetlen, túlterhelt vagy valami más probléma van.", | ||||
|     "Session ID": "Kapcsolat azonosító", | ||||
|     "%(senderName)s set a profile picture.": "%(senderName)s profil képet állított be.", | ||||
|     "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s a megjelenítési nevét megváltoztatta erre: %(displayName)s.", | ||||
|     "Set": "Beállít", | ||||
|     "Show panel": "Panel megjelenítése", | ||||
|     "Show Text Formatting Toolbar": "Szöveg formázási eszköztár megjelenítése", | ||||
|     "Show timestamps in 12 hour format (e.g. 2:30pm)": "Az időbélyegek 12 órás formátumban mutatása (pl.: 2:30pm)", | ||||
|     "Signed Out": "Kijelentkezett", | ||||
|     "Sign in": "Bejelentkezett", | ||||
|     "Sign out": "Kijelentkezés", | ||||
|     "since the point in time of selecting this option": "onnantól, hogy ez az opció kiválasztásra került", | ||||
|     "since they joined": "onnantól, hogy csatlakozott", | ||||
|     "since they were invited": "onnantól, hogy meg lett hívva", | ||||
|     "Some of your messages have not been sent.": "Néhány üzeneted nem lett elküldve.", | ||||
|     "Someone": "Valaki", | ||||
|     "Sorry, this homeserver is using a login which is not recognised ": "Bocs, ez a saját szerver olyan beléptetést használ ami nem ismert ", | ||||
|     "Start a chat": "Csevegés indítása", | ||||
|     "Start authentication": "Azonosítás indítása", | ||||
|     "Start Chat": "Csevegés indítása", | ||||
|     "Submit": "Elküld", | ||||
|     "Success": "Sikeres", | ||||
|     "tag as %(tagName)s": "címke beállítása: %(tagName)s", | ||||
|     "tag direct chat": "megjelölés közvetlen csevegésnek", | ||||
|     "Tagged as: ": "Címkék: ", | ||||
|     "The default role for new room members is": "Az alapértelmezett szerep új tagoknak:", | ||||
|     "The main address for this room is": "A szoba elsődleges címe:", | ||||
|     "The phone number entered looks invalid": "A megadott telefonszám érvénytelennek tűnik", | ||||
|     "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Az általad megadott aláíró kulcs megegyezik %(userId)s felhasználótól kapott kulccsal amit %(deviceId)s eszközhöz használ. Az eszköz ellenőrzöttnek jelölve.", | ||||
|     "This action cannot be performed by a guest user. Please register to be able to do this.": "Ezt nem teheti vendég felhasználó. Kérlek regisztrálj, hogy megtehesd.", | ||||
|     "This email address is already in use": "Ez az e-mail cím már használatban van", | ||||
|     "This email address was not found": "Az e-mail cím nem található", | ||||
|     "%(actionVerb)s this person?": "Ezt a felhasználót %(actionVerb)s?", | ||||
|     "The email address linked to your account must be entered.": "A fiókodhoz kötött e-mail címet add meg.", | ||||
|     "Press <StartChatButton> to start a chat with someone": "Nyomd meg a <StartChatButton> gombot  ha szeretnél csevegni valakivel", | ||||
|     "Privacy warning": "Magánéleti figyelmeztetés", | ||||
|     "The file '%(fileName)s' exceeds this home server's size limit for uploads": "'%(fileName)s' fájl túllépte az egyedi szerverben beállított feltöltési méret határt", | ||||
|     "The file '%(fileName)s' failed to upload": "'%(fileName)s' fájl feltöltése sikertelen", | ||||
|     "The remote side failed to pick up": "A hívott fél nem vette fel", | ||||
|     "This Home Server does not support login using email address.": "Az egyedi szerver nem támogatja a belépést e-mail címmel.", | ||||
|     "This invitation was sent to an email address which is not associated with this account:": "A meghívó olyan e-mail címre lett küldve ami nincs összekötve ezzel a fiókkal:", | ||||
|     "There was a problem logging in.": "Hiba történt a bejelentkezésnél.", | ||||
|     "This room has no local addresses": "Ennek a szobának nincs helyi címe", | ||||
|     "This room is not recognised.": "Ez a szoba nem ismerős.", | ||||
|     "These are experimental features that may break in unexpected ways": "Ezek kísérleti funkciók amik kiszámíthatatlanok lehetnek", | ||||
|     "The visibility of existing history will be unchanged": "A már meglévő csevegés előzmények láthatósága nem változik", | ||||
|     "This doesn't appear to be a valid email address": "Ez nem tűnik helyes e-mail címnek", | ||||
|     "This is a preview of this room. Room interactions have been disabled": "Ez a szoba előnézete. Minden tevékenység ezzel a szobával ki van kapcsolva", | ||||
|     "This phone number is already in use": "Ez a telefonszám már használatban van", | ||||
|     "This room": "Ez a szoba", | ||||
|     "This room is not accessible by remote Matrix servers": "Ez a szoba távoli Matrix szerverről nem érhető el", | ||||
|     "This room's internal ID is": "A szoba belső azonosítója:", | ||||
|     "times": "alkalommal", | ||||
|     "To ban users": "Felhasználó kizárásához", | ||||
|     "to browse the directory": "a könyvtárban való kereséshez", | ||||
|     "To configure the room": "A szoba beállításához", | ||||
|     "to favourite": "kedvencekhez", | ||||
|     "To invite users into the room": "Felhasználó szobába való meghívásához", | ||||
|     "To kick users": "Felhasználó kirúgásához", | ||||
|     "To link to a room it must have <a>an address</a>.": "Szobához való kötéshez szükséges <a>egy cím</a>.", | ||||
|     "to make a room or": "szoba létrehozásához vagy", | ||||
|     "To remove other users' messages": "Más felhasználók üzeneteinek törléséhez", | ||||
|     "To reset your password, enter the email address linked to your account": "A jelszó alaphelyzetbe állításához add meg a fiókodhoz kötött e-mail címet", | ||||
|     "to restore": "visszaállításhoz", | ||||
|     "To send events of type": "Az alábbi típusú üzenetek küldéséhez", | ||||
|     "To send messages": "Üzenetek küldéséhez", | ||||
|     "to start a chat with someone": "csevegés indításához valakivel", | ||||
|     "to tag as %(tagName)s": "megjelölni mint: %(tagName)s", | ||||
|     "to tag direct chat": "megjelölni közvetlen csevegésnek", | ||||
|     "To use it, just wait for autocomplete results to load and tab through them.": "A használatához csak várd meg az automatikus kiegészítéshez a találatok betöltését és TAB-bal választhatsz közülük.", | ||||
|     "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Megpróbáltam betölteni a szoba megadott időpontjának megfelelő  adatait, de nincs jogod a kérdéses üzenetek megjelenítéséhez.", | ||||
|     "Tried to load a specific point in this room's timeline, but was unable to find it.": "Megpróbáltam betölteni a szoba megadott időpontjának megfelelő  adatait, de nem találom.", | ||||
|     "Turn Markdown off": "Markdown kikapcsolása", | ||||
|     "Turn Markdown on": "Markdown bekapcsolása", | ||||
|     "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s bekapcsolta a  titkosítást végponttól végpontig (algoritmus %(algorithm)s).", | ||||
|     "Unable to add email address": "Az e-mail címet nem sikerült hozzáadni", | ||||
|     "Unable to remove contact information": "A névjegy információkat nem sikerült törölni", | ||||
|     "Unable to restore previous session": "Az előző kapcsolat visszaállítása sikertelen", | ||||
|     "Unable to verify email address.": "Az e-mail cím ellenőrzése sikertelen.", | ||||
|     "Unban": "Kitiltás visszavonása", | ||||
|     "%(senderName)s unbanned %(targetName)s.": "%(senderName)s visszaengedte %(targetName)s felhasználót.", | ||||
|     "Unable to capture screen": "A képernyő felvétele sikertelen", | ||||
|     "Unable to enable Notifications": "Az értesítések engedélyezése sikertelen", | ||||
|     "Unable to load device list": "Az eszközlista betöltése sikertelen", | ||||
|     "Undecryptable": "Visszafejthetetlen", | ||||
|     "Unencrypted room": "Titkosítatlan szoba", | ||||
|     "unencrypted": "titkosítatlan", | ||||
|     "Unencrypted message": "Titkosítatlan üzenet", | ||||
|     "unknown caller": "ismeretlen hívó", | ||||
|     "Unknown command": "Ismeretlen parancs", | ||||
|     "unknown device": "ismeretlen eszköz", | ||||
|     "Unknown room %(roomId)s": "Ismeretlen szoba %(roomId)s", | ||||
|     "Unknown (user, device) pair:": "Ismeretlen (felhasználó, eszköz) pár:", | ||||
|     "unknown": "ismeretlen", | ||||
|     "Unmute": "Némítás kikapcsolása", | ||||
|     "Unnamed Room": "Névtelen szoba", | ||||
|     "Unrecognised command:": "Ismeretlen parancs:", | ||||
|     "Unrecognised room alias:": "Ismeretlen szoba becenév:", | ||||
|     "Unverified": "Nem ellenőrzött", | ||||
|     "Uploading %(filename)s and %(count)s others.zero": "%(filename)s feltöltése", | ||||
|     "Uploading %(filename)s and %(count)s others.one": "%(filename)s és még %(count)s db másik feltöltése", | ||||
|     "Uploading %(filename)s and %(count)s others.other": "%(filename)s és még %(count)s db másik feltöltése", | ||||
|     "uploaded a file": "fájl feltöltése", | ||||
|     "Upload avatar": "Avatar kép feltöltése", | ||||
|     "Upload Failed": "Feltöltés sikertelen", | ||||
|     "Upload Files": "Fájlok feltöltése", | ||||
|     "Upload file": "Fájl feltöltése", | ||||
|     "Upload new:": "Új feltöltése:", | ||||
|     "Usage": "Használat", | ||||
|     "Use compact timeline layout": "Egyszerű idővonal séma használata", | ||||
|     "Use with caution": "Használd körültekintéssel", | ||||
|     "User ID": "Felhasználói azonosító", | ||||
|     "User Interface": "Felhasználói felület", | ||||
|     "%(user)s is a": "%(user)s egy", | ||||
|     "User name": "Felhasználói név", | ||||
|     "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (szint: %(powerLevelNumber)s)", | ||||
|     "Username invalid: %(errMessage)s": "Felhasználói név érvénytelen: %(errMessage)s", | ||||
|     "Users": "Felhasználók", | ||||
|     "User": "Felhasználó", | ||||
|     "Verification Pending": "Ellenőrzés függőben", | ||||
|     "Verification": "Ellenőrzés", | ||||
|     "verified": "ellenőrizve", | ||||
|     "Verified": "Ellenőrizve", | ||||
|     "Verified key": "Ellenőrzött kulcs", | ||||
|     "Video call": "Videó hívás", | ||||
|     "Voice call": "Hang hívás", | ||||
|     "VoIP conference finished.": "VoIP konferencia befejeződött.", | ||||
|     "VoIP conference started.": "VoIP konferencia elkezdődött.", | ||||
|     "VoIP is unsupported": "VoIP nem támogatott", | ||||
|     "(could not connect media)": "(média kapcsolat nem hozható létre)", | ||||
|     "(no answer)": "(nincs válasz)", | ||||
|     "(unknown failure: %(reason)s)": "(ismeretlen hiba: %(reason)s)", | ||||
|     "(warning: cannot be disabled again!)": "(figyelmeztetés: nem lehet újra kikapcsolni!)", | ||||
|     "Warning!": "Figyelem!", | ||||
|     "WARNING: Device already verified, but keys do NOT MATCH!": "Figyelem: Az eszköz már ellenőrzött, de a kulcsok NEM EGYEZNEK!", | ||||
|     "Who can access this room?": "Ki éri el ezt a szobát?", | ||||
|     "Who can read history?": "Ki olvashatja a régi üzeneteket?", | ||||
|     "Who would you like to add to this room?": "Kit szeretnél hozzáadni ehhez a szobához?", | ||||
|     "Who would you like to communicate with?": "Kivel szeretnél beszélgetni?", | ||||
|     "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s visszavonta %(targetName)s meghívóját.", | ||||
|     "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Ezt a meghívót szeretnéd <acceptText>elfogadni</acceptText> vagy <declineText>elutasítani</declineText>?", | ||||
|     "You already have existing direct chats with this user:": "Már van közvetlen csevegésed ezzel a felhasználóval:", | ||||
|     "You are already in a call.": "Már hívásban vagy.", | ||||
|     "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "Még egyetlen szobába sem léptél be! Szoba létrehozáshoz nyomd meg: <CreateRoomButton> vagy a szobák közötti kereséshez nyomd meg: <RoomDirectoryButton>", | ||||
|     "You are trying to access %(roomName)s.": "%(roomName)s szobába próbálsz belépni.", | ||||
|     "You cannot place a call with yourself.": "Nem hívhatod fel saját magadat.", | ||||
|     "You cannot place VoIP calls in this browser.": "Nem indíthatsz VoIP hívást ebben a böngészőben.", | ||||
|     "You do not have permission to post to this room": "Nincs jogod írni ebben a szobában", | ||||
|     "You have been banned from %(roomName)s by %(userName)s.": "%(userName)s kitiltott a szobából: %(roomName)s.", | ||||
|     "You have been invited to join this room by %(inviterName)s": "%(inviterName)s meghívott ebbe a szobába", | ||||
|     "You have been kicked from %(roomName)s by %(userName)s.": "%(userName)s kirúgott ebből a szobából: %(roomName)s.", | ||||
|     "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "Kijelentkeztél minden eszközről így nem fogsz \"push\" értesítéseket kapni. Az értesítések engedélyezéséhez jelentkezz vissza mindegyik eszközön", | ||||
|     "You have <a>disabled</a> URL previews by default.": "Az URL előnézet alapból <a>tiltva</a> van.", | ||||
|     "You have <a>enabled</a> URL previews by default.": "Az URL előnézet alapból <a>engedélyezve</a> van.", | ||||
|     "You have entered an invalid contact. Try using their Matrix ID or email address.": "Érvénytelen kapcsolatot adtál meg. Próbáld meg a Matrix azonosítóját vagy e-mail címét használni.", | ||||
|     "You have no visible notifications": "Nincsenek látható értesítéseid", | ||||
|     "You may wish to login with a different account, or add this email to this account.": "Lehet, hogy más fiókba szeretnél belépni vagy ezt az e-mail címet szeretnéd ehhez a fiókhoz kötni.", | ||||
|     "you must be a": "szükséges  szerep:", | ||||
|     "You must <a>register</a> to use this functionality": "<a>Regisztrálnod kell</a> hogy ezt használhasd", | ||||
|     "You need to be able to invite users to do that.": "Hogy ezt csinálhasd meg kell tudnod hívni felhasználókat.", | ||||
|     "You need to be logged in.": "Be kell jelentkezz.", | ||||
|     "You need to enter a user name.": "Be kell írnod a felhasználói nevet.", | ||||
|     "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Ahhoz, hogy kulcsot tudjál készíteni a végponttól végpontig való titkosításhoz ehhez az eszközhöz és elküld a kulcsot a egyéni szerverhez vissza kell jelentkezned. Ez egyszeri alkalom, elnézést a kellemetlenségér.", | ||||
|     "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ez az e-mail cím, úgy néz ki, nincs összekötve a Matrix azonosítóval ezen az egyedi szerveren.", | ||||
|     "Your password has been reset": "A jelszavad visszaállítottuk", | ||||
|     "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "A jelszavadat sikeresen megváltoztattuk. Nem kapsz \"push\" értesítéseket amíg a többi eszközön vissza nem jelentkezel" | ||||
| } | ||||
|  |  | |||
|  | @ -651,5 +651,24 @@ | |||
|     "(unknown failure: %(reason)s)": "(알 수 없는 오류: %(reason)s)", | ||||
|     "(warning: cannot be disabled again!)": "(주의: 다시 끌 수 없어요!)", | ||||
|     "Warning!": "주의!", | ||||
|     "WARNING: Device already verified, but keys do NOT MATCH!": "주의: 장치는 이미 인증했지만, 키가 맞지 않아요!" | ||||
|     "WARNING: Device already verified, but keys do NOT MATCH!": "주의: 장치는 이미 인증했지만, 키가 맞지 않아요!", | ||||
|     "Who can access this room?": "누가 이 방에 들어올 수 있나요?", | ||||
|     "Who can read history?": "누가 기록을 읽을 수 있나요?", | ||||
|     "Who would you like to add to this room?": "이 방에 누구를 초대하고 싶으세요?", | ||||
|     "Who would you like to communicate with?": "누구와 이야기하고 싶으세요?", | ||||
|     "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s님이 %(targetName)s니의 초대를 취소하셨어요.", | ||||
|     "Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "초대를 <acceptText>받아들이거나</acceptText> <declineText>거절</declineText>하시겠어요?", | ||||
|     "You already have existing direct chats with this user:": "이미 이 사용자와 직접 이야기하는 중이에요:", | ||||
|     "You are already in a call.": "이미 자신이 통화 중이네요.", | ||||
|     "You're not in any rooms yet! Press": "어떤 방에도 들어가 있지 않으세요! 누르세요", | ||||
|     "Press <StartChatButton> to start a chat with someone": "다른 사람과 이야기하려면 <StartChatButton>을 누르세요", | ||||
|     "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "주의: 키 확인 실패! %(userId)s와 장치 %(deviceId)s의 서명 키 \"%(fprint)s\"는 주어진 키 \"%(fingerprint)s\"와 맞지 않아요. 누가 이야기를 가로채는 중일 수도 있어요!", | ||||
|     "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "어떤 방에도 들어가 있지 않으세요! <CreateRoomButton>을 눌러서 방을 만들거나 <RoomDirectoryButton>를 눌러 목록에서 방을 찾아보세요", | ||||
|     "You are trying to access %(roomName)s.": "%(roomName)s에 들어가려고 하는 중이에요.", | ||||
|     "You cannot place a call with yourself.": "자신에게 전화를 걸 수는 없어요.", | ||||
|     "You cannot place VoIP calls in this browser.": "이 브라우저에서는 인터넷전화를 걸 수 없어요.", | ||||
|     "You do not have permission to post to this room": "이 방에서 글을 올릴 권한이 없어요", | ||||
|     "You have been banned from %(roomName)s by %(userName)s.": "%(userName)s님이 %(roomName)s에서 차단하셨어요.", | ||||
|     "You have been invited to join this room by %(inviterName)s": "%(inviterName)s님이 이 방에 초대하셨어요", | ||||
|     "You have been kicked from %(roomName)s by %(userName)s.": "%(userName)s님이 %(roomName)s에서 추방하셨어요." | ||||
| } | ||||
|  |  | |||
|  | @ -234,7 +234,7 @@ | |||
|     "Mute": "Dempen", | ||||
|     "Notifications": "Meldingen", | ||||
|     "Operation failed": "Actie mislukt", | ||||
|     "Please Register": "Registreer alstublieft", | ||||
|     "Please Register": "Registreer Alstublieft", | ||||
|     "powered by Matrix": "mogelijk gemaakt door Matrix", | ||||
|     "Remove": "Verwijderen", | ||||
|     "Room directory": "Kamerlijst", | ||||
|  | @ -279,10 +279,10 @@ | |||
|     "%(senderName)s placed a %(callType)s call.": "%(senderName)s heeft een %(callType)s-gesprek gestart.", | ||||
|     "Press": "Druk", | ||||
|     "Privacy warning": "Privacywaarschuwing", | ||||
|     "Private Chat": "Direct chatten", | ||||
|     "Private Chat": "Privégesprek", | ||||
|     "Privileged Users": "Gebruikers met rechten", | ||||
|     "Profile": "Profiel", | ||||
|     "Public Chat": "Publiek gesprek", | ||||
|     "Public Chat": "Publiek Gesprek", | ||||
|     "Reason": "Reden", | ||||
|     "Reason: %(reasonText)s": "Reden: %(reasonText)s", | ||||
|     "Revoke Moderator": "Beheerder terugtrekken", | ||||
|  | @ -291,9 +291,9 @@ | |||
|     "rejected": "verworpen", | ||||
|     "%(targetName)s rejected the invitation.": "%(targetName)s heeft de uitnodiging geweigerd.", | ||||
|     "Reject invitation": "Uitnodiging weigeren", | ||||
|     "Rejoin": "Opnieuw lid wordne", | ||||
|     "Rejoin": "Opnieuw toetreden", | ||||
|     "Remote addresses for this room:": "Adres op afstand voor deze ruimte:", | ||||
|     "Remove Contact Information?": "Contactinformatie verwijderen?", | ||||
|     "Remove Contact Information?": "Contactinformatie Verwijderen?", | ||||
|     "Send Invites": "Uitnodigingen versturen", | ||||
|     "Start a chat": "Gesprek starten", | ||||
|     "Start authentication": "Authenticatie starten", | ||||
|  | @ -502,5 +502,27 @@ | |||
|     "New Composer & Autocomplete": "Nieuwe Componist & Automatisch Aanvullen", | ||||
|     "New passwords don't match": "Nieuwe wachtwoorden komen niet overeen", | ||||
|     "New passwords must match each other.": "Nieuwe wachtwoorden moeten overeenkomen.", | ||||
|     "Once encryption is enabled for a room it cannot be turned off again (for now)": "Zodra versleuteling in een kamer is ingeschakeld kan het niet meer worden uitgeschakeld (voor nu)" | ||||
|     "Once encryption is enabled for a room it cannot be turned off again (for now)": "Zodra versleuteling in een kamer is ingeschakeld kan het niet meer worden uitgeschakeld (voor nu)", | ||||
|     "Once you've followed the link it contains, click below": "Zodra je de link dat het bevat hebt gevolgd, klik hieronder", | ||||
|     "Only people who have been invited": "Alleen personen die zijn uitgenodigd", | ||||
|     "Otherwise, <a>click here</a> to send a bug report.": "Klik anders <a>hier</a> om een foutmelding te versturen.", | ||||
|     "Please check your email and click on the link it contains. Once this is done, click continue.": "Bekijk je e-mail en klik op de link die het bevat. Zodra dit klaar is, klik op verder gaan.", | ||||
|     "Power level must be positive integer.": "Machtsniveau moet een positief heel getal zijn.", | ||||
|     "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s heeft zijn of haar weergavenaam (%(oldDisplayName)s) verwijderd.", | ||||
|     "%(senderName)s removed their profile picture.": "%(senderName)s heeft zijn of haar profielfoto verwijderd.", | ||||
|     "Failed to kick": "Niet gelukt om te kicken", | ||||
|     "Press <StartChatButton> to start a chat with someone": "Druk op <StartChatButton> om een gesprek met iemand te starten", | ||||
|     "Remove %(threePid)s?": "%(threePid)s verwijderen?", | ||||
|     "%(senderName)s requested a VoIP conference.": "%(senderName)s heeft een VoIP gesprek aangevraagd.", | ||||
|     "Report it": "Melden", | ||||
|     "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Het wachtwoord veranderen betekent momenteel dat alle eind-tot-eind versleutelingssleutels op alle apparaten veranderen waardoor versleutelde gespreksgeschiedenis onleesbaar wordt, behalve als je eerst de ruimte sleutels exporteert en daarna opnieuw importeert. Dit zal in de toekomst verbeterd worden.", | ||||
|     "restore": "herstellen", | ||||
|     "Results from DuckDuckGo": "Resultaten van DuckDuckGo", | ||||
|     "Return to app": "Naar de app terugkeren", | ||||
|     "Return to login screen": "Naar het inlogscherm terugkeren", | ||||
|     "Riot does not have permission to send you notifications - please check your browser settings": "Riot heeft geen permissie om je notificaties te versturen - controleer je browser instellingen", | ||||
|     "Riot was not given permission to send notifications - please try again": "Riot heeft geen permissie gekregen om notificaties te versturen - probeer het opnieuw", | ||||
|     "riot-web version:": "riot-web versie:", | ||||
|     "Room %(roomId)s not visible": "Ruimte %(roomId)s is niet zichtbaar", | ||||
|     "Room Colour": "Ruimte Kleur" | ||||
| } | ||||
|  |  | |||
|  | @ -356,6 +356,7 @@ | |||
|     "%(senderName)s placed a %(callType)s call.": "%(senderName)s fez uma chamada de %(callType)s.", | ||||
|     "Power level must be positive integer.": "O nível de permissões tem que ser um número inteiro e positivo.", | ||||
|     "Press": "Aperte", | ||||
|     "Press <StartChatButton> to start a chat with someone": "Clique em <StartChatButton> para iniciar a conversa com alguém", | ||||
|     "Reason": "Razão", | ||||
|     "%(targetName)s rejected the invitation.": "%(targetName)s recusou o convite.", | ||||
|     "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removeu o seu nome público (%(oldDisplayName)s).", | ||||
|  | @ -398,7 +399,7 @@ | |||
|     "VoIP is unsupported": "Chamada de voz não permitida", | ||||
|     "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s desfez o convite a %(targetName)s.", | ||||
|     "You are already in a call.": "Você já está em  uma chamada.", | ||||
|     "You're not in any rooms yet! Press": "Você ainda não está em nenhuma sala! Pressione", | ||||
|     "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "Você ainda não está em nenhuma sala! Clique em <CreateRoomButton> para criar uma sala ou em <RoomDirectoryButton> para navegar pela lista pública de salas", | ||||
|     "You are trying to access %(roomName)s.": "Você está tentando acessar a sala %(roomName)s.", | ||||
|     "You cannot place a call with yourself.": "Você não pode iniciar uma chamada.", | ||||
|     "You cannot place VoIP calls in this browser.": "Você não pode fazer chamadas de voz neste navegador.", | ||||
|  | @ -960,5 +961,14 @@ | |||
|     "Your home server does not support device management.": "O seu Servidor de Base não suporta o gerenciamento de dispositivos.", | ||||
|     "(~%(count)s results).one": "(~%(count)s resultado)", | ||||
|     "(~%(count)s results).other": "(~%(count)s resultados)", | ||||
|     "Device Name": "Nome do dispositivo" | ||||
|     "Device Name": "Nome do dispositivo", | ||||
|     "(could not connect media)": "(não foi possível conectar-se à mídia)", | ||||
|     "(no answer)": "(sem resposta)", | ||||
|     "(unknown failure: %(reason)s)": "(falha desconhecida: %(reason)s)", | ||||
|     "Your browser does not support the required cryptography extensions": "O seu navegador não suporta as extensões de criptografia necessárias", | ||||
|     "Not a valid Riot keyfile": "Não é um arquivo de chaves Riot válido", | ||||
|     "Authentication check failed: incorrect password?": "Falha ao checar a autenticação: senha incorreta?", | ||||
|     "Disable Peer-to-Peer for 1:1 calls": "Desabilitar as chamadas 1:1 par-a-par", | ||||
|     "Do you want to set an email address?": "Você deseja definir um endereço de e-mail?", | ||||
|     "This will allow you to reset your password and receive notifications.": "Isso permitirá que você redefina sua senha e receba notificações." | ||||
| } | ||||
|  |  | |||
|  | @ -85,7 +85,7 @@ | |||
|     "Favourite": "Избранное", | ||||
|     "favourite": "Избранное", | ||||
|     "Favourites": "Избранное", | ||||
|     "Filter room members": "Фильтр участников комнаты", | ||||
|     "Filter room members": "Поиск участников комнаты", | ||||
|     "Forget room": "Забыть комнату", | ||||
|     "Forgot your password?": "Вы забыли пароль?", | ||||
|     "For security, this session has been signed out. Please sign in again.": "Для обеспечения безопасности эта сессия была завершена. Войдите в систему еще раз.", | ||||
|  | @ -100,14 +100,14 @@ | |||
|     "Invalid Email Address": "Недействительный адрес электронной почты", | ||||
|     "invited": "invited", | ||||
|     "Invite new room members": "Пригласить новых участников в комнату", | ||||
|     "Invites": "Приглашать", | ||||
|     "Invites user with given id to current room": "Пригласить пользователя с данным ID в текущую комнату", | ||||
|     "Invites": "Приглашает", | ||||
|     "Invites user with given id to current room": "Приглашает пользователя с этим ID в текущую комнату", | ||||
|     "is a": "является", | ||||
|     "Sign in with": "Я хочу регистрироваться с", | ||||
|     "joined and left": "присоединенный и оставленный", | ||||
|     "joined": "присоединенный", | ||||
|     "joined and left": "зашёл и ушёл", | ||||
|     "joined": "зашёл", | ||||
|     "joined the room": "joined the room", | ||||
|     "Joins room with given alias": "Присоединяется к комнате с данным псевдонимом", | ||||
|     "Joins room with given alias": "зашёл в комнату с этим именем", | ||||
|     "Kicks user with given id": "Выгнать пользователя с заданным id", | ||||
|     "Labs": "Лаборатория", | ||||
|     "Leave room": "Уйти из комнаты", | ||||
|  | @ -116,7 +116,7 @@ | |||
|     "left the room": "left the room", | ||||
|     "Logged in as": "Зарегистрированный как", | ||||
|     "Login as guest": "Вход в систему как гость", | ||||
|     "Logout": "Выход из системы", | ||||
|     "Logout": "Выйти", | ||||
|     "Low priority": "Низкий приоритет", | ||||
|     "made future room history visible to": "made future room history visible to", | ||||
|     "Manage Integrations": "Управление Интеграциями", | ||||
|  | @ -128,7 +128,7 @@ | |||
|     "Never send encrypted messages to unverified devices from this device": "Никогда не отправлять зашифрованные сообщения на не верифицированные устройства с этого устройства", | ||||
|     "Never send encrypted messages to unverified devices in this room from this device": "Никогда не отправляйте зашифрованные сообщения на непроверенные устройства в этой комнате из вашего устройства", | ||||
|     "New password": "Новый пароль", | ||||
|     "New passwords must match each other.": "Новые пароли должны соответствовать друг другу.", | ||||
|     "New passwords must match each other.": "Новые пароли должны совпадать.", | ||||
|     "none": "никто", | ||||
|     "Notifications": "Уведомления", | ||||
|     " (not supported by this browser)": " (not supported by this browser)", | ||||
|  | @ -193,7 +193,7 @@ | |||
|     "(warning: cannot be disabled again!)": "(предупреждение: не может быть отключено!)", | ||||
|     "Warning!": "Предупреждение!", | ||||
|     "was banned": "запрещен", | ||||
|     "was invited": "приглашенный", | ||||
|     "was invited": "был приглашён", | ||||
|     "was kicked": "выброшен", | ||||
|     "was unbanned": "незапрещенный", | ||||
|     "was": "был", | ||||
|  | @ -650,10 +650,10 @@ | |||
|     "%(oneUser)schanged their avatar": "%(oneUser)sизменил своё изображение", | ||||
|     "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or <a>enable unsafe scripts</a>.": "Не возможно подключиться к серверу через HTTP, когда в строке браузера HTTPS. Используйте HTTPS или <a>включив небезопасные скрипты</a>.", | ||||
|     "Dismiss": "Отказ", | ||||
|     "Custom Server Options": "Расширенные настройки сервера", | ||||
|     "Custom Server Options": "Собственные настройки сервера", | ||||
|     "Mute": "Беззвучный", | ||||
|     "Operation failed": "Действие не удалось", | ||||
|     "powered by Matrix": "управляемый с Matrix", | ||||
|     "powered by Matrix": "Основано на Matrix", | ||||
|     "Add a topic": "Добавить тему", | ||||
|     "Show timestamps in 12 hour format (e.g. 2:30pm)": "Время отображать в 12 часовом формате (напр. 2:30pm)", | ||||
|     "Use compact timeline layout": "Компактное отображение", | ||||
|  | @ -700,7 +700,7 @@ | |||
|     "Import": "Импорт", | ||||
|     "Incorrect username and/or password.": "Неверное имя пользователя и/или пароль.", | ||||
|     "Invalid file%(extra)s": "Неправильный файл%(extra)s", | ||||
|     "Invited": "Приглашен", | ||||
|     "Invited": "Приглашён", | ||||
|     "Jump to first unread message.": "Перейти к первому непрочитанному сообщению.", | ||||
|     "List this room in %(domain)s's room directory?": "Показывать эту комнату в списке комнат %(domain)s?", | ||||
|     "Message not sent due to unknown devices being present": "Сообщение не было отправлено из-за присутствия неизвестного устройства", | ||||
|  | @ -896,7 +896,7 @@ | |||
|     "Admin tools": "Админ утилита", | ||||
|     "And %(count)s more...": "И %(count)s больше...", | ||||
|     "Alias (optional)": "Псевдоним (опционально)", | ||||
|     "<a>Click here</a> to join the discussion!": "<a> Нажми здесь</a> чтоб присоединиться к обсуждению!", | ||||
|     "<a>Click here</a> to join the discussion!": "<a>Нажмите здесь</a>, чтобы присоединиться к обсуждению!", | ||||
|     "Close": "Закрыть", | ||||
|     "Disable Notifications": "Отключить оповещение", | ||||
|     "Drop File Here": "Вставить сюда файл", | ||||
|  | @ -909,7 +909,7 @@ | |||
|     "Incoming call from %(name)s": "Входящий вызов от %(name)s", | ||||
|     "Incoming video call from %(name)s": "Входящий видио вызов от %(name)s", | ||||
|     "Incoming voice call from %(name)s": "Входящий голосовой вызов от %(name)s", | ||||
|     "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Присоединен как  <voiceText> голос</voiceText>  или <videoText> видио </videoText>.", | ||||
|     "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Войти как <voiceText>голос</voiceText> или <videoText>видео</videoText>.", | ||||
|     "Last seen": "В последний раз видели", | ||||
|     "Level:": "Уровень:", | ||||
|     "No display name": "Нет отображаемое имя", | ||||
|  | @ -958,5 +958,7 @@ | |||
|     "Your browser does not support the required cryptography extensions": "Ваш браузер не поддерживает требуемые расширения для криптографии", | ||||
|     "Authentication check failed: incorrect password?": "Ошибка авторизации: неверный пароль?", | ||||
|     "Do you want to set an email address?": "Вы хотите указать адрес электронной почты?", | ||||
|     "This will allow you to reset your password and receive notifications.": "Это позволит вам сбросить пароль и получить уведомления." | ||||
|     "This will allow you to reset your password and receive notifications.": "Это позволит вам сбросить пароль и получить уведомления.", | ||||
|     "Press <StartChatButton> to start a chat with someone": "Нажмите <StartChatButton> для начала чата с кем либо", | ||||
|     "You're not in any rooms yet! Press <CreateRoomButton> to make a room or <RoomDirectoryButton> to browse the directory": "Вы еще не в комнатах! Нажмите <CreateRoomButton>, чтобы создать комнату или <RoomDirectoryButton>, чтобы просмотреть каталог" | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Luke Barnard
						Luke Barnard