Merge branch 'develop' of https://github.com/matrix-org/matrix-react-sdk into t3chguy/cs_verification_decoration
Conflicts: src/components/views/right_panel/VerificationPanel.js
This commit is contained in:
commit
ddb0f06005
42 changed files with 1083 additions and 110 deletions
174
CHANGELOG.md
174
CHANGELOG.md
|
@ -1,3 +1,177 @@
|
||||||
|
Changes in [2.0.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v2.0.0) (2020-01-27)
|
||||||
|
===================================================================================================
|
||||||
|
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v2.0.0-rc.2...v2.0.0)
|
||||||
|
|
||||||
|
* Ensure a plaintext version of the composer ends up on the clipboard
|
||||||
|
[\#3923](https://github.com/matrix-org/matrix-react-sdk/pull/3923)
|
||||||
|
* Move & upgrade babel runtime into dependencies (like it wants)
|
||||||
|
[\#3921](https://github.com/matrix-org/matrix-react-sdk/pull/3921)
|
||||||
|
* Don't list every single alias when there's many
|
||||||
|
[\#3919](https://github.com/matrix-org/matrix-react-sdk/pull/3919)
|
||||||
|
|
||||||
|
Changes in [2.0.0-rc.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v2.0.0-rc.2) (2020-01-20)
|
||||||
|
=============================================================================================================
|
||||||
|
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v2.0.0-rc.1...v2.0.0-rc.2)
|
||||||
|
|
||||||
|
* Add prepublish script
|
||||||
|
[\#3877](https://github.com/matrix-org/matrix-react-sdk/pull/3877)
|
||||||
|
|
||||||
|
Changes in [2.0.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v2.0.0-rc.1) (2020-01-20)
|
||||||
|
=============================================================================================================
|
||||||
|
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v1.7.6...v2.0.0-rc.1)
|
||||||
|
|
||||||
|
BREAKING CHANGES
|
||||||
|
================
|
||||||
|
* The react-sdk node module now exports ES6 rather than ES5. If you
|
||||||
|
wish to supports target that aren't compatible with ES6, you
|
||||||
|
will need to transpile the react-sdk to a suitable dialect.
|
||||||
|
|
||||||
|
All Changes
|
||||||
|
===========
|
||||||
|
* Fix arrows keys moving through edit history
|
||||||
|
[\#3874](https://github.com/matrix-org/matrix-react-sdk/pull/3874)
|
||||||
|
* Fix error about MessagePanel not being available for read markers
|
||||||
|
[\#3867](https://github.com/matrix-org/matrix-react-sdk/pull/3867)
|
||||||
|
* Adjust secret storage to work before sync
|
||||||
|
[\#3864](https://github.com/matrix-org/matrix-react-sdk/pull/3864)
|
||||||
|
* Update from Weblate
|
||||||
|
[\#3872](https://github.com/matrix-org/matrix-react-sdk/pull/3872)
|
||||||
|
* Remove unused deps and dev-deps
|
||||||
|
[\#3870](https://github.com/matrix-org/matrix-react-sdk/pull/3870)
|
||||||
|
* Tidy Jest test stuff and dependencies
|
||||||
|
[\#3869](https://github.com/matrix-org/matrix-react-sdk/pull/3869)
|
||||||
|
* Move feature flag check for new session toast
|
||||||
|
[\#3865](https://github.com/matrix-org/matrix-react-sdk/pull/3865)
|
||||||
|
* Catch exception in checkTerms if no ID server
|
||||||
|
[\#3863](https://github.com/matrix-org/matrix-react-sdk/pull/3863)
|
||||||
|
* Catch exception if passphrase dialog cancelled
|
||||||
|
[\#3862](https://github.com/matrix-org/matrix-react-sdk/pull/3862)
|
||||||
|
* Disable key request dialogs with cross-signing
|
||||||
|
[\#3860](https://github.com/matrix-org/matrix-react-sdk/pull/3860)
|
||||||
|
* Toasts for new, unverified sessions
|
||||||
|
[\#3859](https://github.com/matrix-org/matrix-react-sdk/pull/3859)
|
||||||
|
* Check for a matrixclient before trying to use it
|
||||||
|
[\#3861](https://github.com/matrix-org/matrix-react-sdk/pull/3861)
|
||||||
|
* Room header & message box shields now reflect cross-signing state
|
||||||
|
[\#3850](https://github.com/matrix-org/matrix-react-sdk/pull/3850)
|
||||||
|
* Fix Array.concat undefined
|
||||||
|
[\#3857](https://github.com/matrix-org/matrix-react-sdk/pull/3857)
|
||||||
|
* Update chokidar to fix reskindex not working
|
||||||
|
[\#3856](https://github.com/matrix-org/matrix-react-sdk/pull/3856)
|
||||||
|
* Make the new DM invite dialog work for regular invites too
|
||||||
|
[\#3854](https://github.com/matrix-org/matrix-react-sdk/pull/3854)
|
||||||
|
* Fix event handler leak in MemberStatusMessageAvatar
|
||||||
|
[\#3855](https://github.com/matrix-org/matrix-react-sdk/pull/3855)
|
||||||
|
* Move DM creation logic into DMInviteDialog
|
||||||
|
[\#3843](https://github.com/matrix-org/matrix-react-sdk/pull/3843)
|
||||||
|
* Remove all text when cutting in the composer
|
||||||
|
[\#3848](https://github.com/matrix-org/matrix-react-sdk/pull/3848)
|
||||||
|
* Add a ToastStore
|
||||||
|
[\#3853](https://github.com/matrix-org/matrix-react-sdk/pull/3853)
|
||||||
|
* 'Members' button always toggle the right panel
|
||||||
|
[\#3804](https://github.com/matrix-org/matrix-react-sdk/pull/3804)
|
||||||
|
* Fix timing of when Composer considers itself to be modified
|
||||||
|
[\#3842](https://github.com/matrix-org/matrix-react-sdk/pull/3842)
|
||||||
|
* Compute download file icon immediately
|
||||||
|
[\#3851](https://github.com/matrix-org/matrix-react-sdk/pull/3851)
|
||||||
|
* Fix not being able to open profiles from the timeline
|
||||||
|
[\#3852](https://github.com/matrix-org/matrix-react-sdk/pull/3852)
|
||||||
|
* Add post-login complete security flow
|
||||||
|
[\#3847](https://github.com/matrix-org/matrix-react-sdk/pull/3847)
|
||||||
|
* Added cut/copy and pasting user pills from editor.
|
||||||
|
[\#3828](https://github.com/matrix-org/matrix-react-sdk/pull/3828)
|
||||||
|
* Fix imports for help & support tab
|
||||||
|
[\#3846](https://github.com/matrix-org/matrix-react-sdk/pull/3846)
|
||||||
|
* Humanize the recent DM rooms ourselves for translations
|
||||||
|
[\#3841](https://github.com/matrix-org/matrix-react-sdk/pull/3841)
|
||||||
|
* Improve the quality of invite suggestions by filtering out DMs
|
||||||
|
[\#3840](https://github.com/matrix-org/matrix-react-sdk/pull/3840)
|
||||||
|
* Fix linter and tests on develop
|
||||||
|
[\#3845](https://github.com/matrix-org/matrix-react-sdk/pull/3845)
|
||||||
|
* Fix sourcemaps by refactoring the build system
|
||||||
|
[\#3839](https://github.com/matrix-org/matrix-react-sdk/pull/3839)
|
||||||
|
* Don't error on unverified/unknown devices.
|
||||||
|
[\#3837](https://github.com/matrix-org/matrix-react-sdk/pull/3837)
|
||||||
|
* Padlock icons in room header
|
||||||
|
[\#3835](https://github.com/matrix-org/matrix-react-sdk/pull/3835)
|
||||||
|
* Don't allow upgrade from untrusted key backup.
|
||||||
|
[\#3822](https://github.com/matrix-org/matrix-react-sdk/pull/3822)
|
||||||
|
* Emoji verification: Change name of 🔒 to lock
|
||||||
|
[\#3825](https://github.com/matrix-org/matrix-react-sdk/pull/3825)
|
||||||
|
* Room padlock decorations only if cross-signing is enabled
|
||||||
|
[\#3838](https://github.com/matrix-org/matrix-react-sdk/pull/3838)
|
||||||
|
* Enable end-to-end tests for sourcemaps (+Windows instructions)
|
||||||
|
[\#3827](https://github.com/matrix-org/matrix-react-sdk/pull/3827)
|
||||||
|
* Repair community member info panel
|
||||||
|
[\#3832](https://github.com/matrix-org/matrix-react-sdk/pull/3832)
|
||||||
|
* Add feature flag around the presence indicator in room list
|
||||||
|
[\#3831](https://github.com/matrix-org/matrix-react-sdk/pull/3831)
|
||||||
|
* Display a padlock icon beside invite-only rooms in the room list
|
||||||
|
[\#3821](https://github.com/matrix-org/matrix-react-sdk/pull/3821)
|
||||||
|
* Update from Weblate
|
||||||
|
[\#3830](https://github.com/matrix-org/matrix-react-sdk/pull/3830)
|
||||||
|
* Fix listener leak on RoomView
|
||||||
|
[\#3826](https://github.com/matrix-org/matrix-react-sdk/pull/3826)
|
||||||
|
* Regenerate i18n for sourcemaps branch
|
||||||
|
[\#3824](https://github.com/matrix-org/matrix-react-sdk/pull/3824)
|
||||||
|
* Fix tests for sourcemaps branch
|
||||||
|
[\#3823](https://github.com/matrix-org/matrix-react-sdk/pull/3823)
|
||||||
|
* Jest
|
||||||
|
[\#3724](https://github.com/matrix-org/matrix-react-sdk/pull/3724)
|
||||||
|
* Sourcemaps: develop -> feature branch
|
||||||
|
[\#3817](https://github.com/matrix-org/matrix-react-sdk/pull/3817)
|
||||||
|
* Support pasting a bunch of identifiers into the invite dialog
|
||||||
|
[\#3820](https://github.com/matrix-org/matrix-react-sdk/pull/3820)
|
||||||
|
* Support 3PIDs (email addresses) in the invite dialog
|
||||||
|
[\#3819](https://github.com/matrix-org/matrix-react-sdk/pull/3819)
|
||||||
|
* Placeholder PR for cleaner diffs: ES6
|
||||||
|
[\#3765](https://github.com/matrix-org/matrix-react-sdk/pull/3765)
|
||||||
|
* Misc fixes for ES6 imports/exports
|
||||||
|
[\#3766](https://github.com/matrix-org/matrix-react-sdk/pull/3766)
|
||||||
|
* Wire up the invite targets dialog to a real composer and show selections
|
||||||
|
[\#3815](https://github.com/matrix-org/matrix-react-sdk/pull/3815)
|
||||||
|
* Change ref handling in TextualBody to prevent it parsing generated nodes
|
||||||
|
[\#3711](https://github.com/matrix-org/matrix-react-sdk/pull/3711)
|
||||||
|
* Render encoded html entities in og:description
|
||||||
|
[\#3789](https://github.com/matrix-org/matrix-react-sdk/pull/3789)
|
||||||
|
* Update package.json for new build process + cosmetics
|
||||||
|
[\#3767](https://github.com/matrix-org/matrix-react-sdk/pull/3767)
|
||||||
|
* Convert CommonJS exports to ES6 exports
|
||||||
|
[\#3761](https://github.com/matrix-org/matrix-react-sdk/pull/3761)
|
||||||
|
* Round 2 of CommonJS to ES6 imports
|
||||||
|
[\#3764](https://github.com/matrix-org/matrix-react-sdk/pull/3764)
|
||||||
|
* Strip all variation selectors on emoji
|
||||||
|
[\#3814](https://github.com/matrix-org/matrix-react-sdk/pull/3814)
|
||||||
|
* Use the new js-sdk imports and import from src
|
||||||
|
[\#3763](https://github.com/matrix-org/matrix-react-sdk/pull/3763)
|
||||||
|
* Convert many imports to handle ES6 exports
|
||||||
|
[\#3762](https://github.com/matrix-org/matrix-react-sdk/pull/3762)
|
||||||
|
* Fix userinfo for users not in the room
|
||||||
|
[\#3812](https://github.com/matrix-org/matrix-react-sdk/pull/3812)
|
||||||
|
* Attempt to fix e2e tests
|
||||||
|
[\#3811](https://github.com/matrix-org/matrix-react-sdk/pull/3811)
|
||||||
|
* Add bunch of null-guards and similar to fix React Errors/complaints
|
||||||
|
[\#3752](https://github.com/matrix-org/matrix-react-sdk/pull/3752)
|
||||||
|
* Delegate all room alias validation to the RoomAliasField validator
|
||||||
|
[\#3807](https://github.com/matrix-org/matrix-react-sdk/pull/3807)
|
||||||
|
* Support filtering and searching for users to invite in DMs
|
||||||
|
[\#3802](https://github.com/matrix-org/matrix-react-sdk/pull/3802)
|
||||||
|
* Add suggestions for which users to invite to chat
|
||||||
|
[\#3801](https://github.com/matrix-org/matrix-react-sdk/pull/3801)
|
||||||
|
* Use `flex-start` instead of `start` for postcss
|
||||||
|
[\#3760](https://github.com/matrix-org/matrix-react-sdk/pull/3760)
|
||||||
|
* Define getLanguageFromBrowser() for LanguageDropdown
|
||||||
|
[\#3769](https://github.com/matrix-org/matrix-react-sdk/pull/3769)
|
||||||
|
* Introduce babel's export-default-from plugin to fix build errors
|
||||||
|
[\#3768](https://github.com/matrix-org/matrix-react-sdk/pull/3768)
|
||||||
|
* Add a bit of debugging to incorrect components in the Skinner
|
||||||
|
[\#3770](https://github.com/matrix-org/matrix-react-sdk/pull/3770)
|
||||||
|
* [BREAKING] Refactor the entire build process for babel@7 and TypeScript
|
||||||
|
(chunk 1 of many)
|
||||||
|
[\#3722](https://github.com/matrix-org/matrix-react-sdk/pull/3722)
|
||||||
|
* Implementation of new potential skinning mechanism
|
||||||
|
[\#3723](https://github.com/matrix-org/matrix-react-sdk/pull/3723)
|
||||||
|
|
||||||
Changes in [1.7.6](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v1.7.6) (2020-01-13)
|
Changes in [1.7.6](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v1.7.6) (2020-01-13)
|
||||||
===================================================================================================
|
===================================================================================================
|
||||||
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v1.7.6-rc.2...v1.7.6)
|
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v1.7.6-rc.2...v1.7.6)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "matrix-react-sdk",
|
"name": "matrix-react-sdk",
|
||||||
"version": "1.7.6",
|
"version": "2.0.0",
|
||||||
"description": "SDK for matrix.org using React",
|
"description": "SDK for matrix.org using React",
|
||||||
"author": "matrix.org",
|
"author": "matrix.org",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -80,7 +80,7 @@
|
||||||
"is-ip": "^2.0.0",
|
"is-ip": "^2.0.0",
|
||||||
"linkifyjs": "^2.1.6",
|
"linkifyjs": "^2.1.6",
|
||||||
"lodash": "^4.17.14",
|
"lodash": "^4.17.14",
|
||||||
"matrix-js-sdk": "3.0.0",
|
"matrix-js-sdk": "4.0.0",
|
||||||
"pako": "^1.0.5",
|
"pako": "^1.0.5",
|
||||||
"png-chunks-extract": "^1.0.0",
|
"png-chunks-extract": "^1.0.0",
|
||||||
"prop-types": "^15.5.8",
|
"prop-types": "^15.5.8",
|
||||||
|
|
|
@ -386,7 +386,13 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mx_Dialog button, .mx_Dialog input[type="submit"] {
|
/* XXX: Our button style are a mess: buttons that happen to appear in dialogs get special styles applied
|
||||||
|
* to them that no button anywhere else in the app gets by default. In practice, buttons in other places
|
||||||
|
* in the app look the same by being AccessibleButtons, or possibly by having explict button classes.
|
||||||
|
* We should go through and have one consistent set of styles for buttons throughout the app.
|
||||||
|
* For now, I am duplicating the selectors here for mx_Dialog and mx_DialogButtons.
|
||||||
|
*/
|
||||||
|
.mx_Dialog button, .mx_Dialog input[type="submit"], .mx_Dialog_buttons button, .mx_Dialog_buttons input[type="submit"] {
|
||||||
@mixin mx_DialogButton;
|
@mixin mx_DialogButton;
|
||||||
margin-left: 0px;
|
margin-left: 0px;
|
||||||
margin-right: 8px;
|
margin-right: 8px;
|
||||||
|
@ -402,27 +408,27 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus {
|
||||||
margin-right: 0px;
|
margin-right: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mx_Dialog button:hover, .mx_Dialog input[type="submit"]:hover {
|
.mx_Dialog button:hover, .mx_Dialog input[type="submit"]:hover, .mx_Dialog_buttons button:hover, .mx_Dialog_buttons input[type="submit"]:hover {
|
||||||
@mixin mx_DialogButton_hover;
|
@mixin mx_DialogButton_hover;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mx_Dialog button:focus, .mx_Dialog input[type="submit"]:focus {
|
.mx_Dialog button:focus, .mx_Dialog input[type="submit"]:focus, .mx_Dialog_buttons button:focus, .mx_Dialog_buttons input[type="submit"]:focus {
|
||||||
filter: brightness($focus-brightness);
|
filter: brightness($focus-brightness);
|
||||||
}
|
}
|
||||||
|
|
||||||
.mx_Dialog button.mx_Dialog_primary, .mx_Dialog input[type="submit"].mx_Dialog_primary {
|
.mx_Dialog button.mx_Dialog_primary, .mx_Dialog input[type="submit"].mx_Dialog_primary, .mx_Dialog_buttons button.mx_Dialog_primary, .mx_Dialog_buttons input[type="submit"].mx_Dialog_primary {
|
||||||
color: $accent-fg-color;
|
color: $accent-fg-color;
|
||||||
background-color: $accent-color;
|
background-color: $accent-color;
|
||||||
min-width: 156px;
|
min-width: 156px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mx_Dialog button.danger, .mx_Dialog input[type="submit"].danger {
|
.mx_Dialog button.danger, .mx_Dialog input[type="submit"].danger, .mx_Dialog_buttons button.danger, .mx_Dialog_buttons input[type="submit"].danger {
|
||||||
background-color: $warning-color;
|
background-color: $warning-color;
|
||||||
border: solid 1px $warning-color;
|
border: solid 1px $warning-color;
|
||||||
color: $accent-fg-color;
|
color: $accent-fg-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mx_Dialog button:disabled, .mx_Dialog input[type="submit"]:disabled {
|
.mx_Dialog button:disabled, .mx_Dialog input[type="submit"]:disabled, .mx_Dialog_buttons button:disabled, .mx_Dialog_buttons input[type="submit"]:disabled {
|
||||||
background-color: $light-fg-color;
|
background-color: $light-fg-color;
|
||||||
border: solid 1px $light-fg-color;
|
border: solid 1px $light-fg-color;
|
||||||
opacity: 0.7;
|
opacity: 0.7;
|
||||||
|
|
|
@ -15,13 +15,10 @@ limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.mx_AuthBody {
|
.mx_AuthBody {
|
||||||
width: 500px;
|
|
||||||
background-color: $authpage-body-bg-color;
|
background-color: $authpage-body-bg-color;
|
||||||
border-radius: 0 4px 4px 0;
|
border-radius: 0 4px 4px 0;
|
||||||
padding: 25px 60px;
|
padding: 25px 60px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
font-size: 12px;
|
|
||||||
color: $authpage-secondary-color;
|
|
||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
font-size: 24px;
|
font-size: 24px;
|
||||||
|
@ -99,6 +96,12 @@ limitations under the License.
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mx_AuthBody_loginRegister {
|
||||||
|
width: 500px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: $authpage-secondary-color;
|
||||||
|
}
|
||||||
|
|
||||||
.mx_AuthBody_editServerDetails {
|
.mx_AuthBody_editServerDetails {
|
||||||
padding-left: 1em;
|
padding-left: 1em;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
|
|
|
@ -78,6 +78,10 @@ limitations under the License.
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mx_CreateSecretStorageDialog_recoveryKeyButtons .mx_AccessibleButton {
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
.mx_CreateSecretStorageDialog_recoveryKeyButtons button {
|
.mx_CreateSecretStorageDialog_recoveryKeyButtons button {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
|
|
@ -109,7 +109,7 @@ limitations under the License.
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|
||||||
// override the calculated sizes so that the letter isn't HUGE
|
// override the calculated sizes so that the letter isn't HUGE
|
||||||
font-size: 26px !important;
|
font-size: 56px !important;
|
||||||
width: 100% !important;
|
width: 100% !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,10 +20,13 @@ import * as sdk from './index';
|
||||||
import { _t } from './languageHandler';
|
import { _t } from './languageHandler';
|
||||||
import ToastStore from './stores/ToastStore';
|
import ToastStore from './stores/ToastStore';
|
||||||
|
|
||||||
function toastKey(device) {
|
function toastKey(deviceId) {
|
||||||
return 'newsession_' + device.deviceId;
|
return 'newsession_' + deviceId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const KEY_BACKUP_POLL_INTERVAL = 5 * 60 * 1000;
|
||||||
|
const THIS_DEVICE_TOAST_KEY = 'setupencryption';
|
||||||
|
|
||||||
export default class DeviceListener {
|
export default class DeviceListener {
|
||||||
static sharedInstance() {
|
static sharedInstance() {
|
||||||
if (!global.mx_DeviceListener) global.mx_DeviceListener = new DeviceListener();
|
if (!global.mx_DeviceListener) global.mx_DeviceListener = new DeviceListener();
|
||||||
|
@ -31,44 +34,120 @@ export default class DeviceListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
|
// set of device IDs we're currently showing toasts for
|
||||||
|
this._activeNagToasts = new Set();
|
||||||
// device IDs for which the user has dismissed the verify toast ('Later')
|
// device IDs for which the user has dismissed the verify toast ('Later')
|
||||||
this._dismissed = new Set();
|
this._dismissed = new Set();
|
||||||
|
// has the user dismissed any of the various nag toasts to setup encryption on this device?
|
||||||
|
this._dismissedThisDeviceToast = false;
|
||||||
|
|
||||||
|
// cache of the key backup info
|
||||||
|
this._keyBackupInfo = null;
|
||||||
|
this._keyBackupFetchedAt = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
start() {
|
start() {
|
||||||
MatrixClientPeg.get().on('crypto.devicesUpdated', this._onDevicesUpdated);
|
MatrixClientPeg.get().on('crypto.devicesUpdated', this._onDevicesUpdated);
|
||||||
MatrixClientPeg.get().on('deviceVerificationChanged', this._onDeviceVerificationChanged);
|
MatrixClientPeg.get().on('deviceVerificationChanged', this._onDeviceVerificationChanged);
|
||||||
this.recheck();
|
MatrixClientPeg.get().on('userTrustStatusChanged', this._onUserTrustStatusChanged);
|
||||||
|
this._recheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
stop() {
|
stop() {
|
||||||
if (MatrixClientPeg.get()) {
|
if (MatrixClientPeg.get()) {
|
||||||
MatrixClientPeg.get().removeListener('crypto.devicesUpdated', this._onDevicesUpdated);
|
MatrixClientPeg.get().removeListener('crypto.devicesUpdated', this._onDevicesUpdated);
|
||||||
MatrixClientPeg.get().removeListener('deviceVerificationChanged', this._onDeviceVerificationChanged);
|
MatrixClientPeg.get().removeListener('deviceVerificationChanged', this._onDeviceVerificationChanged);
|
||||||
|
MatrixClientPeg.get().removeListener('userTrustStatusChanged', this._onUserTrustStatusChanged);
|
||||||
}
|
}
|
||||||
this._dismissed.clear();
|
this._dismissed.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
dismissVerification(deviceId) {
|
dismissVerification(deviceId) {
|
||||||
this._dismissed.add(deviceId);
|
this._dismissed.add(deviceId);
|
||||||
this.recheck();
|
this._recheck();
|
||||||
|
}
|
||||||
|
|
||||||
|
dismissEncryptionSetup() {
|
||||||
|
this._dismissedThisDeviceToast = true;
|
||||||
|
this._recheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
_onDevicesUpdated = (users) => {
|
_onDevicesUpdated = (users) => {
|
||||||
if (!users.includes(MatrixClientPeg.get().getUserId())) return;
|
if (!users.includes(MatrixClientPeg.get().getUserId())) return;
|
||||||
this.recheck();
|
this._recheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
_onDeviceVerificationChanged = (users) => {
|
_onDeviceVerificationChanged = (users) => {
|
||||||
if (!users.includes(MatrixClientPeg.get().getUserId())) return;
|
if (!users.includes(MatrixClientPeg.get().getUserId())) return;
|
||||||
this.recheck();
|
this._recheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
async recheck() {
|
_onUserTrustStatusChanged = (userId, trustLevel) => {
|
||||||
|
if (userId !== MatrixClientPeg.get().getUserId()) return;
|
||||||
|
this._recheck();
|
||||||
|
}
|
||||||
|
|
||||||
|
// The server doesn't tell us when key backup is set up, so we poll
|
||||||
|
// & cache the result
|
||||||
|
async _getKeyBackupInfo() {
|
||||||
|
const now = (new Date()).getTime();
|
||||||
|
if (!this._keyBackupInfo || this._keyBackupFetchedAt < now - KEY_BACKUP_POLL_INTERVAL) {
|
||||||
|
this._keyBackupInfo = await MatrixClientPeg.get().getKeyBackupVersion();
|
||||||
|
this._keyBackupFetchedAt = now;
|
||||||
|
}
|
||||||
|
return this._keyBackupInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
async _recheck() {
|
||||||
if (!SettingsStore.isFeatureEnabled("feature_cross_signing")) return;
|
if (!SettingsStore.isFeatureEnabled("feature_cross_signing")) return;
|
||||||
const cli = MatrixClientPeg.get();
|
const cli = MatrixClientPeg.get();
|
||||||
|
|
||||||
if (!cli.isCryptoEnabled()) return false;
|
if (!cli.isCryptoEnabled()) return;
|
||||||
|
if (!cli.getCrossSigningId()) {
|
||||||
|
if (this._dismissedThisDeviceToast) {
|
||||||
|
ToastStore.sharedInstance().dismissToast(THIS_DEVICE_TOAST_KEY);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// cross signing isn't enabled - nag to enable it
|
||||||
|
// There are 3 different toasts for:
|
||||||
|
if (cli.getStoredCrossSigningForUser(cli.getUserId())) {
|
||||||
|
// Cross-signing on account but this device doesn't trust the master key (verify this session)
|
||||||
|
ToastStore.sharedInstance().addOrReplaceToast({
|
||||||
|
key: THIS_DEVICE_TOAST_KEY,
|
||||||
|
title: _t("Verify this session"),
|
||||||
|
icon: "verification_warning",
|
||||||
|
props: {kind: 'verify_this_session'},
|
||||||
|
component: sdk.getComponent("toasts.SetupEncryptionToast"),
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const backupInfo = await this._getKeyBackupInfo();
|
||||||
|
if (backupInfo) {
|
||||||
|
// No cross-signing on account but key backup available (upgrade encryption)
|
||||||
|
ToastStore.sharedInstance().addOrReplaceToast({
|
||||||
|
key: THIS_DEVICE_TOAST_KEY,
|
||||||
|
title: _t("Encryption upgrade available"),
|
||||||
|
icon: "verification_warning",
|
||||||
|
props: {kind: 'upgrade_encryption'},
|
||||||
|
component: sdk.getComponent("toasts.SetupEncryptionToast"),
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// No cross-signing or key backup on account (set up encryption)
|
||||||
|
ToastStore.sharedInstance().addOrReplaceToast({
|
||||||
|
key: THIS_DEVICE_TOAST_KEY,
|
||||||
|
title: _t("Set up encryption"),
|
||||||
|
icon: "verification_warning",
|
||||||
|
props: {kind: 'set_up_encryption'},
|
||||||
|
component: sdk.getComponent("toasts.SetupEncryptionToast"),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
ToastStore.sharedInstance().dismissToast(THIS_DEVICE_TOAST_KEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
const newActiveToasts = new Set();
|
||||||
|
|
||||||
const devices = await cli.getStoredDevicesForUser(cli.getUserId());
|
const devices = await cli.getStoredDevicesForUser(cli.getUserId());
|
||||||
for (const device of devices) {
|
for (const device of devices) {
|
||||||
|
@ -76,16 +155,24 @@ export default class DeviceListener {
|
||||||
|
|
||||||
const deviceTrust = await cli.checkDeviceTrust(cli.getUserId(), device.deviceId);
|
const deviceTrust = await cli.checkDeviceTrust(cli.getUserId(), device.deviceId);
|
||||||
if (deviceTrust.isCrossSigningVerified() || this._dismissed.has(device.deviceId)) {
|
if (deviceTrust.isCrossSigningVerified() || this._dismissed.has(device.deviceId)) {
|
||||||
ToastStore.sharedInstance().dismissToast(toastKey(device));
|
ToastStore.sharedInstance().dismissToast(toastKey(device.deviceId));
|
||||||
} else {
|
} else {
|
||||||
|
this._activeNagToasts.add(device.deviceId);
|
||||||
ToastStore.sharedInstance().addOrReplaceToast({
|
ToastStore.sharedInstance().addOrReplaceToast({
|
||||||
key: toastKey(device),
|
key: toastKey(device.deviceId),
|
||||||
title: _t("New Session"),
|
title: _t("New Session"),
|
||||||
icon: "verification_warning",
|
icon: "verification_warning",
|
||||||
props: {deviceId: device.deviceId},
|
props: {deviceId: device.deviceId},
|
||||||
component: sdk.getComponent("toasts.NewSessionToast"),
|
component: sdk.getComponent("toasts.NewSessionToast"),
|
||||||
});
|
});
|
||||||
|
newActiveToasts.add(device.deviceId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// clear any other outstanding toasts (eg. logged out devices)
|
||||||
|
for (const deviceId of this._activeNagToasts) {
|
||||||
|
if (!newActiveToasts.has(deviceId)) ToastStore.sharedInstance().dismissToast(toastKey(deviceId));
|
||||||
|
}
|
||||||
|
this._activeNagToasts = newActiveToasts;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -444,10 +444,19 @@ function textForHistoryVisibilityEvent(event) {
|
||||||
|
|
||||||
function textForEncryptionEvent(event) {
|
function textForEncryptionEvent(event) {
|
||||||
const senderName = event.sender ? event.sender.name : event.getSender();
|
const senderName = event.sender ? event.sender.name : event.getSender();
|
||||||
return _t('%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).', {
|
if (event.getContent().algorithm === "m.megolm.v1.aes-sha2") {
|
||||||
senderName,
|
return _t('%(senderName)s turned on end-to-end encryption.', {
|
||||||
algorithm: event.getContent().algorithm,
|
senderName,
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
return _t(
|
||||||
|
'%(senderName)s turned on end-to-end encryption ' +
|
||||||
|
'(unrecognised algorithm %(algorithm)s).',
|
||||||
|
{
|
||||||
|
senderName,
|
||||||
|
algorithm: event.getContent().algorithm,
|
||||||
|
},
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Currently will only display a change if a user's power level is changed
|
// Currently will only display a change if a user's power level is changed
|
||||||
|
|
|
@ -16,6 +16,7 @@ limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
import * as sdk from '../../../../index';
|
import * as sdk from '../../../../index';
|
||||||
import {MatrixClientPeg} from '../../../../MatrixClientPeg';
|
import {MatrixClientPeg} from '../../../../MatrixClientPeg';
|
||||||
import { scorePassword } from '../../../../utils/PasswordScorer';
|
import { scorePassword } from '../../../../utils/PasswordScorer';
|
||||||
|
@ -52,6 +53,15 @@ function selectText(target) {
|
||||||
* Secret Storage in account data.
|
* Secret Storage in account data.
|
||||||
*/
|
*/
|
||||||
export default class CreateSecretStorageDialog extends React.PureComponent {
|
export default class CreateSecretStorageDialog extends React.PureComponent {
|
||||||
|
static propTypes = {
|
||||||
|
hasCancel: PropTypes.bool,
|
||||||
|
accountPassword: PropTypes.string,
|
||||||
|
};
|
||||||
|
|
||||||
|
defaultProps = {
|
||||||
|
hasCancel: true,
|
||||||
|
};
|
||||||
|
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
|
|
||||||
|
@ -73,7 +83,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
|
||||||
// does the server offer a UI auth flow with just m.login.password
|
// does the server offer a UI auth flow with just m.login.password
|
||||||
// for /keys/device_signing/upload?
|
// for /keys/device_signing/upload?
|
||||||
canUploadKeysWithPasswordOnly: null,
|
canUploadKeysWithPasswordOnly: null,
|
||||||
accountPassword: '',
|
accountPassword: props.accountPassword,
|
||||||
accountPasswordCorrect: null,
|
accountPasswordCorrect: null,
|
||||||
// set if we are 'upgrading' encryption (making an SSSS store from
|
// set if we are 'upgrading' encryption (making an SSSS store from
|
||||||
// an existing key backup secret).
|
// an existing key backup secret).
|
||||||
|
@ -82,9 +92,12 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
|
||||||
|
|
||||||
this._fetchBackupInfo();
|
this._fetchBackupInfo();
|
||||||
this._queryKeyUploadAuth();
|
this._queryKeyUploadAuth();
|
||||||
|
|
||||||
|
MatrixClientPeg.get().on('crypto.keyBackupStatus', this._onKeyBackupStatusChange);
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillUnmount() {
|
componentWillUnmount() {
|
||||||
|
MatrixClientPeg.get().removeListener('crypto.keyBackupStatus', this._onKeyBackupStatusChange);
|
||||||
if (this._setZxcvbnResultTimeout !== null) {
|
if (this._setZxcvbnResultTimeout !== null) {
|
||||||
clearTimeout(this._setZxcvbnResultTimeout);
|
clearTimeout(this._setZxcvbnResultTimeout);
|
||||||
}
|
}
|
||||||
|
@ -92,7 +105,10 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
|
||||||
|
|
||||||
async _fetchBackupInfo() {
|
async _fetchBackupInfo() {
|
||||||
const backupInfo = await MatrixClientPeg.get().getKeyBackupVersion();
|
const backupInfo = await MatrixClientPeg.get().getKeyBackupVersion();
|
||||||
const backupSigStatus = await MatrixClientPeg.get().isKeyBackupTrusted(backupInfo);
|
const backupSigStatus = (
|
||||||
|
// we may not have started crypto yet, in which case we definitely don't trust the backup
|
||||||
|
MatrixClientPeg.get().isCryptoEnabled() && await MatrixClientPeg.get().isKeyBackupTrusted(backupInfo)
|
||||||
|
);
|
||||||
|
|
||||||
const phase = backupInfo ?
|
const phase = backupInfo ?
|
||||||
(backupSigStatus.usable ? PHASE_MIGRATE : PHASE_RESTORE_KEY_BACKUP) :
|
(backupSigStatus.usable ? PHASE_MIGRATE : PHASE_RESTORE_KEY_BACKUP) :
|
||||||
|
@ -127,6 +143,10 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_onKeyBackupStatusChange = () => {
|
||||||
|
this._fetchBackupInfo();
|
||||||
|
}
|
||||||
|
|
||||||
_collectRecoveryKeyNode = (n) => {
|
_collectRecoveryKeyNode = (n) => {
|
||||||
this._recoveryKeyNode = n;
|
this._recoveryKeyNode = n;
|
||||||
}
|
}
|
||||||
|
@ -229,7 +249,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
|
||||||
_onRestoreKeyBackupClick = () => {
|
_onRestoreKeyBackupClick = () => {
|
||||||
const RestoreKeyBackupDialog = sdk.getComponent('dialogs.keybackup.RestoreKeyBackupDialog');
|
const RestoreKeyBackupDialog = sdk.getComponent('dialogs.keybackup.RestoreKeyBackupDialog');
|
||||||
Modal.createTrackedDialog(
|
Modal.createTrackedDialog(
|
||||||
'Restore Backup', '', RestoreKeyBackupDialog, null, null,
|
'Restore Backup', '', RestoreKeyBackupDialog, {showSummary: false}, null,
|
||||||
/* priority = */ false, /* static = */ true,
|
/* priority = */ false, /* static = */ true,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -411,6 +431,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
|
||||||
_renderPhasePassPhrase() {
|
_renderPhasePassPhrase() {
|
||||||
const DialogButtons = sdk.getComponent('views.elements.DialogButtons');
|
const DialogButtons = sdk.getComponent('views.elements.DialogButtons');
|
||||||
const Field = sdk.getComponent('views.elements.Field');
|
const Field = sdk.getComponent('views.elements.Field');
|
||||||
|
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
|
||||||
|
|
||||||
let strengthMeter;
|
let strengthMeter;
|
||||||
let helpText;
|
let helpText;
|
||||||
|
@ -472,9 +493,9 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>{_t("Advanced")}</summary>
|
<summary>{_t("Advanced")}</summary>
|
||||||
<p><button onClick={this._onSkipPassPhraseClick} >
|
<p><AccessibleButton kind='primary' onClick={this._onSkipPassPhraseClick} >
|
||||||
{_t("Set up with a recovery key")}
|
{_t("Set up with a recovery key")}
|
||||||
</button></p>
|
</AccessibleButton></p>
|
||||||
</details>
|
</details>
|
||||||
</div>;
|
</div>;
|
||||||
}
|
}
|
||||||
|
@ -554,6 +575,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
|
||||||
return <div>
|
return <div>
|
||||||
<p>{_t(
|
<p>{_t(
|
||||||
"Your recovery key is a safety net - you can use it to restore " +
|
"Your recovery key is a safety net - you can use it to restore " +
|
||||||
|
@ -572,12 +594,12 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
|
||||||
<code ref={this._collectRecoveryKeyNode}>{this._encodedRecoveryKey}</code>
|
<code ref={this._collectRecoveryKeyNode}>{this._encodedRecoveryKey}</code>
|
||||||
</div>
|
</div>
|
||||||
<div className="mx_CreateSecretStorageDialog_recoveryKeyButtons">
|
<div className="mx_CreateSecretStorageDialog_recoveryKeyButtons">
|
||||||
<button className="mx_Dialog_primary" onClick={this._onCopyClick}>
|
<AccessibleButton kind='primary' className="mx_Dialog_primary" onClick={this._onCopyClick}>
|
||||||
{_t("Copy to clipboard")}
|
{_t("Copy to clipboard")}
|
||||||
</button>
|
</AccessibleButton>
|
||||||
<button className="mx_Dialog_primary" onClick={this._onDownloadClick}>
|
<AccessibleButton kind='primary' className="mx_Dialog_primary" onClick={this._onDownloadClick}>
|
||||||
{_t("Download")}
|
{_t("Download")}
|
||||||
</button>
|
</AccessibleButton>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -740,7 +762,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
|
||||||
onFinished={this.props.onFinished}
|
onFinished={this.props.onFinished}
|
||||||
title={this._titleForPhase(this.state.phase)}
|
title={this._titleForPhase(this.state.phase)}
|
||||||
headerImage={headerImage}
|
headerImage={headerImage}
|
||||||
hasCancel={[PHASE_PASSPHRASE].includes(this.state.phase)}
|
hasCancel={this.props.hasCancel && [PHASE_PASSPHRASE].includes(this.state.phase)}
|
||||||
>
|
>
|
||||||
<div>
|
<div>
|
||||||
{content}
|
{content}
|
||||||
|
|
|
@ -20,7 +20,7 @@ import React, {createRef} from 'react';
|
||||||
import createReactClass from 'create-react-class';
|
import createReactClass from 'create-react-class';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import {getEntryComponentForLoginType} from '../views/auth/InteractiveAuthEntryComponents';
|
import getEntryComponentForLoginType from '../views/auth/InteractiveAuthEntryComponents';
|
||||||
|
|
||||||
import * as sdk from '../../index';
|
import * as sdk from '../../index';
|
||||||
|
|
||||||
|
|
|
@ -89,12 +89,15 @@ export const VIEWS = {
|
||||||
// showing flow to trust this new device with cross-signing
|
// showing flow to trust this new device with cross-signing
|
||||||
COMPLETE_SECURITY: 6,
|
COMPLETE_SECURITY: 6,
|
||||||
|
|
||||||
|
// flow to setup SSSS / cross-signing on this account
|
||||||
|
E2E_SETUP: 7,
|
||||||
|
|
||||||
// we are logged in with an active matrix client.
|
// we are logged in with an active matrix client.
|
||||||
LOGGED_IN: 7,
|
LOGGED_IN: 8,
|
||||||
|
|
||||||
// We are logged out (invalid token) but have our local state again. The user
|
// We are logged out (invalid token) but have our local state again. The user
|
||||||
// should log back in to rehydrate the client.
|
// should log back in to rehydrate the client.
|
||||||
SOFT_LOGOUT: 8,
|
SOFT_LOGOUT: 9,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Actions that are redirected through the onboarding process prior to being
|
// Actions that are redirected through the onboarding process prior to being
|
||||||
|
@ -253,6 +256,9 @@ export default createReactClass({
|
||||||
// logout page.
|
// logout page.
|
||||||
Lifecycle.loadSession({});
|
Lifecycle.loadSession({});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._accountPassword = null;
|
||||||
|
this._accountPasswordTimer = null;
|
||||||
},
|
},
|
||||||
|
|
||||||
componentDidMount: function() {
|
componentDidMount: function() {
|
||||||
|
@ -349,6 +355,8 @@ export default createReactClass({
|
||||||
window.removeEventListener("focus", this.onFocus);
|
window.removeEventListener("focus", this.onFocus);
|
||||||
window.removeEventListener('resize', this.handleResize);
|
window.removeEventListener('resize', this.handleResize);
|
||||||
this.state.resizeNotifier.removeListener("middlePanelResized", this._dispatchTimelineResize);
|
this.state.resizeNotifier.removeListener("middlePanelResized", this._dispatchTimelineResize);
|
||||||
|
|
||||||
|
if (this._accountPasswordTimer !== null) clearTimeout(this._accountPasswordTimer);
|
||||||
},
|
},
|
||||||
|
|
||||||
componentWillUpdate: function(props, state) {
|
componentWillUpdate: function(props, state) {
|
||||||
|
@ -657,7 +665,9 @@ export default createReactClass({
|
||||||
if (
|
if (
|
||||||
!Lifecycle.isSoftLogout() &&
|
!Lifecycle.isSoftLogout() &&
|
||||||
this.state.view !== VIEWS.LOGIN &&
|
this.state.view !== VIEWS.LOGIN &&
|
||||||
this.state.view !== VIEWS.COMPLETE_SECURITY
|
this.state.view !== VIEWS.REGISTER &&
|
||||||
|
this.state.view !== VIEWS.COMPLETE_SECURITY &&
|
||||||
|
this.state.view !== VIEWS.E2E_SETUP
|
||||||
) {
|
) {
|
||||||
this._onLoggedIn();
|
this._onLoggedIn();
|
||||||
}
|
}
|
||||||
|
@ -1724,6 +1734,10 @@ export default createReactClass({
|
||||||
this.showScreen("forgot_password");
|
this.showScreen("forgot_password");
|
||||||
},
|
},
|
||||||
|
|
||||||
|
onRegisterFlowComplete: function(credentials, password) {
|
||||||
|
return this.onUserCompletedLoginFlow(credentials, password);
|
||||||
|
},
|
||||||
|
|
||||||
// returns a promise which resolves to the new MatrixClient
|
// returns a promise which resolves to the new MatrixClient
|
||||||
onRegistered: function(credentials) {
|
onRegistered: function(credentials) {
|
||||||
return Lifecycle.setLoggedIn(credentials);
|
return Lifecycle.setLoggedIn(credentials);
|
||||||
|
@ -1812,7 +1826,14 @@ export default createReactClass({
|
||||||
this._loggedInView = ref;
|
this._loggedInView = ref;
|
||||||
},
|
},
|
||||||
|
|
||||||
async onUserCompletedLoginFlow(credentials) {
|
async onUserCompletedLoginFlow(credentials, password) {
|
||||||
|
this._accountPassword = password;
|
||||||
|
// self-destruct the password after 5mins
|
||||||
|
if (this._accountPasswordTimer !== null) clearTimeout(this._accountPasswordTimer);
|
||||||
|
this._accountPasswordTimer = setTimeout(() => {
|
||||||
|
this._accountPassword = null;
|
||||||
|
this._accountPasswordTimer = null;
|
||||||
|
}, 60 * 5 * 1000);
|
||||||
// Wait for the client to be logged in (but not started)
|
// Wait for the client to be logged in (but not started)
|
||||||
// which is enough to ask the server about account data.
|
// which is enough to ask the server about account data.
|
||||||
const loggedIn = new Promise(resolve => {
|
const loggedIn = new Promise(resolve => {
|
||||||
|
@ -1826,7 +1847,7 @@ export default createReactClass({
|
||||||
});
|
});
|
||||||
|
|
||||||
// Create and start the client in the background
|
// Create and start the client in the background
|
||||||
Lifecycle.setLoggedIn(credentials);
|
const setLoggedInPromise = Lifecycle.setLoggedIn(credentials);
|
||||||
await loggedIn;
|
await loggedIn;
|
||||||
|
|
||||||
const cli = MatrixClientPeg.get();
|
const cli = MatrixClientPeg.get();
|
||||||
|
@ -1847,12 +1868,20 @@ export default createReactClass({
|
||||||
|
|
||||||
if (masterKeyInStorage) {
|
if (masterKeyInStorage) {
|
||||||
this.setStateForNewView({ view: VIEWS.COMPLETE_SECURITY });
|
this.setStateForNewView({ view: VIEWS.COMPLETE_SECURITY });
|
||||||
|
} else if (SettingsStore.isFeatureEnabled("feature_cross_signing")) {
|
||||||
|
// This will only work if the feature is set to 'enable' in the config,
|
||||||
|
// since it's too early in the lifecycle for users to have turned the
|
||||||
|
// labs flag on.
|
||||||
|
this.setStateForNewView({ view: VIEWS.E2E_SETUP });
|
||||||
} else {
|
} else {
|
||||||
this._onLoggedIn();
|
this._onLoggedIn();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return setLoggedInPromise;
|
||||||
},
|
},
|
||||||
|
|
||||||
onCompleteSecurityFinished() {
|
// complete security / e2e setup has finished
|
||||||
|
onCompleteSecurityE2eSetupFinished() {
|
||||||
this._onLoggedIn();
|
this._onLoggedIn();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -1872,7 +1901,15 @@ export default createReactClass({
|
||||||
const CompleteSecurity = sdk.getComponent('structures.auth.CompleteSecurity');
|
const CompleteSecurity = sdk.getComponent('structures.auth.CompleteSecurity');
|
||||||
view = (
|
view = (
|
||||||
<CompleteSecurity
|
<CompleteSecurity
|
||||||
onFinished={this.onCompleteSecurityFinished}
|
onFinished={this.onCompleteSecurityE2eSetupFinished}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
} else if (this.state.view === VIEWS.E2E_SETUP) {
|
||||||
|
const E2eSetup = sdk.getComponent('structures.auth.E2eSetup');
|
||||||
|
view = (
|
||||||
|
<E2eSetup
|
||||||
|
onFinished={this.onCompleteSecurityE2eSetupFinished}
|
||||||
|
accountPassword={this._accountPassword}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
} else if (this.state.view === VIEWS.POST_REGISTRATION) {
|
} else if (this.state.view === VIEWS.POST_REGISTRATION) {
|
||||||
|
@ -1939,7 +1976,7 @@ export default createReactClass({
|
||||||
email={this.props.startingFragmentQueryParams.email}
|
email={this.props.startingFragmentQueryParams.email}
|
||||||
brand={this.props.config.brand}
|
brand={this.props.config.brand}
|
||||||
makeRegistrationUrl={this._makeRegistrationUrl}
|
makeRegistrationUrl={this._makeRegistrationUrl}
|
||||||
onLoggedIn={this.onRegistered}
|
onLoggedIn={this.onRegisterFlowComplete}
|
||||||
onLoginClick={this.onLoginClick}
|
onLoginClick={this.onLoginClick}
|
||||||
onServerConfigChange={this.onServerConfigChange}
|
onServerConfigChange={this.onServerConfigChange}
|
||||||
{...this.getServerProperties()}
|
{...this.getServerProperties()}
|
||||||
|
|
|
@ -766,7 +766,7 @@ export default createReactClass({
|
||||||
|
|
||||||
onUserVerificationChanged: function(userId, _trustStatus) {
|
onUserVerificationChanged: function(userId, _trustStatus) {
|
||||||
const room = this.state.room;
|
const room = this.state.room;
|
||||||
if (!room.currentState.getMember(userId)) {
|
if (!room || !room.currentState.getMember(userId)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this._updateE2EStatus(room);
|
this._updateE2EStatus(room);
|
||||||
|
|
|
@ -23,9 +23,11 @@ export default class ToastContainer extends React.Component {
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
this.state = {toasts: ToastStore.sharedInstance().getToasts()};
|
this.state = {toasts: ToastStore.sharedInstance().getToasts()};
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount() {
|
// Start listening here rather than in componentDidMount because
|
||||||
|
// toasts may dismiss themselves in their didMount if they find
|
||||||
|
// they're already irrelevant by the time they're mounted, and
|
||||||
|
// our own componentDidMount is too late.
|
||||||
ToastStore.sharedInstance().on('update', this._onToastStoreUpdate);
|
ToastStore.sharedInstance().on('update', this._onToastStoreUpdate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ limitations under the License.
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import {TopLeftMenu} from '../views/context_menus/TopLeftMenu';
|
import TopLeftMenu from '../views/context_menus/TopLeftMenu';
|
||||||
import BaseAvatar from '../views/avatars/BaseAvatar';
|
import BaseAvatar from '../views/avatars/BaseAvatar';
|
||||||
import {MatrixClientPeg} from '../../MatrixClientPeg';
|
import {MatrixClientPeg} from '../../MatrixClientPeg';
|
||||||
import * as Avatar from '../../Avatar';
|
import * as Avatar from '../../Avatar';
|
||||||
|
|
|
@ -35,7 +35,21 @@ export default class CompleteSecurity extends React.Component {
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
phase: PHASE_INTRO,
|
phase: PHASE_INTRO,
|
||||||
|
// this serves dual purpose as the object for the request logic and
|
||||||
|
// the presence of it insidicating that we're in 'verify mode'.
|
||||||
|
// Because of the latter, it lives in the state.
|
||||||
|
verificationRequest: null,
|
||||||
};
|
};
|
||||||
|
MatrixClientPeg.get().on("crypto.verification.request", this.onVerificationRequest);
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
if (this.state.verificationRequest) {
|
||||||
|
this.state.verificationRequest.off("change", this.onVerificationRequestChange);
|
||||||
|
}
|
||||||
|
if (MatrixClientPeg.get()) {
|
||||||
|
MatrixClientPeg.get().removeListener("crypto.verification.request", this.onVerificationRequest);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onStartClick = async () => {
|
onStartClick = async () => {
|
||||||
|
@ -55,6 +69,27 @@ export default class CompleteSecurity extends React.Component {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onVerificationRequest = (request) => {
|
||||||
|
if (request.otherUserId !== MatrixClientPeg.get().getUserId()) return;
|
||||||
|
|
||||||
|
if (this.state.verificationRequest) {
|
||||||
|
this.state.verificationRequest.off("change", this.onVerificationRequestChange);
|
||||||
|
}
|
||||||
|
request.on("change", this.onVerificationRequestChange);
|
||||||
|
this.setState({
|
||||||
|
verificationRequest: request,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
onVerificationRequestChange = () => {
|
||||||
|
if (this.state.verificationRequest.cancelled) {
|
||||||
|
this.state.verificationRequest.off("change", this.onVerificationRequestChange);
|
||||||
|
this.setState({
|
||||||
|
verificationRequest: null,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
onSkipClick = () => {
|
onSkipClick = () => {
|
||||||
this.setState({
|
this.setState({
|
||||||
phase: PHASE_CONFIRM_SKIP,
|
phase: PHASE_CONFIRM_SKIP,
|
||||||
|
@ -87,7 +122,13 @@ export default class CompleteSecurity extends React.Component {
|
||||||
let icon;
|
let icon;
|
||||||
let title;
|
let title;
|
||||||
let body;
|
let body;
|
||||||
if (phase === PHASE_INTRO) {
|
|
||||||
|
if (this.state.verificationRequest) {
|
||||||
|
const IncomingSasDialog = sdk.getComponent("views.dialogs.IncomingSasDialog");
|
||||||
|
body = <IncomingSasDialog verifier={this.state.verificationRequest.verifier}
|
||||||
|
onFinished={this.props.onFinished}
|
||||||
|
/>;
|
||||||
|
} else if (phase === PHASE_INTRO) {
|
||||||
icon = <span className="mx_CompleteSecurity_headerIcon mx_E2EIcon_warning"></span>;
|
icon = <span className="mx_CompleteSecurity_headerIcon mx_E2EIcon_warning"></span>;
|
||||||
title = _t("Complete security");
|
title = _t("Complete security");
|
||||||
body = (
|
body = (
|
||||||
|
|
50
src/components/structures/auth/E2eSetup.js
Normal file
50
src/components/structures/auth/E2eSetup.js
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
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 AsyncWrapper from '../../../AsyncWrapper';
|
||||||
|
import * as sdk from '../../../index';
|
||||||
|
|
||||||
|
export default class E2eSetup extends React.Component {
|
||||||
|
static propTypes = {
|
||||||
|
onFinished: PropTypes.func.isRequired,
|
||||||
|
accountPassword: PropTypes.string,
|
||||||
|
};
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
// awkwardly indented because https://github.com/eslint/eslint/issues/11310
|
||||||
|
this._createStorageDialogPromise =
|
||||||
|
import("../../../async-components/views/dialogs/secretstorage/CreateSecretStorageDialog");
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const AuthPage = sdk.getComponent("auth.AuthPage");
|
||||||
|
const AuthBody = sdk.getComponent("auth.AuthBody");
|
||||||
|
return (
|
||||||
|
<AuthPage>
|
||||||
|
<AuthBody header={false}>
|
||||||
|
<AsyncWrapper prom={this._createStorageDialogPromise}
|
||||||
|
hasCancel={false}
|
||||||
|
onFinished={this.props.onFinished}
|
||||||
|
accountPassword={this.props.accountPassword}
|
||||||
|
/>
|
||||||
|
</AuthBody>
|
||||||
|
</AuthPage>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -58,6 +58,11 @@ export default createReactClass({
|
||||||
displayName: 'Login',
|
displayName: 'Login',
|
||||||
|
|
||||||
propTypes: {
|
propTypes: {
|
||||||
|
// Called when the user has logged in. Params:
|
||||||
|
// - The object returned by the login API
|
||||||
|
// - The user's password, if applicable, (may be cached in memory for a
|
||||||
|
// short time so the user is not required to re-enter their password
|
||||||
|
// for operations like uploading cross-signing keys).
|
||||||
onLoggedIn: PropTypes.func.isRequired,
|
onLoggedIn: PropTypes.func.isRequired,
|
||||||
|
|
||||||
// If true, the component will consider itself busy.
|
// If true, the component will consider itself busy.
|
||||||
|
@ -181,7 +186,7 @@ export default createReactClass({
|
||||||
username, phoneCountry, phoneNumber, password,
|
username, phoneCountry, phoneNumber, password,
|
||||||
).then((data) => {
|
).then((data) => {
|
||||||
this.setState({serverIsAlive: true}); // it must be, we logged in.
|
this.setState({serverIsAlive: true}); // it must be, we logged in.
|
||||||
this.props.onLoggedIn(data);
|
this.props.onLoggedIn(data, password);
|
||||||
}, (error) => {
|
}, (error) => {
|
||||||
if (this._unmounted) {
|
if (this._unmounted) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -45,7 +45,13 @@ export default createReactClass({
|
||||||
displayName: 'Registration',
|
displayName: 'Registration',
|
||||||
|
|
||||||
propTypes: {
|
propTypes: {
|
||||||
|
// Called when the user has logged in. Params:
|
||||||
|
// - object with userId, deviceId, homeserverUrl, identityServerUrl, accessToken
|
||||||
|
// - The user's password, if available and applicable (may be cached in memory
|
||||||
|
// for a short time so the user is not required to re-enter their password
|
||||||
|
// for operations like uploading cross-signing keys).
|
||||||
onLoggedIn: PropTypes.func.isRequired,
|
onLoggedIn: PropTypes.func.isRequired,
|
||||||
|
|
||||||
clientSecret: PropTypes.string,
|
clientSecret: PropTypes.string,
|
||||||
sessionId: PropTypes.string,
|
sessionId: PropTypes.string,
|
||||||
makeRegistrationUrl: PropTypes.func.isRequired,
|
makeRegistrationUrl: PropTypes.func.isRequired,
|
||||||
|
@ -348,7 +354,7 @@ export default createReactClass({
|
||||||
homeserverUrl: this.state.matrixClient.getHomeserverUrl(),
|
homeserverUrl: this.state.matrixClient.getHomeserverUrl(),
|
||||||
identityServerUrl: this.state.matrixClient.getIdentityServerUrl(),
|
identityServerUrl: this.state.matrixClient.getIdentityServerUrl(),
|
||||||
accessToken: response.access_token,
|
accessToken: response.access_token,
|
||||||
});
|
}, this.state.formVals.password);
|
||||||
|
|
||||||
this._setupPushers(cli);
|
this._setupPushers(cli);
|
||||||
// we're still busy until we get unmounted: don't show the registration form again
|
// we're still busy until we get unmounted: don't show the registration form again
|
||||||
|
|
|
@ -33,6 +33,10 @@ export default class AuthBody extends React.PureComponent {
|
||||||
const classes = {
|
const classes = {
|
||||||
'mx_AuthBody': true,
|
'mx_AuthBody': true,
|
||||||
'mx_AuthBody_noHeader': !this.props.header,
|
'mx_AuthBody_noHeader': !this.props.header,
|
||||||
|
// XXX The login pages all use a smaller fonts size but we don't want this
|
||||||
|
// for subsequent auth screens like the e2e setup. Doing this a terrible way
|
||||||
|
// for now.
|
||||||
|
'mx_AuthBody_loginRegister': this.props.header,
|
||||||
};
|
};
|
||||||
|
|
||||||
return <div className={classnames(classes)}>
|
return <div className={classnames(classes)}>
|
||||||
|
|
|
@ -641,7 +641,7 @@ const AuthEntryComponents = [
|
||||||
TermsAuthEntry,
|
TermsAuthEntry,
|
||||||
];
|
];
|
||||||
|
|
||||||
export function getEntryComponentForLoginType(loginType) {
|
export default function getEntryComponentForLoginType(loginType) {
|
||||||
for (const c of AuthEntryComponents) {
|
for (const c of AuthEntryComponents) {
|
||||||
if (c.LOGIN_TYPE == loginType) {
|
if (c.LOGIN_TYPE == loginType) {
|
||||||
return c;
|
return c;
|
||||||
|
|
|
@ -27,7 +27,7 @@ import {MatrixClientPeg} from '../../../MatrixClientPeg';
|
||||||
import {MenuItem} from "../../structures/ContextMenu";
|
import {MenuItem} from "../../structures/ContextMenu";
|
||||||
import * as sdk from "../../../index";
|
import * as sdk from "../../../index";
|
||||||
|
|
||||||
export class TopLeftMenu extends React.Component {
|
export default class TopLeftMenu extends React.Component {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
displayName: PropTypes.string.isRequired,
|
displayName: PropTypes.string.isRequired,
|
||||||
userId: PropTypes.string.isRequired,
|
userId: PropTypes.string.isRequired,
|
||||||
|
|
|
@ -16,6 +16,7 @@ limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
import * as sdk from '../../../../index';
|
import * as sdk from '../../../../index';
|
||||||
import {MatrixClientPeg} from '../../../../MatrixClientPeg';
|
import {MatrixClientPeg} from '../../../../MatrixClientPeg';
|
||||||
import { MatrixClient } from 'matrix-js-sdk';
|
import { MatrixClient } from 'matrix-js-sdk';
|
||||||
|
@ -32,6 +33,16 @@ const RESTORE_TYPE_SECRET_STORAGE = 2;
|
||||||
* Dialog for restoring e2e keys from a backup and the user's recovery key
|
* Dialog for restoring e2e keys from a backup and the user's recovery key
|
||||||
*/
|
*/
|
||||||
export default class RestoreKeyBackupDialog extends React.PureComponent {
|
export default class RestoreKeyBackupDialog extends React.PureComponent {
|
||||||
|
static propTypes = {
|
||||||
|
// if false, will close the dialog as soon as the restore completes succesfully
|
||||||
|
// default: true
|
||||||
|
showSummary: PropTypes.bool,
|
||||||
|
};
|
||||||
|
|
||||||
|
defaultProps = {
|
||||||
|
showSummary: true,
|
||||||
|
};
|
||||||
|
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
this.state = {
|
this.state = {
|
||||||
|
@ -96,6 +107,10 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
|
||||||
const recoverInfo = await MatrixClientPeg.get().restoreKeyBackupWithPassword(
|
const recoverInfo = await MatrixClientPeg.get().restoreKeyBackupWithPassword(
|
||||||
this.state.passPhrase, undefined, undefined, this.state.backupInfo,
|
this.state.passPhrase, undefined, undefined, this.state.backupInfo,
|
||||||
);
|
);
|
||||||
|
if (!this.props.showSummary) {
|
||||||
|
this.props.onFinished(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
this.setState({
|
this.setState({
|
||||||
loading: false,
|
loading: false,
|
||||||
recoverInfo,
|
recoverInfo,
|
||||||
|
@ -119,6 +134,10 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
|
||||||
const recoverInfo = await MatrixClientPeg.get().restoreKeyBackupWithRecoveryKey(
|
const recoverInfo = await MatrixClientPeg.get().restoreKeyBackupWithRecoveryKey(
|
||||||
this.state.recoveryKey, undefined, undefined, this.state.backupInfo,
|
this.state.recoveryKey, undefined, undefined, this.state.backupInfo,
|
||||||
);
|
);
|
||||||
|
if (!this.props.showSummary) {
|
||||||
|
this.props.onFinished(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
this.setState({
|
this.setState({
|
||||||
loading: false,
|
loading: false,
|
||||||
recoverInfo,
|
recoverInfo,
|
||||||
|
@ -253,6 +272,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
|
||||||
title = _t("Error");
|
title = _t("Error");
|
||||||
content = _t("No backup found!");
|
content = _t("No backup found!");
|
||||||
} else if (this.state.recoverInfo) {
|
} else if (this.state.recoverInfo) {
|
||||||
|
const DialogButtons = sdk.getComponent('views.elements.DialogButtons');
|
||||||
title = _t("Backup Restored");
|
title = _t("Backup Restored");
|
||||||
let failedToDecrypt;
|
let failedToDecrypt;
|
||||||
if (this.state.recoverInfo.total > this.state.recoverInfo.imported) {
|
if (this.state.recoverInfo.total > this.state.recoverInfo.imported) {
|
||||||
|
@ -264,6 +284,11 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
|
||||||
content = <div>
|
content = <div>
|
||||||
<p>{_t("Restored %(sessionCount)s session keys", {sessionCount: this.state.recoverInfo.imported})}</p>
|
<p>{_t("Restored %(sessionCount)s session keys", {sessionCount: this.state.recoverInfo.imported})}</p>
|
||||||
{failedToDecrypt}
|
{failedToDecrypt}
|
||||||
|
<DialogButtons primaryButton={_t('OK')}
|
||||||
|
onPrimaryButtonClick={this._onDone}
|
||||||
|
hasCancel={false}
|
||||||
|
focus={true}
|
||||||
|
/>
|
||||||
</div>;
|
</div>;
|
||||||
} else if (backupHasPassphrase && !this.state.forceRecoveryKey) {
|
} else if (backupHasPassphrase && !this.state.forceRecoveryKey) {
|
||||||
const DialogButtons = sdk.getComponent('views.elements.DialogButtons');
|
const DialogButtons = sdk.getComponent('views.elements.DialogButtons');
|
||||||
|
|
|
@ -20,7 +20,7 @@ import PropTypes from 'prop-types';
|
||||||
import * as sdk from '../../../index';
|
import * as sdk from '../../../index';
|
||||||
import { _t } from '../../../languageHandler';
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
import * as recent from './recent';
|
import * as recent from '../../../emojipicker/recent';
|
||||||
import {DATA_BY_CATEGORY, getEmojiFromUnicode} from "../../../emoji";
|
import {DATA_BY_CATEGORY, getEmojiFromUnicode} from "../../../emoji";
|
||||||
|
|
||||||
export const CATEGORY_HEADER_HEIGHT = 22;
|
export const CATEGORY_HEADER_HEIGHT = 22;
|
||||||
|
|
|
@ -363,7 +363,7 @@ export default class RoomBreadcrumbs extends React.Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
let dmIndicator;
|
let dmIndicator;
|
||||||
if (this._isDmRoom(r.room)) {
|
if (this._isDmRoom(r.room) && !SettingsStore.isFeatureEnabled("feature_cross_signing")) {
|
||||||
dmIndicator = <img
|
dmIndicator = <img
|
||||||
src={require("../../../../res/img/icon_person.svg")}
|
src={require("../../../../res/img/icon_person.svg")}
|
||||||
className="mx_RoomBreadcrumbs_dmIndicator"
|
className="mx_RoomBreadcrumbs_dmIndicator"
|
||||||
|
|
|
@ -31,6 +31,7 @@ import ManageIntegsButton from '../elements/ManageIntegsButton';
|
||||||
import {CancelButton} from './SimpleRoomHeader';
|
import {CancelButton} from './SimpleRoomHeader';
|
||||||
import SettingsStore from "../../../settings/SettingsStore";
|
import SettingsStore from "../../../settings/SettingsStore";
|
||||||
import RoomHeaderButtons from '../right_panel/RoomHeaderButtons';
|
import RoomHeaderButtons from '../right_panel/RoomHeaderButtons';
|
||||||
|
import DMRoomMap from '../../../utils/DMRoomMap';
|
||||||
import E2EIcon from './E2EIcon';
|
import E2EIcon from './E2EIcon';
|
||||||
import InviteOnlyIcon from './InviteOnlyIcon';
|
import InviteOnlyIcon from './InviteOnlyIcon';
|
||||||
|
|
||||||
|
@ -161,10 +162,12 @@ export default createReactClass({
|
||||||
<E2EIcon status={this.props.e2eStatus} /> :
|
<E2EIcon status={this.props.e2eStatus} /> :
|
||||||
undefined;
|
undefined;
|
||||||
|
|
||||||
|
const dmUserId = DMRoomMap.shared().getUserIdForRoomId(this.props.room.roomId);
|
||||||
const joinRules = this.props.room && this.props.room.currentState.getStateEvents("m.room.join_rules", "");
|
const joinRules = this.props.room && this.props.room.currentState.getStateEvents("m.room.join_rules", "");
|
||||||
const joinRule = joinRules && joinRules.getContent().join_rule;
|
const joinRule = joinRules && joinRules.getContent().join_rule;
|
||||||
let privateIcon;
|
let privateIcon;
|
||||||
if (SettingsStore.isFeatureEnabled("feature_cross_signing")) {
|
// Don't show an invite-only icon for DMs. Users know they're invite-only.
|
||||||
|
if (!dmUserId && SettingsStore.isFeatureEnabled("feature_cross_signing")) {
|
||||||
if (joinRule == "invite") {
|
if (joinRule == "invite") {
|
||||||
privateIcon = <InviteOnlyIcon />;
|
privateIcon = <InviteOnlyIcon />;
|
||||||
}
|
}
|
||||||
|
|
|
@ -478,8 +478,9 @@ export default createReactClass({
|
||||||
|
|
||||||
let dmIndicator;
|
let dmIndicator;
|
||||||
let dmOnline;
|
let dmOnline;
|
||||||
// If we can place a shield, do that instead
|
/* Post-cross-signing we don't show DM indicators at all, instead relying on user
|
||||||
if (dmUserId && !this.state.e2eStatus) {
|
context to let them know when that is. */
|
||||||
|
if (dmUserId && !SettingsStore.isFeatureEnabled("feature_cross_signing")) {
|
||||||
dmIndicator = <img
|
dmIndicator = <img
|
||||||
src={require("../../../../res/img/icon_person.svg")}
|
src={require("../../../../res/img/icon_person.svg")}
|
||||||
className="mx_RoomTile_dm"
|
className="mx_RoomTile_dm"
|
||||||
|
|
|
@ -32,7 +32,7 @@ export default class VerifySessionToast extends React.PureComponent {
|
||||||
DeviceListener.sharedInstance().dismissVerification(this.props.deviceId);
|
DeviceListener.sharedInstance().dismissVerification(this.props.deviceId);
|
||||||
};
|
};
|
||||||
|
|
||||||
_onVerifyClick = async () => {
|
_onReviewClick = async () => {
|
||||||
const cli = MatrixClientPeg.get();
|
const cli = MatrixClientPeg.get();
|
||||||
const DeviceVerifyDialog = sdk.getComponent('views.dialogs.DeviceVerifyDialog');
|
const DeviceVerifyDialog = sdk.getComponent('views.dialogs.DeviceVerifyDialog');
|
||||||
|
|
||||||
|
@ -47,10 +47,10 @@ export default class VerifySessionToast extends React.PureComponent {
|
||||||
render() {
|
render() {
|
||||||
const FormButton = sdk.getComponent("elements.FormButton");
|
const FormButton = sdk.getComponent("elements.FormButton");
|
||||||
return (<div>
|
return (<div>
|
||||||
<div className="mx_Toast_description">{_t("Other users may not trust it")}</div>
|
<div className="mx_Toast_description">{_t("Review & verify your new session")}</div>
|
||||||
<div className="mx_Toast_buttons" aria-live="off">
|
<div className="mx_Toast_buttons" aria-live="off">
|
||||||
<FormButton label={_t("Later")} kind="danger" onClick={this._onLaterClick} />
|
<FormButton label={_t("Later")} kind="danger" onClick={this._onLaterClick} />
|
||||||
<FormButton label={_t("Verify")} onClick={this._onVerifyClick} />
|
<FormButton label={_t("Review")} onClick={this._onReviewClick} />
|
||||||
</div>
|
</div>
|
||||||
</div>);
|
</div>);
|
||||||
}
|
}
|
||||||
|
|
68
src/components/views/toasts/SetupEncryptionToast.js
Normal file
68
src/components/views/toasts/SetupEncryptionToast.js
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
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 * as sdk from "../../../index";
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
import DeviceListener from '../../../DeviceListener';
|
||||||
|
import { accessSecretStorage } from '../../../CrossSigningManager';
|
||||||
|
|
||||||
|
export default class SetupEncryptionToast extends React.PureComponent {
|
||||||
|
static propTypes = {
|
||||||
|
toastKey: PropTypes.string.isRequired,
|
||||||
|
kind: PropTypes.oneOf(['set_up_encryption', 'verify_this_session', 'upgrade_encryption']).isRequired,
|
||||||
|
};
|
||||||
|
|
||||||
|
_onLaterClick = () => {
|
||||||
|
DeviceListener.sharedInstance().dismissEncryptionSetup();
|
||||||
|
};
|
||||||
|
|
||||||
|
_onSetupClick = async () => {
|
||||||
|
accessSecretStorage();
|
||||||
|
};
|
||||||
|
|
||||||
|
getDescription() {
|
||||||
|
switch (this.props.kind) {
|
||||||
|
case 'set_up_encryption':
|
||||||
|
case 'upgrade_encryption':
|
||||||
|
return _t('Verify your other devices easier');
|
||||||
|
case 'verify_this_session':
|
||||||
|
return _t('Other users may not trust it');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getSetupCaption() {
|
||||||
|
switch (this.props.kind) {
|
||||||
|
case 'set_up_encryption':
|
||||||
|
case 'upgrade_encryption':
|
||||||
|
return _t('Upgrade');
|
||||||
|
case 'verify_this_session':
|
||||||
|
return _t('Verify');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const FormButton = sdk.getComponent("elements.FormButton");
|
||||||
|
return (<div>
|
||||||
|
<div className="mx_Toast_description">{this.getDescription()}</div>
|
||||||
|
<div className="mx_Toast_buttons" aria-live="off">
|
||||||
|
<FormButton label={_t("Later")} kind="danger" onClick={this._onLaterClick} />
|
||||||
|
<FormButton label={this.getSetupCaption()} onClick={this._onSetupClick} />
|
||||||
|
</div>
|
||||||
|
</div>);
|
||||||
|
}
|
||||||
|
}
|
|
@ -39,6 +39,13 @@ export default class VerificationRequestToast extends React.PureComponent {
|
||||||
this.setState({counter});
|
this.setState({counter});
|
||||||
}, 1000);
|
}, 1000);
|
||||||
request.on("change", this._checkRequestIsPending);
|
request.on("change", this._checkRequestIsPending);
|
||||||
|
// We should probably have a separate class managing the active verification toasts,
|
||||||
|
// rather than monitoring this in the toast component itself, since we'll get problems
|
||||||
|
// like the toasdt not going away when the verification is cancelled unless it's the
|
||||||
|
// one on the top (ie. the one that's mounted).
|
||||||
|
// As a quick & dirty fix, check the toast is still relevant when it mounts (this prevents
|
||||||
|
// a toast hanging around after logging in if you did a verification as part of login).
|
||||||
|
this._checkRequestIsPending();
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillUnmount() {
|
componentWillUnmount() {
|
||||||
|
|
|
@ -79,13 +79,13 @@ EMOJIBASE.forEach(emoji => {
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Strips variation selectors from a string
|
* Strips variation selectors from the end of given string
|
||||||
* NB. Skin tone modifers are not variation selectors:
|
* NB. Skin tone modifiers are not variation selectors:
|
||||||
* this function does not touch them. (Should it?)
|
* this function does not touch them. (Should it?)
|
||||||
*
|
*
|
||||||
* @param {string} str string to strip
|
* @param {string} str string to strip
|
||||||
* @returns {string} stripped string
|
* @returns {string} stripped string
|
||||||
*/
|
*/
|
||||||
function stripVariation(str) {
|
function stripVariation(str) {
|
||||||
return str.replace(/[\uFE00-\uFE0F]/, "");
|
return str.replace(/[\uFE00-\uFE0F]$/, "");
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,6 +88,9 @@
|
||||||
"%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(time)s",
|
"%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(time)s",
|
||||||
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s",
|
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s",
|
||||||
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s",
|
"%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s",
|
||||||
|
"Verify this session": "Verify this session",
|
||||||
|
"Encryption upgrade available": "Encryption upgrade available",
|
||||||
|
"Set up encryption": "Set up encryption",
|
||||||
"New Session": "New Session",
|
"New Session": "New Session",
|
||||||
"Who would you like to add to this community?": "Who would you like to add to this community?",
|
"Who would you like to add to this community?": "Who would you like to add to this community?",
|
||||||
"Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID",
|
"Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID",
|
||||||
|
@ -256,7 +259,8 @@
|
||||||
"%(senderName)s made future room history visible to all room members.": "%(senderName)s made future room history visible to all room members.",
|
"%(senderName)s made future room history visible to all room members.": "%(senderName)s made future room history visible to all room members.",
|
||||||
"%(senderName)s made future room history visible to anyone.": "%(senderName)s made future room history visible to anyone.",
|
"%(senderName)s made future room history visible to anyone.": "%(senderName)s made future room history visible to anyone.",
|
||||||
"%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s made future room history visible to unknown (%(visibility)s).",
|
"%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s made future room history visible to unknown (%(visibility)s).",
|
||||||
"%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).",
|
"%(senderName)s turned on end-to-end encryption.": "%(senderName)s turned on end-to-end encryption.",
|
||||||
|
"%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).",
|
||||||
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s",
|
"%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s",
|
||||||
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s changed the power level of %(powerLevelDiffText)s.",
|
"%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s changed the power level of %(powerLevelDiffText)s.",
|
||||||
"%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.",
|
"%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.",
|
||||||
|
@ -511,8 +515,12 @@
|
||||||
"Headphones": "Headphones",
|
"Headphones": "Headphones",
|
||||||
"Folder": "Folder",
|
"Folder": "Folder",
|
||||||
"Pin": "Pin",
|
"Pin": "Pin",
|
||||||
"Other users may not trust it": "Other users may not trust it",
|
"Review & verify your new session": "Review & verify your new session",
|
||||||
"Later": "Later",
|
"Later": "Later",
|
||||||
|
"Review": "Review",
|
||||||
|
"Verify your other devices easier": "Verify your other devices easier",
|
||||||
|
"Other users may not trust it": "Other users may not trust it",
|
||||||
|
"Upgrade": "Upgrade",
|
||||||
"Verify": "Verify",
|
"Verify": "Verify",
|
||||||
"Decline (%(counter)s)": "Decline (%(counter)s)",
|
"Decline (%(counter)s)": "Decline (%(counter)s)",
|
||||||
"Accept <policyLink /> to continue:": "Accept <policyLink /> to continue:",
|
"Accept <policyLink /> to continue:": "Accept <policyLink /> to continue:",
|
||||||
|
@ -1524,7 +1532,6 @@
|
||||||
"Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.": "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.",
|
"Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.": "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.",
|
||||||
"This usually only affects how the room is processed on the server. If you're having problems with your Riot, please <a>report a bug</a>.": "This usually only affects how the room is processed on the server. If you're having problems with your Riot, please <a>report a bug</a>.",
|
"This usually only affects how the room is processed on the server. If you're having problems with your Riot, please <a>report a bug</a>.": "This usually only affects how the room is processed on the server. If you're having problems with your Riot, please <a>report a bug</a>.",
|
||||||
"You'll upgrade this room from <oldVersion /> to <newVersion />.": "You'll upgrade this room from <oldVersion /> to <newVersion />.",
|
"You'll upgrade this room from <oldVersion /> to <newVersion />.": "You'll upgrade this room from <oldVersion /> to <newVersion />.",
|
||||||
"Upgrade": "Upgrade",
|
|
||||||
"Sign out and remove encryption keys?": "Sign out and remove encryption keys?",
|
"Sign out and remove encryption keys?": "Sign out and remove encryption keys?",
|
||||||
"Clear Storage and Sign Out": "Clear Storage and Sign Out",
|
"Clear Storage and Sign Out": "Clear Storage and Sign Out",
|
||||||
"Send Logs": "Send Logs",
|
"Send Logs": "Send Logs",
|
||||||
|
@ -2018,7 +2025,6 @@
|
||||||
"Set up secret storage": "Set up secret storage",
|
"Set up secret storage": "Set up secret storage",
|
||||||
"Restore your Key Backup": "Restore your Key Backup",
|
"Restore your Key Backup": "Restore your Key Backup",
|
||||||
"Upgrade your encryption": "Upgrade your encryption",
|
"Upgrade your encryption": "Upgrade your encryption",
|
||||||
"Set up encryption": "Set up encryption",
|
|
||||||
"Recovery key": "Recovery key",
|
"Recovery key": "Recovery key",
|
||||||
"Keep it safe": "Keep it safe",
|
"Keep it safe": "Keep it safe",
|
||||||
"Storing secrets...": "Storing secrets...",
|
"Storing secrets...": "Storing secrets...",
|
||||||
|
|
|
@ -1851,7 +1851,7 @@
|
||||||
"Error unsubscribing from list": "Eraris malabono de la listo",
|
"Error unsubscribing from list": "Eraris malabono de la listo",
|
||||||
"Please try again or view your console for hints.": "Bonvolu reprovi aŭ serĉi helpilojn en via konzolo.",
|
"Please try again or view your console for hints.": "Bonvolu reprovi aŭ serĉi helpilojn en via konzolo.",
|
||||||
"You have not ignored anyone.": "Vi neniun malatentis.",
|
"You have not ignored anyone.": "Vi neniun malatentis.",
|
||||||
"You are not subscribed to any lists": "Vi neniun liston abonis.",
|
"You are not subscribed to any lists": "Vi neniun liston abonis",
|
||||||
"Unsubscribe": "Malaboni",
|
"Unsubscribe": "Malaboni",
|
||||||
"View rules": "Montri regulojn",
|
"View rules": "Montri regulojn",
|
||||||
"You are currently subscribed to:": "Vi nun abonas:",
|
"You are currently subscribed to:": "Vi nun abonas:",
|
||||||
|
@ -1867,5 +1867,28 @@
|
||||||
"Widget ID": "Identigilo de fenestraĵo",
|
"Widget ID": "Identigilo de fenestraĵo",
|
||||||
"Widgets do not use message encryption.": "Fenestraĵoj ne uzas ĉifradon de mesaĝoj.",
|
"Widgets do not use message encryption.": "Fenestraĵoj ne uzas ĉifradon de mesaĝoj.",
|
||||||
"Widget added by": "Fenestraĵon aldonis",
|
"Widget added by": "Fenestraĵon aldonis",
|
||||||
"This widget may use cookies.": "Ĉi tiu fenestraĵo povas uzi kuketojn."
|
"This widget may use cookies.": "Ĉi tiu fenestraĵo povas uzi kuketojn.",
|
||||||
|
"%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s aldonis %(addedAddresses)s kaj %(count)s aliajn adresojn al ĉi tiu ĉambro",
|
||||||
|
"%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s forigis %(removedAddresses)s kaj %(count)s aliajn adresojn el ĉi tiu ĉambro",
|
||||||
|
"%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s forigis %(countRemoved)s kaj aldonis %(countAdded)s adresojn al ĉi tiu ĉambro",
|
||||||
|
"%(senderName)s turned on end-to-end encryption.": "%(senderName)s ŝaltis tutvojan ĉifradon.",
|
||||||
|
"%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s ŝaltis tutvojan ĉifradon (nerekonita algoritmo %(algorithm)s).",
|
||||||
|
"a few seconds ago": "antaŭ kelkaj sekundoj",
|
||||||
|
"about a minute ago": "antaŭ ĉirkaŭ minuto",
|
||||||
|
"%(num)s minutes ago": "antaŭ %(num)s minutoj",
|
||||||
|
"about an hour ago": "antaŭ ĉirkaŭ horo",
|
||||||
|
"%(num)s hours ago": "antaŭ %(num)s horoj",
|
||||||
|
"about a day ago": "antaŭ ĉirkaŭ tago",
|
||||||
|
"%(num)s days ago": "antaŭ %(num)s tagoj",
|
||||||
|
"a few seconds from now": "kelkajn sekundojn de nun",
|
||||||
|
"about a minute from now": "ĉirkaŭ minuton de nun",
|
||||||
|
"%(num)s minutes from now": "%(num)s minutojn de nun",
|
||||||
|
"about an hour from now": "ĉirkaŭ horon de nun",
|
||||||
|
"%(num)s hours from now": "%(num)s horojn de nun",
|
||||||
|
"about a day from now": "ĉirkaŭ tagon de nun",
|
||||||
|
"%(num)s days from now": "%(num)s tagojn de nun",
|
||||||
|
"Lock": "Seruro",
|
||||||
|
"Other users may not trust it": "Aliaj uzantoj eble ne kredas ĝin",
|
||||||
|
"Later": "Pli poste",
|
||||||
|
"Verify": "Kontroli"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1617,7 +1617,7 @@
|
||||||
"Resend edit": "Birbidali edizioa",
|
"Resend edit": "Birbidali edizioa",
|
||||||
"Resend %(unsentCount)s reaction(s)": "Birbidali %(unsentCount)s erreakzio",
|
"Resend %(unsentCount)s reaction(s)": "Birbidali %(unsentCount)s erreakzio",
|
||||||
"Resend removal": "Birbidali kentzeko agindua",
|
"Resend removal": "Birbidali kentzeko agindua",
|
||||||
"Forgotten your password?": "Pasahitza ahaztu duzu?",
|
"Forgotten your password?": "Pasahitza ahaztuta?",
|
||||||
"Sign in and regain access to your account.": "Hasi saioa eta berreskuratu zure kontua.",
|
"Sign in and regain access to your account.": "Hasi saioa eta berreskuratu zure kontua.",
|
||||||
"You're signed out": "Saioa amaitu duzu",
|
"You're signed out": "Saioa amaitu duzu",
|
||||||
"Clear personal data": "Garbitu datu pertsonalak",
|
"Clear personal data": "Garbitu datu pertsonalak",
|
||||||
|
@ -2074,5 +2074,41 @@
|
||||||
"Done": "Egina",
|
"Done": "Egina",
|
||||||
"Without completing security on this device, it won’t have access to encrypted messages.": "Gailu honetan segurtasuna osatu ezean, ez du zifratutako mezuetara sarbiderik izango.",
|
"Without completing security on this device, it won’t have access to encrypted messages.": "Gailu honetan segurtasuna osatu ezean, ez du zifratutako mezuetara sarbiderik izango.",
|
||||||
"Go Back": "Joan atzera",
|
"Go Back": "Joan atzera",
|
||||||
"Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup.": "Biltegi sekretua oraingo gakoen babeskopiaren xehetasunak erabiliz ezarriko da. Zure biltegi sekretuaren pasa-esaldia eta berreskuratze gakoa zure gakoen babes-kopiarako zenerabiltzanak izango dira."
|
"Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup.": "Biltegi sekretua oraingo gakoen babeskopiaren xehetasunak erabiliz ezarriko da. Zure biltegi sekretuaren pasa-esaldia eta berreskuratze gakoa zure gakoen babes-kopiarako zenerabiltzanak izango dira.",
|
||||||
|
"%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s erabiltzaileak %(addedAddresses)s helbideak eta beste %(count)s gehitu dizkio gela honi",
|
||||||
|
"%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s erabiltzaileak %(removedAddresses)s helbideak eta beste %(count)s kendu dizkio gela honi",
|
||||||
|
"%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s erabiltzaileak %(countRemoved)s helbide kendu eta %(countAdded)s gehitu dizkio gela honi",
|
||||||
|
"%(senderName)s turned on end-to-end encryption.": "%(senderName)s erabiltzaileak muturretik muturrera zifratzea aktibatu du.",
|
||||||
|
"%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s erabiltzaileak muturretik muturrera zifratzea gaitu du (%(algorithm)s algoritmo ezezaguna).",
|
||||||
|
"Someone is using an unknown device": "Baten bat gailu ezezagun bat erabiltzen ari da",
|
||||||
|
"This room is end-to-end encrypted": "Gela hau muturretik muturrera zifratuta dago",
|
||||||
|
"Everyone in this room is verified": "Gelako guztiak egiaztatuta daude",
|
||||||
|
"Encrypted by a deleted device": "Ezabatutako gailu batek zifratua",
|
||||||
|
"Invite only": "Gonbidapenez besterik ez",
|
||||||
|
"Send a reply…": "Bidali erantzuna…",
|
||||||
|
"Send a message…": "Bidali mezua…",
|
||||||
|
"Reject & Ignore user": "Ukatu eta ezikusi erabiltzailea",
|
||||||
|
"Unknown Command": "Agindu ezezaguna",
|
||||||
|
"Unrecognised command: %(commandText)s": "Agindu ezezaguna: %(commandText)s",
|
||||||
|
"You can use <code>/help</code> to list available commands. Did you mean to send this as a message?": "<code>/help</code> erabili dezakezu agindu erabilgarrien zerrenda ikusteko. Ala mezu gisa bidali nahi zenuen hau?",
|
||||||
|
"Hint: Begin your message with <code>//</code> to start it with a slash.": "Aholkua: Hasi zure mezua <code>//</code> idatziz barra batekin hasi nahi baduzu.",
|
||||||
|
"Send as message": "Bidali mezu gisa",
|
||||||
|
"Verify User": "Egiaztatu erabiltzailea",
|
||||||
|
"For extra security, verify this user by checking a one-time code on both of your devices.": "Segurtasun gehiagorako, egiaztatu erabiltzaile hau aldi-bakarrerako kode bat bi gailuetan egiaztatuz.",
|
||||||
|
"For maximum security, do this in person.": "Segurtasun gorenerako, egin hau aurrez aurre.",
|
||||||
|
"Start Verification": "Hasi egiaztaketa",
|
||||||
|
"If you can't find someone, ask them for their username, share your username (%(userId)s) or <a>profile link</a>.": "Ez baduzu baten bat aurkitzen, eskatu bere erabiltzaile-izena, partekatu zurea (%(userId)s) edo partekatu <a>profilaren esteka</a>.",
|
||||||
|
"Enter your account password to confirm the upgrade:": "Sartu zure kontuaren pasa-hitza eguneraketa baieztatzeko:",
|
||||||
|
"You'll need to authenticate with the server to confirm the upgrade.": "Zerbitzariarekin autentifikatu beharko duzu eguneraketa baieztatzeko.",
|
||||||
|
"Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Eguneratu gailu hau honek beste gailuak egiaztatu ahal izateko, horrela zifratutako mezuetara sarbidea emanez eta beste erabiltzaileentzat fidagarri gisa markatzeko.",
|
||||||
|
"Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Ezarri zifratzea gailu honetan honek beste gailuak egiaztatu ahal izateko, horrela zifratutako mezuetara sarbidea emanez eta beste erabiltzaileentzat fidagarri gisa markatzeko.",
|
||||||
|
"Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Babestu zure zifratze gakoak pasa-esaldi batekin. Segurtasun gorenerako hau eta zure kontuaren pasahitza desberdinak izan beharko lukete:",
|
||||||
|
"Enter a passphrase": "Sartu pasa-esaldia",
|
||||||
|
"Enter your passphrase a second time to confirm it.": "Sartu zure pasa-esaldia berriro hau baieztatzeko.",
|
||||||
|
"This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Gailu honek beste gailuak egiaztatu ditzake, horrela zifratutako mezuetara sarbidea emanez eta beste erabiltzaileentzat fidagarri gisa markatuz.",
|
||||||
|
"Verify other users in their profile.": "Egiaztatu beste erabiltzaileak bere profiletan.",
|
||||||
|
"Upgrade your encryption": "Eguneratu zure zifratzea",
|
||||||
|
"Set up encryption": "Ezarri zifratzea",
|
||||||
|
"Encryption upgraded": "Zifratzea eguneratuta",
|
||||||
|
"Encryption setup complete": "Zifratzearen ezarpena egina"
|
||||||
}
|
}
|
||||||
|
|
|
@ -2075,5 +2075,41 @@
|
||||||
"Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup.": "Le coffre secret sera configuré en utilisant les détails existants de votre sauvegarde de clés. Votre phrase de passe et votre clé de récupération seront les mêmes que celles de votre sauvegarde de clés.",
|
"Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup.": "Le coffre secret sera configuré en utilisant les détails existants de votre sauvegarde de clés. Votre phrase de passe et votre clé de récupération seront les mêmes que celles de votre sauvegarde de clés.",
|
||||||
"New Session": "Nouvelle session",
|
"New Session": "Nouvelle session",
|
||||||
"Other users may not trust it": "D’autres utilisateurs pourraient ne pas lui faire confiance",
|
"Other users may not trust it": "D’autres utilisateurs pourraient ne pas lui faire confiance",
|
||||||
"Later": "Plus tard"
|
"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 maximum security, do this in person.": "Pour une sécurité maximale, faites-le en personne.",
|
||||||
|
"Start Verification": "Commencer la vérification",
|
||||||
|
"Encrypted by a deleted device": "Chiffré par un appareil supprimé",
|
||||||
|
"Unknown Command": "Commande inconnue",
|
||||||
|
"Unrecognised command: %(commandText)s": "Commande non reconnue : %(commandText)s",
|
||||||
|
"You can use <code>/help</code> to list available commands. Did you mean to send this as a message?": "Vous pouvez utiliser <code>/help</code> pour obtenir la liste des commandes disponibles. Vouliez-vous envoyer un message ?",
|
||||||
|
"Hint: Begin your message with <code>//</code> to start it with a slash.": "Astuce : Votre message doit démarrer par <code>//</code> pour commencer par une barre oblique.",
|
||||||
|
"Send as message": "Envoyer comme message",
|
||||||
|
"%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s a ajouté %(addedAddresses)s et %(count)s autres adresses à ce salon",
|
||||||
|
"%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s a supprimé %(removedAddresses)s et %(count)s autres adresses de ce salon",
|
||||||
|
"%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s a supprimé %(countRemoved)s et ajouté %(countAdded)s adresses à ce salon",
|
||||||
|
"Reject & Ignore user": "Rejeter et ignorer l’utilisateur",
|
||||||
|
"Enter your account password to confirm the upgrade:": "Saisissez le mot de passe de votre compte pour confirmer la mise à niveau :",
|
||||||
|
"You'll need to authenticate with the server to confirm the upgrade.": "Vous devrez vous identifier avec le serveur pour confirmer la mise à niveau.",
|
||||||
|
"Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Mettez à niveau cet appareil pour lui permettre de vérifier d’autres appareils, qui pourront alors accéder aux messages chiffrés et seront vus comme fiables par les autres utilisateurs.",
|
||||||
|
"Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Configurez le chiffrement sur cet appareil pour lui permettre de vérifier d’autres appareils, qui pourront alors accéder aux messages chiffrés et seront vus comme fiables par les autres utilisateurs.",
|
||||||
|
"Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Sécurisez vos clés de chiffrement avec une phrase de passe. Pour une sécurité maximale, elle devrait être différente du mot de passe de votre compte :",
|
||||||
|
"Enter a passphrase": "Saisissez une phrase de passe",
|
||||||
|
"Enter your passphrase a second time to confirm it.": "Saisissez votre phrase de passe une seconde fois pour la confirmer.",
|
||||||
|
"This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Cet appareil peut à présent vérifier d’autres appareils, qui pourront alors accéder aux messages chiffrés et seront vus comme fiables par les autres utilisateurs.",
|
||||||
|
"Verify other users in their profile.": "Vérifiez d’autres utilisateurs dans leur profil.",
|
||||||
|
"Upgrade your encryption": "Mettre à niveau votre chiffrement",
|
||||||
|
"Set up encryption": "Configurer le chiffrement",
|
||||||
|
"Encryption upgraded": "Chiffrement mis à niveau",
|
||||||
|
"Encryption setup complete": "Configuration du chiffrement terminé",
|
||||||
|
"%(senderName)s turned on end-to-end encryption.": "%(senderName)s a activé le chiffrement de bout en bout.",
|
||||||
|
"%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s a activé le chiffrement de bout en bout (algorithme %(algorithm)s non reconnu).",
|
||||||
|
"Someone is using an unknown device": "Quelqu'un utilise un appareil inconnu",
|
||||||
|
"This room is end-to-end encrypted": "Ce salon est chiffré de bout en bout",
|
||||||
|
"Everyone in this room is verified": "Tout le monde dans ce salon est vérifié",
|
||||||
|
"Invite only": "Uniquement sur invitation",
|
||||||
|
"Send a reply…": "Envoyer une réponse…",
|
||||||
|
"Send a message…": "Envoyer un message…",
|
||||||
|
"If you can't find someone, ask them for their username, share your username (%(userId)s) or <a>profile link</a>.": "Si vous n’arrivez pas à trouver quelqu’un, demandez-lui son nom d’utilisateur, partagez votre nom d’utilisateur (%(userId)s) ou votre <a>lien de profil</a>."
|
||||||
}
|
}
|
||||||
|
|
|
@ -138,7 +138,7 @@
|
||||||
"Failed to toggle moderator status": "Moderátor státuszt nem sikerült átállítani",
|
"Failed to toggle moderator status": "Moderátor státuszt nem sikerült átállítani",
|
||||||
"Failed to unban": "Kizárás visszavonása sikertelen",
|
"Failed to unban": "Kizárás visszavonása sikertelen",
|
||||||
"Failed to upload profile picture!": "Profil kép feltöltése sikertelen!",
|
"Failed to upload profile picture!": "Profil kép feltöltése sikertelen!",
|
||||||
"Failed to verify email address: make sure you clicked the link in the email": "E-mail cím ellenőrzése sikertelen: ellenőrizd, hogy az e-mailnél lévő linkre rákattintottál",
|
"Failed to verify email address: make sure you clicked the link in the email": "E-mail cím ellenőrzése sikertelen: ellenőrizd, hogy az e-mailben lévő hivatkozásra kattintottál",
|
||||||
"Failure to create room": "Szoba létrehozása sikertelen",
|
"Failure to create room": "Szoba létrehozása sikertelen",
|
||||||
"Favourites": "Kedvencek",
|
"Favourites": "Kedvencek",
|
||||||
"Fill screen": "Képernyő kitöltése",
|
"Fill screen": "Képernyő kitöltése",
|
||||||
|
@ -355,7 +355,7 @@
|
||||||
"You need to be able to invite users to do that.": "Hogy ezt csinálhasd meg kell tudnod hívni felhasználókat.",
|
"You need to be able to invite users to do that.": "Hogy ezt csinálhasd meg kell tudnod hívni felhasználókat.",
|
||||||
"You need to be logged in.": "Be kell jelentkezz.",
|
"You need to be logged in.": "Be kell jelentkezz.",
|
||||||
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ez az e-mail cím, úgy néz ki, nincs összekötve a Matrix azonosítóval ezen a Matrix szerveren.",
|
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ez az e-mail cím, úgy néz ki, nincs összekötve a Matrix azonosítóval ezen a Matrix szerveren.",
|
||||||
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "A jelszavadat sikeresen megváltoztattuk. Nem kapsz \"push\" értesítéseket amíg a többi eszközön vissza nem jelentkezel",
|
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "A jelszavadat sikeresen megváltoztattuk. Addig nem fogsz leküldéses értesítéseket kapni, amíg a többi eszközön vissza nem jelentkezel",
|
||||||
"You seem to be in a call, are you sure you want to quit?": "Úgy tűnik hívásban vagy, biztosan kilépsz?",
|
"You seem to be in a call, are you sure you want to quit?": "Úgy tűnik hívásban vagy, biztosan kilépsz?",
|
||||||
"You seem to be uploading files, are you sure you want to quit?": "Úgy tűnik fájlokat töltesz fel, biztosan kilépsz?",
|
"You seem to be uploading files, are you sure you want to quit?": "Úgy tűnik fájlokat töltesz fel, biztosan kilépsz?",
|
||||||
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Nem leszel képes visszavonni ezt a változtatást mivel a felhasználót ugyanarra a szintre emeled amin te vagy.",
|
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Nem leszel képes visszavonni ezt a változtatást mivel a felhasználót ugyanarra a szintre emeled amin te vagy.",
|
||||||
|
@ -451,7 +451,7 @@
|
||||||
"Username available": "Szabad felhasználói név",
|
"Username available": "Szabad felhasználói név",
|
||||||
"Username not available": "A felhasználói név foglalt",
|
"Username not available": "A felhasználói név foglalt",
|
||||||
"Something went wrong!": "Valami tönkrement!",
|
"Something went wrong!": "Valami tönkrement!",
|
||||||
"If you already have a Matrix account you can <a>log in</a> instead.": "Ha már van Matrix fiókod akkor <a>beléphetsz</a> helyette.",
|
"If you already have a Matrix account you can <a>log in</a> instead.": "Ha már van Matrix fiókod, akkor <a>beléphetsz</a> helyette.",
|
||||||
"Your browser does not support the required cryptography extensions": "A böngésződ nem támogatja a szükséges titkosítási kiterjesztést",
|
"Your browser does not support the required cryptography extensions": "A böngésződ nem támogatja a szükséges titkosítási kiterjesztést",
|
||||||
"Not a valid Riot keyfile": "Nem érvényes Riot kulcsfájl",
|
"Not a valid Riot keyfile": "Nem érvényes Riot kulcsfájl",
|
||||||
"Authentication check failed: incorrect password?": "Azonosítás sikertelen: hibás jelszó?",
|
"Authentication check failed: incorrect password?": "Azonosítás sikertelen: hibás jelszó?",
|
||||||
|
@ -929,7 +929,7 @@
|
||||||
"To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "A %(homeserverDomain)s szerver használatának folytatásához el kell olvasnod és el kell fogadnod az általános szerződési feltételeket.",
|
"To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "A %(homeserverDomain)s szerver használatának folytatásához el kell olvasnod és el kell fogadnod az általános szerződési feltételeket.",
|
||||||
"Review terms and conditions": "Általános Szerződési Feltételek elolvasása",
|
"Review terms and conditions": "Általános Szerződési Feltételek elolvasása",
|
||||||
"To continue, please enter your password:": "Folytatáshoz add meg a jelszavad:",
|
"To continue, please enter your password:": "Folytatáshoz add meg a jelszavad:",
|
||||||
"This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. <b>This action is irreversible.</b>": "Ez végleg használhatatlanná teszi a fiókodat. Ezután nem fogsz tudni bejelentkezni, és más sem tud majd ezzel az azonosítóval fiókot létrehozni. Minden szobából amibe beléptél ki fogsz lépni, és törölni fogja minden fiók adatod az \"identity\" szerverről. <b>Ez a művelet visszafordíthatatlan.</b>",
|
"This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. <b>This action is irreversible.</b>": "Ez végleg használhatatlanná teszi a fiókodat. Ezután nem fogsz tudni bejelentkezni, és más sem tud majd ezzel az azonosítóval fiókot létrehozni. Minden szobából amibe beléptél ki fogsz lépni, és törölni fogja minden fiók adatod az személyazonosságod biztosító szerverről. <b>Ez a művelet visszafordíthatatlan.</b>",
|
||||||
"Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "A fiókod felfüggesztése <b>nem jelenti alapértelmezetten azt, hogy az általad küldött üzenetek elfelejtődnek.</b> Ha törölni szeretnéd az általad küldött üzeneteket, pipáld be a jelölőnégyzetet alul.",
|
"Deactivating your account <b>does not by default cause us to forget messages you have sent.</b> If you would like us to forget your messages, please tick the box below.": "A fiókod felfüggesztése <b>nem jelenti alapértelmezetten azt, hogy az általad küldött üzenetek elfelejtődnek.</b> Ha törölni szeretnéd az általad küldött üzeneteket, pipáld be a jelölőnégyzetet alul.",
|
||||||
"Message visibility in Matrix is similar to email. Our forgetting your messages means that messages you have sent will not be shared with any new or unregistered users, but registered users who already have access to these messages will still have access to their copy.": "Az üzenetek láthatósága a Matrix-ban hasonlít az emailhez. Az általad küldött üzenet törlése azt jelenti, hogy nem osztjuk meg új-, vagy vendég felhasználóval de a már regisztrált felhasználók akik már hozzáfértek az üzenethez továbbra is elérik a saját másolatukat.",
|
"Message visibility in Matrix is similar to email. Our forgetting your messages means that messages you have sent will not be shared with any new or unregistered users, but registered users who already have access to these messages will still have access to their copy.": "Az üzenetek láthatósága a Matrix-ban hasonlít az emailhez. Az általad küldött üzenet törlése azt jelenti, hogy nem osztjuk meg új-, vagy vendég felhasználóval de a már regisztrált felhasználók akik már hozzáfértek az üzenethez továbbra is elérik a saját másolatukat.",
|
||||||
"Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Kérlek töröld az összes általam küldött üzenetet amikor a fiókomat felfüggesztem (<b>Figyelem:</b> ez azt eredményezheti, hogy a jövőbeni felhasználók csak részleges beszélgetést látnak majd)",
|
"Please forget all messages I have sent when my account is deactivated (<b>Warning:</b> this will cause future users to see an incomplete view of conversations)": "Kérlek töröld az összes általam küldött üzenetet amikor a fiókomat felfüggesztem (<b>Figyelem:</b> ez azt eredményezheti, hogy a jövőbeni felhasználók csak részleges beszélgetést látnak majd)",
|
||||||
|
@ -981,7 +981,7 @@
|
||||||
"Please <a>contact your service administrator</a> to get this limit increased.": "A korlát emelése érdekében kérlek <a>vedd fel a kapcsolatot a szolgáltatás adminisztrátorával</a>.",
|
"Please <a>contact your service administrator</a> to get this limit increased.": "A korlát emelése érdekében kérlek <a>vedd fel a kapcsolatot a szolgáltatás adminisztrátorával</a>.",
|
||||||
"This homeserver has hit its Monthly Active User limit so <b>some users will not be able to log in</b>.": "Ez a Matrix szerver elérte a havi aktív felhasználói korlátját <b>néhány felhasználó nem fog tudni bejelentkezni</b>.",
|
"This homeserver has hit its Monthly Active User limit so <b>some users will not be able to log in</b>.": "Ez a Matrix szerver elérte a havi aktív felhasználói korlátját <b>néhány felhasználó nem fog tudni bejelentkezni</b>.",
|
||||||
"This homeserver has exceeded one of its resource limits so <b>some users will not be able to log in</b>.": "Ez a Matrix szerver túllépte valamelyik erőforrás korlátját így <b>néhány felhasználó nem tud majd bejelentkezni</b>.",
|
"This homeserver has exceeded one of its resource limits so <b>some users will not be able to log in</b>.": "Ez a Matrix szerver túllépte valamelyik erőforrás korlátját így <b>néhány felhasználó nem tud majd bejelentkezni</b>.",
|
||||||
"Upgrade Room Version": "Szoba verziójának frissítése",
|
"Upgrade Room Version": "Szoba verziójának fejlesztése",
|
||||||
"Create a new room with the same name, description and avatar": "Készíts egy új szobát ugyanazzal a névvel, leírással és profilképpel",
|
"Create a new room with the same name, description and avatar": "Készíts egy új szobát ugyanazzal a névvel, leírással és profilképpel",
|
||||||
"Update any local room aliases to point to the new room": "Állíts át minden helyi alternatív nevet erre a szobára",
|
"Update any local room aliases to point to the new room": "Állíts át minden helyi alternatív nevet erre a szobára",
|
||||||
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "A felhasználóknak tiltsd meg, hogy a régi szobában beszélgessenek. Küldj egy üzenetet amiben megkéred a felhasználókat, hogy menjenek át az új szobába",
|
"Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "A felhasználóknak tiltsd meg, hogy a régi szobában beszélgessenek. Küldj egy üzenetet amiben megkéred a felhasználókat, hogy menjenek át az új szobába",
|
||||||
|
@ -996,9 +996,9 @@
|
||||||
"The conversation continues here.": "A beszélgetés itt folytatódik.",
|
"The conversation continues here.": "A beszélgetés itt folytatódik.",
|
||||||
"This room is a continuation of another conversation.": "Ebben a szobában folytatódik egy másik beszélgetés.",
|
"This room is a continuation of another conversation.": "Ebben a szobában folytatódik egy másik beszélgetés.",
|
||||||
"Click here to see older messages.": "Ide kattintva megnézheted a régi üzeneteket.",
|
"Click here to see older messages.": "Ide kattintva megnézheted a régi üzeneteket.",
|
||||||
"Failed to upgrade room": "A szoba frissítése sikertelen",
|
"Failed to upgrade room": "A szoba fejlesztése sikertelen",
|
||||||
"The room upgrade could not be completed": "A szoba frissítését nem sikerült befejezni",
|
"The room upgrade could not be completed": "A szoba fejlesztését nem sikerült befejezni",
|
||||||
"Upgrade this room to version %(version)s": "A szoba frissítése %(version)s verzióra",
|
"Upgrade this room to version %(version)s": "A szoba fejlesztése %(version)s verzióra",
|
||||||
"Forces the current outbound group session in an encrypted room to be discarded": "A jelenlegi csoport munkamenet törlését kikényszeríti a titkosított szobában",
|
"Forces the current outbound group session in an encrypted room to be discarded": "A jelenlegi csoport munkamenet törlését kikényszeríti a titkosított szobában",
|
||||||
"Registration Required": "Regisztrációt igényel",
|
"Registration Required": "Regisztrációt igényel",
|
||||||
"You need to register to do this. Would you like to register now?": "Hogy ezt megtedd regisztrálnod kell. Szeretnél regisztrálni?",
|
"You need to register to do this. Would you like to register now?": "Hogy ezt megtedd regisztrálnod kell. Szeretnél regisztrálni?",
|
||||||
|
@ -1053,7 +1053,7 @@
|
||||||
"<b>Print it</b> and store it somewhere safe": "<b>Nyomtad ki</b> és tárold biztonságos helyen",
|
"<b>Print it</b> and store it somewhere safe": "<b>Nyomtad ki</b> és tárold biztonságos helyen",
|
||||||
"<b>Save it</b> on a USB key or backup drive": "<b>Mentsd el</b> egy Pendrive-ra vagy a biztonsági mentésekhez",
|
"<b>Save it</b> on a USB key or backup drive": "<b>Mentsd el</b> egy Pendrive-ra vagy a biztonsági mentésekhez",
|
||||||
"<b>Copy it</b> to your personal cloud storage": "<b>Másold fel</b> a személyes felhődbe",
|
"<b>Copy it</b> to your personal cloud storage": "<b>Másold fel</b> a személyes felhődbe",
|
||||||
"Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "A Biztonságos Üzenet Visszaállítás beállítása nélkül ha kijelentkezel vagy másik eszközt használsz, akkor nem tudod visszaállítani a régi titkosított üzeneteidet.",
|
"Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another device.": "A Biztonságos üzenet-visszaállítás beállítása nélkül ha kijelentkezel vagy másik eszközt használsz, akkor nem tudod visszaállítani a régi titkosított üzeneteidet.",
|
||||||
"Set up Secure Message Recovery": "Biztonságos Üzenet Visszaállítás beállítása",
|
"Set up Secure Message Recovery": "Biztonságos Üzenet Visszaállítás beállítása",
|
||||||
"Keep it safe": "Tartsd biztonságban",
|
"Keep it safe": "Tartsd biztonságban",
|
||||||
"Create Key Backup": "Kulcs mentés készítése",
|
"Create Key Backup": "Kulcs mentés készítése",
|
||||||
|
@ -1140,9 +1140,9 @@
|
||||||
"Invite anyway and never warn me again": "Mindenképpen meghív és ne figyelmeztess többet",
|
"Invite anyway and never warn me again": "Mindenképpen meghív és ne figyelmeztess többet",
|
||||||
"Invite anyway": "Mindenképpen meghív",
|
"Invite anyway": "Mindenképpen meghív",
|
||||||
"Whether or not you're logged in (we don't record your username)": "Se akkor ha bejelentkezel se akkor ha nem; mi nem tároljuk a felhasználói nevedet",
|
"Whether or not you're logged in (we don't record your username)": "Se akkor ha bejelentkezel se akkor ha nem; mi nem tároljuk a felhasználói nevedet",
|
||||||
"Upgrades a room to a new version": "Szoba frissítése új verzióra",
|
"Upgrades a room to a new version": "Szoba fejlesztése új verzióra",
|
||||||
"Sets the room name": "Szobanév beállítása",
|
"Sets the room name": "Szobanév beállítása",
|
||||||
"%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s frissítette a szobát.",
|
"%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s fejlesztette a szobát.",
|
||||||
"%(displayName)s is typing …": "%(displayName)s gépel …",
|
"%(displayName)s is typing …": "%(displayName)s gépel …",
|
||||||
"%(names)s and %(count)s others are typing …|other": "%(names)s és %(count)s másik gépelnek …",
|
"%(names)s and %(count)s others are typing …|other": "%(names)s és %(count)s másik gépelnek …",
|
||||||
"%(names)s and %(count)s others are typing …|one": "%(names)s és még valaki gépelnek …",
|
"%(names)s and %(count)s others are typing …|one": "%(names)s és még valaki gépelnek …",
|
||||||
|
@ -1156,7 +1156,7 @@
|
||||||
"Show avatars in user and room mentions": "Profilkép mutatása a felhasználó és szoba említéseknél",
|
"Show avatars in user and room mentions": "Profilkép mutatása a felhasználó és szoba említéseknél",
|
||||||
"Enable big emoji in chat": "Nagy Emojik engedélyezése a csevegésekben",
|
"Enable big emoji in chat": "Nagy Emojik engedélyezése a csevegésekben",
|
||||||
"Send typing notifications": "Gépelés visszajelzés küldése",
|
"Send typing notifications": "Gépelés visszajelzés küldése",
|
||||||
"Enable Community Filter Panel": "Közösségi szűrő panel engedélyezése",
|
"Enable Community Filter Panel": "Közösségi szűrő panel bekapcsolása",
|
||||||
"Messages containing my username": "Üzenetek amik a nevemet tartalmazzák",
|
"Messages containing my username": "Üzenetek amik a nevemet tartalmazzák",
|
||||||
"The other party cancelled the verification.": "A másik fél törölte az ellenőrzést.",
|
"The other party cancelled the verification.": "A másik fél törölte az ellenőrzést.",
|
||||||
"Verified!": "Ellenőrizve!",
|
"Verified!": "Ellenőrizve!",
|
||||||
|
@ -1460,9 +1460,9 @@
|
||||||
"%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s visszavonta %(targetDisplayName)s a szobába való belépéséhez szükséges meghívóját.",
|
"%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s visszavonta %(targetDisplayName)s a szobába való belépéséhez szükséges meghívóját.",
|
||||||
"Enable desktop notifications for this device": "Asztali értesítések engedélyezése ehhez az eszközhöz",
|
"Enable desktop notifications for this device": "Asztali értesítések engedélyezése ehhez az eszközhöz",
|
||||||
"Enable audible notifications for this device": "Hallható értesítések engedélyezése ehhez az eszközhöz",
|
"Enable audible notifications for this device": "Hallható értesítések engedélyezése ehhez az eszközhöz",
|
||||||
"Upgrade this room to the recommended room version": "A szoba frissítése a javasolt verzióra",
|
"Upgrade this room to the recommended room version": "A szoba fejlesztése a javasolt verzióra",
|
||||||
"This room is running room version <roomVersion />, which this homeserver has marked as <i>unstable</i>.": "A szoba verziója: <roomVersion />, amit a Matrix szerver <i>instabilnak</i> tekint.",
|
"This room is running room version <roomVersion />, which this homeserver has marked as <i>unstable</i>.": "A szoba verziója: <roomVersion />, amit a Matrix szerver <i>instabilnak</i> tekint.",
|
||||||
"Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "A szoba frissítése bezárja ezt a szobát és új, frissített verzióval ugyanezen a néven létrehoz egy újat.",
|
"Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "A szoba fejlesztése bezárja ezt a szobát és új, frissített verzióval ugyanezen a néven létrehoz egy újat.",
|
||||||
"Failed to revoke invite": "A meghívó visszavonása sikertelen",
|
"Failed to revoke invite": "A meghívó visszavonása sikertelen",
|
||||||
"Could not revoke the invite. The server may be experiencing a temporary problem or you do not have sufficient permissions to revoke the invite.": "A meghívót nem lehet visszavonni. Vagy a szervernek átmenetileg problémái vannak vagy nincs megfelelő jogosultságod a meghívó visszavonásához.",
|
"Could not revoke the invite. The server may be experiencing a temporary problem or you do not have sufficient permissions to revoke the invite.": "A meghívót nem lehet visszavonni. Vagy a szervernek átmenetileg problémái vannak vagy nincs megfelelő jogosultságod a meghívó visszavonásához.",
|
||||||
"Revoke invite": "Meghívó visszavonása",
|
"Revoke invite": "Meghívó visszavonása",
|
||||||
|
@ -1507,7 +1507,7 @@
|
||||||
"Sends the given message coloured as a rainbow": "A megadott üzenetet szivárvány színben küldi el",
|
"Sends the given message coloured as a rainbow": "A megadott üzenetet szivárvány színben küldi el",
|
||||||
"Sends the given emote coloured as a rainbow": "A megadott hangulatjelet szivárvány színben küldi el",
|
"Sends the given emote coloured as a rainbow": "A megadott hangulatjelet szivárvány színben küldi el",
|
||||||
"The user's homeserver does not support the version of the room.": "A felhasználó matrix szervere nem támogatja a megadott szoba verziót.",
|
"The user's homeserver does not support the version of the room.": "A felhasználó matrix szervere nem támogatja a megadott szoba verziót.",
|
||||||
"When rooms are upgraded": "Ha a szobák frissültek",
|
"When rooms are upgraded": "Ha a szobák fejlesztésre kerülnek",
|
||||||
"This device is <b>not backing up your keys</b>, but you do have an existing backup you can restore from and add to going forward.": "Ez az eszköz <b>nem menti el a kulcsaidat</b>, de létezik mentés amit visszaállíthatsz és folytathatod.",
|
"This device is <b>not backing up your keys</b>, but you do have an existing backup you can restore from and add to going forward.": "Ez az eszköz <b>nem menti el a kulcsaidat</b>, de létezik mentés amit visszaállíthatsz és folytathatod.",
|
||||||
"Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Csatlakozz ezzel az eszközzel a kulcs mentéshez kilépés előtt, hogy ne veszíts el kulcsot ami esetleg csak ezen az eszközön van meg.",
|
"Connect this device to key backup before signing out to avoid losing any keys that may only be on this device.": "Csatlakozz ezzel az eszközzel a kulcs mentéshez kilépés előtt, hogy ne veszíts el kulcsot ami esetleg csak ezen az eszközön van meg.",
|
||||||
"Connect this device to Key Backup": "Csatlakozz ezzel az eszközzel a Kulcs Mentéshez",
|
"Connect this device to Key Backup": "Csatlakozz ezzel az eszközzel a Kulcs Mentéshez",
|
||||||
|
@ -1538,7 +1538,7 @@
|
||||||
"This room doesn't exist. Are you sure you're at the right place?": "Ez a szoba nem létezik. Biztos, hogy jó helyen vagy?",
|
"This room doesn't exist. Are you sure you're at the right place?": "Ez a szoba nem létezik. Biztos, hogy jó helyen vagy?",
|
||||||
"Try again later, or ask a room admin to check if you have access.": "Próbálkozz később vagy kérd meg a szoba adminisztrátorát, hogy nézze meg van-e hozzáférésed.",
|
"Try again later, or ask a room admin to check if you have access.": "Próbálkozz később vagy kérd meg a szoba adminisztrátorát, hogy nézze meg van-e hozzáférésed.",
|
||||||
"%(errcode)s was returned while trying to access the room. If you think you're seeing this message in error, please <issueLink>submit a bug report</issueLink>.": "Amikor a szobát próbáltuk elérni ezt a hibaüzenetet kaptuk: %(errcode)s. Ha úgy gondolod, hogy ez egy hiba légy szíves<issueLink>nyiss egy hibajegyet</issueLink>.",
|
"%(errcode)s was returned while trying to access the room. If you think you're seeing this message in error, please <issueLink>submit a bug report</issueLink>.": "Amikor a szobát próbáltuk elérni ezt a hibaüzenetet kaptuk: %(errcode)s. Ha úgy gondolod, hogy ez egy hiba légy szíves<issueLink>nyiss egy hibajegyet</issueLink>.",
|
||||||
"This room has already been upgraded.": "Ez a szoba már frissült.",
|
"This room has already been upgraded.": "Ez a szoba már fejlesztve van.",
|
||||||
"Rotate Left": "Balra forgat",
|
"Rotate Left": "Balra forgat",
|
||||||
"Rotate Right": "Jobbra forgat",
|
"Rotate Right": "Jobbra forgat",
|
||||||
"View Servers in Room": "Szerverek megjelenítése a szobában",
|
"View Servers in Room": "Szerverek megjelenítése a szobában",
|
||||||
|
@ -1690,7 +1690,7 @@
|
||||||
"If you don't want to use <server /> to discover and be discoverable by existing contacts you know, enter another identity server below.": "Ha felkutatásra és, hogy más ismerősök megtalálhassanak, nem akarod használni ezt a szervert: <server />, akkor adjál meg másik azonosítási szervert alább.",
|
"If you don't want to use <server /> to discover and be discoverable by existing contacts you know, enter another identity server below.": "Ha felkutatásra és, hogy más ismerősök megtalálhassanak, nem akarod használni ezt a szervert: <server />, akkor adjál meg másik azonosítási szervert alább.",
|
||||||
"Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Azonosítási szerver használata nem kötelező. Ha úgy döntesz, hogy az azonosítási szervert nem használod más felhasználók nem találnak rád és másokat sem tudsz e-mail cím vagy telefonszám alapján meghívni.",
|
"Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Azonosítási szerver használata nem kötelező. Ha úgy döntesz, hogy az azonosítási szervert nem használod más felhasználók nem találnak rád és másokat sem tudsz e-mail cím vagy telefonszám alapján meghívni.",
|
||||||
"Do not use an identity server": "Az azonosítási szerver mellőzése",
|
"Do not use an identity server": "Az azonosítási szerver mellőzése",
|
||||||
"Upgrade the room": "Szoba frissítése",
|
"Upgrade the room": "Szoba fejlesztése",
|
||||||
"Set an email for account recovery. Use email or phone to optionally be discoverable by existing contacts.": "E-mail cím beállítása a fiók visszaállításához. E-mail cím vagy telefonszám, hogy ismerősök megtalálhassanak.",
|
"Set an email for account recovery. Use email or phone to optionally be discoverable by existing contacts.": "E-mail cím beállítása a fiók visszaállításához. E-mail cím vagy telefonszám, hogy ismerősök megtalálhassanak.",
|
||||||
"Set an email for account recovery. Use email to optionally be discoverable by existing contacts.": "E-mail cím beállítása a fiók visszaállításához. E-mail cím, hogy ismerősök megtalálhassanak.",
|
"Set an email for account recovery. Use email to optionally be discoverable by existing contacts.": "E-mail cím beállítása a fiók visszaállításához. E-mail cím, hogy ismerősök megtalálhassanak.",
|
||||||
"Enter your custom homeserver URL <a>What does this mean?</a>": "Add meg a matrix szervered URL-jét <a>Mit jelent ez?</a>",
|
"Enter your custom homeserver URL <a>What does this mean?</a>": "Add meg a matrix szervered URL-jét <a>Mit jelent ez?</a>",
|
||||||
|
@ -1930,12 +1930,12 @@
|
||||||
"This message cannot be decrypted": "Ezt az üzenetet nem lehet visszafejteni",
|
"This message cannot be decrypted": "Ezt az üzenetet nem lehet visszafejteni",
|
||||||
"Unencrypted": "Titkosítatlan",
|
"Unencrypted": "Titkosítatlan",
|
||||||
"Automatically invite users": "Felhasználók automatikus meghívása",
|
"Automatically invite users": "Felhasználók automatikus meghívása",
|
||||||
"Upgrade private room": "Privát szoba frissítése",
|
"Upgrade private room": "Privát szoba fejlesztése",
|
||||||
"Upgrade public room": "Nyilvános szoba frissítése",
|
"Upgrade public room": "Nyilvános szoba fejlesztése",
|
||||||
"Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.": "A szoba frissítése nem egyszerű művelet, általában a szoba hibás működése, hiányzó funkció vagy biztonsági sérülékenység esetén javasolt.",
|
"Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.": "A szoba frissítése nem egyszerű művelet, általában a szoba hibás működése, hiányzó funkció vagy biztonsági sérülékenység esetén javasolt.",
|
||||||
"This usually only affects how the room is processed on the server. If you're having problems with your Riot, please <a>report a bug</a>.": "Ez általában a szoba szerver oldali kezelésében jelent változást. Ha a Riotban van problémád, kérlek <a>küldj egy hibajelentést</a>.",
|
"This usually only affects how the room is processed on the server. If you're having problems with your Riot, please <a>report a bug</a>.": "Ez általában a szoba szerver oldali kezelésében jelent változást. Ha a Riotban van problémád, kérlek <a>küldj egy hibajelentést</a>.",
|
||||||
"You'll upgrade this room from <oldVersion /> to <newVersion />.": "<oldVersion /> verzióról <newVersion /> verzióra frissíted a szobát.",
|
"You'll upgrade this room from <oldVersion /> to <newVersion />.": "<oldVersion /> verzióról <newVersion /> verzióra fejleszted a szobát.",
|
||||||
"Upgrade": "Frissítés",
|
"Upgrade": "Fejlesztés",
|
||||||
"Notification settings": "Értesítések beállítása",
|
"Notification settings": "Értesítések beállítása",
|
||||||
"User Status": "Felhasználó állapota",
|
"User Status": "Felhasználó állapota",
|
||||||
"Reactions": "Reakciók",
|
"Reactions": "Reakciók",
|
||||||
|
@ -2076,5 +2076,35 @@
|
||||||
"Something went wrong trying to invite the users.": "Valami nem sikerült a felhasználók meghívásával.",
|
"Something went wrong trying to invite the users.": "Valami nem sikerült a felhasználók meghívásával.",
|
||||||
"We couldn't invite those users. Please check the users you want to invite and try again.": "Ezeket a felhasználókat nem tudtuk meghívni. Ellenőrizd azokat a felhasználókat akiket meg szeretnél hívni és próbáld újra.",
|
"We couldn't invite those users. Please check the users you want to invite and try again.": "Ezeket a felhasználókat nem tudtuk meghívni. Ellenőrizd azokat a felhasználókat akiket meg szeretnél hívni és próbáld újra.",
|
||||||
"Recently Direct Messaged": "Nemrég küldött Közvetlen Üzenetek",
|
"Recently Direct Messaged": "Nemrég küldött Közvetlen Üzenetek",
|
||||||
"If you can't find someone, ask them for their username (e.g. @user:server.com) or <a>share this room</a>.": "Ha nem találsz valakit, akkor kérdezd meg a felhasználói nevét (pl.: @felhasználó:szerver.com) vagy <a>oszd meg ezt a szobát</a>."
|
"If you can't find someone, ask them for their username (e.g. @user:server.com) or <a>share this room</a>.": "Ha nem találsz valakit, akkor kérdezd meg a felhasználói nevét (pl.: @felhasználó:szerver.com) vagy <a>oszd meg ezt a szobát</a>.",
|
||||||
|
"Verify User": "Felhasználó ellenőrzése",
|
||||||
|
"For extra security, verify this user by checking a one-time code on both of your devices.": "A biztonság fokozásáért ellenőrizd ezt a felhasználót egy egyszeri kód egyeztetésével mindkettőtök készülékén.",
|
||||||
|
"For maximum security, do this in person.": "A legnagyobb biztonság érdekében ezt személyesen tedd meg.",
|
||||||
|
"Start Verification": "Ellenőrzés elindítása",
|
||||||
|
"Encrypted by a deleted device": "Egy már törölt eszköz titkosította",
|
||||||
|
"Unknown Command": "Ismeretlen Parancs",
|
||||||
|
"Unrecognised command: %(commandText)s": "Ismeretlen parancs: %(commandText)s",
|
||||||
|
"You can use <code>/help</code> to list available commands. Did you mean to send this as a message?": "Használhatod a <code>/help</code>-et az elérhető parancsok kilistázásához. Ezt üzenetként akartad küldeni?",
|
||||||
|
"Hint: Begin your message with <code>//</code> to start it with a slash.": "Tipp: Ez üzenetedet kezd ezzel: <code>//</code>, ha perjellel szeretnéd kezdeni.",
|
||||||
|
"Send as message": "Üzenet küldése",
|
||||||
|
"%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s szoba címnek, %(count)s másikkal együtt, hozzáadta: %(addedAddresses)s",
|
||||||
|
"%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s %(count)s másikkal együtt törölte a szoba címek közül: %(removedAddresses)s",
|
||||||
|
"%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s %(countRemoved)s darabot törölt és %(countAdded)s darabot hozzáadott a szoba címekhez",
|
||||||
|
"Someone is using an unknown device": "Valaki ismeretlen eszközt használ",
|
||||||
|
"This room is end-to-end encrypted": "Ez a szoba végpontok közötti titkosítást használ",
|
||||||
|
"Everyone in this room is verified": "A szobába mindenki ellenőrizve van",
|
||||||
|
"Invite only": "Csak meghívóval",
|
||||||
|
"Send a reply…": "Válasz küldése…",
|
||||||
|
"Send a message…": "Üzenet küldése…",
|
||||||
|
"Reject & Ignore user": "Felhasználó elutasítása és figyelmen kívül hagyása",
|
||||||
|
"If you can't find someone, ask them for their username, share your username (%(userId)s) or <a>profile link</a>.": "Ha nem találsz valakit, akkor kérdezd meg a felhasználói nevét, áruld el neki a felhasználói nevedet (%(userId)s) vagy a <a>profil hivatkozásodat</a>.",
|
||||||
|
"Enter your account password to confirm the upgrade:": "A fejlesztés megerősítéséhez add meg a fiók jelszavadat:",
|
||||||
|
"You'll need to authenticate with the server to confirm the upgrade.": "Azonosítanod kell magad a szerveren a fejlesztés megerősítéséhez.",
|
||||||
|
"Enter a passphrase": "Jelmondat bevitele",
|
||||||
|
"Enter your passphrase a second time to confirm it.": "Add meg a jelmondatot másodszor is a biztonság kedvéért.",
|
||||||
|
"Verify other users in their profile.": "Más felhasználók ellenőrzése a profiljukban.",
|
||||||
|
"Upgrade your encryption": "Titkosításod fejlesztése",
|
||||||
|
"Set up encryption": "Titkosítás beállítása",
|
||||||
|
"Encryption upgraded": "Titkosítás fejlesztve",
|
||||||
|
"Encryption setup complete": "Titkosítás beállítása kész"
|
||||||
}
|
}
|
||||||
|
|
|
@ -2055,5 +2055,57 @@
|
||||||
"Key Backup is enabled on your account but has not been set up from this session. To set up secret storage, restore your key backup.": "Il Backup Chiavi è attivo sul tuo account ma non è stato impostato da questa sessione. Per impostare un archivio segreto, ripristina il tuo backup chiavi.",
|
"Key Backup is enabled on your account but has not been set up from this session. To set up secret storage, restore your key backup.": "Il Backup Chiavi è attivo sul tuo account ma non è stato impostato da questa sessione. Per impostare un archivio segreto, ripristina il tuo backup chiavi.",
|
||||||
"Restore": "Ripristina",
|
"Restore": "Ripristina",
|
||||||
"Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup": "L'archivio segreto verrà impostato usando i dettagli esistenti del backup chiavi. La password dell'archivio segreto e la chiave di recupero saranno le stesse del backup chiavi",
|
"Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup": "L'archivio segreto verrà impostato usando i dettagli esistenti del backup chiavi. La password dell'archivio segreto e la chiave di recupero saranno le stesse del backup chiavi",
|
||||||
"Restore your Key Backup": "Ripristina il tuo Backup Chiavi"
|
"Restore your Key Backup": "Ripristina il tuo Backup Chiavi",
|
||||||
|
"New Session": "Nuova sessione",
|
||||||
|
"New invite dialog": "Nuova finestra di invito",
|
||||||
|
"Other users may not trust it": "Altri utenti potrebbero non fidarsi",
|
||||||
|
"Later": "Più tardi",
|
||||||
|
"Failed to invite the following users to chat: %(csvUsers)s": "Impossibile invitare i seguenti utenti alla chat: %(csvUsers)s",
|
||||||
|
"We couldn't create your DM. Please check the users you want to invite and try again.": "Impossibile creare il messaggio diretto. Ricontrolla gli utenti che vuoi invitare e riprova.",
|
||||||
|
"Something went wrong trying to invite the users.": "Qualcosa è andato storto provando ad invitare gli utenti.",
|
||||||
|
"We couldn't invite those users. Please check the users you want to invite and try again.": "Impossibile invitare quegli utenti. Ricontrolla gli utenti che vuoi invitare e riprova.",
|
||||||
|
"Recently Direct Messaged": "Contattati direttamente di recente",
|
||||||
|
"If you can't find someone, ask them for their username (e.g. @user:server.com) or <a>share this room</a>.": "Se non riesci a trovare qualcuno, chiedi il nome utente (es. @utente:server.it) o <a>condividi questa stanza</a>.",
|
||||||
|
"Complete security": "Sicurezza completa",
|
||||||
|
"Verify this session to grant it access to encrypted messages.": "Verifica questa sessione per concederle accesso ai messaggi cifrati.",
|
||||||
|
"Start": "Inizia",
|
||||||
|
"Session verified": "Sessione verificata",
|
||||||
|
"Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "La tua sessione ora è verificata. Ha accesso ai tuoi messaggi cifrati e gli altri utenti la vedranno come fidata.",
|
||||||
|
"Done": "Fatto",
|
||||||
|
"Without completing security on this device, it won’t have access to encrypted messages.": "Se non completi la sicurezza su questo dispositivo, esso non avrà accesso ai messaggi cifrati.",
|
||||||
|
"Go Back": "Torna",
|
||||||
|
"Secret Storage will be set up using your existing key backup details. Your secret storage passphrase and recovery key will be the same as they were for your key backup.": "L'archivio segreto verrà impostato usando i dettagli del backup chiavi esistente. La password dell'archivio segreto e la chiave di ripristino saranno le stesse del backup chiavi.",
|
||||||
|
"Encrypted by a deleted device": "Cifrato da un dispositivo eliminato",
|
||||||
|
"Verify User": "Verifica utente",
|
||||||
|
"For extra security, verify this user by checking a one-time code on both of your devices.": "Per maggiore sicurezza, verifica questo utente controllando un codice univoco sui vostri dispositivi.",
|
||||||
|
"For maximum security, do this in person.": "Per massima sicurezza, fatelo di persona.",
|
||||||
|
"Start Verification": "Inizia la verifica",
|
||||||
|
"%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s ha aggiunto %(addedAddresses)s e %(count)s altri indirizzi a questa stanza",
|
||||||
|
"%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s ha rimosso %(removedAddresses)s e %(count)s altri indirizzi da questa stanza",
|
||||||
|
"%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s ha rimosso %(countRemoved)s e aggiunto %(countAdded)s indirizzi a questa stanza",
|
||||||
|
"Someone is using an unknown device": "Qualcuno sta usando un dispositivo sconosciuto",
|
||||||
|
"This room is end-to-end encrypted": "Questa stanza è cifrata end-to-end",
|
||||||
|
"Everyone in this room is verified": "Tutti in questa stanza sono verificati",
|
||||||
|
"Invite only": "Solo a invito",
|
||||||
|
"Send a reply…": "Invia risposta…",
|
||||||
|
"Send a message…": "Invia un messaggio…",
|
||||||
|
"Reject & Ignore user": "Rifiuta e ignora l'utente",
|
||||||
|
"Unknown Command": "Comando sconosciuto",
|
||||||
|
"Unrecognised command: %(commandText)s": "Comando non riconosciuto: %(commandText)s",
|
||||||
|
"You can use <code>/help</code> to list available commands. Did you mean to send this as a message?": "Puoi usare <code>/help</code> per elencare i comandi disponibili. Volevo forse inviarlo come messaggio?",
|
||||||
|
"Hint: Begin your message with <code>//</code> to start it with a slash.": "Suggerimento: anteponi al tuo messaggio <code>//</code> per farlo iniziare con uno slash.",
|
||||||
|
"Send as message": "Invia come messaggio",
|
||||||
|
"Enter your account password to confirm the upgrade:": "Inserisci la password del tuo account per confermare l'aggiornamento:",
|
||||||
|
"You'll need to authenticate with the server to confirm the upgrade.": "Dovrai autenticarti con il server per confermare l'aggiornamento.",
|
||||||
|
"Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Aggiorna il dispositivo per consentirgli di verificare altri dispositivi, dando loro accesso ai messaggi cifrati e contrassegnandoli come fidati per gli altri utenti.",
|
||||||
|
"Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Imposta la cifratura sul dispositivo per consentirgli di verificare altri dispositivi, dando loro accesso ai messaggi cifrati e contrassegnandoli come fidati per gli altri utenti.",
|
||||||
|
"Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Proteggi le chiavi di cifratura con una password. Per massima sicurezza questa dovrebbe essere diversa da quella del tuo account:",
|
||||||
|
"Enter a passphrase": "Inserisci una password",
|
||||||
|
"Enter your passphrase a second time to confirm it.": "Inserisci di nuovo la tua password per confermarla.",
|
||||||
|
"This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Questo dispositivo ora può verificare altri dispositivi, dando loro accesso ai messaggi cifrati e contrassegnandoli come fidati per gli altri utenti.",
|
||||||
|
"Verify other users in their profile.": "Verifica gli altri utenti nel loro profilo.",
|
||||||
|
"Upgrade your encryption": "Aggiorna la tua cifratura",
|
||||||
|
"Set up encryption": "Imposta la cifratura",
|
||||||
|
"Encryption upgraded": "Cifratura aggiornata",
|
||||||
|
"Encryption setup complete": "Impostazione cifratura completata"
|
||||||
}
|
}
|
||||||
|
|
|
@ -601,7 +601,7 @@
|
||||||
"Copied!": "コピーされました!",
|
"Copied!": "コピーされました!",
|
||||||
"Failed to copy": "コピーに失敗しました",
|
"Failed to copy": "コピーに失敗しました",
|
||||||
"Add an Integration": "統合を追加する",
|
"Add an Integration": "統合を追加する",
|
||||||
"You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "サードパーティのサイトに移動して、%(integationsUrl)s で使用するためにアカウントを認証できるようになります。続行しますか?",
|
"You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "サードパーティのサイトに移動して、%(integrationsUrl)s で使用するためにアカウントを認証できるようになります。続行しますか?",
|
||||||
"Removed or unknown message type": "削除されたまたは未知のメッセージタイプ",
|
"Removed or unknown message type": "削除されたまたは未知のメッセージタイプ",
|
||||||
"Message removed by %(userId)s": "%(userId)s によってメッセージが削除されました",
|
"Message removed by %(userId)s": "%(userId)s によってメッセージが削除されました",
|
||||||
"Message removed": "メッセージが削除された",
|
"Message removed": "メッセージが削除された",
|
||||||
|
@ -630,7 +630,7 @@
|
||||||
"Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "%(roomName)s を %(groupId)s から削除してもよろしいですか?",
|
"Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "%(roomName)s を %(groupId)s から削除してもよろしいですか?",
|
||||||
"Removing a room from the community will also remove it from the community page.": "コミュニティから部屋を削除すると、コミュニティページからもその部屋が削除されます。",
|
"Removing a room from the community will also remove it from the community page.": "コミュニティから部屋を削除すると、コミュニティページからもその部屋が削除されます。",
|
||||||
"Failed to remove room from community": "コミュニティからの部屋の削除に失敗しました",
|
"Failed to remove room from community": "コミュニティからの部屋の削除に失敗しました",
|
||||||
"Failed to remove '%(roomName)s' from %(groupId)s": "%(groupName)s から '%(roomName)s' を削除できませんでした",
|
"Failed to remove '%(roomName)s' from %(groupId)s": "%(groupId)s から '%(roomName)s' を削除できませんでした",
|
||||||
"Something went wrong!": "何かが間違っていた!",
|
"Something went wrong!": "何かが間違っていた!",
|
||||||
"The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "%(groupId)s の '%(roomName)s' の表示を更新できませんでした。",
|
"The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "%(groupId)s の '%(roomName)s' の表示を更新できませんでした。",
|
||||||
"Visibility in Room List": "ルームリストの可視性",
|
"Visibility in Room List": "ルームリストの可視性",
|
||||||
|
@ -668,7 +668,7 @@
|
||||||
"%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s が参加しました",
|
"%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s が参加しました",
|
||||||
"%(oneUser)sjoined %(count)s times|other": "%(oneUser)s が %(count)s 回参加しました",
|
"%(oneUser)sjoined %(count)s times|other": "%(oneUser)s が %(count)s 回参加しました",
|
||||||
"%(oneUser)sjoined %(count)s times|one": "%(oneUser)s が参加しました",
|
"%(oneUser)sjoined %(count)s times|one": "%(oneUser)s が参加しました",
|
||||||
"%(severalUsers)sleft %(count)s times|other": "%(severalUers)s は %(count)s 回退出しました",
|
"%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s は %(count)s 回退出しました",
|
||||||
"%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s は退出しました",
|
"%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s は退出しました",
|
||||||
"%(oneUser)sleft %(count)s times|other": "%(oneUser)s は %(count)s 回退出しました",
|
"%(oneUser)sleft %(count)s times|other": "%(oneUser)s は %(count)s 回退出しました",
|
||||||
"%(oneUser)sleft %(count)s times|one": "%(oneUser)s は退出しました",
|
"%(oneUser)sleft %(count)s times|one": "%(oneUser)s は退出しました",
|
||||||
|
|
|
@ -1917,11 +1917,11 @@
|
||||||
"%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s bëri një thirrje zanore. (e pambuluar nga ky shfletues)",
|
"%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s bëri një thirrje zanore. (e pambuluar nga ky shfletues)",
|
||||||
"%(senderName)s placed a video call.": "%(senderName)s bëri një thirrje video.",
|
"%(senderName)s placed a video call.": "%(senderName)s bëri një thirrje video.",
|
||||||
"%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s bëri një thirrje video. (e pambuluar nga ky shfletues)",
|
"%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s bëri një thirrje video. (e pambuluar nga ky shfletues)",
|
||||||
"Enable cross-signing to verify per-user instead of per-device (in development)": "",
|
"Enable cross-signing to verify per-user instead of per-device (in development)": "Aktivizoni <em>cross-signing</em> për të verifikuar me bazë përdorues në vend se me bazë pajisje (në zhvillim)",
|
||||||
"Enable local event indexing and E2EE search (requires restart)": "Aktivizoni indeksim aktesh vendore dhe kërkim E2EE (lyp rinisje)",
|
"Enable local event indexing and E2EE search (requires restart)": "Aktivizoni indeksim aktesh vendore dhe kërkim E2EE (lyp rinisje)",
|
||||||
"Match system theme": "Përputhe me temën e sistemit",
|
"Match system theme": "Përputhe me temën e sistemit",
|
||||||
"Send cross-signing keys to homeserver": "",
|
"Send cross-signing keys to homeserver": "Dërgo te shërbyesi Home kyçe <em>cross-signing</em>",
|
||||||
"Cross-signing public keys:": "",
|
"Cross-signing public keys:": "Kyçe publikë për <em>cross-signing</em>:",
|
||||||
"on device": "në pajisje",
|
"on device": "në pajisje",
|
||||||
"not found": "s’u gjet",
|
"not found": "s’u gjet",
|
||||||
"in secret storage": "në depozitë të fshehtë",
|
"in secret storage": "në depozitë të fshehtë",
|
||||||
|
@ -2016,5 +2016,88 @@
|
||||||
"Connected to <channelIcon /> <channelName /> on <networkIcon /> <networkName />": "Lidhur me <channelIcon /> <channelName /> në <networkIcon /> <networkName />",
|
"Connected to <channelIcon /> <channelName /> on <networkIcon /> <networkName />": "Lidhur me <channelIcon /> <channelName /> në <networkIcon /> <networkName />",
|
||||||
"Connected via %(protocolName)s": "Lidhur përmes %(protocolName)s",
|
"Connected via %(protocolName)s": "Lidhur përmes %(protocolName)s",
|
||||||
"Bridge Info": "Të dhëna Ure",
|
"Bridge Info": "Të dhëna Ure",
|
||||||
"Below is a list of bridges connected to this room.": "Më poshtë keni një listë urash të lidhura në këtë dhomë."
|
"Below is a list of bridges connected to this room.": "Më poshtë keni një listë urash të lidhura në këtë dhomë.",
|
||||||
|
"New Session": "Sesion i Ri",
|
||||||
|
"%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s shtoi %(addedAddresses)s dhe dhe %(count)s adresa të tjera te kjo dhomë",
|
||||||
|
"%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s hoqi %(removedAddresses)s dhe %(count)s adresa të tjera nga kjo dhomë",
|
||||||
|
"%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s hoqi %(countRemoved)s dhe shtoi %(countAdded)s adresa te kjo dhomë",
|
||||||
|
"%(senderName)s turned on end-to-end encryption.": "%(senderName)s aktivizoi fshehtëzimin skaj-më-skaj.",
|
||||||
|
"%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s aktivizoi fshehtëzimin skaj-më-skaj (algoritëm jo i pranuar %(algorithm)s).",
|
||||||
|
"a few seconds ago": "pak sekonda më parë",
|
||||||
|
"about a minute ago": "rreth një minutë më parë",
|
||||||
|
"%(num)s minutes ago": "%(num)s minuta më parë",
|
||||||
|
"about an hour ago": "rreth një orë më parë",
|
||||||
|
"%(num)s hours ago": "%(num)s orë më parë",
|
||||||
|
"about a day ago": "rreth një ditë më parë",
|
||||||
|
"%(num)s days ago": "%(num)s ditë më parë",
|
||||||
|
"a few seconds from now": "pak sekonda nga tani",
|
||||||
|
"about a minute from now": "rreth një minutë nga tani",
|
||||||
|
"%(num)s minutes from now": "%(num)s minuta nga tani",
|
||||||
|
"about an hour from now": "rreth një orë nga tani",
|
||||||
|
"%(num)s hours from now": "%(num)s orë nga tani",
|
||||||
|
"about a day from now": "rreth një ditë nga tani",
|
||||||
|
"%(num)s days from now": "%(num)s ditë nga tani",
|
||||||
|
"Show a presence dot next to DMs in the room list": "Shfaqni një pikë pranie në krah DM-sh te lista e dhomave",
|
||||||
|
"Other users may not trust it": "Përdorues të tjerë mund të mos e besojnë",
|
||||||
|
"Later": "Më vonë",
|
||||||
|
"Cross-signing and secret storage are enabled.": "<em>Cross-signing</em> dhe depozitimi i fshehtë janë aktivizuar.",
|
||||||
|
"Your account has a cross-signing identity in secret storage, but it is not yet trusted by this device.": "Llogaria juaj ka një identitet <em>cross-signing</em> në depozitë të fshehtë, por s’është ende i besuar në këtë pajisje.",
|
||||||
|
"Cross-signing and secret storage are not yet set up.": "<em>Cross-signing</em> dhe depozitimi i fshehtë s’janë ujdisur ende.",
|
||||||
|
"Cross-signing private keys:": "Kyçe privatë për <em>cross-signing</em>:",
|
||||||
|
"Backup key stored in secret storage, but this feature is not enabled on this device. 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ë pajisje. Ju lutemi, aktivizoni në Labs <em>cross-signing</em> që të modifikoni gjendje kopjeruatjeje kyçesh.",
|
||||||
|
"Labs": "Labs",
|
||||||
|
"Complete": "E plotë",
|
||||||
|
"Someone is using an unknown device": "Dikush po përdor një pajisje të panjohur",
|
||||||
|
"This room is end-to-end encrypted": "Kjo dhomë është e fshehtëzuar skaj-më-skaj",
|
||||||
|
"Everyone in this room is verified": "Gjithkush në këtë dhomë është verifikuar",
|
||||||
|
"Encrypted by a deleted device": "Fshehtëzuar nga një pajisje e fshirë",
|
||||||
|
"Invite only": "Vetëm me ftesa",
|
||||||
|
"Send a reply…": "Dërgoni një përgjigje…",
|
||||||
|
"Send a message…": "Dërgoni një mesazh…",
|
||||||
|
"Reject & Ignore user": "Hidhe poshtë & Shpërfille përdoruesin",
|
||||||
|
"Unknown Command": "Urdhër i Panjohur",
|
||||||
|
"Unrecognised command: %(commandText)s": "Urdhër Jo i Pranuar: %(commandText)s",
|
||||||
|
"You can use <code>/help</code> to list available commands. Did you mean to send this as a message?": "Mund të përdorni <code>/help</code> që të shfaqen urdhrat e gatshëm. Donit vërtet ta dërgoni këtë si një mesazh?",
|
||||||
|
"Hint: Begin your message with <code>//</code> to start it with a slash.": "Ndihmëz: Fillojeni mesazhin tuaj me <code>//</code> që të nisë me një pjerrake.",
|
||||||
|
"Send as message": "Dërgoni një mesazh",
|
||||||
|
"Verify User": "Verifikoni Përdoruesin",
|
||||||
|
"For extra security, verify this user by checking a one-time code on both of your devices.": "Për siguri ekstra, verifikojeni këtë përdorues duke kontrolluar në të dyja pajisjet tuaja një kod njëpërdorimsh.",
|
||||||
|
"For maximum security, do this in person.": "Për siguri maksimum, bëjeni këtë ju vetë.",
|
||||||
|
"Start Verification": "Fillo Verifikimin",
|
||||||
|
"Failed to invite the following users to chat: %(csvUsers)s": "S’u arrit të ftoheshin për bisedë përdoruesit vijues: %(csvUsers)s",
|
||||||
|
"We couldn't create your DM. Please check the users you want to invite and try again.": "S’e krijuam dot DM-në tuaj. Ju lutemi, kontrolloni përdoruesit që doni të ftoni dhe riprovoni.",
|
||||||
|
"Something went wrong trying to invite the users.": "Diç shkoi ters teksa provohej të ftoheshin përdoruesit.",
|
||||||
|
"We couldn't invite those users. Please check the users you want to invite and try again.": "S’i ftuam dot këta përdorues. Ju lutemi, kontrolloni përdoruesit që doni të ftoni dhe riprovoni.",
|
||||||
|
"Failed to find the following users": "S’u arrit të gjendeshin përdoruesit vijues",
|
||||||
|
"The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "Përdoruesit vijues mund të mos ekzistojnë ose janë të pavlefshëm, dhe s’mund të ftohen: %(csvNames)s",
|
||||||
|
"Suggestions": "Sugjerime",
|
||||||
|
"If you can't find someone, ask them for their username, share your username (%(userId)s) or <a>profile link</a>.": "Nëse s’gjeni dot dikë, kërkojini emrin e tij të përdoruesit, tregojuni emrin tuaj të përdoruesit (%(userId)s) ose <a>lidhjen e profilit</a>.",
|
||||||
|
"If you can't find someone, ask them for their username (e.g. @user:server.com) or <a>share this room</a>.": "Nëse s’gjeni dot dikë, kërkojini emrin e tij të përdoruesit (p.sh., @përdorues:shërbyes.com) ose <a>tregojuni këtë dhomë</a>.",
|
||||||
|
"Access your secure message history and your cross-signing identity for verifying other devices by entering your passphrase.": "Për verifikim pajisjesh të tjera përmes dhënies së frazëkalimit tuaj, hyni te historiku i mesazheve tuaj të sigurt dhe identiteti juaj për <em>cross-signing</em>.",
|
||||||
|
"Access your secure message history and your cross-signing identity for verifying other devices by entering your recovery key.": "Për verifikim pajisjesh të tjera përmes dhënies së kyçit tuaj të rimarrjes, hyni te historiku i mesazheve tuaj të sigurt dhe identiteti juaj për <em>cross-signing</em>.",
|
||||||
|
"Complete security": "Siguri të plotë",
|
||||||
|
"Verify this session to grant it access to encrypted messages.": "Verifikojeni këtë sesion që t’i akordohet hyrje te mesazhe të fshehtëzuar.",
|
||||||
|
"Start": "Nise",
|
||||||
|
"Session verified": "Sesion i verifikuar",
|
||||||
|
"Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Sesioni juaj i ri tani është i verifikuar. Ka hyrje te mesazhet tuaj të fshehtëzuar dhe përdoruesit e tjerë do ta shohin si të besuar.",
|
||||||
|
"Done": "U bë",
|
||||||
|
"Without completing security on this device, it won’t have access to encrypted messages.": "Pa plotësuar sigurinë në këtë pajisje, s’do të ketë hyrje te mesazhe të fshehtëzuar.",
|
||||||
|
"Go Back": "Shko Mbrapsht",
|
||||||
|
"Key Backup is enabled on your account but has not been set up from this session. To set up secret storage, restore your key backup.": "Kopjeruajtja e Kyçeve është e aktivizuar në llogarinë tuaj, por nuk është ujdisur që nga ky sesion. Që të ujdisni depozitim të fshehtë, riktheni kopjeruajtjen tuaj të kyçeve.",
|
||||||
|
"Restore": "Riktheje",
|
||||||
|
"Enter your account password to confirm the upgrade:": "Që të ripohohet përmirësimi, jepni fjalëkalimin e llogarisë tuaj:",
|
||||||
|
"You'll need to authenticate with the server to confirm the upgrade.": "Do t’ju duhet të bëni mirëfilltësimin me shërbyesin që të ripohohet përmirësimi.",
|
||||||
|
"Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Përmirësojeni këtë pajisje për ta lejuar të verifikojë pajisje të tjera, duke u akorduar hyrje te mesazhe të fshehtëzuar dhe duke u vënë shenjë si të besuara për përdorues të tjerë.",
|
||||||
|
"Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Ujdisni fshehtëzim në këtë pajisje që ta lejoni të verifikojë pajisje të tjera, duke u akorduar atyre hyrje te mesazhe të fshehtëzuar dhe duke u vënë shenjë atyre si të besuara për përdorues të tjerë.",
|
||||||
|
"Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "Sigurojini kyçet tuaj të fshehtëzimit me një frazëkalim. Për siguri maksimale, ky do të duhej të ishte i ndryshëm nga fjalëkalimi për llogarinë tuaj:",
|
||||||
|
"Enter a passphrase": "Jepni një frazëkalim",
|
||||||
|
"Enter your passphrase a second time to confirm it.": "Që të ripohohet, jepeni edhe një herë frazëkalimin tuaj.",
|
||||||
|
"This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "Kjo pajisje mund të verifikojë pajisje të tjera, duke u akorduar hyrje te mesazhe të fshehtëzuar dhe duke u vënë shenjë si të besuara për përdorues të tjerë.",
|
||||||
|
"Verify other users in their profile.": "Verifikoni përdorues të tjerë në profilin e tyre.",
|
||||||
|
"Without setting up secret storage, you won't be able to restore your access to encrypted messages or your cross-signing identity for verifying other devices if you log out or use another device.": "Pa ujdisur depozitim të fshehtë, s’do të jeni në gjendje të rimerrni hyrje te mesazhe të fshehtëzuar apo te identiteti juaj <em>cross-signing</em> për verifikim pajisjesh të tjera, nëse dilni nga llogaria juaj ose përdorni një pajisje tjetër.",
|
||||||
|
"Restore your Key Backup": "Riktheni Kopjeruajtjen tuaj të Kyçeve",
|
||||||
|
"Upgrade your encryption": "Përmirësoni fshehtëzimin tuaj",
|
||||||
|
"Set up encryption": "Ujdisni fshehtëzim",
|
||||||
|
"Encryption upgraded": "U përmirësua fshehtëzimi",
|
||||||
|
"Encryption setup complete": "Ujdisje fshehtëzimit e plotësuar"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1422,5 +1422,121 @@
|
||||||
"Enable Community Filter Panel": "Toluluk Filtre Panelini Aç",
|
"Enable Community Filter Panel": "Toluluk Filtre Panelini Aç",
|
||||||
"Match system theme": "Sistem temasıyla eşle",
|
"Match system theme": "Sistem temasıyla eşle",
|
||||||
"Allow Peer-to-Peer for 1:1 calls": "1:1 çağrılar için eşten-eşe izin ver",
|
"Allow Peer-to-Peer for 1:1 calls": "1:1 çağrılar için eşten-eşe izin ver",
|
||||||
"Missing media permissions, click the button below to request.": "Medya izinleri eksik, alttaki butona tıkayarak talep edin."
|
"Missing media permissions, click the button below to request.": "Medya izinleri eksik, alttaki butona tıkayarak talep edin.",
|
||||||
|
"Credits": "Katkıda Bulunanlar",
|
||||||
|
"Clear cache and reload": "Belleği temizle ve yeniden yükle",
|
||||||
|
"Customise your experience with experimental labs features. <a>Learn more</a>.": "Deneysel laboratuar özellikler ile deneyiminizi özelleştirebilirsiniz. <a>Daha fazla</a>.",
|
||||||
|
"Ignored/Blocked": "Yoksayılan/Bloklanan",
|
||||||
|
"Error adding ignored user/server": "Yoksayılan kullanıcı/sunucu eklenirken hata",
|
||||||
|
"Error subscribing to list": "Listeye abone olunurken hata",
|
||||||
|
"Error removing ignored user/server": "Yoksayılan kullanıcı/sunucu silinirken hata",
|
||||||
|
"Error unsubscribing from list": "Listeden abonelikten çıkılırken hata",
|
||||||
|
"You are not subscribed to any lists": "Herhangi bir listeye aboneliğiniz bulunmuyor",
|
||||||
|
"⚠ These settings are meant for advanced users.": "⚠ Bu ayarlar ileri düzey kullanıcılar içindir.",
|
||||||
|
"Unignore": "Yoksayma",
|
||||||
|
"This bridge was provisioned by <user />": "Bu körpü <user /> tarafından provize edildi",
|
||||||
|
"Connected to <channelIcon /> <channelName /> on <networkIcon /> <networkName />": "<networkIcon /> <networkName /> ağındaki <channelIcon /> <channelName /> kanala bağlandı",
|
||||||
|
"Below is a list of bridges connected to this room.": "Bu odaya bağlanmış köprülerin bir listesi alttadır.",
|
||||||
|
"Change room avatar": "Oda resmini değiştir",
|
||||||
|
"Members only (since the point in time of selecting this option)": "Sadece üyeler ( bu seçeneği seçtiğinizden itibaren)",
|
||||||
|
"Unable to revoke sharing for email address": "E-posta adresi paylaşımı kaldırılamadı",
|
||||||
|
"Unable to revoke sharing for phone number": "Telefon numarası paylaşımı kaldırılamıyor",
|
||||||
|
"Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Bu sayfadaki oda, kullanıcı veya grup ID si gibi betimleyici bilgiler sunucuya gönderilmeden önce silindi.",
|
||||||
|
"Please ask the administrator of your homeserver (<code>%(homeserverDomain)s</code>) to configure a TURN server in order for calls to work reliably.": "Çağrıların sağlıklı bir şekide yapılabilmesi için lütfen anasunucunuzun (<code>%(homeserverDomain)s</code>) yöneticisinden bir TURN sunucusu yapılandırmasını isteyin.",
|
||||||
|
"%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s kullanıcıları isimlerini %(count)s kez değiştirdiler",
|
||||||
|
"%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s ismini %(count)s kez değiştirdi",
|
||||||
|
"%(severalUsers)smade no changes %(count)s times|one": "%(severalUsers)s değişiklik yapmadı",
|
||||||
|
"%(oneUser)smade no changes %(count)s times|other": "%(oneUser)s %(count)s kez değişiklik yapmadı",
|
||||||
|
"%(oneUser)smade no changes %(count)s times|one": "%(oneUser)s değişiklik yapmadı",
|
||||||
|
"Room alias": "Oda lakabı",
|
||||||
|
"Please provide a room alias": "Lütfen bir oda lakabı belirtin",
|
||||||
|
"This alias is available to use": "Bu lakap kullanmaya uygun",
|
||||||
|
"This alias is already in use": "Bu lakap zaten kullanımda",
|
||||||
|
"And %(count)s more...|other": "ve %(count)s kez daha...",
|
||||||
|
"Alternatively, you can try to use the public server at <code>turn.matrix.org</code>, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternatif olarak,<code>turn.matrix.org</code> adresindeki herkese açık sunucuyu kullanmayı deneyebilirsiniz. Fakat bu güvenilir olmayabilir. IP adresiniz bu sunucu ile paylaşılacaktır. Ayarlardan yönetebilirsiniz.",
|
||||||
|
"An error ocurred whilst trying to remove the widget from the room": "Görsel bileşen odadan silinmeye çalışılırken bir hata oluştu",
|
||||||
|
"Minimize apps": "Uygulamaları küçült",
|
||||||
|
"Maximize apps": "Uygulamaları büyült",
|
||||||
|
"Popout widget": "Görsel bileşeni göster",
|
||||||
|
"Please <newIssueLink>create a new issue</newIssueLink> on GitHub so that we can investigate this bug.": "Lütfen GitHub’da <newIssueLink>Yeni bir talep</newIssueLink> oluşturun ki bu hatayı inceleyebilelim.",
|
||||||
|
"Rotate counter-clockwise": "Saat yönünün tersine döndür",
|
||||||
|
"Language Dropdown": "Dil Listesi",
|
||||||
|
"%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s, %(count)s kez ayrıldı",
|
||||||
|
"%(oneUser)sleft %(count)s times|other": "%(oneUser)s %(count)s kez ayrıldı",
|
||||||
|
"%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s %(count)s kez katılıp ve ayrıldı",
|
||||||
|
"%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s %(count)s kez katıldı ve ayrıldı",
|
||||||
|
"%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s ayrıldı ve yeniden katıldı",
|
||||||
|
"%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s %(count)s kez davetlerini reddetti",
|
||||||
|
"%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s davetlerini reddetti",
|
||||||
|
"%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)s davetlerini reddetti",
|
||||||
|
"%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)s davetlerini geri çekti",
|
||||||
|
"%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)s davetini %(count)s kez geri çekti",
|
||||||
|
"%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)s davetini geri çekti",
|
||||||
|
"were banned %(count)s times|other": "%(count)s kez yasaklandı",
|
||||||
|
"were banned %(count)s times|one": "yasaklandı",
|
||||||
|
"was banned %(count)s times|other": "%(count)s kez yasaklandı",
|
||||||
|
"was banned %(count)s times|one": "yasaklandı",
|
||||||
|
"were unbanned %(count)s times|other": "%(count)s kez yasak kaldırıldı",
|
||||||
|
"were unbanned %(count)s times|one": "yasak kaldırıldı",
|
||||||
|
"was unbanned %(count)s times|other": "%(count)s kez yasak kaldırıldı",
|
||||||
|
"was unbanned %(count)s times|one": "yasak kaldırıldı",
|
||||||
|
"%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s resimlerini değiştirdiler",
|
||||||
|
"%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)s %(count)s kez resmini değiştirdi",
|
||||||
|
"%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s resmini değiştirdi",
|
||||||
|
"%(severalUsers)smade no changes %(count)s times|other": "%(severalUsers)s %(count)s kez hiç bir değişiklik yapmadı",
|
||||||
|
"Try using one of the following valid address types: %(validTypesList)s.": "Takip eden geçerli adres tiplerinden birini kullanmayı deneyin: %(validTypesList)s.",
|
||||||
|
"Use an identity server to invite by email. <default>Use the default (%(defaultIdentityServerName)s)</default> or manage in <settings>Settings</settings>.": "E-posta ile davet etmek için bir kimlik sunucusu kullan. <default> Varsayılanı kullan (%(defaultIdentityServerName)s</default> ya da <settings>Ayarlar</settings> kullanarak yönetin.",
|
||||||
|
"Use an identity server to invite by email. Manage in <settings>Settings</settings>.": "E-posta ile davet için bir kimlik sunucu kullan. <settings>Ayarlar</settings> dan yönet.",
|
||||||
|
"The following users may not exist": "Belirtilen kullanıcılar mevcut olmayabilir",
|
||||||
|
"Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?": "Altta belirtilen Matrix ID li profiller bulunamıyor - Onları yinede davet etmek ister misiniz?",
|
||||||
|
"Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Lütfen neyin yanlış gittiğini bize bildirin ya da en güzeli problemi tanımlayan bir GitHub talebi oluşturun.",
|
||||||
|
"Before submitting logs, you must <a>create a GitHub issue</a> to describe your problem.": "Logları göndermeden önce, probleminizi betimleyen <a>bir GitHub talebi oluşturun</a>.",
|
||||||
|
"Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Topluluk ID leri sadece a-z, 0-9 ya da '=_-./' karakterlerini içerebilir",
|
||||||
|
"Set a room alias to easily share your room with other people.": "Odanızı diğer kişilerle kolayca paylaşabilmek için bir oda lakabı ayarların.",
|
||||||
|
"Create a public room": "Halka açık bir oda oluşturun",
|
||||||
|
"Make this room public": "Bu odayı halka açık yap",
|
||||||
|
"To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of Riot to do this": "Sohbet tarihçesini kaybetmemek için, çıkmadan önce odanızın anahtarlarını dışarıya aktarın. Bunu yapabilmek için Riotun daha yeni sürümü gerekli. Ulaşmak için geri gitmeye ihtiyacınız var",
|
||||||
|
"Continue With Encryption Disabled": "Şifreleme Kapalı Şekilde Devam Et",
|
||||||
|
"The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "%(fileName)s dosyası anasunucunun yükleme boyutu limitini aşıyor",
|
||||||
|
"Double check that your server supports the room version chosen and try again.": "Seçtiğiniz oda sürümünün sunucunuz tarafından desteklenip desteklenmediğini iki kez kontrol edin ve yeniden deneyin.",
|
||||||
|
"Changes your avatar in this current room only": "Sadece bu odadaki resminizi değiştirin",
|
||||||
|
"Please supply a https:// or http:// widget URL": "Lütfen bir https:// ya da http:// olarak bir görsel bileşen URL i belirtin",
|
||||||
|
"Sends the given emote coloured as a rainbow": "Verilen ifadeyi bir gökkuşağı gibi renklendirilmiş olarak gönderin",
|
||||||
|
"%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s ekran adını %(displayName)s olarak değiştirdi.",
|
||||||
|
"%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s odayı adresi bilen herkesin girebileceği şekilde halka açık hale getirdi.",
|
||||||
|
"%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s katılma kuralını %(rule)s şeklinde değiştirdi",
|
||||||
|
"%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s misafir erişim kuralını %(rule)s şeklinde değiştirdi",
|
||||||
|
"%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s bu odanın ana adresini %(address)s olarak ayarladı.",
|
||||||
|
"%(senderName)s placed a voice call.": "%(senderName)s bir çağrı yaptı.",
|
||||||
|
"%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s bir çağrı başlattı. (Bu tarayıcı tarafından desteklenmiyor)",
|
||||||
|
"%(senderName)s placed a video call.": "%(senderName)s bir görüntülü çağrı yaptı.",
|
||||||
|
"%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s bir görüntülü çağrı yaptı. (bu tarayıcı tarafından desteklenmiyor)",
|
||||||
|
"Ask your Riot admin to check <a>your config</a> for incorrect or duplicate entries.": "Riot yöneticinize <a>yapılandırmanızın</a> hatalı ve mükerrer girdilerini kontrol etmesi için talepte bulunun.",
|
||||||
|
"You can register, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Kayıt olabilirsiniz, fakat kimlik sunucunuz çevrimiçi olana kadar bazı özellikler mevcut olmayacak. Bu uyarıyı sürekli görüyorsanız, yapılandırmanızı kontrol edin veya sunucu yöneticinizle iletişime geçin.",
|
||||||
|
"You can reset your password, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Parolanızı sıfırlayabilirsiniz, fakat kimlik sunucunuz çevrimiçi olana kadar bazı özellikler mevcut olmayacak. Bu uyarıyı sürekli görüyorsanız, yapılandırmanızı kontrol edin veya sunucu yöneticinizle iletişime geçin.",
|
||||||
|
"You can log in, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Oturum açabilirsiniz, fakat kimlik sunucunuz çevrimiçi olana kadar bazı özellikler mevcut olmayacak. Bu uyarıyı sürekli görüyorsanız, yapılandırmanızı kontrol edin veya sunucu yöneticinizle iletişime geçin.",
|
||||||
|
"a few seconds from now": "şu andan itibaren bir kaç saniye",
|
||||||
|
"about a minute from now": "şu andan itibaren yaklaşık bir dakika",
|
||||||
|
"%(num)s minutes from now": "şu andan itibaren %(num)s dakika",
|
||||||
|
"about an hour from now": "şu andan itibaren yaklaşık bir saat",
|
||||||
|
"%(num)s hours from now": "şu andan itibaren %(num)s saat",
|
||||||
|
"about a day from now": "şu andan itibaren yaklaşık bir gün",
|
||||||
|
"%(num)s days from now": "şu andan itibaren %(num)s gün",
|
||||||
|
"The user must be unbanned before they can be invited.": "Kullanıcının davet edilebilmesi için öncesinde yasağının kaldırılması gereklidir.",
|
||||||
|
"Repeats like \"abcabcabc\" are only slightly harder to guess than \"abc\"": "“abcabcabc” gibi tekrarlar “abc” yi tahmin etmekten çok az daha zor olur",
|
||||||
|
"Sequences like abc or 6543 are easy to guess": "abc veya 6543 gibi diziler tahmin için oldukça kolaydır",
|
||||||
|
"Common names and surnames are easy to guess": "Yaygın isimleri ve soyisimleri tahmin etmek oldukça kolay",
|
||||||
|
"Enable cross-signing to verify per-user instead of per-device (in development)": "Her cihaz yerine her kullanıcıyı doğrulamak için çarpraz-imzalamayı aç (geliştiriliyor)",
|
||||||
|
"Show info about bridges in room settings": "Oda ayarlarındaki köprülerin bilgilerini göster",
|
||||||
|
"Show a placeholder for removed messages": "Silinen mesajlar için bir yer tutucu göster",
|
||||||
|
"Show display name changes": "Ekran isim değişikliklerini göster",
|
||||||
|
"Enable URL previews for this room (only affects you)": "Bu oda için URL önizlemeyi aç (sadece sizi etkiler)",
|
||||||
|
"Enable URL previews by default for participants in this room": "Bu odadaki katılımcılar için URL önizlemeyi varsayılan olarak açık hale getir",
|
||||||
|
"Enable widget screenshots on supported widgets": "Desteklenen görsel bileşenlerde anlık görüntüleri aç",
|
||||||
|
"Show recently visited rooms above the room list": "En son ziyaret edilen odaları oda listesinin en üstünde göster",
|
||||||
|
"Show hidden events in timeline": "Zaman çizelgesinde gizli olayları göster",
|
||||||
|
"Encrypted messages in one-to-one chats": "Birebir sohbetlerdeki şifrelenmiş mesajlar",
|
||||||
|
"Encrypted messages in group chats": "Grup sohbetlerdeki şifrelenmiş mesajlar",
|
||||||
|
"This is your list of users/servers you have blocked - don't leave the room!": "Bu sizin engellediğiniz kullanıcılar/sunucular listeniz - odadan ayrılmayın!",
|
||||||
|
"Got It": "Anlaşıldı"
|
||||||
}
|
}
|
||||||
|
|
|
@ -2075,5 +2075,41 @@
|
||||||
"Something went wrong trying to invite the users.": "在嘗試邀請使用者時發生錯誤。",
|
"Something went wrong trying to invite the users.": "在嘗試邀請使用者時發生錯誤。",
|
||||||
"We couldn't invite those users. Please check the users you want to invite and try again.": "我們無法邀請那些使用者。請檢查您想要邀請的使用者並再試一次。",
|
"We couldn't invite those users. Please check the users you want to invite and try again.": "我們無法邀請那些使用者。請檢查您想要邀請的使用者並再試一次。",
|
||||||
"Recently Direct Messaged": "最近傳送過直接訊息",
|
"Recently Direct Messaged": "最近傳送過直接訊息",
|
||||||
"If you can't find someone, ask them for their username (e.g. @user:server.com) or <a>share this room</a>.": "如果您找不到某人,請詢問他們的使用者名稱(範例:@user:server.com)或<a>分享此聊天室</a>。"
|
"If you can't find someone, ask them for their username (e.g. @user:server.com) or <a>share this room</a>.": "如果您找不到某人,請詢問他們的使用者名稱(範例:@user:server.com)或<a>分享此聊天室</a>。",
|
||||||
|
"Verify User": "驗證使用者",
|
||||||
|
"For extra security, verify this user by checking a one-time code on both of your devices.": "為了提高安全性,請透過檢查您兩個裝置上的一次性代碼來驗證此使用者。",
|
||||||
|
"For maximum security, do this in person.": "為了取得最強的安全性,請親自進行。",
|
||||||
|
"Start Verification": "開始驗證",
|
||||||
|
"Encrypted by a deleted device": "被已刪除的裝置加密",
|
||||||
|
"Unknown Command": "未知的指令",
|
||||||
|
"Unrecognised command: %(commandText)s": "無法識別的指令:%(commandText)s",
|
||||||
|
"You can use <code>/help</code> to list available commands. Did you mean to send this as a message?": "您可以使用 <code>/help</code> 來列出可用的指令。您是要傳送此訊息嗎?",
|
||||||
|
"Hint: Begin your message with <code>//</code> to start it with a slash.": "提示:以 <code>//</code> 開頭讓您的訊息傳送時可以用斜線開頭。",
|
||||||
|
"Send as message": "以訊息傳送",
|
||||||
|
"%(senderName)s added %(addedAddresses)s and %(count)s other addresses to this room|other": "%(senderName)s 向此聊天室新增了 %(addedAddresses)s 與其他 %(count)s 個地址",
|
||||||
|
"%(senderName)s removed %(removedAddresses)s and %(count)s other addresses from this room|other": "%(senderName)s 從此聊天室移除了 %(removedAddresses)s 與其他 %(count)s 個地址",
|
||||||
|
"%(senderName)s removed %(countRemoved)s and added %(countAdded)s addresses to this room": "%(senderName)s 對此聊天室移除了 %(countRemoved)s 個並新增了 %(countAdded)s 地址到此聊天室",
|
||||||
|
"%(senderName)s turned on end-to-end encryption.": "%(senderName)s 開啟了端到端加密。",
|
||||||
|
"%(senderName)s turned on end-to-end encryption (unrecognised algorithm %(algorithm)s).": "%(senderName)s 開啟了端到端加密(無法識別的演算法 %(algorithm)s)。",
|
||||||
|
"Someone is using an unknown device": "某人正在使用未知的裝置",
|
||||||
|
"This room is end-to-end encrypted": "此聊天室已端到端加密",
|
||||||
|
"Everyone in this room is verified": "此聊天室中每個人都已驗證",
|
||||||
|
"Invite only": "僅邀請",
|
||||||
|
"Send a reply…": "傳送回覆……",
|
||||||
|
"Send a message…": "傳送訊息……",
|
||||||
|
"Reject & Ignore user": "回絕並忽略使用者",
|
||||||
|
"If you can't find someone, ask them for their username, share your username (%(userId)s) or <a>profile link</a>.": "如果您找不到某人,請詢問他們以取得他們的使用者名稱,分享您的使用者名稱 (%(userId)s) 或<a>簡介連結</a>。",
|
||||||
|
"Enter your account password to confirm the upgrade:": "輸入您的帳號密碼以確認升級:",
|
||||||
|
"You'll need to authenticate with the server to confirm the upgrade.": "您必須透過伺服器驗證以確認升級。",
|
||||||
|
"Upgrade this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "升級此裝置以允許其驗證其他裝置,並允許存取加密訊息以及將它們標記為受其他使用者信任。",
|
||||||
|
"Set up encryption on this device to allow it to verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "在此裝置上設定加密以允許其驗證其他裝置,並允許存取加密訊息以及將它們標記為受其他使用者信任。",
|
||||||
|
"Secure your encryption keys with a passphrase. For maximum security this should be different to your account password:": "使用通關密語保護您的加密金鑰。為了取得最強的安全性,此通關密語應與您的帳號密碼不同:",
|
||||||
|
"Enter a passphrase": "輸入通關密語",
|
||||||
|
"Enter your passphrase a second time to confirm it.": "輸入您的通關密語兩次以確認。",
|
||||||
|
"This device can now verify other devices, granting them access to encrypted messages and marking them as trusted for other users.": "此裝置現在可以驗證其他裝置,並允許存取加密訊息以及將它們標記為受其他使用者信任。",
|
||||||
|
"Verify other users in their profile.": "透過他們的簡介驗證其他使用者。",
|
||||||
|
"Upgrade your encryption": "升級您的加密",
|
||||||
|
"Set up encryption": "設定加密",
|
||||||
|
"Encryption upgraded": "加密已升級",
|
||||||
|
"Encryption setup complete": "加密設定完成"
|
||||||
}
|
}
|
||||||
|
|
|
@ -5760,11 +5760,12 @@ mathml-tag-names@^2.0.1:
|
||||||
resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.1.tgz#6dff66c99d55ecf739ca53c492e626f1d12a33cc"
|
resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.1.tgz#6dff66c99d55ecf739ca53c492e626f1d12a33cc"
|
||||||
integrity sha512-pWB896KPGSGkp1XtyzRBftpTzwSOL0Gfk0wLvxt4f2mgzjY19o0LxJ3U25vNWTzsh7da+KTbuXQoQ3lOJZ8WHw==
|
integrity sha512-pWB896KPGSGkp1XtyzRBftpTzwSOL0Gfk0wLvxt4f2mgzjY19o0LxJ3U25vNWTzsh7da+KTbuXQoQ3lOJZ8WHw==
|
||||||
|
|
||||||
matrix-js-sdk@3.0.0:
|
matrix-js-sdk@4.0.0:
|
||||||
version "3.0.0"
|
version "4.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-3.0.0.tgz#97908f9eda9eeb3ba0333b7e474c45f2b258e50c"
|
resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-4.0.0.tgz#c81bdc905af2ab1634527e5f542f2f15977d31cf"
|
||||||
integrity sha512-lzUMwJAZHw7Dk0K+rubqe6kEpy4+pJ+qCp8n6lisfdKfMDJXdNCkjiiXRnakM1ZD4PFYK8ju89+NfxlyhAAd4A==
|
integrity sha512-Xbe36xL443qtEBH4xk0k39JabolqZfloK7fwYGMb/PgWO26VOzvw94XWahnIr5w83oxBAF9nFmP+7EnPG6IHnA==
|
||||||
dependencies:
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.8.3"
|
||||||
another-json "^0.2.0"
|
another-json "^0.2.0"
|
||||||
browser-request "^0.3.3"
|
browser-request "^0.3.3"
|
||||||
bs58 "^4.0.1"
|
bs58 "^4.0.1"
|
||||||
|
|
Loading…
Reference in a new issue