diff --git a/res/css/views/dialogs/keybackup/_CreateKeyBackupDialog.scss b/res/css/views/dialogs/keybackup/_CreateKeyBackupDialog.scss index 04ee575867..b9babd05f5 100644 --- a/res/css/views/dialogs/keybackup/_CreateKeyBackupDialog.scss +++ b/res/css/views/dialogs/keybackup/_CreateKeyBackupDialog.scss @@ -85,3 +85,9 @@ limitations under the License. flex: 1; white-space: nowrap; } + +.mx_CreateKeyBackupDialog { + details .mx_AccessibleButton { + margin: 1em 0; // emulate paragraph spacing because we can't put this button in a paragraph due to HTML rules + } +} diff --git a/res/css/views/right_panel/_VerificationPanel.scss b/res/css/views/right_panel/_VerificationPanel.scss index 827f2a2c49..2a733d11a7 100644 --- a/res/css/views/right_panel/_VerificationPanel.scss +++ b/res/css/views/right_panel/_VerificationPanel.scss @@ -37,3 +37,70 @@ limitations under the License. } } } + +// Special case styling for EncryptionPanel in a Modal dialog +.mx_Dialog, .mx_CompleteSecurity_body { + .mx_VerificationPanel_QRPhase_startOptions { + display: flex; + margin-top: 10px; + margin-bottom: 10px; + align-items: stretch; + + > .mx_VerificationPanel_QRPhase_betweenText { + width: 50px; + vertical-align: middle; + text-align: center; + display: flex; + align-items: center; + justify-content: center; + } + + .mx_VerificationPanel_QRPhase_startOption { + background-color: $user-tile-hover-bg-color; + border-radius: 10px; + flex: 1; + display: flex; + padding: 10px; + align-items: center; + flex-direction: column; + position: relative; + + canvas, .mx_VerificationPanel_QRPhase_noQR { + width: 220px !important; + height: 220px !important; + background-color: #fff; + border-radius: 4px; + vertical-align: middle; + text-align: center; + padding: 10px; + } + + > p { + font-weight: 700; + } + + .mx_VerificationPanel_QRPhase_helpText { + font-size: 14px; + margin-top: 71px; + text-align: center; + } + + .mx_AccessibleButton { + position: absolute; + bottom: 30px; + } + } + } + + // EncryptionPanel when verification is done + .mx_VerificationPanel_verified_section { + // center the big shield icon + .mx_E2EIcon { + margin: 0 auto; + } + // right align the "Got it" button + .mx_AccessibleButton { + float: right; + } + } +} diff --git a/res/css/views/rooms/_WhoIsTypingTile.scss b/res/css/views/rooms/_WhoIsTypingTile.scss index ef20c24c84..579ea7e73e 100644 --- a/res/css/views/rooms/_WhoIsTypingTile.scss +++ b/res/css/views/rooms/_WhoIsTypingTile.scss @@ -31,14 +31,15 @@ limitations under the License. margin-left: -12px; } -.mx_WhoIsTypingTile_avatars .mx_BaseAvatar_image { - border: 1px solid $primary-bg-color; -} - .mx_WhoIsTypingTile_avatars .mx_BaseAvatar_initial { padding-top: 1px; } +.mx_WhoIsTypingTile_avatars .mx_BaseAvatar { + border: 1px solid $primary-bg-color; + border-radius: 40px; +} + .mx_WhoIsTypingTile_remainingAvatarPlaceholder { position: relative; display: inline-block; diff --git a/src/Analytics.js b/src/Analytics.js index d0c7a52814..39731a0e7d 100644 --- a/src/Analytics.js +++ b/src/Analytics.js @@ -1,18 +1,21 @@ /* - Copyright 2017 Michael Telatynski <7t3chguy@gmail.com> +Copyright 2017 Michael Telatynski <7t3chguy@gmail.com> +Copyright 2020 The Matrix.org Foundation C.I.C. - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +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 + 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. - */ +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from 'react'; import { getCurrentLanguage, _t, _td } from './languageHandler'; import PlatformPeg from './PlatformPeg'; @@ -106,61 +109,80 @@ function whitelistRedact(whitelist, str) { return ''; } +const UID_KEY = "mx_Riot_Analytics_uid"; +const CREATION_TS_KEY = "mx_Riot_Analytics_cts"; +const VISIT_COUNT_KEY = "mx_Riot_Analytics_vc"; +const LAST_VISIT_TS_KEY = "mx_Riot_Analytics_lvts"; + +function getUid() { + try { + let data = localStorage.getItem(UID_KEY); + if (!data) { + localStorage.setItem(UID_KEY, data = [...Array(16)].map(() => Math.random().toString(16)[2]).join('')); + } + return data; + } catch (e) { + console.error("Analytics error: ", e); + return ""; + } +} + +const HEARTBEAT_INTERVAL = 30 * 1000; // seconds + class Analytics { constructor() { - this._paq = null; - this.disabled = true; + this.baseUrl = null; + this.siteId = null; + this.visitVariables = {}; + this.firstPage = true; + this._heartbeatIntervalID = null; + + this.creationTs = localStorage.getItem(CREATION_TS_KEY); + if (!this.creationTs) { + localStorage.setItem(CREATION_TS_KEY, this.creationTs = new Date().getTime()); + } + + this.lastVisitTs = localStorage.getItem(LAST_VISIT_TS_KEY); + this.visitCount = localStorage.getItem(VISIT_COUNT_KEY) || 0; + localStorage.setItem(VISIT_COUNT_KEY, parseInt(this.visitCount, 10) + 1); + } + + get disabled() { + return !this.baseUrl; } /** * Enable Analytics if initialized but disabled * otherwise try and initalize, no-op if piwik config missing */ - enable() { - if (this._paq || this._init()) { - this.disabled = false; - } - } + async enable() { + if (!this.disabled) return; - /** - * Disable Analytics calls, will not fully unload Piwik until a refresh, - * but this is second best, Piwik should not pull anything implicitly. - */ - disable() { - this.trackEvent('Analytics', 'opt-out'); - // disableHeartBeatTimer is undocumented but exists in the piwik code - // the _paq.push method will result in an error being printed in the console - // if an unknown method signature is passed - this._paq.push(['disableHeartBeatTimer']); - this.disabled = true; - } - - _init() { const config = SdkConfig.get(); if (!config || !config.piwik || !config.piwik.url || !config.piwik.siteId) return; - const url = config.piwik.url; - const siteId = config.piwik.siteId; - const self = this; - - window._paq = this._paq = window._paq || []; - - this._paq.push(['setTrackerUrl', url+'piwik.php']); - this._paq.push(['setSiteId', siteId]); - - this._paq.push(['trackAllContentImpressions']); - this._paq.push(['discardHashTag', false]); - this._paq.push(['enableHeartBeatTimer']); - // this._paq.push(['enableLinkTracking', true]); + this.baseUrl = new URL("piwik.php", config.piwik.url); + // set constants + this.baseUrl.searchParams.set("rec", 1); // rec is required for tracking + this.baseUrl.searchParams.set("idsite", config.piwik.siteId); // rec is required for tracking + this.baseUrl.searchParams.set("apiv", 1); // API version to use + this.baseUrl.searchParams.set("send_image", 0); // we want a 204, not a tiny GIF + // set user parameters + this.baseUrl.searchParams.set("_id", getUid()); // uuid + this.baseUrl.searchParams.set("_idts", this.creationTs); // first ts + this.baseUrl.searchParams.set("_idvc", parseInt(this.visitCount, 10)+ 1); // visit count + if (this.lastVisitTs) { + this.baseUrl.searchParams.set("_viewts", this.lastVisitTs); // last visit ts + } const platform = PlatformPeg.get(); this._setVisitVariable('App Platform', platform.getHumanReadableName()); - platform.getAppVersion().then((version) => { - this._setVisitVariable('App Version', version); - }).catch(() => { + try { + this._setVisitVariable('App Version', await platform.getAppVersion()); + } catch (e) { this._setVisitVariable('App Version', 'unknown'); - }); + } this._setVisitVariable('Chosen Language', getCurrentLanguage()); @@ -168,20 +190,64 @@ class Analytics { this._setVisitVariable('Instance', window.location.pathname); } - (function() { - const g = document.createElement('script'); - const s = document.getElementsByTagName('script')[0]; - g.type='text/javascript'; g.async=true; g.defer=true; g.src=url+'piwik.js'; + // start heartbeat + this._heartbeatIntervalID = window.setInterval(this.ping.bind(this), HEARTBEAT_INTERVAL); + } - g.onload = function() { - console.log('Initialised anonymous analytics'); - self._paq = window._paq; - }; + /** + * Disable Analytics, stop the heartbeat and clear identifiers from localStorage + */ + disable() { + if (this.disabled) return; + this.trackEvent('Analytics', 'opt-out'); + window.clearInterval(this._heartbeatIntervalID); + this.baseUrl = null; + this.visitVariables = {}; + localStorage.removeItem(UID_KEY); + localStorage.removeItem(CREATION_TS_KEY); + localStorage.removeItem(VISIT_COUNT_KEY); + localStorage.removeItem(LAST_VISIT_TS_KEY); + } - s.parentNode.insertBefore(g, s); - })(); + async _track(data) { + if (this.disabled) return; - return true; + const now = new Date(); + const params = { + ...data, + url: getRedactedUrl(), + + _cvar: JSON.stringify(this.visitVariables), // user custom vars + res: `${window.screen.width}x${window.screen.height}`, // resolution as WWWWxHHHH + rand: String(Math.random()).slice(2, 8), // random nonce to cache-bust + h: now.getHours(), + m: now.getMinutes(), + s: now.getSeconds(), + }; + + const url = new URL(this.baseUrl); + for (const key in params) { + url.searchParams.set(key, params[key]); + } + + try { + await window.fetch(url, { + method: "GET", + mode: "no-cors", + cache: "no-cache", + redirect: "follow", + }); + } catch (e) { + console.error("Analytics error: ", e); + window.err = e; + } + } + + ping() { + this._track({ + ping: 1, + }); + localStorage.setItem(LAST_VISIT_TS_KEY, new Date().getTime()); // update last visit ts } trackPageChange(generationTimeMs) { @@ -193,31 +259,29 @@ class Analytics { return; } - if (typeof generationTimeMs === 'number') { - this._paq.push(['setGenerationTimeMs', generationTimeMs]); - } else { + if (typeof generationTimeMs !== 'number') { console.warn('Analytics.trackPageChange: expected generationTimeMs to be a number'); // But continue anyway because we still want to track the change } - this._paq.push(['setCustomUrl', getRedactedUrl()]); - this._paq.push(['trackPageView']); + this._track({ + gt_ms: generationTimeMs, + }); } trackEvent(category, action, name, value) { if (this.disabled) return; - this._paq.push(['setCustomUrl', getRedactedUrl()]); - this._paq.push(['trackEvent', category, action, name, value]); - } - - logout() { - if (this.disabled) return; - this._paq.push(['deleteCookies']); + this._track({ + e_c: category, + e_a: action, + e_n: name, + e_v: value, + }); } _setVisitVariable(key, value) { if (this.disabled) return; - this._paq.push(['setCustomVariable', customVariables[key].id, key, value, 'visit']); + this.visitVariables[customVariables[key].id] = [key, value]; } setLoggedIn(isGuest, homeserverUrl, identityServerUrl) { @@ -234,23 +298,16 @@ class Analytics { this._setVisitVariable('Identity Server URL', whitelistRedact(whitelistedISUrls, identityServerUrl)); } - setRichtextMode(state) { - if (this.disabled) return; - this._setVisitVariable('RTE: Uses Richtext Mode', state ? 'on' : 'off'); - } - setBreadcrumbs(state) { if (this.disabled) return; this._setVisitVariable('Breadcrumbs', state ? 'enabled' : 'disabled'); } - showDetailsModal() { + showDetailsModal = () => { let rows = []; - if (window.Piwik) { - const Tracker = window.Piwik.getAsyncTracker(); - rows = Object.values(customVariables).map((v) => Tracker.getCustomVariable(v.id)).filter(Boolean); + if (!this.disabled) { + rows = Object.values(this.visitVariables); } else { - // Piwik may not have been enabled, so show example values rows = Object.keys(customVariables).map( (k) => [ k, @@ -300,7 +357,7 @@ class Analytics { , }); - } + }; } if (!global.mxAnalytics) { diff --git a/src/CrossSigningManager.js b/src/CrossSigningManager.js index 694b2b0a25..f19be03574 100644 --- a/src/CrossSigningManager.js +++ b/src/CrossSigningManager.js @@ -148,18 +148,21 @@ export const crossSigningCallbacks = { * * @param {Function} [func] An operation to perform once secret storage has been * bootstrapped. Optional. + * @param {bool} [force] Reset secret storage even if it's already set up */ -export async function accessSecretStorage(func = async () => { }) { +export async function accessSecretStorage(func = async () => { }, force = false) { const cli = MatrixClientPeg.get(); secretStorageBeingAccessed = true; - try { - if (!await cli.hasSecretStorageKey()) { + if (!await cli.hasSecretStorageKey() || force) { // This dialog calls bootstrap itself after guiding the user through // passphrase creation. const { finished } = Modal.createTrackedDialogAsync('Create Secret Storage dialog', '', import("./async-components/views/dialogs/secretstorage/CreateSecretStorageDialog"), - null, null, /* priority = */ false, /* static = */ true, + { + force, + }, + null, /* priority = */ false, /* static = */ true, ); const [confirmed] = await finished; if (!confirmed) { diff --git a/src/Lifecycle.js b/src/Lifecycle.js index 303bae42b1..24bf99ed24 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -632,7 +632,7 @@ export async function onLoggedOut() { * @returns {Promise} promise which resolves once the stores have been cleared */ async function _clearStorage() { - Analytics.logout(); + Analytics.disable(); if (window.localStorage) { window.localStorage.clear(); diff --git a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js index 8fe9373218..f89fb17448 100644 --- a/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js +++ b/src/async-components/views/dialogs/keybackup/CreateKeyBackupDialog.js @@ -24,6 +24,7 @@ import { scorePassword } from '../../../../utils/PasswordScorer'; import { _t } from '../../../../languageHandler'; import { accessSecretStorage } from '../../../../CrossSigningManager'; import SettingsStore from '../../../../settings/SettingsStore'; +import AccessibleButton from "../../../../components/views/elements/AccessibleButton"; const PHASE_PASSPHRASE = 0; const PHASE_PASSPHRASE_CONFIRM = 1; @@ -191,44 +192,38 @@ export default class CreateKeyBackupDialog extends React.PureComponent { }); } - _onPassPhraseNextClick = () => { - this.setState({phase: PHASE_PASSPHRASE_CONFIRM}); - } + _onPassPhraseNextClick = async (e) => { + e.preventDefault(); - _onPassPhraseKeyPress = async (e) => { - if (e.key === 'Enter') { - // If we're waiting for the timeout before updating the result at this point, - // skip ahead and do it now, otherwise we'll deny the attempt to proceed - // even if the user entered a valid passphrase - if (this._setZxcvbnResultTimeout !== null) { - clearTimeout(this._setZxcvbnResultTimeout); - this._setZxcvbnResultTimeout = null; - await new Promise((resolve) => { - this.setState({ - zxcvbnResult: scorePassword(this.state.passPhrase), - }, resolve); - }); - } - if (this._passPhraseIsValid()) { - this._onPassPhraseNextClick(); - } + // If we're waiting for the timeout before updating the result at this point, + // skip ahead and do it now, otherwise we'll deny the attempt to proceed + // even if the user entered a valid passphrase + if (this._setZxcvbnResultTimeout !== null) { + clearTimeout(this._setZxcvbnResultTimeout); + this._setZxcvbnResultTimeout = null; + await new Promise((resolve) => { + this.setState({ + zxcvbnResult: scorePassword(this.state.passPhrase), + }, resolve); + }); } - } + if (this._passPhraseIsValid()) { + this.setState({phase: PHASE_PASSPHRASE_CONFIRM}); + } + }; + + _onPassPhraseConfirmNextClick = async (e) => { + e.preventDefault(); + + if (this.state.passPhrase !== this.state.passPhraseConfirm) return; - _onPassPhraseConfirmNextClick = async () => { this._keyBackupInfo = await MatrixClientPeg.get().prepareKeyBackupVersion(this.state.passPhrase); this.setState({ copied: false, downloaded: false, phase: PHASE_SHOWKEY, }); - } - - _onPassPhraseConfirmKeyPress = (e) => { - if (e.key === 'Enter' && this.state.passPhrase === this.state.passPhraseConfirm) { - this._onPassPhraseConfirmNextClick(); - } - } + }; _onSetAgainClick = () => { this.setState({ @@ -299,7 +294,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent { ; } - return
+ return

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

- {_t("Advanced")} -

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

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

@@ -380,7 +375,6 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
- -
; + ; } _renderPhaseShowKey() { diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js index 679b3907d1..84b94ab64c 100644 --- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js @@ -55,10 +55,12 @@ export default class CreateSecretStorageDialog extends React.PureComponent { static propTypes = { hasCancel: PropTypes.bool, accountPassword: PropTypes.string, + force: PropTypes.bool, }; static defaultProps = { hasCancel: true, + force: false, }; constructor(props) { @@ -107,7 +109,8 @@ export default class CreateSecretStorageDialog extends React.PureComponent { MatrixClientPeg.get().isCryptoEnabled() && await MatrixClientPeg.get().isKeyBackupTrusted(backupInfo) ); - const phase = backupInfo ? PHASE_MIGRATE : PHASE_PASSPHRASE; + const { force } = this.props; + const phase = (backupInfo && !force) ? PHASE_MIGRATE : PHASE_PASSPHRASE; this.setState({ phase, @@ -219,13 +222,24 @@ export default class CreateSecretStorageDialog extends React.PureComponent { const cli = MatrixClientPeg.get(); + const { force } = this.props; + try { - await cli.bootstrapSecretStorage({ - authUploadDeviceSigningKeys: this._doBootstrapUIAuth, - createSecretStorageKey: async () => this._keyInfo, - keyBackupInfo: this.state.backupInfo, - setupNewKeyBackup: !this.state.backupInfo && this.state.useKeyBackup, - }); + if (force) { + await cli.bootstrapSecretStorage({ + authUploadDeviceSigningKeys: this._doBootstrapUIAuth, + createSecretStorageKey: async () => this._keyInfo, + setupNewKeyBackup: true, + setupNewSecretStorage: true, + }); + } else { + await cli.bootstrapSecretStorage({ + authUploadDeviceSigningKeys: this._doBootstrapUIAuth, + createSecretStorageKey: async () => this._keyInfo, + keyBackupInfo: this.state.backupInfo, + setupNewKeyBackup: !this.state.backupInfo && this.state.useKeyBackup, + }); + } this.setState({ phase: PHASE_DONE, }); @@ -289,31 +303,31 @@ export default class CreateSecretStorageDialog extends React.PureComponent { }); } - _onPassPhraseNextClick = () => { - this.setState({phase: PHASE_PASSPHRASE_CONFIRM}); - } + _onPassPhraseNextClick = async (e) => { + e.preventDefault(); - _onPassPhraseKeyPress = async (e) => { - if (e.key === 'Enter') { - // If we're waiting for the timeout before updating the result at this point, - // skip ahead and do it now, otherwise we'll deny the attempt to proceed - // even if the user entered a valid passphrase - if (this._setZxcvbnResultTimeout !== null) { - clearTimeout(this._setZxcvbnResultTimeout); - this._setZxcvbnResultTimeout = null; - await new Promise((resolve) => { - this.setState({ - zxcvbnResult: scorePassword(this.state.passPhrase), - }, resolve); - }); - } - if (this._passPhraseIsValid()) { - this._onPassPhraseNextClick(); - } + // If we're waiting for the timeout before updating the result at this point, + // skip ahead and do it now, otherwise we'll deny the attempt to proceed + // even if the user entered a valid passphrase + if (this._setZxcvbnResultTimeout !== null) { + clearTimeout(this._setZxcvbnResultTimeout); + this._setZxcvbnResultTimeout = null; + await new Promise((resolve) => { + this.setState({ + zxcvbnResult: scorePassword(this.state.passPhrase), + }, resolve); + }); } - } + if (this._passPhraseIsValid()) { + this.setState({phase: PHASE_PASSPHRASE_CONFIRM}); + } + }; + + _onPassPhraseConfirmNextClick = async (e) => { + e.preventDefault(); + + if (this.state.passPhrase !== this.state.passPhraseConfirm) return; - _onPassPhraseConfirmNextClick = async () => { const [keyInfo, encodedRecoveryKey] = await MatrixClientPeg.get().createRecoveryKeyFromPassphrase(this.state.passPhrase); this._keyInfo = keyInfo; @@ -325,12 +339,6 @@ export default class CreateSecretStorageDialog extends React.PureComponent { }); } - _onPassPhraseConfirmKeyPress = (e) => { - if (e.key === 'Enter' && this.state.passPhrase === this.state.passPhraseConfirm) { - this._onPassPhraseConfirmNextClick(); - } - } - _onSetAgainClick = () => { this.setState({ passPhrase: '', @@ -400,7 +408,8 @@ export default class CreateSecretStorageDialog extends React.PureComponent { } else if (this.state.canUploadKeysWithPasswordOnly) { authPrompt =
{_t("Enter your account password to confirm the upgrade:")}
-
{authPrompt}
- @@ -467,7 +476,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
; } - return
+ return

{_t( "Set up encryption on this session to allow it to verify other sessions, " + "granting them access to encrypted messages and marking them as trusted for other users.", @@ -483,10 +492,10 @@ export default class CreateSecretStorageDialog extends React.PureComponent { id="mx_CreateSecretStorageDialog_passPhraseField" className="mx_CreateSecretStorageDialog_passPhraseField" onChange={this._onPassPhraseChange} - onKeyPress={this._onPassPhraseKeyPress} value={this.state.passPhrase} label={_t("Enter a passphrase")} autoFocus={true} + autoComplete="new-password" />

{strengthMeter} @@ -499,7 +508,8 @@ export default class CreateSecretStorageDialog extends React.PureComponent { onChange={this._onUseKeyBackupChange} value={this.state.useKeyBackup} /> - -
; +
; } _renderPhasePassPhraseConfirm() { @@ -549,25 +559,27 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
; } const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); - return
+ return

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

-
{passPhraseMatch}
- {_t("Skip")} -
; + ; } _renderPhaseShowKey() { diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index a13278cf68..821e370628 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -115,6 +115,7 @@ export default class MessagePanel extends React.Component { // previous positions the read marker has been in, so we can // display 'ghost' read markers that are animating away ghostReadMarkers: [], + showTypingNotifications: SettingsStore.getValue("showTypingNotifications"), }; // opaque readreceipt info for each userId; used by ReadReceiptMarker @@ -164,6 +165,9 @@ export default class MessagePanel extends React.Component { this._readMarkerNode = createRef(); this._whoIsTyping = createRef(); this._scrollPanel = createRef(); + + this._showTypingNotificationsWatcherRef = + SettingsStore.watchSetting("showTypingNotifications", null, this.onShowTypingNotificationsChange); } componentDidMount() { @@ -172,6 +176,7 @@ export default class MessagePanel extends React.Component { componentWillUnmount() { this._isMounted = false; + SettingsStore.unwatchSetting(this._showTypingNotificationsWatcherRef); } componentDidUpdate(prevProps, prevState) { @@ -184,6 +189,12 @@ export default class MessagePanel extends React.Component { } } + onShowTypingNotificationsChange = () => { + this.setState({ + showTypingNotifications: SettingsStore.getValue("showTypingNotifications"), + }); + }; + /* get the DOM node representing the given event */ getNodeForEventId(eventId) { if (!this.eventNodes) { @@ -921,7 +932,7 @@ export default class MessagePanel extends React.Component { ); let whoIsTyping; - if (this.props.room && !this.props.tileShape) { + if (this.props.room && !this.props.tileShape && this.state.showTypingNotifications) { whoIsTyping = ( { clearButton }
diff --git a/src/components/structures/auth/CompleteSecurity.js b/src/components/structures/auth/CompleteSecurity.js index 2126590736..6bf3e7f07c 100644 --- a/src/components/structures/auth/CompleteSecurity.js +++ b/src/components/structures/auth/CompleteSecurity.js @@ -83,12 +83,13 @@ export default class CompleteSecurity extends React.Component { } } - onVerificationRequest = (request) => { + onVerificationRequest = async (request) => { if (request.otherUserId !== MatrixClientPeg.get().getUserId()) return; if (this.state.verificationRequest) { this.state.verificationRequest.off("change", this.onVerificationRequestChange); } + await request.accept(); request.on("change", this.onVerificationRequestChange); this.setState({ verificationRequest: request, @@ -138,9 +139,12 @@ export default class CompleteSecurity extends React.Component { let body; if (this.state.verificationRequest) { - const IncomingSasDialog = sdk.getComponent("views.dialogs.IncomingSasDialog"); - body = ; } else if (phase === PHASE_INTRO) { icon = ; diff --git a/src/components/views/auth/CaptchaForm.js b/src/components/views/auth/CaptchaForm.js index efcc450067..1b9dd3a97d 100644 --- a/src/components/views/auth/CaptchaForm.js +++ b/src/components/views/auth/CaptchaForm.js @@ -61,13 +61,9 @@ export default createReactClass({ } else { console.log("Loading recaptcha script..."); window.mx_on_recaptcha_loaded = () => {this._onCaptchaLoaded();}; - let protocol = global.location.protocol; - if (protocol !== "http:") { - protocol = "https:"; - } const scriptTag = document.createElement('script'); scriptTag.setAttribute( - 'src', `${protocol}//www.recaptcha.net/recaptcha/api.js?onload=mx_on_recaptcha_loaded&render=explicit`, + 'src', `https://www.recaptcha.net/recaptcha/api.js?onload=mx_on_recaptcha_loaded&render=explicit`, ); this._recaptchaContainer.current.appendChild(scriptTag); } diff --git a/src/components/views/auth/RegistrationForm.js b/src/components/views/auth/RegistrationForm.js index 91f8e1b226..8ca454dabd 100644 --- a/src/components/views/auth/RegistrationForm.js +++ b/src/components/views/auth/RegistrationForm.js @@ -486,6 +486,7 @@ export default createReactClass({ id="mx_RegistrationForm_password" ref={field => this[FIELD_PASSWORD] = field} type="password" + autoComplete="new-password" label={_t("Password")} value={this.state.password} onChange={this.onPasswordChange} @@ -499,6 +500,7 @@ export default createReactClass({ id="mx_RegistrationForm_passwordConfirm" ref={field => this[FIELD_PASSWORD_CONFIRM] = field} type="password" + autoComplete="new-password" label={_t("Confirm")} value={this.state.passwordConfirm} onChange={this.onPasswordConfirmChange} diff --git a/src/components/views/auth/ServerConfig.js b/src/components/views/auth/ServerConfig.js index 5e17d50b55..a9e26b8fb7 100644 --- a/src/components/views/auth/ServerConfig.js +++ b/src/components/views/auth/ServerConfig.js @@ -274,15 +274,13 @@ export default class ServerConfig extends React.PureComponent { : null; return ( -
+

{_t("Other servers")}

{errorText} {this._renderHomeserverSection()} {this._renderIdentityServerSection()} - - {submitButton} -
-
+ {submitButton} + ); } } diff --git a/src/components/views/dialogs/ConfirmDestroyCrossSigningDialog.js b/src/components/views/dialogs/ConfirmDestroyCrossSigningDialog.js new file mode 100644 index 0000000000..9e1980e98d --- /dev/null +++ b/src/components/views/dialogs/ConfirmDestroyCrossSigningDialog.js @@ -0,0 +1,65 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from 'react'; +import PropTypes from 'prop-types'; +import {_t} from "../../../languageHandler"; +import * as sdk from "../../../index"; + +export default class ConfirmDestroyCrossSigningDialog extends React.Component { + static propTypes = { + onFinished: PropTypes.func.isRequired, + }; + + _onConfirm = () => { + this.props.onFinished(true); + }; + + _onDecline = () => { + this.props.onFinished(false); + }; + + render() { + const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); + const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); + + return ( + +
+

+ {_t( + "Deleting cross-signing keys is permanent. " + + "Anyone you have verified with will see security alerts. " + + "You almost certainly don't want to do this, unless " + + "you've lost every device you can cross-sign from.", + )} +

+
+ +
+ ); + } +} diff --git a/src/components/views/dialogs/DeactivateAccountDialog.js b/src/components/views/dialogs/DeactivateAccountDialog.js index 7e36232eb0..d7468933df 100644 --- a/src/components/views/dialogs/DeactivateAccountDialog.js +++ b/src/components/views/dialogs/DeactivateAccountDialog.js @@ -118,6 +118,7 @@ export default class DeactivateAccountDialog extends React.Component { const Field = sdk.getComponent('elements.Field'); + // this is on purpose not a
to prevent Enter triggering submission, to further prevent accidents return ( { + try { + this._verifier = this._request.beginKeyVerification(verificationMethods.SAS); + this._verifier.on('show_sas', this._onVerifierShowSas); + // throws upon cancellation + await this._verifier.verify(); + this.setState({phase: PHASE_VERIFIED}); + this._verifier.removeListener('show_sas', this._onVerifierShowSas); + this._verifier = null; + } catch (e) { + console.log("Verification failed", e); + this.setState({ + phase: PHASE_CANCELLED, + }); + this._verifier = null; + this._request = null; + } + }; + _onLegacyFinished = (confirm) => { if (confirm) { MatrixClientPeg.get().setDeviceVerified( @@ -100,7 +123,7 @@ export default class DeviceVerifyDialog extends React.Component { const roomId = await ensureDMExistsAndOpen(this.props.userId); // throws upon cancellation before having started const request = await client.requestVerificationDM( - this.props.userId, roomId, [verificationMethods.SAS], + this.props.userId, roomId, ); await request.waitFor(r => r.ready || r.started); if (request.ready) { @@ -108,11 +131,22 @@ export default class DeviceVerifyDialog extends React.Component { } else { this._verifier = request.verifier; } + } else if (verifyingOwnDevice && SettingsStore.isFeatureEnabled("feature_cross_signing")) { + this._request = await client.requestVerification(this.props.userId, [ + verificationMethods.SAS, + SHOW_QR_CODE_METHOD, + SCAN_QR_CODE_METHOD, + verificationMethods.RECIPROCATE_QR_CODE, + ]); + + await this._request.waitFor(r => r.ready || r.started); + this.setState({phase: PHASE_PICK_VERIFICATION_OPTION}); } else { this._verifier = client.beginKeyVerification( verificationMethods.SAS, this.props.userId, this.props.device.deviceId, ); } + if (!this._verifier) return; this._verifier.on('show_sas', this._onVerifierShowSas); // throws upon cancellation await this._verifier.verify(); @@ -150,10 +184,13 @@ export default class DeviceVerifyDialog extends React.Component { let body; switch (this.state.phase) { case PHASE_START: - body = this._renderSasVerificationPhaseStart(); + body = this._renderVerificationPhaseStart(); break; case PHASE_WAIT_FOR_PARTNER_TO_ACCEPT: - body = this._renderSasVerificationPhaseWaitAccept(); + body = this._renderVerificationPhaseWaitAccept(); + break; + case PHASE_PICK_VERIFICATION_OPTION: + body = this._renderVerificationPhasePick(); break; case PHASE_SHOW_SAS: body = this._renderSasVerificationPhaseShowSas(); @@ -162,10 +199,10 @@ export default class DeviceVerifyDialog extends React.Component { body = this._renderSasVerificationPhaseWaitForPartnerToConfirm(); break; case PHASE_VERIFIED: - body = this._renderSasVerificationPhaseVerified(); + body = this._renderVerificationPhaseVerified(); break; case PHASE_CANCELLED: - body = this._renderSasVerificationPhaseCancelled(); + body = this._renderVerificationPhaseCancelled(); break; } @@ -180,7 +217,7 @@ export default class DeviceVerifyDialog extends React.Component { ); } - _renderSasVerificationPhaseStart() { + _renderVerificationPhaseStart() { const AccessibleButton = sdk.getComponent('views.elements.AccessibleButton'); const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); return ( @@ -206,7 +243,7 @@ export default class DeviceVerifyDialog extends React.Component { ); } - _renderSasVerificationPhaseWaitAccept() { + _renderVerificationPhaseWaitAccept() { const Spinner = sdk.getComponent("views.elements.Spinner"); const AccessibleButton = sdk.getComponent('views.elements.AccessibleButton'); @@ -227,6 +264,14 @@ export default class DeviceVerifyDialog extends React.Component { ); } + _renderVerificationPhasePick() { + return ; + } + _renderSasVerificationPhaseShowSas() { const VerificationShowSas = sdk.getComponent('views.verification.VerificationShowSas'); return ; } @@ -247,12 +293,12 @@ export default class DeviceVerifyDialog extends React.Component { ; } - _renderSasVerificationPhaseVerified() { + _renderVerificationPhaseVerified() { const VerificationComplete = sdk.getComponent('views.verification.VerificationComplete'); return ; } - _renderSasVerificationPhaseCancelled() { + _renderVerificationPhaseCancelled() { const VerificationCancelled = sdk.getComponent('views.verification.VerificationCancelled'); return ; } diff --git a/src/components/views/dialogs/NewSessionReviewDialog.js b/src/components/views/dialogs/NewSessionReviewDialog.js index 2d2bcc8f35..0019e0644f 100644 --- a/src/components/views/dialogs/NewSessionReviewDialog.js +++ b/src/components/views/dialogs/NewSessionReviewDialog.js @@ -19,9 +19,10 @@ import PropTypes from 'prop-types'; import { _t } from '../../../languageHandler'; import Modal from '../../../Modal'; import { replaceableComponent } from '../../../utils/replaceableComponent'; -import DeviceVerifyDialog from './DeviceVerifyDialog'; +import VerificationRequestDialog from './VerificationRequestDialog'; import BaseDialog from './BaseDialog'; import DialogButtons from '../elements/DialogButtons'; +import {MatrixClientPeg} from "../../../MatrixClientPeg"; @replaceableComponent("views.dialogs.NewSessionReviewDialog") export default class NewSessionReviewDialog extends React.PureComponent { @@ -35,12 +36,18 @@ export default class NewSessionReviewDialog extends React.PureComponent { this.props.onFinished(false); } - onContinueClick = () => { + onContinueClick = async () => { const { userId, device } = this.props; - Modal.createTrackedDialog('New Session Verification', 'Starting dialog', DeviceVerifyDialog, { + const cli = MatrixClientPeg.get(); + const request = await cli.requestVerification( userId, - device, - }, null, /* priority = */ false, /* static = */ true); + [device.deviceId], + ); + + this.props.onFinished(true); + Modal.createTrackedDialog('New Session Verification', 'Starting dialog', VerificationRequestDialog, { + verificationRequest: request, + }); } render() { diff --git a/src/components/views/dialogs/QuestionDialog.js b/src/components/views/dialogs/QuestionDialog.js index b165bf79e2..3eec497b44 100644 --- a/src/components/views/dialogs/QuestionDialog.js +++ b/src/components/views/dialogs/QuestionDialog.js @@ -31,6 +31,7 @@ export default createReactClass({ danger: PropTypes.bool, focus: PropTypes.bool, onFinished: PropTypes.func.isRequired, + headerImage: PropTypes.string, }, getDefaultProps: function() { @@ -63,6 +64,7 @@ export default createReactClass({
diff --git a/src/components/views/dialogs/VerificationRequestDialog.js b/src/components/views/dialogs/VerificationRequestDialog.js new file mode 100644 index 0000000000..8080fa09f3 --- /dev/null +++ b/src/components/views/dialogs/VerificationRequestDialog.js @@ -0,0 +1,45 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from 'react'; +import PropTypes from 'prop-types'; +import {MatrixClientPeg} from '../../../MatrixClientPeg'; +import * as sdk from '../../../index'; +import { _t } from '../../../languageHandler'; + +export default class VerificationRequestDialog extends React.Component { + static propTypes = { + verificationRequest: PropTypes.object.isRequired, + onFinished: PropTypes.func.isRequired, + }; + + render() { + const BaseDialog = sdk.getComponent("views.dialogs.BaseDialog"); + const EncryptionPanel = sdk.getComponent("views.right_panel.EncryptionPanel"); + return + + ; + } +} diff --git a/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js b/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js index b04046b9c0..438806bf82 100644 --- a/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js +++ b/src/components/views/dialogs/keybackup/RestoreKeyBackupDialog.js @@ -22,7 +22,6 @@ import {MatrixClientPeg} from '../../../../MatrixClientPeg'; import { MatrixClient } from 'matrix-js-sdk'; import Modal from '../../../../Modal'; import { _t } from '../../../../languageHandler'; -import {Key} from "../../../../Keyboard"; import { accessSecretStorage } from '../../../../CrossSigningManager'; const RESTORE_TYPE_PASSPHRASE = 0; @@ -125,6 +124,8 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { } _onRecoveryKeyNext = async () => { + if (!this.state.recoveryKeyValid) return; + this.setState({ loading: true, restoreError: null, @@ -157,18 +158,6 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { }); } - _onPassPhraseKeyPress = (e) => { - if (e.key === Key.ENTER) { - this._onPassPhraseNext(); - } - } - - _onRecoveryKeyKeyPress = (e) => { - if (e.key === Key.ENTER && this.state.recoveryKeyValid) { - this._onRecoveryKeyNext(); - } - } - async _restoreWithSecretStorage() { this.setState({ loading: true, @@ -305,21 +294,22 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { "messaging by entering your recovery passphrase.", )}

-
+ - -
+ {_t( "If you've forgotten your recovery passphrase you can "+ "use your recovery key or " + @@ -371,7 +361,6 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
diff --git a/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js b/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js index 08d9f8dd5e..e3a7d7f532 100644 --- a/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js +++ b/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js @@ -1,6 +1,6 @@ /* Copyright 2018, 2019 New Vector Ltd -Copyright 2019 The Matrix.org Foundation C.I.C. +Copyright 2019, 2020 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -21,7 +21,6 @@ import * as sdk from '../../../../index'; import {MatrixClientPeg} from '../../../../MatrixClientPeg'; import { _t } from '../../../../languageHandler'; -import { Key } from "../../../../Keyboard"; /* * Access Secure Secret Storage by requesting the user's passphrase. @@ -68,7 +67,11 @@ export default class AccessSecretStorageDialog extends React.PureComponent { }); } - _onPassPhraseNext = async () => { + _onPassPhraseNext = async (e) => { + e.preventDefault(); + + if (this.state.passPhrase.length <= 0) return; + this.setState({ keyMatches: null }); const input = { passphrase: this.state.passPhrase }; const keyMatches = await this.props.checkPrivateKey(input); @@ -79,7 +82,11 @@ export default class AccessSecretStorageDialog extends React.PureComponent { } } - _onRecoveryKeyNext = async () => { + _onRecoveryKeyNext = async (e) => { + e.preventDefault(); + + if (!this.state.recoveryKeyValid) return; + this.setState({ keyMatches: null }); const input = { recoveryKey: this.state.recoveryKey }; const keyMatches = await this.props.checkPrivateKey(input); @@ -97,18 +104,6 @@ export default class AccessSecretStorageDialog extends React.PureComponent { }); } - _onPassPhraseKeyPress = (e) => { - if (e.key === Key.ENTER && this.state.passPhrase.length > 0) { - this._onPassPhraseNext(); - } - } - - _onRecoveryKeyKeyPress = (e) => { - if (e.key === Key.ENTER && this.state.recoveryKeyValid) { - this._onRecoveryKeyNext(); - } - } - render() { const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); @@ -135,7 +130,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent { )}
; } else { - keyStatus =
; + keyStatus =
; } content =
@@ -149,23 +144,25 @@ export default class AccessSecretStorageDialog extends React.PureComponent { "identity for verifying other sessions by entering your passphrase.", )}

-
- + {keyStatus} - -
+ {_t( "If you've forgotten your passphrase you can "+ "use your recovery key or " + @@ -192,11 +189,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent { let keyStatus; if (this.state.recoveryKey.length === 0) { - keyStatus =
; - } else if (this.state.recoveryKeyValid) { - keyStatus =
- {"\uD83D\uDC4D "}{_t("This looks like a valid recovery key!")} -
; + keyStatus =
; } else if (this.state.keyMatches === false) { keyStatus =
{"\uD83D\uDC4E "}{_t( @@ -204,6 +197,10 @@ export default class AccessSecretStorageDialog extends React.PureComponent { "entered the correct recovery key.", )}
; + } else if (this.state.recoveryKeyValid) { + keyStatus =
+ {"\uD83D\uDC4D "}{_t("This looks like a valid recovery key!")} +
; } else { keyStatus =
{"\uD83D\uDC4E "}{_t("Not a valid recovery key")} @@ -221,22 +218,22 @@ export default class AccessSecretStorageDialog extends React.PureComponent { "identity for verifying other sessions by entering your recovery key.", )}

-
+
{keyStatus} - -
+ {_t( "If you've forgotten your recovery key you can "+ "." diff --git a/src/components/views/elements/Pill.js b/src/components/views/elements/Pill.js index 1de857e7fe..59c0bde177 100644 --- a/src/components/views/elements/Pill.js +++ b/src/components/views/elements/Pill.js @@ -211,7 +211,7 @@ const Pill = createReactClass({ if (room) { linkText = "@room"; if (this.props.shouldShowPillAvatar) { - avatar = ; + avatar =
, + onFinished: async (doneClicked) => { + const manuallyVerifyClicked = !doneClicked; + if (!manuallyVerifyClicked) { + return; + } + const cli = MatrixClientPeg.get(); + const verificationRequest = await cli.requestVerification( + userId, + [device.deviceId], + ); + dis.dispatch({ + action: "set_right_panel_phase", + phase: RIGHT_PANEL_PHASES.EncryptionPanel, + refireParams: {member, verificationRequest}, + }); + }, + primaryButton: _t("Done"), + cancelButton: _t("Manually Verify"), + }); } function verifyUser(user) { diff --git a/src/components/views/right_panel/VerificationPanel.js b/src/components/views/right_panel/VerificationPanel.js index ad1aaf598c..08c3935a2c 100644 --- a/src/components/views/right_panel/VerificationPanel.js +++ b/src/components/views/right_panel/VerificationPanel.js @@ -34,6 +34,7 @@ import Spinner from "../elements/Spinner"; export default class VerificationPanel extends React.PureComponent { static propTypes = { + layout: PropTypes.string, request: PropTypes.object.isRequired, member: PropTypes.object.isRequired, phase: PropTypes.oneOf([ @@ -69,12 +70,40 @@ export default class VerificationPanel extends React.PureComponent { const {member} = this.props; const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); + if (this.props.layout === 'dialog') { + // HACK: This is a terrible idea. + let qrCode =
; + if (this.state.qrCodeProps) { + qrCode = ; + } + return ( +
+ {_t("Verify this session by completing one of the following:")} +
+
+

{_t("Scan this unique code")}

+ {qrCode} +
+
{_t("or")}
+
+

{_t("Compare unique emoji")}

+ {_t("Compare a unique set of emoji if you don't have a camera on either device")} + + {_t("Start")} + +
+
+
+ ); + } + let button; if (pending) { button = ; } else { + const disabled = this.state.emojiButtonClicked; button = ( - + {_t("Verify by emoji")} ); @@ -82,9 +111,8 @@ export default class VerificationPanel extends React.PureComponent { if (!this.state.qrCodeProps) { return
-

Verify by emoji

+

{_t("Verify by emoji")}

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

- { button }
; } @@ -92,7 +120,7 @@ export default class VerificationPanel extends React.PureComponent { // TODO: add way to open camera to scan a QR code return
-

Verify by scanning

+

{_t("Verify by scanning")}

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

@@ -103,7 +131,7 @@ export default class VerificationPanel extends React.PureComponent {
-

Verify by emoji

+

{_t("Verify by emoji")}

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

{ button } @@ -121,7 +149,7 @@ export default class VerificationPanel extends React.PureComponent {

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

- +

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

@@ -192,6 +220,7 @@ export default class VerificationPanel extends React.PureComponent { } _startSAS = async () => { + this.setState({emojiButtonClicked: true}); const verifier = this.props.request.beginKeyVerification(verificationMethods.SAS); try { await verifier.verify(); diff --git a/src/components/views/rooms/E2EIcon.js b/src/components/views/rooms/E2EIcon.js index 9480accb1a..a2c99fad99 100644 --- a/src/components/views/rooms/E2EIcon.js +++ b/src/components/views/rooms/E2EIcon.js @@ -51,7 +51,7 @@ const legacyRoomTitles = { [E2E_STATE.VERIFIED]: _td("All sessions in this encrypted room are trusted"), }; -const E2EIcon = ({isUser, status, className, size, onClick}) => { +const E2EIcon = ({isUser, status, className, size, onClick, hideTooltip}) => { const [hover, setHover] = useState(false); const classes = classNames({ @@ -82,7 +82,7 @@ const E2EIcon = ({isUser, status, className, size, onClick}) => { const onMouseOut = () => setHover(false); let tip; - if (hover) { + if (hover && !hideTooltip) { tip = ; } diff --git a/src/components/views/settings/ChangePassword.js b/src/components/views/settings/ChangePassword.js index 291313a463..3ba276d1fa 100644 --- a/src/components/views/settings/ChangePassword.js +++ b/src/components/views/settings/ChangePassword.js @@ -253,20 +253,24 @@ export default createReactClass({
{ currentPassword }
-
-
diff --git a/src/components/views/settings/CrossSigningPanel.js b/src/components/views/settings/CrossSigningPanel.js index f99968c44f..eeccaa61e1 100644 --- a/src/components/views/settings/CrossSigningPanel.js +++ b/src/components/views/settings/CrossSigningPanel.js @@ -20,6 +20,7 @@ import {MatrixClientPeg} from '../../../MatrixClientPeg'; import { _t } from '../../../languageHandler'; import * as sdk from '../../../index'; import { accessSecretStorage } from '../../../CrossSigningManager'; +import Modal from '../../../Modal'; export default class CrossSigningPanel extends React.PureComponent { constructor(props) { @@ -86,11 +87,12 @@ export default class CrossSigningPanel extends React.PureComponent { * 2. Access existing secret storage by requesting passphrase and accessing * cross-signing keys as needed. * 3. All keys are loaded and there's nothing to do. + * @param {bool} [force] Bootstrap again even if keys already present */ - _bootstrapSecureSecretStorage = async () => { + _bootstrapSecureSecretStorage = async (force=false) => { this.setState({ error: null }); try { - await accessSecretStorage(); + await accessSecretStorage(() => undefined, force); } catch (e) { this.setState({ error: e }); console.error("Error bootstrapping secret storage", e); @@ -99,6 +101,18 @@ export default class CrossSigningPanel extends React.PureComponent { this._getUpdatedStatus(); } + onDestroyStorage = (act) => { + if (!act) return; + this._bootstrapSecureSecretStorage(true); + } + + _destroySecureSecretStorage = () => { + const ConfirmDestoryCrossSigningDialog = sdk.getComponent("dialogs.ConfirmDestroyCrossSigningDialog"); + Modal.createDialog(ConfirmDestoryCrossSigningDialog, { + onFinished: this.onDestroyStorage, + }); + } + render() { const AccessibleButton = sdk.getComponent("elements.AccessibleButton"); const { @@ -142,6 +156,12 @@ export default class CrossSigningPanel extends React.PureComponent { {_t("Bootstrap cross-signing and secret storage")}
; + } else { + bootstrapButton =
+ + {_t("Reset cross-signing and secret storage")} + +
; } return ( diff --git a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js index bd1b7c2ca4..fea2e8c81f 100644 --- a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js @@ -32,6 +32,7 @@ export default class PreferencesUserSettingsTab extends React.Component { ]; static TIMELINE_SETTINGS = [ + 'showTypingNotifications', 'autoplayGifsAndVideos', 'urlPreviewsEnabled', 'TextualBody.enableBigEmoji', diff --git a/src/components/views/toasts/VerificationRequestToast.js b/src/components/views/toasts/VerificationRequestToast.js index 5125e20261..a831505a05 100644 --- a/src/components/views/toasts/VerificationRequestToast.js +++ b/src/components/views/toasts/VerificationRequestToast.js @@ -58,10 +58,7 @@ export default class VerificationRequestToast extends React.PureComponent { _checkRequestIsPending = () => { const {request} = this.props; - const isPendingInRoomRequest = request.channel.roomId && - !(request.ready || request.started || request.done || request.cancelled || request.observeOnly); - const isPendingDeviceRequest = request.channel.deviceId && request.started; - if (!isPendingInRoomRequest && !isPendingDeviceRequest) { + if (request.ready || request.done || request.cancelled || request.observeOnly) { ToastStore.sharedInstance().dismissToast(this.props.toastKey); } }; @@ -79,15 +76,15 @@ export default class VerificationRequestToast extends React.PureComponent { ToastStore.sharedInstance().dismissToast(this.props.toastKey); const {request} = this.props; // no room id for to_device requests + const cli = MatrixClientPeg.get(); try { + await request.accept(); if (request.channel.roomId) { dis.dispatch({ action: 'view_room', room_id: request.channel.roomId, should_peek: false, }); - await request.accept(); - const cli = MatrixClientPeg.get(); dis.dispatch({ action: "set_right_panel_phase", phase: RIGHT_PANEL_PHASES.EncryptionPanel, @@ -96,11 +93,10 @@ export default class VerificationRequestToast extends React.PureComponent { member: cli.getUser(request.otherUserId), }, }); - } else if (request.channel.deviceId && request.verifier) { - // show to_device verifications in dialog still - const IncomingSasDialog = sdk.getComponent("views.dialogs.IncomingSasDialog"); - Modal.createTrackedDialog('Incoming Verification', '', IncomingSasDialog, { - verifier: request.verifier, + } else { + const VerificationRequestDialog = sdk.getComponent("views.dialogs.VerificationRequestDialog"); + Modal.createTrackedDialog('Incoming Verification', '', VerificationRequestDialog, { + verificationRequest: request, }, null, /* priority = */ false, /* static = */ true); } } catch (err) { diff --git a/src/components/views/verification/VerificationQREmojiOptions.js b/src/components/views/verification/VerificationQREmojiOptions.js new file mode 100644 index 0000000000..d72c6951fe --- /dev/null +++ b/src/components/views/verification/VerificationQREmojiOptions.js @@ -0,0 +1,82 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from 'react'; +import PropTypes from 'prop-types'; +import { _t } from '../../../languageHandler'; +import AccessibleButton from "../elements/AccessibleButton"; +import {replaceableComponent} from "../../../utils/replaceableComponent"; +import VerificationQRCode from "../elements/crypto/VerificationQRCode"; +import {VerificationRequest} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; +import Spinner from "../elements/Spinner"; + +@replaceableComponent("views.verification.VerificationQREmojiOptions") +export default class VerificationQREmojiOptions extends React.Component { + static propTypes = { + request: PropTypes.object.isRequired, + onCancel: PropTypes.func.isRequired, + onStartEmoji: PropTypes.func.isRequired, + }; + + constructor(props) { + super(props); + + this.state = { + qrProps: null, + }; + + this._prepareQrCode(props.request); + } + + async _prepareQrCode(request: VerificationRequest) { + try { + const props = await VerificationQRCode.getPropsForRequest(request); + this.setState({qrProps: props}); + } catch (e) { + console.error(e); + // We just won't show a QR code + } + } + + render() { + let qrCode =
; + if (this.state.qrProps) { + qrCode = ; + } + return ( +
+ {_t("Verify this session by completing one of the following:")} +
+
+

{_t("Scan this unique code")}

+ {qrCode} +
+
{_t("or")}
+
+

{_t("Compare unique emoji")}

+ {_t("Compare a unique set of emoji if you don't have a camera on either device")} + + {_t("Start")} + +
+
+ + {_t("Cancel")} + +
+ ); + } +} diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 66af5b931e..34d646e0a4 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -1419,7 +1419,7 @@ "View Servers in Room": "Zobrazit servery v místnosti", "Sign out and remove encryption keys?": "Odhlásit a odstranit šifrovací klíče?", "To help us prevent this in future, please send us logs.": "Abychom tomu mohli pro příště předejít, pošlete nám prosím logy.", - "Missing session data": "Chybějící data sezení", + "Missing session data": "Chybějící data relace", "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Některá data sezení, například klíče od šifrovaných zpráv, nám chybí. Přihlašte se prosím znovu a obnovte si klíče ze zálohy.", "Your browser likely removed this data when running low on disk space.": "Prohlížeč data možná smazal aby ušetřil místo na disku.", "Upload files (%(current)s of %(total)s)": "Nahrát soubory (%(current)s z %(total)s)", @@ -1825,7 +1825,7 @@ "This usually only affects how the room is processed on the server. If you're having problems with your Riot, please report a bug.": "Toto běžně ovlivňuje jak je místnost zpracovávána na serveru. Pokud máte problém s Riotem, nahlaste nám prosím bug.", "You'll upgrade this room from to .": "Upgradujeme tuto místnost z na .", "Upgrade": "Upgradovat", - "Enter secret storage passphrase": "Zadejte tajné heslo k úložišti", + "Enter secret storage passphrase": "Zadejte tajné heslo k bezpečnému úložišti", "Unable to access secret storage. Please verify that you entered the correct passphrase.": "Nepovedlo se přistoupit k bezpečnému úložišti. Zkontrolujte prosím, že je zadané správné heslo.", "Warning: You should only access secret storage from a trusted computer.": "Varování: Přistupujte k bezpečnému úložišti pouze z důvěryhodných počítačů.", "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.": "Pokud si nepamatujete heslo, můžete použít váš obnovovací klíč nebo si nastavte nové možnosti obnovení.", @@ -1861,5 +1861,246 @@ "%(count)s verified sessions|one": "1 ověřená relace", "Language Dropdown": "Menu jazyků", "Help": "Pomoc", - "Country Dropdown": "Menu států" + "Country Dropdown": "Menu států", + "There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "V místnosti jsou neověřené relace: pokud budete pokračovat bez ověření, bude možné váš hovor odposlouchávat.", + "Verify this session": "Ověřit tuto relaci", + "Encryption upgrade available": "Je dostupná aktualizace šifrování", + "Set up encryption": "Nastavit šifrování", + "Unverified session": "Neověřená relace", + "Verifies a user, session, and pubkey tuple": "Ověří uživatele, relaci a veřejné klíče", + "Unknown (user, session) pair:": "Neznámý pár (uživatel, relace):", + "Session already verified!": "Relace je už ověřená!", + "WARNING: Session already verified, but keys do NOT MATCH!": "VAROVÁNÍ: Relace je už ověřená, ale klíče NEODPOVÍDAJÍ!", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "VAROVÁNÍ: OVĚŘENÍ KLÍČŮ SELHALO! Podpisový klíč pro uživatele %(userId)s a relaci %(deviceId)s je \"%(fprint)s\", což neodpovídá klíči \"%(fingerprint)s\". Může to znamenat, že je vaše komunikace rušena!", + "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "Zadaný podpisový klíč odpovídá klíči relace %(deviceId)s od uživatele %(userId)s. Relace byla označena za platnou.", + "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s přidal/a této místnosti %(addedAddresses)s a dalších %(count)s adres", + "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s odstranil/a této místnosti %(removedAddresses)s a dalších %(count)s adres", + "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s odstranil/a této místnosti %(countRemoved)s adres a přidal/a %(countAdded)s adres", + "a few seconds ago": "před pár vteřinami", + "about a minute ago": "před minutou", + "%(num)s minutes ago": "před %(num)s minutami", + "about an hour ago": "asi před hodinou", + "%(num)s hours ago": "před %(num)s hodinami", + "about a day ago": "před jedním dnem", + "%(num)s days ago": "před %(num)s dny", + "a few seconds from now": "za pár vteřin", + "about a minute from now": "asi za minutu", + "%(num)s minutes from now": "za %(num)s minut", + "about an hour from now": "asi za hodinu", + "%(num)s hours from now": "za %(num)s hodin", + "about a day from now": "asi za den", + "%(num)s days from now": "za %(num)s dní", + "Show a presence dot next to DMs in the room list": "V seznamu místností zobrazovat informaci o přítomnosti", + "Enable cross-signing to verify per-user instead of per-session (in development)": "Povolit cross-signing pro verifikaci uživatelů místo zařízení (experimentální)", + "Show info about bridges in room settings": "Zobrazovat v nastavení místnosti informace o propojeních", + "Show padlocks on invite only rooms": "Zobrazovat zámek u místností vyžadujících pozvání", + "Never send encrypted messages to unverified sessions from this session": "Nikdy neposílat šifrované zprávy neověřených zařízením", + "Never send encrypted messages to unverified sessions in this room from this session": "Nikdy v této místnosti neposílat šifrované zprávy neověřeným relacím", + "Enable message search in encrypted rooms": "Povolit vyhledávání v zašifrovaných místnostech", + "Keep secret storage passphrase in memory for this session": "Pro toto přihlášení si uchovat heslo k bezpečnému úložišti", + "How fast should messages be downloaded.": "Jak rychle se mají zprávy stahovat.", + "Confirm the emoji below are displayed on both devices, in the same order:": "Ověřte, že následující emotikony jsou zobrazeny na obou zařízeních ve stejném pořadí:", + "Verify this device by confirming the following number appears on its screen.": "Ověřit zařízení potvrzením, že jsou následující čísla zobrazena na jeho obrazovce.", + "Waiting for %(displayName)s to verify…": "Čekám až nás %(displayName)s ověří…", + "They match": "Odpovídají", + "They don't match": "Neodpovídají", + "To be secure, do this in person or use a trusted way to communicate.": "Aby to bylo bezpečné, udělejte to osobně nebo použijte důvěryhodný komunikační prostředek.", + "Lock": "Zamknout", + "Verify yourself & others to keep your chats safe": "Ověřte sebe a ostatní, aby byla vaše komunikace bezpečná", + "Other users may not trust it": "Ostatní uživatelé této relaci nemusí věřit", + "Later": "Později", + "Review": "Prohlédnout", + "This bridge was provisioned by .": "Toto propojení poskytuje .", + "This bridge is managed by .": "Toto propojení spravuje .", + "Workspace: %(networkName)s": "Workspace: %(networkName)s", + "Channel: %(channelName)s": "Kanál: %(channelName)s", + "Show less": "Skrýt detaily", + "Show more": "Zobrazit víc", + "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Změna hesla resetuje šifrovací klíče pro všechny vaše relace. Pokud si nejdřív nevyexportujete klíče místností a po změně je znovu neimportujete, nedostanete se k historickým zprávám. V budoucnu se toto zjednoduší.", + "Cross-signing and secret storage are enabled.": "Cross-signing a bezpečné úložiště jsou zapnuté.", + "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Váš účet má v bezpečném úložišti identitu pro cross-signing, ale v této relaci jí zatím nevěříte.", + "Cross-signing and secret storage are not yet set up.": "Zatím nemáte nastavený cross-signing a bezpečné úložiště.", + "Bootstrap cross-signing and secret storage": "Zapnout cross-signing a bezpečné úložiště", + "Cross-signing public keys:": "Veřejné klíče pro cross-signing:", + "in memory": "v paměti", + "Cross-signing private keys:": "Soukromé klíče pro cross-signing:", + "in secret storage": "v bezpečném úložišti", + "Secret storage public key:": "Veřejný klíč bezpečného úložiště:", + "in account data": "v datech účtu", + "Your homeserver does not support session management.": "Váš domovský server nepodporuje správu relací.", + "Unable to load session list": "Nepovedlo se načíst seznam relací", + "Delete %(count)s sessions|other": "Smazat %(count)s relací", + "Delete %(count)s sessions|one": "Smazat %(count)s relaci", + "Securely cache encrypted messages locally for them to appear in search results, using ": "Bezpečně uchovávat šifrované zprávy na tomto zařízení, aby se v nich dalo vyhledávat pomocí ", + " to store messages from ": " na uchování zpráv z ", + "rooms.": "místností.", + "Manage": "Spravovat", + "Securely cache encrypted messages locally for them to appear in search results.": "Bezpečně uchovávat zprávy na tomto zařízení aby se v nich dalo vyhledávat.", + "Enable": "Povolit", + "Riot can't securely cache encrypted messages locally while running in a web browser. Use Riot Desktop for encrypted messages to appear in search results.": "Riot neumí bezpečně uchovávat zprávy když běží v prohlížeči. Pokud chcete vyhledávat v šifrovaných zprávách, použijte Riot Desktop.", + "This session is backing up your keys. ": "Tato relace zálohuje vaše klíče. ", + "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Tato relace nezálohuje vaše klíče, ale už máte zálohu ze které je můžete obnovit.", + "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Než se odhlásíce, připojte tuto relaci k záloze klíčů abyste nepřišli o klíče, které můžou být jen v této relaci.", + "Connect this session to Key Backup": "Připojit k zálohování klíčů", + "not stored": "není uložen", + "Backup has a signature from unknown session with ID %(deviceId)s": "Záloha je podepsaná z neznámé relace s ID %(deviceId)s", + "Backup has a valid signature from this session": "Záloha má platný podpis z této relace", + "Backup has an invalid signature from this session": "Záloha má neplatný podpis z této relace", + "Backup has a valid signature from verified session ": "Záloha má platný podpis z ověřené relace ", + "Backup has a valid signature from unverified session ": "Záloha má platný podpis z neověřené relace ", + "Backup has an invalid signature from verified session ": "Záloha má neplatný podpis z ověřené relace ", + "Backup has an invalid signature from unverified session ": "Záloha má neplatný podpis z neověřené relace ", + "Backup is not signed by any of your sessions": "Záloha nemá podpis z žádné vaší relace", + "This backup is trusted because it has been restored on this session": "Záloze věříme, protože už byla v této relaci načtena", + "Backup key stored in secret storage, but this feature is not enabled on this session. Please enable cross-signing in Labs to modify key backup state.": "Zálohovací klíč je uložen v bezpečném úložišti, ale jeho načtení není v této relaci povolené. Zapněte prosím cross-signing v Experimentálních funkcích abyste mohli modifikovat stav zálohy.", + "Backup key stored: ": "Zálohovací klíč je uložen: ", + "Your keys are not being backed up from this session.": "Vaše klíče nejsou z této relace zálohovány.", + "Enable desktop notifications for this session": "Povolit v této relaci notifikace", + "Enable audible notifications for this session": "Povolit v této relaci hlasové notifikace", + "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Heslo bylo změněno. Dokud se znovu nepřihlásíte na ostatních zařízeních, nebudete na nich dostávat notifikace", + "Session ID:": "ID relace:", + "Session key:": "Klíč relace:", + "Message search": "Vyhledávání ve zprávách", + "Cross-signing": "Cross-signing", + "Sessions": "Relace", + "A session's public name is visible to people you communicate with": "Lidé se kterými komunikujete si můžou jméno relace zobrazit", + "This room is bridging messages to the following platforms. Learn more.": "Tato místnost je propojena s následujícími platformami. Více informací", + "This room isn’t bridging messages to any platforms. Learn more.": "Tato místnost není propojená s žádnými dalšími platformami. Více informací.", + "Bridges": "Propojení", + "This user has not verified all of their sessions.": "Tento uživatel zatím neověřil všechny své relace.", + "You have not verified this user.": "Tohoto uživatele jste neověřil.", + "You have verified this user. This user has verified all of their sessions.": "Tohoto uživatele jste ověřili a on ověřil všechny své relace.", + "Someone is using an unknown session": "Někdo používá neznámou relaci", + "This room is end-to-end encrypted": "Místnost je E2E šifrovaná", + "Everyone in this room is verified": "V této místnosti jsou všichni ověřeni", + "Some sessions for this user are not trusted": "Některé relace tohoto uživatele jsou nedůvěryhodné", + "All sessions for this user are trusted": "Všem relacím tohoto uživatele věříme", + "Some sessions in this encrypted room are not trusted": "Některé relace v této místnosti jsou nedůvěryhodné", + "All sessions in this encrypted room are trusted": "Všem relacím v této místosti věříme", + "Mod": "Moderátor", + "Your key share request has been sent - please check your other sessions for key share requests.": "Požadavek k nasdílení klíčů byl odeslán - podívejte se prosím na své ostatní relace, jestli vám přišel.", + "Key share requests are sent to your other sessions automatically. If you rejected or dismissed the key share request on your other sessions, click here to request the keys for this session again.": "Požadavek se sdílení klíčů se vaše ostatní relace odesílá automaticky. Pokud jste ho zamítli nebo ignorovali, tímto tlačítkem si jej můžete poslat znovu.", + "If your other sessions do not have the key for this message you will not be able to decrypt them.": "Pokud vaše ostatní relace nemají klíč pro tuto zprávu, nebudete mít možnost jí dešifrovat.", + "Re-request encryption keys from your other sessions.": "Znovu zažádat o šifrovací klíče z vašich ostatních relací.", + "Encrypted by an unverified session": "Zašifrované v neověřené relaci", + "Encrypted by a deleted session": "Zašifrované smazanou relací", + "Invite only": "Pouze na pozvání", + "No sessions with registered encryption keys": "Žádné relace se šifrovacími klíči", + "Send a reply…": "Odpovědět…", + "Send a message…": "Napsat zprávu…", + "Direct Messages": "Přímé zprávy", + "Reject & Ignore user": "Odmítnout & ignorovat uživatele", + "Unknown Command": "Neznámý příkaz", + "Unrecognised command: %(commandText)s": "Nerozpoznaný příkaz: %(commandText)s", + "You can use /help to list available commands. Did you mean to send this as a message?": "Můžete použít /help na vypsání všech příkazů. Nebo jste text chtěli odeslat jako zprávu?", + "Hint: Begin your message with // to start it with a slash.": "Tip: Zprávu můžete začít //, pokud chcete aby začínala lomítkem.", + "Send as message": "Odeslat jako zprávu", + "Waiting for %(displayName)s to accept…": "Čekáme, než %(displayName)s přijme…", + "Start Verification": "Začít s verifikací", + "Your messages are secured and only you and the recipient have the unique keys to unlock them.": "Vaše zprávy jsou zabezpečené - pouze Vy a příjemce mají klíče k jejich přečtení.", + "Verify User": "Ověřit uživatele", + "For extra security, verify this user by checking a one-time code on both of your devices.": "Pro lepší bezpečnost, ověřte uživatele zkontrolováním jednorázového kódu na vašich zařízeních.", + "Your messages are not secure": "Vaše zprávy nejsou zabezpečené", + "One of the following may be compromised:": "Něco z následujích věcí může být kompromitováno:", + "Your homeserver": "Váš domovský server", + "The homeserver the user you’re verifying is connected to": "Domovský server ověřovaného uživatele", + "Yours, or the other users’ internet connection": "Vaše připojení k internetu a nebo připojení ověřovaného uživatele", + "Yours, or the other users’ session": "Vaše relace a nebo relace ověřovaného uživatele", + "%(count)s sessions|other": "%(count)s relací", + "%(count)s sessions|one": "%(count)s relace", + "Hide sessions": "Skrýt relace", + "Verify by emoji": "Ověřit emotikonami", + "Verify by comparing unique emoji.": "Oveření porovnáním několika emotikon.", + "Ask %(displayName)s to scan your code:": "Ověříte se, když %(displayName)s naskenuje váš kód:", + "If you can't scan the code above, verify by comparing unique emoji.": "Pokud vám skenování kódů nefunguje, ověřte se porovnáním emotikon.", + "You've successfully verified %(displayName)s!": "%(displayName)s je úspěšně ověřen/a!", + "Got it": "Dobře", + "Verification timed out. Start verification again from their profile.": "Čas na verifikaci vypršel. Začněte s verifikací znovu z druhého profilu.", + "%(displayName)s cancelled verification. Start verification again from their profile.": "%(displayName)s zrušil/a verifikaci. Začněte s verifikací znovu z druhého profilu.", + "Encryption enabled": "Šifrování je zapnuté", + "Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "Zprávy v této místnosti jsou E2E šifrované. Více informací & verifikace uživatele je v jeho profilu.", + "Encryption not enabled": "Šifrování je vypnuté", + "The encryption used by this room isn't supported.": "Šifrování používané v této místnosti není podporované.", + "Clear all data in this session?": "Smazat všechna data v této relaci?", + "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Výmaz všech dat v relaci je nevratný. Pokud nemáte zálohované šifrovací klíče, přijdete o šifrované zprávy.", + "Verify session": "Ověřit relaci", + "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Abychom ověřili, že je relace důvěryhodná, zkontrolujte prosím, že klíč v uživatelském nastavení na tom zařízení odpovídá následujícímu klíči:", + "To verify that this session can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this session matches the key below:": "Abychom ověřili, že tato relace je důvěryhodná, kontaktujte prosím jejího vlastníka nějakým dalším způsobem (osobně, telefonicky, apod.). Zkontrolujte spolu, že klíč v uživatelském nastavení na druhém zařízení odpovídá následujícímu klíči:", + "Session name": "Jméno relace", + "Session key": "Klíč relace", + "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this session and you probably want to press the blacklist button instead.": "Pokud odpovídá, zmáčkněte tlačítko ověřit. Pokud ne, druhé zařízení je pravděpodobně falešné a chcete ho zablokovat.", + "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Ověření uživatele označí jeho relace za důvěryhodné a Vaše relace budou důvěryhodné pro něj.", + "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Ověření zařízení ho označí za důvěryhodné. Ověření konkrétního zařízení vám dát trochu klidu mysli navíc při používání šifrovaných zpráv.", + "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Ověření zařízení ho označí za důvěryhodné a uživatelé, kteří věří vám budou také tomuto zařízení důvěřovat.", + "Failed to invite the following users to chat: %(csvUsers)s": "Následující uživatele se nepovedlo pozvat do chatu: %(csvUsers)s", + "We couldn't create your DM. Please check the users you want to invite and try again.": "Nepovedlo se nám vyrobit soukromou konverzaci. Zkontrolujte prosím, že pozvaný uživatel opravdu existuje a pak to zkuste znovu.", + "Something went wrong trying to invite the users.": "Při odesílání pozvánek se něco pokazilo.", + "We couldn't invite those users. Please check the users you want to invite and try again.": "Nemůžeme pozvat tyto uživatele. Zkontrolujte prosím, že opravdu existují a zkuste to znovu.", + "Failed to find the following users": "Nepovedlo se najít následující uživatele", + "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "Následující uživatelé asi neexistují nebo jsou neplatní a nelze je pozvat: %(csvNames)s", + "Recent Conversations": "Nedávné konverzace", + "Suggestions": "Návrhy", + "Recently Direct Messaged": "Nedávno kontaktovaní", + "If you can't find someone, ask them for their username, share your username (%(userId)s) or profile link.": "Pokud někoho nemůžete nalézt, zeptejte se na username, pošlete jim svůj (%(userId)s) a nebo pošlete odkaz na svůj profil.", + "Go": "Ok", + "If you can't find someone, ask them for their username (e.g. @user:server.com) or share this room.": "Pokud někoho nemůžete nalézt, zeptejte se na username (například @user:server.com) a nebo pošlete odkaz na tuto místnost.", + "You added a new session '%(displayName)s', which is requesting encryption keys.": "Přidali jste novou relaci '%(displayName)s', která požaduje šifrovací klíče.", + "Your unverified session '%(displayName)s' is requesting encryption keys.": "Vaše neověřená relace '%(displayName)s' požaduje šifrovací klíče.", + "Loading session info...": "Načítám informace o relaci...", + "New session": "Nová relace", + "Use this session to verify your new one, granting it access to encrypted messages:": "Použijte tuto relaci abyste ověřili novou a dali jí přístup ke svým šifrovaným zprávám:", + "If you didn’t sign in to this session, your account may be compromised.": "Pokud jste se do této nové relace nepřihlásili, váš účet může být kompromitován.", + "This wasn't me": "Nebyl/a jsem to já", + "This will allow you to return to your account after signing out, and sign in on other sessions.": "Umožní vám to se přihlásit do dalších relací a vrátit se ke svému účtu poté co se odhlásíte.", + "You are currently blacklisting unverified sessions; to send messages to these sessions you must verify them.": "Máte zakázané posílání zpráv neověřeným relacím; abyste mohli zprávu odeslat, musíte je ověřit.", + "We recommend you go through the verification process for each session to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Doporučujeme si projít ověřovací proces pro každou relaci abyste ověřili, že patří tomu, komu očekáváte. Můžete ale poslat zprávu i bez ověření, pokud chcete.", + "Room contains unknown sessions": "V místnosti jsou neověřené relace", + "\"%(RoomName)s\" contains sessions that you haven't seen before.": "V místnosti \"%(RoomName)s\" jsou relace, které jste ještě nikdy neviděli.", + "Unknown sessions": "Neznámá relace", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your passphrase.": "Zadejte svoje heslo a získejte přístup k bezpečnému úložišti historie zpráv a k identitě pro cross-signing pro snadné ověřování vašich relací.", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.": "Zadejte svůj obnovovací klíč a získejte přístup k bezpečnému úložišti historie zpráv a k identitě pro cross-signing pro snadné ověřování vašich relací.", + "Recovery key mismatch": "Obnovovací klíč neodpovídá", + "Incorrect recovery passphrase": "Nesprávné heslo pro obnovení", + "Backup restored": "Záloha byla nahrána", + "Enter recovery passphrase": "Zadejte heslo pro obnovení zálohy", + "Enter recovery key": "Zadejte obnovovací klíč", + "Confirm your identity by entering your account password below.": "Potvrďte svou identitu zadáním hesla ke svému účtu.", + "Message not sent due to unknown sessions being present": "Zpráva nebyla odeslána, protože jsou v místnosti neznámé relace", + "Show sessions, send anyway or cancel.": "Zobrazit relace, i tak odeslat, a nebo zrušit.", + "Verify this session to grant it access to encrypted messages.": "Ověřte relaci aby získala přístup k šifrovaným zprávám.", + "Start": "Začít", + "Session verified": "Relace je ověřena", + "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Vaše nová relace je teď ověřená. Má přístup k šifrovaným zprávám a ostatní uživatelé jí budou věřit.", + "Your new session is now verified. Other users will see it as trusted.": "Vaše nová relace je teď ověřená. Ostatní uživatelé jí budou věřit.", + "Done": "Hotovo", + "Without completing security on this session, it won’t have access to encrypted messages.": "Bez dokončení ověření nebude mít nová relace přístup k šifrovaným zprávám.", + "Go Back": "Zpět", + "Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.": "Změna hesla resetuje šifrovací klíče ve všech vašich přihlášených relacích a přijdete tak o přístup k historickým zprávám. Před změnou hesla si nastavte zálohu klíčů nebo si klíče pro místnosti exportujte.", + "You have been logged out of all sessions and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Všude jsme Vás odhlásili, takže nedostáváte žádné upozornění. Můžete je znovu povolit tím, že se na všech svych zařízeních znovu přihlásíte.", + "Regain access to your account and recover encryption keys stored in this session. Without them, you won’t be able to read all of your secure messages in any session.": "Získejte znovu přístup k účtu a obnovte si šifrovací klíče uložené v této relaci. Bez nich nebudete schopni číst zabezpečené zprávy na některých zařízeních.", + "Warning: Your personal data (including encryption keys) is still stored in this session. Clear it if you're finished using this session, or want to sign in to another account.": "Varování: Vaše osobní data (včetně šifrovacích klíčů) jsou tu pořád uložena. Smažte je, pokud chcete tuto relaci zahodit nebo se přihlašte pod jiný účet.", + "Sender session information": "Informace o relaci odesílatele", + "If you cancel now, you won't complete verifying the other user.": "Pokud teď proces zrušíte, tak nebude druhý uživatel ověřen.", + "If you cancel now, you won't complete verifying your other session.": "Pokud teď proces zrušíte, tak nebude druhá relace ověřena.", + "If you cancel now, you won't complete your secret storage operation.": "Pokud teď proces zrušíte, tak se nedokončí operace s bezpečným úložištěm.", + "Cancel entering passphrase?": "Zrušit zadávání hesla?", + "Setting up keys": "Příprava klíčů", + "Riot is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom Riot Desktop with search components added.": "Riotu chybí nějaké komponenty, které jsou potřeba pro vyhledávání v zabezpečených místnostech. Pokud chcete s touto funkcí experimentovat, tak si pořiďte vlastní Riot Desktop s přidanými komponentami.", + "Subscribing to a ban list will cause you to join it!": "Odebíráním seznamu zablokovaných uživatelů se přidáte do jeho místnosti!", + "If this isn't what you want, please use a different tool to ignore users.": "Pokud to nechcete, tak prosím použijte jiný nástroj na blokování uživatelů.", + "You cancelled verification. Start verification again from their profile.": "Zrušili jste verifikaci. Můžete jí začít znovu z druhého profilu.", + "Complete security": "Dokončení ověření", + "Restore your key backup to upgrade your encryption": "Pro aktualizaci šifrování obnovte klíče ze zálohy", + "Restore": "Obnovit", + "Enter your account password to confirm the upgrade:": "Potvrďte, že chcete aktualizaci provést zadáním svého uživatelského hesla:", + "You'll need to authenticate with the server to confirm the upgrade.": "Server si vás potřebuje ověřit, abychom mohli provést aktualizaci.", + "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Aktualizujte tuto přihlášenou relaci abyste mohli ověřovat ostatní relace. Tím jim dáte přístup k šifrovaným konverzacím a ostatní uživatelé je jim budou automaticky věřit.", + "Set up encryption on this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Zapněte v této přihlášené relaci šifrování abyste mohli ověřovat ostatní relace. Tím jim dáte přístup k šifrovaným konverzacím a ostatní uživatelé je jim budou automaticky věřit.", + "Show typing notifications": "Zobrazovat notifikace \"... právě píše...\"", + "Reset cross-signing and secret storage": "Resetovat bezpečné úložiště a cross-signing", + "Destroy cross-signing keys?": "Nenávratně smazat klíče pro cross-signing?", + "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Smazání klíčů pro cross-signing je definitivní. Každý kdo vás ověřil teď uvidí bezpečnostní varování. Pokud jste zrovna neztratili všechna zařízení ze kterých se můžete ověřit, tak to asi nechcete udělat.", + "Clear cross-signing keys": "Smazat klíče pro cross-signing", + "Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Zabezpečte si šifrovací klíče silným heslem. Pro lepší bezpečnost by mělo být jiné než vaše heslo k přihlášení:", + "Enter a passphrase": "Zadejte heslo" } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 83c15fc385..7a8642be95 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -397,6 +397,7 @@ "Show avatars in user and room mentions": "Show avatars in user and room mentions", "Enable big emoji in chat": "Enable big emoji in chat", "Send typing notifications": "Send typing notifications", + "Show typing notifications": "Show typing notifications", "Automatically replace plain text Emoji": "Automatically replace plain text Emoji", "Mirror local video feed": "Mirror local video feed", "Enable Community Filter Panel": "Enable Community Filter Panel", @@ -451,6 +452,12 @@ "You've successfully verified this user.": "You've successfully verified this user.", "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.", "Got It": "Got It", + "Verify this session by completing one of the following:": "Verify this session by completing one of the following:", + "Scan this unique code": "Scan this unique code", + "or": "or", + "Compare unique emoji": "Compare unique emoji", + "Compare a unique set of emoji if you don't have a camera on either device": "Compare a unique set of emoji if you don't have a camera on either device", + "Start": "Start", "Confirm the emoji below are displayed on both devices, in the same order:": "Confirm the emoji below are displayed on both devices, in the same order:", "Verify this user by confirming the following emoji appear on their screen.": "Verify this user by confirming the following emoji appear on their screen.", "Verify this device by confirming the following number appears on its screen.": "Verify this device by confirming the following number appears on its screen.", @@ -558,6 +565,7 @@ "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.", "Cross-signing and secret storage are not yet set up.": "Cross-signing and secret storage are not yet set up.", "Bootstrap cross-signing and secret storage": "Bootstrap cross-signing and secret storage", + "Reset cross-signing and secret storage": "Reset cross-signing and secret storage", "Cross-signing public keys:": "Cross-signing public keys:", "in memory": "in memory", "not found": "not found", @@ -1166,6 +1174,11 @@ "Yours, or the other users’ session": "Yours, or the other users’ session", "Members": "Members", "Files": "Files", + "Not Trusted": "Not Trusted", + "%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) signed in to a new session without verifying it:", + "Ask this user to verify their session, or manually verify it below.": "Ask this user to verify their session, or manually verify it below.", + "Done": "Done", + "Manually Verify": "Manually Verify", "Trusted": "Trusted", "Not trusted": "Not trusted", "%(count)s verified sessions|other": "%(count)s verified sessions", @@ -1186,6 +1199,7 @@ "Security": "Security", "Verify by emoji": "Verify by emoji", "Verify by comparing unique emoji.": "Verify by comparing unique emoji.", + "Verify by scanning": "Verify by scanning", "Ask %(displayName)s to scan your code:": "Ask %(displayName)s to scan your code:", "If you can't scan the code above, verify by comparing unique emoji.": "If you can't scan the code above, verify by comparing unique emoji.", "You've successfully verified %(displayName)s!": "You've successfully verified %(displayName)s!", @@ -1435,6 +1449,9 @@ "Changelog": "Changelog", "You cannot delete this message. (%(code)s)": "You cannot delete this message. (%(code)s)", "Removing…": "Removing…", + "Destroy cross-signing keys?": "Destroy cross-signing keys?", + "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.", + "Clear cross-signing keys": "Clear cross-signing keys", "Confirm Removal": "Confirm Removal", "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.", "Clear all data in this session?": "Clear all data in this session?", @@ -1638,6 +1655,7 @@ "Upload %(count)s other files|one": "Upload %(count)s other file", "Cancel All": "Cancel All", "Upload Error": "Upload Error", + "Verification Request": "Verification Request", "A widget would like to verify your identity": "A widget would like to verify your identity", "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.": "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.", "Remember my selection for this widget": "Remember my selection for this widget", @@ -1649,8 +1667,8 @@ "Access your secure message history and your cross-signing identity for verifying other sessions by entering your passphrase.": "Access your secure message history and your cross-signing identity for verifying other sessions by entering your passphrase.", "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.": "If you've forgotten your passphrase you can use your recovery key or set up new recovery options.", "Enter secret storage recovery key": "Enter secret storage recovery key", - "This looks like a valid recovery key!": "This looks like a valid recovery key!", "Unable to access secret storage. Please verify that you entered the correct recovery key.": "Unable to access secret storage. Please verify that you entered the correct recovery key.", + "This looks like a valid recovery key!": "This looks like a valid recovery key!", "Not a valid recovery key": "Not a valid recovery key", "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.": "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.", "If you've forgotten your recovery key you can .": "If you've forgotten your recovery key you can .", @@ -1849,7 +1867,6 @@ "Review terms and conditions": "Review terms and conditions", "Old cryptography data detected": "Old cryptography data detected", "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Data from an older version of Riot has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.", - "Verification Request": "Verification Request", "Logout": "Logout", "%(creator)s created and configured the room.": "%(creator)s created and configured the room.", "Your Communities": "Your Communities", @@ -1924,11 +1941,9 @@ "Could not load user profile": "Could not load user profile", "Complete security": "Complete security", "Verify this session to grant it access to encrypted messages.": "Verify this session to grant it access to encrypted messages.", - "Start": "Start", "Session verified": "Session verified", "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.", "Your new session is now verified. Other users will see it as trusted.": "Your new session is now verified. Other users will see it as trusted.", - "Done": "Done", "Without completing security on this session, it won’t have access to encrypted messages.": "Without completing security on this session, it won’t have access to encrypted messages.", "Go Back": "Go Back", "Failed to send email": "Failed to send email", diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index d5c7d7b8a8..5235eba1c8 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -2075,5 +2075,27 @@ "Copy": "Kopiatu", "You can now verify your other devices, and other users to keep your chats safe.": "Orain zure beste gailuak eta beste erabiltzaileak egiaztatu ditzakezu txatak seguru mantentzeko", "Make a copy of your recovery key": "Egin zure berreskuratze gakoaren kopia", - "You're done!": "Bukatu duzu!" + "You're done!": "Bukatu duzu!", + "If you cancel now, you won't complete verifying the other user.": "Orain ezeztatzen baduzu, ez duzu beste erabiltzailearen egiaztaketa burutuko.", + "If you cancel now, you won't complete verifying your other session.": "Orain ezeztatzen baduzu, ez duzu beste zure beste saioaren egiaztaketa burutuko.", + "If you cancel now, you won't complete your secret storage operation.": "Orain ezeztatzen baduzu, ez duzu zure biltegi sekretuko eragiketa burutuko.", + "Cancel entering passphrase?": "Ezeztatu pasa-esaldiaren sarrera?", + "Securely cache encrypted messages locally for them to appear in search results.": "Gorde zifratutako mezuak cachean modu seguruan bilaketen emaitzetan agertu daitezen.", + "You have verified this user. This user has verified all of their sessions.": "Erabiltzaile hau egiaztatu duzu. Erabiltzaile honek bere saio guztiak egiaztatu ditu.", + "Mod": "Moderatzailea", + "Your key share request has been sent - please check your other sessions for key share requests.": "Zure gako partekatze eskaria bidali da, egiaztatu zure beste saioak gako partekatze eskaera jaso duten.", + "Key share requests are sent to your other sessions automatically. If you rejected or dismissed the key share request on your other sessions, click here to request the keys for this session again.": "Automatikoki bidaltzen dira gako partekatze eskaerak zure beste saioetara. Beste saioetan gako partekatze eskaera ukatu edo baztertu baduzu, sakatu hemen saio honentzat gakoak berriro eskatzeko.", + "If your other sessions do not have the key for this message you will not be able to decrypt them.": "Zure beste saioek ez badute mezu honen gakoa ezin izango duzu deszifratu.", + "Re-request encryption keys from your other sessions.": "Eskatu berriro zifratze gakoak zure beste saioei.", + "No sessions with registered encryption keys": "Ez dago zifratze gako hori duen saiorik", + "Waiting for %(displayName)s to accept…": "%(displayName)s(e)k onartu bitartean zain…", + "Your messages are secured and only you and the recipient have the unique keys to unlock them.": "Zuon mezuak babestuta daude eta soilik zuk eta hartzaileak dituzue hauek irekitzeko giltza.", + "One of the following may be compromised:": "Hauetakoren bat konprometituta egon daiteke:", + "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Egiztatu gailu hau fidagarri gisa markatzeko. Gailu hau fidagarritzat jotzeak lasaitasuna ematen du muturretik-muturrera zifratutako mezuak erabiltzean.", + "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Gailu hau egiaztatzean fidagarri gisa markatuko da, eta egiaztatu zaituzten erabiltzaileek fidagarri gisa ikusiko dute.", + "You added a new session '%(displayName)s', which is requesting encryption keys.": "'%(displayName)s' saio berria gehitu duzu, eta zifratze gakoak eskatzen ari da.", + "Your unverified session '%(displayName)s' is requesting encryption keys.": "Zure egiaztatu gabeko '%(displayName)s' saioa zifratze gakoak eskatzen ari da.", + "We recommend you go through the verification process for each session to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Egiaztaketa prozesua saio bakoitzeko egitea aholkatzen dizugu, benetan jabearenak direla baieztatzeko, baina egiaztaketa egin gabe mezua bidali dezakezu ere.", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your passphrase.": "Atzitu zure mezu seguruen historiala eta zeharkako sinatzerako identitatea beste saioak egiaztatzeko zure pasa-esaldia sartuz.", + "Show sessions, send anyway or cancel.": "Erakutsi saioak, bidali edonola ere edo ezeztatu." } diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index bd491ad7f5..7aa6a43c91 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -148,7 +148,7 @@ "Passwords can't be empty": "Le mot de passe ne peut pas être vide", "Permissions": "Permissions", "Phone": "Numéro de téléphone", - "Operation failed": "L'opération a échoué", + "Operation failed": "L’opération a échoué", "Default": "Par défaut", "Email address": "Adresse e-mail", "Error decrypting attachment": "Erreur lors du déchiffrement de la pièce jointe", @@ -387,7 +387,7 @@ "Accept": "Accepter", "Active call (%(roomName)s)": "Appel en cours (%(roomName)s)", "Alias (optional)": "Alias (facultatif)", - "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.": "Impossible de se connecter au serveur d'accueil - veuillez vérifier votre connexion, assurez-vous que le certificat SSL de votre serveur d'accueil est un certificat de confiance, et qu'aucune extension du navigateur ne bloque les requêtes.", + "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.": "Impossible de se connecter au serveur d’accueil - veuillez vérifier votre connexion, assurez-vous que le certificat SSL de votre serveur d’accueil est un certificat de confiance, et qu’aucune extension du navigateur ne bloque les requêtes.", "Close": "Fermer", "Custom": "Personnaliser", "Decline": "Refuser", @@ -493,7 +493,7 @@ "%(senderName)s changed the pinned messages for the room.": "%(senderName)s a changé les messages épinglés du salon.", "Jump to read receipt": "Aller à l'accusé de lecture", "World readable": "Lisible publiquement", - "Guests can join": "Accessible aux invités", + "Guests can join": "Accessible aux visiteurs", "Invalid community ID": "Identifiant de communauté non valide", "'%(groupId)s' is not a valid community ID": "\"%(groupId)s\" n'est pas un identifiant de communauté valide", "%(senderName)s sent an image": "%(senderName)s a envoyé une image", @@ -1149,11 +1149,11 @@ "Begin Verifying": "Commencer la vérification", "Waiting for partner to accept...": "Nous attendons que le partenaire accepte…", "Use two-way text verification": "Utiliser la vérification textuelle bidirectionnelle", - "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Vérifier cet utilisateur pour que ce soit un utilisateur de confiance. Faire confiance aux utilisateurs vous apporte une tranquillité d’esprit quand vous utilisez des messages chiffrés de bout en bout.", + "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Vérifier cet utilisateur pour le marquer comme fiable. Faire confiance aux utilisateurs vous permet d’être serein quand vous utilisez des messages chiffrés de bout en bout.", "Waiting for partner to confirm...": "Nous attendons que le partenaire confirme…", "Incoming Verification Request": "Demande de vérification entrante", "Go back": "Revenir en arrière", - "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "Pour éviter la duplication d'issues, veuillez voir les issues existantsd'abord (et ajouter un +1) ou créer un nouvel issue si vous ne le trouvez pas.", + "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "Pour éviter la duplication de problèmes, veuillez voir les problèmes existants d'abord (et ajouter un +1) ou créer un nouveau problème si vous ne le trouvez pas.", "Report bugs & give feedback": "Rapporter des anomalies & Donner son avis", "Backup could not be decrypted with this key: please verify that you entered the correct recovery key.": "La sauvegarde n'a pas pu être déchiffrée avec cette clé : veuillez vérifier que vous avez saisi la bonne clé de récupération.", "Update status": "Mettre à jour le statut", @@ -1178,7 +1178,7 @@ "Premium hosting for organisations Learn more": "Hébergement premium pour les organisations En savoir plus", "Other": "Autre", "Find other public servers or use a custom server": "Trouvez d'autres serveurs publics ou utilisez un serveur personnalisé", - "Guest": "Invité", + "Guest": "Visiteur", "Sign in instead": "Se connecter", "Set a new password": "Définir un nouveau mot de passe", "Create account": "Créer un compte", @@ -1193,9 +1193,9 @@ "%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s a rendu le salon public à tous ceux qui en connaissent le lien.", "%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s a rendu le salon disponible sur invitation seulement.", "%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s a changé la règle d’adhésion en %(rule)s", - "%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s a autorisé les invités à rejoindre le salon.", - "%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s a empêché les invités de rejoindre le salon.", - "%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s a changé l'accès des invités en %(rule)s", + "%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s a autorisé les visiteurs à rejoindre le salon.", + "%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s a empêché les visiteurs de rejoindre le salon.", + "%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s a changé l'accès des visiteurs en %(rule)s", "Group & filter rooms by custom tags (refresh to apply changes)": "Grouper et filtrer les salons grâce à des étiquettes personnalisées (actualiser pour appliquer les changements)", "Verify this user by confirming the following emoji appear on their screen.": "Vérifier cet utilisateur en confirmant que les émojis suivant apparaissent sur son écran.", "Unable to find a supported verification method.": "Impossible de trouver une méthode de vérification prise en charge.", @@ -1754,7 +1754,7 @@ "You have ignored this user, so their message is hidden. Show anyways.": "Vous avez ignoré cet utilisateur, donc ses messages sont cachés. Les montrer quand même.", "Custom (%(level)s)": "Personnalisé (%(level)s)", "Trusted": "Fiable", - "Not trusted": "Non vérifié", + "Not trusted": "Non fiable", "Direct message": "Message direct", "%(role)s in %(roomName)s": "%(role)s dans %(roomName)s", "Messages in this room are end-to-end encrypted.": "Les messages dans ce salon sont chiffrés de bout en bout.", @@ -1850,7 +1850,7 @@ "Enter secret storage recovery key": "Saisir la clé de récupération du coffre secret", "Unable to access secret storage. Please verify that you entered the correct recovery key.": "Impossible d’accéder au coffre secret. Vérifiez que vous avez saisi la bonne clé de récupération.", "If you've forgotten your recovery key you can .": "Si vous avez oublié votre clé de récupération vous pouvez .", - "Warning: You should only set up key backup from a trusted computer.": "Attention : Vous devriez uniquement configurer une sauvegarde de clés depuis un ordinateur de confiance.", + "Warning: You should only set up key backup from a trusted computer.": "Attention : Vous ne devriez configurer la sauvegarde de clés que depuis un ordinateur de confiance.", "If you've forgotten your recovery key you can ": "Si vous avez oublié votre clé de récupération, vous pouvez ", "Set up with a recovery key": "Configurer avec une clé de récupération", "As a safety net, you can use it to restore your access to encrypted messages if you forget your passphrase.": "Par mesure de sécurité, vous pouvez l’utiliser pour récupérer l’accès aux messages chiffrés si vous oubliez votre phrase de passe.", @@ -1918,7 +1918,7 @@ "Other users may not trust it": "D’autres utilisateurs pourraient ne pas lui faire confiance", "Later": "Plus tard", "Verify User": "Vérifier l’utilisateur", - "For extra security, verify this user by checking a one-time code on both of your devices.": "Pour une meilleure sécurité, vérifiez cet utilisateur en comparant un code à usage unique sur vos deux appareils.", + "For extra security, verify this user by checking a one-time code on both of your devices.": "Pour une sécurité supplémentaire, vérifiez cet utilisateur en comparant un code à usage unique sur vos deux appareils.", "Start Verification": "Commencer la vérification", "Unknown Command": "Commande inconnue", "Unrecognised command: %(commandText)s": "Commande non reconnue : %(commandText)s", @@ -2051,7 +2051,7 @@ "You have not verified this user. This user has verified all of their sessions.": "Vous n’avez pas vérifié cet utilisateur. Cet utilisateur a vérifié toutes ses sessions.", "You have verified this user. This user has verified all of their sessions.": "Vous avez vérifié cet utilisateur. Cet utilisateur a vérifié toutes ses sessions.", "Someone is using an unknown session": "Quelqu'un utilise une session inconnue", - "Some sessions for this user are not trusted": "Certaines sessions de cet utilisateur ne sont par fiables", + "Some sessions for this user are not trusted": "Certaines sessions de cet utilisateur ne sont pas fiables", "All sessions for this user are trusted": "Toutes les sessions de cet utilisateur sont fiables", "Some sessions in this encrypted room are not trusted": "Certaines sessions dans ce salon chiffré ne sont pas fiables", "All sessions in this encrypted room are trusted": "Toutes les sessions dans ce salon chiffré sont fiables", @@ -2101,7 +2101,7 @@ "Regain access to your account and recover encryption keys stored in this session. Without them, you won’t be able to read all of your secure messages in any session.": "Récupérez l’accès à votre compte et restaurez les clés de chiffrement dans cette session. Sans elles, vous ne pourrez pas lire tous vos messages chiffrés dans n’importe quelle session.", "Warning: Your personal data (including encryption keys) is still stored in this session. Clear it if you're finished using this session, or want to sign in to another account.": "Attention : Vos données personnelles (y compris les clés de chiffrement) seront stockées dans cette session. Effacez-les si vous n’utilisez plus cette session ou si vous voulez vous connecter à un autre compte.", "Sender session information": "Informations de session de l’expéditeur", - "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Mettez à niveau cette session pour l’autoriser de vérifier d’autres sessions, ce qui leur permettra d’accéder aux messages chiffrés et de les marquer comme fiables pour les autres utilisateurs.", + "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Mettez à niveau cette session pour l’autoriser à vérifier d’autres sessions, ce qui leur permettra d’accéder aux messages chiffrés et de les marquer comme fiables pour les autres utilisateurs.", "Set up encryption on this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Configurez le chiffrement sur cette session pour lui permettre de vérifier d’autres sessions, ce qui leur permettra d’accéder aux messages chiffrés et de les marquer comme fiables pour les autres utilisateurs.", "This session can now verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Cette session peut à présent vérifier d’autres sessions, ce qui leur permettra d’accéder aux messages chiffrés et de les marquer comme fiables pour les autres utilisateurs.", "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "Si vous ne configurez pas la récupération de messages sécurisée, vous ne pourrez pas restaurer l’historique de vos messages chiffrés si vous vous déconnectez ou si vous utilisez une autre session.", @@ -2126,5 +2126,27 @@ "If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.": "Si vous l’avez fait accidentellement, vous pouvez configurer les messages sécurisés sur cette session ce qui re-chiffrera l’historique des messages de cette session avec une nouvelle méthode de récupération.", "How fast should messages be downloaded.": "À quelle fréquence les messages doivent être téléchargés.", "of ": "sur ", - "Message downloading sleep time(ms)": "Temps d’attente de téléchargement des messages (ms)" + "Message downloading sleep time(ms)": "Temps d’attente de téléchargement des messages (ms)", + "Cancel entering passphrase?": "Annuler la saisie de la phrase de passe ?", + "If you cancel now, you won't complete your secret storage operation!": "Si vous annulez maintenant, vous ne terminerez pas votre opération du coffre secret !", + "Indexed rooms:": "Salons indexés :", + "%(crawlingRooms)s out of %(totalRooms)s": "%(crawlingRooms)s sur %(totalRooms)s", + "If you cancel now, you won't complete verifying the other user.": "Si vous annuler maintenant, vous ne terminerez pas la vérification de l’autre utilisateur.", + "If you cancel now, you won't complete verifying your other session.": "Si vous annulez maintenant, vous ne terminerez pas la vérification de votre autre session.", + "If you cancel now, you won't complete your secret storage operation.": "Si vous annulez maintenant, vous ne terminerez pas votre opération sur le coffre secret.", + "Show typing notifications": "Afficher les notifications de saisie", + "Reset cross-signing and secret storage": "Réinitialiser la signature croisée et le coffre secret", + "Destroy cross-signing keys?": "Détruire les clés de signature croisée ?", + "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "La suppression des clés de signature croisée est permanente. Tous ceux que vous avez vérifié vont voir des alertes de sécurité. Il est peu probable que ce soit ce que vous voulez faire, sauf si vous avez perdu tous les appareils vous permettant d’effectuer une signature croisée.", + "Clear cross-signing keys": "Vider les clés de signature croisée", + "Verify this session by completing one of the following:": "Vérifiez cette session en réalisant une des actions suivantes :", + "Scan this unique code": "Scannez ce code unique", + "or": "ou", + "Compare unique emoji": "Comparez des émojis uniques", + "Compare a unique set of emoji if you don't have a camera on either device": "Comparez une liste unique d’émojis si vous n’avez d’appareil photo sur aucun des deux appareils", + "Not Trusted": "Non fiable", + "%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) s’est connecté à une nouvelle session sans la vérifier :", + "Ask this user to verify their session, or manually verify it below.": "Demandez à cet utilisateur de vérifier sa session, ou vérifiez-la manuellement ci-dessous.", + "Manually Verify": "Vérifier manuellement", + "Verify by scanning": "Vérifier en scannant" } diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 32f5b237e7..09b9e4d6e0 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -2006,5 +2006,143 @@ "Unable to load session list": "A munkamenet listát nem lehet betölteni", "Delete %(count)s sessions|other": "%(count)s munkamenet törlése", "Delete %(count)s sessions|one": "%(count)s munkamenet törlése", - "This session is backing up your keys. ": "Ez a munkamenet elmenti a kulcsaidat. " + "This session is backing up your keys. ": "Ez a munkamenet elmenti a kulcsaidat. ", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "FIGYELEM: KULCS ELLENŐRZÉS HIBÁS! %(userId)s aláírási kulcsa és a munkamenet: %(deviceId)s ujjlenyomata \"%(fprint)s\" ami nem egyezik meg a megadott ujjlenyomattal ami \"%(fingerprint)s\". Ez jelentheti azt, hogy a kommunikációt lehallgatják!", + "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "A megadott aláírási kulcs megegyezik %(userId)s felhasználótól kapott aláírási kulccsal ebben a munkamenetben: %(deviceId)s. A munkamenet hitelesnek lett jelölve.", + "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Jelenleg a jelszó változtatás minden munkamenet végpontok közötti titkosító kulcsait alaphelyzetbe állítja, ezáltal a titkosított üzenetek olvashatatlanok lesznek, hacsak először nem mented ki a szobák kulcsait és töltöd vissza jelszóváltoztatás után. A jövőben ezt egyszerűsítjük majd.", + "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Ez az munkamenet nem menti el a kulcsaidat, de van létező mentésed ahonnan vissza tudsz állni és továbbléphetsz.", + "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Állítsd be ezen az munkameneten a Kulcs Mentést kijelentkezés előtt, hogy ne veszíts el olyan kulcsot ami csak ezen az eszközön van meg.", + "Connect this session to Key Backup": "Munkamenet csatlakoztatása a Kulcs Mentéshez", + "Backup has a signature from unknown session with ID %(deviceId)s": "A mentésnek ismeretlen munkamenetből származó aláírása van ezzel az azonosítóval: %(deviceId)s", + "Backup has a valid signature from this session": "A mentés érvényes aláírást tartalmaz ebből a munkamenetből", + "Backup has an invalid signature from this session": "A mentés érvénytelen aláírást tartalmaz ebből a munkamenetből", + "Backup has a valid signature from verified session ": "A mentés érvénes aláírást tartalmaz érvényes munkamenetből ", + "Backup has a valid signature from unverified session ": "A mentés érvénes aláírást tartalmaz ellenőrizetlen munkamenetből ", + "Backup has an invalid signature from verified session ": "A mentés érvénytelen aláírást tartalmaz érvényes munkamenetből ", + "Backup has an invalid signature from unverified session ": "A mentés érvénytelen aláírást tartalmaz ellenőrizetlen munkamenetből ", + "Backup is not signed by any of your sessions": "A mentés nem tartalmaz aláírást egyetlen munkamenetedből sem", + "This backup is trusted because it has been restored on this session": "Ez a mentés megbízható mert ebben a munkamenetben lett visszaállítva", + "Backup key stored in secret storage, but this feature is not enabled on this session. Please enable cross-signing in Labs to modify key backup state.": "A mentési kulcs a biztonsági tárolóban van elmentve, de ebben a munkamenetben ez a lehetőség nincs engedélyezve. Kérlek engedélyezd az eszközök közötti hitelesítést a Laborokban a kulcs mentés állapotának megváltoztatásához.", + "Your keys are not being backed up from this session.": "A kulcsaid nem kerülnek elmentésre erről a munkamenetről.", + "Enable desktop notifications for this session": "Asztali értesítések engedélyezése ebben a munkamenetben", + "Enable audible notifications for this session": "Hallható értesítések engedélyezése ebben a munkamenetben", + "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "A jelszavad sikeresen megváltozott. Addig nem kapsz push értesítéseket más munkamenetekben amíg nem jelentkezel vissza bennük", + "Session ID:": "Munkamenet azonosító:", + "Session key:": "Munkamenet kulcs:", + "Sessions": "Munkamenetek", + "A session's public name is visible to people you communicate with": "A munkamenet nyilvános neve megjelenik azoknál az embereknél, akikkel beszélgetsz", + "This user has not verified all of their sessions.": "Ez a felhasználó még nem ellenőrizte az összes munkamenetét.", + "You have not verified this user.": "Még nem ellenőrizted ezt a felhasználót.", + "You have verified this user. This user has verified all of their sessions.": "Ezt a felhasználót ellenőrizted. Ez a felhasználó hitelesítette az összes munkamenetét.", + "Someone is using an unknown session": "Valaki ismeretlen munkamenetet használ", + "Some sessions for this user are not trusted": "Ennek a felhasználónak néhány munkamenete nem megbízható", + "All sessions for this user are trusted": "A felhasználónak minden munkamenete megbízható", + "Some sessions in this encrypted room are not trusted": "Ebben a titkosított szobában nem minden munkamenet megbízható", + "All sessions in this encrypted room are trusted": "Ebben a titkosított szobában minden munkamenet megbízható", + "Mod": "Mod", + "Your key share request has been sent - please check your other sessions for key share requests.": "A kulcs megosztás kérésed el lett küldve - ellenőrizd a többi munkamenetedet a kulcskérések után.", + "Key share requests are sent to your other sessions automatically. If you rejected or dismissed the key share request on your other sessions, click here to request the keys for this session again.": "Kulcs megosztás kérés automatikusan el lett küldve neked a másik munkamenetekből. Ha elutasítottad vagy bezártad a kérést másik munkamenetedben, ide kattintva újrakérheted őket ehhez a munkamenethez.", + "If your other sessions do not have the key for this message you will not be able to decrypt them.": "Ha a többi munkameneted közül egyik sem tartalmazza a kulcsot ehhez az üzenethez, akkor ezt az üzenetet nem fogod tudni elolvasni.", + "Re-request encryption keys from your other sessions.": "Titkosítási kulcsok újrakérése a többi munkamenetből.", + "Encrypted by an unverified session": "Ellenőrizetlen munkamenet titkosította", + "Encrypted by a deleted session": "Törölt munkamenet által lett titkosítva", + "No sessions with registered encryption keys": "Nincs munkamenet regisztrált titkosítási kulcsokkal", + "Waiting for %(displayName)s to accept…": "%(displayName)s felhasználóra várakozás az elfogadáshoz…", + "Your messages are secured and only you and the recipient have the unique keys to unlock them.": "Az üzeneted biztonságban van és csak neked és a címzetteknek van meg az egyedi kulcs a visszafejtéshez.", + "Your messages are not secure": "Az üzeneteid nincsenek biztonságban", + "One of the following may be compromised:": "Valamelyik az alábbiak közül kompromittált:", + "Your homeserver": "Matrix szervered", + "The homeserver the user you’re verifying is connected to": "Az ellenőrizendő felhasználó ehhez a matrix szerverhez kapcsolódik:", + "Yours, or the other users’ internet connection": "A te vagy a másik felhasználó Internet kapcsolata", + "Yours, or the other users’ session": "A te vagy a másik felhasználó munkamenete", + "%(count)s sessions|other": "%(count)s munkamenet", + "%(count)s sessions|one": "%(count)s munkamenet", + "Hide sessions": "Munkamenetek elrejtése", + "Verify by emoji": "Ellenőrzés emodzsival", + "Verify by comparing unique emoji.": "Ellenőrzés egyedi emodzsik összehasonlításával.", + "Ask %(displayName)s to scan your code:": "Kérd meg %(displayName)s felhasználót, hogy olvassa be a kódot:", + "If you can't scan the code above, verify by comparing unique emoji.": "Ha nem tudod beolvasni az alábbi kódot, ellenőrizd az egyedi emodzsik összehasonlításával.", + "You've successfully verified %(displayName)s!": "Sikeresen ellenőrizted a felhasználót: %(displayName)s!", + "Got it": "Értem", + "Verification timed out. Start verification again from their profile.": "Ellenőrzés időtúllépés. Kezd újra az ellenőrzést a másik felhasználó profiljából.", + "%(displayName)s cancelled verification. Start verification again from their profile.": "%(displayName)s törölte az ellenőrzést. Kezd újra az ellenőrzést a felhasználó profiljából.", + "You cancelled verification. Start verification again from their profile.": "Törölted az ellenőrzést. Kezd újra az ellenőrzést a felhasználó profiljából.", + "Encryption enabled": "Titkosítás engedélyezve", + "Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "Ebben a szobában az üzenetek végpontok között titkosítottak. Tudj meg többet és ellenőrizd ezt a felhasználót a profiljában.", + "Encryption not enabled": "Titkosítás nincs engedélyezve", + "The encryption used by this room isn't supported.": "A szobában használt titkosítás nem támogatott.", + "Clear all data in this session?": "Minden adat törlése ebben a munkamenetben?", + "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Az adatok törlése ebből a munkamenetből végleges. A titkosított üzenetek elvesznek hacsak nincsenek elmentve a kulcsai.", + "Verify session": "Munkamenet ellenőrzése", + "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:": "A munkamenet megbízhatóságának eldöntéséhez ellenőrizd a kulcsot a Felhasználói Beállításokban ezen az eszközön, hogy megegyezik-e az alábbi kulccsal:", + "To verify that this session can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this session matches the key below:": "A munkamenet megbízhatóságának eldöntéséhez vedd fel a kapcsolatot a tulajdonosával valami másik módon (pl. személyesen vagy telefonhívással) és kérdezd meg, hogy a Felhasználói Beállításokban ugyanazt a kulcsot látja-e mint ami alul van:", + "Session name": "Munkamenet neve", + "Session key": "Munkamenet kulcs", + "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this session and you probably want to press the blacklist button instead.": "Ha egyezik akkor nyomd meg az ellenőriz gombot alul. Ha nem akkor valaki lehallgatja a munkamenetet és valószínű, hogy inkább a tiltólista gombra kellene kattintani.", + "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "A felhasználót ellenőrizve a munkamenet megbízhatónak lesz jelölve és ugyanakkor a munkamenetedet is megbízhatónak fogja jelölni náluk.", + "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Eszköz ellenőrzése és beállítás megbízhatónak. Az eszközben való megbízás megnyugtató lehet, ha végpontok közötti titkosítást használsz.", + "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Az eszköz ellenőrzése megbízhatónak fogja jelezni az eszközt és azok akik téged ellenőriztek megbíznak majd ebben az eszközödben.", + "You added a new session '%(displayName)s', which is requesting encryption keys.": "Új munkamenetet adtál hozzá '%(displayName)s' néven ami kéri a titkosítási kulcsokat.", + "Your unverified session '%(displayName)s' is requesting encryption keys.": "Az ellenőrizetlen munkameneted '%(displayName)s' néven titkosítási kulcsokat kér.", + "Loading session info...": "Munkamenet információk betöltése...", + "This will allow you to return to your account after signing out, and sign in on other sessions.": "Ezzel visszatérhetsz a fiókodba miután kijelentkeztél majd vissza egy másik munkamenetbe.", + "You are currently blacklisting unverified sessions; to send messages to these sessions you must verify them.": "Jelenleg tiltólistán vannak az ellenőrizetlen munkamenetek; hogy üzeneteket tudj küldeni ezekbe a munkamenetekbe ellenőrizned kell őket.", + "We recommend you go through the verification process for each session to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Javasoljuk, hogy minden munkamenetet ellenőrizz, hogy a tényleges tulajdonosához tartoznak vagy újraküldheted az üzenetet ha akarod anélkül, hogy ellenőriznéd őket.", + "Room contains unknown sessions": "A szoba ismeretlen munkameneteket tartalmaz", + "\"%(RoomName)s\" contains sessions that you haven't seen before.": "\"%(RoomName)s\" még nem látott munkameneteket tartalmaz.", + "Unknown sessions": "Ismeretlen munkamenetek", + "Cancel entering passphrase?": "Megszakítod a jelmondat bevitelét?", + "If you cancel now, you won't complete your secret storage operation!": "Ha most megszakítod, akkor nem fejezed be a biztonságos tárolóval kapcsolatos műveletet!", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your passphrase.": "A jelmondat megadásával hozzáférhetsz a biztonságos üzeneteidhez és az eszközök közötti hitelesítéshez használt személyazonosságodhoz, hogy más munkameneteket hitelesíthess.", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.": "A visszaállítási kulcs megadásával hozzáférhetsz a biztonságos üzeneteidhez és az eszközök közötti hitelesítéshez használt személyazonosságodhoz, hogy más munkameneteket hitelesíthess.", + "Recovery key mismatch": "A visszaállítási kulcs nem megfelelő", + "Incorrect recovery passphrase": "A visszaállítási jelmondat helytelen", + "Backup restored": "Mentés visszaállítva", + "Enter recovery passphrase": "Visszaállítási jelmondat megadása", + "Enter recovery key": "Visszaállítási kulcs megadása", + "Confirm your identity by entering your account password below.": "A fiók jelszó megadásával erősítsd meg a személyazonosságodat.", + "Message not sent due to unknown sessions being present": "Ismeretlen munkamenet miatt az üzenet nem került elküldésre", + "Show sessions, send anyway or cancel.": "Munkamenetek megmutatása, küldés mindenképpen vagy küldés megszakítása.", + "Your new session is now verified. Other users will see it as trusted.": "Az új munkameneted ellenőrizve. Mások megbízhatónak fogják látni.", + "Without completing security on this session, it won’t have access to encrypted messages.": "Amíg a biztonság nincs beállítva a munkameneten nem fér hozzá a titkosított üzenetekhez.", + "Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.": "A jelszó változtatás minden munkamenet végpontok közötti titkosító kulcsait alaphelyzetbe állítja, ezáltal a titkosított üzenetek olvashatatlanok lesznek, hacsak először nem mented ki a szobák kulcsait és töltöd vissza jelszóváltoztatás után. A jövőben ezt egyszerűsítjük majd.", + "You have been logged out of all sessions and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Kijelentkeztettünk minden eszközödből és nem kapsz értesítéseket sem. Az értesítések újra engedélyezéséhez jelentkezz be újra az eszközökön.", + "Regain access to your account and recover encryption keys stored in this session. Without them, you won’t be able to read all of your secure messages in any session.": "Szerezd vissza a hozzáférést a fiókodhoz és állítsd vissza az elmentett titkosítási kulcsokat ebben a munkamenetben. Ezek nélkül egyetlen munkamenetben sem tudod elolvasni a titkosított üzeneteidet.", + "Warning: Your personal data (including encryption keys) is still stored in this session. Clear it if you're finished using this session, or want to sign in to another account.": "Figyelmeztetés: A személyes adataid (beleértve a titkosító kulcsokat is) továbbra is az eszközön vannak tárolva. Ha az eszközt nem használod tovább vagy másik fiókba szeretnél bejelentkezni, töröld őket.", + "Sender session information": "Küldő munkamenet információ", + "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Fejleszd ezt a munkamenetet, hogy más munkamenetet tudj vele hitelesíteni amivel hozzáférnek a titkosított üzenetekhez és megbízhatónak lesznek jelölve más felhasználók számára.", + "Set up encryption on this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Állítsd be a titkosítást ezen a munkameneten, hogy más munkamenetet tudj vele hitelesíteni amivel hozzáférnek a titkosított üzenetekhez és megbízhatónak lesznek jelölve más felhasználók számára.", + "Back up my encryption keys, securing them with the same passphrase": "Mentsd el a titkosítási kulcsaimat és védd őket ugyanazzal a jelmondattal", + "Keep a copy of it somewhere secure, like a password manager or even a safe.": "A másolatot tartsd biztonságos helyen, mint pl. egy jelszókezelő (vagy széf).", + "Your recovery key": "Visszaállítási kulcsod", + "Copy": "Másol", + "You can now verify your other devices, and other users to keep your chats safe.": "Már ellenőrizheted a többi eszközödet és más felhasználókat, hogy a beszélgetéseidet biztonságban tudhasd.", + "Make a copy of your recovery key": "Készíts másolatot a visszaállítási kulcsodról", + "You're done!": "Kész!", + "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "A Biztonságos Üzenet Visszaállítás beállítása nélkül kijelentkezés után vagy másik munkamenetet használva nem tudod visszaállítani a titkosított üzeneteidet.", + "Create key backup": "Kulcs mentés készítése", + "This session is encrypting history using the new recovery method.": "Ez a munkamenet az új visszaállítási metódussal titkosítja a régi üzeneteket.", + "This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "A munkamenet észrevette, hogy a visszaállítási jelmondat és a kulcs a Biztonságos Üzenetekhez törölve lett.", + "If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.": "Ha véletlenül tetted, beállíthatod a Biztonságos Üzeneteket ezen a munkameneten ami újra titkosítja a régi üzeneteket az visszaállítási eljárással.", + "Indexed rooms:": "Indexált szobák:", + "%(crawlingRooms)s out of %(totalRooms)s": "%(crawlingRooms)s / %(totalRooms)s", + "Message downloading sleep time(ms)": "Üzenet letöltés alvási idő (ms)", + "If you cancel now, you won't complete verifying the other user.": "A másik felhasználó ellenőrzését nem fejezed be, ha ezt most megszakítod.", + "If you cancel now, you won't complete verifying your other session.": "A másik munkameneted ellenőrzését nem fejezed be, ha ezt most megszakítod.", + "If you cancel now, you won't complete your secret storage operation.": "A Biztonsági tárolóval kapcsolatos műveletet nem fejezed be ha ezt most megszakítod.", + "Show typing notifications": "Gépelés visszajelzés megjelenítése", + "Verify this session by completing one of the following:": "Ellenőrizd ezt a munkamenetet az alábbiak egyikével:", + "Scan this unique code": "Ennek az egyedi kódnak a beolvasása", + "or": "vagy", + "Compare unique emoji": "Egyedi emodzsik összehasonlítása", + "Compare a unique set of emoji if you don't have a camera on either device": "Hasonlítsd össze az egyedi emodzsikat ha valamelyik eszközön nincs kamera", + "Not Trusted": "Megbízhatatlan", + "%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) új munkamenetbe lépett be anélkül, hogy ellenőrizte volna:", + "Ask this user to verify their session, or manually verify it below.": "Kérd meg a felhasználót, hogy hitelesítse a munkamenetét vagy ellenőrizd kézzel alább.", + "Manually Verify": "Manuális ellenőrzés", + "Verify by scanning": "Ellenőrzés kód beolvasással", + "Destroy cross-signing keys?": "Eszközök közti hitelesítési kulcsok megsemmisítése?", + "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Eszközök közti hitelesítési kulcsok törlése végleges. Mindenki akit ezzel hitelesítettél biztonsági figyelmeztetéseket fog látni. Hacsak nem vesztetted el az összes eszközödet amivel eszközök közti hitelesítést tudsz végezni, nem valószínű, hogy ezt szeretnéd tenni.", + "Clear cross-signing keys": "Eszközök közti hitelesítési kulcsok törlése", + "Reset cross-signing and secret storage": "Eszközök közti hitelesítés és biztonsági tároló visszaállítása" } diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index f6ee0f82ff..e3be1a1aae 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2009,5 +2009,126 @@ "Verify this device by confirming the following number appears on its screen.": "Verifica questo dispositivo confermando che il seguente numero appare sullo schermo.", "Verify yourself & others to keep your chats safe": "Verifica te stesso e gli altri per mantenere sicure le chat", "Backup key stored in secret storage, but this feature is not enabled on this session. Please enable cross-signing in Labs to modify key backup state.": "Backup chiavi salvato nell'archivio segreto, ma questa funzione non è attiva in questa sessione. Attiva la firma incrociata in Laboratori per modificare lo stato del backup chiavi.", - "Your keys are not being backed up from this session.": "Il backup chiavi non viene fatto per questa sessione." + "Your keys are not being backed up from this session.": "Il backup chiavi non viene fatto per questa sessione.", + "Enable desktop notifications for this session": "Attiva le notifiche desktop per questa sessione", + "Enable audible notifications for this session": "Attiva le notifiche audio per questa sessione", + "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "La tua password è stata cambiata correttamente. Non riceverai notifiche push in altre sessioni finchè non riesegui l'accesso in esse", + "Session ID:": "ID sessione:", + "Session key:": "Chiave sessione:", + "Message search": "Ricerca messaggio", + "Sessions": "Sessioni", + "A session's public name is visible to people you communicate with": "Il nome pubblico di una sessione è visibile alle persone con cui comunichi", + "This room is bridging messages to the following platforms. Learn more.": "Questa stanza fa un bridge dei messaggi con le seguenti piattaforme. Maggiori informazioni.", + "This room isn’t bridging messages to any platforms. Learn more.": "Questa stanza non fa un bridge dei messaggi con alcuna piattaforma. Maggiori informazioni.", + "Bridges": "Bridge", + "This user has not verified all of their sessions.": "Questo utente non ha verificato tutte le sue sessioni.", + "You have not verified this user.": "Non hai verificato questo utente.", + "You have verified this user. This user has verified all of their sessions.": "Hai verificato questo utente. Questo utente ha verificato tutte le sue sessioni.", + "Someone is using an unknown session": "Qualcuno sta usando una sessione sconosciuta", + "Some sessions for this user are not trusted": "Alcune sessioni di questo utente non sono fidate", + "All sessions for this user are trusted": "Tutte le sessioni di questo utente sono fidate", + "Some sessions in this encrypted room are not trusted": "Alcune sessioni in questa stanza cifrata non sono fidate", + "All sessions in this encrypted room are trusted": "Tutte le sessioni in questa stanza cifrata sono fidate", + "Your key share request has been sent - please check your other sessions for key share requests.": "La tua richiesta di condivisione chiavi è stata inviata - controlla le tue altre sessioni per le richieste.", + "Key share requests are sent to your other sessions automatically. If you rejected or dismissed the key share request on your other sessions, click here to request the keys for this session again.": "Le richieste di condivisione chiavi vengono inviate alle tue altre sessioni automaticamente. Se sulle altre sessioni l'hai rifiutata o annullata, clicca qui per chiedere di nuovo le chiavi per questa sessione.", + "If your other sessions do not have the key for this message you will not be able to decrypt them.": "Se le altre sessioni non hanno la chiave per questo messaggio non sarai in grado di decifrarlo.", + "Re-request encryption keys from your other sessions.": "Chiedi di nuovo le chiavi di cifratura dalle altre sessioni.", + "Encrypted by an unverified session": "Cifrato da una sessione non verificata", + "Encrypted by a deleted session": "Cifrato da una sessione eliminata", + "No sessions with registered encryption keys": "Nessuna sessione con chiavi di cifratura registrate", + "Waiting for %(displayName)s to accept…": "In attesa che %(displayName)s accetti…", + "Your messages are secured and only you and the recipient have the unique keys to unlock them.": "I tuoi messaggi sono protetti e solo tu ed il destinatario avete le chiavi univoche per sbloccarli.", + "Your messages are not secure": "I tuoi messaggi non sono sicuri", + "One of the following may be compromised:": "Uno dei seguenti potrebbe essere compromesso:", + "Your homeserver": "Il tuo homeserver", + "The homeserver the user you’re verifying is connected to": "L'homeserver al quale è connesso l'utente che stai verificando", + "Yours, or the other users’ internet connection": "La tua connessione internet o quella degli altri utenti", + "Yours, or the other users’ session": "La tua sessione o quella degli altri utenti", + "%(count)s sessions|other": "%(count)s sessioni", + "%(count)s sessions|one": "%(count)s sessione", + "Hide sessions": "Nascondi sessione", + "Verify by emoji": "Verifica via emoji", + "Verify by comparing unique emoji.": "Verifica confrontando emoji specifici.", + "Ask %(displayName)s to scan your code:": "Chiedi a %(displayName)s di scansionare il tuo codice:", + "If you can't scan the code above, verify by comparing unique emoji.": "Se non riesci a scansionare il codice sopra, verifica confrontando emoji specifiche.", + "You've successfully verified %(displayName)s!": "Hai verificato correttamente %(displayName)s!", + "Got it": "Capito", + "Verification timed out. Start verification again from their profile.": "Verifica scaduta. Inizia di nuovo la verifica dal suo profilo.", + "%(displayName)s cancelled verification. Start verification again from their profile.": "%(displayName)s ha annullato la verifica. Inizia di nuovo la verifica dal suo profilo.", + "You cancelled verification. Start verification again from their profile.": "Hai annullato la verifica. Inizia di nuovo la verifica dal suo profilo.", + "Encryption enabled": "Cifratura attivata", + "Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "I messaggi in questa stanza sono cifrati end-to-end. Maggiori info e verifica di questo utente nel suo profilo.", + "Encryption not enabled": "Cifratura non attivata", + "The encryption used by this room isn't supported.": "La cifratura usata da questa stanza non è supportata.", + "Clear all data in this session?": "Svuotare tutti i dati in questa sessione?", + "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Lo svuotamento dei dati di questa sessione è permanente. I messaggi cifrati andranno persi a meno non si abbia un backup delle loro chiavi.", + "Verify session": "Verifica sessione", + "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Per verficare che questa sessione sia fidata, controlla che la chiave che vedi nelle impostazioni utente su quel dispositivo corrisponda a questa sotto:", + "To verify that this session can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this session matches the key below:": "Per verificare che questa sessione sia fidata, contatta il suo proprietario usando altri metodi (es. di persona o per telefono) e chiedi se la chiave che vede nelle sue impostazioni utente di questa sessione corrisponde con questa sotto:", + "Session name": "Nome sessione", + "Session key": "Chiave sessione", + "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this session and you probably want to press the blacklist button instead.": "Se corrisponde, premi il pulsante di verifica sottostante. Se non corrisponde, qualcuno sta intercettando questa sessione e dovresti invece premere il pulsante della lista nera.", + "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "La verifica di questo utente contrassegnerà come fidata la sua sessione a te e viceversa.", + "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifica questo dispositivo per segnarlo come fidato. Fidarsi di questo dispositivo offre a te e agli altri utenti una maggiore tranquillità nell'uso di messaggi cifrati end-to-end.", + "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "La verifica di questo dispositivo lo segnerà come fidato e gli utenti che si sono verificati con te si fideranno di questo dispositivo.", + "If you can't find someone, ask them for their username, share your username (%(userId)s) or profile link.": "Se non riesci a trovare qualcuno, chiedigli il nome utente, condividi il tuo (%(userId)s) o il collegamento al profilo.", + "You added a new session '%(displayName)s', which is requesting encryption keys.": "Hai aggiunto una nuova sessione '%(displayName)s', che sta chiedendo le chiavi di cifratura.", + "Your unverified session '%(displayName)s' is requesting encryption keys.": "La tua sessione non verificata '%(displayName)s' sta chiedendo le chiavi di cifratura.", + "Loading session info...": "Caricamento info di sessione...", + "New session": "Nuova sessione", + "Use this session to verify your new one, granting it access to encrypted messages:": "Usa questa sessione per verificare quella nuova, dandole accesso ai messaggi cifrati:", + "If you didn’t sign in to this session, your account may be compromised.": "Se non hai fatto l'accesso a questa sessione, il tuo account potrebbe essere compromesso.", + "This wasn't me": "Non ero io", + "This will allow you to return to your account after signing out, and sign in on other sessions.": "Ciò ti permetterà di tornare al tuo account dopo la disconnessione e di accedere in altre sessioni.", + "You are currently blacklisting unverified sessions; to send messages to these sessions you must verify them.": "Stai attualmente bloccando sessioni non verificate; per inviare messaggi a queste sessioni devi verificarle.", + "We recommend you go through the verification process for each session to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Ti consigliamo di eseguire il processo di verifica per ogni sessione per confermare l'appartenenza al loro legittimo proprietario, ma puoi reinviare il messaggio senza la verifica se lo preferisci.", + "Room contains unknown sessions": "La stanza contiene sessioni sconosciute", + "\"%(RoomName)s\" contains sessions that you haven't seen before.": "\"%(RoomName)s\" contiene sessioni che non hai mai visto prima.", + "Unknown sessions": "Sessioni sconosciute", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your passphrase.": "Accedi alla tua cronologia di messaggi sicuri e all'identità a firma incrociata per verificare altre sessioni inserendo la tua password.", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.": "Accedi alla tua cronologia di messaggi sicuri e all'identità a firma incrociata per verificare altre sessioni inserendo la tua chiave di recupero.", + "Recovery key mismatch": "La chiave di recupero non corrisponde", + "Incorrect recovery passphrase": "Password di recupero errata", + "Backup restored": "Backup ripristinato", + "Enter recovery passphrase": "Inserisci password di recupero", + "Enter recovery key": "Inserisci chiave di recupero", + "Confirm your identity by entering your account password below.": "Conferma la tua identità inserendo la password dell'account sotto.", + "Message not sent due to unknown sessions being present": "Messaggio non inviato a causa della presenza di sessioni sconosciute", + "Show sessions, send anyway or cancel.": "Mostra le sessioni, invia comunque o annulla.", + "Your new session is now verified. Other users will see it as trusted.": "La tua nuova sessione è ora verificata. Gli altri utenti la vedranno come fidata.", + "Without completing security on this session, it won’t have access to encrypted messages.": "Senza completare la sicurezza di questa sessione, essa non avrà accesso ai messaggi cifrati.", + "Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.": "La modifica della password reimposterà qualsiasi chiave di cifratura end-to-end su tutte le sessioni, rendendo illeggibile la cronologia delle chat cifrate. Configura il Backup Chiavi o esporta le tue chiavi della stanza da un'altra sessione prima di reimpostare la password.", + "You have been logged out of all sessions and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Sei stato disconnesso da tutte le sessioni e non riceverai più notifiche push. Per riattivare le notifiche, riaccedi su ogni dispositivo.", + "Regain access to your account and recover encryption keys stored in this session. Without them, you won’t be able to read all of your secure messages in any session.": "Riprendi l'accesso al tuo account e recupera le chiavi di cifratura memorizzate in questa sessione. Senza di esse, non sarai in grado di leggere tutti i tuoi messaggi sicuri in qualsiasi sessione.", + "Warning: Your personal data (including encryption keys) is still stored in this session. Clear it if you're finished using this session, or want to sign in to another account.": "Attenzione: i tuoi dati personali (incluse le chiavi di cifratura) sono ancora memorizzati in questa sessione. Cancellali se hai finito di usare questa sessione o se vuoi accedere ad un altro account.", + "Sender session information": "Informazioni sessione del mittente", + "Restore your key backup to upgrade your encryption": "Ripristina il tuo backup chiavi per aggiornare la cifratura", + "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Aggiorna questa sessione per consentirle di verificare altre sessioni, garantendo loro l'accesso ai messaggi cifrati e contrassegnandole come fidate per gli altri utenti.", + "Set up encryption on this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Imposta la cifratura su questa sessione per consentirle di verificare le altre sessioni, garantendo loro l'accesso ai messaggi cifrati e contrassegnandole come fidate per gli altri utenti.", + "Back up my encryption keys, securing them with the same passphrase": "Fai il backup delle mie chiavi di cifratura, proteggendole con la stessa password", + "Keep a copy of it somewhere secure, like a password manager or even a safe.": "Conservane una copia in un luogo sicuro, come un gestore di password o una cassaforte.", + "Your recovery key": "La tua chiave di recupero", + "Copy": "Copia", + "You can now verify your other devices, and other users to keep your chats safe.": "Ora puoi verificare i tuoi altri dispositivi e gli altri utenti per tenere al sicuro le tue chat.", + "Make a copy of your recovery key": "Fai una copia della chiave di recupero", + "You're done!": "Hai finito!", + "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "Senza configurare il Recupero Messaggi Sicuri, non potrai ripristinare la cronologia di messaggi cifrati se ti disconnetti o se usi un'altra sessione.", + "Create key backup": "Crea backup chiavi", + "This session is encrypting history using the new recovery method.": "Questa sessione sta cifrando la cronologia usando il nuovo metodo di recupero.", + "This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "Questa sessione ha rilevato che la tua password di recupero e la chiave per i Messaggi Sicuri sono state rimosse.", + "If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.": "Se l'hai fatto accidentalmente, puoi configurare Messaggi Sicuri su questa sessione che cripterà nuovamente la cronologia dei messaggi con un nuovo metodo di recupero.", + "If disabled, messages from encrypted rooms won't appear in search results.": "Se disattivato, i messaggi delle stanze cifrate non appariranno nei risultati di ricerca.", + "Disable": "Disattiva", + "Not currently downloading messages for any room.": "Nessuno scaricamento di messaggi in corso per alcuna stanza.", + "Downloading mesages for %(currentRoom)s.": "Scaricamento messaggi per %(currentRoom)s.", + "Riot is securely caching encrypted messages locally for them to appear in search results:": "Riot sta tenendo in cache localmente i messaggi cifrati in modo sicuro affinché appaiano nei risultati di ricerca:", + "of ": "di ", + "Message downloading sleep time(ms)": "Tempo di attesa scaricamento messaggi (ms)", + "If you cancel now, you won't complete verifying the other user.": "Se adesso annulli, non completerai la verifica dell'altro utente.", + "If you cancel now, you won't complete verifying your other session.": "Se adesso annulli, non completerai la verifica dell'altra tua sessione.", + "If you cancel now, you won't complete your secret storage operation.": "Se adesso annulli, non completerai l'operazione dell'archivio segreto.", + "Cancel entering passphrase?": "Annullare l'inserimento della password?", + "Mod": "Moderatore", + "Indexed rooms:": "Stanze indicizzate:", + "%(crawlingRooms)s out of %(totalRooms)s": "%(crawlingRooms)s di %(totalRooms)s" } diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index cfd829d718..144c8c321f 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -388,7 +388,7 @@ "To continue, please enter your password.": "Voer uw wachtwoord in om verder te gaan.", "Blacklist": "Blokkeren", "Unblacklist": "Deblokkeren", - "I verify that the keys match": "Ik verifieer dat de sleutels overeenkomen", + "I verify that the keys match": "Ik verklaar dat de sleutels overeenkomen", "Unable to restore session": "Sessieherstel lukt niet", "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "Als u reeds een recentere versie van Riot heeft gebruikt is uw sessie mogelijk onverenigbaar met deze versie. Sluit dit venster en ga terug naar die recentere versie.", "Unknown Address": "Onbekend adres", @@ -1679,5 +1679,100 @@ "Verify this session": "Deze sessie verifiëren", "Encryption upgrade available": "Er is een bijgewerkte versleuteling beschikbaar", "You can use /help to list available commands. Did you mean to send this as a message?": "Type /help om alle opdrachten te zien. Was het uw bedoeling dit als bericht te sturen?", - "Help": "Hulp" + "Help": "Hulp", + "Set up encryption": "Versleuteling instellen", + "Unverified session": "Ongeverifieerde sessie", + "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Dit vergt toegang tot de verstek-identiteitsserver om emailadres of telefoonummer te valideren, maar die server heeft kent geen gebruiksvoorwaarden.", + "Trust": "Vertrouw", + "Custom (%(level)s)": "Aangepast (%(level)s)", + "Error upgrading room": "Bijwerken gesprek mislukt", + "Double check that your server supports the room version chosen and try again.": "Ga nogmaals na dat de server de gekozen gespreksversie ondersteunt, en probeer dan opnieuw.", + "Verifies a user, session, and pubkey tuple": "Verifieert een combinatie van gebruiker+sessie+publieke sleutel", + "Unknown (user, session) pair:": "Onbekende combinatie gebruiker+sessie:", + "Session already verified!": "Sessie al geverifieerd!", + "WARNING: Session already verified, but keys do NOT MATCH!": "PAS OP: De sessie is al geverifieerd, maar de sleutels komen NIET OVEREEN!", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "PAS OP: Sleutelverificatie MISLUKT! De combinatie %userId)s + sessie %(deviceId)s is ondertekend met \"%(fprint)s\" - maar de opgegeven sleutel is \"%(fingerprint)s\". Wellicht worden uw berichten onderschept!", + "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "De door u verschafte en de van %(userId)ss sessie %(deviceId)s verkregen sleutels komen overeen. De sessie is daarmee geverifieerd.", + "%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName) heeft %(addedAddresses)s en %(count)d andere adressen aan dit gesprek toegevoegd", + "%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s heeft dit gesprek ontdaan van %(removedAddresses)s en %(count)s andere adressen", + "%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s heeft dit gesprek ontdaan van %(countRemoved)s adressen, en er %(countAdded)s toegevoegd", + "%(senderName)s placed a voice call.": "%(senderName)s probeert u te bellen.", + "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s poogt u te bellen, maar uw browser ondersteunt dat niet", + "%(senderName)s placed a video call.": "%(senderName)s doet een video-oproep.", + "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s doet een video-oproep, maar uw browser ondersteunt dat niet", + "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s heeft de banregel voor gebruikers die met %(glob)s stroken verwijderd", + "%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s heeft de banregel voor gesprekken die met %(glob)s stroken verwijderd", + "%(senderName)s removed the rule banning servers matching %(glob)s": "%(senderName)s heeft de banregel voor servers die met %(glob)s stroken verwijderd", + "%(senderName)s removed a ban rule matching %(glob)s": "%(senderName)s heeft een banregel die met %(glob)s strookt verwijderd", + "%(senderName)s updated an invalid ban rule": "%(senderName)s heeft een ongeldige banregel bijgewerkt", + "%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s": "%(senderName)s heeft de regel bijgewerkt die gebruikers die met %(glob)s sporen verbant vanwege %(reason)s", + "%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s heeft de regel bijgewerkt die gesprekken die met %(glob)s sporen verbant vanwege %(reason)s", + "%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s heeft de regel bijgewerkt die servers die met %(glob)s sporen verbant vanwege %(reason)s", + "%(senderName)s updated a ban rule matching %(glob)s for %(reason)s": "%(senderName)s heeft een banregel vanwege %(reason)s die met %(glob)s spoort bijgewerkt", + "%(senderName)s created a rule banning users matching %(glob)s for %(reason)s": "%(senderName)s heeft geregeld dat gebruikers die met %(glob)s sporen verbannen worden vanwege %(reason)s", + "%(senderName)s created a rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s heeft geregeld dat gesprekken die met %(glob)s sporen verbannen worden vanwege %(reason)s", + "%(senderName)s created a rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s heeft geregeld dat servers die met %(glob)s sporen verbannen worden vanwege %(reason)s", + "%(senderName)s created a ban rule matching %(glob)s for %(reason)s": "%(senderName)s heeft geregeld dat alles wat met %(glob)s spoort verbannen wordt vanwege %(reason)s", + "%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s heeft het patroon van een banregel voor gebruikers wegens %(reason)s aangepast van %(oldGlob)s tot %(newGlob)s", + "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s heeft het patroon van een banregel voor gesprekken wegens %(reason)s aangepast van %(oldGlob)s tot %(newGlob)s", + "%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s heeft het patroon van een banregel voor servers wegens %(reason)s aangepast van %(oldGlob)s tot %(newGlob)s", + "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s heeft het patroon van een banregel wegens %(reason)s aangepast van %(oldGlob)s tot %(newGlob)s", + "The message you are trying to send is too large.": "Uw bericht is te lang om te verzenden.", + "a few seconds ago": "enige tellen geleden", + "about a minute ago": "een minuut of zo geleden", + "%(num)s minutes ago": "%(num)s minuten geleden", + "about an hour ago": "een uur of zo geleden", + "%(num)s hours ago": "%(num)s uren geleden", + "about a day ago": "een dag of zo geleden", + "%(num)s days ago": "%(num)s dagen geleden", + "a few seconds from now": "over een paar tellen", + "about a minute from now": "over een minuut of zo", + "%(num)s minutes from now": "over %(num)s minuten", + "about an hour from now": "over een uur of zo", + "%(num)s hours from now": "over %(num)s uur", + "about a day from now": "over een dag of zo", + "%(num)s days from now": "over %(num)s dagen", + "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", + "Try out new ways to ignore people (experimental)": "Nieuwe manieren om mensen te negeren uitproberen (nog in ontwikkeling)", + "Show a presence dot next to DMs in the room list": "Toon aanwezigheid bij tweegesprekken in de gesprekkenlijst", + "Enable cross-signing to verify per-user instead of per-session (in development)": "Gebruik gebruikersverificatie in plaats van sessieverificatie (nog in ontwikkeling)", + "Enable local event indexing and E2EE search (requires restart)": "Indexeer lokaal gebeurtenissen en maak zo E2EE-zoeken mogelijk (vergt een herstart)", + "Show info about bridges in room settings": "Toon bruginformatie in gespreksinstellingen", + "Show padlocks on invite only rooms": "Toon hangsloten op besloten gesprekken", + "Match system theme": "Pas aan aan systeemthema", + "Never send encrypted messages to unverified sessions from this session": "Zend vanaf deze sessie nooit versleutelde berichten naar ongeverifieerde sessies", + "Never send encrypted messages to unverified sessions in this room from this session": "Zend vanaf deze sessie nooit versleutelde berichten naar ongeverifieerde sessies in dit gesprek", + "Enable message search in encrypted rooms": "Sta zoeken in versleutelde gesprekken toe", + "Keep secret storage passphrase in memory for this session": "Onthoud in deze sessie het wachtwoord voor sleutelopslag", + "How fast should messages be downloaded.": "Ophaalfrequentie van berichten.", + "My Ban List": "Mijn banlijst", + "This is your list of users/servers you have blocked - don't leave the room!": "Dit is de lijst van door u geblokkeerde servers/gebruikers. Verlaat dit gesprek niet!", + "Confirm the emoji below are displayed on both devices, in the same order:": "Bevestig dat beide apparaten dezelfde emojis in dezelfde volgorde tonen:", + "Verify this device by confirming the following number appears on its screen.": "Verifieer dit apparaat door te bevestigen dat het scherm het volgende getal toont.", + "Waiting for %(displayName)s to verify…": "Wachten tot %(displayName)s geverifieerd heeft…", + "They match": "Ze komen overeen", + "They don't match": "Ze komen niet overeen", + "To be secure, do this in person or use a trusted way to communicate.": "Doe dit voor de zekerheid in persona, of via een betrouwbaar communicatiemedium.", + "Lock": "Hangslot", + "Verify yourself & others to keep your chats safe": "Verifieer jezelf en anderen om je gesprekken veilig te houden", + "Other users may not trust it": "Mogelijk wantrouwen anderen het", + "Upgrade": "Bijwerken", + "Verify": "Verifiëren", + "Later": "Later", + "Review": "Contrôle", + "Decline (%(counter)s)": "Afwijzen (%(counter)s)", + "This bridge was provisioned by .": "Dank aan voor de brug.", + "This bridge is managed by .": "Brug onderhouden door .", + "Workspace: %(networkName)s": "Werkruimte: %(networkName)s", + "Channel: %(channelName)s": "Kanaal: %(channelName)s", + "Show less": "Minder tonen", + "Show more": "Meer tonen", + "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Momenteel stelt een wachtwoordswijziging alle berichtsleutels in alle sessies opnieuw in, en maakt zo oude versleutelde berichten onleesbaar - tenzij u uw sleutels eerst wegschrijft, en na afloop weer inleest. Dit zal verbeterd worden.", + "Add users and servers you want to ignore here. Use asterisks to have Riot match any characters. For example, @bot:* would ignore all users that have the name 'bot' on any server.": "Geef hier te negeren gebruikers en servers in. Asterisken staan voor willekeurige tekenreeksen; zo leidt @bot:* tot het negeren van gebruikers die 'bot' heten op alle servers.", + "in memory": "in het geheugen", + "not found": "niet gevonden", + "Your homeserver does not support session management.": "Uw thuisserver ondersteunt geen sessiebeheer.", + "Unable to load session list": "Kan sessielijst niet laden", + "Delete %(count)s sessions|other": "Verwijder %(count)s sessies", + "Delete %(count)s sessions|one": "Verwijder %(count)s sessie" } diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index eb0e8653cd..4510eec170 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -493,7 +493,7 @@ "Search failed": "Kërkimi shtoi", "No more results": "Jo më tepër përfundime", "Room": "Dhomë", - "Clear filter": "Pastroje filtrin", + "Clear filter": "Spastroje filtrin", "Uploading %(filename)s and %(count)s others|other": "Po ngarkohet %(filename)s dhe %(count)s të tjera", "Uploading %(filename)s and %(count)s others|zero": "Po ngarkohet %(filename)s", "Uploading %(filename)s and %(count)s others|one": "Po ngarkohet %(filename)s dhe %(count)s tjetër", @@ -741,8 +741,8 @@ "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)sndryshoi emrin e vet %(count)s herë", "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)sndryshuan avatarët e tyre %(count)s herë", "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)sndryshoi avatarin e vet %(count)s herë", - "Clear cache and resync": "Pastro fshehtinën dhe rinjëkohëso", - "Clear Storage and Sign Out": "Pastro Depon dhe Dil", + "Clear cache and resync": "Spastro fshehtinën dhe rinjëkohëso", + "Clear Storage and Sign Out": "Spastro Depon dhe Dil", "COPY": "KOPJOJE", "e.g. %(exampleValue)s": "p.sh., %(exampleValue)s", "e.g. ": "p.sh., ", @@ -883,7 +883,7 @@ "Riot now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!": "Riot-i tani përdor 3 deri 5 herë më pak kujtesë, duke ngarkuar të dhëna mbi përdorues të tjerë vetëm kur duhen. Ju lutemi, prisni, teksa njëkohësojmë të dhënat me shërbyesin!", "Put a link back to the old room at the start of the new room so people can see old messages": "Vendosni në krye të dhomës së re një lidhje për te dhoma e vjetër, që njerëzit të mund të shohin mesazhet e vjetër", "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.": "Nëse më herët keni përdorur një version më të freskët të Riot-it, sesioni juaj mund të jetë i papërputhshëm me këtë version. Mbylleni këtë dritare dhe kthehuni te versioni më i ri.", - "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Pastrimi i gjërave të depozituara në shfletuesin tuaj mund ta ndreqë problemin, por kjo do të sjellë nxjerrjen tuaj nga llogari dhe do ta bëjë të palexueshëm çfarëdo historiku të fshehtëzuar të bisedës.", + "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Spastrimi i gjërave të depozituara në shfletuesin tuaj mund ta ndreqë problemin, por kjo do të sjellë nxjerrjen tuaj nga llogari dhe do ta bëjë të palexueshëm çfarëdo historiku të fshehtëzuar të bisedës.", "If you already have a Matrix account you can log in instead.": "Nëse keni tashmë një llogari Matrix, mund të bëni hyrjen.", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Krijoni një bashkësi që bëni tok përdorues dhe dhoma! Krijoni një faqe hyrëse vetjake, që të ravijëzoni hapësirën tuaj në universin Matrix.", "Sent messages will be stored until your connection has returned.": "Mesazhet e dërguar do të depozitohen deri sa lidhja juaj të jetë rikthyer.", @@ -1047,7 +1047,7 @@ "Custom user status messages": "Mesazhe vetjakë për gjendje përdoruesi", "Unable to load commit detail: %(msg)s": "S’arrihet të ngarkohen hollësi depozitimi: %(msg)s", "Set a new status...": "Caktoni një gjendje të re…", - "Clear status": "Pastroji gjendjen", + "Clear status": "Spastroji gjendjen", "Unrecognised address": "Adresë jo e pranuar", "User %(user_id)s may or may not exist": "Përdoruesi %(user_id)s mund të ekzistojë ose jo", "Waiting for %(userId)s to confirm...": "Po pritet që %(userId)s të bëjë ripohimin…", @@ -1079,7 +1079,7 @@ "Verified!": "U verifikua!", "You've successfully verified this user.": "E verifikuat me sukses këtë përdorues.", "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Mesazhet e sigurt me këtë përdorues fshehtëzohen skaj-më-skaj dhe të palexueshëm nga palë të treta.", - "Got It": "E kuptova", + "Got It": "E Mora Vesh", "Verify this user by confirming the following number appears on their screen.": "Verifikojeni këtë përdorues duke ripohuar shfaqjen e numrit vijues në skenën e tyre.", "Yes": "Po", "No": "Jo", @@ -1443,7 +1443,7 @@ "Try again later, or ask a room admin to check if you have access.": "Riprovoni më vonë, ose kërkojini një përgjegjësi dhome të kontrollojë nëse keni apo jo hyrje.", "%(errcode)s was returned while trying to access the room. If you think you're seeing this message in error, please submit a bug report.": "%(errcode)s erdhi teksa provohej të hyhej në dhomë. Nëse mendoni se po e shihni gabimisht këtë mesazh, ju lutemi, parashtroni një njoftim të mete.", "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Përmirësimi i kësaj dhome do të asgjësojë instancën e tanishme të dhomës dhe do të krijojë një dhomë të përmirësuar me të njëjtin emër.", - "This room is running room version , which this homeserver has marked as unstable.": "Kjo dhomë gjendet nën versionin e dhomës, të cilin shërbyesi e ka shënuar si të paqëndrueshëm.", + "This room is running room version , which this homeserver has marked as unstable.": "Kjo dhomë gjendet nën versionin e dhomës, të cilit shërbyesi Home i ka vënë shenjë si i paqëndrueshëm.", "Could not revoke the invite. The server may be experiencing a temporary problem or you do not have sufficient permissions to revoke the invite.": "S’u shfuqizua dot ftesa. Shërbyesi mund të jetë duke kaluar një problem të përkohshëm ose s’keni leje të mjaftueshme për të shfuqizuar ftesën.", "reacted with %(shortName)s": "reagoi me %(shortName)s", "If there is additional context that would help in analysing the issue, such as what you were doing at the time, room IDs, user IDs, etc., please include those things here.": "Nëse ka kontekst shtesë që mund të ndihmonte në analizimin e problemit, b.f., ç’po bënit në atë kohë, ID dhomash, ID përdorueusish, etj, ju lutemi, përfshijini këto gjëra këtu.", @@ -1659,7 +1659,7 @@ "check your browser plugins for anything that might block the identity server (such as Privacy Badger)": "të kontrolloni shtojcat e shfletuesit tuaj për çfarëdo që mund të bllokojë shërbyesin e identiteteve (bie fjala, Privacy Badger)", "contact the administrators of identity server ": "të lidheni me përgjegjësit e shërbyesit të identiteteve ", "wait and try again later": "të prisni dhe të riprovoni më vonë", - "Clear cache and reload": "Të pastroni fshehtinën dhe të ringarkoni", + "Clear cache and reload": "Spastro fshehtinën dhe ringarko", "Your email address hasn't been verified yet": "Adresa juaj email s’është verifikuar ende", "Click the link in the email you received to verify and then click continue again.": "Për verifkim, klikoni lidhjen te email që morët dhe mandej vazhdoni sërish.", "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|one": "Ju ndan një hap nga heqja e 1 mesazhi prej %(user)s. Kjo s’mund të zhbëhet. Doni të vazhdohet?", @@ -1961,5 +1961,180 @@ "Riot is securely caching encrypted messages locally for them to appear in search results:": "Riot-i po ruan lokalisht në mënyrë të sigurt në fshehtinë mesazhet që të shfaqen në përfundime kërkimi:", "Space used:": "Hapësirë e përdorur:", "Indexed messages:": "Mesazhe të indeksuar:", - "Number of rooms:": "Numër dhomash:" + "Number of rooms:": "Numër dhomash:", + "There are unknown sessions in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "Në këtë dhomë ka sesione të panjohur: nëse vazhdoni pa i verifikuar ata, për dikë do të jetë e mundur të përgjojë thirrjen tuaj.", + "If you cancel now, you won't complete verifying the other user.": "Nëse e anuloni tani, s’do të plotësoni verifikimin e përdoruesit tjetër.", + "If you cancel now, you won't complete verifying your other session.": "Nëse e anuloni tani, s’do të plotësoni verifikimin e sesionit tuaj tjetër.", + "If you cancel now, you won't complete your secret storage operation.": "Nëse e anuloni tani, s’do të plotësoni veprimin tuaj për depozitë të fshehtë.", + "Cancel entering passphrase?": "Të anulohet dhënue frazëkalimi?", + "Setting up keys": "Ujdisje kyçesh", + "Unverified session": "Sesion i paverifikuar", + "Verifies a user, session, and pubkey tuple": "Verifikon një përdorues, sesion dhe një set kyçesh publikë", + "Unknown (user, session) pair:": "Çift (përdorues, sesion) i panjohur:", + "Session already verified!": "Sesion i tashmë i verifikuar!", + "WARNING: Session already verified, but keys do NOT MATCH!": "KUJDES: Sesion tashmë i verifikuar, por kyçet NUK PËRPUTHEN!", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "KUJDES: VERIFIKIMI I KYÇIT DËSHTOI! Kyçi i nënshkrimit për %(userId)s dhe sesionin %(deviceId)s është \"%(fprint)s\", që nuk përputhet me kyçin e dhënë \"%(fingerprint)s\". Kjo mund të jetë shenjë se komunikimet tuaja po përgjohen!", + "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "Kyçi i nënshkrimit që dhatë përputhet me kyçin e nënshkrimit që morët nga sesioni i %(userId)s %(deviceId)s. Sesionit iu vu shenjë si i verifikuar.", + "Enable cross-signing to verify per-user instead of per-session (in development)": "Aktivizoni cross-signing për të verifikuar me bazë përdorues në vend se me bazë sesioni (në zhvillim)", + "Show padlocks on invite only rooms": "Për dhoma vetëm me ftesa shfaq dryna", + "Never send encrypted messages to unverified sessions from this session": "Mos dërgo kurrë prej këtij sesioni mesazhe të fshehtëzuar te sesione të paverifikuar", + "Never send encrypted messages to unverified sessions in this room from this session": "Mos dërgo kurrë prej këtij sesioni mesazhe të fshehtëzuar te sesione të paverifikuar në këtë dhomë", + "Keep secret storage passphrase in memory for this session": "Për këtë sesion, frazëkalimin e depozitës së fshehtë mbaje në kujtesë", + "How fast should messages be downloaded.": "Sa shpejt duhen shkarkuar mesazhet.", + "Confirm the emoji below are displayed on both devices, in the same order:": "Ripohoni që emoji-t më poshtë shfaqen në të dyja pajisjet, në të njëjtën radhë:", + "Verify this device by confirming the following number appears on its screen.": "Verifikojeni këtë pajisje duke ripohuar shfaqjen e numrit vijues në skenën e tij.", + "Waiting for %(displayName)s to verify…": "Po pritet për %(displayName)s të verifikojë…", + "They match": "Përputhen", + "They don't match": "S’përputhen", + "To be secure, do this in person or use a trusted way to communicate.": "Për të qenë i sigurt, bëjeni këtë duke qenë vetë i pranishëm ose përdorni për të komunikuar një rrugë të besuar.", + "Verify yourself & others to keep your chats safe": "Verifikoni veten & të tjerët, që t’i mbani bisedat tuaja të sigurta", + "This bridge was provisioned by .": "Kjo urë është dhënë nga .", + "Workspace: %(networkName)s": "Hapësirë pune: %(networkName)s", + "Channel: %(channelName)s": "Kanal: %(channelName)s", + "Show less": "Shfaq më pak", + "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ndryshimi i fjalëkalimit do të sjellë zerimin e çfarëdo kyçesh fshehtëzimi skaj-më-skaj në krejt sesionet, duke e bërë të palexueshëm historikun e fshehtëzuar të bisedave, hiq rastin kur i eksportoni më parë kyçet tuaj të dhomës dhe i ri-importoni ata më pas. Në të ardhmen kjo do të përmirësohet.", + "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Llogaria juaj ka një identitet cross-signing në depozitë të fshehtë, por s’është ende i besuar në këtë sesion.", + "in memory": "në kujtesë", + "Your homeserver does not support session management.": "Shërbyesi juaj Home nuk mbulon administrim sesionesh.", + "Unable to load session list": "S’arrihet të ngarkohet listë sesionesh", + "Delete %(count)s sessions|other": "Fshi %(count)s sesione", + "Delete %(count)s sessions|one": "Fshi %(count)s sesion", + "This session is backing up your keys. ": "Kjo sesion po bën kopjeruajtje të kyçeve tuaja. ", + "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Ky sesion nuk po bën kopjeruajtje të kyçeve tuaja, por keni një kopjeruajtje ekzistuese që mund ta përdorni për rimarrje dhe ta shtoni më tej.", + "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Lidheni këtë sesion kopjeruajtje kyçesh, përpara se të dilni, që të shmangni humbje të çfarëdo kyçi që mund të gjendet vetëm në këtë pajisje.", + "Connect this session to Key Backup": "Lidhe këtë sesion me Kopjeruajtje Kyçesh", + "Backup has a signature from unknown session with ID %(deviceId)s": "Kopjeruajtja ka nënshkrim nga sesion i panjohur me ID %(deviceId)s.", + "Backup has a valid signature from this session": "Kopjeruajtja ka një nënshkrim të vlefshëm prej këtij sesioni", + "Backup has an invalid signature from this session": "Kopjeruajtja ka një nënshkrim të pavlefshëm prej këtij sesioni", + "Backup has a valid signature from verified session ": "Kopjeruajtja ka një nënshkrim të vlefshëm prej sesioni të verifikuar ", + "Backup has a valid signature from unverified session ": "Kopjeruajtja ka një nënshkrim të vlefshëm prej sesioni paverifikuar ", + "Backup has an invalid signature from verified session ": "Kopjeruajtja ka një nënshkrim të pavlefshëm prej sesioni të verifikuar ", + "Backup has an invalid signature from unverified session ": "Kopjeruajtja ka një nënshkrim të pavlefshëm prej sesioni të paverifikuar ", + "Backup is not signed by any of your sessions": "Kopjeruajtja s’është nënshkruar nga ndonjë prej sesioneve tuaj", + "This backup is trusted because it has been restored on this session": "Kjo kopjeruajtje është e besuar, ngaqë është rikthyer në këtë sesion", + "Backup key stored in secret storage, but this feature is not enabled on this session. Please enable cross-signing in Labs to modify key backup state.": "Kyçi i kopjeruajtjeve u depozitua në depozitë të fshehtë, po kjo veçori s’është e aktivizuar në këtë sesion. Ju lutemi, aktivizoni në Labs cross-signing që të modifikoni gjendje kopjeruatjeje kyçesh.", + "Your keys are not being backed up from this session.": "Kyçet tuaj nuk po kopjeruhen nga ky sesion.", + "Enable desktop notifications for this session": "Aktivizo njoftime desktop për këtë sesion", + "Enable audible notifications for this session": "Aktivizo njoftime audio për këtë sesion", + "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Fjalëkalimi juaj u ndryshua me sukses. Nuk do të merrni njoftime push në sesionet tuaj të tjerë, veç në hyfshi sërish në llogarinë tuaj në to", + "Session ID:": "ID sesioni:", + "Session key:": "Kyç sesioni:", + "Sessions": "Sesione", + "A session's public name is visible to people you communicate with": "Emri publik i një sesioni është i dukshëm për persona me të cilët komunikoni", + "This room is bridging messages to the following platforms. Learn more.": "Kjo dhomë po kalon mesazhe përmes ure te platformat vijuese. Mësoni më tepër.", + "This room isn’t bridging messages to any platforms. Learn more.": "Kjo dhomë s’kalon mesazhe përmes ure te ndonjë platformë. Mësoni më tepër.", + "Bridges": "Ura", + "This user has not verified all of their sessions.": "Ky përdorues s’ka verifikuar krejt sesionet e tij.", + "You have not verified this user.": "S’e keni verifikuar këtë përdorues.", + "You have verified this user. This user has verified all of their sessions.": "E keni verifikuar këtë përdorues. Ky përdorues ka verifikuar krejt sesionet e veta.", + "Someone is using an unknown session": "Dikush po përdor një sesion të panjohur", + "Some sessions for this user are not trusted": "Disa sesione për këtë përdorues s’janë të besuar", + "All sessions for this user are trusted": "Krejt sesionet për këtë përdorues janë të besuar", + "Some sessions in this encrypted room are not trusted": "Disa sesione në këtë dhomë të fshehtëzuar s’janë të besuar", + "All sessions in this encrypted room are trusted": "Krejt sesionet në këtë dhomë të fshehtëzuar janë të besuar", + "Mod": "Moderator", + "Your key share request has been sent - please check your other sessions for key share requests.": "Kërkesa juaj për shkëmbim kyçesh u dërgua - ju lutemi, kontrolloni sesionet tuaj të tjerë për kërkesa shkëmbimi kyçesh.", + "Key share requests are sent to your other sessions automatically. If you rejected or dismissed the key share request on your other sessions, click here to request the keys for this session again.": "Kërkesat për ndarje kyçesh dërgohen automatikisht te sesionet tuaj të tjerë. Nëse s’e pranuat ose e hodhët tej kërkesën për ndarje kyçesh në sesionet tuaj të tjerë, klikoni këtu që të rikërkoni kyçe për këtë sesion.", + "If your other sessions do not have the key for this message you will not be able to decrypt them.": "Nëse sesionet tuaj të tjerë nuk kanë kyçin për këtë mesazh, s’do të jeni në gjendje ta shfshehtëzoni.", + "Re-request encryption keys from your other sessions.": "Rikërkoni kyçe fshehtëzimi prej sesionesh tuaj të tjerë.", + "Encrypted by an unverified session": "Fshehtëzuar nga një sesion i paverifikuar", + "Encrypted by a deleted session": "Fshehtëzuar nga një sesion i fshirë", + "No sessions with registered encryption keys": "S’ka sesion me kyçe fshehtëzimi të regjistruar", + "Waiting for %(displayName)s to accept…": "Po pritet për %(displayName)s të pranojë…", + "Your messages are secured and only you and the recipient have the unique keys to unlock them.": "Mesazhet tuaj janë të sigurt dhe vetëm ju dhe marrësi kanë kyçet unikë për t’i shkyçur.", + "Your messages are not secure": "Mesazhet tuaj s’janë të sigurt", + "One of the following may be compromised:": "Një nga sa vijon mund të jetë komprometuar:", + "Your homeserver": "Shërbyesi juaj Home", + "The homeserver the user you’re verifying is connected to": "Shërbyesi Home te i cili është lidhur përdoruesi që po verifikoni", + "Yours, or the other users’ internet connection": "Lidhja internet e juaja, ose e përdoruesve të tjerë", + "Yours, or the other users’ session": "Sesioni juaj, ose i përdoruesve të tjerë", + "%(count)s sessions|other": "%(count)s sesione", + "%(count)s sessions|one": "%(count)s sesion", + "Hide sessions": "Fshih sesione", + "Verify by emoji": "Verifikoje përmes emoji-t", + "Verify by comparing unique emoji.": "Verifikoje duke krahasuar emoji unik.", + "Ask %(displayName)s to scan your code:": "Kërkojini %(displayName)s të skanojë kodin tuaj:", + "If you can't scan the code above, verify by comparing unique emoji.": "Nëse s’e skanoni dot kodin më sipër, verifikojeni duke krahasuar emoji unik.", + "You've successfully verified %(displayName)s!": "E verifikuat me sukses %(displayName)s!", + "Got it": "E mora vesh", + "Verification timed out. Start verification again from their profile.": "Verifikimit i mbaroi koha. Riniseni verifikimin prej profilit të tij.", + "%(displayName)s cancelled verification. Start verification again from their profile.": "%(displayName)s e anuloi verifikimin. Rinisni verifkimin nga profili i tij.", + "You cancelled verification. Start verification again from their profile.": "Anuluat verifikimin. Riniseni verifikimin nga profili i tij.", + "Encryption enabled": "Fshehtëzim i aktivizuar", + "Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "Mesazhet në këtë dhomë fshehtëzohen skaj-më-skaj. Mësoni më tepër & verifikoni këtë përdorues në profilin e tij.", + "Encryption not enabled": "Fshehtëzim jo i aktivizuar", + "The encryption used by this room isn't supported.": "Fshehtëzimi i përdorur nga kjo dhomë nuk mbulohet.", + "Clear all data in this session?": "Të pastrohen krejt të dhënat në këtë sesion?", + "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Spastrimi i krejt të dhënave prej këtij sesioni është përfundimtar. Mesazhet e fshehtëzuar do të humbin, veç në qofshin kopjeruajtur kyçet e tyre.", + "Verify session": "Verifiko sesion", + "To verify that this session can be trusted, please check that the key you see in User Settings on that device matches the key below:": "Që të verifikohet se ky sesion mund të besohet, ju lutemi, kontrolloni se kyçi që shihni te Rregullime Përdoruesi në atë pajisje të përputhet me kyçin më poshtë:", + "To verify that this session can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this session matches the key below:": "Që të verifikoni se këtij sesioni mund t’i zihet besë, ju lutemi, lidhuni me të zotët e saj përmes ndonjë rruge tjetër (p.sh., personalisht, ose përmes një thirrjeje telefonike) dhe pyetini nëse përputhet apo jo kyçi që shohin te Rregullime të tyret të Përdoruesit për këtë pajisje me kyçin më poshtë:", + "Session name": "Emër sesioni", + "Session key": "Kyç sesioni", + "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this session and you probably want to press the blacklist button instead.": "Nëse përputhet, shtypni butonin e verifikimit më poshtë. Nëse jo, atëherë dikush tjetër po e përgjon këtë sesion dhe gjasat janë që të doni të shtypni butonin e kalimit në listë bllokimesh.", + "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Verifikimi i këtij përdoruesi do t’i vërë shenjë sesionit të tij si të besuar dhe sesionit tuaj si të besuar për ta.", + "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Që t’i vihet shenjë si e besuar, verifikojeni këtë pajisje. Besimi i kësaj pajisjeje ju jep juve dhe përdoruesve të tjerë ca qetësi më tepër, kur përdoren mesazhe të fshehtëzuar skaj-më-skaj.", + "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Verifikimi i kësaj pajisjeje do të t’i vërë shenjë si të besuar dhe përdoruesit që janë verifikuar me ju do ta besojnë këtë pajisje.", + "You added a new session '%(displayName)s', which is requesting encryption keys.": "Shtuat një sesion të ri '%(displayName)s', i cili po kërkon kyçe fshehtëzimi.", + "Your unverified session '%(displayName)s' is requesting encryption keys.": "Sesioni juaj i paverifikuar '%(displayName)s' po kërkon kyçe fshehtëzimi.", + "Loading session info...": "Po ngarkohen të dhëna sesioni…", + "New session": "Sesion i ri", + "Use this session to verify your new one, granting it access to encrypted messages:": "Përdoreni këtë sesion për të verifikuar atë tuajin të ri, duke i akorduar hyrje te mesazhe të fshehtëzuar:", + "If you didn’t sign in to this session, your account may be compromised.": "Nëse s’bëtë hyrjen te ky sesion, llogaria muaj mund të jetë komprometuar.", + "This wasn't me": "Ky s’jam unë", + "This will allow you to return to your account after signing out, and sign in on other sessions.": "Kjo do t’ju lejojë të riktheheni te llogaria juaj pasi të keni bërë daljen, dhe të hyni në sesione të tjerë.", + "You are currently blacklisting unverified sessions; to send messages to these sessions you must verify them.": "Po kaloni në listë të bllokimesh sesione të paverifikuar; që të dërgoni mesazhe te këta sesione, duhet t’i verifikoni.", + "We recommend you go through the verification process for each session to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "Këshillojmë të përshkoni procesin e verifikimit për çdo sesion, për t’u bindur se u takojnë të zotëve të ligjshëm, por, nëse parapëlqeni, mund ta dërgoni mesazhin pa verifikuar gjë.", + "Room contains unknown sessions": "Dhoma përmban sesione të panjohur", + "\"%(RoomName)s\" contains sessions that you haven't seen before.": "\"%(RoomName)s\" përmban sesione që s’i keni parë më parë.", + "Unknown sessions": "Sesione të panjohur", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your passphrase.": "Për verifikim sesionesh të tjerë përmes dhënies së frazëkalimit tuaj, hyni te historiku i mesazheve tuaj të sigurt dhe identiteti juaj për cross-signing.", + "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.": "Për verifikim sesionesh të tjerë përmes dhënies së kyçit tuaj të rimarrjes, hyni te historiku i mesazheve tuaj të sigurt dhe identiteti juaj për cross-signing.", + "Recovery key mismatch": "Mospërputhje kyçesh rimarrjeje", + "Incorrect recovery passphrase": "Frazëkalim rimarrjeje i pasaktë", + "Backup restored": "Kopjeruajtja u rikthye", + "Enter recovery passphrase": "Jepni frazëkalim rimarrjesh", + "Enter recovery key": "Jepni kyç rimarrjesh", + "Confirm your identity by entering your account password below.": "Ripohoni identitetin tuaj duke dhënë më poshtë fjalëkalimin e llogarisë tuaj.", + "Message not sent due to unknown sessions being present": "Mesazhi s’u dërgua, për shkak të pranisë së sesioneve të panjohur", + "Show sessions, send anyway or cancel.": "Shfaq sesione, dërgoje sido qoftë ose anuloje.", + "Your new session is now verified. Other users will see it as trusted.": "Sesioni juaj i ri tani është i verifikuar. Përdoruesit e tjerë do të shohin si të besuar.", + "Without completing security on this session, it won’t have access to encrypted messages.": "Pa plotësuar sigurinë në këtë sesion, s’do të ketë hyrje te mesazhe të fshehtëzuar.", + "Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.": "Ndryshimi i fjalëkalimit tuaj do të sjellë zerim të çfarëdo kyçesh fshehtëzimi skaj-më-skaj në krejt sesionet tuaj, duke e bërë të palexueshëm historikun e bisedave të fshehtëzuara. Ujdisni një Kopjeruajtje Kyçesh ose eksportoni kyçet e dhomës tuaj prej një tjetër sesioni, përpara se të ricaktoni fjalëkalimin tuaj.", + "You have been logged out of all sessions and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Jeni nxjerrë jashtë krejt sesioneve dhe nuk do të merrni më njoftime push. Që të riaktivizoni njoftimet, bëni sërish hyrjen në çdo pajisje.", + "Regain access to your account and recover encryption keys stored in this session. Without them, you won’t be able to read all of your secure messages in any session.": "Rifitoni hyrjen te llogaria juaj dhe rimerrni kyçe fshehtëzimi të depozituar në këtë sesion. Pa ta, s’do të jeni në gjendje të lexoni krejt mesazhet tuaj të siguruar në çfarëdo sesion.", + "Warning: Your personal data (including encryption keys) is still stored in this session. Clear it if you're finished using this session, or want to sign in to another account.": "Kujdes: Të dhënat tuaja personale (përfshi kyçe fshehtëzimi) janë ende të depozituara në këtë sesion. Spastrojini, nëse keni përfunduar së përdoruri këtë sesion, ose dëshironi të bëni hyrjen në një tjetër llogari.", + "Sender session information": "Të dhëna sesioni dërguesi", + "Restore your key backup to upgrade your encryption": "Që të përmirësoni fshehtëzimin tuaj, riktheni kopjeruajtjen e kyçeve tuaj", + "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Përmirësojeni këtë sesion për ta lejuar të verifikojë sesione të tjerë, duke u akorduar hyrje te mesazhe të fshehtëzuar dhe duke u vënë shenjë si të besuar për përdorues të tjerë.", + "Set up encryption on this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Ujdisni fshehtëzim në këtë sesion që ta lejoni të verifikojë sesione të tjerë, duke u akorduar atyre hyrje te mesazhe të fshehtëzuar dhe duke u vënë shenjë si të besuar për përdorues të tjerë.", + "Back up my encryption keys, securing them with the same passphrase": "Kopjeruaj kyçet e mi të fshehtëzimit, duke i siguruar me të njëjtin frazëkalim", + "Keep a copy of it somewhere secure, like a password manager or even a safe.": "Mbajeni kyçin tuaj të rimarrjeve diku në një vend pak a shumë të sigurt, bie fjala, nën një përgjegjës fjalëkalimesh ose madje në një kasafortë.", + "Your recovery key": "Kyçi juaj i rimarrjeve", + "Copy": "Kopjoje", + "You can now verify your other devices, and other users to keep your chats safe.": "Tani mund të verifikoni pajisje tuajat të tjera dhe përdorues të tjerë, për t’i mbajtur të sigurta bisedat tuaja.", + "Make a copy of your recovery key": "Bëni një kopje të kyçit tuaj të rimarrjeve", + "You're done!": "Mbaruat!", + "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "Pa ujdisur Rimarrje të Sigurt Mesazhesh, s’do të jeni në gjendje të riktheni historikun e mesazheve tuaj të fshehtëzuar, nëse bëni daljen ose përdorni një sesion tjetër.", + "Create key backup": "Krijo kopjeruajtje kyçesh", + "This session is encrypting history using the new recovery method.": "Ky sesion e fshehtëzon historikun duke përdorur metodë të re rimarrjesh.", + "This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "Ky sesion ka pikasur se frazëkalimi dhe kyçi juaj i rimarrjeve për Mesazhe të Sigurt janë hequr.", + "If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.": "Nëse këtë e keni bërë pa dashje, mund të ujdisni Mesazhe të Sigurt në këtë sesion, gjë që do të sjellë rifshehtëzimin e historikut të mesazheve të sesionit me një metodë të re rimarrjesh.", + "Indexed rooms:": "Dhoma të indeksuara:", + "%(crawlingRooms)s out of %(totalRooms)s": "%(crawlingRooms)s nga %(totalRooms)s gjithsej", + "Message downloading sleep time(ms)": "Kohë fjetjeje shkarkimi mesazhi(ms)", + "Show typing notifications": "Shfaq njoftime shtypjeje", + "Destroy cross-signing keys?": "Të shkatërrohen kyçet cross-signing?", + "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Fshirja e kyçeve cross-signing është e përhershme. Cilido që keni verifikuar me to, do të shohë një sinjalizim sigurie. Thuajse e sigurt që s’keni pse ta bëni një gjë të tillë, veç në paçi humbur çdo pajisje prej nga mund të bëni cross-sign.", + "Clear cross-signing keys": "Spastro kyçe cross-signing", + "Verify this session by completing one of the following:": "Verifikoni këtë sesion duke plotësuar një nga sa vijon:", + "Scan this unique code": "Skanoni këtë kod unik", + "or": "ose", + "Compare unique emoji": "Krahasoni emoji unik", + "Compare a unique set of emoji if you don't have a camera on either device": "Krahasoni një grup unik emoji-sh, nëse s’keni kamera në njërën nga pajisjet", + "Not Trusted": "Jo e Besuar", + "%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) bëri hyrjen në një sesion të ri pa e verifikuar:", + "Ask this user to verify their session, or manually verify it below.": "Kërkojini këtij përdoruesi të verifikojë sesionin e vet, ose ta verifikojë më poshtë dorazi.", + "Manually Verify": "Verifikoje Dorazi", + "Verify by scanning": "Verifikoje me skanim" } diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 8261d21688..391c3c8636 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -1496,5 +1496,6 @@ "Set up Secure Messages": "Güvenli Mesajları Ayarla", "Space used:": "Kullanılan alan:", "Indexed messages:": "İndekslenmiş mesajlar:", - "Number of rooms:": "Oda sayısı:" + "Number of rooms:": "Oda sayısı:", + "Enable inline URL previews by default": "Varsayılan olarak satır içi URL önizlemeleri aç" } diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 668725c4aa..2596d11629 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2126,5 +2126,26 @@ "You're done!": "您已經完成了!", "Create key backup": "建立金鑰備份", "Message downloading sleep time(ms)": "訊息下載休眠時間(毫秒)", - "of ": "的 " + "of ": "的 ", + "Indexed rooms:": "已索引的聊天室:", + "%(crawlingRooms)s out of %(totalRooms)s": "%(totalRooms)s 中的 %(crawlingRooms)s", + "If you cancel now, you won't complete verifying the other user.": "如果您現在取消,您將無法完成驗證其他使用者。", + "If you cancel now, you won't complete verifying your other session.": "如果您現在取消,您將無法完成驗證您其他的工作階段。", + "If you cancel now, you won't complete your secret storage operation.": "如果您現在取消,您將無法完成驗證您的秘密儲存空間動作。", + "Cancel entering passphrase?": "取消輸入通關密語?", + "Show typing notifications": "顯示打字通知", + "Reset cross-signing and secret storage": "重設交叉簽章與秘密儲存空間", + "Destroy cross-signing keys?": "摧毀交叉簽章金鑰?", + "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "永久刪除交叉簽章金鑰。任何您已驗證過的人都會看到安全性警告。除非您遺失了所有可以進行交叉簽章的裝置,否則您平常幾乎不會想要這樣做。", + "Clear cross-signing keys": "清除交叉簽章金鑰", + "Verify this session by completing one of the following:": "透過完成以下任一種動作來驗證此工作階段:", + "Scan this unique code": "掃描此獨一無二的條碼", + "or": "或", + "Compare unique emoji": "比較獨一無二的顏文字", + "Compare a unique set of emoji if you don't have a camera on either device": "如果兩個裝置上都沒有相機的話,就比較一組獨一無二的顏文字", + "Not Trusted": "未受信任", + "%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) 登入到未驗證的新工作階段:", + "Ask this user to verify their session, or manually verify it below.": "要求此使用者驗證他們的工作階段,或在下方手動驗證。", + "Manually Verify": "手動驗證", + "Verify by scanning": "透過掃描來驗證" } diff --git a/src/settings/Settings.js b/src/settings/Settings.js index b5a966523e..936b651211 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -263,6 +263,11 @@ export const SETTINGS = { default: true, invertedSettingName: 'dontSendTypingNotifications', }, + "showTypingNotifications": { + supportedLevels: LEVELS_ACCOUNT_SETTINGS, + displayName: _td("Show typing notifications"), + default: true, + }, "MessageComposerInput.autoReplaceEmoji": { supportedLevels: LEVELS_ACCOUNT_SETTINGS, displayName: _td('Automatically replace plain text Emoji'), @@ -492,7 +497,7 @@ export const SETTINGS = { default: true, }, "keepSecretStoragePassphraseForSession": { - supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, + supportedLevels: ['device', 'config'], displayName: _td("Keep secret storage passphrase in memory for this session"), default: false, }, diff --git a/src/settings/handlers/ConfigSettingsHandler.js b/src/settings/handlers/ConfigSettingsHandler.js index a54ad1cef6..3b5b4b626e 100644 --- a/src/settings/handlers/ConfigSettingsHandler.js +++ b/src/settings/handlers/ConfigSettingsHandler.js @@ -17,6 +17,7 @@ limitations under the License. import SettingsHandler from "./SettingsHandler"; import SdkConfig from "../../SdkConfig"; +import {isNullOrUndefined} from "matrix-js-sdk/src/utils"; /** * Gets and sets settings at the "config" level. This handler does not make use of the @@ -32,7 +33,7 @@ export default class ConfigSettingsHandler extends SettingsHandler { } const settingsConfig = config["settingDefaults"]; - if (!settingsConfig || !settingsConfig[settingName]) return null; + if (!settingsConfig || isNullOrUndefined(settingsConfig[settingName])) return null; return settingsConfig[settingName]; } diff --git a/test/components/views/dialogs/AccessSecretStorageDialog-test.js b/test/components/views/dialogs/AccessSecretStorageDialog-test.js new file mode 100644 index 0000000000..30512ca4dd --- /dev/null +++ b/test/components/views/dialogs/AccessSecretStorageDialog-test.js @@ -0,0 +1,106 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from 'react'; +import TestRenderer from 'react-test-renderer'; +import sdk from '../../../skinned-sdk'; +import {MatrixClientPeg} from '../../../../src/MatrixClientPeg'; +import { stubClient } from '../../../test-utils'; + +const AccessSecretStorageDialog = sdk.getComponent("dialogs.secretstorage.AccessSecretStorageDialog"); + +describe("AccessSecretStorageDialog", function() { + it("Closes the dialog if _onRecoveryKeyNext is called with a valid key", (done) => { + const testInstance = TestRenderer.create( + p && p.recoveryKey && p.recoveryKey == "a"} + onFinished={(v) => { + if (v) { done(); } + }} + />, + ); + testInstance.getInstance().setState({ + recoveryKeyValid: true, + recoveryKey: "a", + }); + const e = { preventDefault: () => {} }; + testInstance.getInstance()._onRecoveryKeyNext(e); + }); + + it("Considers a valid key to be valid", function() { + const testInstance = TestRenderer.create( + true} + />, + ); + const v = "asfd"; + const e = { target: { value: v } }; + stubClient(); + MatrixClientPeg.get().isValidRecoveryKey = function(k) { + return k == v; + }; + testInstance.getInstance()._onRecoveryKeyChange(e); + const { recoveryKeyValid } = testInstance.getInstance().state; + expect(recoveryKeyValid).toBe(true); + }); + + it("Notifies the user if they input an invalid recovery key", async function(done) { + const testInstance = TestRenderer.create( + false} + />, + ); + const e = { target: { value: "a" } }; + stubClient(); + MatrixClientPeg.get().isValidRecoveryKey = () => true; + testInstance.getInstance()._onRecoveryKeyChange(e); + await testInstance.getInstance()._onRecoveryKeyNext({ preventDefault: () => {} }); + const { keyMatches } = testInstance.getInstance().state; + expect(keyMatches).toBe(false); + const notification = testInstance.root.findByProps({ + className: "mx_AccessSecretStorageDialog_keyStatus", + }); + expect(notification.props.children).toEqual( + ["\uD83D\uDC4E ", "Unable to access secret storage. Please verify that you " + + "entered the correct recovery key."]); + done(); + }); + + it("Notifies the user if they input an invalid passphrase", async function(done) { + const testInstance = TestRenderer.create( + false} + onFinished={() => {}} + keyInfo={ { passphrase: { + salt: 'nonempty', + iterations: 2, + } } } + />, + ); + const e = { target: { value: "a" } }; + stubClient(); + MatrixClientPeg.get().isValidRecoveryKey = () => false; + testInstance.getInstance()._onPassPhraseChange(e); + await testInstance.getInstance()._onPassPhraseNext({ preventDefault: () => {} }); + const notification = testInstance.root.findByProps({ + className: "mx_AccessSecretStorageDialog_keyStatus", + }); + expect(notification.props.children).toEqual( + ["\uD83D\uDC4E ", "Unable to access secret storage. Please verify that you " + + "entered the correct passphrase."]); + done(); + }); +}); diff --git a/test/components/views/messages/TextualBody-test.js b/test/components/views/messages/TextualBody-test.js index 180a2f7e54..4e0785a8b9 100644 --- a/test/components/views/messages/TextualBody-test.js +++ b/test/components/views/messages/TextualBody-test.js @@ -206,7 +206,7 @@ describe("", () => { 'Hey ' + '' + 'Member' + + 'width="16" height="16" title="@member:domain.bla" alt="" aria-hidden="true">Member' + ''); }); });