Merge branches 'develop' and 't3chguy/reset_favicon_on_logout' of github.com:matrix-org/matrix-react-sdk into t3chguy/reset_favicon_on_logout
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> # Conflicts: # src/components/structures/MatrixChat.js
This commit is contained in:
commit
04aed416d2
30 changed files with 1868 additions and 384 deletions
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",
|
||||
|
|
138
src/KeyRequestHandler.js
Normal file
138
src/KeyRequestHandler.js
Normal file
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
119
src/Lifecycle.js
119
src/Lifecycle.js
|
@ -35,26 +35,20 @@ import { _t } from './languageHandler';
|
|||
* Called at startup, to attempt to build a logged-in Matrix session. It tries
|
||||
* a number of things:
|
||||
*
|
||||
* 1. if we have a loginToken in the (real) query params, it uses that to log
|
||||
* in.
|
||||
*
|
||||
* 2. if we have a guest access token in the fragment query params, it uses
|
||||
* 1. if we have a guest access token in the fragment query params, it uses
|
||||
* that.
|
||||
*
|
||||
* 3. if an access token is stored in local storage (from a previous session),
|
||||
* 2. if an access token is stored in local storage (from a previous session),
|
||||
* it uses that.
|
||||
*
|
||||
* 4. it attempts to auto-register as a guest user.
|
||||
* 3. it attempts to auto-register as a guest user.
|
||||
*
|
||||
* If any of steps 1-4 are successful, it will call {_doSetLoggedIn}, which in
|
||||
* turn will raise on_logged_in and will_start_client events.
|
||||
*
|
||||
* @param {object} opts
|
||||
*
|
||||
* @param {object} opts.realQueryParams: string->string map of the
|
||||
* query-parameters extracted from the real query-string of the starting
|
||||
* URI.
|
||||
*
|
||||
* @param {object} opts.fragmentQueryParams: string->string map of the
|
||||
* query-parameters extracted from the #-fragment of the starting URI.
|
||||
*
|
||||
|
@ -68,9 +62,10 @@ import { _t } from './languageHandler';
|
|||
* true; defines the IS to use.
|
||||
*
|
||||
* @returns {Promise} a promise which resolves when the above process completes.
|
||||
* Resolves to `true` if we ended up starting a session, or `false` if we
|
||||
* failed.
|
||||
*/
|
||||
export function loadSession(opts) {
|
||||
const realQueryParams = opts.realQueryParams || {};
|
||||
const fragmentQueryParams = opts.fragmentQueryParams || {};
|
||||
let enableGuest = opts.enableGuest || false;
|
||||
const guestHsUrl = opts.guestHsUrl;
|
||||
|
@ -82,14 +77,6 @@ export function loadSession(opts) {
|
|||
enableGuest = false;
|
||||
}
|
||||
|
||||
if (realQueryParams.loginToken) {
|
||||
if (!realQueryParams.homeserver) {
|
||||
console.warn("Cannot log in with token: can't determine HS URL to use");
|
||||
} else {
|
||||
return _loginWithToken(realQueryParams, defaultDeviceDisplayName);
|
||||
}
|
||||
}
|
||||
|
||||
if (enableGuest &&
|
||||
fragmentQueryParams.guest_user_id &&
|
||||
fragmentQueryParams.guest_access_token
|
||||
|
@ -101,12 +88,12 @@ export function loadSession(opts) {
|
|||
homeserverUrl: guestHsUrl,
|
||||
identityServerUrl: guestIsUrl,
|
||||
guest: true,
|
||||
}, true);
|
||||
}, true).then(() => true);
|
||||
}
|
||||
|
||||
return _restoreFromLocalStorage().then((success) => {
|
||||
if (success) {
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (enableGuest) {
|
||||
|
@ -114,10 +101,30 @@ export function loadSession(opts) {
|
|||
}
|
||||
|
||||
// fall back to login screen
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
function _loginWithToken(queryParams, defaultDeviceDisplayName) {
|
||||
/**
|
||||
* @param {Object} queryParams string->string map of the
|
||||
* query-parameters extracted from the real query-string of the starting
|
||||
* URI.
|
||||
*
|
||||
* @param {String} defaultDeviceDisplayName
|
||||
*
|
||||
* @returns {Promise} promise which resolves to true if we completed the token
|
||||
* login, else false
|
||||
*/
|
||||
export function attemptTokenLogin(queryParams, defaultDeviceDisplayName) {
|
||||
if (!queryParams.loginToken) {
|
||||
return q(false);
|
||||
}
|
||||
|
||||
if (!queryParams.homeserver) {
|
||||
console.warn("Cannot log in with token: can't determine HS URL to use");
|
||||
return q(false);
|
||||
}
|
||||
|
||||
// create a temporary MatrixClient to do the login
|
||||
const client = Matrix.createClient({
|
||||
baseUrl: queryParams.homeserver,
|
||||
|
@ -130,17 +137,21 @@ function _loginWithToken(queryParams, defaultDeviceDisplayName) {
|
|||
},
|
||||
).then(function(data) {
|
||||
console.log("Logged in with token");
|
||||
return _doSetLoggedIn({
|
||||
userId: data.user_id,
|
||||
deviceId: data.device_id,
|
||||
accessToken: data.access_token,
|
||||
homeserverUrl: queryParams.homeserver,
|
||||
identityServerUrl: queryParams.identityServer,
|
||||
guest: false,
|
||||
}, true);
|
||||
}, (err) => {
|
||||
return _clearStorage().then(() => {
|
||||
_persistCredentialsToLocalStorage({
|
||||
userId: data.user_id,
|
||||
deviceId: data.device_id,
|
||||
accessToken: data.access_token,
|
||||
homeserverUrl: queryParams.homeserver,
|
||||
identityServerUrl: queryParams.identityServer,
|
||||
guest: false,
|
||||
});
|
||||
return true;
|
||||
});
|
||||
}).catch((err) => {
|
||||
console.error("Failed to log in with login token: " + err + " " +
|
||||
err.data);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -168,9 +179,10 @@ function _registerAsGuest(hsUrl, isUrl, defaultDeviceDisplayName) {
|
|||
homeserverUrl: hsUrl,
|
||||
identityServerUrl: isUrl,
|
||||
guest: true,
|
||||
}, true);
|
||||
}, true).then(() => true);
|
||||
}, (err) => {
|
||||
console.error("Failed to register as guest: " + err + " " + err.data);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -282,10 +294,12 @@ export function initRtsClient(url) {
|
|||
* storage before starting the new client.
|
||||
*
|
||||
* @param {MatrixClientCreds} credentials The credentials to use
|
||||
*
|
||||
* @returns {Promise} promise which resolves to the new MatrixClient once it has been started
|
||||
*/
|
||||
export function setLoggedIn(credentials) {
|
||||
stopMatrixClient();
|
||||
_doSetLoggedIn(credentials, true);
|
||||
return _doSetLoggedIn(credentials, true);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -295,7 +309,7 @@ export function setLoggedIn(credentials) {
|
|||
* @param {MatrixClientCreds} credentials
|
||||
* @param {Boolean} clearStorage
|
||||
*
|
||||
* returns a Promise which resolves once the client has been started
|
||||
* @returns {Promise} promise which resolves to the new MatrixClient once it has been started
|
||||
*/
|
||||
async function _doSetLoggedIn(credentials, clearStorage) {
|
||||
credentials.guest = Boolean(credentials.guest);
|
||||
|
@ -322,23 +336,10 @@ async function _doSetLoggedIn(credentials, clearStorage) {
|
|||
// Resolves by default
|
||||
let teamPromise = Promise.resolve(null);
|
||||
|
||||
// persist the session
|
||||
|
||||
if (localStorage) {
|
||||
try {
|
||||
localStorage.setItem("mx_hs_url", credentials.homeserverUrl);
|
||||
localStorage.setItem("mx_is_url", credentials.identityServerUrl);
|
||||
localStorage.setItem("mx_user_id", credentials.userId);
|
||||
localStorage.setItem("mx_access_token", credentials.accessToken);
|
||||
localStorage.setItem("mx_is_guest", JSON.stringify(credentials.guest));
|
||||
|
||||
// if we didn't get a deviceId from the login, leave mx_device_id unset,
|
||||
// rather than setting it to "undefined".
|
||||
//
|
||||
// (in this case MatrixClient doesn't bother with the crypto stuff
|
||||
// - that's fine for us).
|
||||
if (credentials.deviceId) {
|
||||
localStorage.setItem("mx_device_id", credentials.deviceId);
|
||||
}
|
||||
_persistCredentialsToLocalStorage(credentials);
|
||||
|
||||
// The user registered as a PWLU (PassWord-Less User), the generated password
|
||||
// is cached here such that the user can change it at a later time.
|
||||
|
@ -349,8 +350,6 @@ async function _doSetLoggedIn(credentials, clearStorage) {
|
|||
cachedPassword: credentials.password,
|
||||
});
|
||||
}
|
||||
|
||||
console.log("Session persisted for %s", credentials.userId);
|
||||
} catch (e) {
|
||||
console.warn("Error using local storage: can't persist session!", e);
|
||||
}
|
||||
|
@ -377,6 +376,26 @@ async function _doSetLoggedIn(credentials, clearStorage) {
|
|||
});
|
||||
|
||||
startMatrixClient();
|
||||
return MatrixClientPeg.get();
|
||||
}
|
||||
|
||||
function _persistCredentialsToLocalStorage(credentials) {
|
||||
localStorage.setItem("mx_hs_url", credentials.homeserverUrl);
|
||||
localStorage.setItem("mx_is_url", credentials.identityServerUrl);
|
||||
localStorage.setItem("mx_user_id", credentials.userId);
|
||||
localStorage.setItem("mx_access_token", credentials.accessToken);
|
||||
localStorage.setItem("mx_is_guest", JSON.stringify(credentials.guest));
|
||||
|
||||
// if we didn't get a deviceId from the login, leave mx_device_id unset,
|
||||
// rather than setting it to "undefined".
|
||||
//
|
||||
// (in this case MatrixClient doesn't bother with the crypto stuff
|
||||
// - that's fine for us).
|
||||
if (credentials.deviceId) {
|
||||
localStorage.setItem("mx_device_id", credentials.deviceId);
|
||||
}
|
||||
|
||||
console.log("Session persisted for %s", credentials.userId);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -239,7 +239,6 @@ export default React.createClass({
|
|||
page_element = <UserSettings
|
||||
onClose={this.props.onUserSettingsClose}
|
||||
brand={this.props.config.brand}
|
||||
collapsedRhs={this.props.collapse_rhs}
|
||||
enableLabs={this.props.config.enableLabs}
|
||||
referralBaseUrl={this.props.config.referralBaseUrl}
|
||||
teamToken={this.props.teamToken}
|
||||
|
@ -270,7 +269,6 @@ export default React.createClass({
|
|||
this.props.config.teamServerConfig.teamServerURL : null;
|
||||
|
||||
page_element = <HomePage
|
||||
collapsedRhs={this.props.collapse_rhs}
|
||||
teamServerUrl={teamServerUrl}
|
||||
teamToken={this.props.teamToken}
|
||||
homePageUrl={this.props.config.welcomePageUrl}
|
||||
|
|
|
@ -41,9 +41,44 @@ 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 */
|
||||
const VIEWS = {
|
||||
// a special initial state which is only used at startup, while we are
|
||||
// trying to re-animate a matrix client or register as a guest.
|
||||
LOADING: 0,
|
||||
|
||||
// we are showing the login view
|
||||
LOGIN: 1,
|
||||
|
||||
// we are showing the registration view
|
||||
REGISTER: 2,
|
||||
|
||||
// completeing the registration flow
|
||||
POST_REGISTRATION: 3,
|
||||
|
||||
// showing the 'forgot password' view
|
||||
FORGOT_PASSWORD: 4,
|
||||
|
||||
// we have valid matrix credentials (either via an explicit login, via the
|
||||
// initial re-animation/guest registration, or via a registration), and are
|
||||
// now setting up a matrixclient to talk to it. This isn't an instant
|
||||
// process because (a) we need to clear out indexeddb, and (b) we need to
|
||||
// talk to the team server; while it is going on we show a big spinner.
|
||||
LOGGING_IN: 5,
|
||||
|
||||
// we are logged in with an active matrix client.
|
||||
LOGGED_IN: 6,
|
||||
};
|
||||
|
||||
module.exports = React.createClass({
|
||||
// we export this so that the integration tests can use it :-S
|
||||
statics: {
|
||||
VIEWS: VIEWS,
|
||||
},
|
||||
|
||||
displayName: 'MatrixChat',
|
||||
|
||||
propTypes: {
|
||||
|
@ -59,8 +94,8 @@ module.exports = React.createClass({
|
|||
// the initial queryParams extracted from the hash-fragment of the URI
|
||||
startingFragmentQueryParams: React.PropTypes.object,
|
||||
|
||||
// called when the session load completes
|
||||
onLoadCompleted: React.PropTypes.func,
|
||||
// called when we have completed a token login
|
||||
onTokenLoginCompleted: React.PropTypes.func,
|
||||
|
||||
// Represents the screen to display as a result of parsing the initial
|
||||
// window.location
|
||||
|
@ -93,14 +128,11 @@ module.exports = React.createClass({
|
|||
|
||||
getInitialState: function() {
|
||||
const s = {
|
||||
loading: true,
|
||||
screen: undefined,
|
||||
screenAfterLogin: this.props.initialScreenAfterLogin,
|
||||
// the master view we are showing.
|
||||
view: VIEWS.LOADING,
|
||||
|
||||
// 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,
|
||||
// a thing to call showScreen with once login completes.
|
||||
screenAfterLogin: this.props.initialScreenAfterLogin,
|
||||
|
||||
// What the LoggedInView would be showing if visible
|
||||
page_type: null,
|
||||
|
@ -113,8 +145,6 @@ module.exports = React.createClass({
|
|||
// If we're trying to just view a user ID (i.e. /user URL), this is it
|
||||
viewUserId: null,
|
||||
|
||||
loggedIn: false,
|
||||
loggingIn: false,
|
||||
collapse_lhs: false,
|
||||
collapse_rhs: false,
|
||||
ready: false,
|
||||
|
@ -143,7 +173,7 @@ module.exports = React.createClass({
|
|||
realQueryParams: {},
|
||||
startingFragmentQueryParams: {},
|
||||
config: {},
|
||||
onLoadCompleted: () => {},
|
||||
onTokenLoginCompleted: () => {},
|
||||
};
|
||||
},
|
||||
|
||||
|
@ -266,39 +296,49 @@ module.exports = React.createClass({
|
|||
const teamServerConfig = this.props.config.teamServerConfig || {};
|
||||
Lifecycle.initRtsClient(teamServerConfig.teamServerURL);
|
||||
|
||||
// if the user has followed a login or register link, don't reanimate
|
||||
// the old creds, but rather go straight to the relevant page
|
||||
// the first thing to do is to try the token params in the query-string
|
||||
Lifecycle.attemptTokenLogin(this.props.realQueryParams).then((loggedIn) => {
|
||||
if(loggedIn) {
|
||||
this.props.onTokenLoginCompleted();
|
||||
|
||||
const firstScreen = this.state.screenAfterLogin ?
|
||||
this.state.screenAfterLogin.screen : null;
|
||||
// don't do anything else until the page reloads - just stay in
|
||||
// the 'loading' state.
|
||||
return;
|
||||
}
|
||||
|
||||
if (firstScreen === 'login' ||
|
||||
firstScreen === 'register' ||
|
||||
firstScreen === 'forgot_password') {
|
||||
this.props.onLoadCompleted();
|
||||
this.setState({loading: false});
|
||||
this._showScreenAfterLogin();
|
||||
return;
|
||||
}
|
||||
// if the user has followed a login or register link, don't reanimate
|
||||
// the old creds, but rather go straight to the relevant page
|
||||
const firstScreen = this.state.screenAfterLogin ?
|
||||
this.state.screenAfterLogin.screen : null;
|
||||
|
||||
// the extra q() ensures that synchronous exceptions hit the same codepath as
|
||||
// asynchronous ones.
|
||||
q().then(() => {
|
||||
return Lifecycle.loadSession({
|
||||
realQueryParams: this.props.realQueryParams,
|
||||
fragmentQueryParams: this.props.startingFragmentQueryParams,
|
||||
enableGuest: this.props.enableGuest,
|
||||
guestHsUrl: this.getCurrentHsUrl(),
|
||||
guestIsUrl: this.getCurrentIsUrl(),
|
||||
defaultDeviceDisplayName: this.props.defaultDeviceDisplayName,
|
||||
if (firstScreen === 'login' ||
|
||||
firstScreen === 'register' ||
|
||||
firstScreen === 'forgot_password') {
|
||||
this.setState({loading: false});
|
||||
this._showScreenAfterLogin();
|
||||
return;
|
||||
}
|
||||
|
||||
// the extra q() ensures that synchronous exceptions hit the same codepath as
|
||||
// asynchronous ones.
|
||||
return q().then(() => {
|
||||
return Lifecycle.loadSession({
|
||||
fragmentQueryParams: this.props.startingFragmentQueryParams,
|
||||
enableGuest: this.props.enableGuest,
|
||||
guestHsUrl: this.getCurrentHsUrl(),
|
||||
guestIsUrl: this.getCurrentIsUrl(),
|
||||
defaultDeviceDisplayName: this.props.defaultDeviceDisplayName,
|
||||
});
|
||||
}).catch((e) => {
|
||||
console.error("Unable to load session", e);
|
||||
return false;
|
||||
}).then((loadedSession) => {
|
||||
if (!loadedSession) {
|
||||
// fall back to showing the login screen
|
||||
dis.dispatch({action: "start_login"});
|
||||
}
|
||||
});
|
||||
}).catch((e) => {
|
||||
console.error("Unable to load session", e);
|
||||
}).done(()=>{
|
||||
// stuff this through the dispatcher so that it happens
|
||||
// after the on_logged_in action.
|
||||
dis.dispatch({action: 'load_completed'});
|
||||
});
|
||||
}).done();
|
||||
},
|
||||
|
||||
componentWillUnmount: function() {
|
||||
|
@ -317,18 +357,19 @@ module.exports = React.createClass({
|
|||
}
|
||||
},
|
||||
|
||||
setStateForNewScreen: function(state) {
|
||||
setStateForNewView: function(state) {
|
||||
if (state.view === undefined) {
|
||||
throw new Error("setStateForNewView with no view!");
|
||||
}
|
||||
const newState = {
|
||||
screen: undefined,
|
||||
viewUserId: null,
|
||||
loggedIn: false,
|
||||
ready: false,
|
||||
};
|
||||
Object.assign(newState, state);
|
||||
this.setState(newState);
|
||||
},
|
||||
|
||||
onAction: function(payload) {
|
||||
// console.log(`MatrixClientPeg.onAction: ${payload.action}`);
|
||||
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
||||
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
|
||||
|
||||
|
@ -340,26 +381,19 @@ module.exports = React.createClass({
|
|||
this._startRegistration(payload.params || {});
|
||||
break;
|
||||
case 'start_login':
|
||||
if (MatrixClientPeg.get() &&
|
||||
MatrixClientPeg.get().isGuest()
|
||||
) {
|
||||
this.setState({
|
||||
guestCreds: MatrixClientPeg.getCredentials(),
|
||||
});
|
||||
}
|
||||
this.setStateForNewScreen({
|
||||
screen: 'login',
|
||||
this.setStateForNewView({
|
||||
view: VIEWS.LOGIN,
|
||||
});
|
||||
this.notifyNewScreen('login');
|
||||
break;
|
||||
case 'start_post_registration':
|
||||
this.setState({ // don't clobber loggedIn status
|
||||
screen: 'post_registration',
|
||||
this.setState({
|
||||
view: VIEWS.POST_REGISTRATION,
|
||||
});
|
||||
break;
|
||||
case 'start_password_recovery':
|
||||
this.setStateForNewScreen({
|
||||
screen: 'forgot_password',
|
||||
this.setStateForNewView({
|
||||
view: VIEWS.FORGOT_PASSWORD,
|
||||
});
|
||||
this.notifyNewScreen('forgot_password');
|
||||
break;
|
||||
|
@ -500,10 +534,11 @@ 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).
|
||||
this.setState({loggingIn: true, ready: false});
|
||||
// NB. This does not touch 'ready' since if our dispatches
|
||||
// are delayed, the sync could already have completed
|
||||
this.setStateForNewView({
|
||||
view: VIEWS.LOGGING_IN,
|
||||
});
|
||||
break;
|
||||
case 'on_logged_in':
|
||||
this._onLoggedIn(payload.teamToken);
|
||||
|
@ -514,15 +549,15 @@ module.exports = React.createClass({
|
|||
case 'will_start_client':
|
||||
this._onWillStartClient();
|
||||
break;
|
||||
case 'load_completed':
|
||||
this._onLoadCompleted();
|
||||
break;
|
||||
case 'new_version':
|
||||
this.onVersion(
|
||||
payload.currentVersion, payload.newVersion,
|
||||
payload.releaseNotes,
|
||||
);
|
||||
break;
|
||||
case 'send_event':
|
||||
this.onSendEvent(payload.room_id, payload.event);
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -537,8 +572,8 @@ module.exports = React.createClass({
|
|||
},
|
||||
|
||||
_startRegistration: function(params) {
|
||||
this.setStateForNewScreen({
|
||||
screen: 'register',
|
||||
this.setStateForNewView({
|
||||
view: VIEWS.REGISTER,
|
||||
// these params may be undefined, but if they are,
|
||||
// unset them from our state: we don't want to
|
||||
// resume a previous registration session if the
|
||||
|
@ -846,14 +881,6 @@ module.exports = React.createClass({
|
|||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Called when the sessionloader has finished
|
||||
*/
|
||||
_onLoadCompleted: function() {
|
||||
this.props.onLoadCompleted();
|
||||
this.setState({loading: false});
|
||||
},
|
||||
|
||||
/**
|
||||
* Called whenever someone changes the theme
|
||||
*
|
||||
|
@ -906,9 +933,7 @@ module.exports = React.createClass({
|
|||
*/
|
||||
_onLoggedIn: function(teamToken) {
|
||||
this.setState({
|
||||
guestCreds: null,
|
||||
loggedIn: true,
|
||||
loggingIn: false,
|
||||
view: VIEWS.LOGGED_IN,
|
||||
});
|
||||
|
||||
if (teamToken) {
|
||||
|
@ -970,8 +995,8 @@ module.exports = React.createClass({
|
|||
_onLoggedOut: function() {
|
||||
this._setPageSubtitle();
|
||||
this.notifyNewScreen('login');
|
||||
this.setStateForNewScreen({
|
||||
loggedIn: false,
|
||||
this.setStateForNewView({
|
||||
view: VIEWS.LOGIN,
|
||||
ready: false,
|
||||
collapse_lhs: false,
|
||||
collapse_rhs: false,
|
||||
|
@ -987,6 +1012,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
|
||||
|
@ -1057,6 +1086,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) {
|
||||
|
@ -1134,7 +1171,7 @@ module.exports = React.createClass({
|
|||
|
||||
// we can't view a room unless we're logged in
|
||||
// (a guest account is fine)
|
||||
if (this.state.loggedIn) {
|
||||
if (this.state.view === VIEWS.LOGGED_IN) {
|
||||
dis.dispatch(payload);
|
||||
}
|
||||
} else if (screen.indexOf('user/') == 0) {
|
||||
|
@ -1232,29 +1269,25 @@ 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
|
||||
onRegistered: function(credentials, teamToken) {
|
||||
// XXX: These both should be in state or ideally store(s) because we risk not
|
||||
// rendering the most up-to-date view of state otherwise.
|
||||
// teamToken may not be truthy
|
||||
this._teamToken = teamToken;
|
||||
this._is_registered = true;
|
||||
Lifecycle.setLoggedIn(credentials);
|
||||
return Lifecycle.setLoggedIn(credentials);
|
||||
},
|
||||
|
||||
onFinishPostRegistration: function() {
|
||||
// Don't confuse this with "PageType" which is the middle window to show
|
||||
this.setState({
|
||||
screen: undefined,
|
||||
view: VIEWS.LOGGED_IN,
|
||||
});
|
||||
this.showScreen("settings");
|
||||
},
|
||||
|
@ -1268,6 +1301,27 @@ module.exports = React.createClass({
|
|||
});
|
||||
},
|
||||
|
||||
onSendEvent: function(roomId, event) {
|
||||
const cli = MatrixClientPeg.get();
|
||||
if (!cli) {
|
||||
dis.dispatch({action: 'message_send_failed'});
|
||||
return;
|
||||
}
|
||||
|
||||
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'});
|
||||
});
|
||||
},
|
||||
|
||||
_setPageSubtitle: function(subtitle='') {
|
||||
document.title = `Riot ${subtitle}`;
|
||||
},
|
||||
|
@ -1326,11 +1380,9 @@ module.exports = React.createClass({
|
|||
},
|
||||
|
||||
render: function() {
|
||||
// `loading` might be set to false before `loggedIn = true`, causing the default
|
||||
// (`<Login>`) to be visible for a few MS (say, whilst a request is in-flight to
|
||||
// the RTS). So in the meantime, use `loggingIn`, which is true between
|
||||
// actions `on_logging_in` and `on_logged_in`.
|
||||
if (this.state.loading || this.state.loggingIn) {
|
||||
// console.log(`Rendering MatrixChat with view ${this.state.view}`);
|
||||
|
||||
if (this.state.view === VIEWS.LOADING || this.state.view === VIEWS.LOGGING_IN) {
|
||||
const Spinner = sdk.getComponent('elements.Spinner');
|
||||
return (
|
||||
<div className="mx_MatrixChat_splash">
|
||||
|
@ -1340,7 +1392,7 @@ module.exports = React.createClass({
|
|||
}
|
||||
|
||||
// needs to be before normal PageTypes as you are logged in technically
|
||||
if (this.state.screen == 'post_registration') {
|
||||
if (this.state.view === VIEWS.POST_REGISTRATION) {
|
||||
const PostRegistration = sdk.getComponent('structures.login.PostRegistration');
|
||||
return (
|
||||
<PostRegistration
|
||||
|
@ -1348,38 +1400,42 @@ module.exports = React.createClass({
|
|||
);
|
||||
}
|
||||
|
||||
// `ready` and `loggedIn` may be set before `page_type` (because the
|
||||
// latter is set via the dispatcher). If we don't yet have a `page_type`,
|
||||
// keep showing the spinner for now.
|
||||
if (this.state.loggedIn && this.state.ready && this.state.page_type) {
|
||||
/* for now, we stuff the entirety of our props and state into the LoggedInView.
|
||||
* we should go through and figure out what we actually need to pass down, as well
|
||||
* as using something like redux to avoid having a billion bits of state kicking around.
|
||||
*/
|
||||
const LoggedInView = sdk.getComponent('structures.LoggedInView');
|
||||
return (
|
||||
<LoggedInView ref="loggedInView" matrixClient={MatrixClientPeg.get()}
|
||||
onRoomCreated={this.onRoomCreated}
|
||||
onUserSettingsClose={this.onUserSettingsClose}
|
||||
onRegistered={this.onRegistered}
|
||||
currentRoomId={this.state.currentRoomId}
|
||||
teamToken={this._teamToken}
|
||||
{...this.props}
|
||||
{...this.state}
|
||||
/>
|
||||
);
|
||||
} else if (this.state.loggedIn) {
|
||||
// we think we are logged in, but are still waiting for the /sync to complete
|
||||
const Spinner = sdk.getComponent('elements.Spinner');
|
||||
return (
|
||||
<div className="mx_MatrixChat_splash">
|
||||
<Spinner />
|
||||
<a href="#" className="mx_MatrixChat_splashButtons" onClick={ this.onLogoutClick }>
|
||||
{ _t('Logout') }
|
||||
</a>
|
||||
</div>
|
||||
);
|
||||
} else if (this.state.screen == 'register') {
|
||||
if (this.state.view === VIEWS.LOGGED_IN) {
|
||||
// `ready` and `view==LOGGED_IN` may be set before `page_type` (because the
|
||||
// latter is set via the dispatcher). If we don't yet have a `page_type`,
|
||||
// keep showing the spinner for now.
|
||||
if (this.state.ready && this.state.page_type) {
|
||||
/* for now, we stuff the entirety of our props and state into the LoggedInView.
|
||||
* we should go through and figure out what we actually need to pass down, as well
|
||||
* as using something like redux to avoid having a billion bits of state kicking around.
|
||||
*/
|
||||
const LoggedInView = sdk.getComponent('structures.LoggedInView');
|
||||
return (
|
||||
<LoggedInView ref="loggedInView" matrixClient={MatrixClientPeg.get()}
|
||||
onRoomCreated={this.onRoomCreated}
|
||||
onUserSettingsClose={this.onUserSettingsClose}
|
||||
onRegistered={this.onRegistered}
|
||||
currentRoomId={this.state.currentRoomId}
|
||||
teamToken={this._teamToken}
|
||||
{...this.props}
|
||||
{...this.state}
|
||||
/>
|
||||
);
|
||||
} else {
|
||||
// we think we are logged in, but are still waiting for the /sync to complete
|
||||
const Spinner = sdk.getComponent('elements.Spinner');
|
||||
return (
|
||||
<div className="mx_MatrixChat_splash">
|
||||
<Spinner />
|
||||
<a href="#" className="mx_MatrixChat_splashButtons" onClick={ this.onLogoutClick }>
|
||||
{ _t('Logout') }
|
||||
</a>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (this.state.view === VIEWS.REGISTER) {
|
||||
const Registration = sdk.getComponent('structures.login.Registration');
|
||||
return (
|
||||
<Registration
|
||||
|
@ -1399,10 +1455,13 @@ 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}
|
||||
/>
|
||||
);
|
||||
} else if (this.state.screen == 'forgot_password') {
|
||||
}
|
||||
|
||||
|
||||
if (this.state.view === VIEWS.FORGOT_PASSWORD) {
|
||||
const ForgotPassword = sdk.getComponent('structures.login.ForgotPassword');
|
||||
return (
|
||||
<ForgotPassword
|
||||
|
@ -1414,7 +1473,9 @@ module.exports = React.createClass({
|
|||
onRegisterClick={this.onRegisterClick}
|
||||
onLoginClick={this.onLoginClick} />
|
||||
);
|
||||
} else {
|
||||
}
|
||||
|
||||
if (this.state.view === VIEWS.LOGIN) {
|
||||
const Login = sdk.getComponent('structures.login.Login');
|
||||
return (
|
||||
<Login
|
||||
|
@ -1428,9 +1489,11 @@ 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}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
console.error(`Unknown view ${this.state.view}`);
|
||||
},
|
||||
});
|
||||
|
|
|
@ -93,6 +93,7 @@ module.exports = React.createClass({
|
|||
roomId: null,
|
||||
roomLoading: true,
|
||||
peekLoading: false,
|
||||
shouldPeek: true,
|
||||
|
||||
// The event to be scrolled to initially
|
||||
initialEventId: null,
|
||||
|
@ -168,8 +169,14 @@ module.exports = React.createClass({
|
|||
initialEventId: RoomViewStore.getInitialEventId(),
|
||||
initialEventPixelOffset: RoomViewStore.getInitialEventPixelOffset(),
|
||||
isInitialEventHighlighted: RoomViewStore.isInitialEventHighlighted(),
|
||||
forwardingEvent: RoomViewStore.getForwardingEvent(),
|
||||
shouldPeek: RoomViewStore.shouldPeek(),
|
||||
};
|
||||
|
||||
// finished joining, start waiting for a room and show a spinner. See onRoom.
|
||||
newState.waitingForRoom = this.state.joining && !newState.joining &&
|
||||
!RoomViewStore.getJoinError();
|
||||
|
||||
// Temporary logging to diagnose https://github.com/vector-im/riot-web/issues/4307
|
||||
console.log(
|
||||
'RVS update:',
|
||||
|
@ -177,12 +184,11 @@ module.exports = React.createClass({
|
|||
newState.roomAlias,
|
||||
'loading?', newState.roomLoading,
|
||||
'joining?', newState.joining,
|
||||
'initial?', initial,
|
||||
'waiting?', newState.waitingForRoom,
|
||||
'shouldPeek?', newState.shouldPeek,
|
||||
);
|
||||
|
||||
// finished joining, start waiting for a room and show a spinner. See onRoom.
|
||||
newState.waitingForRoom = this.state.joining && !newState.joining &&
|
||||
!RoomViewStore.getJoinError();
|
||||
|
||||
// NB: This does assume that the roomID will not change for the lifetime of
|
||||
// the RoomView instance
|
||||
if (initial) {
|
||||
|
@ -238,7 +244,7 @@ module.exports = React.createClass({
|
|||
if (!this.state.joining && this.state.roomId) {
|
||||
if (this.props.autoJoin) {
|
||||
this.onJoinButtonClicked();
|
||||
} else if (!room) {
|
||||
} else if (!room && this.state.shouldPeek) {
|
||||
console.log("Attempting to peek into room %s", this.state.roomId);
|
||||
this.setState({
|
||||
peekLoading: true,
|
||||
|
@ -452,11 +458,6 @@ module.exports = React.createClass({
|
|||
callState: callState
|
||||
});
|
||||
|
||||
break;
|
||||
case 'forward_event':
|
||||
this.setState({
|
||||
forwardingEvent: payload.content,
|
||||
});
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
@ -1164,8 +1165,13 @@ module.exports = React.createClass({
|
|||
this.updateTint();
|
||||
this.setState({
|
||||
editingRoomSettings: false,
|
||||
forwardingEvent: null,
|
||||
});
|
||||
if (this.state.forwardingEvent) {
|
||||
dis.dispatch({
|
||||
action: 'forward_event',
|
||||
event: null,
|
||||
});
|
||||
}
|
||||
dis.dispatch({action: 'focus_composer'});
|
||||
},
|
||||
|
||||
|
@ -1576,7 +1582,7 @@ module.exports = React.createClass({
|
|||
} else if (this.state.uploadingRoomSettings) {
|
||||
aux = <Loader/>;
|
||||
} else if (this.state.forwardingEvent !== null) {
|
||||
aux = <ForwardMessage onCancelClick={this.onCancelClick} currentRoomId={this.state.room.roomId} mxEvent={this.state.forwardingEvent} />;
|
||||
aux = <ForwardMessage onCancelClick={this.onCancelClick} />;
|
||||
} else if (this.state.searching) {
|
||||
hideCancel = true; // has own cancel
|
||||
aux = <SearchBar ref="search_bar" searchInProgress={this.state.searchInProgress } onCancelClick={this.onCancelSearchClick} onSearch={this.onSearch}/>;
|
||||
|
|
|
@ -21,6 +21,7 @@ const MatrixClientPeg = require("../../MatrixClientPeg");
|
|||
const PlatformPeg = require("../../PlatformPeg");
|
||||
const Modal = require('../../Modal');
|
||||
const dis = require("../../dispatcher");
|
||||
import sessionStore from '../../stores/SessionStore';
|
||||
const q = require('q');
|
||||
const packageJson = require('../../../package.json');
|
||||
const UserSettingsStore = require('../../UserSettingsStore');
|
||||
|
@ -169,9 +170,6 @@ module.exports = React.createClass({
|
|||
// The base URL to use in the referral link. Defaults to window.location.origin.
|
||||
referralBaseUrl: React.PropTypes.string,
|
||||
|
||||
// true if RightPanel is collapsed
|
||||
collapsedRhs: React.PropTypes.bool,
|
||||
|
||||
// Team token for the referral link. If falsy, the referral section will
|
||||
// not appear
|
||||
teamToken: React.PropTypes.string,
|
||||
|
@ -246,6 +244,12 @@ module.exports = React.createClass({
|
|||
this.setState({
|
||||
language: languageHandler.getCurrentLanguage(),
|
||||
});
|
||||
|
||||
this._sessionStore = sessionStore;
|
||||
this._sessionStoreToken = this._sessionStore.addListener(
|
||||
this._setStateFromSessionStore,
|
||||
);
|
||||
this._setStateFromSessionStore();
|
||||
},
|
||||
|
||||
componentDidMount: function() {
|
||||
|
@ -272,6 +276,12 @@ module.exports = React.createClass({
|
|||
}
|
||||
},
|
||||
|
||||
_setStateFromSessionStore: function() {
|
||||
this.setState({
|
||||
userHasGeneratedPassword: Boolean(this._sessionStore.getCachedPassword()),
|
||||
});
|
||||
},
|
||||
|
||||
_electronSettings: function(ev, settings) {
|
||||
this.setState({ electron_settings: settings });
|
||||
},
|
||||
|
@ -1164,7 +1174,6 @@ module.exports = React.createClass({
|
|||
<div className="mx_UserSettings">
|
||||
<SimpleRoomHeader
|
||||
title={ _t("Settings") }
|
||||
collapsedRhs={ this.props.collapsedRhs }
|
||||
onCancelClick={ this.props.onClose }
|
||||
/>
|
||||
|
||||
|
@ -1205,10 +1214,14 @@ module.exports = React.createClass({
|
|||
<h3>{ _t("Account") }</h3>
|
||||
|
||||
<div className="mx_UserSettings_section cadcampoHide">
|
||||
|
||||
<AccessibleButton className="mx_UserSettings_logout mx_UserSettings_button" onClick={this.onLogoutClicked}>
|
||||
{ _t("Sign out") }
|
||||
</AccessibleButton>
|
||||
{ this.state.userHasGeneratedPassword ?
|
||||
<div className="mx_UserSettings_passwordWarning">
|
||||
{ _t("To return to your account in future you need to set a password") }
|
||||
</div> : null
|
||||
}
|
||||
|
||||
{accountJsx}
|
||||
</div>
|
||||
|
|
|
@ -218,29 +218,29 @@ module.exports = React.createClass({
|
|||
}
|
||||
|
||||
trackPromise.then((teamToken) => {
|
||||
this.props.onLoggedIn({
|
||||
return this.props.onLoggedIn({
|
||||
userId: response.user_id,
|
||||
deviceId: response.device_id,
|
||||
homeserverUrl: this._matrixClient.getHomeserverUrl(),
|
||||
identityServerUrl: this._matrixClient.getIdentityServerUrl(),
|
||||
accessToken: response.access_token
|
||||
}, teamToken);
|
||||
}).then(() => {
|
||||
return this._setupPushers();
|
||||
}).then((cli) => {
|
||||
return this._setupPushers(cli);
|
||||
});
|
||||
},
|
||||
|
||||
_setupPushers: function() {
|
||||
_setupPushers: function(matrixClient) {
|
||||
if (!this.props.brand) {
|
||||
return q();
|
||||
}
|
||||
return MatrixClientPeg.get().getPushers().then((resp)=>{
|
||||
return matrixClient.getPushers().then((resp)=>{
|
||||
const pushers = resp.pushers;
|
||||
for (let i = 0; i < pushers.length; ++i) {
|
||||
if (pushers[i].kind == 'email') {
|
||||
const emailPusher = pushers[i];
|
||||
emailPusher.data = { brand: this.props.brand };
|
||||
MatrixClientPeg.get().setPusher(emailPusher).done(() => {
|
||||
matrixClient.setPusher(emailPusher).done(() => {
|
||||
console.log("Set email branding to " + this.props.brand);
|
||||
}, (error) => {
|
||||
console.error("Couldn't set email branding: " + error);
|
||||
|
|
172
src/components/views/dialogs/KeyShareDialog.js
Normal file
172
src/components/views/dialogs/KeyShareDialog.js
Normal file
|
@ -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>
|
||||
);
|
||||
},
|
||||
});
|
|
@ -154,7 +154,7 @@ export default React.createClass({
|
|||
/>
|
||||
<input
|
||||
type="submit"
|
||||
value={_t("Cancel")}
|
||||
value={_t("Skip")}
|
||||
onClick={this.onCancelled}
|
||||
/>
|
||||
</div>
|
||||
|
|
|
@ -17,7 +17,6 @@
|
|||
|
||||
import React from 'react';
|
||||
import { _t } from '../../../languageHandler';
|
||||
import MatrixClientPeg from '../../../MatrixClientPeg';
|
||||
import dis from '../../../dispatcher';
|
||||
import KeyCode from '../../../KeyCode';
|
||||
|
||||
|
@ -26,11 +25,6 @@ module.exports = React.createClass({
|
|||
displayName: 'ForwardMessage',
|
||||
|
||||
propTypes: {
|
||||
currentRoomId: React.PropTypes.string.isRequired,
|
||||
|
||||
/* the MatrixEvent to be forwarded */
|
||||
mxEvent: React.PropTypes.object.isRequired,
|
||||
|
||||
onCancelClick: React.PropTypes.func.isRequired,
|
||||
},
|
||||
|
||||
|
@ -44,7 +38,6 @@ module.exports = React.createClass({
|
|||
},
|
||||
|
||||
componentDidMount: function() {
|
||||
this.dispatcherRef = dis.register(this.onAction);
|
||||
document.addEventListener('keydown', this._onKeyDown);
|
||||
},
|
||||
|
||||
|
@ -54,30 +47,9 @@ module.exports = React.createClass({
|
|||
sideOpacity: 1.0,
|
||||
middleOpacity: 1.0,
|
||||
});
|
||||
dis.unregister(this.dispatcherRef);
|
||||
document.removeEventListener('keydown', this._onKeyDown);
|
||||
},
|
||||
|
||||
onAction: function(payload) {
|
||||
if (payload.action === 'view_room') {
|
||||
const event = this.props.mxEvent;
|
||||
const Client = MatrixClientPeg.get();
|
||||
Client.sendEvent(payload.room_id, event.getType(), event.getContent()).done(() => {
|
||||
dis.dispatch({action: 'message_sent'});
|
||||
}, (err) => {
|
||||
if (err.name === "UnknownDeviceError") {
|
||||
dis.dispatch({
|
||||
action: 'unknown_device_error',
|
||||
err: err,
|
||||
room: Client.getRoom(payload.room_id),
|
||||
});
|
||||
}
|
||||
dis.dispatch({action: 'message_send_failed'});
|
||||
});
|
||||
if (this.props.currentRoomId === payload.room_id) this.props.onCancelClick();
|
||||
}
|
||||
},
|
||||
|
||||
_onKeyDown: function(ev) {
|
||||
switch (ev.keyCode) {
|
||||
case KeyCode.ESCAPE:
|
||||
|
|
|
@ -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} />;
|
||||
},
|
||||
|
|
|
@ -14,10 +14,7 @@ See the License for the specific language governing permissions and
|
|||
limitations under the License.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import React from 'react';
|
||||
import dis from '../../../dispatcher';
|
||||
import AccessibleButton from '../elements/AccessibleButton';
|
||||
import sdk from '../../../index';
|
||||
import { _t } from '../../../languageHandler';
|
||||
|
@ -45,17 +42,10 @@ export default React.createClass({
|
|||
title: React.PropTypes.string,
|
||||
onCancelClick: React.PropTypes.func,
|
||||
|
||||
// is the RightPanel collapsed?
|
||||
collapsedRhs: React.PropTypes.bool,
|
||||
|
||||
// `src` to a TintableSvg. Optional.
|
||||
icon: React.PropTypes.string,
|
||||
},
|
||||
|
||||
onShowRhsClick: function(ev) {
|
||||
dis.dispatch({ action: 'show_right_panel' });
|
||||
},
|
||||
|
||||
render: function() {
|
||||
let cancelButton;
|
||||
let icon;
|
||||
|
@ -70,25 +60,12 @@ export default React.createClass({
|
|||
/>;
|
||||
}
|
||||
|
||||
let showRhsButton;
|
||||
/* // don't bother cluttering things up with this for now.
|
||||
const TintableSvg = sdk.getComponent("elements.TintableSvg");
|
||||
|
||||
if (this.props.collapsedRhs) {
|
||||
showRhsButton =
|
||||
<div className="mx_RoomHeader_button" style={{ float: 'right' }} onClick={this.onShowRhsClick} title=">">
|
||||
<TintableSvg src="img/minimise.svg" width="10" height="16"/>
|
||||
</div>
|
||||
}
|
||||
*/
|
||||
|
||||
return (
|
||||
<div className="mx_RoomHeader" >
|
||||
<div className="mx_RoomHeader_wrapper">
|
||||
<div className="mx_RoomHeader_simpleHeader">
|
||||
{ icon }
|
||||
{ this.props.title }
|
||||
{ showRhsButton }
|
||||
{ cancelButton }
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -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) {
|
||||
|
@ -100,6 +97,7 @@ function createRoom(opts) {
|
|||
dis.dispatch({
|
||||
action: 'view_room',
|
||||
room_id: roomId,
|
||||
should_peek: false,
|
||||
});
|
||||
}
|
||||
return roomId;
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
"Decryption error": "Entschlüsselungs Fehler",
|
||||
"Session ID": "Sitzungs-ID",
|
||||
"End-to-end encryption information": "Ende-zu-Ende-Verschlüsselungs-Informationen",
|
||||
"Event information": "Ereignis-Informationen",
|
||||
"Event information": "Ereignis-Information",
|
||||
"Sender device information": "Absender Geräte Informationen",
|
||||
"Displays action": "Zeigt Aktionen an",
|
||||
"Bans user with given id": "Schließt den Benutzer mit der angegebenen ID dauerhaft aus dem Raum aus",
|
||||
|
@ -78,7 +78,7 @@
|
|||
"Click here": "Hier klicken,",
|
||||
"Confirm your new password": "Neues Passwort bestätigen",
|
||||
"Continue": "Fortfahren",
|
||||
"Create an account": "Erstelle einen Account",
|
||||
"Create an account": "Benutzerkonto erstellen",
|
||||
"Create Room": "Raum erstellen",
|
||||
"Cryptography": "Verschlüsselung",
|
||||
"Deactivate Account": "Benutzerkonto deaktivieren",
|
||||
|
@ -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",
|
||||
|
@ -172,7 +172,7 @@
|
|||
"Permissions": "Berechtigungen",
|
||||
"Phone": "Telefon",
|
||||
"placed a": "plazierte einen",
|
||||
"Please check your email and click on the link it contains. Once this is done, click continue.": "Bitte prüfen sie ihre E-Mails und klicken sie auf den enthaltenden Link. Anschließend klicke auf \"Fortsetzen\".",
|
||||
"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.",
|
||||
"Please Register": "Bitte registrieren",
|
||||
"Privacy warning": "Datenschutzwarnung",
|
||||
"Privileged Users": "Privilegierte Nutzer",
|
||||
|
@ -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",
|
||||
|
@ -219,7 +219,7 @@
|
|||
"This doesn't appear to be a valid email address": "Dies scheint keine gültige E-Mail-Adresse zu sein",
|
||||
"this invitation?": "diese Einladung?",
|
||||
"This is a preview of this room. Room interactions have been disabled": "Dies ist eine Vorschau dieses Raumes. Raum-Interaktionen wurden deaktiviert",
|
||||
"This room is not accessible by remote Matrix servers": "Andere Matrix-Server können auf diesen Raum nicht zugreifen",
|
||||
"This room is not accessible by remote Matrix servers": "Remote-Matrix-Server können auf diesen Raum nicht zugreifen",
|
||||
"This room's internal ID is": "Die interne ID dieses Raumes ist",
|
||||
"To ban users": "Um Benutzer dauerhaft aus dem Raum auszuschließen",
|
||||
"To configure the room": "Um den Raum zu konfigurieren",
|
||||
|
@ -252,7 +252,7 @@
|
|||
"Upload file": "Datei hochladen",
|
||||
"User Interface": "Benutzeroberfläche",
|
||||
"User name": "Nutzername",
|
||||
"Users": "Nutzer",
|
||||
"Users": "Benutzer",
|
||||
"User": "Nutzer",
|
||||
"Verification Pending": "Verifizierung ausstehend",
|
||||
"Video call": "Video-Anruf",
|
||||
|
@ -319,7 +319,7 @@
|
|||
"Mar": "Mrz",
|
||||
"Apr": "April",
|
||||
"May": "Mai",
|
||||
"Jun": "Juni",
|
||||
"Jun": "Jun",
|
||||
"Jul": "Juli",
|
||||
"Aug": "Aug",
|
||||
"Sep": "Sep",
|
||||
|
@ -339,7 +339,7 @@
|
|||
"User names may only contain letters, numbers, dots, hyphens and underscores.": "Benutzernamen dürfen nur Buchstaben, Nummern, Punkte, Binde- und Unterstriche enthalten.",
|
||||
"An unknown error occurred.": "Ein unbekannter Fehler ist aufgetreten.",
|
||||
"I already have an account": "Ich habe bereits einen Account",
|
||||
"An error occurred: %(error_string)s": "Ein Fehler trat auf: %(error_string)s",
|
||||
"An error occurred: %(error_string)s": "Ein Fehler ist aufgetreten: %(error_string)s",
|
||||
"Topic": "Thema",
|
||||
"Make this room private": "Mache diesen Raum privat",
|
||||
"Share message history with new users": "Bisherigen Chatverlauf mit neuen Nutzern teilen",
|
||||
|
@ -416,16 +416,16 @@
|
|||
"Drop here %(toAction)s": "Hierher ziehen: %(toAction)s",
|
||||
"Drop here to tag %(section)s": "Hierher ziehen: %(section)s taggen",
|
||||
"Press": "Drücke",
|
||||
"tag as %(tagName)s": "als %(tagName)s taggen",
|
||||
"tag as %(tagName)s": "als %(tagName)s markieren",
|
||||
"to browse the directory": "um das Raum-Verzeichnis zu durchsuchen",
|
||||
"to demote": "um das Berechtigungslevel herabzusetzen",
|
||||
"to favourite": "zum Favorisieren",
|
||||
"to make a room or": "um einen Raum zu erstellen, oder",
|
||||
"to restore": "zum wiederherstellen",
|
||||
"to start a chat with someone": "um einen Chat mit jemandem zu starten",
|
||||
"to tag direct chat": "als direkten Chat markieren",
|
||||
"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,14 +671,14 @@
|
|||
"%(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",
|
||||
"%(oneUser)shad their invitation withdrawn %(repeats)s times": "%(oneUser)szog seine/ihre Einladung %(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",
|
||||
"were invited %(repeats)s times": "wurden %(repeats)s mal eingeladen",
|
||||
"was invited %(repeats)s times": "wurde %(repeats)s mal eingeladen",
|
||||
"were invited": "wurden eingeladen",
|
||||
"were banned %(repeats)s times": "wurden %(repeats)s mal aus dem Raum ausgeschlossen",
|
||||
"were banned %(repeats)s times": "wurden %(repeats)s mal dauerhaft aus dem Raum ausgeschlossen",
|
||||
"was banned %(repeats)s times": "wurde %(repeats)s mal aus dem Raum ausgeschlossen",
|
||||
"were banned": "wurden dauerhaft aus dem Raum ausgeschlossen",
|
||||
"were unbanned %(repeats)s times": "wurden %(repeats)s mal vom dauerhaften Ausschluss aus dem Raum befreit",
|
||||
|
@ -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)",
|
||||
|
@ -726,7 +726,7 @@
|
|||
"Remove %(threePid)s?": "%(threePid)s entfernen?",
|
||||
"Please select the destination room for this message": "Bitte den Raum auswählen, an den diese Nachricht gesendet werden soll",
|
||||
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s hat den Raum-Namen gelöscht.",
|
||||
"Passphrases must match": "Passphrase muss übereinstimmen",
|
||||
"Passphrases must match": "Passphrases müssen übereinstimmen",
|
||||
"Passphrase must not be empty": "Passphrase darf nicht leer sein",
|
||||
"Export room keys": "Raum-Schlüssel exportieren",
|
||||
"Enter passphrase": "Passphrase eingeben",
|
||||
|
@ -735,12 +735,12 @@
|
|||
"You must join the room to see its files": "Du musst dem Raum beitreten, um die Raum-Dateien sehen zu können",
|
||||
"Reject all %(invitedRooms)s invites": "Alle %(invitedRooms)s Einladungen ablehnen",
|
||||
"Start new Chat": "Starte neuen Chat",
|
||||
"Guest users can't invite users. Please register.": "Gäste können keine Nutzer einladen. Bitte registrieren.",
|
||||
"Guest users can't invite users. Please register.": "Gäste können keine Benutzer einladen. Bitte registrieren.",
|
||||
"Failed to invite": "Einladen fehlgeschlagen",
|
||||
"Failed to invite user": "Einladen des Nutzers fehlgeschlagen",
|
||||
"Confirm Removal": "Entfernen bestätigen",
|
||||
"Unknown error": "Unbekannter Fehler",
|
||||
"Incorrect password": "Inkorrektes Passwort",
|
||||
"Incorrect password": "Ungültiges Passwort",
|
||||
"This action is irreversible.": "Diese Aktion kann nicht rückgängig gemacht werden.",
|
||||
"To continue, please enter your password.": "Zum fortfahren bitte Passwort eingeben.",
|
||||
"Device name": "Geräte-Name",
|
||||
|
@ -781,7 +781,7 @@
|
|||
"Image '%(Body)s' cannot be displayed.": "Das Bild '%(Body)s' kann nicht angezeigt werden.",
|
||||
"This image cannot be displayed.": "Dieses Bild kann nicht angezeigt werden.",
|
||||
"Error decrypting video": "Video-Entschlüsselung fehlgeschlagen",
|
||||
"Import room keys": "Importiere Raum-Schlüssel",
|
||||
"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:",
|
||||
"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.",
|
||||
|
@ -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",
|
||||
|
@ -849,7 +849,7 @@
|
|||
"Anyone": "Jeder",
|
||||
"Are you sure you want to leave the room '%(roomName)s'?": "Bist du sicher, dass du den Raum '%(roomName)s' verlassen willst?",
|
||||
"Custom level": "Benutzerdefiniertes Berechtigungslevel",
|
||||
"Device ID:": "Geräte-ID:",
|
||||
"Device ID:": "Geräte-Kennung:",
|
||||
"device id: ": "Geräte-ID: ",
|
||||
"Device key:": "Geräte-Schlüssel:",
|
||||
"Email address (optional)": "E-Mail-Adresse (optional)",
|
||||
|
@ -861,9 +861,9 @@
|
|||
"Setting a user name will create a fresh account": "Die Eingabe eines Benutzernamens wird ein neues Konto erzeugen",
|
||||
"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.",
|
||||
"There was a problem logging in.": "Es gab ein Problem beim anmelden.",
|
||||
"There was a problem logging in.": "Beim Anmelden ist ein Problem aufgetreten.",
|
||||
"Unknown (user, device) pair:": "Unbekanntes (Nutzer-/Gerät-)Paar:",
|
||||
"Remote addresses for this room:": "Entfernte Raum-Adressen für diesen Raum:",
|
||||
"Remote addresses for this room:": "Remote-Adressen für diesen Raum:",
|
||||
"Unrecognised command:": "Unbekannter Befehl:",
|
||||
"Unrecognised room alias:": "Unbekannter Raum-Alias:",
|
||||
"Use compact timeline layout": "Nutze kompaktes Zeitstrahl-Layout",
|
||||
|
@ -872,7 +872,7 @@
|
|||
"WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "WARNUNG: SCHLÜSSEL-VERIFIZIERUNG FEHLGESCHLAGEN! Der Signatur-Schlüssel für %(userId)s und Gerät %(deviceId)s ist \"%(fprint)s\" welche nicht dem bereitgestellten Schlüssel \"%(fingerprint)s\" übereinstimmen. Dies kann bedeuten, dass deine Kommunikation abgefangen wird!",
|
||||
"You have <a>disabled</a> URL previews by default.": "Du hast die URL-Vorschau standardmäßig <a>deaktiviert</a>.",
|
||||
"You have <a>enabled</a> URL previews by default.": "Du hast die URL-Vorschau standardmäßig <a>aktiviert</a>.",
|
||||
"You have entered an invalid contact. Try using their Matrix ID or email address.": "Du hast einen ungültigen Kontakt eingegeben. Versuche es mit der Matrix-ID oder der E-Mail-Adresse.",
|
||||
"You have entered an invalid contact. Try using their Matrix ID or email address.": "Du hast einen ungültigen Kontakt eingegeben. Versuche es mit der Matrix-Kennung oder der E-Mail-Adresse des Kontakts.",
|
||||
"$senderDisplayName changed the room avatar to <img/>": "$senderDisplayName hat das Raum-Bild geändert zu <img/>",
|
||||
"%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s hat das Raum-Bild für %(roomName)s geändert",
|
||||
"Hide removed messages": "Gelöschte Nachrichten verbergen",
|
||||
|
@ -922,12 +922,12 @@
|
|||
"Drop File Here": "Lasse Datei hier los",
|
||||
"Enable Notifications": "Benachrichtigungen aktivieren",
|
||||
"Encrypted by a verified device": "Von einem vertrauten Gerät verschlüsselt",
|
||||
"Encrypted by an unverified device": "Von einem nicht vertrauten Gerät verschlüsselt",
|
||||
"Encrypted by an unverified device": "Von einem nicht verifizierten Gerät verschlüsselt",
|
||||
"Failed to upload profile picture!": "Hochladen des Profilbild's fehlgeschlagen!",
|
||||
"Incoming call from %(name)s": "Eingehender Anruf von %(name)s",
|
||||
"Incoming video call from %(name)s": "Eingehender Video-Anruf von %(name)s",
|
||||
"Incoming voice call from %(name)s": "Eingehender Sprach-Anruf von %(name)s",
|
||||
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Mit <voiceText>Sprache</voiceText> oder <videoText>Video</videoText> beitreten.",
|
||||
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Per <voiceText>Sprachanruf</voiceText> oder <videoText>Videoanruf</videoText> beitreten.",
|
||||
"Last seen": "Zuletzt gesehen",
|
||||
"Level:": "Level:",
|
||||
"No display name": "Kein Anzeigename",
|
||||
|
@ -961,7 +961,7 @@
|
|||
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Möchtest du diese Einladung <acceptText>akzeptieren</acceptText> oder <declineText>ablehnen</declineText>?",
|
||||
"You have been banned from %(roomName)s by %(userName)s.": "Du wurdest von %(userName)s dauerhaft aus dem Raum %(roomName)s ausgeschlossen.",
|
||||
"You have been kicked from %(roomName)s by %(userName)s.": "Du wurdest von %(userName)s aus dem Raum %(roomName)s entfernt.",
|
||||
"You may wish to login with a different account, or add this email to this account.": "Du möchtest dich evtl. mit einem anderen Konto anmelden oder diese E-Mail-Adresse diesem Konto hinzufügen.",
|
||||
"You may wish to login with a different account, or add this email to this account.": "Du möchtest dich eventuell mit einem anderen Konto anmelden oder alternativ diese E-Mail-Adresse diesem Konto hinzufügen.",
|
||||
"Your home server does not support device management.": "Dein Heimserver unterstützt kein Geräte-Management.",
|
||||
"(~%(count)s results).one": "(~%(count)s Ergebnis)",
|
||||
"(~%(count)s results).other": "(~%(count)s Ergebnis)",
|
||||
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -839,13 +839,13 @@
|
|||
"Share message history with new users": "Διαμοιρασμός ιστορικού μηνυμάτων με τους νέους χρήστες",
|
||||
"numbullet": "απαρίθμηση",
|
||||
"%(severalUsers)sleft and rejoined %(repeats)s times": "%(severalUsers)s έφυγαν και ξανασυνδέθηκαν %(repeats)s φορές",
|
||||
"%(oneUser)sleft and rejoined %(repeats)s times": "%(severalUsers)s έφυγε και ξανασυνδέθηκε %(repeats)s φορές",
|
||||
"%(oneUser)sleft and rejoined %(repeats)s times": "%(oneUser)s έφυγε και ξανασυνδέθηκε %(repeats)s φορές",
|
||||
"%(severalUsers)sleft and rejoined": "%(severalUsers)s έφυγαν και ξανασυνδέθηκαν",
|
||||
"%(oneUser)sleft and rejoined": "%(severalUsers)s έφυγε και ξανασυνδέθηκε",
|
||||
"%(oneUser)sleft and rejoined": "%(oneUser)s έφυγε και ξανασυνδέθηκε",
|
||||
"%(severalUsers)shad their invitations withdrawn %(repeats)s times": "Οι %(severalUsers)s απέσυραν τις προσκλήσεις τους %(repeats)s φορές",
|
||||
"%(oneUser)shad their invitation withdrawn %(repeats)s times": "Ο %(severalUsers)s απέσυρε την πρόσκληση του %(repeats)s φορές",
|
||||
"%(oneUser)shad their invitation withdrawn %(repeats)s times": "Ο %(oneUser)s απέσυρε την πρόσκληση του %(repeats)s φορές",
|
||||
"%(severalUsers)shad their invitations withdrawn": "Οι %(severalUsers)s απέσυραν τις προσκλήσεις τους",
|
||||
"%(oneUser)shad their invitation withdrawn": "Ο %(severalUsers)s απέσυρε την πρόσκληση του",
|
||||
"%(oneUser)shad their invitation withdrawn": "Ο %(oneUser)s απέσυρε την πρόσκληση του",
|
||||
"You must join the room to see its files": "Πρέπει να συνδεθείτε στο δωμάτιο για να δείτε τα αρχεία του",
|
||||
"Reject all %(invitedRooms)s invites": "Απόρριψη όλων των προσκλήσεων %(invitedRooms)s",
|
||||
"Failed to invite the following users to the %(roomName)s room:": "Δεν ήταν δυνατή η πρόσκληση των χρηστών στο δωμάτιο %(roomName)s:",
|
||||
|
@ -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.",
|
||||
|
@ -910,5 +911,13 @@
|
|||
"Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?",
|
||||
"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."
|
||||
"This will allow you to reset your password and receive notifications.": "This will allow you to reset your password and receive notifications.",
|
||||
"To return to your account in future you need to set a password": "To return to your account in future you need to set a password",
|
||||
"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"
|
||||
}
|
||||
|
|
|
@ -913,5 +913,11 @@
|
|||
"Username not available": "Username not available",
|
||||
"Something went wrong!": "Something went wrong!",
|
||||
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.",
|
||||
"If you already have a Matrix account you can <a>log in</a> instead.": "If you already have a Matrix account you can <a>log in</a> instead."
|
||||
"If you already have a Matrix account you can <a>log in</a> instead.": "If you already have a Matrix account you can <a>log in</a> instead.",
|
||||
"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?",
|
||||
"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."
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"af": "Africano",
|
||||
"af": "Afrikáans",
|
||||
"ar-ae": "Árabe (Emiratos Árabes Unidos)",
|
||||
"ar-bh": "Árabe (Baréin)",
|
||||
"ar-dz": "Árabe (Argelia)",
|
||||
|
@ -267,7 +267,7 @@
|
|||
"Failed to unban": "Falló al desbloquear",
|
||||
"Failed to upload file": "Error en el envío del fichero",
|
||||
"Failed to verify email address: make sure you clicked the link in the email": "Falló al verificar el correo electrónico: Asegúrese hacer clic en el enlace del correo",
|
||||
"Failure to create room": "Falló al crear sala",
|
||||
"Failure to create room": "Fallo al crear la sala",
|
||||
"Favourite": "Favorito",
|
||||
"favourite": "favorito",
|
||||
"Favourites": "Favoritos",
|
||||
|
@ -483,5 +483,153 @@
|
|||
"Tagged as: ": "Etiquetado como: ",
|
||||
"The default role for new room members is": "El nivel por defecto para los nuevos miembros de esta sala es",
|
||||
"The main address for this room is": "La dirección principal de esta sala es",
|
||||
"The phone number entered looks invalid": "El número de teléfono indicado parece erróneo"
|
||||
"The phone number entered looks invalid": "El número de teléfono indicado parece erróneo",
|
||||
"Active call (%(roomName)s)": "Llamada activa (%(roomName)s)",
|
||||
"Add a topic": "Añadir un tema",
|
||||
"Missing Media Permissions, click here to request.": "Faltan permisos para el medio, pulse aquí para solicitarlos.",
|
||||
"No media permissions": "Sin permisos para el medio",
|
||||
"You may need to manually permit Riot to access your microphone/webcam": "Probablemente necesite dar permisos manualmente a Riot para su micrófono/cámara",
|
||||
"Are you sure you want to leave the room '%(roomName)s'?": "¿Está seguro de que desea abandonar la sala '%(roomName)s'?",
|
||||
"Are you sure you want to upload the following files?": "¿Está seguro que desea enviar los siguientes archivos?",
|
||||
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "No se puede conectar al servidor - compruebe su conexión, asegúrese de que el <a>certificado SSL del servidor</a> es de confiaza, y compruebe que no hay extensiones del navegador bloqueando las peticiones.",
|
||||
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s ha quitado el nombre de la sala.",
|
||||
"Device key:": "Clave del dispositivo:",
|
||||
"Disable markdown formatting": "Desactivar el formato Markdown",
|
||||
"Drop File Here": "Deje el fichero aquí",
|
||||
"Guest access is disabled on this Home Server.": "El acceso de invitados está desactivado en este servidor.",
|
||||
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Conecte con <voiceText>voz</voiceText> o <videoText>vídeo</videoText>.",
|
||||
"List this room in %(domain)s's room directory?": "¿Mostrar esta sala en el directorio de %(domain)s?",
|
||||
"Manage Integrations": "Gestionar integraciones",
|
||||
"Markdown is disabled": "Markdown está desactivado",
|
||||
"Markdown is enabled": "Markdown está activado",
|
||||
"matrix-react-sdk version:": "Versión de matrix-react-sdk:",
|
||||
"Members only": "Sólo para miembros",
|
||||
"Message not sent due to unknown devices being present": "Mensaje no enviado debido a la presencia de dispositivos desconocidos",
|
||||
"Missing room_id in request": "Falta el ID de sala en la petición",
|
||||
"Missing user_id in request": "Falta el ID de usuario en la petición",
|
||||
"Mobile phone number": "Número de teléfono móvil",
|
||||
"Mobile phone number (optional)": "Número de teléfono móvil (opcional)",
|
||||
"Moderator": "Moderador",
|
||||
"Must be viewing a room": "Debe estar viendo una sala",
|
||||
"Mute": "Silenciar",
|
||||
"my Matrix ID": "Mi ID de Matrix",
|
||||
"Name": "Nombre",
|
||||
"Never send encrypted messages to unverified devices from this device": "No enviar nunca mensajes cifrados, desde este dispositivo, a dispositivos sin verificar",
|
||||
"Never send encrypted messages to unverified devices in this room": "No enviar nunca mensajes cifrados a dispositivos no verificados, en esta sala",
|
||||
"Never send encrypted messages to unverified devices in this room from this device": "No enviar nunca mensajes cifrados a dispositivos no verificados, en esta sala, desde este dispositivo",
|
||||
"New address (e.g. #foo:%(localDomain)s)": "Nueva dirección (ej: #foo:%(localDomain)s)",
|
||||
"New password": "Nueva contraseña",
|
||||
"New passwords don't match": "Las nuevas contraseñas no coinciden",
|
||||
"New passwords must match each other.": "Las nuevas contraseñas deben coincidir.",
|
||||
"none": "ninguno",
|
||||
"not set": "sin configurar",
|
||||
"not specified": "sin especificar",
|
||||
"Notifications": "Notificaciones",
|
||||
"(not supported by this browser)": "(no soportado por este navegador)",
|
||||
"<not supported>": "<no soportado>",
|
||||
"NOT verified": "NO verificado",
|
||||
"No devices with registered encryption keys": "No hay dispositivos con claves de cifrado registradas",
|
||||
"No display name": "Sin nombre para mostrar",
|
||||
"No more results": "No hay más resultados",
|
||||
"No results": "Sin resultados",
|
||||
"No users have specific privileges in this room": "Ningún usuario tiene permisos específicos en esta sala",
|
||||
"OK": "Correcto",
|
||||
"olm version:": "versión de olm:",
|
||||
"Once encryption is enabled for a room it cannot be turned off again (for now)": "Una vez se active el cifrado en esta sala, no podrá ser desactivado (por ahora)",
|
||||
"Only people who have been invited": "Sólo usuarios que han sido invitados",
|
||||
"Operation failed": "Falló la operación",
|
||||
"Otherwise, <a>click here</a> to send a bug report.": "También puede <a>pulsar aquí</a> para enviar un informe de fallos.",
|
||||
"Password": "Contraseña",
|
||||
"Password:": "Contraseña:",
|
||||
"Passwords can't be empty": "Las contraseñas no pueden estar en blanco",
|
||||
"People": "Gente",
|
||||
"Permissions": "Permisos",
|
||||
"Phone": "Teléfono",
|
||||
"%(senderName)s placed a %(callType)s call.": "%(senderName)s ha hecho una llamada de tipo %(callType)s.",
|
||||
"Please check your email and click on the link it contains. Once this is done, click continue.": "Por favor, compruebe su e-mail y pulse el enlace que contiene. Una vez esté hecho, pulse continuar.",
|
||||
"Please Register": "Por favor, regístrese",
|
||||
"Power level must be positive integer.": "El nivel debe ser un entero positivo.",
|
||||
"Press": "Pulse",
|
||||
"Privacy warning": "Alerta de privacidad",
|
||||
"Private Chat": "Conversación privada",
|
||||
"Privileged Users": "Usuarios con privilegios",
|
||||
"Profile": "Perfil",
|
||||
"Public Chat": "Sala pública",
|
||||
"Reason": "Razón",
|
||||
"Reason: %(reasonText)s": "Razón: %(reasonText)s",
|
||||
"Revoke Moderator": "Eliminar Moderador",
|
||||
"Refer a friend to Riot:": "Informar a un amigo sobre Riot:",
|
||||
"Register": "Registrarse",
|
||||
"rejected": "rechazado",
|
||||
"%(targetName)s rejected the invitation.": "%(targetName)s ha rechazado la invitación.",
|
||||
"Reject invitation": "Rechazar invitación",
|
||||
"Rejoin": "Volver a unirse",
|
||||
"Remote addresses for this room:": "Dirección remota de esta sala:",
|
||||
"Remove Contact Information?": "¿Eliminar información del contacto?",
|
||||
"%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s ha suprimido su nombre para mostar (%(oldDisplayName)s).",
|
||||
"%(senderName)s removed their profile picture.": "%(senderName)s ha eliminado su foto de perfil.",
|
||||
"Remove": "Eliminar",
|
||||
"Remove %(threePid)s?": "¿Eliminar %(threePid)s?",
|
||||
"%(senderName)s requested a VoIP conference.": "%(senderName)s ha solicitado una conferencia Voz-IP.",
|
||||
"Report it": "Informar",
|
||||
"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.": "Reiniciar la contraseña también reiniciará las claves de cifrado extremo-a-extremo, haciendo ilegible el historial de las conversaciones, salvo que exporte previamente las claves de sala, y las importe posteriormente. Esto será mejorado en futuras versiones.",
|
||||
"restore": "restaurar",
|
||||
"Results from DuckDuckGo": "Resultados desde DuckDuckGo",
|
||||
"Return to app": "Volver a la aplicación",
|
||||
"Return to login screen": "Volver a la pantalla de inicio de sesión",
|
||||
"Riot does not have permission to send you notifications - please check your browser settings": "Riot no tiene permisos para enviarle notificaciones - por favor, revise la configuración del navegador",
|
||||
"Riot was not given permission to send notifications - please try again": "Riot no pudo obtener permisos para enviar notificaciones - por favor, inténtelo de nuevo",
|
||||
"riot-web version:": "versión riot-web:",
|
||||
"Room %(roomId)s not visible": "La sala %(roomId)s no es visible",
|
||||
"Searches DuckDuckGo for results": "Busca en DuckDuckGo",
|
||||
"Server may be unavailable or overloaded": "El servidor podría estar saturado o desconectado",
|
||||
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Mostrar el tiempo en formato 12h (am/pm)",
|
||||
"The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "La clave de firma que usted ha proporcionado coincide con la recibida del dispositivo %(deviceId)s de %(userId)s. Dispositivo verificado.",
|
||||
"This action cannot be performed by a guest user. Please register to be able to do this.": "Esto no puede ser hecho por un invitado. Por favor, regístrese para poder hacerlo.",
|
||||
"This email address is already in use": "Dirección e-mail en uso",
|
||||
"This email address was not found": "Dirección e-mail no encontrada",
|
||||
"%(actionVerb)s this person?": "¿%(actionVerb)s a esta persona?",
|
||||
"The email address linked to your account must be entered.": "Debe introducir el e-mail asociado a su cuenta.",
|
||||
"The file '%(fileName)s' exceeds this home server's size limit for uploads": "El fichero '%(fileName)s' excede el tamaño máximo permitido en este servidor",
|
||||
"The file '%(fileName)s' failed to upload": "Se produjo un fallo al enviar '%(fileName)s'",
|
||||
"The remote side failed to pick up": "El sitio remoto falló al sincronizar",
|
||||
"This Home Server does not support login using email address.": "Este servidor no permite identificarse con direcciones e-mail.",
|
||||
"This invitation was sent to an email address which is not associated with this account:": "Se envió la invitación a un e-mail no asociado con esta cuenta:",
|
||||
"There was a problem logging in.": "Hubo un problema identificándose.",
|
||||
"This room has no local addresses": "Esta sala no tiene direcciones locales",
|
||||
"This room is not recognised.": "Esta sala no se reconoce.",
|
||||
"These are experimental features that may break in unexpected ways": "Estas son funcionalidades experimentales, podrían fallar de formas imprevistas",
|
||||
"The visibility of existing history will be unchanged": "La visibilidad del historial previo no se verá afectada",
|
||||
"This doesn't appear to be a valid email address": "Esto no parece un e-mail váido",
|
||||
"This is a preview of this room. Room interactions have been disabled": "Esto es una vista previa de la sala. Las interacciones con la sala están desactivadas",
|
||||
"This phone number is already in use": "Este número de teléfono ya se está usando",
|
||||
"This room": "Esta sala",
|
||||
"This room is not accessible by remote Matrix servers": "Esta sala no es accesible por otros servidores Matrix",
|
||||
"This room's internal ID is": "El ID interno de la sala es",
|
||||
"times": "veces",
|
||||
"To ban users": "Expulsar usuarios",
|
||||
"to browse the directory": "navegar el directorio",
|
||||
"To configure the room": "Configurar la sala",
|
||||
"to demote": "degradar",
|
||||
"to favourite": "marcar como favorito",
|
||||
"To invite users into the room": "Invitar usuarios a la sala",
|
||||
"To kick users": "Patear usuarios",
|
||||
"To link to a room it must have <a>an address</a>.": "Para enlazar una sala, debe tener <a>una dirección</a>.",
|
||||
"to make a room or": "hacer una sala o",
|
||||
"To remove other users' messages": "Eliminar los mensajes de otros usuarios",
|
||||
"To reset your password, enter the email address linked to your account": "Para reiniciar su contraseña, introduzca el e-mail asociado a su cuenta",
|
||||
"to restore": "restaurar",
|
||||
"Cancel": "Cancelar",
|
||||
"Dismiss": "Omitir",
|
||||
"powered by Matrix": "con el poder de Matrix",
|
||||
"Room directory": "Directorio de salas",
|
||||
"Custom Server Options": "Opciones de Servidor Personalizado",
|
||||
"unknown error code": "Código de error desconocido",
|
||||
"Sunday": "Domingo",
|
||||
"Monday": "Lunes",
|
||||
"Tuesday": "Martes",
|
||||
"Wednesday": "Miércoles",
|
||||
"Thursday": "Jueves",
|
||||
"Friday": "Viernes",
|
||||
"Saturday": "Sábado"
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -27,21 +27,21 @@
|
|||
"Saturday": "Szombat",
|
||||
"af": "Afrikaans",
|
||||
"ar-ae": "Arabic (U.A.E.)",
|
||||
"ar-bh": "Arabic (Bahrain)",
|
||||
"ar-dz": "Arabic (Algeria)",
|
||||
"ar-eg": "Arabic (Egypt)",
|
||||
"ar-iq": "Arabic (Iraq)",
|
||||
"ar-jo": "Arabic (Jordan)",
|
||||
"ar-kw": "Arabic (Kuwait)",
|
||||
"ar-lb": "Arabic (Lebanon)",
|
||||
"ar-ly": "Arabic (Libya)",
|
||||
"ar-ma": "Arabic (Morocco)",
|
||||
"ar-om": "Arabic (Oman)",
|
||||
"ar-qa": "Arabic (Qatar)",
|
||||
"ar-sa": "Arabic (Saudi Arabia)",
|
||||
"ar-sy": "Arabic (Syria)",
|
||||
"ar-tn": "Arabic (Tunisia)",
|
||||
"ar-ye": "Arabic (Yemen)",
|
||||
"ar-bh": "Arab (Bahrain)",
|
||||
"ar-dz": "Arab (Algeria)",
|
||||
"ar-eg": "Arab (Egypt)",
|
||||
"ar-iq": "Arab (Iraq)",
|
||||
"ar-jo": "Arab (Jordan)",
|
||||
"ar-kw": "Arab (Kuwait)",
|
||||
"ar-lb": "Arab (Lebanon)",
|
||||
"ar-ly": "Arab (Libya)",
|
||||
"ar-ma": "Arab (Morocco)",
|
||||
"ar-om": "Arab (Oman)",
|
||||
"ar-qa": "Arab (Qatar)",
|
||||
"ar-sa": "Arab (Saudi Arabia)",
|
||||
"ar-sy": "Arab (Syria)",
|
||||
"ar-tn": "Arab (Tunisia)",
|
||||
"ar-ye": "Arab (Yemen)",
|
||||
"be": "Belorusz",
|
||||
"bg": "Bolgár",
|
||||
"ca": "Katalán",
|
||||
|
@ -179,5 +179,504 @@
|
|||
"Create new room": "Új szoba létrehozása",
|
||||
"sb": "Szorb",
|
||||
"rm": "Rétoromán",
|
||||
"tn": "Tswana"
|
||||
"tn": "Tswana",
|
||||
"Close": "Bezár",
|
||||
"Room directory": "Szobák listája",
|
||||
"Start chat": "Csevegés indítása",
|
||||
"Welcome page": "Üdvözlő oldal",
|
||||
"all room members, from the point they are invited": "minden résztvevő a szobában, amióta meg van hívva",
|
||||
"all room members, from the point they joined": "minden résztvevő a szobában, amióta csatlakozott",
|
||||
"and": "és",
|
||||
"%(items)s and %(remaining)s others": "%(items)s és még: %(remaining)s",
|
||||
"%(items)s and one other": "%(items)s és még egy",
|
||||
"%(items)s and %(lastItem)s": "%(items)s és %(lastItem)s",
|
||||
"and %(overflowCount)s others...": "és még: %(overflowCount)s ...",
|
||||
"and one other...": "és még egy...",
|
||||
"%(names)s and %(lastPerson)s are typing": "%(names)s és %(lastPerson)s írnak",
|
||||
"%(names)s and one other are typing": "%(names)s és még valaki ír",
|
||||
"%(names)s and %(count)s others are typing": "%(names)s és %(count)s ember ír",
|
||||
"An email has been sent to": "Az e-mail ide lett küldve:",
|
||||
"A new password must be entered.": "Új jelszót kell megadni.",
|
||||
"%(senderName)s answered the call.": "%(senderName)s felvette a telefont.",
|
||||
"anyone": "bárki",
|
||||
"An error has occurred.": "Hiba történt.",
|
||||
"Anyone": "Bárki",
|
||||
"Anyone who knows the room's link, apart from guests": "A vendégeken kívül bárki aki ismeri a szoba link-jét",
|
||||
"Anyone who knows the room's link, including guests": "Bárki aki tudja a szoba link-jét, még a vendégek is",
|
||||
"Are you sure?": "Biztos?",
|
||||
"Are you sure you want to leave the room '%(roomName)s'?": "Biztos elhagyod a szobát '%(roomName)s'?",
|
||||
"Are you sure you want to reject the invitation?": "Biztos elutasítod a meghívást?",
|
||||
"Are you sure you want to upload the following files?": "Biztos feltöltöd ezeket a fájlokat?",
|
||||
"Attachment": "Csatolmány",
|
||||
"Autoplay GIFs and videos": "GIF-ek és videók automatikus lejátszása",
|
||||
"%(senderName)s banned %(targetName)s.": "%(senderName)s kitiltotta őt: %(targetName)s.",
|
||||
"Ban": "Kitilt",
|
||||
"Banned users": "Kitiltott felhasználók",
|
||||
"Bans user with given id": "Kitiltja a felhasználót a megadott ID-vel",
|
||||
"Blacklisted": "Fekete listára téve",
|
||||
"Bug Report": "Hiba jelentés",
|
||||
"Bulk Options": "Tömeges beállítások",
|
||||
"Call Timeout": "Hívás időtúllépés",
|
||||
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Nem lehet kapcsolódni a saját szerverhez - ellenőrizd a kapcsolatot, biztosítsd, hogy a <a>saját szerver tanúsítványa</a> hiteles legyen, és a böngésző kiterjesztések ne blokkolják a kéréseket.",
|
||||
"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>.": "Nem lehet csatlakozni a saját szerverhez HTTP-n keresztül ha HTTPS van a böngésző címsorában. Vagy használj HTTPS-t vagy <a>engedélyezd a nem biztonságos script-et</a>.",
|
||||
"Can't load user settings": "A felhasználói beállítások nem tölthetők be",
|
||||
"Change Password": "Jelszó megváltoztatása",
|
||||
"%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s megváltoztatta a nevét erről: %(oldDisplayName)s erre: %(displayName)s.",
|
||||
"%(senderName)s changed their profile picture.": "%(senderName)s megváltoztatta a profil képét.",
|
||||
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s megváltoztatta a hozzáférési szintjét erre: %(powerLevelDiffText)s.",
|
||||
"%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s megváltoztatta a szoba nevét erre: %(roomName)s.",
|
||||
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s törölte a szoba nevét.",
|
||||
"%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s megváltoztatta a témát erre \"%(topic)s\".",
|
||||
"Changes to who can read history will only apply to future messages in this room": "Változtatások a napló olvasási jogosultságon csak a szoba új üzeneteire fog vonatkozni",
|
||||
"Changes your display nickname": "Becenév megváltoztatása",
|
||||
"changing room on a RoomView is not supported": "Szoba nézetben nem lehet szobát váltani",
|
||||
"Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Jelszó megváltoztatása jelenleg alaphelyzetbe állítja a titkosításnál használt kulcsokat minden készüléken, ezzel a régi titkosított üzenetek olvashatatlanok lesznek hacsak először nem mented ki a kulcsokat és újra betöltöd. A jövőben ezen javítunk.",
|
||||
"Claimed Ed25519 fingerprint key": "Igényelt Ed25519 ujjlenyomat kulcs",
|
||||
"Clear Cache and Reload": "Gyorsítótár törlése és újratöltés",
|
||||
"Clear Cache": "Gyorsítótár törlése",
|
||||
"<a>Click here</a> to join the discussion!": "A beszélgetéshez való csatlakozáshoz <a>kattints ide</a>!",
|
||||
"Click here to fix": "A javításhoz kattints ide",
|
||||
"Click to mute audio": "Hang némításhoz kattints ide",
|
||||
"Click to mute video": "A videó kikapcsoláshoz kattints ide",
|
||||
"click to reveal": "Megjelenítéshez kattints ide",
|
||||
"Click to unmute video": "Videó bekapcsoláshoz kattints ide",
|
||||
"Click to unmute audio": "Hang visszakapcsoláshoz kattints ide",
|
||||
"Command error": "Parancs hiba",
|
||||
"Commands": "Parancsok",
|
||||
"Conference call failed.": "Sikertelen konferencia hívás.",
|
||||
"Conference calling is in development and may not be reliable.": "Konferencia hívás meg fejlesztés alatt és lehet, hogy nem elég stabil.",
|
||||
"Conference calls are not supported in encrypted rooms": "Titkosított szobákban a konferencia hívás nem támogatott",
|
||||
"Conference calls are not supported in this client": "Ez a kliens nem támogatja a konferencia hívást",
|
||||
"Confirm password": "Jelszó megerősítése",
|
||||
"Confirm your new password": "Új jelszó megerősítése",
|
||||
"Could not connect to the integration server": "Az integrációs szerverhez nem lehet kapcsolódni",
|
||||
"%(count)s new messages.one": "%(count)s új üzenet",
|
||||
"%(count)s new messages.other": "%(count)s új üzenet",
|
||||
"Create a new chat or reuse an existing one": "Új csevegés indítása vagy egy meglévő használata",
|
||||
"Create an account": "Fiók készítése",
|
||||
"Create Room": "Szoba készítése",
|
||||
"Cryptography": "Titkosítás",
|
||||
"Current password": "Jelenlegi jelszó",
|
||||
"Curve25519 identity key": "Curve25519 azonosítási kulcs",
|
||||
"Custom": "Egyedi",
|
||||
"Custom level": "Egyedi szint",
|
||||
"/ddg is not a command": "/ddg nem egy parancs",
|
||||
"Deactivate Account": "Fiók zárolása",
|
||||
"Deactivate my account": "Fiókom felfüggesztése",
|
||||
"Decline": "Elutasít",
|
||||
"Decrypt %(text)s": "%(text)s visszafejtése",
|
||||
"Decryption error": "Visszafejtési hiba",
|
||||
"Delete": "Töröl",
|
||||
"demote": "hozzáférési szint csökkentése",
|
||||
"Default": "Alapértelmezett",
|
||||
"Device already verified!": "Készülék már ellenőrizve!",
|
||||
"Device ID": "Készülék azonosító",
|
||||
"Device ID:": "Készülék azonosító:",
|
||||
"device id: ": "készülék azonosító: ",
|
||||
"Device key:": "Készülék kulcs:",
|
||||
"Devices": "Készülékek",
|
||||
"Devices will not yet be able to decrypt history from before they joined the room": "A készülékek nem tudják egyenlőre visszafejteni a régebbi üzeneteket mint mikor csatlakoztak a szobához",
|
||||
"Direct chats": "Közvetlen csevegés",
|
||||
"Disable Notifications": "Értesítések tiltása",
|
||||
"disabled": "letiltva",
|
||||
"Disable inline URL previews by default": "Beágyazott URL előnézet alapértelmezetten tiltva",
|
||||
"Disable markdown formatting": "Markdown formázás tiltva",
|
||||
"Disinvite": "Meghívás visszavonása",
|
||||
"Display name": "Megjelenített név",
|
||||
"Displays action": "Tevékenységek megjelenítése",
|
||||
"Don't send typing notifications": "Ne küldjön írás értesítést",
|
||||
"Download %(text)s": "%(text)s letöltése",
|
||||
"Drop File Here": "Ide húzd a fájlt",
|
||||
"Drop here to tag %(section)s": "Húzd ide a címkézéshez: %(section)s",
|
||||
"Ed25519 fingerprint": "Ed25519 ujjlenyomat",
|
||||
"Email": "E-mail",
|
||||
"Email address": "E-mail cím",
|
||||
"Email address (optional)": "E-mail cím (opcionális)",
|
||||
"Email, name or matrix ID": "E-mail, név vagy matrix azonosító",
|
||||
"Emoji": "Emoji",
|
||||
"Enable encryption": "Titkosítás bekapcsolása",
|
||||
"Enable Notifications": "Értesítések bekapcsolása",
|
||||
"enabled": "bekapcsolva",
|
||||
"Encrypted by a verified device": "Ellenőrzött eszköz által titkosítva",
|
||||
"Encrypted by an unverified device": "Nem ellenőrzött eszköz által titkosítva",
|
||||
"Encrypted messages will not be visible on clients that do not yet implement encryption": "A titkosított üzenetek nem láthatók azokon a klienseken amik még nem támogatják a titkosítást",
|
||||
"Encrypted room": "Titkosított szoba",
|
||||
"Encryption is enabled in this room": "Ebben a szobában a titkosítás be van kapcsolva",
|
||||
"Encryption is not enabled in this room": "Ebben a szobában a titkosítás nincs bekapcsolva",
|
||||
"%(senderName)s ended the call.": "%(senderName)s befejezte a hívást.",
|
||||
"End-to-end encryption information": "Végponttól végpontig való titkosítási információk",
|
||||
"End-to-end encryption is in beta and may not be reliable": "Végponttól végpontig tartó titkosítás béta állapotú és lehet, hogy nem megbízható",
|
||||
"Enter Code": "Kód megadása",
|
||||
"Enter passphrase": "Jelmondat megadása",
|
||||
"Error decrypting attachment": "Csatolmány visszafejtése sikertelen",
|
||||
"Error: Problem communicating with the given homeserver.": "Hiba: Probléma van a saját szerverrel való kommunikációval.",
|
||||
"Event information": "Esemény információ",
|
||||
"Existing Call": "Hívás folyamatban",
|
||||
"Export": "Mentés",
|
||||
"Export E2E room keys": "E2E szoba kulcsok mentése",
|
||||
"Failed to ban user": "A felhasználót nem sikerült kizárni",
|
||||
"Failed to change power level": "A hozzáférési szintet nem sikerült megváltoztatni",
|
||||
"Failed to delete device": "Eszközt nem sikerült törölni",
|
||||
"Failed to fetch avatar URL": "Avatar képet nem sikerült letölteni",
|
||||
"Failed to join room": "A szobába nem sikerült belépni",
|
||||
"Failed to kick": "Kirúgás nem sikerült",
|
||||
"Failed to leave room": "A szobát nem sikerült elhagyni",
|
||||
"Failed to load timeline position": "Az idővonal pozíciót nem sikerült betölteni",
|
||||
"Failed to lookup current room": "Az aktuális szoba felkeresése sikertelen",
|
||||
"Failed to mute user": "A felhasználót nem sikerült hallgatásra bírni",
|
||||
"Failed to register as guest:": "Nem sikerült vendégként regisztrálni:",
|
||||
"Failed to reject invite": "A meghívót nem sikerült elutasítani",
|
||||
"Failed to reject invitation": "A meghívót nem sikerült elutasítani",
|
||||
"Failed to save settings": "A beállításokat nem sikerült elmenteni",
|
||||
"Failed to send email": "E-mail nem sikerült elküldeni",
|
||||
"Failed to send request.": "A kérést nem sikerült elküldeni.",
|
||||
"Failed to set avatar.": "Avatar képet nem sikerült beállítani.",
|
||||
"Failed to set display name": "Megjelenítési nevet nem sikerült beállítani",
|
||||
"Failed to set up conference call": "Konferencia hívást nem sikerült elindítani",
|
||||
"Failed to toggle moderator status": "Moderátor státuszt nem sikerült átállítani",
|
||||
"Failed to unban": "Kizárás visszavonása sikertelen",
|
||||
"Failed to upload file": "Fájl feltöltés sikertelen",
|
||||
"Failed to upload profile picture!": "Profil kép feltöltése sikertelen!",
|
||||
"Failed to verify email address: make sure you clicked the link in the email": "E-mail cím ellenőrzése sikertelen: ellenőrizd, hogy az e-mailnél lévő linkre rákattintottál",
|
||||
"Failure to create room": "Szoba létrehozása sikertelen",
|
||||
"favourite": "kedvenc",
|
||||
"Favourites": "Kedvencek",
|
||||
"Fill screen": "Képernyő kitöltése",
|
||||
"Filter room members": "Szoba tagság szűrése",
|
||||
"Forget room": "Szoba elfelejtése",
|
||||
"Forgot your password?": "Elfelejtetted a jelszavad?",
|
||||
"For security, this session has been signed out. Please sign in again.": "A biztonság érdekében ez a kapcsolat le lesz bontva. Légy szíves jelentkezz be újra.",
|
||||
"For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "A biztonság érdekében a kilépéskor a végponttól végpontig való (E2E) titkosításhoz szükséges kulcsok törlésre kerülnek a böngészőből. Ha a régi üzeneteket továbbra is el szeretnéd olvasni, kérlek mentsed ki a szobákhoz tartozó kulcsot.",
|
||||
"Found a bug?": "Hibát találtál?",
|
||||
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s : %(fromPowerLevel)s -> %(toPowerLevel)s",
|
||||
"Guest access is disabled on this Home Server.": "Vendég belépés tiltva van a saját szerveren.",
|
||||
"Guests can't set avatars. Please register.": "A vendégek nem tudnak avatar képet beállítani. Kérlek regisztrálj.",
|
||||
"Guest users can't create new rooms. Please register to create room and start a chat.": "Vendégek nem készíthetnek szobákat. Kérlek regisztrálj, hogy szobát tudják nyitni és el tudj kezdeni csevegni.",
|
||||
"Guest users can't upload files. Please register to upload.": "Vendégek nem tölthetnek fel fájlokat. A feltöltéshez kérlek regisztrálj.",
|
||||
"Guests can't use labs features. Please register.": "Vendégek nem használhatnak labor funkciókat. Kérlek regisztrálj.",
|
||||
"Guests cannot join this room even if explicitly invited.": "Vendégek akkor sem csatlakozhatnak ehhez a szobához ha külön meghívók kaptak.",
|
||||
"had": "van",
|
||||
"Hangup": "Megszakít",
|
||||
"Hide read receipts": "Olvasási visszajelzés elrejtése",
|
||||
"Hide Text Formatting Toolbar": "Szövegformázási menü elrejtése",
|
||||
"Historical": "Archív",
|
||||
"Home": "Kezdőlap",
|
||||
"Homeserver is": "Saját szerver:",
|
||||
"Identity Server is": "Azonosítási szerver:",
|
||||
"I have verified my email address": "Ellenőriztem az e-mail címemet",
|
||||
"Import": "Betöltés",
|
||||
"Import E2E room keys": "E2E szoba kulcsok betöltése",
|
||||
"Incoming call from %(name)s": "Beérkező hivás: %(name)s",
|
||||
"Incoming video call from %(name)s": "Bejövő videóhívás: %(name)s",
|
||||
"Incoming voice call from %(name)s": "Bejövő hívás: %(name)s",
|
||||
"Incorrect username and/or password.": "Helytelen felhasználó és/vagy jelszó.",
|
||||
"Incorrect verification code": "Hibás azonosítási kód",
|
||||
"Interface Language": "Felhasználói felület nyelve",
|
||||
"Invalid alias format": "Hibás alternatív név formátum",
|
||||
"Invalid address format": "Hibás cím formátum",
|
||||
"Invalid Email Address": "Hibás e-mail cím",
|
||||
"Invalid file%(extra)s": "Hibás fájl%(extra)s",
|
||||
"%(senderName)s invited %(targetName)s.": "%(senderName)s meghívta: %(targetName)s.",
|
||||
"Invite new room members": "Új tagok meghívása",
|
||||
"Invited": "Meghívva",
|
||||
"Invites": "Meghívók",
|
||||
"Invites user with given id to current room": "Felhasználó meghívása ebbe a szobába megadott azonosítóval",
|
||||
"'%(alias)s' is not a valid format for an address": "'%(alias)s' nem megfelelő formátum egy címhez",
|
||||
"'%(alias)s' is not a valid format for an alias": "'%(alias)s' nem megfelelő formátum egy alternatív névhez",
|
||||
"%(displayName)s is typing": "%(displayName)s ír",
|
||||
"Sign in with": "Belépés ezzel:",
|
||||
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Csatlakozás <voiceText>hang</voiceText>gal vagy <videoText>videó</videoText>val.",
|
||||
"Join Room": "Belépés a szobába",
|
||||
"joined and left": "be-, és kilépett",
|
||||
"joined": "belépett",
|
||||
"%(targetName)s joined the room.": "%(targetName)s belépett a szobába.",
|
||||
"Joins room with given alias": "A megadott becenévvel belépett a szobába",
|
||||
"Jump to first unread message.": "Ugrás az első olvasatlan üzenetre.",
|
||||
"%(senderName)s kicked %(targetName)s.": "%(senderName)s kizárta: %(targetName)s.",
|
||||
"Kick": "Kizár",
|
||||
"Kicks user with given id": "Az adott azonosítójú felhasználó kizárása",
|
||||
"Labs": "Labor",
|
||||
"Last seen": "Utoljára láttuk",
|
||||
"Leave room": "Szoba elhagyása",
|
||||
"left and rejoined": "ki-, és belépett",
|
||||
"left": "kilépett",
|
||||
"%(targetName)s left the room.": "%(targetName)s elhagyta a szobát.",
|
||||
"Level:": "Szint:",
|
||||
"List this room in %(domain)s's room directory?": "%(domain)s szobát feltüntessük a szobák listájában?",
|
||||
"Local addresses for this room:": "A szoba helyi címe:",
|
||||
"Logged in as:": "Bejelentkezve mint:",
|
||||
"Login as guest": "Belépés vendégként",
|
||||
"Logout": "Kilép",
|
||||
"Low priority": "Alacsony prioritás",
|
||||
"%(senderName)s made future room history visible to": "%(senderName)s elérhetővé tette a szoba új üzeneteit nekik:",
|
||||
"Manage Integrations": "Integrációk kezelése",
|
||||
"Markdown is disabled": "Markdown kikapcsolva",
|
||||
"Markdown is enabled": "Markdown engedélyezett",
|
||||
"matrix-react-sdk version:": "matrix-react-sdk verzió:",
|
||||
"Members only": "Csak tagoknak",
|
||||
"Message not sent due to unknown devices being present": "Ismeretlen eszköz miatt az üzenet nem küldhető el",
|
||||
"Missing room_id in request": "Hiányzó room_id a kérésben",
|
||||
"Missing user_id in request": "Hiányzó user_id a kérésben",
|
||||
"Mobile phone number": "Mobil telefonszám",
|
||||
"Mobile phone number (optional)": "Mobill telefonszám (opcionális)",
|
||||
"Moderator": "Moderátor",
|
||||
"Must be viewing a room": "Meg kell nézni a szobát",
|
||||
"my Matrix ID": "Matrix azonosítóm",
|
||||
"Name": "Név",
|
||||
"Never send encrypted messages to unverified devices from this device": "Soha ne küldj titkosított üzenetet ellenőrizetlen eszközre erről az eszközről",
|
||||
"Never send encrypted messages to unverified devices in this room": "Soha ne küldj titkosított üzenetet ebből a szobából ellenőrizetlen eszközre",
|
||||
"Never send encrypted messages to unverified devices in this room from this device": "Soha ne küldj titkosított üzenetet ebből a szobából ellenőrizetlen eszközre erről az eszközről",
|
||||
"New address (e.g. #foo:%(localDomain)s)": "Új cím (e.g. #foo:%(localDomain)s)",
|
||||
"New Composer & Autocomplete": "Új szerkesztő és automatikus kiegészítés",
|
||||
"New password": "Új jelszó",
|
||||
"New passwords don't match": "Az új jelszavak nem egyeznek",
|
||||
"New passwords must match each other.": "Az új jelszavaknak meg kell egyezniük egymással.",
|
||||
"none": "semmi",
|
||||
"not set": "nincs beállítva",
|
||||
"not specified": "nincs meghatározva",
|
||||
"(not supported by this browser)": "(ebben a böngészőben nem támogatott)",
|
||||
"<not supported>": "<nem támogatott>",
|
||||
"NOT verified": "NEM ellenőrzött",
|
||||
"No devices with registered encryption keys": "Nincs eszköz a regisztrált titkosítási kulcsokhoz",
|
||||
"No display name": "Nincs megjelenítési név",
|
||||
"No more results": "Nincs több találat",
|
||||
"No results": "Nincs találat",
|
||||
"No users have specific privileges in this room": "Egy felhasználónak sincsenek specifikus jogosultságai ebben a szobában",
|
||||
"olm version:": "olm verzió:",
|
||||
"Once encryption is enabled for a room it cannot be turned off again (for now)": "Ha egyszer bekapcsolod a titkosítást a szobába utána nem lehet kikapcsolni (egyenlőre)",
|
||||
"Once you've followed the link it contains, click below": "Miután a linket követted, kattints alulra",
|
||||
"Only people who have been invited": "Csak akiket meghívtak",
|
||||
"Otherwise, <a>click here</a> to send a bug report.": "Különben hiba jelentés küldéséhez <a>kattints ide</a>.",
|
||||
"Password": "Jelszó",
|
||||
"Password:": "Jelszó:",
|
||||
"Passwords can't be empty": "A jelszó nem lehet üres",
|
||||
"People": "Emberek",
|
||||
"Permissions": "Jogosultságok",
|
||||
"Phone": "Telefon",
|
||||
"%(senderName)s placed a %(callType)s call.": "%(senderName)s %(callType)s hívást kezdeményezett.",
|
||||
"Please check your email and click on the link it contains. Once this is done, click continue.": "Ellenőrizd az e-mail-edet és kattints a benne lévő linkre. Ha ez megvan, kattints a folytatásra.",
|
||||
"Power level must be positive integer.": "A szintnek pozitív egésznek kell lennie.",
|
||||
"Press": "Nyomd meg",
|
||||
"Private Chat": "Privát csevegés",
|
||||
"Privileged Users": "Privilegizált felhasználók",
|
||||
"Profile": "Profil",
|
||||
"Public Chat": "Nyilvános csevegés",
|
||||
"Reason": "Ok",
|
||||
"Reason: %(reasonText)s": "Ok: %(reasonText)s",
|
||||
"Revoke Moderator": "Moderátor visszahívása",
|
||||
"Refer a friend to Riot:": "Ismerős meghívása a Riotba:",
|
||||
"Register": "Regisztráció",
|
||||
"rejected": "elutasítva",
|
||||
"%(targetName)s rejected the invitation.": "%(targetName)s elutasította a meghívót.",
|
||||
"Reject invitation": "Meghívó elutasítása",
|
||||
"Rejoin": "Újracsatlakozás",
|
||||
"Remote addresses for this room:": "A szoba távoli címei:",
|
||||
"Remove Contact Information?": "Kapcsolat információk törlése?",
|
||||
"%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s törölte a megjelenítési nevet (%(oldDisplayName)s).",
|
||||
"%(senderName)s removed their profile picture.": "%(senderName)s törölte a profil képét.",
|
||||
"Remove %(threePid)s?": "Töröl: %(threePid)s?",
|
||||
"%(senderName)s requested a VoIP conference.": "%(senderName)s VoIP konferenciát kezdeményez.",
|
||||
"Report it": "Jelent",
|
||||
"restore": "visszaállít",
|
||||
"Results from DuckDuckGo": "Eredmények a DuckDuckGo-ból",
|
||||
"Return to app": "Vissza az alkalmazáshoz",
|
||||
"Return to login screen": "Vissza a bejelentkezési képernyőre",
|
||||
"Riot does not have permission to send you notifications - please check your browser settings": "Riotnak nincs jogosultsága értesítést küldeni neked - ellenőrizd a böngésző beállításait",
|
||||
"Riot was not given permission to send notifications - please try again": "Riotnak nincs jogosultsága értesítést küldeni neked - próbáld újra",
|
||||
"riot-web version:": "riot-web verzió:",
|
||||
"Room %(roomId)s not visible": "%(roomId)s szoba nem látható",
|
||||
"Room Colour": "Szoba színe",
|
||||
"Room contains unknown devices": "A szobában ellenőrizetlen eszközök vannak",
|
||||
"Room name (optional)": "Szoba neve (opcionális)",
|
||||
"%(roomName)s does not exist.": "%(roomName)s nem létezik.",
|
||||
"%(roomName)s is not accessible at this time.": "%(roomName)s jelenleg nem érhető el.",
|
||||
"Rooms": "Szobák",
|
||||
"Save": "Mentés",
|
||||
"Scroll to bottom of page": "Az oldal aljára görget",
|
||||
"Scroll to unread messages": "Olvasatlan üzenetekhez görget",
|
||||
"Search failed": "Keresés sikertelen",
|
||||
"Searches DuckDuckGo for results": "Keresés DuckDuckGo-val",
|
||||
"Searching known users": "Ismert felhasználók keresése",
|
||||
"Seen by %(userName)s at %(dateTime)s": "%(userName)s %(dateTime)s időpontban látta",
|
||||
"Send a message (unencrypted)": "Üzenet küldése (titkosítás nélkül)",
|
||||
"Send an encrypted message": "Titkosított üzenet küldése",
|
||||
"Send anyway": "Küld mindenképpen",
|
||||
"Sender device information": "Küldő eszközének információja",
|
||||
"Send Invites": "Meghívók elküldése",
|
||||
"Send Reset Email": "Visszaállítási e-mail küldése",
|
||||
"sent an image": "kép küldése",
|
||||
"%(senderDisplayName)s sent an image.": "%(senderDisplayName)s képet küldött.",
|
||||
"%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s meghívót küldött %(targetDisplayName)s felhasználónak, hogy lépjen be a szobába.",
|
||||
"sent a video": "videó küldve",
|
||||
"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"
|
||||
}
|
||||
|
|
|
@ -533,7 +533,7 @@
|
|||
"since they joined": "들어온 이후",
|
||||
"since they were invited": "초대받은 이후",
|
||||
"Some of your messages have not been sent.": "일부 메시지는 보내지 못했어요.",
|
||||
"Someone": "누군가",
|
||||
"Someone": "다른 사람",
|
||||
"Sorry, this homeserver is using a login which is not recognised ": "죄송해요, 이 홈 서버는 인식할 수 없는 로그인을 쓰고 있네요 ",
|
||||
"Start a chat": "이야기하기",
|
||||
"Start authentication": "인증하기",
|
||||
|
@ -570,15 +570,105 @@
|
|||
"This room's internal ID is": "방의 내부 ID",
|
||||
"times": "번",
|
||||
"To ban users": "사용자를 차단하기",
|
||||
"to browse the directory": "목록에서 찾기",
|
||||
"to browse the directory": "목록에서 찾으려면",
|
||||
"To configure the room": "방을 구성하기",
|
||||
"to demote": "등급을 낮추기",
|
||||
"to favourite": "즐겨찾기하기",
|
||||
"to demote": "등급을 낮추려면",
|
||||
"to favourite": "즐겨찾기하려면",
|
||||
"To invite users into the room": "방으로 사용자를 초대하기",
|
||||
"To kick users": "사용자를 내쫓기",
|
||||
"To link to a room it must have <a>an address</a>.": "방에 연결하려면 <a>주소</a>가 있어야 해요.",
|
||||
"to make a room or": "방을 만들거나 혹은",
|
||||
"To remove other users' messages": "다른 사용자의 메시지를 지우기",
|
||||
"To reset your password, enter the email address linked to your account": "비밀번호을 다시 설정하려면, 계정과 연결한 이메일 주소를 입력해주세요",
|
||||
"to restore": "복구하기"
|
||||
"to restore": "복구하려면",
|
||||
"To send events of type": "유형 이벤트 보내기",
|
||||
"To send messages": "메시지 보내기",
|
||||
"to start a chat with someone": "다른 사람과 이야기하기",
|
||||
"to tag as %(tagName)s": "%(tagName)s로 지정하려면",
|
||||
"to tag direct chat": "직접 이야기를 지정하려면",
|
||||
"To use it, just wait for autocomplete results to load and tab through them.": "이 기능을 사용하시려면, 자동완성 결과가 나오길 기다리신 뒤에 탭으로 움직여주세요.",
|
||||
"Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "이 방의 타임라인에서 특정 시점을 불러오려고 했지만, 문제의 메시지를 볼 수 있는 권한이 없어요.",
|
||||
"Tried to load a specific point in this room's timeline, but was unable to find it.": "이 방의 타임라인에서 특정 시점을 불러오려고 했지만, 찾을 수 없었어요.",
|
||||
"Turn Markdown off": "마크다운 끄기",
|
||||
"Turn Markdown on": "마크다운 켜기",
|
||||
"%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s님이 종단간 암호화를 켜셨어요 (알고리즘 %(algorithm)s).",
|
||||
"Unable to add email address": "이메일 주소를 추가할 수 없어요",
|
||||
"Unable to remove contact information": "연락처를 지울 수 없어요",
|
||||
"Unable to restore previous session": "이전 세션을 복구할 수 없어요",
|
||||
"Unable to verify email address.": "이메일 주소를 인증할 수 없어요.",
|
||||
"Unban": "차단풀기",
|
||||
"%(senderName)s unbanned %(targetName)s.": "%(senderName)s님이 %(targetName)s님의 차단을 푸셨어요.",
|
||||
"Unable to ascertain that the address this invite was sent to matches one associated with your account.": "이 이매알 주소가 초대를 받은 계정과 연결된 주소가 맞는지 확인할 수 없어요.",
|
||||
"Unable to capture screen": "화면을 찍을 수 없어요",
|
||||
"Unable to enable Notifications": "알림을 켤 수 없어요",
|
||||
"Unable to load device list": "장치 목록을 불러올 수 없어요",
|
||||
"Undecryptable": "해독할 수 없는",
|
||||
"Unencrypted room": "암호화하지 않은 방",
|
||||
"unencrypted": "암호화하지 않음",
|
||||
"Unencrypted message": "암호화하지 않은 메시지",
|
||||
"unknown caller": "알 수 없는 발신자",
|
||||
"Unknown command": "알 수 없는 명령",
|
||||
"unknown device": "알 수 없는 장치",
|
||||
"Unknown room %(roomId)s": "알 수 없는 방 %(roomId)s",
|
||||
"Unknown (user, device) pair:": "알 수 없는 (사용자, 장치) 연결:",
|
||||
"unknown": "알 수 없음",
|
||||
"Unmute": "소리 켜기",
|
||||
"Unnamed Room": "이름 없는 방",
|
||||
"Unrecognised command:": "인식 할 수 없는 명령:",
|
||||
"Unrecognised room alias:": "인식할 수 없는 방 가명:",
|
||||
"Unverified": "인증하지 않음",
|
||||
"Uploading %(filename)s and %(count)s others.zero": "%(filename)s 올리는 중",
|
||||
"Uploading %(filename)s and %(count)s others.one": "%(filename)s 외 %(count)s 올리는 중",
|
||||
"Uploading %(filename)s and %(count)s others.other": "%(filename)s 외 %(count)s 올리는 중",
|
||||
"uploaded a file": "파일을 올렸어요",
|
||||
"Upload avatar": "아바타 올리기",
|
||||
"Upload Failed": "파일을 올리지 못했어요",
|
||||
"Upload Files": "파일 올리기",
|
||||
"Upload file": "파일 올리기",
|
||||
"Upload new:": "새로 올리기:",
|
||||
"Usage": "사용",
|
||||
"Use compact timeline layout": "간단한 타임라인 구성 사용",
|
||||
"Use with caution": "조심해서 사용",
|
||||
"User ID": "사용자 ID",
|
||||
"User Interface": "사용자 인터페이스",
|
||||
"%(user)s is a": "%(user)s는",
|
||||
"User name": "사용자 이름",
|
||||
"Username invalid: %(errMessage)s": "사용자 이름을 인식할 수 없어요: %(errMessage)s",
|
||||
"Users": "사용자들",
|
||||
"User": "사용자",
|
||||
"Verification Pending": "인증을 기다리는 중",
|
||||
"Verification": "인증",
|
||||
"verified": "인증함",
|
||||
"Verified": "인증함",
|
||||
"Verified key": "인증한 키",
|
||||
"Video call": "영상통화",
|
||||
"Voice call": "음성통화",
|
||||
"VoIP conference finished.": "인터넷전화 회의를 마쳤어요.",
|
||||
"VoIP conference started.": "인터넷전화 회의를 시작했어요.",
|
||||
"VoIP is unsupported": "인터넷전화를 지원하지 않아요",
|
||||
"(could not connect media)": "(미디어에 연결할 수 없어요)",
|
||||
"(no answer)": "(응답 없음)",
|
||||
"(unknown failure: %(reason)s)": "(알 수 없는 오류: %(reason)s)",
|
||||
"(warning: cannot be disabled again!)": "(주의: 다시 끌 수 없어요!)",
|
||||
"Warning!": "주의!",
|
||||
"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에서 추방하셨어요."
|
||||
}
|
||||
|
|
|
@ -228,13 +228,13 @@
|
|||
"Dismiss": "Afwijzen",
|
||||
"Drop here %(toAction)s": "%(toAction)s hier naartoe verplaatsen",
|
||||
"Error": "Fout",
|
||||
"Failed to forget room %(errCode)s": "Kamer vergeten mislukt %(errCode)s",
|
||||
"Failed to forget room %(errCode)s": "Ruimte vergeten mislukt %(errCode)s",
|
||||
"Failed to join the room": "Kamer binnengaan mislukt",
|
||||
"Favourite": "Favoriet",
|
||||
"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",
|
||||
|
@ -268,8 +268,8 @@
|
|||
"No display name": "Geen weergavenaam",
|
||||
"No more results": "Geen resultaten meer",
|
||||
"No results": "Geen resultaten",
|
||||
"No users have specific privileges in this room": "Geen gebruikers me specifieke privileges in deze kamer",
|
||||
"olm version:": "olm-versie:",
|
||||
"No users have specific privileges in this room": "Geen gebruikers hebben specifieke privileges in deze ruimte",
|
||||
"olm version:": "olm versie:",
|
||||
"Password": "Wachtwoord",
|
||||
"Password:": "Wachtwoord:",
|
||||
"Passwords can't be empty": "Wachtwoorden kunnen niet leeg zijn",
|
||||
|
@ -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",
|
||||
|
@ -327,5 +327,202 @@
|
|||
"%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s",
|
||||
"Set a display name:": "Weergavenaam instellen:",
|
||||
"Set a Display Name": "Weergavenaam instellen",
|
||||
"Upload an avatar:": "Een avatar uploaden:"
|
||||
"Upload an avatar:": "Een avatar uploaden:",
|
||||
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Geen verbinding met de thuisserver - controleer je verbinding. Controleer het <a>SSL-certificaat van de thuisserver</a> en browser-extensies die verzoeken kunnen blokkeren.",
|
||||
"%(count)s new messages.other": "%(count)s nieuwe berichten",
|
||||
"Create an account": "Open een account",
|
||||
"Cryptography": "Cryptografie",
|
||||
"Current password": "Huidig wachtwoord",
|
||||
"%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s heeft de naam van de kamer verwijderd.",
|
||||
"Create a new chat or reuse an existing one": "Maak een nieuwe chat aan of gebruik een reeds bestaande",
|
||||
"Create Room": "Maak een kamer",
|
||||
"Curve25519 identity key": "Curve25519 identiteitssleutel",
|
||||
"/ddg is not a command": "/ddg is geen commando",
|
||||
"Deactivate Account": "Account Deactiveren",
|
||||
"Deactivate my account": "Mijn account deactiveren",
|
||||
"Decline": "Weigeren",
|
||||
"Decrypt %(text)s": "Ontsleutel %(text)s",
|
||||
"Decryption error": "Fout bij het ontsleutelen",
|
||||
"Delete": "Verwijderen",
|
||||
"demote": "degraderen",
|
||||
"Device already verified!": "Apparaat reeds geverifieerd!",
|
||||
"Device ID": "Apparaat ID",
|
||||
"Device ID:": "Apparaat ID:",
|
||||
"device id: ": "apparaat id: ",
|
||||
"Device key:": "Apparaat sleutel:",
|
||||
"Devices": "Apparaten",
|
||||
"Devices will not yet be able to decrypt history from before they joined the room": "Apparaten kunnen nog niet de geschiedenis van voordat ze de ruimte betraden ontsleutelen",
|
||||
"Direct chats": "Privégesprekken",
|
||||
"Disable Notifications": "Notificaties uitschakelen",
|
||||
"Disable markdown formatting": "Opmaak formatering uitschakelen",
|
||||
"Disinvite": "Uitnodiging terugtrekken",
|
||||
"Display name": "Weergavenaam",
|
||||
"Don't send typing notifications": "Geen notificatie sturen bij het typen",
|
||||
"Download %(text)s": "%(text)s Downloaden",
|
||||
"Drop File Here": "Plaats Bestand Hier",
|
||||
"Ed25519 fingerprint": "Ed25519 vingerafdruk",
|
||||
"Email": "E-mail",
|
||||
"Email address": "E-mailadres",
|
||||
"Email address (optional)": "E-mailadres (optioneel)",
|
||||
"Claimed Ed25519 fingerprint key": "Vereiste Ed25519 vingerafdruk sleutel",
|
||||
"Custom": "Aangepast",
|
||||
"Custom level": "Aangepast niveau",
|
||||
"Deops user with given id": "Ontmachtigd gebruiker met het gegeven id",
|
||||
"Default": "Standaard",
|
||||
"Disable inline URL previews by default": "URL voorvertoning standaard uitschakelen",
|
||||
"Displays action": "Weergeeft actie",
|
||||
"Drop here to tag %(section)s": "Hiernaartoe verplaatsen om %(section)s te etiketteren",
|
||||
"Email, name or matrix ID": "E-mail, naam of matrix ID",
|
||||
"Emoji": "Emoticon",
|
||||
"Enable encryption": "Versleuteling inschakelen",
|
||||
"Enable Notifications": "Notificaties inschakelen",
|
||||
"enabled": "ingeschakeld",
|
||||
"Encrypted by a verified device": "Versleuteld bij een geverifieerd apparaat",
|
||||
"Encrypted by an unverified device": "Versleuteld bij een niet geverifieerd apparaat",
|
||||
"Encrypted messages will not be visible on clients that do not yet implement encryption": "Versleutelde berichten zullen nog niet zichtbaar zijn op applicaties die geen versleuteling ondersteunen",
|
||||
"Encrypted room": "Versleutelde ruimte",
|
||||
"Encryption is enabled in this room": "Versleuteling is ingeschakeld in deze ruimte",
|
||||
"Encryption is not enabled in this room": "Versleuteling is niet ingeschakeld in deze ruimte",
|
||||
"%(senderName)s ended the call.": "%(senderName)s heeft opgehangen.",
|
||||
"End-to-end encryption information": "Eind-tot-eind versleuteling informatie",
|
||||
"End-to-end encryption is in beta and may not be reliable": "Eind-tot-eind versleuteling is nog in beta en kan onbetrouwbaar zijn",
|
||||
"Enter Code": "Voer code in",
|
||||
"Enter passphrase": "Voer wachtzin in",
|
||||
"Error decrypting attachment": "Fout tijdens het ontsleutelen van de bijlage",
|
||||
"Error: Problem communicating with the given homeserver.": "Fout: Er doet zich een probleem voor met het communiceren met de gegeven thuisserver.",
|
||||
"Event information": "Gebeurtenis informatie",
|
||||
"Existing Call": "Bestaande oproep",
|
||||
"Export": "Exporteren",
|
||||
"Export E2E room keys": "Exporteer E2E ruimte sleutels",
|
||||
"Failed to ban user": "Niet gelukt om de gebruiker te verbannen",
|
||||
"Failed to change power level": "Niet gelukt om het machtsniveau te wijzigen",
|
||||
"Failed to delete device": "Niet gelukt om het apparaat te verwijderen",
|
||||
"Failed to fetch avatar URL": "Niet gelukt om de avatar URL op te halen",
|
||||
"Failed to join room": "Niet gelukt om tot de ruimte toe te treden",
|
||||
"Failed to leave room": "Niet gelukt om de ruimte te verlaten",
|
||||
"Failed to load timeline position": "Niet gelukt om de tijdlijn positie te laden",
|
||||
"Failed to lookup current room": "Niet gelukt om de huidige ruimte op te zoeken",
|
||||
"Failed to mute user": "Niet gelukt om de gebruiker te dempen",
|
||||
"Failed to register as guest:": "Niet gelukt om als gast te registreren:",
|
||||
"Failed to reject invite": "Niet gelukt om de uitnodiging te weigeren",
|
||||
"Failed to reject invitation": "Niet gelukt om de uitnodiging te weigeren",
|
||||
"Failed to save settings": "Niet gelukt om de instellingen op te slaan",
|
||||
"Failed to send email": "Niet gelukt om de e-mail te versturen",
|
||||
"Failed to send request.": "Niet gelukt om het verzoek te versturen.",
|
||||
"Failed to set avatar.": "Niet gelukt om de avatar in te stellen.",
|
||||
"Failed to set display name": "Niet gelukt om de weergavenaam in te stellen",
|
||||
"Failed to set up conference call": "Niet gelukt om een vergadergesprek te maken",
|
||||
"Failed to toggle moderator status": "Niet gelukt om de moderator status te veranderen",
|
||||
"Failed to unban": "Niet gelukt om te ontbannen",
|
||||
"Failed to upload file": "Niet gelukt om het bestand te uploaden",
|
||||
"Failed to upload profile picture!": "Niet gelukt om een profiel foto te uploaden!",
|
||||
"Failed to verify email address: make sure you clicked the link in the email": "Niet gelukt om het e-mailadres te verifiëren: wees er zeker van dat je de link in de e-mail hebt aangeklikt",
|
||||
"Failure to create room": "Het aanmaken van een ruimte is mislukt",
|
||||
"favourite": "favoriet",
|
||||
"Favourites": "Favorieten",
|
||||
"Fill screen": "Scherm vullen",
|
||||
"Filter room members": "Ruimte leden filteren",
|
||||
"Forget room": "Ruimte vergeten",
|
||||
"Forgot your password?": "Wachtwoord vergeten?",
|
||||
"For security, this session has been signed out. Please sign in again.": "Voor veiligheidsredenen is deze sessie uitgelogd. Log alsjeblieft opnieuw in.",
|
||||
"For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "In verband met veiligheidsredenen zullen alle eind-tot-eind versleutelingssleutels van deze browser verwijderd worden. Als je je gespreksgeschiedenis van toekomstige Riot sessies wilt kunnen ontsleutelen, exporteer en bewaar dan de ruimte sleutels.",
|
||||
"Found a bug?": "Een fout gevonden?",
|
||||
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s van %(fromPowerLevel)s naar %(toPowerLevel)s",
|
||||
"Guest access is disabled on this Home Server.": "Gast toegang is uitgeschakeld op deze thuisserver.",
|
||||
"Guests can't set avatars. Please register.": "Gasten kunnen geen avatars instellen. Registreer je alsjeblieft.",
|
||||
"Guest users can't create new rooms. Please register to create room and start a chat.": "Gast gebruikers kunnen geen nieuwe ruimtes aanmaken. Registreer je om een nieuwe ruimte aan te maken en een gesprek te starten.",
|
||||
"Guest users can't upload files. Please register to upload.": "Gast gebruikers kunnen geen bestanden uploaden. Registreer je om te uploaden.",
|
||||
"Guests can't use labs features. Please register.": "Gasten kunnen geen labs mogelijkheden gebruiken. Registreer je alsjeblieft.",
|
||||
"Guests cannot join this room even if explicitly invited.": "Gasten kunnen niet tot deze ruimte toetreden, zelfs als ze expliciet uitgenodigd zijn.",
|
||||
"had": "had",
|
||||
"Hangup": "Ophangen",
|
||||
"Hide read receipts": "Leesbewijzen verbergen",
|
||||
"Hide Text Formatting Toolbar": "Tekst formaterings-gereedschapsbalk verbergen",
|
||||
"Historical": "Historische",
|
||||
"Home": "Home",
|
||||
"Homeserver is": "Thuisserver is",
|
||||
"Identity Server is": "Identiteitsserver is",
|
||||
"I have verified my email address": "Ik heb mijn e-mailadres geverifieerd",
|
||||
"Import": "Importeren",
|
||||
"Import E2E room keys": "E2E ruimte sleutels importeren",
|
||||
"Incoming call from %(name)s": "Inkomende oproep van %(name)s",
|
||||
"Incoming video call from %(name)s": "Inkomende video-oproep van %(name)s",
|
||||
"Incoming voice call from %(name)s": "Inkomende spraakoproep van %(name)s",
|
||||
"Incorrect username and/or password.": "Incorrecte gebruikersnaam en/of wachtwoord.",
|
||||
"Incorrect verification code": "Incorrecte verificatie code",
|
||||
"Interface Language": "Interface Taal",
|
||||
"Invalid alias format": "Ongeldig naam formaat",
|
||||
"Invalid address format": "Ongeldig adres formaat",
|
||||
"Invalid Email Address": "Ongeldig e-mailadres",
|
||||
"Invalid file%(extra)s": "Ongeldig bestand%(extra)s",
|
||||
"%(senderName)s invited %(targetName)s.": "%(senderName)s heeft %(targetName)s uitgenodigd.",
|
||||
"Invite new room members": "Nieuwe ruimte leden uitnodigen",
|
||||
"Invited": "Uitgenodigd",
|
||||
"Invites": "Uitnodigingen",
|
||||
"Invites user with given id to current room": "Nodigt de gebruiker met het gegeven id uit in de huidige ruimte",
|
||||
"'%(alias)s' is not a valid format for an address": "'%(alias)s' is niet een geldig formaat voor een adres",
|
||||
"'%(alias)s' is not a valid format for an alias": "'%(alias)s' is niet een geldig formaat voor een naam",
|
||||
"%(displayName)s is typing": "%(displayName)s is aan het typen",
|
||||
"Sign in with": "Inloggen met",
|
||||
"Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Toetreden als <voiceText>spraak</voiceText> of <videoText>video</videoText>.",
|
||||
"Join Room": "Ruimte toetreden",
|
||||
"joined and left": "Toegetreden en verlaten",
|
||||
"joined": "Toegetreden",
|
||||
"%(targetName)s joined the room.": "%(targetName)s in de ruimte toegetreden.",
|
||||
"Joins room with given alias": "Treed de ruimte toe met een gegeven naam",
|
||||
"Jump to first unread message.": "Spring naar het eerste ongelezen bericht.",
|
||||
"Labs": "Labs",
|
||||
"Last seen": "Laatst gezien",
|
||||
"Leave room": "Ruimte verlaten",
|
||||
"left and rejoined": "verlaten en opnieuw toegetreden",
|
||||
"left": "verlaten",
|
||||
"%(targetName)s left the room.": "%(targetName)s heeft de ruimte verlaten.",
|
||||
"Level:": "Niveau:",
|
||||
"List this room in %(domain)s's room directory?": "Deze ruimte in %(domain)s's ruimte catalogus vermelden?",
|
||||
"Local addresses for this room:": "Lokale adressen voor deze ruimte:",
|
||||
"Logged in as:": "Ingelogd als:",
|
||||
"Login as guest": "Als gast inloggen",
|
||||
"Logout": "Uitloggen",
|
||||
"Low priority": "Lage prioriteit",
|
||||
"%(senderName)s made future room history visible to": "%(senderName)s heeft de toekomstige ruimte geschiedenis zichtbaar gemaakt voor",
|
||||
"Manage Integrations": "Integraties beheren",
|
||||
"Markdown is disabled": "Opmaak is uitgeschakeld",
|
||||
"Markdown is enabled": "Opmaak ingeschakeld",
|
||||
"matrix-react-sdk version:": "matrix-react-sdk versie:",
|
||||
"Members only": "Alleen leden",
|
||||
"Message not sent due to unknown devices being present": "Bericht niet verzonden doordat er een onbekende apparaten aanwezig zijn",
|
||||
"Missing room_id in request": "Het room_id mist in het verzoek",
|
||||
"Missing user_id in request": "De user_id mist in het verzoek",
|
||||
"Mobile phone number": "Mobiel telefoonnummer",
|
||||
"Mobile phone number (optional)": "Mobiel telefoonnummer (optioneel)",
|
||||
"Never send encrypted messages to unverified devices from this device": "Nooit versleutelde berichten vanaf dit apparaat naar niet geverifieerde apparaten versturen",
|
||||
"Never send encrypted messages to unverified devices in this room": "Nooit versleutelde berichten naar niet geverifieerde apparaten sturen in deze ruimte",
|
||||
"Never send encrypted messages to unverified devices in this room from this device": "Nooit vanaf dit apparaat versleutelde berichten naar niet geverifieerde apparaten in deze ruimte sturen",
|
||||
"New address (e.g. #foo:%(localDomain)s)": "Nieuw adres (bijv. #foo:%(localDomain)s)",
|
||||
"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 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."
|
||||
}
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
"Create Room": "Создайте Комнату",
|
||||
"Cryptography": "Шифрование",
|
||||
"Curve25519 identity key": "Curve25519 идентификационный ключ",
|
||||
"Deactivate Account": "Деактивировать Учётную запись",
|
||||
"Deactivate Account": "Деактивировать учётную запись",
|
||||
"Deactivate my account": "Деактивировать мою учётную запись",
|
||||
"decline": "отказаться",
|
||||
"Decryption error": "Ошибка дешифрования",
|
||||
|
@ -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": "был",
|
||||
|
@ -246,7 +246,7 @@
|
|||
"Failed to set up conference call": "Не удалось установить конференц-вызов",
|
||||
"Failed to verify email address: make sure you clicked the link in the email": "Не удалось подтвердить email-адрес: убедитесь что вы щелкнули по ссылке электронной почты",
|
||||
"Failure to create room": "Не удалось создать комнату",
|
||||
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId) изменил %(fromPowerLevel) на %(toPowerLevel)",
|
||||
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s изменил %(fromPowerLevel)s на %(toPowerLevel)s",
|
||||
"Guest users can't create new rooms. Please register to create room and start a chat.": "Гостевые пользователи не могут создавать новые комнаты. Зарегистрируйтесь для создания комнаты и чата.",
|
||||
"click to reveal": "нажать для открытия",
|
||||
"%(senderName)s invited %(targetName)s.": "%(senderName)s приглашает %(targetName)s.",
|
||||
|
@ -355,7 +355,7 @@
|
|||
"Friday": "Пятница",
|
||||
"Saturday": "Суббота",
|
||||
"Sunday": "Воскресенье",
|
||||
"%(weekDayName)s %(time)s": "%(weekDayName) %(time)",
|
||||
"%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s",
|
||||
"Upload an avatar:": "Загрузите аватар:",
|
||||
"You need to be logged in.": "Вы должны быть авторизованы.",
|
||||
"You need to be able to invite users to do that.": "Вам необходимо пригласить пользователей чтобы сделать это.",
|
||||
|
@ -470,7 +470,7 @@
|
|||
"Failed to ban user": "Не удалось забанить пользователя",
|
||||
"Failed to change power level": "Не удалось изменить уровень привилегий",
|
||||
"Failed to delete device": "Не удалось удалить устройство",
|
||||
"Failed to forget room %(errCode)s": "Не удалось забыть комнату %(errCode)s",
|
||||
"Failed to forget room %(errCode)s": "Не удалось удалить комнату %(errCode)s",
|
||||
"Failed to join room": "Не удалось присоединиться к комнате",
|
||||
"Failed to join the room": "Не удалось войти в комнату",
|
||||
"Access Token:": "Токен:",
|
||||
|
@ -523,8 +523,8 @@
|
|||
"No results": "Нет результатов",
|
||||
"OK": "ОК",
|
||||
"Only people who have been invited": "Только приглашённые люди",
|
||||
"Passwords can't be empty": "Пароли не могут быть пустыми",
|
||||
"%(senderName)s placed a %(callType)s call.": "%(senderName) выполнил %(callType) вызов.",
|
||||
"Passwords can't be empty": "Поля паролей не могут быть пустыми",
|
||||
"%(senderName)s placed a %(callType)s call.": "%(senderName)s выполнил %(callType)s вызов.",
|
||||
"Please check your email and click on the link it contains. Once this is done, click continue.": "Пожалуйста, проверьте вашу электронную почту и нажмите в ней ссылку. По завершении нажмите продолжить.",
|
||||
"Power level must be positive integer.": "Уровень силы должен быть положительным числом.",
|
||||
"Press": "Нажать",
|
||||
|
@ -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": "Компактное отображение",
|
||||
|
@ -686,7 +686,7 @@
|
|||
"Custom level": "Пользовательский уровень",
|
||||
"Device already verified!": "Устройство уже верифицировано!",
|
||||
"Device ID:": "ID устройства:",
|
||||
"device id: ": "id устройства: ",
|
||||
"device id: ": "ID устройства: ",
|
||||
"Device key:": "Ключ устройства:",
|
||||
"disabled": "отключено",
|
||||
"Disable markdown formatting": "Отключить форматирование Markdown",
|
||||
|
@ -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": "Нет отображаемое имя",
|
||||
|
@ -946,8 +946,8 @@
|
|||
"Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Хотели бы вы <acceptText>подтвердить</acceptText> это приглашение или <declineText>отклонить</declineText>?",
|
||||
"(~%(count)s results).one": "(~%(count)s Результат)",
|
||||
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Не удается подключиться к домашнему серверу - проверьте подключение, убедитесь, что ваш сертификат SSL <a>homeserver's SSL certificate</a> действителен, и расширение браузера не блокирует запросы.",
|
||||
"You have been banned from %(roomName)s by %(userName)s.": "%(userName) забанил Вас в % (roomName).",
|
||||
"You have been kicked from %(roomName)s by %(userName)s.": "%(userName) выгнал Вас из %(roomName).",
|
||||
"You have been banned from %(roomName)s by %(userName)s.": "%(userName)s забанил Вас в %(roomName)s.",
|
||||
"You have been kicked from %(roomName)s by %(userName)s.": "%(userName)s выгнал Вас из %(roomName)s.",
|
||||
"You may wish to login with a different account, or add this email to this account.": "Вы можете войти в систему с другой учетной записью или добавить этот адрес email в эту учетную запись.",
|
||||
"Your home server does not support device management.": "Ваш домашний сервер не поддерживает управление устройствами.",
|
||||
"(could not connect media)": "(не удается подключиться к медиа)",
|
||||
|
@ -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>, чтобы просмотреть каталог"
|
||||
}
|
||||
|
|
|
@ -296,7 +296,7 @@
|
|||
"Active call (%(roomName)s)": "Aktiv samtal (%(roomName)s)",
|
||||
"Add": "Lägg till",
|
||||
"Admin tools": "Admin verktyg",
|
||||
"And %(count)s more...": "Och %(count) till...",
|
||||
"And %(count)s more...": "Och %(count)s till...",
|
||||
"Alias (optional)": "Alias (valfri)",
|
||||
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.": "Det gick inte att ansluta till servern - kontrollera anslutningen, försäkra att din <a>hemservers TLS-certifikat</a> är betrott, och att inget webbläsartillägg blockerar förfrågningar.",
|
||||
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s ändrade maktnivån av %(powerLevelDiffText)s.",
|
||||
|
|
|
@ -151,5 +151,9 @@
|
|||
"zh-hk": "традиційна китайська (Гонконг)",
|
||||
"zh-sg": "спрощена китайська (Сингапур)",
|
||||
"zh-tw": "традиційна китайська (Тайвань)",
|
||||
"zu": "зулу"
|
||||
"zu": "зулу",
|
||||
"a room": "кімната",
|
||||
"A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Текстове повідомлення було надіслано +%(msisdn)s. Введіть, будь ласка, код підтвердження з цього повідомлення",
|
||||
"Accept": "Прийняти",
|
||||
"Account": "Обліковка"
|
||||
}
|
||||
|
|
|
@ -352,5 +352,9 @@
|
|||
"Password:": "密码:",
|
||||
"Passwords can't be empty": "密码不能为空",
|
||||
"Permissions": "权限",
|
||||
"Phone": "电话"
|
||||
"Phone": "电话",
|
||||
"Cancel": "取消",
|
||||
"Create new room": "创建新房间",
|
||||
"Custom Server Options": "自定义服务器选项",
|
||||
"Dismiss": "设为已读"
|
||||
}
|
||||
|
|
|
@ -55,6 +55,8 @@ const INITIAL_STATE = {
|
|||
// pixelOffset: the number of pixels the window is scrolled down
|
||||
// from the focussedEvent.
|
||||
scrollStateMap: {},
|
||||
|
||||
forwardingEvent: null,
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -116,6 +118,11 @@ class RoomViewStore extends Store {
|
|||
case 'update_scroll_state':
|
||||
this._updateScrollState(payload);
|
||||
break;
|
||||
case 'forward_event':
|
||||
this._setState({
|
||||
forwardingEvent: payload.event,
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -127,8 +134,11 @@ class RoomViewStore extends Store {
|
|||
initialEventId: payload.event_id,
|
||||
initialEventPixelOffset: undefined,
|
||||
isInitialEventHighlighted: payload.highlighted,
|
||||
forwardingEvent: null,
|
||||
roomLoading: false,
|
||||
roomLoadError: null,
|
||||
// should peek by default
|
||||
shouldPeek: payload.should_peek === undefined ? true : payload.should_peek,
|
||||
};
|
||||
|
||||
// If an event ID wasn't specified, default to the one saved for this room
|
||||
|
@ -141,6 +151,14 @@ class RoomViewStore extends Store {
|
|||
}
|
||||
}
|
||||
|
||||
if (this._state.forwardingEvent) {
|
||||
dis.dispatch({
|
||||
action: 'send_event',
|
||||
room_id: newState.roomId,
|
||||
event: this._state.forwardingEvent,
|
||||
});
|
||||
}
|
||||
|
||||
this._setState(newState);
|
||||
} else if (payload.room_alias) {
|
||||
// Resolve the alias and then do a second dispatch with the room ID acquired
|
||||
|
@ -276,6 +294,15 @@ class RoomViewStore extends Store {
|
|||
getJoinError() {
|
||||
return this._state.joinError;
|
||||
}
|
||||
|
||||
// The mxEvent if one is about to be forwarded
|
||||
getForwardingEvent() {
|
||||
return this._state.forwardingEvent;
|
||||
}
|
||||
|
||||
shouldPeek() {
|
||||
return this._state.shouldPeek;
|
||||
}
|
||||
}
|
||||
|
||||
let singletonRoomViewStore = null;
|
||||
|
|
Loading…
Reference in a new issue