More i18n strings (#963)
* Add i18n for E2E import and Export Dialogs Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add various previous missing i18n strings Signed-off-by: MTRNord <mtrnord1@gmail.com> * Translate CreateRoomButton Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add ChatInviteDialog and fix missing to. Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add ConfitmRedactDialog translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add DeactivateAccountDialog translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add DeviceVerifyDialog translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add SessionRestoreErrorDialog translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add SetDisplayNameDialog translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add UnknownDeviceDialog translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add AddressTile translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add DeviceVerifyButtons translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add Dropdown translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add UserSelector translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add CaptchaForm translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add CasLogin translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add CustomServerDialog translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add InteractiveAuthEntryComponents translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add LoginFooter translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add RegistrationForm translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add ServerConfig translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add MAudioBody translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add MImageBody translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add MVideoBody translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add TextualBody translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add UnknownBody translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add UrlPreviewSettings translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add AuxPanel translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * Add PresenceLabel translations Signed-off-by: MTRNord <mtrnord1@gmail.com> * fix syntax error * weird space :P * missing ',' * fix missing value * fix json fail * remove acidential added file * fix another json fail
This commit is contained in:
parent
9d207a8237
commit
70e7d81093
42 changed files with 295 additions and 175 deletions
|
@ -16,6 +16,7 @@ limitations under the License.
|
||||||
|
|
||||||
import FileSaver from 'file-saver';
|
import FileSaver from 'file-saver';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
import * as Matrix from 'matrix-js-sdk';
|
import * as Matrix from 'matrix-js-sdk';
|
||||||
import * as MegolmExportEncryption from '../../../utils/MegolmExportEncryption';
|
import * as MegolmExportEncryption from '../../../utils/MegolmExportEncryption';
|
||||||
|
@ -52,11 +53,11 @@ export default React.createClass({
|
||||||
|
|
||||||
const passphrase = this.refs.passphrase1.value;
|
const passphrase = this.refs.passphrase1.value;
|
||||||
if (passphrase !== this.refs.passphrase2.value) {
|
if (passphrase !== this.refs.passphrase2.value) {
|
||||||
this.setState({errStr: 'Passphrases must match'});
|
this.setState({errStr: _t('Passphrases must match')});
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!passphrase) {
|
if (!passphrase) {
|
||||||
this.setState({errStr: 'Passphrase must not be empty'});
|
this.setState({errStr: _t('Passphrase must not be empty')});
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,24 +110,28 @@ export default React.createClass({
|
||||||
return (
|
return (
|
||||||
<BaseDialog className='mx_exportE2eKeysDialog'
|
<BaseDialog className='mx_exportE2eKeysDialog'
|
||||||
onFinished={this.props.onFinished}
|
onFinished={this.props.onFinished}
|
||||||
title="Export room keys"
|
title={_t("Export room keys")}
|
||||||
>
|
>
|
||||||
<form onSubmit={this._onPassphraseFormSubmit}>
|
<form onSubmit={this._onPassphraseFormSubmit}>
|
||||||
<div className="mx_Dialog_content">
|
<div className="mx_Dialog_content">
|
||||||
<p>
|
<p>
|
||||||
This process allows you to export the keys for messages
|
{ _t(
|
||||||
you have received in encrypted rooms to a local file. You
|
'This process allows you to export the keys for messages ' +
|
||||||
will then be able to import the file into another Matrix
|
'you have received in encrypted rooms to a local file. You ' +
|
||||||
client in the future, so that client will also be able to
|
'will then be able to import the file into another Matrix ' +
|
||||||
decrypt these messages.
|
'client in the future, so that client will also be able to ' +
|
||||||
|
'decrypt these messages.'
|
||||||
|
) }
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
The exported file will allow anyone who can read it to decrypt
|
{ _t(
|
||||||
any encrypted messages that you can see, so you should be
|
'The exported file will allow anyone who can read it to decrypt ' +
|
||||||
careful to keep it secure. To help with this, you should enter
|
'any encrypted messages that you can see, so you should be ' +
|
||||||
a passphrase below, which will be used to encrypt the exported
|
'careful to keep it secure. To help with this, you should enter ' +
|
||||||
data. It will only be possible to import the data by using the
|
'a passphrase below, which will be used to encrypt the exported ' +
|
||||||
same passphrase.
|
'data. It will only be possible to import the data by using the ' +
|
||||||
|
'same passphrase.'
|
||||||
|
) }
|
||||||
</p>
|
</p>
|
||||||
<div className='error'>
|
<div className='error'>
|
||||||
{this.state.errStr}
|
{this.state.errStr}
|
||||||
|
@ -135,7 +140,7 @@ export default React.createClass({
|
||||||
<div className='mx_E2eKeysDialog_inputRow'>
|
<div className='mx_E2eKeysDialog_inputRow'>
|
||||||
<div className='mx_E2eKeysDialog_inputLabel'>
|
<div className='mx_E2eKeysDialog_inputLabel'>
|
||||||
<label htmlFor='passphrase1'>
|
<label htmlFor='passphrase1'>
|
||||||
Enter passphrase
|
{_t("Enter passphrase")}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div className='mx_E2eKeysDialog_inputCell'>
|
<div className='mx_E2eKeysDialog_inputCell'>
|
||||||
|
@ -148,7 +153,7 @@ export default React.createClass({
|
||||||
<div className='mx_E2eKeysDialog_inputRow'>
|
<div className='mx_E2eKeysDialog_inputRow'>
|
||||||
<div className='mx_E2eKeysDialog_inputLabel'>
|
<div className='mx_E2eKeysDialog_inputLabel'>
|
||||||
<label htmlFor='passphrase2'>
|
<label htmlFor='passphrase2'>
|
||||||
Confirm passphrase
|
{_t("Confirm passphrase")}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div className='mx_E2eKeysDialog_inputCell'>
|
<div className='mx_E2eKeysDialog_inputCell'>
|
||||||
|
|
|
@ -19,6 +19,7 @@ import React from 'react';
|
||||||
import * as Matrix from 'matrix-js-sdk';
|
import * as Matrix from 'matrix-js-sdk';
|
||||||
import * as MegolmExportEncryption from '../../../utils/MegolmExportEncryption';
|
import * as MegolmExportEncryption from '../../../utils/MegolmExportEncryption';
|
||||||
import sdk from '../../../index';
|
import sdk from '../../../index';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
function readFileAsArrayBuffer(file) {
|
function readFileAsArrayBuffer(file) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
@ -112,20 +113,23 @@ export default React.createClass({
|
||||||
return (
|
return (
|
||||||
<BaseDialog className='mx_importE2eKeysDialog'
|
<BaseDialog className='mx_importE2eKeysDialog'
|
||||||
onFinished={this.props.onFinished}
|
onFinished={this.props.onFinished}
|
||||||
title="Import room keys"
|
title={_t("Import room keys")}
|
||||||
>
|
>
|
||||||
<form onSubmit={this._onFormSubmit}>
|
<form onSubmit={this._onFormSubmit}>
|
||||||
<div className="mx_Dialog_content">
|
<div className="mx_Dialog_content">
|
||||||
<p>
|
<p>
|
||||||
This process allows you to import encryption keys
|
{ _t(
|
||||||
that you had previously exported from another Matrix
|
'This process allows you to import encryption keys ' +
|
||||||
client. You will then be able to decrypt any
|
'that you had previously exported from another Matrix ' +
|
||||||
messages that the other client could decrypt.
|
'client. You will then be able to decrypt any ' +
|
||||||
|
'messages that the other client could decrypt.'
|
||||||
|
) }
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
The export file will be protected with a passphrase.
|
{ _t(
|
||||||
You should enter the passphrase here, to decrypt the
|
'The export file will be protected with a passphrase. ' +
|
||||||
file.
|
'You should enter the passphrase here, to decrypt the file.'
|
||||||
|
) }
|
||||||
</p>
|
</p>
|
||||||
<div className='error'>
|
<div className='error'>
|
||||||
{this.state.errStr}
|
{this.state.errStr}
|
||||||
|
@ -134,7 +138,7 @@ export default React.createClass({
|
||||||
<div className='mx_E2eKeysDialog_inputRow'>
|
<div className='mx_E2eKeysDialog_inputRow'>
|
||||||
<div className='mx_E2eKeysDialog_inputLabel'>
|
<div className='mx_E2eKeysDialog_inputLabel'>
|
||||||
<label htmlFor='importFile'>
|
<label htmlFor='importFile'>
|
||||||
File to import
|
{_t("File to import")}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div className='mx_E2eKeysDialog_inputCell'>
|
<div className='mx_E2eKeysDialog_inputCell'>
|
||||||
|
@ -147,7 +151,7 @@ export default React.createClass({
|
||||||
<div className='mx_E2eKeysDialog_inputRow'>
|
<div className='mx_E2eKeysDialog_inputRow'>
|
||||||
<div className='mx_E2eKeysDialog_inputLabel'>
|
<div className='mx_E2eKeysDialog_inputLabel'>
|
||||||
<label htmlFor='passphrase'>
|
<label htmlFor='passphrase'>
|
||||||
Enter passphrase
|
{_t("Enter passphrase")}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div className='mx_E2eKeysDialog_inputCell'>
|
<div className='mx_E2eKeysDialog_inputCell'>
|
||||||
|
|
|
@ -95,7 +95,7 @@ var FilePanel = React.createClass({
|
||||||
</div>;
|
</div>;
|
||||||
} else if (this.noRoom) {
|
} else if (this.noRoom) {
|
||||||
return <div className="mx_FilePanel mx_RoomView_messageListWrapper">
|
return <div className="mx_FilePanel mx_RoomView_messageListWrapper">
|
||||||
<div className="mx_RoomView_empty">You must join the room to see its files</div>
|
<div className="mx_RoomView_empty">{_t("You must join the room to see its files")}</div>
|
||||||
</div>;
|
</div>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -699,9 +699,9 @@ module.exports = React.createClass({
|
||||||
modal.close();
|
modal.close();
|
||||||
console.error("Failed to leave room " + roomId + " " + err);
|
console.error("Failed to leave room " + roomId + " " + err);
|
||||||
Modal.createDialog(ErrorDialog, {
|
Modal.createDialog(ErrorDialog, {
|
||||||
title: "Failed to leave room",
|
title: _t("Failed to leave room"),
|
||||||
description: (err && err.message ? err.message :
|
description: (err && err.message ? err.message :
|
||||||
"Server may be unavailable, overloaded, or you hit a bug."),
|
_t("Server may be unavailable, overloaded, or you hit a bug.")),
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,7 +55,7 @@ const gHVersionLabel = function(repo, token='') {
|
||||||
// Enumerate some simple 'flip a bit' UI settings (if any).
|
// Enumerate some simple 'flip a bit' UI settings (if any).
|
||||||
// 'id' gives the key name in the im.vector.web.settings account data event
|
// 'id' gives the key name in the im.vector.web.settings account data event
|
||||||
// 'label' is how we describe it in the UI.
|
// 'label' is how we describe it in the UI.
|
||||||
// Warning: Each "label" string below must be added to i18n/strings/en_EN.json,
|
// Warning: Each "label" string below must be added to i18n/strings/en_EN.json,
|
||||||
// since they will be translated when rendered.
|
// since they will be translated when rendered.
|
||||||
const SETTINGS_LABELS = [
|
const SETTINGS_LABELS = [
|
||||||
{
|
{
|
||||||
|
@ -90,7 +90,7 @@ const SETTINGS_LABELS = [
|
||||||
*/
|
*/
|
||||||
];
|
];
|
||||||
|
|
||||||
// Warning: Each "label" string below must be added to i18n/strings/en_EN.json,
|
// Warning: Each "label" string below must be added to i18n/strings/en_EN.json,
|
||||||
// since they will be translated when rendered.
|
// since they will be translated when rendered.
|
||||||
const CRYPTO_SETTINGS_LABELS = [
|
const CRYPTO_SETTINGS_LABELS = [
|
||||||
{
|
{
|
||||||
|
@ -804,7 +804,7 @@ module.exports = React.createClass({
|
||||||
reject = (
|
reject = (
|
||||||
<AccessibleButton className="mx_UserSettings_button danger"
|
<AccessibleButton className="mx_UserSettings_button danger"
|
||||||
onClick={this._onRejectAllInvitesClicked.bind(this, invitedRooms)}>
|
onClick={this._onRejectAllInvitesClicked.bind(this, invitedRooms)}>
|
||||||
Reject all {invitedRooms.length} invites
|
{_t("Reject all %(invitedRooms)s invites", {invitedRooms: invitedRooms.length})}
|
||||||
</AccessibleButton>
|
</AccessibleButton>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,8 +16,8 @@ limitations under the License.
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var React = require('react');
|
import React from 'react';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
displayName: 'CreateRoomButton',
|
displayName: 'CreateRoomButton',
|
||||||
propTypes: {
|
propTypes: {
|
||||||
|
@ -36,7 +36,7 @@ module.exports = React.createClass({
|
||||||
|
|
||||||
render: function() {
|
render: function() {
|
||||||
return (
|
return (
|
||||||
<button className="mx_CreateRoomButton" onClick={this.onClick}>Create Room</button>
|
<button className="mx_CreateRoomButton" onClick={this.onClick}>{_t("Create Room")}</button>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -86,7 +86,7 @@ export default class ChatCreateOrReuseDialog extends React.Component {
|
||||||
<div className="mx_RoomTile_avatar">
|
<div className="mx_RoomTile_avatar">
|
||||||
<img src="img/create-big.svg" width="26" height="26" />
|
<img src="img/create-big.svg" width="26" height="26" />
|
||||||
</div>
|
</div>
|
||||||
<div className={labelClasses}><i>Start new chat</i></div>
|
<div className={labelClasses}><i>{_("Start new chat")}</i></div>
|
||||||
</AccessibleButton>;
|
</AccessibleButton>;
|
||||||
|
|
||||||
const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog');
|
const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog');
|
||||||
|
|
|
@ -272,8 +272,8 @@ module.exports = React.createClass({
|
||||||
if (MatrixClientPeg.get().isGuest()) {
|
if (MatrixClientPeg.get().isGuest()) {
|
||||||
var NeedToRegisterDialog = sdk.getComponent("dialogs.NeedToRegisterDialog");
|
var NeedToRegisterDialog = sdk.getComponent("dialogs.NeedToRegisterDialog");
|
||||||
Modal.createDialog(NeedToRegisterDialog, {
|
Modal.createDialog(NeedToRegisterDialog, {
|
||||||
title: "Please Register",
|
title: _t("Please Register"),
|
||||||
description: "Guest users can't invite users. Please register."
|
description: _t("Guest users can't invite users. Please register."),
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -294,8 +294,8 @@ module.exports = React.createClass({
|
||||||
console.error(err.stack);
|
console.error(err.stack);
|
||||||
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
||||||
Modal.createDialog(ErrorDialog, {
|
Modal.createDialog(ErrorDialog, {
|
||||||
title: "Failed to invite",
|
title: _t("Failed to invite"),
|
||||||
description: ((err && err.message) ? err.message : "Operation failed"),
|
description: ((err && err.message) ? err.message : _t("Operation failed")),
|
||||||
});
|
});
|
||||||
return null;
|
return null;
|
||||||
})
|
})
|
||||||
|
@ -307,8 +307,8 @@ module.exports = React.createClass({
|
||||||
console.error(err.stack);
|
console.error(err.stack);
|
||||||
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
||||||
Modal.createDialog(ErrorDialog, {
|
Modal.createDialog(ErrorDialog, {
|
||||||
title: "Failed to invite user",
|
title: _t("Failed to invite user"),
|
||||||
description: ((err && err.message) ? err.message : "Operation failed"),
|
description: ((err && err.message) ? err.message : _t("Operation failed")),
|
||||||
});
|
});
|
||||||
return null;
|
return null;
|
||||||
})
|
})
|
||||||
|
@ -328,8 +328,8 @@ module.exports = React.createClass({
|
||||||
console.error(err.stack);
|
console.error(err.stack);
|
||||||
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
||||||
Modal.createDialog(ErrorDialog, {
|
Modal.createDialog(ErrorDialog, {
|
||||||
title: "Failed to invite",
|
title: _t("Failed to invite"),
|
||||||
description: ((err && err.message) ? err.message : "Operation failed"),
|
description: ((err && err.message) ? err.message : _t("Operation failed")),
|
||||||
});
|
});
|
||||||
return null;
|
return null;
|
||||||
})
|
})
|
||||||
|
@ -385,7 +385,7 @@ module.exports = React.createClass({
|
||||||
if (errorList.length > 0) {
|
if (errorList.length > 0) {
|
||||||
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
||||||
Modal.createDialog(ErrorDialog, {
|
Modal.createDialog(ErrorDialog, {
|
||||||
title: "Failed to invite the following users to the " + room.name + " room:",
|
title: _t("Failed to invite the following users to the %(roomName)s room:", {roomName: room.name}),
|
||||||
description: errorList.join(", "),
|
description: errorList.join(", "),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ limitations under the License.
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import sdk from '../../../index';
|
import sdk from '../../../index';
|
||||||
import classnames from 'classnames';
|
import classnames from 'classnames';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A dialog for confirming a redaction.
|
* A dialog for confirming a redaction.
|
||||||
|
@ -42,7 +43,7 @@ export default React.createClass({
|
||||||
render: function() {
|
render: function() {
|
||||||
const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog');
|
const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog');
|
||||||
|
|
||||||
const title = "Confirm Removal";
|
const title = _t("Confirm Removal");
|
||||||
|
|
||||||
const confirmButtonClass = classnames({
|
const confirmButtonClass = classnames({
|
||||||
'mx_Dialog_primary': true,
|
'mx_Dialog_primary': true,
|
||||||
|
@ -55,16 +56,16 @@ export default React.createClass({
|
||||||
title={title}
|
title={title}
|
||||||
>
|
>
|
||||||
<div className="mx_Dialog_content">
|
<div className="mx_Dialog_content">
|
||||||
Are you sure you wish to remove (delete) this event?
|
{_t("Are you sure you wish to remove (delete) this event? " +
|
||||||
Note that if you delete a room name or topic change, it could undo the change.
|
"Note that if you delete a room name or topic change, it could undo the change.")}
|
||||||
</div>
|
</div>
|
||||||
<div className="mx_Dialog_buttons">
|
<div className="mx_Dialog_buttons">
|
||||||
<button className={confirmButtonClass} onClick={this.onOk}>
|
<button className={confirmButtonClass} onClick={this.onOk}>
|
||||||
Remove
|
{_t("Remove")}
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<button onClick={this.onCancel}>
|
<button onClick={this.onCancel}>
|
||||||
Cancel
|
{_t("Cancel")}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</BaseDialog>
|
</BaseDialog>
|
||||||
|
|
|
@ -20,6 +20,7 @@ import sdk from '../../../index';
|
||||||
import MatrixClientPeg from '../../../MatrixClientPeg';
|
import MatrixClientPeg from '../../../MatrixClientPeg';
|
||||||
import * as Lifecycle from '../../../Lifecycle';
|
import * as Lifecycle from '../../../Lifecycle';
|
||||||
import Velocity from 'velocity-vector';
|
import Velocity from 'velocity-vector';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
export default class DeactivateAccountDialog extends React.Component {
|
export default class DeactivateAccountDialog extends React.Component {
|
||||||
constructor(props, context) {
|
constructor(props, context) {
|
||||||
|
@ -56,10 +57,10 @@ export default class DeactivateAccountDialog extends React.Component {
|
||||||
Lifecycle.onLoggedOut();
|
Lifecycle.onLoggedOut();
|
||||||
this.props.onFinished(false);
|
this.props.onFinished(false);
|
||||||
}, (err) => {
|
}, (err) => {
|
||||||
let errStr = 'Unknown error';
|
let errStr = _t('Unknown error');
|
||||||
// https://matrix.org/jira/browse/SYN-744
|
// https://matrix.org/jira/browse/SYN-744
|
||||||
if (err.httpStatus == 401 || err.httpStatus == 403) {
|
if (err.httpStatus == 401 || err.httpStatus == 403) {
|
||||||
errStr = 'Incorrect password';
|
errStr = _t('Incorrect password');
|
||||||
Velocity(this._passwordField, "callout.shake", 300);
|
Velocity(this._passwordField, "callout.shake", 300);
|
||||||
}
|
}
|
||||||
this.setState({
|
this.setState({
|
||||||
|
@ -91,23 +92,23 @@ export default class DeactivateAccountDialog extends React.Component {
|
||||||
let cancelButton = null;
|
let cancelButton = null;
|
||||||
if (!this.state.busy) {
|
if (!this.state.busy) {
|
||||||
cancelButton = <button onClick={this._onCancel} autoFocus={true}>
|
cancelButton = <button onClick={this._onCancel} autoFocus={true}>
|
||||||
Cancel
|
{_t("Cancel")}
|
||||||
</button>;
|
</button>;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="mx_DeactivateAccountDialog">
|
<div className="mx_DeactivateAccountDialog">
|
||||||
<div className="mx_Dialog_title danger">
|
<div className="mx_Dialog_title danger">
|
||||||
Deactivate Account
|
{_t("Deactivate Account")}
|
||||||
</div>
|
</div>
|
||||||
<div className="mx_Dialog_content">
|
<div className="mx_Dialog_content">
|
||||||
<p>This will make your account permanently unusable. You will not be able to re-register the same user ID.</p>
|
<p>{_t("This will make your account permanently unusable. You will not be able to re-register the same user ID.")}</p>
|
||||||
|
|
||||||
<p>This action is irreversible.</p>
|
<p>{_t("This action is irreversible.")}</p>
|
||||||
|
|
||||||
<p>To continue, please enter your password.</p>
|
<p>{_t("To continue, please enter your password.")}</p>
|
||||||
|
|
||||||
<p>Password:</p>
|
<p>{_t("Password")}:</p>
|
||||||
<input
|
<input
|
||||||
type="password"
|
type="password"
|
||||||
onChange={this._onPasswordFieldChange}
|
onChange={this._onPasswordFieldChange}
|
||||||
|
|
|
@ -19,6 +19,7 @@ import React from 'react';
|
||||||
import MatrixClientPeg from '../../../MatrixClientPeg';
|
import MatrixClientPeg from '../../../MatrixClientPeg';
|
||||||
import sdk from '../../../index';
|
import sdk from '../../../index';
|
||||||
import * as FormattingUtils from '../../../utils/FormattingUtils';
|
import * as FormattingUtils from '../../../utils/FormattingUtils';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
export default function DeviceVerifyDialog(props) {
|
export default function DeviceVerifyDialog(props) {
|
||||||
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
|
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
|
||||||
|
@ -27,25 +28,25 @@ export default function DeviceVerifyDialog(props) {
|
||||||
const body = (
|
const body = (
|
||||||
<div>
|
<div>
|
||||||
<p>
|
<p>
|
||||||
To verify that this device can be trusted, please contact its
|
{_t("To verify that this device can be trusted, please contact its " +
|
||||||
owner using some other means (e.g. in person or a phone call)
|
"owner using some other means (e.g. in person or a phone call) " +
|
||||||
and ask them whether the key they see in their User Settings
|
"and ask them whether the key they see in their User Settings " +
|
||||||
for this device matches the key below:
|
"for this device matches the key below:")}
|
||||||
</p>
|
</p>
|
||||||
<div className="mx_UserSettings_cryptoSection">
|
<div className="mx_UserSettings_cryptoSection">
|
||||||
<ul>
|
<ul>
|
||||||
<li><label>Device name:</label> <span>{ props.device.getDisplayName() }</span></li>
|
<li><label>{_t("Device name")}:</label> <span>{ props.device.getDisplayName() }</span></li>
|
||||||
<li><label>Device ID:</label> <span><code>{ props.device.deviceId}</code></span></li>
|
<li><label>{_t("Device ID")}:</label> <span><code>{ props.device.deviceId}</code></span></li>
|
||||||
<li><label>Device key:</label> <span><code><b>{ key }</b></code></span></li>
|
<li><label>{_t("Device key")}:</label> <span><code><b>{ key }</b></code></span></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
If it matches, press the verify button below.
|
{_t("If it matches, press the verify button below. " +
|
||||||
If it doesnt, then someone else is intercepting this device
|
"If it doesn't, then someone else is intercepting this device " +
|
||||||
and you probably want to press the blacklist button instead.
|
"and you probably want to press the blacklist button instead.")}
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
In future this verification process will be more sophisticated.
|
{_t("In future this verification process will be more sophisticated.")}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -61,9 +62,9 @@ export default function DeviceVerifyDialog(props) {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<QuestionDialog
|
<QuestionDialog
|
||||||
title="Verify device"
|
title={_t("Verify device")}
|
||||||
description={body}
|
description={body}
|
||||||
button="I verify that the keys match"
|
button={_t("I verify that the keys match")}
|
||||||
onFinished={onFinished}
|
onFinished={onFinished}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|
|
@ -18,6 +18,7 @@ import React from 'react';
|
||||||
import sdk from '../../../index';
|
import sdk from '../../../index';
|
||||||
import SdkConfig from '../../../SdkConfig';
|
import SdkConfig from '../../../SdkConfig';
|
||||||
import Modal from '../../../Modal';
|
import Modal from '../../../Modal';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
|
|
||||||
export default React.createClass({
|
export default React.createClass({
|
||||||
|
@ -51,21 +52,21 @@ export default React.createClass({
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<BaseDialog className="mx_ErrorDialog" onFinished={this.props.onFinished}
|
<BaseDialog className="mx_ErrorDialog" onFinished={this.props.onFinished}
|
||||||
title='Unable to restore session'>
|
title={_t('Unable to restore session')}>
|
||||||
<div className="mx_Dialog_content">
|
<div className="mx_Dialog_content">
|
||||||
<p>We encountered an error trying to restore your previous session. If
|
<p>{_t("We encountered an error trying to restore your previous session. If " +
|
||||||
you continue, you will need to log in again, and encrypted chat
|
"you continue, you will need to log in again, and encrypted chat " +
|
||||||
history will be unreadable.</p>
|
"history will be unreadable.")}</p>
|
||||||
|
|
||||||
<p>If you have previously used a more recent version of Riot, your session
|
<p>{_t("If you have previously used a more recent version of Riot, your session " +
|
||||||
may be incompatible with this version. Close this window and return
|
"may be incompatible with this version. Close this window and return " +
|
||||||
to the more recent version.</p>
|
"to the more recent version.")}</p>
|
||||||
|
|
||||||
{bugreport}
|
{bugreport}
|
||||||
</div>
|
</div>
|
||||||
<div className="mx_Dialog_buttons">
|
<div className="mx_Dialog_buttons">
|
||||||
<button className="mx_Dialog_primary" onClick={this._continueClicked}>
|
<button className="mx_Dialog_primary" onClick={this._continueClicked}>
|
||||||
Continue anyway
|
{_t("Continue anyway")}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</BaseDialog>
|
</BaseDialog>
|
||||||
|
|
|
@ -64,11 +64,11 @@ export default React.createClass({
|
||||||
return (
|
return (
|
||||||
<BaseDialog className="mx_SetDisplayNameDialog"
|
<BaseDialog className="mx_SetDisplayNameDialog"
|
||||||
onFinished={this.props.onFinished}
|
onFinished={this.props.onFinished}
|
||||||
title="Set a Display Name"
|
title={_t("Set a Display Name")}
|
||||||
>
|
>
|
||||||
<div className="mx_Dialog_content">
|
<div className="mx_Dialog_content">
|
||||||
Your display name is how you'll appear to others when you speak in rooms.<br/>
|
{_t("Your display name is how you'll appear to others when you speak in rooms. " +
|
||||||
What would you like it to be?
|
"What would you like it to be?")}
|
||||||
</div>
|
</div>
|
||||||
<form onSubmit={this.onFormSubmit}>
|
<form onSubmit={this.onFormSubmit}>
|
||||||
<div className="mx_Dialog_content">
|
<div className="mx_Dialog_content">
|
||||||
|
|
|
@ -20,6 +20,7 @@ import dis from '../../../dispatcher';
|
||||||
import MatrixClientPeg from '../../../MatrixClientPeg';
|
import MatrixClientPeg from '../../../MatrixClientPeg';
|
||||||
import GeminiScrollbar from 'react-gemini-scrollbar';
|
import GeminiScrollbar from 'react-gemini-scrollbar';
|
||||||
import Resend from '../../../Resend';
|
import Resend from '../../../Resend';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
function DeviceListEntry(props) {
|
function DeviceListEntry(props) {
|
||||||
const {userId, device} = props;
|
const {userId, device} = props;
|
||||||
|
@ -120,17 +121,17 @@ export default React.createClass({
|
||||||
if (blacklistUnverified) {
|
if (blacklistUnverified) {
|
||||||
warning = (
|
warning = (
|
||||||
<h4>
|
<h4>
|
||||||
You are currently blacklisting unverified devices; to send
|
{_t("You are currently blacklisting unverified devices; to send " +
|
||||||
messages to these devices you must verify them.
|
"messages to these devices you must verify them.")}
|
||||||
</h4>
|
</h4>
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
warning = (
|
warning = (
|
||||||
<div>
|
<div>
|
||||||
<p>
|
<p>
|
||||||
We recommend you go through the verification process
|
{_t("We recommend you go through the verification process " +
|
||||||
for each device to confirm they belong to their legitimate owner,
|
"for each device to confirm they belong to their legitimate owner, " +
|
||||||
but you can resend the message without verifying if you prefer.
|
"but you can resend the message without verifying if you prefer.")}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -149,10 +150,10 @@ export default React.createClass({
|
||||||
>
|
>
|
||||||
<GeminiScrollbar autoshow={false} className="mx_Dialog_content">
|
<GeminiScrollbar autoshow={false} className="mx_Dialog_content">
|
||||||
<h4>
|
<h4>
|
||||||
"{this.props.room.name}" contains devices that you haven't seen before.
|
{_t('"%(RoomName)s" contains devices that you haven\'t seen before.', {RoomName: this.props.room.name})}
|
||||||
</h4>
|
</h4>
|
||||||
{ warning }
|
{ warning }
|
||||||
Unknown devices:
|
{_t("Unknown devices")}:
|
||||||
|
|
||||||
<UnknownDeviceList devices={this.props.devices} />
|
<UnknownDeviceList devices={this.props.devices} />
|
||||||
</GeminiScrollbar>
|
</GeminiScrollbar>
|
||||||
|
|
|
@ -16,12 +16,13 @@ limitations under the License.
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var React = require('react');
|
import React from 'react';
|
||||||
var classNames = require('classnames');
|
import classNames from 'classnames';
|
||||||
var sdk = require("../../../index");
|
import sdk from "../../../index";
|
||||||
var Invite = require("../../../Invite");
|
import Invite from "../../../Invite";
|
||||||
var MatrixClientPeg = require("../../../MatrixClientPeg");
|
import MatrixClientPeg from "../../../MatrixClientPeg";
|
||||||
var Avatar = require('../../../Avatar');
|
import Avatar from '../../../Avatar';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
// React PropType definition for an object describing
|
// React PropType definition for an object describing
|
||||||
// an address that can be invited to a room (which
|
// an address that can be invited to a room (which
|
||||||
|
@ -142,7 +143,7 @@ export default React.createClass({
|
||||||
});
|
});
|
||||||
|
|
||||||
info = (
|
info = (
|
||||||
<div className={unknownClasses}>Unknown Address</div>
|
<div className={unknownClasses}>{_t("Unknown Address")}</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ import React from 'react';
|
||||||
import MatrixClientPeg from '../../../MatrixClientPeg';
|
import MatrixClientPeg from '../../../MatrixClientPeg';
|
||||||
import sdk from '../../../index';
|
import sdk from '../../../index';
|
||||||
import Modal from '../../../Modal';
|
import Modal from '../../../Modal';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
export default React.createClass({
|
export default React.createClass({
|
||||||
displayName: 'DeviceVerifyButtons',
|
displayName: 'DeviceVerifyButtons',
|
||||||
|
@ -82,14 +83,14 @@ export default React.createClass({
|
||||||
blacklistButton = (
|
blacklistButton = (
|
||||||
<button className="mx_MemberDeviceInfo_textButton mx_MemberDeviceInfo_unblacklist"
|
<button className="mx_MemberDeviceInfo_textButton mx_MemberDeviceInfo_unblacklist"
|
||||||
onClick={this.onUnblacklistClick}>
|
onClick={this.onUnblacklistClick}>
|
||||||
Unblacklist
|
{_t("Unblacklist")}
|
||||||
</button>
|
</button>
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
blacklistButton = (
|
blacklistButton = (
|
||||||
<button className="mx_MemberDeviceInfo_textButton mx_MemberDeviceInfo_blacklist"
|
<button className="mx_MemberDeviceInfo_textButton mx_MemberDeviceInfo_blacklist"
|
||||||
onClick={this.onBlacklistClick}>
|
onClick={this.onBlacklistClick}>
|
||||||
Blacklist
|
{_t("Blacklist")}
|
||||||
</button>
|
</button>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -98,14 +99,14 @@ export default React.createClass({
|
||||||
verifyButton = (
|
verifyButton = (
|
||||||
<button className="mx_MemberDeviceInfo_textButton mx_MemberDeviceInfo_unverify"
|
<button className="mx_MemberDeviceInfo_textButton mx_MemberDeviceInfo_unverify"
|
||||||
onClick={this.onUnverifyClick}>
|
onClick={this.onUnverifyClick}>
|
||||||
Unverify
|
{_t("Unverify")}
|
||||||
</button>
|
</button>
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
verifyButton = (
|
verifyButton = (
|
||||||
<button className="mx_MemberDeviceInfo_textButton mx_MemberDeviceInfo_verify"
|
<button className="mx_MemberDeviceInfo_textButton mx_MemberDeviceInfo_verify"
|
||||||
onClick={this.onVerifyClick}>
|
onClick={this.onVerifyClick}>
|
||||||
Verify...
|
{_t("Verify...")}
|
||||||
</button>
|
</button>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ limitations under the License.
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import classnames from 'classnames';
|
import classnames from 'classnames';
|
||||||
import AccessibleButton from './AccessibleButton';
|
import AccessibleButton from './AccessibleButton';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
class MenuOption extends React.Component {
|
class MenuOption extends React.Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
|
@ -255,7 +256,7 @@ export default class Dropdown extends React.Component {
|
||||||
});
|
});
|
||||||
if (options.length === 0) {
|
if (options.length === 0) {
|
||||||
return [<div key="0" className="mx_Dropdown_option">
|
return [<div key="0" className="mx_Dropdown_option">
|
||||||
No results
|
{_t("No results")}
|
||||||
</div>];
|
</div>];
|
||||||
}
|
}
|
||||||
return options;
|
return options;
|
||||||
|
|
|
@ -16,7 +16,8 @@ limitations under the License.
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var React = require('react');
|
import React from 'react';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
displayName: 'UserSelector',
|
displayName: 'UserSelector',
|
||||||
|
@ -59,9 +60,9 @@ module.exports = React.createClass({
|
||||||
return <li key={user_id}>{user_id} - <span onClick={function() {self.removeUser(user_id);}}>X</span></li>;
|
return <li key={user_id}>{user_id} - <span onClick={function() {self.removeUser(user_id);}}>X</span></li>;
|
||||||
})}
|
})}
|
||||||
</ul>
|
</ul>
|
||||||
<input type="text" ref="user_id_input" defaultValue="" className="mx_UserSelector_userIdInput" placeholder="ex. @bob:example.com"/>
|
<input type="text" ref="user_id_input" defaultValue="" className="mx_UserSelector_userIdInput" placeholder={_t("ex. @bob:example.com")}/>
|
||||||
<button onClick={this.onAddUserId} className="mx_UserSelector_AddUserId">
|
<button onClick={this.onAddUserId} className="mx_UserSelector_AddUserId">
|
||||||
Add User
|
{_t("Add User")}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -16,7 +16,9 @@ limitations under the License.
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var React = require('react');
|
import React from 'react';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
var DIV_ID = 'mx_recaptcha';
|
var DIV_ID = 'mx_recaptcha';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -117,7 +119,7 @@ module.exports = React.createClass({
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div ref="recaptchaContainer">
|
<div ref="recaptchaContainer">
|
||||||
This Home Server would like to make sure you are not a robot
|
{_t("This Home Server would like to make sure you are not a robot")}
|
||||||
<br/>
|
<br/>
|
||||||
<div id={DIV_ID}></div>
|
<div id={DIV_ID}></div>
|
||||||
{error}
|
{error}
|
||||||
|
|
|
@ -16,7 +16,8 @@ limitations under the License.
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var React = require('react');
|
import React from 'react';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
displayName: 'CasLogin',
|
displayName: 'CasLogin',
|
||||||
|
@ -28,7 +29,7 @@ module.exports = React.createClass({
|
||||||
render: function() {
|
render: function() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<button onClick={this.props.onSubmit}>Sign in with CAS</button>
|
<button onClick={this.props.onSubmit}>{_t("Sign in with CAS")}</button>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,8 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var React = require("react");
|
import React from 'react';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
displayName: 'CustomServerDialog',
|
displayName: 'CustomServerDialog',
|
||||||
|
@ -23,24 +24,24 @@ module.exports = React.createClass({
|
||||||
return (
|
return (
|
||||||
<div className="mx_ErrorDialog">
|
<div className="mx_ErrorDialog">
|
||||||
<div className="mx_Dialog_title">
|
<div className="mx_Dialog_title">
|
||||||
Custom Server Options
|
{_t("Custom Server Options")}
|
||||||
</div>
|
</div>
|
||||||
<div className="mx_Dialog_content">
|
<div className="mx_Dialog_content">
|
||||||
<span>
|
<span>
|
||||||
You can use the custom server options to sign into other Matrix
|
{_t("You can use the custom server options to sign into other Matrix " +
|
||||||
servers by specifying a different Home server URL.
|
"servers by specifying a different Home server URL.")}
|
||||||
<br/>
|
<br/>
|
||||||
This allows you to use this app with an existing Matrix account on
|
{_t("This allows you to use this app with an existing Matrix account on " +
|
||||||
a different home server.
|
"a different home server.")}
|
||||||
<br/>
|
<br/>
|
||||||
<br/>
|
<br/>
|
||||||
You can also set a custom identity server but this will typically prevent
|
{_t("You can also set a custom identity server but this will typically prevent " +
|
||||||
interaction with users based on email address.
|
"interaction with users based on email address.")}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="mx_Dialog_buttons">
|
<div className="mx_Dialog_buttons">
|
||||||
<button onClick={this.props.onFinished} autoFocus={true}>
|
<button onClick={this.props.onFinished} autoFocus={true}>
|
||||||
Dismiss
|
{_t("Dismiss")}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -20,6 +20,7 @@ import url from 'url';
|
||||||
import classnames from 'classnames';
|
import classnames from 'classnames';
|
||||||
|
|
||||||
import sdk from '../../../index';
|
import sdk from '../../../index';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
/* This file contains a collection of components which are used by the
|
/* This file contains a collection of components which are used by the
|
||||||
* InteractiveAuth to prompt the user to enter the information needed
|
* InteractiveAuth to prompt the user to enter the information needed
|
||||||
|
@ -255,8 +256,8 @@ export const EmailIdentityAuthEntry = React.createClass({
|
||||||
} else {
|
} else {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<p>An email has been sent to <i>{this.props.inputs.emailAddress}</i></p>
|
<p>{_t("An email has been sent to")} <i>{this.props.inputs.emailAddress}</i></p>
|
||||||
<p>Please check your email to continue registration.</p>
|
<p>{_t("Please check your email to continue registration.")}</p>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -348,7 +349,7 @@ export const MsisdnAuthEntry = React.createClass({
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this.setState({
|
this.setState({
|
||||||
errorText: "Token incorrect",
|
errorText: _t("Token incorrect"),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}).catch((e) => {
|
}).catch((e) => {
|
||||||
|
@ -369,8 +370,8 @@ export const MsisdnAuthEntry = React.createClass({
|
||||||
});
|
});
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<p>A text message has been sent to +<i>{this._msisdn}</i></p>
|
<p>{_t("A text message has been sent to")} +<i>{this._msisdn}</i></p>
|
||||||
<p>Please enter the code it contains:</p>
|
<p>{_t("Please enter the code it contains:")}</p>
|
||||||
<div className="mx_InteractiveAuthEntryComponents_msisdnWrapper">
|
<div className="mx_InteractiveAuthEntryComponents_msisdnWrapper">
|
||||||
<form onSubmit={this._onFormSubmit}>
|
<form onSubmit={this._onFormSubmit}>
|
||||||
<input type="text"
|
<input type="text"
|
||||||
|
|
|
@ -16,7 +16,7 @@ limitations under the License.
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var React = require('react');
|
import React from 'react';
|
||||||
|
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
displayName: 'LoginFooter',
|
displayName: 'LoginFooter',
|
||||||
|
@ -24,7 +24,7 @@ module.exports = React.createClass({
|
||||||
render: function() {
|
render: function() {
|
||||||
return (
|
return (
|
||||||
<div className="mx_Login_links">
|
<div className="mx_Login_links">
|
||||||
<a href="https://matrix.org">powered by Matrix</a>
|
<a href="https://matrix.org">{_t("powered by Matrix")}</a>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ import sdk from '../../../index';
|
||||||
import Email from '../../../email';
|
import Email from '../../../email';
|
||||||
import { looksValid as phoneNumberLooksValid } from '../../../phonenumber';
|
import { looksValid as phoneNumberLooksValid } from '../../../phonenumber';
|
||||||
import Modal from '../../../Modal';
|
import Modal from '../../../Modal';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
const FIELD_EMAIL = 'field_email';
|
const FIELD_EMAIL = 'field_email';
|
||||||
const FIELD_PHONE_COUNTRY = 'field_phone_country';
|
const FIELD_PHONE_COUNTRY = 'field_phone_country';
|
||||||
|
@ -103,10 +104,10 @@ module.exports = React.createClass({
|
||||||
title: "Warning!",
|
title: "Warning!",
|
||||||
description:
|
description:
|
||||||
<div>
|
<div>
|
||||||
If you don't specify an email address, you won't be able to reset your password.<br/>
|
{_t("If you don't specify an email address, you won't be able to reset your password. " +
|
||||||
Are you sure?
|
"Are you sure?")}
|
||||||
</div>,
|
</div>,
|
||||||
button: "Continue",
|
button: _t("Continue"),
|
||||||
onFinished: function(confirmed) {
|
onFinished: function(confirmed) {
|
||||||
if (confirmed) {
|
if (confirmed) {
|
||||||
self._doSubmit();
|
self._doSubmit();
|
||||||
|
@ -304,7 +305,7 @@ module.exports = React.createClass({
|
||||||
} else if (this.state.selectedTeam) {
|
} else if (this.state.selectedTeam) {
|
||||||
belowEmailSection = (
|
belowEmailSection = (
|
||||||
<p className="mx_Login_support">
|
<p className="mx_Login_support">
|
||||||
You are registering with {this.state.selectedTeam.name}
|
{_t("You are registering with %(SelectedTeamName)s", {SelectedTeamName: this.state.selectedTeam.name})}
|
||||||
</p>
|
</p>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ limitations under the License.
|
||||||
var React = require('react');
|
var React = require('react');
|
||||||
var Modal = require('../../../Modal');
|
var Modal = require('../../../Modal');
|
||||||
var sdk = require('../../../index');
|
var sdk = require('../../../index');
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A pure UI component which displays the HS and IS to use.
|
* A pure UI component which displays the HS and IS to use.
|
||||||
|
@ -136,14 +137,14 @@ module.exports = React.createClass({
|
||||||
checked={!this.state.configVisible}
|
checked={!this.state.configVisible}
|
||||||
onChange={this.onServerConfigVisibleChange.bind(this, false)} />
|
onChange={this.onServerConfigVisibleChange.bind(this, false)} />
|
||||||
<label className="mx_Login_label" htmlFor="basic">
|
<label className="mx_Login_label" htmlFor="basic">
|
||||||
Default server
|
{_t("Default server")}
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<input className="mx_Login_radio" id="advanced" name="configVisible" type="radio"
|
<input className="mx_Login_radio" id="advanced" name="configVisible" type="radio"
|
||||||
checked={this.state.configVisible}
|
checked={this.state.configVisible}
|
||||||
onChange={this.onServerConfigVisibleChange.bind(this, true)} />
|
onChange={this.onServerConfigVisibleChange.bind(this, true)} />
|
||||||
<label className="mx_Login_label" htmlFor="advanced">
|
<label className="mx_Login_label" htmlFor="advanced">
|
||||||
Custom server
|
{_t("Custom server")}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -155,7 +156,7 @@ module.exports = React.createClass({
|
||||||
<div style={serverConfigStyle}>
|
<div style={serverConfigStyle}>
|
||||||
<div className="mx_ServerConfig">
|
<div className="mx_ServerConfig">
|
||||||
<label className="mx_Login_label mx_ServerConfig_hslabel" htmlFor="hsurl">
|
<label className="mx_Login_label mx_ServerConfig_hslabel" htmlFor="hsurl">
|
||||||
Home server URL
|
{_t("Home server URL")}
|
||||||
</label>
|
</label>
|
||||||
<input className="mx_Login_field" id="hsurl" type="text"
|
<input className="mx_Login_field" id="hsurl" type="text"
|
||||||
placeholder={this.props.defaultHsUrl}
|
placeholder={this.props.defaultHsUrl}
|
||||||
|
@ -163,7 +164,7 @@ module.exports = React.createClass({
|
||||||
value={this.state.hs_url}
|
value={this.state.hs_url}
|
||||||
onChange={this.onHomeserverChanged} />
|
onChange={this.onHomeserverChanged} />
|
||||||
<label className="mx_Login_label mx_ServerConfig_islabel" htmlFor="isurl">
|
<label className="mx_Login_label mx_ServerConfig_islabel" htmlFor="isurl">
|
||||||
Identity server URL
|
{_t("Identity server URL")}
|
||||||
</label>
|
</label>
|
||||||
<input className="mx_Login_field" id="isurl" type="text"
|
<input className="mx_Login_field" id="isurl" type="text"
|
||||||
placeholder={this.props.defaultIsUrl}
|
placeholder={this.props.defaultIsUrl}
|
||||||
|
@ -171,7 +172,7 @@ module.exports = React.createClass({
|
||||||
value={this.state.is_url}
|
value={this.state.is_url}
|
||||||
onChange={this.onIdentityServerChanged} />
|
onChange={this.onIdentityServerChanged} />
|
||||||
<a className="mx_ServerConfig_help" href="#" onClick={this.showHelpPopup}>
|
<a className="mx_ServerConfig_help" href="#" onClick={this.showHelpPopup}>
|
||||||
What does this mean?
|
{_t("What does this mean?")}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -22,6 +22,7 @@ import MFileBody from './MFileBody';
|
||||||
import MatrixClientPeg from '../../../MatrixClientPeg';
|
import MatrixClientPeg from '../../../MatrixClientPeg';
|
||||||
import sdk from '../../../index';
|
import sdk from '../../../index';
|
||||||
import { decryptFile, readBlobAsDataUri } from '../../../utils/DecryptFile';
|
import { decryptFile, readBlobAsDataUri } from '../../../utils/DecryptFile';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
export default class MAudioBody extends React.Component {
|
export default class MAudioBody extends React.Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
|
@ -77,7 +78,7 @@ export default class MAudioBody extends React.Component {
|
||||||
return (
|
return (
|
||||||
<span className="mx_MAudioBody" ref="body">
|
<span className="mx_MAudioBody" ref="body">
|
||||||
<img src="img/warning.svg" width="16" height="16"/>
|
<img src="img/warning.svg" width="16" height="16"/>
|
||||||
Error decrypting audio
|
{_t("Error decrypting audio")}
|
||||||
</span>
|
</span>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ import dis from '../../../dispatcher';
|
||||||
import { decryptFile, readBlobAsDataUri } from '../../../utils/DecryptFile';
|
import { decryptFile, readBlobAsDataUri } from '../../../utils/DecryptFile';
|
||||||
import q from 'q';
|
import q from 'q';
|
||||||
import UserSettingsStore from '../../../UserSettingsStore';
|
import UserSettingsStore from '../../../UserSettingsStore';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
displayName: 'MImageBody',
|
displayName: 'MImageBody',
|
||||||
|
@ -56,7 +57,7 @@ module.exports = React.createClass({
|
||||||
const ImageView = sdk.getComponent("elements.ImageView");
|
const ImageView = sdk.getComponent("elements.ImageView");
|
||||||
const params = {
|
const params = {
|
||||||
src: httpUrl,
|
src: httpUrl,
|
||||||
name: content.body && content.body.length > 0 ? content.body : 'Attachment',
|
name: content.body && content.body.length > 0 ? content.body : _t('Attachment'),
|
||||||
mxEvent: this.props.mxEvent,
|
mxEvent: this.props.mxEvent,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -191,7 +192,7 @@ module.exports = React.createClass({
|
||||||
return (
|
return (
|
||||||
<span className="mx_MImageBody" ref="body">
|
<span className="mx_MImageBody" ref="body">
|
||||||
<img src="img/warning.svg" width="16" height="16"/>
|
<img src="img/warning.svg" width="16" height="16"/>
|
||||||
Error decrypting image
|
{_t("Error decrypting image")}
|
||||||
</span>
|
</span>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -238,13 +239,13 @@ module.exports = React.createClass({
|
||||||
} else if (content.body) {
|
} else if (content.body) {
|
||||||
return (
|
return (
|
||||||
<span className="mx_MImageBody">
|
<span className="mx_MImageBody">
|
||||||
Image '{content.body}' cannot be displayed.
|
{_t("Image '%(Body)s' cannot be displayed.", {Body: content.body})}
|
||||||
</span>
|
</span>
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return (
|
return (
|
||||||
<span className="mx_MImageBody">
|
<span className="mx_MImageBody">
|
||||||
This image cannot be displayed.
|
{_t("This image cannot be displayed.")}
|
||||||
</span>
|
</span>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ import sdk from '../../../index';
|
||||||
import { decryptFile, readBlobAsDataUri } from '../../../utils/DecryptFile';
|
import { decryptFile, readBlobAsDataUri } from '../../../utils/DecryptFile';
|
||||||
import q from 'q';
|
import q from 'q';
|
||||||
import UserSettingsStore from '../../../UserSettingsStore';
|
import UserSettingsStore from '../../../UserSettingsStore';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
displayName: 'MVideoBody',
|
displayName: 'MVideoBody',
|
||||||
|
@ -128,7 +129,7 @@ module.exports = React.createClass({
|
||||||
return (
|
return (
|
||||||
<span className="mx_MVideoBody" ref="body">
|
<span className="mx_MVideoBody" ref="body">
|
||||||
<img src="img/warning.svg" width="16" height="16"/>
|
<img src="img/warning.svg" width="16" height="16"/>
|
||||||
Error decrypting video
|
{_t("Error decrypting video")}
|
||||||
</span>
|
</span>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ import ScalarAuthClient from '../../../ScalarAuthClient';
|
||||||
import Modal from '../../../Modal';
|
import Modal from '../../../Modal';
|
||||||
import SdkConfig from '../../../SdkConfig';
|
import SdkConfig from '../../../SdkConfig';
|
||||||
import dis from '../../../dispatcher';
|
import dis from '../../../dispatcher';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
linkifyMatrix(linkify);
|
linkifyMatrix(linkify);
|
||||||
|
|
||||||
|
@ -230,14 +231,14 @@ module.exports = React.createClass({
|
||||||
let QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
|
let QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
|
||||||
let integrationsUrl = SdkConfig.get().integrations_ui_url;
|
let integrationsUrl = SdkConfig.get().integrations_ui_url;
|
||||||
Modal.createDialog(QuestionDialog, {
|
Modal.createDialog(QuestionDialog, {
|
||||||
title: "Add an Integration",
|
title: _t("Add an Integration"),
|
||||||
description:
|
description:
|
||||||
<div>
|
<div>
|
||||||
You are about to be taken to a third-party site so you can
|
{_t("You are about to be taken to a third-party site so you can " +
|
||||||
authenticate your account for use with {integrationsUrl}.<br/>
|
"authenticate your account for use with {integrationsUrl}. " +
|
||||||
Do you wish to continue?
|
"Do you wish to continue?")}
|
||||||
</div>,
|
</div>,
|
||||||
button: "Continue",
|
button: _t("Continue"),
|
||||||
onFinished: function(confirmed) {
|
onFinished: function(confirmed) {
|
||||||
if (!confirmed) {
|
if (!confirmed) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -16,7 +16,8 @@ limitations under the License.
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var React = require('react');
|
import React from 'react';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
displayName: 'UnknownBody',
|
displayName: 'UnknownBody',
|
||||||
|
@ -24,7 +25,7 @@ module.exports = React.createClass({
|
||||||
render: function() {
|
render: function() {
|
||||||
const text = this.props.mxEvent.getContent().body;
|
const text = this.props.mxEvent.getContent().body;
|
||||||
return (
|
return (
|
||||||
<span className="mx_UnknownBody" title="Removed or unknown message type">
|
<span className="mx_UnknownBody" title={_t("Removed or unknown message type")}>
|
||||||
{text}
|
{text}
|
||||||
</span>
|
</span>
|
||||||
);
|
);
|
||||||
|
|
|
@ -20,6 +20,7 @@ var MatrixClientPeg = require('../../../MatrixClientPeg');
|
||||||
var sdk = require("../../../index");
|
var sdk = require("../../../index");
|
||||||
var Modal = require("../../../Modal");
|
var Modal = require("../../../Modal");
|
||||||
var UserSettingsStore = require('../../../UserSettingsStore');
|
var UserSettingsStore = require('../../../UserSettingsStore');
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
|
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
|
@ -120,19 +121,19 @@ module.exports = React.createClass({
|
||||||
<input type="checkbox" ref="globalDisableUrlPreview"
|
<input type="checkbox" ref="globalDisableUrlPreview"
|
||||||
onChange={ this.onGlobalDisableUrlPreviewChange }
|
onChange={ this.onGlobalDisableUrlPreviewChange }
|
||||||
checked={ this.state.globalDisableUrlPreview } />
|
checked={ this.state.globalDisableUrlPreview } />
|
||||||
Disable URL previews by default for participants in this room
|
{_t("Disable URL previews by default for participants in this room")}
|
||||||
</label>;
|
</label>;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
disableRoomPreviewUrls =
|
disableRoomPreviewUrls =
|
||||||
<label>
|
<label>
|
||||||
URL previews are { this.state.globalDisableUrlPreview ? "disabled" : "enabled" } by default for participants in this room.
|
{_t("URL previews are %(globalDisableUrlPreview)s by default for participants in this room.", {globalDisableUrlPreview: this.state.globalDisableUrlPreview ? _t("disabled") : _t("enabled")})}
|
||||||
</label>;
|
</label>;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="mx_RoomSettings_toggles">
|
<div className="mx_RoomSettings_toggles">
|
||||||
<h3>URL Previews</h3>
|
<h3>{_t("URL Previews")}</h3>
|
||||||
|
|
||||||
<label>
|
<label>
|
||||||
You have <a href="#/settings">{ UserSettingsStore.getUrlPreviewsDisabled() ? 'disabled' : 'enabled' }</a> URL previews by default.
|
You have <a href="#/settings">{ UserSettingsStore.getUrlPreviewsDisabled() ? 'disabled' : 'enabled' }</a> URL previews by default.
|
||||||
|
@ -142,13 +143,13 @@ module.exports = React.createClass({
|
||||||
<input type="checkbox" ref="userEnableUrlPreview"
|
<input type="checkbox" ref="userEnableUrlPreview"
|
||||||
onChange={ this.onUserEnableUrlPreviewChange }
|
onChange={ this.onUserEnableUrlPreviewChange }
|
||||||
checked={ this.state.userEnableUrlPreview } />
|
checked={ this.state.userEnableUrlPreview } />
|
||||||
Enable URL previews for this room (affects only you)
|
{_t("Enable URL previews for this room (affects only you)")}
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<input type="checkbox" ref="userDisableUrlPreview"
|
<input type="checkbox" ref="userDisableUrlPreview"
|
||||||
onChange={ this.onUserDisableUrlPreviewChange }
|
onChange={ this.onUserDisableUrlPreviewChange }
|
||||||
checked={ this.state.userDisableUrlPreview } />
|
checked={ this.state.userDisableUrlPreview } />
|
||||||
Disable URL previews for this room (affects only you)
|
{_t("Disable URL previews for this room (affects only you)")}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -14,11 +14,13 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var React = require('react');
|
import React from 'react';
|
||||||
var MatrixClientPeg = require("../../../MatrixClientPeg");
|
import MatrixClientPeg from "../../../MatrixClientPeg";
|
||||||
var sdk = require('../../../index');
|
import sdk from '../../../index';
|
||||||
var dis = require("../../../dispatcher");
|
import dis from "../../../dispatcher";
|
||||||
var ObjectUtils = require('../../../ObjectUtils');
|
import ObjectUtils from '../../../ObjectUtils';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
|
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
displayName: 'AuxPanel',
|
displayName: 'AuxPanel',
|
||||||
|
@ -79,7 +81,7 @@ module.exports = React.createClass({
|
||||||
title="Drop File Here">
|
title="Drop File Here">
|
||||||
<TintableSvg src="img/upload-big.svg" width="45" height="59"/>
|
<TintableSvg src="img/upload-big.svg" width="45" height="59"/>
|
||||||
<br/>
|
<br/>
|
||||||
Drop file here to upload
|
{_t("Drop file here to upload")}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -89,7 +91,7 @@ module.exports = React.createClass({
|
||||||
if (this.props.displayConfCallNotification) {
|
if (this.props.displayConfCallNotification) {
|
||||||
var supportedText, joinText;
|
var supportedText, joinText;
|
||||||
if (!MatrixClientPeg.get().supportsVoip()) {
|
if (!MatrixClientPeg.get().supportsVoip()) {
|
||||||
supportedText = " (unsupported)";
|
supportedText = _t(" (unsupported)");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
joinText = (<span>
|
joinText = (<span>
|
||||||
|
@ -101,7 +103,7 @@ module.exports = React.createClass({
|
||||||
}
|
}
|
||||||
conferenceCallNotification = (
|
conferenceCallNotification = (
|
||||||
<div className="mx_RoomView_ongoingConfCallNotification">
|
<div className="mx_RoomView_ongoingConfCallNotification">
|
||||||
Ongoing conference call{ supportedText }. { joinText }
|
{_t("Ongoing conference call%(supportedText)s. %(joinText)s", {supportedText: supportedText, joinText: joinText})}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,7 +121,7 @@ export default class MessageComposer extends React.Component {
|
||||||
title: _t('Upload Files'),
|
title: _t('Upload Files'),
|
||||||
description: (
|
description: (
|
||||||
<div>
|
<div>
|
||||||
<p>{ _t('Are you sure you want upload the following files?') }</p>
|
<p>{ _t('Are you sure you want to upload the following files?') }</p>
|
||||||
<ul style={{listStyle: 'none', textAlign: 'left'}}>
|
<ul style={{listStyle: 'none', textAlign: 'left'}}>
|
||||||
{fileList}
|
{fileList}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -16,10 +16,12 @@ limitations under the License.
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var React = require('react');
|
import React from 'react';
|
||||||
|
|
||||||
|
import MatrixClientPeg from '../../../MatrixClientPeg';
|
||||||
|
import sdk from '../../../index';
|
||||||
|
import { _t } from '../../../languageHandler';
|
||||||
|
|
||||||
var MatrixClientPeg = require('../../../MatrixClientPeg');
|
|
||||||
var sdk = require('../../../index');
|
|
||||||
|
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
displayName: 'PresenceLabel',
|
displayName: 'PresenceLabel',
|
||||||
|
@ -67,9 +69,9 @@ module.exports = React.createClass({
|
||||||
},
|
},
|
||||||
|
|
||||||
getPrettyPresence: function(presence) {
|
getPrettyPresence: function(presence) {
|
||||||
if (presence === "online") return "Online";
|
if (presence === "online") return _t("Online");
|
||||||
if (presence === "unavailable") return "Idle"; // XXX: is this actually right?
|
if (presence === "unavailable") return _t("Idle"); // XXX: is this actually right?
|
||||||
if (presence === "offline") return "Offline";
|
if (presence === "offline") return _t("Offline");
|
||||||
return "Unknown";
|
return "Unknown";
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -69,7 +69,7 @@
|
||||||
"Anyone who knows the room's link, including guests": "Alle der kender link til rummet, inklusiv gæster",
|
"Anyone who knows the room's link, including guests": "Alle der kender link til rummet, inklusiv gæster",
|
||||||
"Are you sure you want to leave the room?": "Er du sikker på du vil forlade rummet?",
|
"Are you sure you want to leave the room?": "Er du sikker på du vil forlade rummet?",
|
||||||
"Are you sure you want to reject the invitation?": "Er du sikker på du vil afvise invitationen?",
|
"Are you sure you want to reject the invitation?": "Er du sikker på du vil afvise invitationen?",
|
||||||
"Are you sure you want upload the following files?": "Er du sikker på du vil sende de følgende filer?",
|
"Are you sure you want to upload the following files?": "Er du sikker på du vil sende de følgende filer?",
|
||||||
"banned": "bortvist",
|
"banned": "bortvist",
|
||||||
"Banned users": "Bortviste brugere",
|
"Banned users": "Bortviste brugere",
|
||||||
"Bug Report": "Fejlrapport",
|
"Bug Report": "Fejlrapport",
|
||||||
|
|
|
@ -64,7 +64,7 @@
|
||||||
"Anyone who knows the room's link, including guests": "Jeder der den Raum-Link kennt - auch Gäste",
|
"Anyone who knows the room's link, including guests": "Jeder der den Raum-Link kennt - auch Gäste",
|
||||||
"Are you sure you want to leave the room?": "Bist du sicher, dass du den Raum verlassen willst?",
|
"Are you sure you want to leave the room?": "Bist du sicher, dass du den Raum verlassen willst?",
|
||||||
"Are you sure you want to reject the invitation?": "Bist du sicher, dass die die Einladung ablehnen willst?",
|
"Are you sure you want to reject the invitation?": "Bist du sicher, dass die die Einladung ablehnen willst?",
|
||||||
"Are you sure you want upload the following files?": "Bist du sicher, dass du die folgenden Dateien hochladen willst?",
|
"Are you sure you want to upload the following files?": "Bist du sicher, dass du die folgenden Dateien hochladen willst?",
|
||||||
"banned": "gebannt",
|
"banned": "gebannt",
|
||||||
"Banned users": "Gebannte Nutzer",
|
"Banned users": "Gebannte Nutzer",
|
||||||
"Bug Report": "Fehlerbericht",
|
"Bug Report": "Fehlerbericht",
|
||||||
|
|
|
@ -155,7 +155,7 @@
|
||||||
"Anyone who knows the room's link, including guests": "Anyone who knows the room's link, including guests",
|
"Anyone who knows the room's link, including guests": "Anyone who knows the room's link, including guests",
|
||||||
"Are you sure?": "Are you sure?",
|
"Are you sure?": "Are you sure?",
|
||||||
"Are you sure you want to reject the invitation?": "Are you sure you want to reject the invitation?",
|
"Are you sure you want to reject the invitation?": "Are you sure you want to reject the invitation?",
|
||||||
"Are you sure you want upload the following files?": "Are you sure you want upload the following files?",
|
"Are you sure you want to upload the following files?": "Are you sure you want to upload the following files?",
|
||||||
"Attachment": "Attachment",
|
"Attachment": "Attachment",
|
||||||
"Autoplay GIFs and videos": "Autoplay GIFs and videos",
|
"Autoplay GIFs and videos": "Autoplay GIFs and videos",
|
||||||
"%(senderName)s banned %(targetName)s.": "%(senderName)s banned %(targetName)s.",
|
"%(senderName)s banned %(targetName)s.": "%(senderName)s banned %(targetName)s.",
|
||||||
|
@ -674,5 +674,90 @@
|
||||||
"%(oneUser)schanged their avatar %(repeats)s times": "%(oneUser)schanged their avatar %(repeats)s times",
|
"%(oneUser)schanged their avatar %(repeats)s times": "%(oneUser)schanged their avatar %(repeats)s times",
|
||||||
"%(severalUsers)schanged their avatar": "%(severalUsers)schanged their avatar",
|
"%(severalUsers)schanged their avatar": "%(severalUsers)schanged their avatar",
|
||||||
"%(oneUser)schanged their avatar": "%(oneUser)schanged their avatar",
|
"%(oneUser)schanged their avatar": "%(oneUser)schanged their avatar",
|
||||||
"Please select the destination room for this message": "Please select the destination room for this message"
|
"Please select the destination room for this message": "Please select the destination room for this message",
|
||||||
|
"Passphrases must match": "Passphrases must match",
|
||||||
|
"Passphrase must not be empty": "Passphrase must not be empty",
|
||||||
|
"Export room keys": "Export room keys",
|
||||||
|
"Enter passphrase": "Enter passphrase",
|
||||||
|
"Confirm passphrase": "Confirm passphrase",
|
||||||
|
"Import room keys": "Import room keys",
|
||||||
|
"File to import": "File to import",
|
||||||
|
"Enter passphrase": "Enter passphrase",
|
||||||
|
"This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.",
|
||||||
|
"The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.",
|
||||||
|
"This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.",
|
||||||
|
"The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.", "You must join the room to see its files": "You must join the room to see its files", "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.",
|
||||||
|
"Reject all %(invitedRooms)s invites": "Reject all %(invitedRooms)s invites",
|
||||||
|
"Start new Chat": "Start new Chat",
|
||||||
|
"Guest users can't invite users. Please register.": "Guest users can't invite users. Please register.",
|
||||||
|
"Failed to invite": "Failed to invite",
|
||||||
|
"Failed to invite user": "Failed to invite user",
|
||||||
|
"Failed to invite the following users to the %(roomName)s room:": "Failed to invite the following users to the %(roomName)s room:",
|
||||||
|
"Confirm Removal": "Confirm Removal",
|
||||||
|
"Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.",
|
||||||
|
"Unknown error": "Unknown error",
|
||||||
|
"Incorrect password": "Incorrect password",
|
||||||
|
"This will make your account permanently unusable. You will not be able to re-register the same user ID.": "This will make your account permanently unusable. You will not be able to re-register the same user ID.",
|
||||||
|
"This action is irreversible.": "This action is irreversible.",
|
||||||
|
"To continue, please enter your password.": "To continue, please enter your password.",
|
||||||
|
"To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:",
|
||||||
|
"Device name": "Device name",
|
||||||
|
"Device key": "Device key",
|
||||||
|
"If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.",
|
||||||
|
"In future this verification process will be more sophisticated.": "In future this verification process will be more sophisticated.",
|
||||||
|
"Verify device": "Verify device",
|
||||||
|
"I verify that the keys match": "I verify that the keys match",
|
||||||
|
"We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.": "We encountered an error trying to restore your previous session. If you continue, you will need to log in again, and encrypted chat history will be unreadable.",
|
||||||
|
"Unable to restore session": "Unable to restore session",
|
||||||
|
"If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.": "If you have previously used a more recent version of Riot, your session may be incompatible with this version. Close this window and return to the more recent version.",
|
||||||
|
"Continue anyway": "Continue anyway",
|
||||||
|
"Your display name is how you'll appear to others when you speak in rooms. What would you like it to be?": "Your display name is how you'll appear to others when you speak in rooms. What would you like it to be?",
|
||||||
|
"You are currently blacklisting unverified devices; to send messages to these devices you must verify them.": "You are currently blacklisting unverified devices; to send messages to these devices you must verify them.",
|
||||||
|
"We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.": "We recommend you go through the verification process for each device to confirm they belong to their legitimate owner, but you can resend the message without verifying if you prefer.",
|
||||||
|
"\"%(RoomName)s\" contains devices that you haven't seen before.": "\"%(RoomName)s\" contains devices that you haven't seen before.",
|
||||||
|
"Unknown devices": "Unknown devices",
|
||||||
|
"Unknown Address": "Unknown Address",
|
||||||
|
"Unblacklist": "Unblacklist",
|
||||||
|
"Blacklist": "Blacklist",
|
||||||
|
"Unverify": "Unverify",
|
||||||
|
"Verify...": "Verify...",
|
||||||
|
"ex. @bob:example.com": "ex. @bob:example.com",
|
||||||
|
"Add User": "Add User",
|
||||||
|
"This Home Server would like to make sure you are not a robot": "This Home Server would like to make sure you are not a robot",
|
||||||
|
"Sign in with CAS": "Sign in with CAS",
|
||||||
|
"Custom Server Options": "Custom Server Options",
|
||||||
|
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.",
|
||||||
|
"This allows you to use this app with an existing Matrix account on a different home server.": "This allows you to use this app with an existing Matrix account on a different home server.",
|
||||||
|
"You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "You can also set a custom identity server but this will typically prevent interaction with users based on email address.",
|
||||||
|
"Dismiss": "Dismiss",
|
||||||
|
"Please check your email to continue registration.": "Please check your email to continue registration.",
|
||||||
|
"Token incorrect": "Token incorrect",
|
||||||
|
"A text message has been sent to": "A text message has been sent to",
|
||||||
|
"Please enter the code it contains:": "Please enter the code it contains:",
|
||||||
|
"powered by Matrix": "powered by Matrix",
|
||||||
|
"If you don't specify an email address, you won't be able to reset your password. Are you sure?": "If you don't specify an email address, you won't be able to reset your password. Are you sure?",
|
||||||
|
"You are registering with %(SelectedTeamName)s": "You are registering with %(SelectedTeamName)s",
|
||||||
|
"Default server": "Default server",
|
||||||
|
"Custom server": "Custom server",
|
||||||
|
"Home server URL": "Home server URL",
|
||||||
|
"Identity server URL": "Identity server URL",
|
||||||
|
"What does this mean?": "What does this mean?",
|
||||||
|
"Error decrypting audio": "Error decrypting audio",
|
||||||
|
"Error decrypting image": "Error decrypting image",
|
||||||
|
"Image '%(Body)s' cannot be displayed.": "Image '%(Body)s' cannot be displayed.",
|
||||||
|
"This image cannot be displayed.": "This image cannot be displayed.",
|
||||||
|
"Error decrypting video": "Error decrypting video",
|
||||||
|
"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}. Do you wish to continue?": "You are about to be taken to a third-party site so you can authenticate your account for use with {integrationsUrl}. Do you wish to continue?",
|
||||||
|
"Removed or unknown message type": "Removed or unknown message type",
|
||||||
|
"Disable URL previews by default for participants in this room": "Disable URL previews by default for participants in this room",
|
||||||
|
"URL previews are %(globalDisableUrlPreview)s by default for participants in this room.": "URL previews are %(globalDisableUrlPreview)s by default for participants in this room.",
|
||||||
|
"URL Previews": "URL Previews",
|
||||||
|
"Enable URL previews for this room (affects only you)": "Enable URL previews for this room (affects only you)",
|
||||||
|
"Drop file here to upload": "Drop file here to upload",
|
||||||
|
" (unsupported)": " (unsupported)",
|
||||||
|
"Ongoing conference call%(supportedText)s. %(joinText)s": "Ongoing conference call%(supportedText)s. %(joinText)s",
|
||||||
|
"Online": "Online",
|
||||||
|
"Idle": "Idle",
|
||||||
|
"Offline": "Offline"
|
||||||
}
|
}
|
||||||
|
|
|
@ -199,7 +199,7 @@
|
||||||
"Anyone who knows the room's link, including guests": "Tout ceux qui connaissent le lien du salon, y compris les visiteurs",
|
"Anyone who knows the room's link, including guests": "Tout ceux qui connaissent le lien du salon, y compris les visiteurs",
|
||||||
"Are you sure?": "Êtes-vous sûr ?",
|
"Are you sure?": "Êtes-vous sûr ?",
|
||||||
"Are you sure you want to reject the invitation?": "Êtes-vous sûr de vouloir rejeter l'invitation ?",
|
"Are you sure you want to reject the invitation?": "Êtes-vous sûr de vouloir rejeter l'invitation ?",
|
||||||
"Are you sure you want upload the following files?": "Êtes-vous sûr de vouloir télécharger les fichiers suivants ?",
|
"Are you sure you want to upload the following files?": "Êtes-vous sûr de vouloir télécharger les fichiers suivants ?",
|
||||||
"Attachment": "Pièce jointe",
|
"Attachment": "Pièce jointe",
|
||||||
"Autoplay GIFs and videos": "Jouer automatiquement les GIFs et vidéos",
|
"Autoplay GIFs and videos": "Jouer automatiquement les GIFs et vidéos",
|
||||||
"%(senderName)s banned %(targetName)s.": "%(senderName)s a banni %(targetName)s.",
|
"%(senderName)s banned %(targetName)s.": "%(senderName)s a banni %(targetName)s.",
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
"Anyone who knows the room's link, including guests": "Qualquer pessoa que tenha o link da sala, incluindo visitantes",
|
"Anyone who knows the room's link, including guests": "Qualquer pessoa que tenha o link da sala, incluindo visitantes",
|
||||||
"Are you sure you want to leave the room?": "Você tem certeza que deseja sair da sala?",
|
"Are you sure you want to leave the room?": "Você tem certeza que deseja sair da sala?",
|
||||||
"Are you sure you want to reject the invitation?": "Você tem certeza que deseja rejeitar este convite?",
|
"Are you sure you want to reject the invitation?": "Você tem certeza que deseja rejeitar este convite?",
|
||||||
"Are you sure you want upload the following files?": "Você tem certeza que deseja enviar os seguintes arquivos?",
|
"Are you sure you want to upload the following files?": "Você tem certeza que deseja enviar os seguintes arquivos?",
|
||||||
"banned": "baniu",
|
"banned": "baniu",
|
||||||
"Banned users": "Usuárias/os banidas/os",
|
"Banned users": "Usuárias/os banidas/os",
|
||||||
"Bans user with given id": "Banir usuários com o identificador informado",
|
"Bans user with given id": "Banir usuários com o identificador informado",
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
"Anyone who knows the room's link, including guests": "Qualquer pessoa que tenha o link da sala, incluindo visitantes",
|
"Anyone who knows the room's link, including guests": "Qualquer pessoa que tenha o link da sala, incluindo visitantes",
|
||||||
"Are you sure you want to leave the room?": "Você tem certeza que deseja sair da sala?",
|
"Are you sure you want to leave the room?": "Você tem certeza que deseja sair da sala?",
|
||||||
"Are you sure you want to reject the invitation?": "Você tem certeza que deseja rejeitar este convite?",
|
"Are you sure you want to reject the invitation?": "Você tem certeza que deseja rejeitar este convite?",
|
||||||
"Are you sure you want upload the following files?": "Você tem certeza que deseja enviar os seguintes arquivos?",
|
"Are you sure you want to upload the following files?": "Você tem certeza que deseja enviar os seguintes arquivos?",
|
||||||
"banned": "baniu",
|
"banned": "baniu",
|
||||||
"Banned users": "Usuárias/os banidas/os",
|
"Banned users": "Usuárias/os banidas/os",
|
||||||
"Bans user with given id": "Banir usuários com o identificador informado",
|
"Bans user with given id": "Banir usuários com o identificador informado",
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
"Anyone who knows the room's link, apart from guests": "Любой, кто знает ссылку на комнату, кроме гостей",
|
"Anyone who knows the room's link, apart from guests": "Любой, кто знает ссылку на комнату, кроме гостей",
|
||||||
"Anyone who knows the room's link, including guests": "Любой, кто знает ссылку комнаты, включая гостей",
|
"Anyone who knows the room's link, including guests": "Любой, кто знает ссылку комнаты, включая гостей",
|
||||||
"Are you sure you want to reject the invitation?": "Вы уверены что вы хотите отклонить приглашение?",
|
"Are you sure you want to reject the invitation?": "Вы уверены что вы хотите отклонить приглашение?",
|
||||||
"Are you sure you want upload the following files?": "Вы уверены что вы хотите закачать следующий файл?",
|
"Are you sure you want to upload the following files?": "Вы уверены что вы хотите закачать следующий файл?",
|
||||||
"banned": "banned",
|
"banned": "banned",
|
||||||
"Banned users": "Запрещенный пользователь",
|
"Banned users": "Запрещенный пользователь",
|
||||||
"Bans user with given id": "Запретить пользователя с определенным id",
|
"Bans user with given id": "Запретить пользователя с определенным id",
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
"Anyone who knows the room's link, including guests": "任何知道房間連結的人,包括訪客",
|
"Anyone who knows the room's link, including guests": "任何知道房間連結的人,包括訪客",
|
||||||
"Are you sure?": "您確認嗎?",
|
"Are you sure?": "您確認嗎?",
|
||||||
"Are you sure you want to reject the invitation?": "您確認要謝絕邀請嗎?",
|
"Are you sure you want to reject the invitation?": "您確認要謝絕邀請嗎?",
|
||||||
"Are you sure you want upload the following files?": "您確認要上傳以下文件嗎?",
|
"Are you sure you want to upload the following files?": "您確認要上傳以下文件嗎?",
|
||||||
"Attachment": "附件",
|
"Attachment": "附件",
|
||||||
"Autoplay GIFs and videos": "自動播放GIF和影片",
|
"Autoplay GIFs and videos": "自動播放GIF和影片",
|
||||||
"%(senderName)s banned %(targetName)s.": "%(senderName)s 封禁了 %(targetName)s。",
|
"%(senderName)s banned %(targetName)s.": "%(senderName)s 封禁了 %(targetName)s。",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue