Merge pull request #4017 from matrix-org/jryans/e2e-copy-changes

Apply copy edits to security setup flow
This commit is contained in:
J. Ryan Stinnett 2020-01-31 15:13:18 +00:00 committed by GitHub
commit 2584772bfb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 40 additions and 88 deletions

View file

@ -139,7 +139,7 @@ export async function accessSecretStorage(func = async () => { }) {
const { finished } = Modal.createTrackedDialog( const { finished } = Modal.createTrackedDialog(
'Cross-signing keys dialog', '', InteractiveAuthDialog, 'Cross-signing keys dialog', '', InteractiveAuthDialog,
{ {
title: _t("Send cross-signing keys to homeserver"), title: _t("Setting up keys"),
matrixClient: MatrixClientPeg.get(), matrixClient: MatrixClientPeg.get(),
makeRequest, makeRequest,
}, },

View file

@ -71,7 +71,6 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
copied: false, copied: false,
downloaded: false, downloaded: false,
zxcvbnResult: null, zxcvbnResult: null,
setPassPhrase: false,
}; };
if (this.state.secureSecretStorage === undefined) { if (this.state.secureSecretStorage === undefined) {
@ -219,7 +218,6 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
_onPassPhraseConfirmNextClick = async () => { _onPassPhraseConfirmNextClick = async () => {
this._keyBackupInfo = await MatrixClientPeg.get().prepareKeyBackupVersion(this.state.passPhrase); this._keyBackupInfo = await MatrixClientPeg.get().prepareKeyBackupVersion(this.state.passPhrase);
this.setState({ this.setState({
setPassPhrase: true,
copied: false, copied: false,
downloaded: false, downloaded: false,
phase: PHASE_SHOWKEY, phase: PHASE_SHOWKEY,
@ -338,7 +336,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
<details> <details>
<summary>{_t("Advanced")}</summary> <summary>{_t("Advanced")}</summary>
<p><button onClick={this._onSkipPassPhraseClick} > <p><button onClick={this._onSkipPassPhraseClick} >
{_t("Set up with a Recovery Key")} {_t("Set up with a recovery key")}
</button></p> </button></p>
</details> </details>
</div>; </div>;
@ -401,28 +399,17 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
} }
_renderPhaseShowKey() { _renderPhaseShowKey() {
let bodyText;
if (this.state.setPassPhrase) {
bodyText = _t(
"As a safety net, you can use it to restore your encrypted message " +
"history if you forget your Recovery Passphrase.",
);
} else {
bodyText = _t("As a safety net, you can use it to restore your encrypted message history.");
}
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 " +
"access to your encrypted messages if you forget your passphrase.", "access to your encrypted messages if you forget your passphrase.",
)}</p> )}</p>
<p>{_t( <p>{_t(
"Keep your recovery key somewhere very secure, like a password manager (or a safe).", "Keep a copy of it somewhere secure, like a password manager or even a safe.",
)}</p> )}</p>
<p>{bodyText}</p>
<div className="mx_CreateKeyBackupDialog_primaryContainer"> <div className="mx_CreateKeyBackupDialog_primaryContainer">
<div className="mx_CreateKeyBackupDialog_recoveryKeyHeader"> <div className="mx_CreateKeyBackupDialog_recoveryKeyHeader">
{_t("Your Recovery Key")} {_t("Your recovery key")}
</div> </div>
<div className="mx_CreateKeyBackupDialog_recoveryKeyContainer"> <div className="mx_CreateKeyBackupDialog_recoveryKeyContainer">
<div className="mx_CreateKeyBackupDialog_recoveryKey"> <div className="mx_CreateKeyBackupDialog_recoveryKey">
@ -430,7 +417,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
</div> </div>
<div className="mx_CreateKeyBackupDialog_recoveryKeyButtons"> <div className="mx_CreateKeyBackupDialog_recoveryKeyButtons">
<button className="mx_Dialog_primary" onClick={this._onCopyClick}> <button className="mx_Dialog_primary" onClick={this._onCopyClick}>
{_t("Copy to clipboard")} {_t("Copy")}
</button> </button>
<button className="mx_Dialog_primary" onClick={this._onDownloadClick}> <button className="mx_Dialog_primary" onClick={this._onDownloadClick}>
{_t("Download")} {_t("Download")}
@ -462,7 +449,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
<li>{_t("<b>Save it</b> on a USB key or backup drive", {}, {b: s => <b>{s}</b>})}</li> <li>{_t("<b>Save it</b> on a USB key or backup drive", {}, {b: s => <b>{s}</b>})}</li>
<li>{_t("<b>Copy it</b> to your personal cloud storage", {}, {b: s => <b>{s}</b>})}</li> <li>{_t("<b>Copy it</b> to your personal cloud storage", {}, {b: s => <b>{s}</b>})}</li>
</ul> </ul>
<DialogButtons primaryButton={_t("OK")} <DialogButtons primaryButton={_t("Continue")}
onPrimaryButtonClick={this._createBackup} onPrimaryButtonClick={this._createBackup}
hasCancel={false}> hasCancel={false}>
<button onClick={this._onKeepItSafeBackClick}>{_t("Back")}</button> <button onClick={this._onKeepItSafeBackClick}>{_t("Back")}</button>
@ -515,15 +502,14 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
case PHASE_OPTOUT_CONFIRM: case PHASE_OPTOUT_CONFIRM:
return _t('Warning!'); return _t('Warning!');
case PHASE_SHOWKEY: case PHASE_SHOWKEY:
return _t('Recovery key');
case PHASE_KEEPITSAFE: case PHASE_KEEPITSAFE:
return _t('Keep it safe'); return _t('Make a copy of your recovery key');
case PHASE_BACKINGUP: case PHASE_BACKINGUP:
return _t('Starting backup...'); return _t('Starting backup...');
case PHASE_DONE: case PHASE_DONE:
return _t('Success!'); return _t('Success!');
default: default:
return _t("Create Key Backup"); return _t("Create key backup");
} }
} }

View file

@ -76,7 +76,6 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
copied: false, copied: false,
downloaded: false, downloaded: false,
zxcvbnResult: null, zxcvbnResult: null,
setPassPhrase: false,
backupInfo: null, backupInfo: null,
backupSigStatus: null, backupSigStatus: null,
// 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
@ -84,9 +83,6 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
canUploadKeysWithPasswordOnly: null, canUploadKeysWithPasswordOnly: null,
accountPassword: props.accountPassword, accountPassword: props.accountPassword,
accountPasswordCorrect: null, accountPasswordCorrect: null,
// set if we are 'upgrading' encryption (making an SSSS store from
// an existing key backup secret).
doingUpgrade: null,
// status of the key backup toggle switch // status of the key backup toggle switch
useKeyBackup: true, useKeyBackup: true,
}; };
@ -117,8 +113,6 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
phase, phase,
backupInfo, backupInfo,
backupSigStatus, backupSigStatus,
// remember this after this phase so we can use appropriate copy
doingUpgrade: phase === PHASE_MIGRATE,
}); });
} }
@ -205,7 +199,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
const { finished } = Modal.createTrackedDialog( const { finished } = Modal.createTrackedDialog(
'Cross-signing keys dialog', '', InteractiveAuthDialog, 'Cross-signing keys dialog', '', InteractiveAuthDialog,
{ {
title: _t("Send cross-signing keys to homeserver"), title: _t("Setting up keys"),
matrixClient: MatrixClientPeg.get(), matrixClient: MatrixClientPeg.get(),
makeRequest, makeRequest,
}, },
@ -325,7 +319,6 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
this._keyInfo = keyInfo; this._keyInfo = keyInfo;
this._encodedRecoveryKey = encodedRecoveryKey; this._encodedRecoveryKey = encodedRecoveryKey;
this.setState({ this.setState({
setPassPhrase: true,
copied: false, copied: false,
downloaded: false, downloaded: false,
phase: PHASE_SHOWKEY, phase: PHASE_SHOWKEY,
@ -588,19 +581,6 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
} }
_renderPhaseShowKey() { _renderPhaseShowKey() {
let bodyText;
if (this.state.setPassPhrase) {
bodyText = _t(
"As a safety net, you can use it to restore your access to encrypted " +
"messages if you forget your passphrase.",
);
} else {
bodyText = _t(
"As a safety net, you can use it to restore your access to encrypted " +
"messages.",
);
}
const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
return <div> return <div>
<p>{_t( <p>{_t(
@ -608,12 +588,11 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
"access to your encrypted messages if you forget your passphrase.", "access to your encrypted messages if you forget your passphrase.",
)}</p> )}</p>
<p>{_t( <p>{_t(
"Keep your recovery key somewhere very secure, like a password manager (or a safe).", "Keep a copy of it somewhere secure, like a password manager or even a safe.",
)}</p> )}</p>
<p>{bodyText}</p>
<div className="mx_CreateSecretStorageDialog_primaryContainer"> <div className="mx_CreateSecretStorageDialog_primaryContainer">
<div className="mx_CreateSecretStorageDialog_recoveryKeyHeader"> <div className="mx_CreateSecretStorageDialog_recoveryKeyHeader">
{_t("Your Recovery Key")} {_t("Your recovery key")}
</div> </div>
<div className="mx_CreateSecretStorageDialog_recoveryKeyContainer"> <div className="mx_CreateSecretStorageDialog_recoveryKeyContainer">
<div className="mx_CreateSecretStorageDialog_recoveryKey"> <div className="mx_CreateSecretStorageDialog_recoveryKey">
@ -621,7 +600,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
</div> </div>
<div className="mx_CreateSecretStorageDialog_recoveryKeyButtons"> <div className="mx_CreateSecretStorageDialog_recoveryKeyButtons">
<AccessibleButton kind='primary' className="mx_Dialog_primary" onClick={this._onCopyClick}> <AccessibleButton kind='primary' className="mx_Dialog_primary" onClick={this._onCopyClick}>
{_t("Copy to clipboard")} {_t("Copy")}
</AccessibleButton> </AccessibleButton>
<AccessibleButton kind='primary' className="mx_Dialog_primary" onClick={this._onDownloadClick}> <AccessibleButton kind='primary' className="mx_Dialog_primary" onClick={this._onDownloadClick}>
{_t("Download")} {_t("Download")}
@ -653,7 +632,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
<li>{_t("<b>Save it</b> on a USB key or backup drive", {}, {b: s => <b>{s}</b>})}</li> <li>{_t("<b>Save it</b> on a USB key or backup drive", {}, {b: s => <b>{s}</b>})}</li>
<li>{_t("<b>Copy it</b> to your personal cloud storage", {}, {b: s => <b>{s}</b>})}</li> <li>{_t("<b>Copy it</b> to your personal cloud storage", {}, {b: s => <b>{s}</b>})}</li>
</ul> </ul>
<DialogButtons primaryButton={_t("OK")} <DialogButtons primaryButton={_t("Continue")}
onPrimaryButtonClick={this._bootstrapSecretStorage} onPrimaryButtonClick={this._bootstrapSecretStorage}
hasCancel={false}> hasCancel={false}>
<button onClick={this._onKeepItSafeBackClick}>{_t("Back")}</button> <button onClick={this._onKeepItSafeBackClick}>{_t("Back")}</button>
@ -672,11 +651,8 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); const DialogButtons = sdk.getComponent('views.elements.DialogButtons');
return <div> return <div>
<p>{_t( <p>{_t(
"This session can now verify other sessions, granting them access " + "You can now verify your other devices, " +
"to encrypted messages and marking them as trusted for other users.", "and other users to keep your chats safe.",
)}</p>
<p>{_t(
"Verify other users in their profile.",
)}</p> )}</p>
<DialogButtons primaryButton={_t('OK')} <DialogButtons primaryButton={_t('OK')}
onPrimaryButtonClick={this._onDone} onPrimaryButtonClick={this._onDone}
@ -712,13 +688,12 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
case PHASE_CONFIRM_SKIP: case PHASE_CONFIRM_SKIP:
return _t('Are you sure?'); return _t('Are you sure?');
case PHASE_SHOWKEY: case PHASE_SHOWKEY:
return _t('Recovery key');
case PHASE_KEEPITSAFE: case PHASE_KEEPITSAFE:
return _t('Keep it safe'); return _t('Make a copy of your recovery key');
case PHASE_STORING: case PHASE_STORING:
return _t('Storing secrets...'); return _t('Setting up keys');
case PHASE_DONE: case PHASE_DONE:
return this.state.doingUpgrade ? _t('Encryption upgraded') : _t('Encryption setup complete'); return _t("You're done!");
default: default:
return ''; return '';
} }

View file

@ -142,7 +142,7 @@ export const PasswordAuthEntry = createReactClass({
return ( return (
<div> <div>
<p>{ _t("To continue, please enter your password.") }</p> <p>{ _t("Confirm your identity by entering your account password below.") }</p>
<form onSubmit={this._onSubmit} className="mx_InteractiveAuthEntryComponents_passwordSection"> <form onSubmit={this._onSubmit} className="mx_InteractiveAuthEntryComponents_passwordSection">
<Field <Field
id="mx_InteractiveAuthEntryComponents_password" id="mx_InteractiveAuthEntryComponents_password"

View file

@ -248,7 +248,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
} else if (this.state.restoreError) { } else if (this.state.restoreError) {
if (this.state.restoreError.errcode === MatrixClient.RESTORE_BACKUP_ERROR_BAD_KEY) { if (this.state.restoreError.errcode === MatrixClient.RESTORE_BACKUP_ERROR_BAD_KEY) {
if (this.state.restoreType === RESTORE_TYPE_RECOVERYKEY) { if (this.state.restoreType === RESTORE_TYPE_RECOVERYKEY) {
title = _t("Recovery Key Mismatch"); title = _t("Recovery key mismatch");
content = <div> content = <div>
<p>{_t( <p>{_t(
"Backup could not be decrypted with this key: " + "Backup could not be decrypted with this key: " +
@ -256,7 +256,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
)}</p> )}</p>
</div>; </div>;
} else { } else {
title = _t("Incorrect Recovery Passphrase"); title = _t("Incorrect recovery passphrase");
content = <div> content = <div>
<p>{_t( <p>{_t(
"Backup could not be decrypted with this passphrase: " + "Backup could not be decrypted with this passphrase: " +
@ -273,7 +273,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
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'); 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) {
failedToDecrypt = <p>{_t( failedToDecrypt = <p>{_t(
@ -293,7 +293,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
} 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');
const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
title = _t("Enter Recovery Passphrase"); title = _t("Enter recovery passphrase");
content = <div> content = <div>
<p>{_t( <p>{_t(
"<b>Warning</b>: you should only set up key backup " + "<b>Warning</b>: you should only set up key backup " +
@ -340,7 +340,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
})} })}
</div>; </div>;
} else { } else {
title = _t("Enter Recovery Key"); title = _t("Enter recovery key");
const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); const DialogButtons = sdk.getComponent('views.elements.DialogButtons');
const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); const AccessibleButton = sdk.getComponent('elements.AccessibleButton');

View file

@ -39,7 +39,7 @@ export default class SetupEncryptionToast extends React.PureComponent {
switch (this.props.kind) { switch (this.props.kind) {
case 'set_up_encryption': case 'set_up_encryption':
case 'upgrade_encryption': case 'upgrade_encryption':
return _t('Verify your other sessions easier'); return _t('Verify yourself & others to keep your chats safe');
case 'verify_this_session': case 'verify_this_session':
return _t('Other users may not trust it'); return _t('Other users may not trust it');
} }

View file

@ -60,7 +60,7 @@
"Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.", "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.",
"The server does not support the room version specified.": "The server does not support the room version specified.", "The server does not support the room version specified.": "The server does not support the room version specified.",
"Failure to create room": "Failure to create room", "Failure to create room": "Failure to create room",
"Send cross-signing keys to homeserver": "Send cross-signing keys to homeserver", "Setting up keys": "Setting up keys",
"Send anyway": "Send anyway", "Send anyway": "Send anyway",
"Send": "Send", "Send": "Send",
"Sun": "Sun", "Sun": "Sun",
@ -518,7 +518,7 @@
"Headphones": "Headphones", "Headphones": "Headphones",
"Folder": "Folder", "Folder": "Folder",
"Pin": "Pin", "Pin": "Pin",
"Verify your other sessions easier": "Verify your other sessions easier", "Verify yourself & others to keep your chats safe": "Verify yourself & others to keep your chats safe",
"Other users may not trust it": "Other users may not trust it", "Other users may not trust it": "Other users may not trust it",
"Upgrade": "Upgrade", "Upgrade": "Upgrade",
"Verify": "Verify", "Verify": "Verify",
@ -1649,20 +1649,20 @@
"Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.": "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.", "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.": "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key.",
"If you've forgotten your recovery key you can <button>set up new recovery options</button>.": "If you've forgotten your recovery key you can <button>set up new recovery options</button>.", "If you've forgotten your recovery key you can <button>set up new recovery options</button>.": "If you've forgotten your recovery key you can <button>set up new recovery options</button>.",
"Unable to load backup status": "Unable to load backup status", "Unable to load backup status": "Unable to load backup status",
"Recovery Key Mismatch": "Recovery Key Mismatch", "Recovery key mismatch": "Recovery key mismatch",
"Backup could not be decrypted with this key: please verify that you entered the correct recovery key.": "Backup could not be decrypted with this key: please verify that you entered the correct recovery key.", "Backup could not be decrypted with this key: please verify that you entered the correct recovery key.": "Backup could not be decrypted with this key: please verify that you entered the correct recovery key.",
"Incorrect Recovery Passphrase": "Incorrect Recovery Passphrase", "Incorrect recovery passphrase": "Incorrect recovery passphrase",
"Backup could not be decrypted with this passphrase: please verify that you entered the correct recovery passphrase.": "Backup could not be decrypted with this passphrase: please verify that you entered the correct recovery passphrase.", "Backup could not be decrypted with this passphrase: please verify that you entered the correct recovery passphrase.": "Backup could not be decrypted with this passphrase: please verify that you entered the correct recovery passphrase.",
"Unable to restore backup": "Unable to restore backup", "Unable to restore backup": "Unable to restore backup",
"No backup found!": "No backup found!", "No backup found!": "No backup found!",
"Backup Restored": "Backup Restored", "Backup restored": "Backup restored",
"Failed to decrypt %(failedCount)s sessions!": "Failed to decrypt %(failedCount)s sessions!", "Failed to decrypt %(failedCount)s sessions!": "Failed to decrypt %(failedCount)s sessions!",
"Restored %(sessionCount)s session keys": "Restored %(sessionCount)s session keys", "Restored %(sessionCount)s session keys": "Restored %(sessionCount)s session keys",
"Enter Recovery Passphrase": "Enter Recovery Passphrase", "Enter recovery passphrase": "Enter recovery passphrase",
"<b>Warning</b>: you should only set up key backup from a trusted computer.": "<b>Warning</b>: you should only set up key backup from a trusted computer.", "<b>Warning</b>: you should only set up key backup from a trusted computer.": "<b>Warning</b>: you should only set up key backup from a trusted computer.",
"Access your secure message history and set up secure messaging by entering your recovery passphrase.": "Access your secure message history and set up secure messaging by entering your recovery passphrase.", "Access your secure message history and set up secure messaging by entering your recovery passphrase.": "Access your secure message history and set up secure messaging by entering your recovery passphrase.",
"If you've forgotten your recovery passphrase you can <button1>use your recovery key</button1> or <button2>set up new recovery options</button2>": "If you've forgotten your recovery passphrase you can <button1>use your recovery key</button1> or <button2>set up new recovery options</button2>", "If you've forgotten your recovery passphrase you can <button1>use your recovery key</button1> or <button2>set up new recovery options</button2>": "If you've forgotten your recovery passphrase you can <button1>use your recovery key</button1> or <button2>set up new recovery options</button2>",
"Enter Recovery Key": "Enter Recovery Key", "Enter recovery key": "Enter recovery key",
"<b>Warning</b>: You should only set up key backup from a trusted computer.": "<b>Warning</b>: You should only set up key backup from a trusted computer.", "<b>Warning</b>: You should only set up key backup from a trusted computer.": "<b>Warning</b>: You should only set up key backup from a trusted computer.",
"Access your secure message history and set up secure messaging by entering your recovery key.": "Access your secure message history and set up secure messaging by entering your recovery key.", "Access your secure message history and set up secure messaging by entering your recovery key.": "Access your secure message history and set up secure messaging by entering your recovery key.",
"If you've forgotten your recovery key you can <button>set up new recovery options</button>": "If you've forgotten your recovery key you can <button>set up new recovery options</button>", "If you've forgotten your recovery key you can <button>set up new recovery options</button>": "If you've forgotten your recovery key you can <button>set up new recovery options</button>",
@ -1717,7 +1717,7 @@
"Country Dropdown": "Country Dropdown", "Country Dropdown": "Country Dropdown",
"Custom Server Options": "Custom Server Options", "Custom Server Options": "Custom Server Options",
"You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use this app with an existing Matrix account on a different homeserver.": "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use this app with an existing Matrix account on a different homeserver.", "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use this app with an existing Matrix account on a different homeserver.": "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use this app with an existing Matrix account on a different homeserver.",
"To continue, please enter your password.": "To continue, please enter your password.", "Confirm your identity by entering your account password below.": "Confirm your identity by entering your account password below.",
"Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.": "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.", "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.": "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.",
"Please review and accept all of the homeserver's policies": "Please review and accept all of the homeserver's policies", "Please review and accept all of the homeserver's policies": "Please review and accept all of the homeserver's policies",
"Please review and accept the policies of this homeserver:": "Please review and accept the policies of this homeserver:", "Please review and accept the policies of this homeserver:": "Please review and accept the policies of this homeserver:",
@ -2043,43 +2043,34 @@
"Go back to set it again.": "Go back to set it again.", "Go back to set it again.": "Go back to set it again.",
"Enter your passphrase a second time to confirm it.": "Enter your passphrase a second time to confirm it.", "Enter your passphrase a second time to confirm it.": "Enter your passphrase a second time to confirm it.",
"Confirm your passphrase": "Confirm your passphrase", "Confirm your passphrase": "Confirm your passphrase",
"As a safety net, you can use it to restore your access to encrypted messages if you forget your passphrase.": "As a safety net, you can use it to restore your access to encrypted messages if you forget your passphrase.",
"As a safety net, you can use it to restore your access to encrypted messages.": "As a safety net, you can use it to restore your access to encrypted messages.",
"Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.": "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.",
"Keep your recovery key somewhere very secure, like a password manager (or a safe).": "Keep your recovery key somewhere very secure, like a password manager (or a safe).", "Keep a copy of it somewhere secure, like a password manager or even a safe.": "Keep a copy of it somewhere secure, like a password manager or even a safe.",
"Your Recovery Key": "Your Recovery Key", "Your recovery key": "Your recovery key",
"Copy to clipboard": "Copy to clipboard", "Copy": "Copy",
"Download": "Download", "Download": "Download",
"Your recovery key has been <b>copied to your clipboard</b>, paste it to:": "Your recovery key has been <b>copied to your clipboard</b>, paste it to:", "Your recovery key has been <b>copied to your clipboard</b>, paste it to:": "Your recovery key has been <b>copied to your clipboard</b>, paste it to:",
"Your recovery key is in your <b>Downloads</b> folder.": "Your recovery key is in your <b>Downloads</b> folder.", "Your recovery key is in your <b>Downloads</b> folder.": "Your recovery key is in your <b>Downloads</b> folder.",
"<b>Print it</b> and store it somewhere safe": "<b>Print it</b> and store it somewhere safe", "<b>Print it</b> and store it somewhere safe": "<b>Print it</b> and store it somewhere safe",
"<b>Save it</b> on a USB key or backup drive": "<b>Save it</b> on a USB key or backup drive", "<b>Save it</b> on a USB key or backup drive": "<b>Save it</b> on a USB key or backup drive",
"<b>Copy it</b> to your personal cloud storage": "<b>Copy it</b> to your personal cloud storage", "<b>Copy it</b> to your personal cloud storage": "<b>Copy it</b> to your personal cloud storage",
"This session can now verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "This session can now verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.", "You can now verify your other devices, and other users to keep your chats safe.": "You can now verify your other devices, and other users to keep your chats safe.",
"Verify other users in their profile.": "Verify other users in their profile.",
"Upgrade your encryption": "Upgrade your encryption", "Upgrade your encryption": "Upgrade your encryption",
"Recovery key": "Recovery key", "Make a copy of your recovery key": "Make a copy of your recovery key",
"Keep it safe": "Keep it safe", "You're done!": "You're done!",
"Storing secrets...": "Storing secrets...",
"Encryption upgraded": "Encryption upgraded",
"Encryption setup complete": "Encryption setup complete",
"Unable to set up secret storage": "Unable to set up secret storage", "Unable to set up secret storage": "Unable to set up secret storage",
"Retry": "Retry", "Retry": "Retry",
"We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.": "We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.", "We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.": "We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.",
"For maximum security, this should be different from your account password.": "For maximum security, this should be different from your account password.", "For maximum security, this should be different from your account password.": "For maximum security, this should be different from your account password.",
"Enter a passphrase...": "Enter a passphrase...", "Enter a passphrase...": "Enter a passphrase...",
"Set up with a Recovery Key": "Set up with a Recovery Key",
"Please enter your passphrase a second time to confirm.": "Please enter your passphrase a second time to confirm.", "Please enter your passphrase a second time to confirm.": "Please enter your passphrase a second time to confirm.",
"Repeat your passphrase...": "Repeat your passphrase...", "Repeat your passphrase...": "Repeat your passphrase...",
"As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.": "As a safety net, you can use it to restore your encrypted message history if you forget your Recovery Passphrase.",
"As a safety net, you can use it to restore your encrypted message history.": "As a safety net, you can use it to restore your encrypted message history.",
"Your keys are being backed up (the first backup could take a few minutes).": "Your keys are being backed up (the first backup could take a few minutes).", "Your keys are being backed up (the first backup could take a few minutes).": "Your keys are being backed up (the first backup could take a few minutes).",
"Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.", "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.",
"Set up Secure Message Recovery": "Set up Secure Message Recovery", "Set up Secure Message Recovery": "Set up Secure Message Recovery",
"Secure your backup with a passphrase": "Secure your backup with a passphrase", "Secure your backup with a passphrase": "Secure your backup with a passphrase",
"Starting backup...": "Starting backup...", "Starting backup...": "Starting backup...",
"Success!": "Success!", "Success!": "Success!",
"Create Key Backup": "Create Key Backup", "Create key backup": "Create key backup",
"Unable to create key backup": "Unable to create key backup", "Unable to create key backup": "Unable to create key backup",
"Without setting up Secure Message Recovery, you'll lose your secure message history when you log out.": "Without setting up Secure Message Recovery, you'll lose your secure message history when you log out.", "Without setting up Secure Message Recovery, you'll lose your secure message history when you log out.": "Without setting up Secure Message Recovery, you'll lose your secure message history when you log out.",
"If you don't want to set this up now, you can later in Settings.": "If you don't want to set this up now, you can later in Settings.", "If you don't want to set this up now, you can later in Settings.": "If you don't want to set this up now, you can later in Settings.",