diff --git a/CHANGELOG.md b/CHANGELOG.md index ed6fb3ba36..8bc4bbcfce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,117 @@ +Changes in [0.9.7](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.7) (2017-06-22) +=================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.6...v0.9.7) + + * Fix ability to invite users with caps in their user IDs + [\#1128](https://github.com/matrix-org/matrix-react-sdk/pull/1128) + * Fix another race with first-sync + [\#1131](https://github.com/matrix-org/matrix-react-sdk/pull/1131) + * Make the indexeddb worker script work again + [\#1132](https://github.com/matrix-org/matrix-react-sdk/pull/1132) + * Use the web worker when clearing js-sdk stores + [\#1133](https://github.com/matrix-org/matrix-react-sdk/pull/1133) + +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) diff --git a/package.json b/package.json index 151b6d6170..cbc06c9771 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "0.9.4", + "version": "0.9.7", "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.13", "optimist": "^0.6.1", "prop-types": "^15.5.8", "q": "^1.4.1", diff --git a/src/BasePlatform.js b/src/BasePlatform.js index d0d8e0c74e..a920479823 100644 --- a/src/BasePlatform.js +++ b/src/BasePlatform.js @@ -17,6 +17,8 @@ See the License for the specific language governing permissions and limitations under the License. */ +import dis from './dispatcher'; + /** * Base class for classes that provide platform-specific functionality * eg. Setting an application badge or displaying notifications @@ -27,6 +29,16 @@ export default class BasePlatform { constructor() { this.notificationCount = 0; this.errorDidOccur = false; + + dis.register(this._onAction.bind(this)); + } + + _onAction(payload: Object) { + switch (payload.action) { + case 'on_logged_out': + this.setNotificationCount(0); + break; + } } // Used primarily for Analytics diff --git a/src/DateUtils.js b/src/DateUtils.js index 0bce7c8a16..545d92dd3b 100644 --- a/src/DateUtils.js +++ b/src/DateUtils.js @@ -60,7 +60,7 @@ function twelveHourTime(date) { } module.exports = { - formatDate: function(date) { + formatDate: function(date, showTwelveHour=false) { var now = new Date(); const days = getDaysArray(); const months = getMonthsArray(); @@ -69,7 +69,7 @@ module.exports = { } else if (now.getTime() - date.getTime() < 6 * 24 * 60 * 60 * 1000) { // TODO: use standard date localize function provided in counterpart - return _t('%(weekDayName)s %(time)s', {weekDayName: days[date.getDay()], time: this.formatTime(date)}); + return _t('%(weekDayName)s %(time)s', {weekDayName: days[date.getDay()], time: this.formatTime(date, showTwelveHour)}); } else if (now.getFullYear() === date.getFullYear()) { // TODO: use standard date localize function provided in counterpart @@ -80,7 +80,7 @@ module.exports = { time: this.formatTime(date), }); } - return this.formatFullDate(date); + return this.formatFullDate(date, showTwelveHour); }, formatFullDate: function(date, showTwelveHour=false) { diff --git a/src/KeyRequestHandler.js b/src/KeyRequestHandler.js new file mode 100644 index 0000000000..1da4922153 --- /dev/null +++ b/src/KeyRequestHandler.js @@ -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; + } +} + diff --git a/src/Lifecycle.js b/src/Lifecycle.js index 39a159869c..06f5d9ef00 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -29,32 +29,25 @@ import DMRoomMap from './utils/DMRoomMap'; import RtsClient from './RtsClient'; import Modal from './Modal'; import sdk from './index'; -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 +61,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 +76,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 +87,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 +100,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,22 +136,26 @@ 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; }); } function _registerAsGuest(hsUrl, isUrl, defaultDeviceDisplayName) { - console.log("Doing guest login on %s", hsUrl); + console.log(`Doing guest login on ${hsUrl}`); // TODO: we should probably de-duplicate this and Login.loginAsGuest. // Not really sure where the right home for it is. @@ -160,7 +170,7 @@ function _registerAsGuest(hsUrl, isUrl, defaultDeviceDisplayName) { initial_device_display_name: defaultDeviceDisplayName, }, }).then((creds) => { - console.log("Registered as guest: %s", creds.user_id); + console.log(`Registered as guest: ${creds.user_id}`); return _doSetLoggedIn({ userId: creds.user_id, deviceId: creds.device_id, @@ -168,9 +178,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; }); } @@ -203,7 +214,7 @@ function _restoreFromLocalStorage() { } if (accessToken && userId && hsUrl) { - console.log("Restoring session for %s", userId); + console.log(`Restoring session for ${userId}`); try { return _doSetLoggedIn({ userId: userId, @@ -225,27 +236,12 @@ function _restoreFromLocalStorage() { function _handleRestoreFailure(e) { console.log("Unable to restore session", e); - let msg = e.message; - if (msg == "OLM.BAD_LEGACY_ACCOUNT_PICKLE") { - msg = _t( - '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.', - ); - - _clearStorage(); - - return q.reject(new Error( - _t('Unable to restore previous session') + ': ' + msg, - )); - } - const def = q.defer(); const SessionRestoreErrorDialog = sdk.getComponent('views.dialogs.SessionRestoreErrorDialog'); Modal.createDialog(SessionRestoreErrorDialog, { - error: msg, + error: e.message, onFinished: (success) => { def.resolve(success); }, @@ -282,10 +278,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,16 +293,16 @@ 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); console.log( - "setLoggedIn: mxid:", credentials.userId, - "deviceId:", credentials.deviceId, - "guest:", credentials.guest, - "hs:", credentials.homeserverUrl, + "setLoggedIn: mxid: " + credentials.userId + + " deviceId: " + credentials.deviceId + + " guest: " + credentials.guest + + " hs: " + credentials.homeserverUrl, ); // This is dispatched to indicate that the user is still in the process of logging in @@ -322,23 +320,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 +334,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 +360,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 ${credentials.userId}`); } /** diff --git a/src/MatrixClientPeg.js b/src/MatrixClientPeg.js index 47370e2142..0676e4600f 100644 --- a/src/MatrixClientPeg.js +++ b/src/MatrixClientPeg.js @@ -1,5 +1,6 @@ /* Copyright 2015, 2016 OpenMarket Ltd +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. @@ -47,7 +48,6 @@ class MatrixClientPeg { this.opts = { initialSyncLimit: 20, }; - this.indexedDbWorkerScript = null; } /** @@ -58,7 +58,7 @@ class MatrixClientPeg { * @param {string} script href to the script to be passed to the web worker */ setIndexedDbWorkerScript(script) { - this.indexedDbWorkerScript = script; + createMatrixClient.indexedDbWorkerScript = script; } get(): MatrixClient { @@ -84,7 +84,9 @@ class MatrixClientPeg { let promise = this.matrixClient.store.startup(); // log any errors when starting up the database (if one exists) - promise.catch((err) => { console.error(err); }); + promise.catch((err) => { + console.error(`Error starting matrixclient store: ${err}`); + }); // regardless of errors, start the client. If we did error out, we'll // just end up doing a full initial /sync. @@ -127,7 +129,7 @@ class MatrixClientPeg { timelineSupport: true, }; - this.matrixClient = createMatrixClient(opts); + this.matrixClient = createMatrixClient(opts, this.indexedDbWorkerScript); // we're going to add eventlisteners for each matrix event tile, so the // potential number of event listeners is quite high. diff --git a/src/components/structures/LoggedInView.js b/src/components/structures/LoggedInView.js index 0e2d171f20..988c0f5ccc 100644 --- a/src/components/structures/LoggedInView.js +++ b/src/components/structures/LoggedInView.js @@ -213,6 +213,7 @@ export default React.createClass({ const GroupView = sdk.getComponent('structures.GroupView'); const MatrixToolbar = sdk.getComponent('globals.MatrixToolbar'); const NewVersionBar = sdk.getComponent('globals.NewVersionBar'); + const UpdateCheckBar = sdk.getComponent('globals.UpdateCheckBar'); const PasswordNagBar = sdk.getComponent('globals.PasswordNagBar'); let page_element; @@ -288,12 +289,14 @@ export default React.createClass({ break; } + let topBar; const isGuest = this.props.matrixClient.isGuest(); - var topBar; if (this.props.hasNewVersion) { topBar = ; + } else if (this.props.checkingForUpdate) { + topBar = ; } else if (this.state.userHasGeneratedPassword) { topBar = ; } else if (!isGuest && Notifier.supportsDesktopNotifications() && !Notifier.isEnabled() && !Notifier.isToolbarHidden()) { diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index ced3741dc1..0deb236e86 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -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, @@ -127,6 +157,7 @@ module.exports = React.createClass({ newVersion: null, hasNewVersion: false, newVersionReleaseNotes: null, + checkingForUpdate: null, // Parameters used in the registration dance with the IS register_client_secret: null, @@ -143,7 +174,7 @@ module.exports = React.createClass({ realQueryParams: {}, startingFragmentQueryParams: {}, config: {}, - onLoadCompleted: () => {}, + onTokenLoginCompleted: () => {}, }; }, @@ -269,39 +300,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(`Error attempting 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() { @@ -320,18 +361,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"); @@ -343,26 +385,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; @@ -509,10 +544,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); @@ -523,15 +559,18 @@ 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 'check_updates': + this.setState({ checkingForUpdate: payload.value }); + break; + case 'send_event': + this.onSendEvent(payload.room_id, payload.event); + break; } }, @@ -546,8 +585,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 @@ -855,14 +894,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 * @@ -915,9 +946,7 @@ module.exports = React.createClass({ */ _onLoggedIn: function(teamToken) { this.setState({ - guestCreds: null, - loggedIn: true, - loggingIn: false, + view: VIEWS.LOGGED_IN, }); if (teamToken) { @@ -926,10 +955,6 @@ module.exports = React.createClass({ dis.dispatch({action: 'view_home_page'}); } else if (this._is_registered) { this._is_registered = false; - // reset the 'have completed first sync' flag, - // since we've just logged in and will be about to sync - this.firstSyncComplete = false; - this.firstSyncPromise = q.defer(); // Set the display name = user ID localpart MatrixClientPeg.get().setDisplayName( @@ -978,8 +1003,8 @@ module.exports = React.createClass({ */ _onLoggedOut: function() { this.notifyNewScreen('login'); - this.setStateForNewScreen({ - loggedIn: false, + this.setStateForNewView({ + view: VIEWS.LOGIN, ready: false, collapse_lhs: false, collapse_rhs: false, @@ -987,6 +1012,7 @@ module.exports = React.createClass({ page_type: PageTypes.RoomDirectory, }); this._teamToken = null; + this._setPageSubtitle(); }, /** @@ -995,6 +1021,16 @@ 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}); + + // reset the 'have completed first sync' flag, + // since we're about to start the client and therefore about + // to do the first sync + this.firstSyncComplete = false; + this.firstSyncPromise = q.defer(); const cli = MatrixClientPeg.get(); // Allow the JS SDK to reap timeline events. This reduces the amount of @@ -1065,6 +1101,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) { @@ -1142,7 +1186,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) { @@ -1254,29 +1298,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"); }, @@ -1287,9 +1327,35 @@ module.exports = React.createClass({ newVersion: latest, hasNewVersion: current !== latest, newVersionReleaseNotes: releaseNotes, + checkingForUpdate: null, }); }, + 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}`; + }, + updateStatusIndicator: function(state, prevState) { let notifCount = 0; @@ -1310,15 +1376,15 @@ module.exports = React.createClass({ PlatformPeg.get().setNotificationCount(notifCount); } - let title = "Riot "; + let subtitle = ''; if (state === "ERROR") { - title += `[${_t("Offline")}] `; + subtitle += `[${_t("Offline")}] `; } if (notifCount > 0) { - title += `[${notifCount}]`; + subtitle += `[${notifCount}]`; } - document.title = title; + this._setPageSubtitle(subtitle); }, onUserSettingsClose: function() { @@ -1344,11 +1410,9 @@ module.exports = React.createClass({ }, render: function() { - // `loading` might be set to false before `loggedIn = true`, causing the default - // (``) 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 (
@@ -1358,7 +1422,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 ( - ); - } 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 ( - - ); - } 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 ( + + ); + } else { + // we think we are logged in, but are still waiting for the /sync to complete + const Spinner = sdk.getComponent('elements.Spinner'); + return ( + + ); + } + } + + if (this.state.view === VIEWS.REGISTER) { const Registration = sdk.getComponent('structures.login.Registration'); return ( ); - } else if (this.state.screen == 'forgot_password') { + } + + + if (this.state.view === VIEWS.FORGOT_PASSWORD) { const ForgotPassword = sdk.getComponent('structures.login.ForgotPassword'); return ( ); - } else { + } + + if (this.state.view === VIEWS.LOGIN) { const Login = sdk.getComponent('structures.login.Login'); return ( ); } + + console.error(`Unknown view ${this.state.view}`); }, }); diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 9306008e71..b29b3579f0 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -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 = ; } else if (this.state.forwardingEvent !== null) { - aux = ; + aux = ; } else if (this.state.searching) { hideCancel = true; // has own cancel aux = ; diff --git a/src/components/structures/UserSettings.js b/src/components/structures/UserSettings.js index fc13f0bdcf..9a5eb07cde 100644 --- a/src/components/structures/UserSettings.js +++ b/src/components/structures/UserSettings.js @@ -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'); @@ -243,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() { @@ -269,6 +276,22 @@ module.exports = React.createClass({ } }, + // `UserSettings` assumes that the client peg will not be null, so give it some + // sort of assurance here by only allowing a re-render if the client is truthy. + // + // This is required because `UserSettings` maintains its own state and if this state + // updates (e.g. during _setStateFromSessionStore) after the client peg has been made + // null (during logout), then it will attempt to re-render and throw errors. + shouldComponentUpdate: function() { + return Boolean(MatrixClientPeg.get()); + }, + + _setStateFromSessionStore: function() { + this.setState({ + userHasGeneratedPassword: Boolean(this._sessionStore.getCachedPassword()), + }); + }, + _electronSettings: function(ev, settings) { this.setState({ electron_settings: settings }); }, @@ -861,6 +884,21 @@ module.exports = React.createClass({
; }, + _renderCheckUpdate: function() { + const platform = PlatformPeg.get(); + if ('canSelfUpdate' in platform && platform.canSelfUpdate() && 'startUpdateCheck' in platform) { + return
+

{_t('Updates')}

+
+ + {_t('Check for update')} + +
+
; + } + return
; + }, + _renderBulkOptions: function() { const invitedRooms = MatrixClientPeg.get().getRooms().filter((r) => { return r.hasMembershipState(this._me, "invite"); @@ -1201,10 +1239,14 @@ module.exports = React.createClass({

{ _t("Account") }

- { _t("Sign out") } + { this.state.userHasGeneratedPassword ? +
+ { _t("To return to your account in future you need to set a password") } +
: null + } {accountJsx}
@@ -1258,6 +1300,8 @@ module.exports = React.createClass({
+ {this._renderCheckUpdate()} + {this._renderClearCache()} {this._renderDeactivateAccount()} diff --git a/src/components/structures/login/Registration.js b/src/components/structures/login/Registration.js index 17fbf445b2..388198bb02 100644 --- a/src/components/structures/login/Registration.js +++ b/src/components/structures/login/Registration.js @@ -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); diff --git a/src/components/views/dialogs/ChatInviteDialog.js b/src/components/views/dialogs/ChatInviteDialog.js index 9a14cb91d3..a85efadef7 100644 --- a/src/components/views/dialogs/ChatInviteDialog.js +++ b/src/components/views/dialogs/ChatInviteDialog.js @@ -178,7 +178,7 @@ module.exports = React.createClass({ }, onQueryChanged: function(ev) { - const query = ev.target.value.toLowerCase(); + const query = ev.target.value; if (this.queryChangedDebouncer) { clearTimeout(this.queryChangedDebouncer); } @@ -271,10 +271,11 @@ module.exports = React.createClass({ query, searchError: null, }); + const queryLowercase = query.toLowerCase(); const results = []; MatrixClientPeg.get().getUsers().forEach((user) => { - if (user.userId.toLowerCase().indexOf(query) === -1 && - user.displayName.toLowerCase().indexOf(query) === -1 + if (user.userId.toLowerCase().indexOf(queryLowercase) === -1 && + user.displayName.toLowerCase().indexOf(queryLowercase) === -1 ) { return; } diff --git a/src/components/views/dialogs/KeyShareDialog.js b/src/components/views/dialogs/KeyShareDialog.js new file mode 100644 index 0000000000..61391d281c --- /dev/null +++ b/src/components/views/dialogs/KeyShareDialog.js @@ -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 ( +
+

{text}

+ +
+ + + +
+
+ ); + }, + + 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 = ( +
+

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

+ +
+ ); + } + + return ( + + {content} + + ); + }, +}); diff --git a/src/components/views/dialogs/SetEmailDialog.js b/src/components/views/dialogs/SetEmailDialog.js index 82256970de..3c38064ee1 100644 --- a/src/components/views/dialogs/SetEmailDialog.js +++ b/src/components/views/dialogs/SetEmailDialog.js @@ -154,7 +154,7 @@ export default React.createClass({ /> diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index 5c970a0966..170925999d 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -336,6 +336,7 @@ module.exports = WithMatrixClient(React.createClass({ suppressAnimation={this._suppressReadReceiptAnimation} onClick={this.toggleAllReadAvatars} timestamp={receipt.ts} + showTwelveHour={this.props.isTwelveHour} /> ); } diff --git a/src/components/views/rooms/ForwardMessage.js b/src/components/views/rooms/ForwardMessage.js index 33df201d7c..3c97128a02 100644 --- a/src/components/views/rooms/ForwardMessage.js +++ b/src/components/views/rooms/ForwardMessage.js @@ -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: diff --git a/src/components/views/rooms/ReadReceiptMarker.js b/src/components/views/rooms/ReadReceiptMarker.js index 7565b0741d..64b54fe1e1 100644 --- a/src/components/views/rooms/ReadReceiptMarker.js +++ b/src/components/views/rooms/ReadReceiptMarker.js @@ -66,6 +66,9 @@ module.exports = React.createClass({ // Timestamp when the receipt was read timestamp: React.PropTypes.number, + + // True to show twelve hour format, false otherwise + showTwelveHour: React.PropTypes.bool, }, getDefaultProps: function() { @@ -172,7 +175,7 @@ module.exports = React.createClass({ if (this.props.timestamp) { title = _t( "Seen by %(userName)s at %(dateTime)s", - {userName: this.props.member.userId, dateTime: DateUtils.formatDate(new Date(this.props.timestamp))} + {userName: this.props.member.userId, dateTime: DateUtils.formatDate(new Date(this.props.timestamp), this.props.showTwelveHour)} ); } diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index f90d89c8c1..9f9f030c27 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -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
- Press - - to start a chat with someone + {_tJsx( + "Press to start a chat with someone", + [//], + [ + (sub) => + ] + )}
; case 'im.vector.fake.recent': return
- You're not in any rooms yet! Press - - to make a room or - - to browse the directory + {_tJsx( + "You're not in any rooms yet! Press to make a room or"+ + " to browse the directory", + [//, //], + [ + (sub) => , + (sub) => + ] + )}
; } @@ -497,7 +522,7 @@ module.exports = React.createClass({ return null; } - const labelText = 'Drop here to ' + (VERBS[section] || 'tag ' + section); + const labelText = phraseForSection(section); return ; }, diff --git a/src/createRoom.js b/src/createRoom.js index 4d7f5792f3..ce83f31c27 100644 --- a/src/createRoom.js +++ b/src/createRoom.js @@ -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; diff --git a/src/i18n/strings/be.json b/src/i18n/strings/be.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/i18n/strings/be.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 47553e8b94..8231040a45 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -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", @@ -305,7 +305,6 @@ "You are already in a call.": "Du bist bereits in einem Gespräch.", "You cannot place a call with yourself.": "Du kannst keinen Anruf mit dir selbst starten.", "You cannot place VoIP calls in this browser.": "VoIP-Gespräche werden von diesem Browser nicht unterstützt.", - "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.": "Du musst dich erneut anmelden, um Ende-zu-Ende-Verschlüsselungs-Schlüssel für dieses Gerät zu generieren und um den öffentlichen Schlüssel auf deinem Homeserver zu hinterlegen. Dies muss nur einmal durchgeführt werden, bitte entschuldige die Unannehmlichkeiten.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Deine E-Mail-Adresse scheint nicht mit einer Matrix-ID auf diesem Heimserver verbunden zu sein.", "Sun": "So", "Mon": "Mo", @@ -319,7 +318,7 @@ "Mar": "Mrz", "Apr": "April", "May": "Mai", - "Jun": "Juni", + "Jun": "Jun", "Jul": "Juli", "Aug": "Aug", "Sep": "Sep", @@ -339,7 +338,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 +415,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 demote": "um die Priorität 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 +670,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 +709,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 +725,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 +734,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 +780,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.", @@ -791,7 +790,7 @@ "Opt out of analytics": "Zustimmung zur Übermittlung von anonymisierten Analysedaten verweigern", "Riot collects anonymous analytics to allow us to improve the application.": "Riot sammelt anonymisierte Analysedaten, um die Anwendung kontinuierlich verbessern zu können.", "Add an Integration": "Eine Integration hinzufügen", - "Removed or unknown message type": "Gelöschte oder unbekannter Nachrichten-Typ", + "Removed or unknown message type": "Gelöschte Nachricht oder unbekannter Nachrichten-Typ", "Disable URL previews by default for participants in this room": "URL-Vorschau für Teilnehmer dieses Raumes standardmäßig deaktivieren", "URL previews are %(globalDisableUrlPreview)s by default for participants in this room.": "URL-Vorschau ist standardmäßig %(globalDisableUrlPreview)s für Teilnehmer dieses Raumes.", "URL Previews": "URL-Vorschau", @@ -815,14 +814,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 +848,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 +860,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 +871,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 disabled URL previews by default.": "Du hast die URL-Vorschau standardmäßig deaktiviert.", "You have enabled URL previews by default.": "Du hast die URL-Vorschau standardmäßig aktiviert.", - "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 ": "$senderDisplayName hat das Raum-Bild geändert zu ", "%(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 +921,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 voice or video.": "Mit Sprache oder Video beitreten.", + "Join as voice or video.": "Per Sprachanruf oder Videoanruf beitreten.", "Last seen": "Zuletzt gesehen", "Level:": "Level:", "No display name": "Kein Anzeigename", @@ -961,7 +960,7 @@ "Would you like to accept or decline this invitation?": "Möchtest du diese Einladung akzeptieren oder ablehnen?", "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 +973,15 @@ "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 to start a chat with someone": "Klicke auf um einen Chat mit jemanden zu starten", + "You're not in any rooms yet! Press to make a room or to browse the directory": "Du bist bisher in keinem Raum! Klicke auf um einen Raum zu erstellen oder um das Verzeichnis zu durchsuchen", + "To return to your account in future you need to set a password": "Um in Zukunft zu deinem Konto zurückzukehren, musst du ein Passwort setzen", + "Skip": "Überspringen", + "Start verification": "Verifikation starten", + "Share without verifying": "Teile ohne Verifizierung", + "Ignore request": "Anfrage ignorieren", + "You added a new device '%(displayName)s', which is requesting encryption keys.": "Du hast das neue Gerät '%(displayName)s' hinzugefügt, welches nun Verschlüsselungs-Schlüssel anfragt.", + "Encryption key request": "Verschlüsselungs-Schlüssel-Anfrage", + "Your unverified device '%(displayName)s' is requesting encryption keys.": "Dein nicht verifiziertes Gerät '%(displayName)s' fragt nach Verschlüsselungs-Schlüsseln." } diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index eb25cd9e16..f776d50ee3 100644 --- a/src/i18n/strings/el.json +++ b/src/i18n/strings/el.json @@ -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:", @@ -861,7 +861,6 @@ "since the point in time of selecting this option": "από το χρονικό σημείο επιλογής αυτής της ρύθμισης", "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Το κλειδί υπογραφής που δώσατε αντιστοιχεί στο κλειδί υπογραφής που λάβατε από τη συσκευή %(userId)s %(deviceId)s. Η συσκευή έχει επισημανθεί ως επιβεβαιωμένη.", "To link to a room it must have an address.": "Για να συνδεθείτε σε ένα δωμάτιο πρέπει να έχετε μια διεύθυνση.", - "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.": "Πρέπει να συνδεθείτε ξανά για να δημιουργήσετε τα κλειδιά κρυπτογράφησης από άκρο σε άκρο για αυτήν τη συσκευή και να υποβάλετε το δημόσιο κλειδί στον διακομιστή σας. Αυτό θα χρειαστεί να γίνει μόνο μια φορά.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Η διεύθυνση ηλεκτρονικής αλληλογραφίας σας δεν φαίνεται να συσχετίζεται με Matrix ID σε αυτόν τον διακομιστή.", "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Ο κωδικός πρόσβασής σας άλλαξε επιτυχώς. Δεν θα λάβετε ειδοποιήσεις push σε άλλες συσκευές μέχρι να συνδεθείτε ξανά σε αυτές", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Δεν θα μπορέσετε να αναιρέσετε αυτήν την αλλαγή καθώς προωθείτε τον χρήστη να έχει το ίδιο επίπεδο δύναμης με τον εαυτό σας.", @@ -914,5 +913,15 @@ "were unbanned %(repeats)s times": "ξεμπλοκαρίστηκαν %(repeats)s φορές", "was unbanned %(repeats)s times": "ξεμπλοκαρίστηκε %(repeats)s φορές", "were unbanned": "ξεμπλοκαρίστηκαν", - "was unbanned": "ξεμπλοκαρίστηκε" + "was unbanned": "ξεμπλοκαρίστηκε", + "Press to start a chat with someone": "Πατήστε για να ξεκινήσετε μια συνομιλία", + "You're not in any rooms yet! Press to make a room or to browse the directory": "Δεν είστε σε κανένα δωμάτιο! Πατήστε για να δημιουργήσετε ένα δωμάτιο ή για να δείτε το ευρετήριο", + "To return to your account in future you need to set a password": "Για να επιστρέψετε στον λογαριασμό σας μελλοντικα πρέπει να ορίσετε έναν κωδικό πρόσβασης", + "Skip": "Παράβλεψη", + "Start verification": "Έναρξη επιβεβαίωσης", + "Share without verifying": "Κοινή χρήση χωρίς επιβεβαίωση", + "Ignore request": "Παράβλεψη αιτήματος", + "You added a new device '%(displayName)s', which is requesting encryption keys.": "Έχετε προσθέσει μια νέα συσκευή '%(displayName)s', η οποία ζητά κλειδιά κρυπτογράφησης.", + "Your unverified device '%(displayName)s' is requesting encryption keys.": "Η ανεπιβεβαίωτη συσκευή σας '%(displayName)s' ζητά κλειδιά κρυπτογράφησης.", + "Encryption key request": "Αίτημα κλειδιού κρυπτογράφησης" } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index ad00ea9275..a4dcb2873f 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -440,6 +440,7 @@ "Please Register": "Please Register", "Power level must be positive integer.": "Power level must be positive integer.", "Press": "Press", + "Press to start a chat with someone": "Press 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 accept or decline this invitation?": "Would you like to accept or decline 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 to make a room or to browse the directory": "You're not in any rooms yet! Press to make a room or 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.", @@ -667,7 +668,6 @@ "You need to be able to invite users to do that.": "You need to be able to invite users to do that.", "You need to be logged in.": "You need to be logged in.", "You need to enter a user name.": "You need to enter a user name.", - "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.": "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.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Your email address does not appear to be associated with a Matrix ID on this Homeserver.", "Your password has been reset": "Your password has been reset", "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them", @@ -894,6 +894,8 @@ "Online": "Online", "Idle": "Idle", "Offline": "Offline", + "Updates": "Updates", + "Check for update": "Check for update", "Start chatting": "Start chatting", "Start Chatting": "Start Chatting", "Click on the button below to start chatting!": "Click on the button below to start chatting!", @@ -910,5 +912,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" } diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json index c3df1f90a6..e060add84f 100644 --- a/src/i18n/strings/en_US.json +++ b/src/i18n/strings/en_US.json @@ -601,7 +601,6 @@ "You need to be able to invite users to do that.": "You need to be able to invite users to do that.", "You need to be logged in.": "You need to be logged in.", "You need to enter a user name.": "You need to enter a user name.", - "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.": "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 one-off; sorry for the inconvenience.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Your email address does not appear to be associated with a Matrix ID on this Homeserver.", "Your password has been reset": "Your password has been reset", "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them", @@ -913,5 +912,11 @@ "Username not available": "Username not available", "Something went wrong!": "Something went wrong!", "This will be your account name on the homeserver, or you can pick a different server.": "This will be your account name on the homeserver, or you can pick a different server.", - "If you already have a Matrix account you can log in instead.": "If you already have a Matrix account you can log in instead." + "If you already have a Matrix account you can log in instead.": "If you already have a Matrix account you can log in 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." } diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/i18n/strings/eo.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 5f20f8113e..f7506b946d 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -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 homeserver's SSL certificate 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 certificado SSL del servidor es de confiaza, y compruebe que no hay extensiones del navegador bloqueando las peticiones.", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s 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 voice or video.": "Conecte con voz o vídeo.", + "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 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, click here to send a bug report.": "También puede pulsar aquí 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 an address.": "Para enlazar una sala, debe tener una dirección.", + "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" } diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 0d33ad711f..3c86349cfb 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -134,17 +134,17 @@ "Email Address": "Adresse e-mail", "Email, name or matrix ID": "E-mail, nom ou identifiant Matrix", "Emoji": "Emoticône", - "Enable encryption": "Activer l'encryption", - "Encrypted messages will not be visible on clients that do not yet implement encryption": "Les messages encryptés ne seront pas visibles dans les clients qui n’implémentent pas encore l’encryption", - "Encrypted room": "Salon encrypté", + "Enable encryption": "Activer le chiffrement", + "Encrypted messages will not be visible on clients that do not yet implement encryption": "Les messages chiffrés ne seront pas visibles dans les clients qui n’implémentent pas encore le chiffrement", + "Encrypted room": "Salon chiffré", "%(senderName)s ended the call.": "%(senderName)s a terminé l’appel.", - "End-to-end encryption information": "Information sur l'encryption bout-en-bout", - "End-to-end encryption is in beta and may not be reliable": "L’encryption bout-en-bout est en bêta et risque de ne pas être fiable", + "End-to-end encryption information": "Information sur le chiffrement bout-en-bout", + "End-to-end encryption is in beta and may not be reliable": "Le chiffrement de bout-en-bout est en bêta et risque de ne pas être fiable", "Enter Code": "Entrer le code", "Error": "Erreur", "Event information": "Information de l'événement", "Existing Call": "Appel en cours", - "Export E2E room keys": "Exporter les clés d'encryption du salon", + "Export E2E room keys": "Exporter les clés de chiffrement du salon", "Failed to ban user": "Échec lors du bannissement de l'utilisateur", "Failed to change password. Is your password correct?": "Échec du changement de mot de passe. Votre mot de passe est-il correct ?", "Failed to change power level": "Échec du changement de niveau d'autorité", @@ -234,7 +234,7 @@ "Commands": "Commandes", "Conference call failed.": "Échec de la conférence.", "Conference calling is in development and may not be reliable.": "Les appels en conférence sont encore en développement et sont potentiellement peu fiables.", - "Conference calls are not supported in encrypted rooms": "Les appels en conférence ne sont pas supportés dans les salons encryptés", + "Conference calls are not supported in encrypted rooms": "Les appels en conférence ne sont pas supportés dans les salons chiffrés", "Conference calls are not supported in this client": "Les appels en conférence ne sont pas supportés avec ce client", "Confirm password": "Confirmer le mot de passe", "Confirm your new password": "Confirmer votre nouveau mot de passe", @@ -242,21 +242,21 @@ "Could not connect to the integration server": "Impossible de se connecter au serveur d'intégration", "Create an account": "Créer un compte", "Create Room": "Créer un salon", - "Cryptography": "Encryption", + "Cryptography": "Chiffrement", "Current password": "Mot de passe actuel", "Curve25519 identity key": "Clé d’identité Curve25519", "/ddg is not a command": "/ddg n'est pas une commande", "Deactivate Account": "Supprimer le compte", "Deactivate my account": "Supprimer mon compte", "decline": "décliner", - "Decrypt %(text)s": "Décrypter %(text)s", - "Decryption error": "Erreur de décryptage", + "Decrypt %(text)s": "Déchiffrer %(text)s", + "Decryption error": "Erreur de déchiffrement", "Delete": "Supprimer", "demote": "rétrograder", "Deops user with given id": "Retire les privilèges d’opérateur d’un utilisateur avec un ID donné", "Device ID": "Identifiant de l'appareil", "Devices": "Appareils", - "Devices will not yet be able to decrypt history from before they joined the room": "Les appareils ne seront pas capables de décrypter l’historique précédant leur adhésion au salon", + "Devices will not yet be able to decrypt history from before they joined the room": "Les appareils ne seront pas capables de déchiffrer l’historique précédant leur adhésion au salon", "ml": "Malayalam", "Failed to join room": "Échec lors de l’adhésion au salon", "Failed to kick": "Échec lors de l'expulsion", @@ -302,7 +302,7 @@ "Homeserver is": "Le homeserver est", "Identity Server is": "Le serveur d'identité est", "I have verified my email address": "J’ai vérifié mon adresse e-mail", - "Import E2E room keys": "Importer les clés d’encryption bout-en-bout", + "Import E2E room keys": "Importer les clés de chiffrement de bout-en-bout", "Incorrect verification code": "Code de vérification incorrect", "Interface Language": "Langue de l'interface", "Invalid alias format": "Format de l'alias invalide", @@ -351,9 +351,9 @@ "Must be viewing a room": "Doit être en train de visualiser un salon", "my Matrix ID": "mon identifiant Matrix", "Name": "Nom", - "Never send encrypted messages to unverified devices from this device": "Ne jamais envoyer de message encryptés aux appareils non-vérifiés depuis cet appareil", - "Never send encrypted messages to unverified devices in this room": "Ne jamais envoyer de message encryptés aux appareils non-vérifiés dans ce salon", - "Never send encrypted messages to unverified devices in this room from this device": "Ne jamais envoyer de message encryptés aux appareils non-vérifiés dans ce salon depuis cet appareil", + "Never send encrypted messages to unverified devices from this device": "Ne jamais envoyer de message chiffré aux appareils non-vérifiés depuis cet appareil", + "Never send encrypted messages to unverified devices in this room": "Ne jamais envoyer de message chiffré aux appareils non-vérifiés dans ce salon", + "Never send encrypted messages to unverified devices in this room from this device": "Ne jamais envoyer de message chiffré aux appareils non-vérifiés dans ce salon depuis cet appareil", "New address (e.g. #foo:%(localDomain)s)": "Nouvelle adresse (par ex. #foo:%(localDomain)s)", "New Composer & Autocomplete": "Nouveau compositeur & Autocomplétion", "New password": "Nouveau mot de passe", @@ -365,7 +365,7 @@ "(not supported by this browser)": "(non supporté par cet explorateur)", "": "", "NOT verified": "NON vérifié", - "No devices with registered encryption keys": "Pas d’appareil avec des clés d’encryption enregistrées", + "No devices with registered encryption keys": "Pas d’appareil avec des clés de chiffrement enregistrées", "No more results": "Fin des résultats", "No results": "Pas de résultats", "unknown error code": "Code erreur inconnu", @@ -380,12 +380,12 @@ "Phone": "Numéro de téléphone", "Operation failed": "L'opération a échoué", "Bulk Options": "Options de masse", - "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.": "Changer le mot de passe actuellement réinitialise les clés d’encryption sur tous les appareils, rendant l’historique encrypté illisible, à moins d’exporter les clés du salon en avance de phase puis de les ré-importer. Ceci sera amélioré prochainement.", + "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.": "Changer le mot de passe actuellement réinitialise les clés de chiffrement sur tous les appareils, rendant l’historique chiffré illisible, à moins d’exporter les clés du salon en avance de phase puis de les ré-importer. Ceci sera amélioré prochainement.", "Default": "Défaut", "Email address": "Adresse e-mail", "Error decrypting attachment": "Erreur lors du déchiffrement de la pièce jointe", "Failed to set avatar.": "Erreur lors de la définition de la photo de profil.", - "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.": "Par sécurité une déconnexion supprimera toutes les clés d’encryption de ce navigateur. Si vous voulez être capable de décrypter l’historique de votre conversation lors de sessions futures de Riot, merci d’exporter les clés pour le salon.", + "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.": "Par sécurité une déconnexion supprimera toutes les clés de chiffrement de ce navigateur. Si vous voulez être capable de déchiffrer l’historique de votre conversation lors de sessions futures de Riot, merci d’exporter les clés pour le salon.", "Guests can't set avatars. Please register.": "Les visiteurs ne peuvent définir de photo de profil. Merci de vous enregistrer.", "Guests can't use labs features. Please register.": "Les visiteurs ne peuvent utiliser les fonctionalités du laboratoire. Merci de vous enregistrer.", "Guests cannot join this room even if explicitly invited.": "Les visiteurs ne peuvent rejoindre ce salon, même si explicitement invités.", @@ -413,7 +413,7 @@ "Remove %(threePid)s?": "Supprimer %(threePid)s ?", "%(senderName)s requested a VoIP conference.": "%(senderName)s a demandé une conférence audio.", "Report it": "Le rapporter", - "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.": "Réinitialiser le mot de passe va réinitialiser les clés d’encryption sur tous les appareils, rendant l’historique encrypté illisible, à moins que vous ayez exporté les clés du salon en avance de phase puis que vous les ayez ré-importées. Cela sera amélioré prochainement.", + "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.": "Réinitialiser le mot de passe va réinitialiser les clés de chiffrement sur tous les appareils, rendant l’historique chiffré illisible, à moins que vous ayez exporté les clés du salon en avance de phase puis que vous les ayez ré-importées. Cela sera amélioré prochainement.", "restore": "restorer", "Return to app": "Retourner à l’application", "Return to login screen": "Retourner à l’écran d’identification", @@ -429,8 +429,8 @@ "Search": "Rechercher", "Search failed": "Erreur lors de la recherche", "Searches DuckDuckGo for results": "Recherche des résultats dans DuckDuckGo", - "Send a message (unencrypted)": "Envoyer un message (non-encrypté)", - "Send an encrypted message": "Envoyer un message non-encrypté", + "Send a message (unencrypted)": "Envoyer un message (non-chiffré)", + "Send an encrypted message": "Envoyer un message non chiffré", "Sender device information": "Information de l'appareil de l'expéditeur", "Send Invites": "Envoyer les invitations", "Send Reset Email": "Envoyer l'e-mail de réinitialisation", @@ -508,7 +508,7 @@ "Tried to load a specific point in this room's timeline, but was unable to find it.": "Un instant donné de la chronologie n’a pu être chargé car il n’a pas pu être trouvé.", "Turn Markdown off": "Désactiver le formatage ’Markdown’", "Turn Markdown on": "Activer le formatage ’Markdown’", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s a activé l’encryption bout-en-bout (algorithme %(algorithm)s).", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s a activé le chiffrement de bout-en-bout (algorithme %(algorithm)s).", "Unable to add email address": "Impossible d'ajouter l'adresse e-mail", "Unable to remove contact information": "Impossible de supprimer les informations du contact", "Unable to restore previous session": "Impossible de rétablir la session précédente", @@ -518,8 +518,8 @@ "Unable to capture screen": "Impossible de capturer l'écran", "Unable to enable Notifications": "Impossible d'activer les notifications", "Unable to load device list": "Impossible de charger la liste d'appareils", - "Unencrypted room": "Salon non-encrypté", - "unencrypted": "non-encrypté", + "Unencrypted room": "Salon non chiffré", + "unencrypted": "non chiffré", "Unknown command": "Commande inconnue", "unknown device": "appareil inconnu", "Unknown room %(roomId)s": "Salon inconnu %(roomId)s", @@ -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", @@ -566,7 +566,7 @@ "You need to be able to invite users to do that.": "Vous devez être capable d’inviter des utilisateurs pour faire ça.", "You need to be logged in.": "Vous devez être connecté.", "You need to enter a user name.": "Vous devez entrer un nom d’utilisateur.", - "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.": "Vous devez vous connecter à nouveau pour générer les clés d’encryption pour cet appareil, et soumettre la clé publique à votre homeserver. Cette action ne se reproduira pas ; veuillez nous excuser pour la gêne occasionnée.", + "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.": "Vous devez vous connecter à nouveau pour générer les clés de chiffrement pour cet appareil, et soumettre la clé publique à votre homeserver. Cette action ne se reproduira pas ; veuillez nous excuser pour la gêne occasionnée.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Votre adresse e-mail ne semble pas associée à un identifiant Matrix sur ce homeserver.", "Your password has been reset": "Votre mot de passe a été réinitialisé", "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Votre mot de passe a été mis à jour avec succès. Vous ne recevrez plus de notification sur vos appareils jusqu’à ce que vous vous identifiez à nouveau", @@ -613,7 +613,7 @@ "Make Moderator": "Nommer modérateur", "Make this room private": "Rendre ce salon privé", "Share message history with new users": "Partager l’historique des messages avec les nouveaux utilisateurs", - "Encrypt room": "Encrypter le salon", + "Encrypt room": "Chiffrer le salon", "There are no visible files in this room": "Il n'y a pas de fichier visible dans ce salon", "Room": "Salon", "Connectivity to the server has been lost.": "La connectivité au serveur a été perdue.", @@ -685,10 +685,10 @@ "Confirm passphrase": "Confirmer la phrase secrète", "Import room keys": "Importer les clés du salon", "File to import": "Fichier à importer", - "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Ce processus vous permet d’exporter dans un fichier local les clés pour les messages que vous avez reçus dans des salons encryptés. Il sera ensuite possible d’importer ce fichier dans un autre client Matrix, afin de permettre à ce client de pouvoir décrypter ces messages.", - "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Le fichier exporté permettra à tout ceux qui peuvent le lire de décrypter tous les messages encrypté auxquels vous avez accès, vous devez donc être vigilant et le stocker dans un endroit sûr. Afin de protéger ce fichier, entrez ci-dessous une phrase secrète qui sera utilisée pour encrypter les données exportées. Seule l’utilisation de la même phrase secrète permettra de décrypter et importer les données.", - "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Ce processus vous permet d’importer les clés d’encryption que vous avez précédemment exportées depuis un autre client Matrix. Vous serez alors capable de décrypter n’importe quel messages que l’autre client peut décrypter.", - "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Le fichier exporté est protégé par une phrase secrète. Vous devez entrer cette phrase secrète ici pour décrypter le fichier.", + "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Ce processus vous permet d’exporter dans un fichier local les clés pour les messages que vous avez reçus dans des salons chiffrés. Il sera ensuite possible d’importer ce fichier dans un autre client Matrix, afin de permettre à ce client de pouvoir déchiffrer ces messages.", + "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Le fichier exporté permettra à tout ceux qui peuvent le lire de déchiffrer tous les messages chiffrés auxquels vous avez accès, vous devez donc être vigilant et le stocker dans un endroit sûr. Afin de protéger ce fichier, entrez ci-dessous une phrase secrète qui sera utilisée pour chiffrer les données exportées. Seule l’utilisation de la même phrase secrète permettra de déchiffrer et importer les données.", + "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Ce processus vous permet d’importer les clés de chiffrement que vous avez précédemment exportées depuis un autre client Matrix. Vous serez alors capable de déchiffrer n’importe quel messages que l’autre client peut déchiffer.", + "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Le fichier exporté est protégé par une phrase secrète. Vous devez entrer cette phrase secrète ici pour déchiffrer le fichier.", "You must join the room to see its files": "Vous devez joindre le salon pour voir ses fichiers", "Reject all %(invitedRooms)s invites": "Rejeter la totalité des %(invitedRooms)s invitations", "Start new chat": "Démarrer une nouvelle conversation", @@ -710,7 +710,7 @@ "In future this verification process will be more sophisticated.": "À l’avenir ce processus de vérification sera simplifié et plus sophistiqué.", "Verify device": "Vérifier cet appareil", "I verify that the keys match": "J’ai vérifié que les clés correspondaient", - "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Nous avons rencontré une erreur en essayant de rétablir votre session précédente. Si vous continuez, vous devrez vous identifier à nouveau et l’historique encrypté de vos conversations sera illisible.", + "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Nous avons rencontré une erreur en essayant de rétablir votre session précédente. Si vous continuez, vous devrez vous identifier à nouveau et l’historique chiffré de vos conversations sera illisible.", "Unable to restore session": "Impossible de restaurer la session", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Si vous avez utilisé une version plus récente de Riot précédemment, votre session risque d’être incompatible avec cette version. Fermez cette fenêtre et retournez à la version plus récente.", "Continue anyway": "Continuer quand même", @@ -745,11 +745,11 @@ "Home server URL": "URL du homeserver", "Identity server URL": "URL du serveur d’identité", "What does this mean?": "Qu’est ce que cela signifie ?", - "Error decrypting audio": "Erreur lors de la décryption de l’audio", - "Error decrypting image": "Erreur lors de la décryption de l’image", + "Error decrypting audio": "Erreur lors du déchiffrement de l’audio", + "Error decrypting image": "Erreur lors du déchiffrement de l’image", "Image '%(Body)s' cannot be displayed.": "L'image '%(Body)s' ne peut être affichée.", "This image cannot be displayed.": "Cette image ne peut être affichée.", - "Error decrypting video": "Erreur lors de la décryption de la vidéo", + "Error decrypting video": "Erreur lors du déchiffrement de la vidéo", "Add an Integration": "Ajouter une intégration", "URL Previews": "Aperçus d'URL", "Disable URL previews by default for participants in this room": "Désactiver les aperçus d'URL par défaut pour les participants de ce salon", @@ -884,8 +884,8 @@ "This invitation was sent to an email address which is not associated with this account:": "Cette invitation a été envoyée à une adresse e-mail qui n'est pas associée avec ce compte :", "This room": "Ce salon", "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Impossible de vérifier que l'adresse à qui cette invitation a été envoyée correspond à celle associée à votre compte.", - "Undecryptable": "Indécryptable", - "Unencrypted message": "Message non-encrypté", + "Undecryptable": "Indéchiffrable", + "Unencrypted message": "Message non chiffré", "unknown caller": "appelant inconnu", "Unnamed Room": "Salon sans nom", "Unverified": "Non verifié", @@ -900,10 +900,10 @@ "(~%(count)s results).one": "(~%(count)s résultat)", "(~%(count)s results).other": "(~%(count)s résultats)", "Device Name": "Nom de l'appareil", - "Encrypted by a verified device": "Encrypté par un appareil verifié", - "Encrypted by an unverified device": "Encrypté par un appareil non verifié", - "Encryption is enabled in this room": "L'encryption est activée sur ce salon", - "Encryption is not enabled in this room": "L'encryption n'est pas activée sur ce salon", + "Encrypted by a verified device": "Chiffré par un appareil verifié", + "Encrypted by an unverified device": "Chiffré par un appareil non verifié", + "Encryption is enabled in this room": "Le chiffrement est activée sur ce salon", + "Encryption is not enabled in this room": "Le chiffrement n'est pas activée sur ce salon", "Home": "Accueil", "To link to a room it must have an address.": "Pour récupérer le lien vers un salon celui-ci doit avoir une adresse.", "Upload new:": "Télécharger un nouveau :", @@ -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 to start a chat with someone": "Cliquez sur pour entamer une discussion avec quelqu'un", + "You're not in any rooms yet! Press to make a room or to browse the directory": "Vous n'avez pas encore rejoint de salle ! Cliquez sur pour créer une salle ou sur pour explorer l'annuaire" } diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index c6a86347f5..92cc8b66ff 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -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,739 @@ "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 homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Nem lehet kapcsolódni az egyedi szerverhez - ellenőrizd a kapcsolatot, biztosítsd, hogy a egyedi szerver tanúsítványa 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 enable unsafe scripts.": "Nem lehet csatlakozni az egyedi szerverhez HTTP-n keresztül ha HTTPS van a böngésző címsorában. Vagy használj HTTPS-t vagy engedélyezd a nem biztonságos script-et.", + "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", + "Click here to join the discussion!": "A beszélgetéshez való csatlakozáshoz kattints ide!", + "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 az egyedi 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 az egydi 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": "Egyedi 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 voice or video.": "Csatlakozás hanggal vagy videó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": "Kirúg", + "Kicks user with given id": "Az adott azonosítójú felhasználó kirúgá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 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, click here to send a bug report.": "Különben hiba jelentés küldéséhez kattints ide.", + "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 az egyedi 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 to start a chat with someone": "Nyomd meg a 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": "Ebben a szobában", + "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 an address.": "Szobához való kötéshez szükséges egy cím.", + "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 accept or decline this invitation?": "Ezt a meghívót szeretnéd elfogadni vagy elutasítani?", + "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 to make a room or to browse the directory": "Még egyetlen szobába sem léptél be! Szoba létrehozáshoz nyomd meg: vagy a szobák közötti kereséshez nyomd meg: ", + "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 disabled URL previews by default.": "Az URL előnézet alapból tiltva van.", + "You have enabled URL previews by default.": "Az URL előnézet alapból engedélyezve 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 register to use this functionality": "Regisztrálnod kell 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.", + "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", + "to demote": "a hozzáférési szint csökkentéséhez", + "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "A címről amire a meghívót elküldtük nem állapítható meg, hogy a fiókoddal összeköttetésben áll-e.", + "You seem to be in a call, are you sure you want to quit?": "Úgy tűnik hívásban vagy, biztosan kilépsz?", + "You seem to be uploading files, are you sure you want to quit?": "Úgy tűnik fájlokat töltesz fel, biztosan kilépsz?", + "You should not yet trust it to secure data": "Még ne bízz meg a titkosításban", + "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Nem leszel képes visszavonni ezt a változtatást mivel a felhasználót ugyanarra a szintre emeled amin te vagy.", + "Your home server does not support device management.": "Az egyedi szervered nem támogatja az eszközök kezelését.", + "Sun": "Vas", + "Mon": "Hé", + "Tue": "K", + "Wed": "Sze", + "Thu": "Csüt", + "Fri": "Pé", + "Sat": "Szo", + "Jan": "Jan", + "Feb": "Feb", + "Mar": "Már", + "Apr": "Ápr", + "May": "Máj", + "Jun": "Jún", + "Jul": "Júl", + "Aug": "Aug", + "Sep": "Szept", + "Oct": "Okt", + "Nov": "Nov", + "Dec": "Dec", + "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s", + "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", + "Set a display name:": "Megjelenítési név beállítása:", + "Set a Display Name": "Megjelenítési név beállítása", + "Upload an avatar:": "Avatar kép feltöltése:", + "This server does not support authentication with a phone number.": "Ez a szerver nem támogatja a telefonszámmal való azonosítást.", + "Missing password.": "Hiányzó jelszó.", + "Passwords don't match.": "A jelszavak nem egyeznek meg.", + "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "A jelszó túl rövid (min. %(MIN_PASSWORD_LENGTH)s).", + "This doesn't look like a valid email address.": "Ez nem tűnik érvényes e-mail címnek.", + "This doesn't look like a valid phone number.": "Ez nem tűnik érvényes telefonszámnak.", + "User names may only contain letters, numbers, dots, hyphens and underscores.": "A felhasználói név csak betűket, számokat, pontokat, kötőjeleket és aláhúzás jeleket tartalmazhat.", + "An unknown error occurred.": "Ismeretlen hiba történt.", + "I already have an account": "Már van fiókom", + "An error occurred: %(error_string)s": "Hiba történt: %(error_string)s", + "Topic": "Téma", + "Make Moderator": "Legyen moderátor", + "Make this room private": "Ez a szoba legyen privát", + "Share message history with new users": "Régi üzenetek megosztása új felhasználókkal", + "Encrypt room": "Szoba titkosítása", + "There are no visible files in this room": "Ebben a szobában láthatólag nincsenek fájlok", + "Room": "Szoba", + "Connectivity to the server has been lost.": "A szerverrel a kapcsolat megszakadt.", + "Sent messages will be stored until your connection has returned.": "Az elküldött üzenetek addig lesznek tárolva amíg a kapcsolatod újra elérhető lesz.", + "Auto-complete": "Automatikus kiegészítés", + "Resend all or cancel all now. You can also select individual messages to resend or cancel.": "Most újraküldöd mind vagy eldobod mind. Újraküldésre vagy eldobásra egyenként is kiválaszthatod az üzeneteket.", + "(~%(count)s results).one": "(~%(count)s db eredmény)", + "(~%(count)s results).other": "(~%(count)s db eredmény)", + "or": "vagy", + "Active call": "Folyamatban lévő hívás", + "bold": "félkövér", + "italic": "dőlt", + "strike": "áthúzott", + "underline": "aláhúzott", + "code": "kód", + "quote": "idézet", + "bullet": "lista", + "numbullet": "számozott lista", + "%(severalUsers)sjoined %(repeats)s times": "%(severalUsers)s %(repeats)s alkalommal lépett be", + "%(oneUser)sjoined %(repeats)s times": "%(oneUser)s %(repeats)s alkalommal lépett be", + "%(severalUsers)sjoined": "%(severalUsers)s csatlakozott", + "%(oneUser)sjoined": "%(oneUser)s csatlakozott", + "%(severalUsers)sleft %(repeats)s times": "%(severalUsers)s %(repeats)s alkalommal lépett ki", + "%(oneUser)sleft %(repeats)s times": "%(oneUser)s %(repeats)s alkalommal lépett ki", + "%(severalUsers)sleft": "%(severalUsers)s kilépett", + "%(oneUser)sleft": "%(oneUser)s kilépett", + "%(severalUsers)sjoined and left %(repeats)s times": "%(severalUsers)s %(repeats)s alkalommal lépett be és ki", + "%(oneUser)sjoined and left %(repeats)s times": "%(oneUser)s %(repeats)s alkalommal lépett be és ki", + "%(severalUsers)sjoined and left": "%(severalUsers)s be-, és kilépett", + "%(oneUser)sjoined and left": "%(oneUser)s be-, és kilépett", + "%(severalUsers)sleft and rejoined %(repeats)s times": "%(severalUsers)s %(repeats)s alkalommal ki-, és belépett", + "%(oneUser)sleft and rejoined %(repeats)s times": "%(oneUser)s %(repeats)s alkalommal ki-, és belépett", + "%(severalUsers)sleft and rejoined": "%(severalUsers)s ki-, és belépett", + "%(oneUser)sleft and rejoined": "%(oneUser)s ki-, és belépett", + "%(severalUsers)srejected their invitations %(repeats)s times": "%(severalUsers)s %(repeats)s alkalommal utasította el a meghívót", + "%(oneUser)srejected their invitation %(repeats)s times": "%(oneUser)s %(repeats)s alkalommal utasította el a meghívót", + "%(severalUsers)srejected their invitations": "%(severalUsers)s elutasította a meghívót", + "%(oneUser)srejected their invitation": "%(oneUser)s elutasította a meghívót", + "%(severalUsers)shad their invitations withdrawn %(repeats)s times": "%(severalUsers)s %(repeats)s alkalommal visszavonta a meghívókat", + "%(oneUser)shad their invitation withdrawn %(repeats)s times": "%(oneUser)s %(repeats)s alkalommal visszavonta a meghívót", + "%(severalUsers)shad their invitations withdrawn": "%(severalUsers)s visszavonták a meghívókat", + "%(oneUser)shad their invitation withdrawn": "%(oneUser)s visszavonta a meghívót", + "were invited %(repeats)s times": "%(repeats)s alkalommal lettek meghívva", + "was invited %(repeats)s times": "%(repeats)s alkalommal lett meghívva", + "were invited": "lettek meghívva", + "was invited": "lett meghívva", + "were banned %(repeats)s times": "%(repeats)s alkalommal lettek kitiltva", + "was banned %(repeats)s times": "%(repeats)s alkalommal lett kitiltva", + "were banned": "lettek kitiltva", + "was banned": "lett kitiltva", + "were unbanned %(repeats)s times": "%(repeats)s alkalommal lettek visszaengedve", + "was unbanned %(repeats)s times": "%(repeats)s alkalommal lett visszaengedve", + "were unbanned": "lettek visszaengedve", + "was unbanned": "lett visszaengedve", + "were kicked %(repeats)s times": "%(repeats)s alkalommal lettek kirúgva", + "was kicked %(repeats)s times": "%(repeats)s alkalommal lett kirúgva", + "were kicked": "lettek kirúgva", + "was kicked": "lett kirúgva", + "%(severalUsers)schanged their name %(repeats)s times": "%(severalUsers)s %(repeats)s alkalommal változtatták meg a nevüket", + "%(oneUser)schanged their name %(repeats)s times": "%(oneUser)s %(repeats)s alkalommal változtatta meg a nevét", + "%(severalUsers)schanged their name": "%(severalUsers)s változtatták meg a nevüket", + "%(oneUser)schanged their name": "%(oneUser)s megváltoztatta a nevét", + "%(severalUsers)schanged their avatar %(repeats)s times": "%(severalUsers)s %(repeats)s alkalommal változtatták meg az avatar képüket", + "%(oneUser)schanged their avatar %(repeats)s times": "%(oneUser)s %(repeats)s alkalommal változtatta meg az avatar képét", + "%(severalUsers)schanged their avatar": "%(severalUsers)s változtatták meg az avatar képüket", + "%(oneUser)schanged their avatar": "%(oneUser)s megváltoztatta az avatar képét", + "Please select the destination room for this message": "Kérlek add meg az üzenet cél szobáját", + "New Password": "Új jelszó", + "Start automatically after system login": "Rendszerindításkor automatikus elindítás", + "Desktop specific": "Asztali használatra jellemző", + "Analytics": "Analitika", + "Opt out of analytics": "Ne gyűjtsön analitikai adatokat", + "Options": "Opciók", + "Riot collects anonymous analytics to allow us to improve the application.": "Riot személytelen analitikai adatokat gyűjt annak érdekében, hogy fejleszteni tudjuk az alkalmazást.", + "Passphrases must match": "A jelmondatoknak meg kell egyezniük", + "Passphrase must not be empty": "A jelmondat nem lehet üres", + "Export room keys": "Szoba kulcsok mentése", + "Confirm passphrase": "Jelmondat megerősítése", + "Import room keys": "Szoba kulcsok betöltése", + "File to import": "Fájl betöltése", + "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "A kimentett fájl jelmondattal van védve. A kibontáshoz add meg a jelmondatot.", + "You must join the room to see its files": "Ahhoz hogy lásd a fájlokat be kell lépned a szobába", + "Reject all %(invitedRooms)s invites": "Minden %(invitedRooms)s meghívó elutasítása", + "Start new chat": "Új csevegés indítása", + "Guest users can't invite users. Please register.": "Vendég felhasználók nem tudnak másokat meghívni. Kérlek regisztrálj.", + "Failed to invite": "Meghívás sikertelen", + "Failed to invite user": "Felhasználó meghívása sikertelen", + "Failed to invite the following users to the %(roomName)s room:": "Az alábbi felhasználókat nem sikerült meghívni a(z) %(roomName)s szobába:", + "Confirm Removal": "Törlés megerősítése", + "Unknown error": "Ismeretlen hiba", + "Incorrect password": "Helytelen jelszó", + "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "A fiókodat véglegesen használhatatlanná teszi. Ez után ugyanazzal az azonosítóval már nem fogsz tudni vissza regisztrálni.", + "This action is irreversible.": "Ez a művelet visszafordíthatatlan.", + "To continue, please enter your password.": "A folytatáshoz, kérlek add meg a jelszavadat.", + "Device name": "Eszköz neve", + "Device Name": "Eszköz neve", + "Device key": "Eszköz kulcsa", + "In future this verification process will be more sophisticated.": "A jövőben ez az ellenőrzési folyamat egyszerűsödni fog.", + "Verify device": "Eszköz ellenőrzése", + "I verify that the keys match": "Megerősítem, hogy a kulcsok egyeznek", + "Unable to restore session": "A kapcsolatot nem lehet visszaállítani", + "Continue anyway": "Mindenképpen tovább", + "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" szobában olyan eszközök vannak amiket még nem láttál.", + "Unknown devices": "Ismeretlen eszköz", + "Unknown Address": "Ismeretlen cím", + "Unblacklist": "Tiltólistáról kivesz", + "Blacklist": "Tiltólistára", + "Unverify": "Azonosítás visszavonása", + "Verify...": "Ellenőrzés...", + "ex. @bob:example.com": "pl.: @bob:example.com", + "Add User": "Felhasználó hozzáadás", + "This Home Server would like to make sure you are not a robot": "Az egyedi szerver meg szeretne győződni arról, hogy nem vagy robot", + "Sign in with CAS": "Belépés CAS-sal", + "Please check your email to continue registration.": "Ellenőrizd az e-mailedet a regisztráció folytatásához.", + "Token incorrect": "Helytelen token", + "A text message has been sent to": "A szöveg üzenetet elküldtük ide:", + "Please enter the code it contains:": "Add meg a benne lévő kódot:", + "You are registering with %(SelectedTeamName)s": "%(SelectedTeamName)s névvel regisztrálsz", + "Default server": "Alapértelmezett szerver", + "Custom server": "Egyedi szerver", + "Home server URL": "Egyedi szerver URL", + "Identity server URL": "Azonosítási szerver URL", + "What does this mean?": "Ez mit jelent?", + "Error decrypting audio": "Hiba a hang visszafejtésénél", + "Error decrypting image": "Hiba a kép visszafejtésénél", + "Image '%(Body)s' cannot be displayed.": "'%(Body)s' képet nem lehet megjeleníteni.", + "This image cannot be displayed.": "Ezt a képet nem lehet megjeleníteni.", + "Error decrypting video": "Hiba a videó visszafejtésénél", + "Add an Integration": "Integráció hozzáadása", + "Removed or unknown message type": "Eltávolított üzenet vagy ismeretlen üzenet típus", + "Disable URL previews by default for participants in this room": "URL előnézet alapértelmezett tiltása a szoba résztvevőinek", + "Disable URL previews for this room (affects only you)": "URL előnézet tiltása ebben a szobában (csak téged érint)", + "URL Previews": "URL előnézet", + "Enable URL previews for this room (affects only you)": "URL előnézet engedélyezése ebben a szobában (csak téged érint)", + "Drop file here to upload": "Feltöltéshez húzz ide egy fájlt", + " (unsupported)": " (nem támogatott)", + "Ongoing conference call%(supportedText)s.": "Folyamatban lévő konferencia hívás %(supportedText)s.", + "for %(amount)ss": "%(amount)s mperce", + "for %(amount)sm": "%(amount)s perce", + "for %(amount)sh": "%(amount)s órája", + "for %(amount)sd": "%(amount)s napja", + "Online": "Elérhető", + "Idle": "Várakozik", + "Offline": "Nem érhető el", + "Start chatting": "Csevegés indítása", + "Start Chatting": "Csevegés indítása", + "Click on the button below to start chatting!": "Csevegés indításához kattints a gombra alább!", + "$senderDisplayName changed the room avatar to ": "$senderDisplayName megváltoztatta a szoba avatar képét: ", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s törölte a szoba avatar képét.", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s megváltoztatta %(roomName)s szoba avatar képét", + "Username available": "Szabad felhasználói név", + "Username not available": "A felhasználói név foglalt", + "Something went wrong!": "Valami tönkrement!", + "If you already have a Matrix account you can log in instead.": "Ha már van Matrix fiókod akkor beléphetsz helyette.", + "Your browser does not support the required cryptography extensions": "A böngésződ nem támogatja a szükséges titkosítási kiterjesztést", + "Not a valid Riot keyfile": "Nem érvényes Riot kulcsfájl", + "Authentication check failed: incorrect password?": "Azonosítás sikertelen: hibás jelszó?", + "Do you want to set an email address?": "Meg szeretnéd adni az e-mail címet?", + "This will allow you to reset your password and receive notifications.": "Ezzel alaphelyzetbe tudod állítani a jelszavad és értesítéseket fogadhatsz.", + "Deops user with given id": "A megadott azonosítójú felhasználó lefokozása", + "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.": "A jelszó lecserélése megújítja a végponttól végpontig való titkosításhoz használt kulcsokat minden eszközön ezzel a titkosított szobák régi üzenetei olvashatatlanok lesznek hacsak nem mented el a kulcsokat és utána visszatöltöd. A jövőben ezen javítunk.", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "FIGYELEM: A KULCS ELLENŐRZÉS SIKERTELEN! A %(userId)s felhasználóhoz és %(deviceId)s eszközhöz tartozó \"%(fprint)s\" ujjlenyomat nem egyezik meg az ismert \"%(fingerprint)s\" ujjlenyomattal. Ez azt jelenti hogy a kapcsolatot lehallgathatják!", + "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Ezzel a folyamattal kimentheted a titkosított szobák üzeneteihez tartozó kulcsokat egy helyi fájlba. Ez után be tudod tölteni ezt a fájlt egy másik Matrix kliensbe, így az a kliens is vissza tudja fejteni az üzeneteket.", + "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "A kimentett fájlal bárki el tudja olvasni a titkosított üzeneteket amiket te is, ezért tartsd biztonságban. Ehhez segítségül írj be egy jelmondatot amivel a kimentett adatok titkosításra kerülnek. Az adatok betöltése csak a jelmondat megadásával lehetséges később.", + "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Ezzel a folyamattal lehetőséged van betölteni a titkosítási kulcsokat amiket egy másik Matrix kliensből mentettél ki. Ez után minden üzenetet vissza tudsz fejteni amit a másik kliens tudott.", + "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Biztos hogy eltávolítod (törlöd) ezt az eseményt? Figyelem, ha törlöd vagy megváltoztatod a szoba nevét vagy a témát ez a változtatás érvényét vesztheti.", + "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Az eszköz megbízhatóságának ellenőrzéséhez, lépj kapcsolatba a tulajdonossal valami más csatornán (pl. személyesen vagy telefon hívással) és kérdezd meg, hogy a kulcs amit a Felhasználói Beállításoknál látnak az eszközhöz megegyezik-e a kulccsal itt:", + "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Ha megegyezik, nyomd meg az megerősítő gombot alul. Ha nem akkor valaki más használja az eszközt és inkább a Feketelista gombot szeretnéd használni.", + "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Az előző kapcsolat visszaállításánál hibára akadtunk. Ha folytatod újra be kell jelentkezned és a titkosított csevegések olvashatatlanok lesznek.", + "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Ha egy újabb Riot verziót használtál valószínűleg ez kapcsolat nem lesz kompatibilis vele. Zárd be az ablakot és térj vissza az újabb verzióhoz.", + "Your display name is how you'll appear to others when you speak in rooms. What would you like it to be?": "A megjelenítési neved az ahogy a többiek látják amikor a szobában csevegsz. Mit szeretnél mi legyen?", + "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Jelenleg fekete listára teszel minden ismeretlen eszközt. Ha üzenetet szeretnél küldeni ezekre az eszközökre először ellenőrizned kell őket.", + "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Azt javasoljuk, hogy menj végig ellenőrző folyamaton minden eszköznél, hogy meg megerősítsd minden eszköz a jogos tulajdonosához tartozik, de újraküldheted az üzenetet ellenőrzés nélkül, ha úgy szeretnéd.", + "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Használhatod az egyedi szerver opciót hogy más Matrix szerverre csatlakozz egyedi szerver URL megadásával.", + "This allows you to use this app with an existing Matrix account on a different home server.": "Ezzel használhatod ezt az alkalmazást a meglévő Matrix fiókoddal és másik egyedi szerveren.", + "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Beállíthatsz egy egyedi azonosító szervert is de ez tulajdonképpen meggátolja az együttműködést e-mail címmel azonosított felhasználókkal.", + "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Ha nem állítasz be e-mail címet nem fogod tudni a jelszavadat alaphelyzetbe állítani. Biztos vagy benne?", + "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Azonosítás céljából egy harmadik félhez leszel irányítva (%(integrationsUrl)s). Folytatod?", + "URL previews are %(globalDisableUrlPreview)s by default for participants in this room.": "URL előnézet alapból %(globalDisableUrlPreview)s van a szoba résztvevői számára.", + "This will be your account name on the homeserver, or you can pick a different server.": "Ez lesz a felhasználói neved az egyedi szerveren, vagy választhatsz egy másik szervert.", + "Disable Peer-to-Peer for 1:1 calls": "Közvetlen kapcsolat tiltása az 1:1 hívásoknál", + "To return to your account in future you need to set a password": "Ahhoz hogy később visszatérj a fiókodba be kell állítanod egy jelszót", + "Skip": "Kihagy", + "Start verification": "Ellenőrzés megkezdése", + "Share without verifying": "Megosztás ellenőrzés nélkül", + "Ignore request": "Kérés figyelmen kívül hagyása", + "You added a new device '%(displayName)s', which is requesting encryption keys.": "Hozzáadtál egy új eszközt '%(displayName)s', ami titkosítási kulcsokat kér.", + "Your unverified device '%(displayName)s' is requesting encryption keys.": "Az ellenőrizetlen eszközöd '%(displayName)s' titkosítási kulcsokat kér.", + "Encryption key request": "Titkosítási kulcs kérés" } diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/i18n/strings/it.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json index 151acc7d3c..93cd72e8d9 100644 --- a/src/i18n/strings/ko.json +++ b/src/i18n/strings/ko.json @@ -177,7 +177,7 @@ "Autoplay GIFs and videos": "GIF와 동영상을 자동으로 재생하기", "Ban": "차단", "Banned users": "차단한 사용자", - "Blacklisted": "요주인물들", + "Blacklisted": "요주의", "Bug Report": "오류 보고", "Can't load user settings": "사용사 설정을 불러올 수 없어요", "Change Password": "비밀번호 바꾸기", @@ -461,7 +461,7 @@ "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "사용자를 자신과 같은 권한 등급으로 승급시키면 되돌릴 수 없어요.", "Press": "누르세요", "Privacy warning": "개인정보 경고", - "Private Chat": "은밀한 이야기", + "Private Chat": "비공개 이야기", "Privileged Users": "권한 있는 사용자", "Profile": "자기 소개", "%(senderName)s removed their profile picture.": "%(senderName)s님이 자기 소개 사진을 지우셨어요.", @@ -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,275 @@ "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 an address.": "방에 연결하려면 주소가 있어야 해요.", "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 accept or decline this invitation?": "초대를 받아들이거나 거절하시겠어요?", + "You already have existing direct chats with this user:": "이미 이 사용자와 직접 이야기하는 중이에요:", + "You are already in a call.": "이미 자신이 통화 중이네요.", + "You're not in any rooms yet! Press": "어떤 방에도 들어가 있지 않으세요! 누르세요", + "Press to start a chat with someone": "다른 사람과 이야기하려면 을 누르세요", + "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 to make a room or to browse the directory": "어떤 방에도 들어가 있지 않으세요! 을 눌러서 방을 만들거나 를 눌러 목록에서 방을 찾아보세요", + "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에서 추방하셨어요.", + "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "모든 장치에서 로그아웃되었고 더 이상 알림을 받지 않으실 거에요. 다시 알림을 받으시려면, 각 장치에 로그인해주세요", + "You have disabled URL previews by default.": "사이트 미리보기 쓰지 않기를 기본으로 하셨어요.", + "You have enabled URL previews by default.": "사이트 미리보기 쓰기를 기본으로 하셨어요.", + "You have entered an invalid contact. Try using their Matrix ID or email address.": "잘못된 연락처를 입력하셨어요. 매트릭스 ID나 이메일 주소를 써보세요.", + "You have no visible notifications": "보여드릴 알림이 없어요", + "You may wish to login with a different account, or add this email to this account.": "다른 계정으로 로그인하거나, 이 이메일을 이 계정에 추가할 수도 있어요.", + "you must be a": "해야해요", + "You must register to use this functionality": "이 기능을 쓰시려면 계정을 등록하셔야 해요", + "You need to be able to invite users to do that.": "그러려면 사용자를 초대하실 수 있어야 해요.", + "You need to be logged in.": "로그인하셔야 해요.", + "You need to enter a user name.": "사용자 이름을 입력하셔야 해요.", + "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.": "이 장치에 종단간 암호화 키를 만들고 공개 키를 홈 서버에 보내려면 다시 로그인해야해요. 한 번만 하시면 돼요. 불편을 드려 죄송합니다.", + "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "이메일 주소가 이 홈 서버의 매트릭스 ID와 관련이 없어요.", + "Your password has been reset": "비밀번호를 다시 설정했어요", + "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "비밀번호를 바꾸었어요. 다른 장치에서 다시 로그인할 때까지 알림을 받지 않을 거에요", + "You seem to be in a call, are you sure you want to quit?": "전화 중인데, 끊으시겠어요?", + "You seem to be uploading files, are you sure you want to quit?": "파일을 올리는 중인데, 그만두시겠어요?", + "You should not yet trust it to secure data": "안전한 자료를 위해서는 아직 믿으시면 안돼요", + "Your home server does not support device management.": "홈 서버가 장치 관리를 지원하지 않아요.", + "Sun": "일", + "Mon": "월", + "Tue": "화", + "Wed": "수", + "Thu": "목", + "Fri": "금", + "Sat": "토", + "Jan": "1월", + "Feb": "2월", + "Mar": "3월", + "Apr": "4월", + "May": "5월", + "Jun": "6월", + "Jul": "7월", + "Aug": "8월", + "Sep": "9월", + "Oct": "10월", + "Nov": "11월", + "Dec": "12월", + "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s일 %(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s일 %(fullYear)s년 %(time)s", + "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", + "Set a display name:": "별명 설정:", + "Set a Display Name": "별명 설정", + "Upload an avatar:": "아바타 올리기:", + "This server does not support authentication with a phone number.": "이 서버는 전화번호 인증을 지원하지 않아요.", + "Missing password.": "비밀번호를 틀렸어요.", + "Passwords don't match.": "비밀번호가 맞지 않아요.", + "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "비밀번호가 너무 짧아요 (min %(MIN_PASSWORD_LENGTH)s).", + "This doesn't look like a valid email address.": "유효한 이메일 주소가 아니에요.", + "This doesn't look like a valid phone number.": "유효한 전화번호가 아니에요.", + "User names may only contain letters, numbers, dots, hyphens and underscores.": "사용자 이름은 문자, 숫자, 점, -(붙임표), _(밑줄 문자)만 쓸 수 있어요.", + "An unknown error occurred.": "알 수 없는 오류가 일어났어요.", + "I already have an account": "이미 계정이 있어요", + "An error occurred: %(error_string)s": "오류가 일어났어요: %(error_string)s", + "Topic": "주제", + "Make Moderator": "조정자 임명하기", + "Make this room private": "이 방을 비공개로 만들기", + "Share message history with new users": "메시지 기록을 새 사용자와 공유하기", + "Encrypt room": "암호화한 방", + "There are no visible files in this room": "이 방에서 보여드릴 파일이 없어요", + "Room": "방", + "Connectivity to the server has been lost.": "서버 연결이 끊어졌어요.", + "Sent messages will be stored until your connection has returned.": "보내신 메시지는 다시 연결될 때까지 저장할 거에요.", + "Auto-complete": "자동 완성", + "Resend all or cancel all now. You can also select individual messages to resend or cancel.": "전부 다시 보내거나 취소하세요. 다시 보내거나 취소할 메시지를 하나씩 고르실 수도 있어요.", + "(~%(count)s results).one": "(~%(count)s 결과)", + "(~%(count)s results).other": "(~%(count)s 결과)", + "or": "혹은", + "Active call": "전화 중", + "bold": "굵은 획", + "italic": "기울임꼴", + "strike": "취소선", + "underline": "밑줄", + "code": "코드", + "quote": "인용", + "bullet": "글머리 기호", + "numbullet": "번호 매기기", + "%(severalUsers)sjoined %(repeats)s times": "%(severalUsers)s님이 %(repeats)s 번 들어오셨어요", + "%(oneUser)sjoined %(repeats)s times": "%(oneUser)s님이 %(repeats)s 번 들어오셨어요", + "%(severalUsers)sjoined": "%(severalUsers)s님이 들어오셨어요", + "%(oneUser)sjoined": "%(oneUser)s님이 들어오셨어요", + "%(severalUsers)sleft %(repeats)s times": "%(severalUsers)s님이 %(repeats)s 번 떠나셨어요", + "%(oneUser)sleft %(repeats)s times": "%(oneUser)s 님이 %(repeats)s 번 떠나셨어요", + "%(severalUsers)sleft": "%(severalUsers)s님이 떠나셨어요", + "%(oneUser)sleft": "%(oneUser)s님이 떠나셨어요", + "%(severalUsers)sjoined and left %(repeats)s times": "%(severalUsers)s님이 %(repeats)s번 들어오셨다 떠나셨어요", + "%(oneUser)sjoined and left %(repeats)s times": "%(oneUser)s님이 %(repeats)s번 들어오셨다 떠나셨어요", + "%(severalUsers)sjoined and left": "%(severalUsers)s님이 들어오셨다 떠나셨어요", + "%(oneUser)sjoined and left": "%(oneUser)s님이 들어오셨다 떠나셨어요", + "%(severalUsers)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": "%(oneUser)s님이 떠나셨다 다시 오셨어요", + "%(severalUsers)srejected their invitations %(repeats)s times": "%(severalUsers)s님이 %(repeats)s 번 초대를 거절하셨어요", + "%(oneUser)srejected their invitation %(repeats)s times": "%(oneUser)s님이 %(repeats)s 번 초대를 거절하셨어요", + "%(severalUsers)srejected their invitations": "%(severalUsers)s님이 초대를 거절하셨어요", + "%(oneUser)srejected their invitation": "%(oneUser)s님이 초대를 거절하셨어요", + "%(severalUsers)shad their invitations 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": "%(oneUser)s님이 초대를 취소하셨어요", + "were invited %(repeats)s times": "%(repeats)s 번 초대받으셨어요", + "was invited %(repeats)s times": "%(repeats)s 번 초대받으셨어요", + "were invited": "초대받으셨어요", + "was invited": "초대받으셨어요", + "were banned %(repeats)s times": "%(repeats)s 번 차단당하셨어요", + "was banned %(repeats)s times": "%(repeats)s 번 차단당하셨어요", + "were banned": "차단당하셨어요", + "was banned": "차단당하셨어요", + "were unbanned %(repeats)s times": "%(repeats)s 번 차단이 풀리셨어요", + "was unbanned %(repeats)s times": "%(repeats)s 번 차단의 풀리셨어요", + "were unbanned": "차단이 풀리셨어요", + "was unbanned": "차단이 풀리셨어요", + "were kicked %(repeats)s times": "%(repeats)s 번 내쫓기셨어요", + "was kicked %(repeats)s times": "%(repeats)s 번 내쫓기셨어요", + "were kicked": "내쫓기셨어요", + "was kicked": "내쫓기셨어요", + "%(severalUsers)schanged their name %(repeats)s times": "%(severalUsers)s님이 이름을 %(repeats)s 번 바꾸셨어요", + "%(oneUser)schanged their name %(repeats)s times": "%(oneUser)s님이 이름을 %(repeats)s 번 바꾸셨어요", + "%(severalUsers)schanged their name": "%(severalUsers)s님이 이름을 바꾸셨어요", + "%(oneUser)schanged their name": "%(oneUser)s님이 이름을 바꾸셨어요", + "%(severalUsers)schanged their avatar %(repeats)s times": "%(severalUsers)s님이 아바타를 %(repeats)s 번 바꾸셨어요", + "%(oneUser)schanged their avatar %(repeats)s times": "%(oneUser)s님이 아바타를 %(repeats)s 번 바꾸셨어요", + "%(severalUsers)schanged their avatar": "%(severalUsers)s님이 아바타를 바꾸셨어요", + "%(oneUser)schanged their avatar": "%(oneUser)s님이 아바타를 바꾸셨어요", + "Please select the destination room for this message": "이 메시지를 보낼 방을 골라주세요", + "New Password": "새 비밀번호", + "Start automatically after system login": "컴퓨터를 시작할 때 자동으로 실행하기", + "Desktop specific": "컴퓨터 설정", + "Analytics": "정보 수집", + "Opt out of analytics": "정보 수집 거부", + "Options": "선택권", + "Riot collects anonymous analytics to allow us to improve the application.": "라이엇은 익명의 정보를 수집해 응용 프로그램을 개선한답니다.", + "Passphrases must match": "암호가 일치해야 해요", + "Passphrase must not be empty": "암호를 비우시면 안돼요", + "Export room keys": "방 키를 내보내기", + "Confirm passphrase": "암호 확인", + "File to import": "가져올 파일", + "You must join the room to see its files": "파일을 보려면 방에 들어가야만 해요", + "Reject all %(invitedRooms)s invites": "모든 %(invitedRooms)s의 초대를 거절하기", + "Start new chat": "새로 이야기하기", + "Guest users can't invite users. Please register.": "손님은 사용자를 초대할 수 없어요. 계정을 등록해주세요.", + "Failed to invite": "초대하지 못했어요", + "Failed to invite user": "사용자를 초대하지 못했어요", + "Failed to invite the following users to the %(roomName)s room:": "다음 사용자들을 %(roomName)s 방으로 초대하지 못했어요:", + "Confirm Removal": "삭제 확인", + "Unknown error": "알 수 없는 오류", + "Incorrect password": "맞지 않는 비밀번호", + "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "계정을 영원히 쓸 수 없게 할 거에요. 같은 사용자 ID를 다시 등록하실 수 없을 거고요.", + "This action is irreversible.": "되돌릴 수 없는 일이에요.", + "To continue, please enter your password.": "계속하시려면, 비밀번호를 입력해주세요.", + "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "이 과정으로 암호화한 방에서 받은 메시지의 키를 로컬 파일로 내보낼 수 있어요. 너중에 다른 매트릭스 클라이언트로 파일을 불러올 수 있기 때문에, 그 클라이언트에서 메시지를 해독할 수도 있지요.", + "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "내보낸 파일은 누구든지 암호화한 메시지를 해독해서 읽을 수 있게 하므로, 보안에 신경 써 주세요. 이를 위해, 내보낸 파일을 암호화하려하니, 아래에 암호를 입력해주세요. 같은 암호를 쓰셔야만 자료를 불러올 수 있어요.", + "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "이 과정으로 전에 다른 매트릭스 클라이언트에서 내보낸 암호화 키를 불러올 수 있어요. 그 다음에는 다른 클라이언트에서 해독할 수 있던 어떤 메시지라도 해독할 수 있을 거에요.", + "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "내보낸 파일은 암호로 보호하고 있어요. 파일을 해독하려면, 여기에 암호를 입력해주세요.", + "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "이 사건을 지우길 (없애길) 원하세요? 방 이름을 지우거나 주제를 바꾸시면, 되돌릴 수 없다는 걸 명심해주세요.", + "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "이 장치를 믿을 수 있는지 확인하시려면, 몇 가지 방법(예를 들자면 직접 만나거나 전화를 걸어서)으로 소유자에게 연락하시고 그들이 사용자 설정에서 보는 키와 아래 키가 같은지 물어보세요:", + "Device name": "장치 이름", + "Device Name": "장치 이름", + "Device key": "장치 키", + "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "맞다면, 아래 인증 버튼을 누르세요. 맞지 않다면, 다른 사람이 이 장치를 가로채고 있으니 요주의 버튼을 누르시고 싶으실 거 같네요.", + "In future this verification process will be more sophisticated.": "앞으로는 이 확인 과정이 더 정교해질 거에요.", + "Verify device": "인증한 장치", + "I verify that the keys match": "키가 맞는 걸 확인했어요", + "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "이전 세션을 복구하는 도중 오류가 일어났어요. 계속하시려면, 다시 로그인하셔야 하고, 암호화한 기록은 읽을 수 없게 될 거에요.", + "Unable to restore session": "세션을 복구할 수 없어요", + "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "이전에 더 최근 버전의 라이엇을 쓰셨다면, 이 버전과 맞지 않을 거에요. 창을 닫고 더 최근 버전으로 돌아가세요.", + "Continue anyway": "무시하고 계속하기", + "Your display name is how you'll appear to others when you speak in rooms. What would you like it to be?": "별명은 방에서 말할 때 다른 사람에게 보일 이름을 정하는 거에요. 어떤 게 좋으세요?", + "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "현재 인증하지 않은 장치를 요주의로 지정하셨어요. 이 장치들에 메시지를 보내려면 인증을 해야 해요." } diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/i18n/strings/nb_NO.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 7a04d4ca38..95c5e0ee78 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -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,230 @@ "%(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 homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Geen verbinding met de thuisserver - controleer je verbinding. Controleer het SSL-certificaat van de thuisserver 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 voice or video.": "Toetreden als spraak of video.", + "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, click here to send a bug report.": "Klik anders hier 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 to start a chat with someone": "Druk op 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", + "Room contains unknown devices": "De ruimte bevat onbekende apparaten", + "Room name (optional)": "Ruimtenaam (optioneel)", + "%(roomName)s does not exist.": "%(roomName)s bestaat niet.", + "%(roomName)s is not accessible at this time.": "%(roomName)s is niet toegankelijk op dit moment.", + "Rooms": "Ruimtes", + "Save": "Opslaan", + "Scroll to bottom of page": "Scroll naar de onderkant van de pagina", + "Scroll to unread messages": "Scroll naar ongelezen berichten", + "Search failed": "Zoeken mislukt", + "Searches DuckDuckGo for results": "Zoekt op DuckDuckGo voor resultaten", + "Searching known users": "Aan het zoeken naar bekende gebruikers", + "Seen by %(userName)s at %(dateTime)s": "Gezien bij %(userName)s op %(dateTime)s", + "Send a message (unencrypted)": "Stuur een bericht (onversleuteld)", + "Send an encrypted message": "Stuur een versleuteld bericht", + "Send anyway": "Alsnog versturen", + "Sender device information": "Afzender apparaat informatie", + "Send Reset Email": "Stuur Reset E-mail", + "sent an image": "stuurde een afbeelding", + "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s stuurde een afbeelding.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s stuurde een uitnodiging naar %(targetDisplayName)s om tot de ruimte toe te treden.", + "sent a video": "stuurde een video", + "Server error": "Server fout", + "Server may be unavailable or overloaded": "De server kan onbereikbaar of overbelast zijn", + "Server may be unavailable, overloaded, or search timed out :(": "De server is misschien onbereikbaar, overbelast of het zoeken duurde te lang :(", + "Server may be unavailable, overloaded, or the file too big": "De server is misschien onbereikbaar, overbelast of het bestand is te groot", + "Server may be unavailable, overloaded, or you hit a bug.": "De server is misschien onbereikbaar, overbelast of je bent tegen een fout aangelopen.", + "Server unavailable, overloaded, or something else went wrong.": "De server is onbereikbaar, overbelast of iets anders ging fout.", + "Session ID": "Sessie ID" } diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/i18n/strings/pl.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index a8dd8758d4..d48f1a914f 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -404,7 +404,6 @@ "You cannot place VoIP calls in this browser.": "Você não pode fazer chamadas de voz neste navegador.", "You need to be able to invite users to do that.": "Para fazer isso, você tem que ter permissão para convidar outras pessoas.", "You need to be logged in.": "Você tem que estar logado.", - "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.": "É necessário que você faça login novamente para poder gerar as chaves de criptografia ponta-a-ponta para este dispositivo e então enviar sua chave pública para o servidor. Pedimos desculpas pela inconveniência, é preciso fazer isso apenas única uma vez.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "O seu endereço de email não parece estar associado a uma conta de usuária/o Matrix neste servidor.", "Set a display name:": "Defina um nome público para você:", "Upload an avatar:": "Envie uma imagem de perfil para identificar você:", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 2c18b0507d..844a8322b3 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -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 to start a chat with someone": "Clique em 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,13 +399,12 @@ "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 to make a room or to browse the directory": "Você ainda não está em nenhuma sala! Clique em para criar uma sala ou em 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.", "You need to be able to invite users to do that.": "Para fazer isso, você tem que ter permissão para convidar outras pessoas.", "You need to be logged in.": "Você tem que estar logado.", - "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.": "É necessário que você faça login novamente para poder gerar as chaves de criptografia ponta-a-ponta para este dispositivo e então enviar sua chave pública para o servidor. Pedimos desculpas pela inconveniência, é preciso fazer isso apenas única uma vez.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "O seu endereço de email não parece estar associado a uma conta de usuária/o Matrix neste servidor.", "Set a display name:": "Defina um nome público para você:", "Upload an avatar:": "Envie uma imagem de perfil para identificar você:", @@ -960,5 +960,22 @@ "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.", + "To return to your account in future you need to set a password": "Para poder futuramente voltar à sua conta, você precisa definir uma senha", + "Skip": "Pular", + "Start verification": "Iniciar a verificação", + "Share without verifying": "Compartilhar sem verificar", + "Ignore request": "Ignorar o pedido", + "You added a new device '%(displayName)s', which is requesting encryption keys.": "Você adicionou um novo dispositivo '%(displayName)s', que está solicitando chaves de criptografia.", + "Your unverified device '%(displayName)s' is requesting encryption keys.": "Seu dispositivo não verificado '%(displayName)s' está solicitando chaves de criptografia.", + "Encryption key request": "Solicitação de chave de criptografia" } diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 26c2986948..93c35e32f4 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -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,23 +100,23 @@ "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": "Уйти из комнаты", + "Leave room": "Выйти из комнаты", "left and rejoined": "Покинуть и пере подключится", "left": "покинуть", "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.": "Вам необходимо пригласить пользователей чтобы сделать это.", @@ -385,7 +385,6 @@ "Thu": "Чт", "Fri": "Пя", "Sat": "Сб", - "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.": "Вам необходимо снова войти в генерировать сквозное шифрование (е2е) ключей для этого устройства и предоставить публичный ключ Вашему домашнему серверу. Это после выключения; приносим извинения за причиненные неудобства.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ваш адрес электронной почты, кажется, не связан с Matrix ID на этом Homeserver.", "to start a chat with someone": "Начать чат с кем-то", "to tag direct chat": "отметить прямой чат", @@ -470,7 +469,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 +522,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 +649,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 enable unsafe scripts.": "Не возможно подключиться к серверу через HTTP, когда в строке браузера HTTPS. Используйте HTTPS или включив небезопасные скрипты.", "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 +685,7 @@ "Custom level": "Пользовательский уровень", "Device already verified!": "Устройство уже верифицировано!", "Device ID:": "ID устройства:", - "device id: ": "id устройства: ", + "device id: ": "ID устройства: ", "Device key:": "Ключ устройства:", "disabled": "отключено", "Disable markdown formatting": "Отключить форматирование Markdown", @@ -700,7 +699,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 +895,7 @@ "Admin tools": "Админ утилита", "And %(count)s more...": "И %(count)s больше...", "Alias (optional)": "Псевдоним (опционально)", - "Click here to join the discussion!": " Нажми здесь чтоб присоединиться к обсуждению!", + "Click here to join the discussion!": "Нажмите здесь, чтобы присоединиться к обсуждению!", "Close": "Закрыть", "Disable Notifications": "Отключить оповещение", "Drop File Here": "Вставить сюда файл", @@ -909,7 +908,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 voice or video.": "Присоединен как голос или видио .", + "Join as voice or video.": "Войти как голос или видео.", "Last seen": "В последний раз видели", "Level:": "Уровень:", "No display name": "Нет отображаемое имя", @@ -921,7 +920,7 @@ "Set": "Вводить", "Start authentication": "Начать идентификацию", "This room": "Эта комната", - "(~%(count)s results).other": "(~%(count) найдено)", + "(~%(count)s results).other": "(~%(count)s найдено)", "Device Name": "Имя устройства", "Custom": "Пользователь", "Decline": "Отклонить", @@ -946,8 +945,8 @@ "Would you like to accept or decline this invitation?": "Хотели бы вы подтвердить это приглашение или отклонить?", "(~%(count)s results).one": "(~%(count)s Результат)", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Не удается подключиться к домашнему серверу - проверьте подключение, убедитесь, что ваш сертификат SSL homeserver's SSL certificate действителен, и расширение браузера не блокирует запросы.", - "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 +957,15 @@ "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 to start a chat with someone": "Нажмите для начала чата с кем либо", + "You're not in any rooms yet! Press to make a room or to browse the directory": "Вы еще не в комнатах! Нажмите , чтобы создать комнату или , чтобы просмотреть каталог", + "To return to your account in future you need to set a password": "Чтобы в будущем к этой учётной записи вернутся, вы должны ввести пароль", + "Skip": "Пропуск", + "Start verification": "Запуск проверки", + "Share without verifying": "Поделиться без проверки", + "Ignore request": "Игнорировать запрос", + "You added a new device '%(displayName)s', which is requesting encryption keys.": "Вы добавили новое устройство '%(displayName)s', который запрашивает ключи шифрования.", + "Your unverified device '%(displayName)s' is requesting encryption keys.": "Ваше непроверенное устройство '%(displayName)s' запрашивает ключи шифрования.", + "Encryption key request": "Запрос ключа шифрования" } diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index fe8b1ffee1..21bda3b741 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -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 homeserver's SSL certificate 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 hemservers TLS-certifikat ä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.", diff --git a/src/i18n/strings/th.json b/src/i18n/strings/th.json index edc197a1af..fd83354b72 100644 --- a/src/i18n/strings/th.json +++ b/src/i18n/strings/th.json @@ -339,7 +339,7 @@ "Export E2E room keys": "ส่งออกกุญแจถอดรหัส E2E", "Failed to change power level": "การเปลี่ยนระดับอำนาจล้มเหลว", "Import E2E room keys": "นำเข้ากุญแจถอดรหัส E2E", - "to favourite": "ไปยังรายการโปรด", + "to favourite": "เพื่อเพิ่มไปยังรายการโปรด", "to demote": "เพื่อลดขั้น", "The default role for new room members is": "บทบาทเริ่มต้นของสมาชิกใหม่คือ", "The phone number entered looks invalid": "ดูเหมือนว่าหมายเลขโทรศัพท์ที่กรอกรมาไม่ถูกต้อง", @@ -384,7 +384,7 @@ "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?": "คุณต้องการสื่อสารกับใคร?", + "Who would you like to communicate with?": "คุณต้องการคุยกับใคร?", "You're not in any rooms yet! Press": "คุณยังไม่ได้อยู่ในห้องใดเลย! กด", "You are trying to access %(roomName)s.": "คุณกำลังพยายามเข้าสู่ %(roomName)s", "You have disabled URL previews by default.": "ค่าเริ่มต้นของคุณปิดใช้งานตัวอย่าง URL เอาไว้", diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json new file mode 100644 index 0000000000..15b2958e2b --- /dev/null +++ b/src/i18n/strings/tr.json @@ -0,0 +1,917 @@ +{ + "af": "Afrikanca (Taal)", + "ar-ae": "Arapça (B.A.E)", + "ar-bh": "Arapça (Bahreyn)", + "ar-dz": "Arapça (Cezayir)", + "ar-eg": "Arapça (Mısır)", + "ar-iq": "Arapça (Irak)", + "ar-jo": "Arapça (Ürdün)", + "ar-kw": "Arapça (Kuveyt)", + "ar-lb": "Arapça (Lübnan)", + "ar-ly": "Arapça (Libya)", + "ar-ma": "Arapça (Fas)", + "ar-om": "Arapça (Umman)", + "ar-qa": "Arapça (Katar)", + "ar-sa": "Arapça (Suudi Arabistan)", + "ar-sy": "Arapça (Suriye)", + "ar-tn": "Arapça (Tunus)", + "ar-ye": "Arapça (Yemen)", + "be": "Beyaz Rusça", + "bg": "Bulgarca", + "ca": "Katalanca", + "cs": "Çek Dili", + "da": "Danimarkaca", + "de-at": "Almanca (Avusturya)", + "de-ch": "Almanca (İsviçre)", + "de": "Almanca", + "de-li": "Almanca (Liechtenstein)", + "de-lu": "Almanca (Lüksemburg)", + "el": "Yunanca", + "en-au": "İngilizce (Avustralya)", + "en-bz": "İngilizce (Belize)", + "en-ca": "İngilizce (Kanada)", + "en": "İngilizce", + "en-gb": "İngilizce (İngiltere)", + "en-ie": "İngilizce (İrlanda)", + "en-jm": "İngilizce (Jamaika)", + "en-nz": "İngilizce (Yeni Zellanda)", + "en-tt": "İngilizce (Trinidad)", + "en-us": "İngilizce (Amerika)", + "en-za": "İngilizce (Güney Afrika)", + "es-ar": "İspanyolca (Arjantin)", + "es-bo": "İspanyolca (Bolivya)", + "es-cl": "İspanyolca (Şili)", + "es-co": "İspanyolca (Kolombiya)", + "es-cr": "İspanyolca (Kosta Rika)", + "es-do": "İspanyolca (Dominik Cumhuriyeti)", + "es-ec": "İspanyolca (Ekvador)", + "es-gt": "İspanyolca (Guatemala)", + "es-hn": "İspanyolca (Honduras)", + "es-mx": "İspanyolca (Meksika)", + "es-ni": "İspanyolca (Nikaragua)", + "es-pa": "İspanyolca (Panama)", + "es-pe": "İspanyolca (Peru)", + "es-pr": "İspanyolca (Porto Riko)", + "es-py": "İspanyolca (Paraguay)", + "es": "İspanyolca (İspanya)", + "es-sv": "İspanyolca (El Salvador)", + "es-uy": "İspanyolca (Uruguay)", + "es-ve": "İspanyolca (Venezuela)", + "et": "Estonya Dili", + "eu": "Baskça", + "fa": "Farsça", + "fi": "Fince", + "fo": "Faroe", + "fr-be": "Fransızca (Belçika)", + "fr-ca": "Fransızca (Kanada)", + "fr-ch": "Fransızca (İsviçre)", + "fr": "Fransızca", + "fr-lu": "Fransızca (Lüxemburg)", + "ga": "İrlandaca", + "gd": "Gaelik (İskoçya)", + "he": "İbranice", + "hi": "Hintçe", + "hr": "Hırvatça", + "hu": "Macarca", + "id": "Endonezya Dili", + "is": "İzlandaca", + "it-ch": "İtalyanca (İsviçre)", + "it": "İtalyanca", + "ja": "Japonca", + "ji": "Eskenazi Dili", + "ko": "Korece", + "lt": "Litvanya Dili", + "lv": "Letonya Dili", + "mk": "Makedonca (FYROM)", + "ms": "Malezyanca", + "mt": "Malta Dili", + "nl-be": "Hollandaca (Belçika)", + "nl": "Hollandaca", + "no": "Norveççe", + "pl": "Polonya Dili", + "pt-br": "Brezilya Portekizcesi", + "pt": "Portekizce", + "rm": "Reto-Latince", + "ro-mo": "Romence (Moldova Cumhuriyeti)", + "ro": "Romence", + "ru-mo": "Rusça (Moldova Cumhuriyeti)", + "ru": "Rusça", + "sb": "Sorbca", + "sk": "Slovakça", + "sl": "Slovence", + "sq": "Arnavutça", + "sr": "Sırpça", + "sv-fi": "İsveççe (Finlandiya)", + "sv": "İsveççe", + "sx": "Sutu Dili", + "sz": "Sami Dili", + "th": "Tayland Dili", + "tn": "Setsvana", + "tr": "Türkçe", + "ts": "Tsonga Dili", + "uk": "Ukraynaca", + "ur": "Urduca", + "ve": "Venda Dili", + "vi": "Vietnam Dili", + "xh": "Xhosa Dili", + "zh-cn": "Çince (PRC)", + "zh-hk": "Çince (Hong Kong)", + "zh-sg": "Çince (Singapur)", + "zh-tw": "Çince (Tayvan)", + "zu": "Zulu Dili", + "a room": "bir oda", + "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "+%(msisdn)s 'ye bir kısa mesaj gönderildi . Lütfen içerdiği doğrulama kodunu girin", + "Accept": "Kabul Et", + "%(targetName)s accepted an invitation.": "%(targetName)s bir davetiyeyi kabul etti.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s %(displayName)s için davetiyeyi kabul etti.", + "Account": "Hesap", + "Access Token:": "Erişim Anahtarı:", + "Active call (%(roomName)s)": "Aktif çağrı (%(roomName)s)", + "Add": "Ekle", + "Add a topic": "Bir konu(topic) ekle", + "Add email address": "E-posta adresi ekle", + "Add phone number": "Telefon numarası ekle", + "Admin": "Admin", + "Admin tools": "Admin araçları", + "And %(count)s more...": "Ve %(count)s fazlası...", + "VoIP": "VoIP", + "Missing Media Permissions, click here to request.": "Medya İzinleri Yok , talep etmek için burayı tıklayın.", + "No Microphones detected": "Hiçbir Mikrofon bulunamadı", + "No Webcams detected": "Hiçbir Web kamerası bulunamadı", + "No media permissions": "Medya izinleri yok", + "You may need to manually permit Riot to access your microphone/webcam": "Riot'un mikrofonunuza / web kameranıza el le erişmesine izin vermeniz gerekebilir", + "Default Device": "Varsayılan Cihaz", + "Microphone": "Mikrofon", + "Camera": "Kamera", + "Advanced": "Gelişmiş", + "Algorithm": "Algoritma", + "Hide removed messages": "Kaldırılan mesajları gizle", + "Always show message timestamps": "Her zaman mesaj zaman dalgalarını (timestamps) gösterin", + "Authentication": "Doğrulama", + "Alias (optional)": "Diğer ad (isteğe bağlı)", + "all room members": "Tüm oda üyeleri", + "all room members, from the point they are invited": "Tüm oda üyeleri , davet edildiği noktadan", + "all room members, from the point they joined": "Tüm oda üyeleri , katıldıkları noktalardan", + "and": "ve", + "%(items)s and %(remaining)s others": "%(items)s ve %(remaining)s diğerleri", + "%(items)s and one other": "%(items)s ve bir başkası", + "%(items)s and %(lastItem)s": "%(items)s ve %(lastItem)s", + "and %(overflowCount)s others...": "ve %(overflowCount)s diğerleri...", + "and one other...": "ve bir diğeri...", + "%(names)s and %(lastPerson)s are typing": "%(names)s ve %(lastPerson)s yazıyorlar", + "%(names)s and one other are typing": "%(names)s ve birisi yazıyor", + "%(names)s and %(count)s others are typing": "%(names)s ve %(count)s diğeri yazıyor", + "An email has been sent to": "Bir e-posta gönderildi", + "A new password must be entered.": "Yeni bir şifre girilmelidir.", + "%(senderName)s answered the call.": "%(senderName)s aramayı cevapladı.", + "anyone": "herhangi biri", + "An error has occurred.": "Bir hata oluştu.", + "Anyone": "Kimse", + "Anyone who knows the room's link, apart from guests": "Misafirler dışında odanın bağlantısını bilen herkes", + "Anyone who knows the room's link, including guests": "Misafirler dahil , odanın bağlantısını bilen herkes", + "Are you sure?": "Emin misiniz ?", + "Are you sure you want to leave the room '%(roomName)s'?": "'%(roomName)s' odasından ayrılmak istediğinize emin misiniz ?", + "Are you sure you want to reject the invitation?": "Daveti reddetmek istediğinizden emin misiniz ?", + "Are you sure you want to upload the following files?": "Aşağıdaki dosyaları yüklemek istediğinizden emin misiniz ?", + "Attachment": "Ek Dosya", + "Autoplay GIFs and videos": "GIF'leri ve Videoları otomatik olarak oynat", + "%(senderName)s banned %(targetName)s.": "%(senderName)s %(targetName)s'i banladı.", + "Ban": "Yasak", + "Banned users": "Yasaklanan(Banlanan) Kullanıcılar", + "Bans user with given id": "Yasaklanan(Banlanan) Kullanıcılar , ID'leri ile birlikte", + "Blacklisted": "Kara listeye alınanlar", + "Bug Report": "Hata Raporu", + "Bulk Options": "Toplu Seçenekler", + "Call Timeout": "Arama Zaman Aşımı", + "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Ana Sunucu'ya bağlanılamıyor - lütfen bağlantınızı kontrol edin , Ana Sunucu SSL sertifikanızın güvenilir olduğundan ve bir tarayıcı uzantısının istekleri engellemiyor olduğundan emin olun.", + "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Tarayıcı çubuğunuzda bir HTTPS URL'si olduğunda Ana Sunusuna HTTP üzerinden bağlanılamıyor . Ya HTTPS kullanın veya güvensiz komut dosyalarını etkinleştirin.", + "Can't load user settings": "Kullanıcı ayarları yüklenemiyor", + "Change Password": "Şifre Değiştir", + "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s görüntülenen ismini %(oldDisplayName)s dan %(displayName)s 'a değiştirdi.", + "%(senderName)s changed their profile picture.": "%(senderName)s profil resmini değiştirdi.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s %(powerLevelDiffText)s'nin güç düzeyini değiştirdi.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s odanın ismini %(roomName)s olarak değiştirdi.", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s oda adını kaldırdı.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s konuyu \"%(topic)s\" olarak değiştirdi.", + "Changes to who can read history will only apply to future messages in this room": "Geçmişi kimlerin okuyabileceğine ait değişiklikler yalnızca bu odada gelecekteki iletiler için geçerli olur", + "Changes your display nickname": "Görünen takma adınızı değiştirir", + "changing room on a RoomView is not supported": "Oda Ekranında oda değiştirme desteklenmiyor", + "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Şifre değiştirme eğer oda anahtarlarınızı dışa aktarmaz ve daha sonra tekrar içe aktarmazsanız , şu anda tüm cihazlarda uçtan uca şifreleme anahtarlarını sıfırlayacak ve geçmişi okunamaz hale getirecek . Gelecekte bu geliştirilecek.", + "Claimed Ed25519 fingerprint key": "Ed25519 parmak izi anahtarı istendi", + "Clear Cache and Reload": "Önbelleği Temizle ve Yeniden Yükle", + "Clear Cache": "Önbelleği Temizle", + "Click here to join the discussion!": "Tartışmaya katılmak için Buraya tıklayın !", + "Click here to fix": "Düzeltmek için buraya tıklayın", + "Click to mute audio": "Sesi kapatmak için tıklayın", + "Click to mute video": "Videoyu kapatmak için tıklayın", + "click to reveal": "Ortaya çıkarmak için tıklayın", + "Click to unmute video": "Videoyu açmak için tıklayın", + "Click to unmute audio": "Sesi açmak için tıklayın", + "Close": "Kapat", + "Command error": "Komut Hatası", + "Commands": "Komutlar", + "Conference call failed.": "Konferans araması başarısız oldu.", + "Conference calling is in development and may not be reliable.": "Konferans araması geliştirme sürecinde ve güvenilir olmayabilir.", + "Conference calls are not supported in encrypted rooms": "Konferans aramaları şifreli odalarda desteklenmiyor", + "Conference calls are not supported in this client": "Konferans aramaları bu istemcide desteklenmiyor", + "Confirm password": "Şifreyi Onayla", + "Confirm your new password": "Yeni Şifrenizi Onaylayın", + "Continue": "Devam Et", + "Could not connect to the integration server": "Bütünleştirme (Integration) Sunucusuna bağlanamadı", + "%(count)s new messages.one": "%(count)s yeni mesaj", + "%(count)s new messages.other": "%(count)s yeni mesajlar", + "Create a new chat or reuse an existing one": "Yeni sohbet oluştur veya mevcut sohbetinizi tekrar kullanın", + "Create an account": "Hesap Oluştur", + "Create Room": "Oda Oluştur", + "Cryptography": "Kriptografi", + "Current password": "Şimdiki Şifre", + "Curve25519 identity key": "Curve25519 kimlik anahtarı", + "Custom": "Özel", + "Custom level": "Özel seviye", + "/ddg is not a command": "/ddg bir komut değildir", + "Deactivate Account": "Hesabı Devre Dışı Bırakma", + "Deactivate my account": "Hesabımı Devre Dışı Bırak", + "Decline": "Reddet", + "Decrypt %(text)s": "%(text)s metninin şifresini çöz", + "Decryption error": "Şifre çözme hatası", + "Delete": "Sil", + "demote": "Terfiyi Geri Al", + "Deops user with given id": "ID'leriyle birlikte , düşürülmüş kullanıcılar", + "Default": "Varsayılan", + "Device already verified!": "Cihaz zaten doğrulandı!", + "Device ID": "Cihaz ID", + "Device ID:": "Cihaz ID:", + "device id: ": "cihaz id: ", + "Device key:": "Cihaz anahtarı:", + "Devices": "Cihazlar", + "Devices will not yet be able to decrypt history from before they joined the room": "Cihazlar odaya girdiğinden önceki geçmişin şifresini çözemez", + "Direct Chat": "Doğrudan Sohbet", + "Direct chats": "Doğrudan Sohbetler", + "Disable Notifications": "Bildirimleri Devre Dışı Bırak", + "disabled": "Devre Dışı Bırakıldı", + "Disable inline URL previews by default": "Satır için URL önizlemelerini varsayılan olarak devre dışı bırak", + "Disable markdown formatting": "Markdown formatlamayı devre dışı bırak", + "Disinvite": "Daveti İptal Et", + "Display name": "Görünür İsim", + "Displays action": "Görünür eylem", + "Don't send typing notifications": "Yazarken bildirim gönderme", + "Download %(text)s": "%(text)s metnini indir", + "Drop File Here": "Dosyayı Buraya Bırak", + "Drop here %(toAction)s": "%(toAction)s'ı buraya bırak", + "Drop here to tag %(section)s": "Etiket %(section)s ' ı buraya bırak", + "Ed25519 fingerprint": "Ed25519 parmak izi", + "Email": "E-posta", + "Email address": "E-posta Adresi", + "Email address (optional)": "E-posta Adresi (isteğe bağlı)", + "Email, name or matrix ID": "E-posta , isim veya matrix ID", + "Emoji": "Emoji (Karakter)", + "Enable encryption": "Şifrelemeyi Etkinleştir", + "Enable Notifications": "Bildirimleri Etkinleştir", + "enabled": "etkinleştirildi", + "Encrypted by a verified device": "Doğrulanmış bir cihaz tarafından şifrelendi", + "Encrypted by an unverified device": "Doğrulanmamış bir cihaz tarafından şifrelendi", + "Encrypted messages will not be visible on clients that do not yet implement encryption": "Şifrelenmiş mesajlar , henüz şifreleme sağlamayan istemcilerde görünür olmayacaktır", + "Encrypted room": "Şifrelenmiş Oda", + "Encryption is enabled in this room": "Şifreleme bu oda için etkin", + "Encryption is not enabled in this room": "Şifreleme bu oda için etkin değil", + "%(senderName)s ended the call.": "%(senderName)s çağrıyı bitirdi.", + "End-to-end encryption information": "Uçtan-uca şifreleme bilgileri", + "End-to-end encryption is in beta and may not be reliable": "Uçtan uca şifreleme beta sürümünde ve güvenilir olmayabilir", + "Enter Code": "Kodu Girin", + "Enter passphrase": "Şifre deyimi Girin", + "Error": "Hata", + "Error decrypting attachment": "Ek şifresini çözme hatası", + "Error: Problem communicating with the given homeserver.": "Hata: verilen Ana Sunucu ile iletişim kurulamıyor.", + "Event information": "Etkinlik bilgileri", + "Existing Call": "Mevcut Çağrı", + "Export": "Dışa Aktar", + "Export E2E room keys": "Uçtan uca Oda anahtarlarını Dışa Aktar", + "Failed to ban user": "Kullanıcı yasaklama(Ban) başarısız", + "Failed to change password. Is your password correct?": "Şifreniz değiştirilemedi . Şifreniz doğru mu ?", + "Failed to change power level": "Güç seviyesini değiştirme başarısız oldu", + "Failed to delete device": "Cihazı silmek başarısız oldu", + "Failed to fetch avatar URL": "Avatar URL'i alınamadı", + "Failed to forget room %(errCode)s": "Oda unutulması başarısız oldu %(errCode)s", + "Failed to join room": "Odaya girme hatası", + "Failed to join the room": "Odaya girme başarısız oldu", + "Failed to kick": "Atma(Kick) işlemi başarısız oldu", + "Failed to leave room": "Odadan ayrılma başarısız oldu", + "Failed to load timeline position": "Zaman çizelgesi konumu yüklenemedi", + "Failed to lookup current room": "Geçerli odayı aramak başarısız oldu", + "Failed to mute user": "Kullanıcıyı sessize almak başarısız oldu", + "Failed to register as guest:": "Misafir olarak kayıt yapılamadı :", + "Failed to reject invite": "Daveti reddetme başarısız oldu", + "Failed to reject invitation": "Davetiyeyi reddetme başarısız oldu", + "Failed to save settings": "Ayarlar kaydetme başarısız oldu", + "Failed to send email": "E-posta gönderimi başarısız oldu", + "Failed to send request.": "İstek gönderimi başarısız oldu.", + "Failed to set avatar.": "Avatar ayarlama başarısız oldu.", + "Failed to set display name": "Görünür ismi ayarlama başarısız oldu", + "Failed to set up conference call": "Konferans görüşmesi ayarlama başarısız oldu", + "Failed to toggle moderator status": "Moderatör durumunu değiştirmek başarısız oldu", + "Failed to unban": "Yasağı kaldırmak başarısız oldu", + "Failed to upload file": "Dosya yükleme başarısız oldu", + "Failed to upload profile picture!": "Profil resmi yükleme başarısız oldu!", + "Failed to verify email address: make sure you clicked the link in the email": "E-posta adresini doğrulama başarısız : e-postadaki bağlantıya tıkladığınızdan emin olun", + "Failure to create room": "Oda oluşturulamadı", + "Favourite": "Favori", + "favourite": "favori", + "Favourites": "Favoriler", + "Fill screen": "Ekranı Doldur", + "Filter room members": "Oda üyelerini Filtrele", + "Forget room": "Odayı Unut", + "Forgot your password?": "Şifrenizi mi unuttunuz ?", + "For security, this session has been signed out. Please sign in again.": "Güvenlik için , bu oturuma çıkış yapıldı . Lütfen tekrar oturum açın.", + "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.": "Güvenlik için , çıkış yaparsanız bu tarayıcıdan tüm uçtan uca şifreleme anahtarları silinecek . Konuşma geçmişinizi çözebilmek isterseniz gelecekteki Riot oturumlarında , lütfen Oda Anahtarlarını güvenlik amaçlı Dışa Aktarın.", + "Found a bug?": "Hata buldunuz mu ?", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s %(fromPowerLevel)s den %(toPowerLevel)s ' ye", + "Guest access is disabled on this Home Server.": "Misafir erişimi bu Ana Sunucu için devre dışı.", + "Guests can't set avatars. Please register.": "Misafirler Avatarlarını ayarlayamazlar . Lütfen kayıt olun.", + "Guest users can't create new rooms. Please register to create room and start a chat.": "Misafir kullanıcılar yeni oda oluşturamazlar. Yeni oda oluşturmak ve sohbet başlatmak için lütfen kayıt olun.", + "Guest users can't upload files. Please register to upload.": "Misafir kullanıcılar dosya yükleyemezler . Lütfen yüklemek için kayıt olun.", + "Guests can't use labs features. Please register.": "Misafirler laboratuar özelliklerini kullanamazlar . Lütfen kayıt olun.", + "Guests cannot join this room even if explicitly invited.": "Misafirler açıkca davet edilseler bile bu odaya katılamazlar.", + "had": "vardı", + "Hangup": "Sorun", + "Hide read receipts": "Okundu bilgilerini gizle", + "Hide Text Formatting Toolbar": "Metin Biçimlendirme Araç Çubuğunu Gizle", + "Historical": "Tarihi", + "Home": "Ev", + "Homeserver is": "Ana Sunucusu", + "Identity Server is": "Kimlik Sunucusu", + "I have verified my email address": "E-posta adresimi doğruladım", + "Import": "İçe Aktar", + "Import E2E room keys": "Uçtan uca Oda Anahtarlarını İçe Aktar", + "Incoming call from %(name)s": "%(name)s ' den gelen çağrı", + "Incoming video call from %(name)s": "%(name)s ' den görüntülü arama", + "Incoming voice call from %(name)s": "%(name)s ' den gelen sesli arama", + "Incorrect username and/or password.": "Yanlış kullanıcı adı ve / veya şifre.", + "Incorrect verification code": "Yanlış doğrulama kodu", + "Interface Language": "Arayüz Dili", + "Invalid alias format": "Geçersiz Takma Ad(nickname) Formatı", + "Invalid address format": "Geçersiz adres formatı", + "Invalid Email Address": "Geçersiz E-posta Adresi", + "Invalid file%(extra)s": "Geçersiz dosya %(extra)s'ı", + "%(senderName)s invited %(targetName)s.": "%(senderName)s %(targetName)s ' ı davet etti.", + "Invite new room members": "Yeni oda üyelerini davet et", + "Invited": "Davet Edildi", + "Invites": "Davetler", + "Invites user with given id to current room": "Mevcut odaya verilen kimliği olan kullanıcıyı davet eder", + "'%(alias)s' is not a valid format for an address": "'%(alias)s' bir adres için geçerli format değil", + "'%(alias)s' is not a valid format for an alias": "'%(alias)s' bir takma ad(nickname) için geçerli değil", + "%(displayName)s is typing": "%(displayName)s yazıyor", + "Sign in with": "Şununla giriş yap", + "Join as voice or video.": " ses veya video olarak katılın.", + "Join Room": "Odaya Katıl", + "joined and left": "katıldı ve ayrıldı", + "joined": "katıldı", + "%(targetName)s joined the room.": "%(targetName)s odaya katıldı.", + "Joins room with given alias": "Verilen takma ad (nick name) ile odaya katıl", + "Jump to first unread message.": "İlk okunmamış iletiye atla.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s %(targetName)s' ı attı.", + "Kick": "Atmak (Odadan atmak vs.)", + "Kicks user with given id": "Verilen ID ' li kullanıcıyı at", + "Labs": "Laboratuarlar", + "Last seen": "Son görülme", + "Leave room": "Odadan ayrıl", + "left and rejoined": "ayrıldı ve yeniden katıldı", + "left": "ayrıldı", + "%(targetName)s left the room.": "%(targetName)s odadan ayrıldı.", + "Level:": "Seviye :", + "List this room in %(domain)s's room directory?": "Bu oda %(domain)s' in oda dizininde listelensin mi ?", + "Local addresses for this room:": "Bu oda için yerel adresler :", + "Logged in as:": "Olarak giriş yaptı :", + "Login as guest": "Misafir olarak giriş yaptı", + "Logout": "Çıkış Yap", + "Low priority": "Düşük öncelikli", + "%(senderName)s made future room history visible to": "%(senderName)s gelecekte oda geçmişini görünür yaptı", + "Manage Integrations": "Entegrasyonları Yönet", + "Markdown is disabled": "Markdown devre dışı", + "Markdown is enabled": "Markdown aktif", + "matrix-react-sdk version:": "matrix-react-sdk versiyon:", + "Members only": "Sadece üyeler", + "Message not sent due to unknown devices being present": "Bilinmeyen cihazlar bulunduğundan mesaj gönderilemedi", + "Missing room_id in request": "İstekte eksik room_id", + "Missing user_id in request": "İstekte user_id eksik", + "Mobile phone number": "Cep telefonu numarası", + "Mobile phone number (optional)": "Cep telefonu numarası (isteğe bağlı)", + "Moderator": "Moderatör", + "Must be viewing a room": "Bir oda görüntülemeli olmalı", + "Mute": "Sessiz", + "my Matrix ID": "Benim Matrix ID'm", + "Name": "İsim", + "Never send encrypted messages to unverified devices from this device": "Bu cihazdan doğrulanmamış cihazlara asla şifrelenmiş mesajlar göndermeyin", + "Never send encrypted messages to unverified devices in this room": "Bu odada doğrulanmamış cihazlara asla şifreli mesajlar göndermeyin", + "Never send encrypted messages to unverified devices in this room from this device": "Bu odada bu cihazdan doğrulanmamış cihazlara asla şifrelenmiş mesajlar göndermeyin", + "New address (e.g. #foo:%(localDomain)s)": "Yeni adres (e.g. #foo:%(localDomain)s)", + "New Composer & Autocomplete": "Yeni Besteci & Otomatik Tamamlama", + "New password": "Yeni Şifre", + "New passwords don't match": "Yeni şifreler uyuşmuyor", + "New passwords must match each other.": "Yeni şifreler birbirleriyle eşleşmelidir.", + "none": "Hiç (Yok)", + "not set": "Ayarlanmadı", + "not specified": "Belirtilmemiş", + "Notifications": "Bildirimler", + "(not supported by this browser)": "(Bu tarayıcı tarafından desteklenmiyor)", + "": "", + "NOT verified": "Doğrulanmadı", + "No devices with registered encryption keys": "Kayıtlı şifreleme anahtarlı cihazlar yok", + "No display name": "Görünür isim yok", + "No more results": "Başka sonuç yok", + "No results": "Sonuç yok", + "No users have specific privileges in this room": "Bu odada hiçbir kullanıcının belirli ayrıcalıkları yoktur", + "OK": "Tamam", + "olm version:": "olm versiyon:", + "Once encryption is enabled for a room it cannot be turned off again (for now)": "Bu oda için şifreleme etkinleştirildikten sonra tekrar kapatılamaz (şimdilik)", + "Once you've followed the link it contains, click below": "Bir kere ' içerdiği bağlantıyı takip ettikten sonra , aşağıya tıklayın", + "Only people who have been invited": "Sadece davet edilmiş insanlar", + "Operation failed": "Operasyon başarısız oldu", + "Otherwise, click here to send a bug report.": "Aksi taktirde , bir hata raporu göndermek için buraya tıklayın .", + "Password": "Şifre", + "Password:": "Şifre:", + "Passwords can't be empty": "Şifreler boş olamaz", + "People": "İnsanlar", + "Permissions": "İzinler", + "Phone": "Telefon", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s bir %(callType)s çağrısı yerleştirdi.", + "Please check your email and click on the link it contains. Once this is done, click continue.": "Lütfen e-postanızı kontrol edin ve içerdiği bağlantıya tıklayın . Bu işlem tamamlandıktan sonra , 'devam et' e tıklayın .", + "Please Register": "Lütfen Kaydolun", + "Power level must be positive integer.": "Güç seviyesi pozitif tamsayı olmalıdır.", + "Press": "Basın", + "Press to start a chat with someone": "Birisiyle sohbet başlatmak için tuşuna basın", + "Privacy warning": "Gizlilik uyarısı", + "Private Chat": "Özel Sohbet", + "Privileged Users": "Ayrıcalıklı Kullanıcılar", + "Profile": "Profil", + "Public Chat": "Genel Sohbet", + "Reason": "Sebep", + "Reason: %(reasonText)s": "Sebep: %(reasonText)s", + "Revoke Moderator": "Moderatörü İptal Et", + "Refer a friend to Riot:": "Riot'tan bir arkadaşa bakın :", + "Register": "Kaydolun", + "rejected": "reddedildi", + "%(targetName)s rejected the invitation.": "%(targetName)s daveti reddetti.", + "Reject invitation": "Daveti Reddet", + "Rejoin": "Yeniden Katıl", + "Remote addresses for this room:": "Bu oda için uzak adresler:", + "Remove Contact Information?": "İletişim Bilgilerini Kaldır ?", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s görünen adı (%(oldDisplayName)s) kaldırdı.", + "%(senderName)s removed their profile picture.": "%(senderName)s profil resmini kaldırdı.", + "Remove": "Kaldır", + "Remove %(threePid)s?": "%(threePid)s 'i kaldır ?", + "%(senderName)s requested a VoIP conference.": "%(senderName)s bir VoIP konferansı talep etti.", + "Report it": "Bunu rapor et", + "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.": "Şifrenizi sıfırlamak , eğer Oda Anahtarlarınızı dışa aktarmaz ve daha sonra içe aktarmaz iseniz , şu anda tüm cihazlarda uçtan uca şifreleme anahtarlarını sıfırlayarak şifreli sohbetleri okunamaz hale getirecek . Gelecekte bu iyileştirilecek.", + "restore": "geri yükle", + "Results from DuckDuckGo": "DuckDuckGo Sonuçları", + "Return to app": "Uygulamaya dön", + "Return to login screen": "Giriş ekranına dön", + "Riot does not have permission to send you notifications - please check your browser settings": "Riot size bildirim gönderme iznine sahip değil - lütfen tarayıcı ayarlarınızı kontrol edin", + "Riot was not given permission to send notifications - please try again": "Riot'a bildirim gönderme izni verilmedi - lütfen tekrar deneyin", + "riot-web version:": "riot-web versiyon:", + "Room %(roomId)s not visible": "%(roomId)s odası görünür değil", + "Room Colour": "Oda Rengi", + "Room contains unknown devices": "Oda bilinmeyen cihazlar içeriyor", + "Room name (optional)": "Oda ismi (İsteğe Bağlı)", + "%(roomName)s does not exist.": "%(roomName)s mevcut değil.", + "%(roomName)s is not accessible at this time.": "%(roomName)s şu anda erişilebilir değil.", + "Rooms": "Odalar", + "Save": "Kaydet", + "Scroll to bottom of page": "Sayfanın altına kaydır", + "Scroll to unread messages": "Okunmamış mesajlara kaydır", + "Search": "Ara", + "Search failed": "Arama başarısız", + "Searches DuckDuckGo for results": "Sonuçlar için DuckDuckGo'yu arar", + "Searching known users": "Bilinen kullanıcıları arama", + "Seen by %(userName)s at %(dateTime)s": "%(dateTime)s ' de %(userName)s tarafından görüldü", + "Send a message (unencrypted)": "Bir mesaj gönder (Şifrelenmemiş)", + "Send an encrypted message": "Şifrelenmiş bir mesaj gönder", + "Send anyway": "Her durumda gönder", + "Sender device information": "Gönderen cihaz bilgileri", + "Send Invites": "Davetiye Gönder", + "Send Reset Email": "E-posta Sıfırlama Gönder", + "sent an image": "bir resim gönderildi", + "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s bir resim gönderdi.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s %(targetDisplayName)s' a odaya katılması için bir davet gönderdi.", + "sent a video": "bir video gönderildi", + "Server error": "Sunucu Hatası", + "Server may be unavailable or overloaded": "Sunucu kullanılamıyor veya aşırı yüklenmiş olabilir", + "Server may be unavailable, overloaded, or search timed out :(": "Sunucu kullanılamıyor , aşırı yüklenmiş veya arama zaman aşımına uğramış olabilir :(", + "Server may be unavailable, overloaded, or the file too big": "Sunucu kullanılamıyor , aşırı yüklenmiş , veya dosya çok büyük olabilir", + "Server may be unavailable, overloaded, or you hit a bug.": "Sunucu kullanılamıyor , aşırı yüklenmiş , veya bir hatayla karşılaşmış olabilirsiniz.", + "Server unavailable, overloaded, or something else went wrong.": "Sunucu kullanılamıyor , aşırı yüklenmiş veya başka bir şey ters gitmiş olabilir.", + "Session ID": "Oturum ID", + "%(senderName)s set a profile picture.": "%(senderName)s bir profil resmi ayarladı.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s görünür ismini %(displayName)s ' a ayarladı.", + "Set": "Ayarla", + "Settings": "Ayarlar", + "Show panel": "Paneli göster", + "Show Text Formatting Toolbar": "Metin Biçimlendirme Araç Çubuğunu Göster", + "Show timestamps in 12 hour format (e.g. 2:30pm)": "Zaman damgalarını 12 biçiminde göster (örn. 2:30 pm)", + "Signed Out": "Oturum Kapatıldı", + "Sign in": "Giriş Yap", + "Sign out": "Çıkış Yap", + "since the point in time of selecting this option": "Bu seçenek seçildiğinden beri", + "since they joined": "Katıldıklarından beri", + "since they were invited": "davet edildiklerinden beri", + "Some of your messages have not been sent.": "Bazı mesajlarınız gönderilemedi.", + "Someone": "Birisi", + "Sorry, this homeserver is using a login which is not recognised ": "Maalesef , bu Ana Sunucu tanımlanmamış bir Giriş kullanıyor ", + "Start a chat": "Bir Sohbet Başlat", + "Start authentication": "Kimlik Doğrulamayı başlatın", + "Start Chat": "Sohbet Başlat", + "Submit": "Gönder", + "Success": "Başarı", + "tag as %(tagName)s": "%(tagName)s olarak etiketle", + "tag direct chat": "Doğrudan sohbeti etiketle", + "Tagged as: ": "Olarak etiketlendi : ", + "The default role for new room members is": "Yeni oda üyelerinin varsayılan rolü", + "The main address for this room is": "Bu oda için ana adres", + "The phone number entered looks invalid": "Girilen telefon numarası geçersiz görünüyor", + "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Sağladığınız imza anahtarı %(userId)s aygıtından %(deviceId)s ile eşleşiyor . Aygıt doğrulanmış olarak işaretlendi.", + "This action cannot be performed by a guest user. Please register to be able to do this.": "Bu eylem bir Misafir Kullanıcı tarafından yapılamaz . Lütfen bunu yapabilmek için Kaydolun .", + "This email address is already in use": "Bu e-posta adresi zaten kullanımda", + "This email address was not found": "Bu e-posta adresi bulunamadı", + "%(actionVerb)s this person?": "Bu kişi %(actionVerb)s yapılsın mı ?", + "The email address linked to your account must be entered.": "Hesabınıza bağlı e-posta adresi girilmelidir.", + "The file '%(fileName)s' exceeds this home server's size limit for uploads": "'%(fileName)s' dosyası bu Ana Sunucu'nun yükleme için boyutunu aşıyor", + "The file '%(fileName)s' failed to upload": "'%(fileName)s' dosyası yüklenemedi", + "The remote side failed to pick up": "Uzak taraf toplanamadı(alınamadı)", + "This Home Server does not support login using email address.": "Bu Ana Sunucu E-posta adresi kullanarak giriş yapmayı desteklemiyor.", + "This invitation was sent to an email address which is not associated with this account:": "Bu davet bu hesapla ilişkili olmayan bir e-posta adresine gönderildi :", + "There was a problem logging in.": "Oturum açarken bir sorun oluştu.", + "This room has no local addresses": "Bu oda hiçbir yerel adrese sahip değil", + "This room is not recognised.": "Bu oda tanınmıyor.", + "These are experimental features that may break in unexpected ways": "Bunlar beklenmedik yollarla bozulabilecek deneysel özellikler", + "The visibility of existing history will be unchanged": "Mevcut tarihin görünürlüğü değişmeyecek", + "This doesn't appear to be a valid email address": "Bu geçerli bir e-posta adresi olarak gözükmüyor", + "This is a preview of this room. Room interactions have been disabled": "Bu odanın bir önizlemesidir . Oda etkileşimleri devre dışı bırakıldı", + "This phone number is already in use": "Bu telefon numarası zaten kullanımda", + "This room": "Bu oda", + "This room is not accessible by remote Matrix servers": "Bu oda uzak Matrix Sunucuları tarafından erişilebilir değil", + "This room's internal ID is": "Bu odanın Dahili ID'si", + "times": "kere", + "To ban users": "Kullanıcıları yasaklamak(Ban) için", + "to browse the directory": "Dizine göz atmak için", + "To configure the room": "Odayı yapılandırmak için", + "to demote": "indirgemek için", + "to favourite": "favorilemek", + "To invite users into the room": "Kullanıcıları odaya davet etmek", + "To kick users": "Kullanıcıları atmak", + "To link to a room it must have an address.": "Bir odaya bağlanmak için oda bir adrese sahip olmalı.", + "to make a room or": "bir oda oluşturmak için ya da", + "To remove other users' messages": "Diğer kullanıcıların mesajlarını silmek için", + "To reset your password, enter the email address linked to your account": "Parolanızı sıfırlamak için hesabınıza bağlı e-posta adresinizi girin", + "to restore": "yenilemek için", + "To send events of type": "Tip olayını göndermek için", + "To send messages": "Mesaj göndermek için", + "to start a chat with someone": "birisiyle sohbet başlatmak için", + "to tag as %(tagName)s": "%(tagName)s olarak etiketlemek için", + "to tag direct chat": "doğrudan sohbeti etiketlemek için", + "To use it, just wait for autocomplete results to load and tab through them.": "Kullanmak için , otomatik tamamlama sonuçlarının yüklenmesini ve bitmesini bekleyin.", + "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Bu odanın zaman çizelgesinde belirli bir nokta yüklemeye çalışıldı , ama geçerli mesajı görüntülemeye izniniz yok.", + "Tried to load a specific point in this room's timeline, but was unable to find it.": "Bu odanın akışında belirli bir noktaya yüklemeye çalışıldı , ancak bulunamadı.", + "Turn Markdown off": "Markdown'u kapat", + "Turn Markdown on": "Markdown'u Aç", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s uçtanuca şifrelemeyi açtı (algoritma -> %(algorithm)s).", + "Unable to add email address": "E-posta adresi eklenemiyor", + "Unable to remove contact information": "Kişi bilgileri kaldırılamıyor", + "Unable to restore previous session": "Önceki oturumlar geri yüklenemiyor", + "Unable to verify email address.": "E-posta adresi doğrulanamıyor.", + "Unban": "Yasağı Kaldır", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s %(targetName)s 'in yasağını kaldırdı.", + "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Bu davetiyenin gönderildiği adresin hesabınızla ilişkili bir adresle eşleştiğini tespit etmek mümkün değil.", + "Unable to capture screen": "Ekran yakalanamadı", + "Unable to enable Notifications": "Bildirimler aktif edilemedi", + "Unable to load device list": "Cihaz listesi yüklenemedi", + "Undecryptable": "Şifresi çözülemez", + "Unencrypted room": "Şifrelenmemiş oda", + "unencrypted": "şifrelenmemiş", + "Unencrypted message": "Şifrelenmemiş mesaj", + "unknown caller": "bilinmeyen arayıcı", + "Unknown command": "Bilinmeyen komut", + "unknown device": "bilinmeyen cihaz", + "unknown error code": "bilinmeyen hata kodu", + "Unknown room %(roomId)s": "Bilinmeyen oda %(roomId)s", + "Unknown (user, device) pair:": "Bilinmeyen (kullanıcı , cihaz) çifti :", + "unknown": "bilinmeyen", + "Unmute": "Sesi aç", + "Unnamed Room": "İsimsiz Oda", + "Unrecognised command:": "Tanınmayan komut :", + "Unrecognised room alias:": "Tanınmayan oda isimleri :", + "Unverified": "Doğrulanmamış", + "Uploading %(filename)s and %(count)s others.zero": "%(filename)s yükleniyor", + "Uploading %(filename)s and %(count)s others.one": "%(filename)s ve %(count)s kadarı yükleniyor", + "Uploading %(filename)s and %(count)s others.other": "%(filename)s ve %(count)s kadarları yükleniyor", + "uploaded a file": "bir dosya yüklendi", + "Upload avatar": "Avatar yükle", + "Upload Failed": "Yükleme Başarısız", + "Upload Files": "Dosyaları Yükle", + "Upload file": "Dosya yükle", + "Upload new:": "Yeni yükle :", + "Usage": "Kullanım", + "Use compact timeline layout": "Kompakt zaman akışı düzenini kullan", + "Use with caution": "Dikkatli kullan", + "User ID": "Kullanıcı ID", + "User Interface": "Kullanıcı Arayüzü", + "%(user)s is a": "%(user)s bir", + "User name": "Kullanıcı ismi", + "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (güç %(powerLevelNumber)s)", + "Username invalid: %(errMessage)s": "Kullanıcı ismi geçersiz : %(errMessage)s", + "Users": "Kullanıcılar", + "User": "Kullanıcı", + "Verification Pending": "Bekleyen doğrulama", + "Verification": "Doğrulama", + "verified": "doğrulanmış", + "Verified": "Doğrulanmış", + "Verified key": "Doğrulama anahtarı", + "Video call": "Görüntülü arama", + "Voice call": "Sesli arama", + "VoIP conference finished.": "VoIP konferansı bitti.", + "VoIP conference started.": "VoIP konferansı başladı.", + "VoIP is unsupported": "VoIP desteklenmiyor", + "(could not connect media)": "(medya bağlanamadı)", + "(no answer)": "(cevap yok)", + "(unknown failure: %(reason)s)": "(bilinmeyen hata : %(reason)s)", + "(warning: cannot be disabled again!)": "(Uyarı : tekrar devre dışı bırakılamaz!)", + "Warning!": "Uyarı!", + "WARNING: Device already verified, but keys do NOT MATCH!": "UYARI: Cihaz zaten doğrulandı , ancak anahtarlar UYUŞMUYOR!", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "UYARI: ANAHTAR DOĞRULAMA BAŞARISIZ! (key verification failure). %(userId)s ve %(deviceId)s imza anahtarı sağlanan imza anahtarı \"%(fingerprint)s\" ile uyuşmayan \"%(fprint)s\". Bu iletişiminizin kesiliyor olabileceği anlamına geliyor!", + "Who can access this room?": "Bu odaya kimler erişebilir ?", + "Who can read history?": "Geçmişi kimler okuyabilir ?", + "Who would you like to add to this room?": "Bu odaya kimi eklemek istersiniz ?", + "Who would you like to communicate with?": "Kimlerle iletişim kurmak istersiniz ?", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s %(targetName)s'nin davetinden çekildi.", + "Would you like to accept or decline this invitation?": "Bu daveti kabul etmek veya reddetmek ister misiniz ?", + "You already have existing direct chats with this user:": "Bu kullanıcıyla var olan doğrudan sohbetleriniz var :", + "You are already in a call.": "Zaten bir çağrıdasınız.", + "You're not in any rooms yet! Press to make a room or to browse the directory": "Henüz hiçbir odada değilsiniz ! Oda oluşturmak için ' a basın veya Dizine göz atmak için ' e basın", + "You are trying to access %(roomName)s.": "%(roomName)s 'e erişmeye çalışıyorsunuz.", + "You cannot place a call with yourself.": "Kendinizle görüşme yapamazsınız .", + "You cannot place VoIP calls in this browser.": "Bu tarayıcıda VoIP çağrısı yapamazsınız.", + "You do not have permission to post to this room": "Bu odaya göndermeye izniniz yok", + "You have been banned from %(roomName)s by %(userName)s.": "%(roomName)s odasından %(userName)s tarafından banlandınız.", + "You have been invited to join this room by %(inviterName)s": "Bu odaya %(inviterName)s tarafından davet edildiniz", + "You have been kicked from %(roomName)s by %(userName)s.": "%(roomName)s 'dan %(userName)s tarafından atıldınız.", + "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": "Tüm cihazlardan çıkış yaptınız ve artık bildirimler almayacaksınız . Bildirimleri yeniden etkinleştirmek için , her cihazda tekrar giriş yapın", + "You have disabled URL previews by default.": "URL önizlemelerini varsayılan olarak devre dışı bıraktınız.", + "You have enabled URL previews by default.": "URL önizlemelerini varsayılan olarak etkinleştirdiniz .", + "You have entered an invalid contact. Try using their Matrix ID or email address.": "Geçersiz bir kişi girdiniz . Matrix ID veya e-posta adresini kullanarak tekrar deneyin.", + "You have no visible notifications": "Hiçbir görünür bildiriminiz yok", + "You may wish to login with a different account, or add this email to this account.": "Farklı bir hesap ile giriş yapmak veya bu e-postayı bu hesaba eklemek istemiş olabilirsiniz.", + "you must be a": "olabilirsiniz", + "You must register to use this functionality": "Bu işlevi kullanmak için Kayıt Olun ", + "You need to be able to invite users to do that.": "Bunu yapmak için kullanıcıları davet etmeye ihtiyacınız var.", + "You need to be logged in.": "Oturum açmanız gerekiyor.", + "You need to enter a user name.": "Bir kullanıcı ismi girmeniz gerekiyor.", + "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.": "Bu cihaz için uçtan uca şifreleme anahtarları oluşturmak için yeniden giriş yapmanız ve genel anahtarı Ana Sunucu'nuza göndermeniz gerekir . Bu bir kez kapalı ; rahatsızlıktan dolayı özür dileriz.", + "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "E-posta adresiniz bu Ana Sunucu'da ki Matrix ID'si ile ilişkili gözükmüyor.", + "Your password has been reset": "Şifreniz sıfırlandı", + "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Şifreniz başarıyla değiştirildi . Diğer cihazlara girene kadar onlara bildirim almayacaksınız", + "You seem to be in a call, are you sure you want to quit?": "Bir çağrıda gözüküyorsunuz , çıkmak istediğinizden emin misiniz ?", + "You seem to be uploading files, are you sure you want to quit?": "Dosya yüklüyorsunuz gibi görünüyor , çıkmak istediğinizden emin misiniz ?", + "You should not yet trust it to secure data": "Verilerin güvenliğini sağlamak için henüz güvenmemelisiniz", + "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Kullanıcıyı sizinle aynı güç seviyesine yükseltirken , bu değişikliği geri alamazsınız.", + "Your home server does not support device management.": "Ana Sunucunuz cihaz yönetimini desteklemiyor.", + "Sun": "Pzt", + "Mon": "Pazartesi", + "Tue": "Salı", + "Wed": "Çarşamba", + "Thu": "Perşembe", + "Fri": "Cuma", + "Sat": "Cumartesi", + "Jan": "Ocak", + "Feb": "Şubat", + "Mar": "Mart", + "Apr": "Nisan", + "May": "Mayıs", + "Jun": "Haziran", + "Jul": "Temmuz", + "Aug": "Ağustos", + "Sep": "Eylül", + "Oct": "Ekim", + "Nov": "Kasım", + "Dec": "Aralık", + "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s , %(monthName)s %(day)s %(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "Hafta - %(weekDayName)s , %(day)s -%(monthName)s -%(fullYear)s , %(time)s", + "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", + "Set a display name:": "Görünür isim ayarla :", + "Set a Display Name": "Görünür bir isim Ayarla", + "Upload an avatar:": "Bir Avatar yükle :", + "This server does not support authentication with a phone number.": "Bu sunucu bir telefon numarası ile kimlik doğrulamayı desteklemez.", + "Missing password.": "Şifre eksik.", + "Passwords don't match.": "Şifreler eşleşmiyor.", + "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Şifre çok kısa (minimum %(MIN_PASSWORD_LENGTH)s).", + "This doesn't look like a valid email address.": "Bu geçerli bir e-posta adresi gibi gözükmüyor.", + "This doesn't look like a valid phone number.": "Bu geçerli bir telefon numarası gibi gözükmüyor.", + "User names may only contain letters, numbers, dots, hyphens and underscores.": "Kullanıcı isimleri yalnızca harfler , sayılar , noktalar , tire ve altçizgiler içerebilir.", + "An unknown error occurred.": "Bilinmeyen bir hata meydana geldi.", + "I already have an account": "Zaten bir hesabım var", + "An error occurred: %(error_string)s": "Bir hata oluştu : %(error_string)s", + "Topic": "Konu", + "Make Moderator": "Moderatör Yap", + "Make this room private": "Bu odayı özel yap", + "Share message history with new users": "İleti geçmişini yeni kullanıcılarla paylaş", + "Encrypt room": "Odayı Şifrele", + "There are no visible files in this room": "Bu odada görünür hiçbir dosya yok", + "Room": "Oda", + "Connectivity to the server has been lost.": "Sunucuyla olan bağlantı kesildi.", + "Sent messages will be stored until your connection has returned.": "Gönderilen iletiler bağlantınız geri gelene kadar saklanacak.", + "Auto-complete": "Otomatik tamamlama", + "Resend all or cancel all now. You can also select individual messages to resend or cancel.": " Hepsini yeniden gönderin veya Hepsini iptal edin şimdi . Ayrıca yeniden göndermek veya iptal etmek için özel iletiler seçebilirsin.", + "(~%(count)s results).one": "(~%(count)s sonuç)", + "(~%(count)s results).other": "(~%(count)s sonuçlar)", + "Cancel": "İptal Et", + "or": "veya", + "Active call": "Aktif çağrı", + "Monday": "Pazartesi", + "Tuesday": "Salı", + "Wednesday": "Çarşamba", + "Thursday": "Perşembe", + "Friday": "Cuma", + "Saturday": "Cumartesi", + "Sunday": "Pazar", + "bold": "kalın", + "italic": "italik", + "strike": "vurgulu", + "underline": "altı çizili", + "code": "kod", + "quote": "alıntı", + "bullet": "Madde (bullet)", + "numbullet": "Sayı madde işareti (numbullet)", + "%(severalUsers)sjoined %(repeats)s times": "%(severalUsers)s %(repeats)s kere katıldı", + "%(oneUser)sjoined %(repeats)s times": "%(oneUser)s %(repeats)s kez katıldı", + "%(severalUsers)sjoined": "%(severalUsers)s katıldı", + "%(oneUser)sjoined": "%(oneUser)s katıldı", + "%(severalUsers)sleft %(repeats)s times": "%(severalUsers)s %(repeats)s kez ayrıldı", + "%(oneUser)sleft %(repeats)s times": "%(oneUser)s %(repeats)s kez ayrıldı", + "%(severalUsers)sleft": "%(severalUsers)s ayrıldı", + "%(oneUser)sleft": "%(oneUser)s ayrıldı", + "%(severalUsers)sjoined and left %(repeats)s times": "%(severalUsers)s %(repeats)s kere katıldı ve ayrıldı", + "%(oneUser)sjoined and left %(repeats)s times": "%(oneUser)s %(repeats)s kez katıldı ve ayrıldı", + "%(severalUsers)sjoined and left": "%(severalUsers)s katıldı ve ayrıldı", + "%(oneUser)sjoined and left": "%(oneUser)s katıldı ve ayrıldı", + "%(severalUsers)sleft and rejoined %(repeats)s times": "%(severalUsers)s %(repeats)s kere ayrıldı ve tekrar katıldı", + "%(oneUser)sleft and rejoined %(repeats)s times": "%(oneUser)s ayrıldı ve %(repeats)s kere yeniden katıldı", + "%(severalUsers)sleft and rejoined": "%(severalUsers)s ayrıldı ve yeniden katıldı", + "%(oneUser)sleft and rejoined": "%(oneUser)s ayrıldı ve tekrar katıldı", + "%(severalUsers)srejected their invitations %(repeats)s times": "%(severalUsers)s %(repeats)s kere davetiyelerini reddetti", + "%(oneUser)srejected their invitation %(repeats)s times": "%(oneUser)s %(repeats)s kere davetiyeleri reddetti", + "%(severalUsers)srejected their invitations": "%(severalUsers)s davetiyelerini reddetti", + "%(oneUser)srejected their invitation": "%(oneUser)s davetiyeyi reddetti", + "%(severalUsers)shad their invitations withdrawn %(repeats)s times": "%(severalUsers)s %(repeats)s kere davetiyelerinden çekildi", + "%(oneUser)shad their invitation withdrawn %(repeats)s times": "%(oneUser)s %(repeats)s kere davetiyesinden çekildi", + "%(severalUsers)shad their invitations withdrawn": "%(severalUsers)s davetiyelerinden çekildi", + "%(oneUser)shad their invitation withdrawn": "%(oneUser)s davetiyesini geri çekti", + "were invited %(repeats)s times": "%(repeats)s kere davet edildi/edildiler", + "was invited %(repeats)s times": "%(repeats)s kere davet edildi", + "were invited": "davet edildi", + "was invited": "davet edildi", + "were banned %(repeats)s times": "%(repeats)s kere engellendi (banlandı)", + "was banned %(repeats)s times": "%(repeats)s kere engellendi (banlandı)", + "were banned": "engellendi (banlandı)", + "was banned": "engellendi (banlandı)", + "were unbanned %(repeats)s times": "%(repeats)s kere engelleri kaldırıldı", + "was unbanned %(repeats)s times": "%(repeats)s kere engelleri kaldırıldı", + "were unbanned": "engeli kaldırıldı", + "was unbanned": "engeli kaldırıldı", + "were kicked %(repeats)s times": "%(repeats)s kere atıldı", + "was kicked %(repeats)s times": "%(repeats)s kere atıldı", + "were kicked": "atıldı", + "was kicked": "atıldı", + "%(severalUsers)schanged their name %(repeats)s times": "%(severalUsers)s %(repeats)s kere isimlerini değiştirdi", + "%(oneUser)schanged their name %(repeats)s times": "%(oneUser)s %(repeats)s kere ismini değiştirdi", + "%(severalUsers)schanged their name": "%(severalUsers)s isminlerini değiştirdi", + "%(oneUser)schanged their name": "%(oneUser)s ismini değiştirdi", + "%(severalUsers)schanged their avatar %(repeats)s times": "%(severalUsers)s %(repeats)s kere Avatarlarını değiştirdi", + "%(oneUser)schanged their avatar %(repeats)s times": "%(oneUser)s %(repeats)s kere Avatarını değiştirdi", + "%(severalUsers)schanged their avatar": "%(severalUsers)s Avatarını değiştirdi", + "%(oneUser)schanged their avatar": "%(oneUser)s Avatarını değiştirdi", + "Please select the destination room for this message": "Bu ileti için lütfen hedef oda seçin", + "Create new room": "Yeni Oda Oluştur", + "Welcome page": "Karşılama sayfası", + "Room directory": "Oda Rehberi", + "Start chat": "Sohbet Başlat", + "New Password": "Yeni Şifre", + "Start automatically after system login": "Sisteme giriş yaptıktan sonra otomatik başlat", + "Desktop specific": "Masaüstüne özgü", + "Analytics": "Analitik", + "Opt out of analytics": "Analytics'ten çıkmak", + "Options": "Seçenekler", + "Riot collects anonymous analytics to allow us to improve the application.": "Riot , uygulamayı iyileştirmemize izin vermek için anonim analitik toplar.", + "Passphrases must match": "Şifrenin eşleşmesi gerekir", + "Passphrase must not be empty": "Şifrenin boş olmaması gerekir", + "Export room keys": "Oda anahtarlarını dışa aktar", + "Confirm passphrase": "Şifreyi onayla", + "Import room keys": "Oda anahtarlarını içe aktar", + "File to import": "Alınacak Dosya", + "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Bu işlem şifreli odalarda aldığınız iletilerin anahtarlarını yerel dosyaya vermenizi sağlar . Bundan sonra dosyayı ileride başka bir Matrix istemcisine de aktarabilirsiniz , böylece istemci bu mesajların şifresini çözebilir (decryption).", + "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Dışa aktarılan dosya , onu okuyabilen herkesin sizin görebildiğiniz iletilerin şifresini çözmesine olanak tanır , bu nedenle güvenliğini korumaya özen göstermelisiniz. Buna yardımcı olmak için , dışa aktarılan verileri şifrelemek için kullanılacak bir şifre girmelisiniz . Verileri yalnızca aynı şifreyi kullanarak içe aktarmak mümkün olacaktır.", + "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Bu işlem , geçmişte başka Matrix istemcisinden dışa aktardığınız şifreleme anahtarlarınızı içe aktarmanızı sağlar . Böylece diğer istemcinin çözebileceği tüm iletilerin şifresini çözebilirsiniz.", + "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Dışa aktarma dosyası bir şifre ile korunacaktır . Dosyanın şifresini çözmek için buraya şifre girmelisiniz.", + "You must join the room to see its files": "Dosyalarını görmek için odaya katılmalısınız", + "Reject all %(invitedRooms)s invites": "Tüm %(invitedRooms)s davetlerini reddet", + "Start new chat": "Yeni sohbet başlat", + "Guest users can't invite users. Please register.": "Misafir Kullanıcılar kullanıcıları davet edemez . Lütfen kaydolun .", + "Failed to invite": "Davet edilemedi", + "Failed to invite user": "Kullanıcı davet edilemedi", + "Failed to invite the following users to the %(roomName)s room:": "Aşağıdaki kullanıcılar %(roomName)s odasına davet edilemedi :", + "Confirm Removal": "Kaldırma İşlemini Onayla", + "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.": "Bu etkinliği kaldırmak(silmek) istediğinizden emin misiniz ? Bir odayı ismini silmeniz veya konu değiştirmeniz , geri alınabilir bir durumdur.", + "Unknown error": "Bilinmeyen Hata", + "Incorrect password": "Yanlış Şifre", + "This will make your account permanently unusable. You will not be able to re-register the same user ID.": "Bu hesabınızı kalıcı olarak kullanılamaz yapılacak . Aynı kullanıcı ID ile yeniden Kayıt olamazsınız .", + "This action is irreversible.": "Bu eylem geri döndürülemez.", + "To continue, please enter your password.": "Devam etmek için , lütfen şifrenizi girin.", + "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "Bu cihazın güvenilir olabileceğini doğrulamak için , lütfen sahibiyle başka yollarla iletişim kurun (örn. şahsen veya telefon görüşmesi) ve bu cihazın Kullanıcı Ayarları'nda gördükleri anahtarın aşağıdaki anahtarla eşleşip eşleşmediğini sorun :", + "Device name": "Cihaz ismi", + "Device Name": "Cihaz İsmi", + "Device key": "Cihaz anahtarı", + "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "Eğer eşleşirse , aşağıdaki doğrulama butonuna basın . Eğer eşleşmezse , o zaman başkası bir bu cihazı tutuyor ve bunun yerine kara liste butonuna basmak istiyor olabilirsiniz.", + "In future this verification process will be more sophisticated.": "Gelecekte bu doğrulama işlemi daha gelişmiş olacak.", + "Verify device": "Cihazı Doğrula", + "I verify that the keys match": "Anahtarların uyuştuğunu doğruluyorum", + "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "Önceki oturumunuzu geri getirmeye çalışırken bir hata ile karşılaşdık . Devam ederseniz , tekrar oturum açmanız gerekecek , ve şifreli sohbet geçmişi okunamıyor hale gelecek.", + "Unable to restore session": "Oturum geri yüklenemiyor", + "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Eğer daha önce Riot'un daha yeni bir versiyonunu kullandıysanız , oturumunuz bu sürümle uyumsuz olabilir . Bu pencereyi kapatın ve daha yeni sürüme geri dönün.", + "Continue anyway": "Her halükarda devam et", + "Your display name is how you'll appear to others when you speak in rooms. What would you like it to be?": "Görünür isminiz , odalarda konuşurken başkalarına nasıl görüneceğinizdir . İsminizin ne olmasını istersiniz ?", + "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "Şu anda doğrulanmamış cihazları kara listeye alıyorsunuz , bu cihazlara mesaj göndermek için onları doğrulamanız gerekir.", + "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Her cihazın yasal sahiplerine ait olduklarını doğrulamak için doğrulama işlemini gerçekleştirmenizi öneririz, ancak tercih edip onaylamadan iletiyi tekrar gönderebilirsiniz.", + "\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" daha önce görmediğiniz cihazları içeriyor.", + "Unknown devices": "Bilinmeyen cihazlar", + "Unknown Address": "Bilinmeyen Adres", + "Unblacklist": "Karaliste Dışı", + "Blacklist": "Kara Liste", + "Unverify": "Doğrulamasını İptal Et", + "Verify...": "Doğrulama...", + "ex. @bob:example.com": "örn. @bob:example.com", + "Add User": "Kullanıcı Ekle", + "This Home Server would like to make sure you are not a robot": "Bu Ana Sunucu robot olmadığınızdan emin olmak istiyor", + "Sign in with CAS": "CAS ile oturum açın", + "Custom Server Options": "Özel Sunucu Seçenekleri", + "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "Özel Sunucu Seçeneklerini diğer Matrix sunucularına giriş yapmak için farklı bir Ana Sunucu URL'si belirleyerek kullanabilirsiniz.", + "This allows you to use this app with an existing Matrix account on a different home server.": "Bu, sizin bu uygulamayı varolan Matrix hesabınızla farklı Ana Sunucularda kullanmanıza izin verir.", + "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "Ayrıca özel bir kimlik sunucusu da ayarlayabilirsiniz ancak bu e-posta adresine dayalı olarak kullanıcılarla olan etkileşimi engeller.", + "Dismiss": "Uzaklaştır", + "Please check your email to continue registration.": "Kayıt işlemine devam etmek için lütfen e-postanızı kontrol edin.", + "Token incorrect": "Belirteç(Token) hatalı", + "A text message has been sent to": "Kısa mesaj gönderildi", + "Please enter the code it contains:": "Lütfen içerdiği kodu girin:", + "powered by Matrix": "Matrix tarafından desteklenmektedir", + "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "Eğer bir e-posta adresi belirtmezseniz , şifrenizi sıfırlayamazsınız . Emin misiniz ?", + "You are registering with %(SelectedTeamName)s": "%(SelectedTeamName)s ile kayıt oluyorsunuz", + "Default server": "Varsayılan sunucu", + "Custom server": "Özel sunucu", + "Home server URL": "Ana Sunucu URL'i", + "Identity server URL": "Kimlik Sunucusu URL'i", + "What does this mean?": "Bu ne anlama geliyor ?", + "Error decrypting audio": "Ses şifre çözme hatası", + "Error decrypting image": "Resim şifre çözme hatası", + "Image '%(Body)s' cannot be displayed.": "'%(Body)s' Resmi görüntülenemiyor.", + "This image cannot be displayed.": "Bu görüntü görüntülenemiyor.", + "Error decrypting video": "Video şifre çözme hatası", + "Add an Integration": "Entegrasyon ekleyin", + "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?": "Hesabınızı %(integrationsUrl)s ile kullanmak üzere doğrulayabilmeniz için üçüncü taraf bir siteye götürülmek üzeresiniz. Devam etmek istiyor musunuz ?", + "Removed or unknown message type": "Kaldırılmış veya bilinmeyen ileti tipi", + "Disable URL previews by default for participants in this room": "Bu odadaki katılımcılar için varsayılan olarak URL önizlemelerini devre dışı bırak", + "Disable URL previews for this room (affects only you)": "Bu oda için URL önizlemelerini devre dışı bırak (sadece sizi etkiler)", + "URL previews are %(globalDisableUrlPreview)s by default for participants in this room.": "URL önizlemeleri , bu odadaki katılımcılar için varsayılan olarak %(globalDisableUrlPreview)s dir.", + "URL Previews": "URL önizlemeleri", + "Enable URL previews for this room (affects only you)": "URL önizlemelerini bu oda için etkinleştirin (sadece sizi etkiler)", + "Drop file here to upload": "Yüklemek için dosyaları buraya bırakın", + " (unsupported)": " (desteklenmeyen)", + "Ongoing conference call%(supportedText)s.": "Devam eden konferans görüşmesi %(supportedText)s.", + "for %(amount)ss": "%(amount)s", + "for %(amount)sm": "%(amount)s", + "for %(amount)sh": "%(amount)s", + "for %(amount)sd": "%(amount)s", + "Online": "Çevrimiçi", + "Idle": "Boş", + "Offline": "Çevrimdışı", + "Start chatting": "Sohbeti başlat", + "Start Chatting": "Sohbeti Başlat", + "Click on the button below to start chatting!": "Sohbeti başlatmak için aşağıdaki butona tıklayın!", + "$senderDisplayName changed the room avatar to ": "$senderDisplayName odanın avatarını olarak çevirdi", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s odanın avatarını kaldırdı.", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s %(roomName)s için avatarı değiştirdi", + "Username available": "Kullanıcı ismi uygun", + "Username not available": "Kullanıcı ismi uygun değil", + "Something went wrong!": "Bir şeyler yanlış gitti!", + "This will be your account name on the homeserver, or you can pick a different server.": "Bu sizin Ana Sunucunuzdaki hesap adınız olacak , veya farklı sunucu seçebilirsiniz.", + "If you already have a Matrix account you can log in instead.": "Eğer Matrix hesabınız varsa , bunun yerine Giriş Yapabilirsiniz .", + "Your browser does not support the required cryptography extensions": "Tarayıcınız gerekli şifreleme uzantılarını desteklemiyor", + "Not a valid Riot keyfile": "Geçersiz bir Riot anahtar dosyası", + "Authentication check failed: incorrect password?": "Kimlik doğrulama denetimi başarısız oldu : yanlış şifre ?", + "Disable Peer-to-Peer for 1:1 calls": "1:1 Eşler arası (P2P) görüşmeyi Devre Dışı Bırak", + "Do you want to set an email address?": "Bir e-posta adresi ayarlamak ister misiniz ?", + "This will allow you to reset your password and receive notifications.": "Bu şifrenizi sıfırlamanızı ve bildirimler almanızı sağlayacak.", + "To return to your account in future you need to set a password": "Gelecekte hesabınıza dönmek için , bir şifre ayarlamanız gerekiyor", + "Skip": "Atla", + "Start verification": "Doğrulamayı başlat", + "Share without verifying": "Doğrulamadan paylaş", + "Ignore request": "İsteği yoksay", + "You added a new device '%(displayName)s', which is requesting encryption keys.": "Şifreleme anahtarları isteyen , '%(displayName)s' isminde yeni bir cihaz eklediniz .", + "Your unverified device '%(displayName)s' is requesting encryption keys.": "Tanımlanmamış cihazınız '%(displayName)s' , şifreleme anahtarlarını istiyor.", + "Encryption key request": "Şifreleme anahtarı isteği" +} diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index dd8112fa11..fab2148c47 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -151,5 +151,20 @@ "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": "Обліковка", + "%(targetName)s accepted an invitation.": "%(targetName)s прийняв запрошення.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s прийняв запрошення від %(displayName)s.", + "Access Token:": "Токен:", + "Active call (%(roomName)s)": "Активний виклик (%(roomName)s)", + "Add": "Добавити", + "Add a topic": "Добавити тему", + "Add email address": "Добавити email адресу", + "Add phone number": "Добавити телефонний номер", + "Admin": "Адмін", + "Admin tools": "Адмін утиліта", + "And %(count)s more...": "І %(count)s більше..." } diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index ad37ce9430..9fdc7a0b42 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -352,5 +352,9 @@ "Password:": "密码:", "Passwords can't be empty": "密码不能为空", "Permissions": "权限", - "Phone": "电话" + "Phone": "电话", + "Cancel": "取消", + "Create new room": "创建新房间", + "Custom Server Options": "自定义服务器选项", + "Dismiss": "设为已读" } diff --git a/src/stores/RoomViewStore.js b/src/stores/RoomViewStore.js index ac06d41e81..2f7d55b71f 100644 --- a/src/stores/RoomViewStore.js +++ b/src/stores/RoomViewStore.js @@ -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; diff --git a/src/utils/createMatrixClient.js b/src/utils/createMatrixClient.js index 5effd63f2a..2d294e262b 100644 --- a/src/utils/createMatrixClient.js +++ b/src/utils/createMatrixClient.js @@ -18,6 +18,13 @@ import Matrix from 'matrix-js-sdk'; const localStorage = window.localStorage; +// just *accessing* indexedDB throws an exception in firefox with +// indexeddb disabled. +let indexedDB; +try { + indexedDB = window.indexedDB; +} catch(e) {} + /** * Create a new matrix client, with the persistent stores set up appropriately * (using localstorage/indexeddb, etc) @@ -25,27 +32,28 @@ const localStorage = window.localStorage; * @param {Object} opts options to pass to Matrix.createClient. This will be * extended with `sessionStore` and `store` members. * - * @param {string} indexedDbWorkerScript Optional URL for a web worker script - * for IndexedDB store operations. If not given, indexeddb ops are done on + * @property {string} indexedDbWorkerScript Optional URL for a web worker script + * for IndexedDB store operations. By default, indexeddb ops are done on * the main thread. * * @returns {MatrixClient} the newly-created MatrixClient */ -export default function createMatrixClient(opts, indexedDbWorkerScript) { +export default function createMatrixClient(opts) { const storeOpts = {}; if (localStorage) { storeOpts.sessionStore = new Matrix.WebStorageSessionStore(localStorage); } - if (window.indexedDB && localStorage) { + + if (indexedDB && localStorage) { // FIXME: bodge to remove old database. Remove this after a few weeks. - window.indexedDB.deleteDatabase("matrix-js-sdk:default"); + indexedDB.deleteDatabase("matrix-js-sdk:default"); storeOpts.store = new Matrix.IndexedDBStore({ - indexedDB: window.indexedDB, + indexedDB: indexedDB, dbName: "riot-web-sync", localStorage: localStorage, - workerScript: indexedDbWorkerScript, + workerScript: createMatrixClient.indexedDbWorkerScript, }); } @@ -53,3 +61,5 @@ export default function createMatrixClient(opts, indexedDbWorkerScript) { return Matrix.createClient(opts); } + +createMatrixClient.indexedDbWorkerScript = null;