diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js
index c1b975e8e8..49f1a5c6f9 100644
--- a/src/ScalarMessaging.js
+++ b/src/ScalarMessaging.js
@@ -1,5 +1,6 @@
/*
Copyright 2016 OpenMarket Ltd
+Copyright 2017 Vector Creations Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -109,6 +110,76 @@ Example:
response: 78
}
+set_widget
+----------
+Set a new widget in the room. Clobbers based on the ID.
+
+Request:
+ - `room_id` (String) is the room to set the widget in.
+ - `widget_id` (String) is the ID of the widget to add (or replace if it already exists).
+ It can be an arbitrary UTF8 string and is purely for distinguishing between widgets.
+ - `url` (String) is the URL that clients should load in an iframe to run the widget.
+ All widgets must have a valid URL. If the URL is `null` (not `undefined`), the
+ widget will be removed from the room.
+ - `type` (String) is the type of widget, which is provided as a hint for matrix clients so they
+ can configure/lay out the widget in different ways. All widgets must have a type.
+ - `name` (String) is an optional human-readable string about the widget.
+ - `data` (Object) is some optional data about the widget, and can contain arbitrary key/value pairs.
+Response:
+{
+ success: true
+}
+Example:
+{
+ action: "set_widget",
+ room_id: "!foo:bar",
+ widget_id: "abc123",
+ url: "http://widget.url",
+ type: "example",
+ response: {
+ success: true
+ }
+}
+
+get_widgets
+-----------
+Get a list of all widgets in the room. The response is the `content` field
+of the state event.
+
+Request:
+ - `room_id` (String) is the room to get the widgets in.
+Response:
+{
+ $widget_id: {
+ type: "example",
+ url: "http://widget.url",
+ name: "Example Widget",
+ data: {
+ key: "val"
+ }
+ },
+ $widget_id: { ... }
+}
+Example:
+{
+ action: "get_widgets",
+ room_id: "!foo:bar",
+ widget_id: "abc123",
+ url: "http://widget.url",
+ type: "example",
+ response: {
+ $widget_id: {
+ type: "example",
+ url: "http://widget.url",
+ name: "Example Widget",
+ data: {
+ key: "val"
+ }
+ },
+ $widget_id: { ... }
+ }
+}
+
membership_state AND bot_options
--------------------------------
@@ -191,6 +262,84 @@ function inviteUser(event, roomId, userId) {
});
}
+function setWidget(event, roomId) {
+ const widgetId = event.data.widget_id;
+ const widgetType = event.data.type;
+ const widgetUrl = event.data.url;
+ const widgetName = event.data.name; // optional
+ const widgetData = event.data.data; // optional
+
+ const client = MatrixClientPeg.get();
+ if (!client) {
+ sendError(event, _t('You need to be logged in.'));
+ return;
+ }
+
+ // both adding/removing widgets need these checks
+ if (!widgetId || widgetUrl === undefined) {
+ sendError(event, _t("Unable to create widget."), new Error("Missing required widget fields."));
+ return;
+ }
+
+ if (widgetUrl !== null) { // if url is null it is being deleted, don't need to check name/type/etc
+ // check types of fields
+ if (widgetName !== undefined && typeof widgetName !== 'string') {
+ sendError(event, _t("Unable to create widget."), new Error("Optional field 'name' must be a string."));
+ return;
+ }
+ if (widgetData !== undefined && !(widgetData instanceof Object)) {
+ sendError(event, _t("Unable to create widget."), new Error("Optional field 'data' must be an Object."));
+ return;
+ }
+ if (typeof widgetType !== 'string') {
+ sendError(event, _t("Unable to create widget."), new Error("Field 'type' must be a string."));
+ return;
+ }
+ if (typeof widgetUrl !== 'string') {
+ sendError(event, _t("Unable to create widget."), new Error("Field 'url' must be a string or null."));
+ return;
+ }
+ }
+
+ // TODO: same dance we do for power levels. It'd be nice if the JS SDK had helper methods to do this.
+ client.getStateEvent(roomId, "im.vector.modular.widgets", "").then((widgets) => {
+ if (widgetUrl === null) {
+ delete widgets[widgetId];
+ }
+ else {
+ widgets[widgetId] = {
+ type: widgetType,
+ url: widgetUrl,
+ name: widgetName,
+ data: widgetData,
+ };
+ }
+ return client.sendStateEvent(roomId, "im.vector.modular.widgets", widgets);
+ }, (err) => {
+ if (err.errcode === "M_NOT_FOUND") {
+ return client.sendStateEvent(roomId, "im.vector.modular.widgets", {
+ [widgetId]: {
+ type: widgetType,
+ url: widgetUrl,
+ name: widgetName,
+ data: widgetData,
+ }
+ });
+ }
+ throw err;
+ }).done(() => {
+ sendResponse(event, {
+ success: true,
+ });
+ }, (err) => {
+ sendError(event, _t('Failed to send request.'), err);
+ });
+}
+
+function getWidgets(event, roomId) {
+ returnStateEvent(event, roomId, "im.vector.modular.widgets", "");
+}
+
function setPlumbingState(event, roomId, status) {
if (typeof status !== 'string') {
throw new Error('Plumbing state status should be a string');
@@ -367,7 +516,7 @@ const onMessage = function(event) {
return;
}
- // Getting join rules does not require userId
+ // These APIs don't require userId
if (event.data.action === "join_rules_state") {
getJoinRules(event, roomId);
return;
@@ -377,6 +526,12 @@ const onMessage = function(event) {
} else if (event.data.action === "get_membership_count") {
getMembershipCount(event, roomId);
return;
+ } else if (event.data.action === "set_widget") {
+ setWidget(event, roomId);
+ return;
+ } else if (event.data.action === "get_widgets") {
+ getWidgets(event, roomId);
+ return;
}
if (!userId) {
diff --git a/src/UserSettingsStore.js b/src/UserSettingsStore.js
index 84d85e7565..009fdabb53 100644
--- a/src/UserSettingsStore.js
+++ b/src/UserSettingsStore.js
@@ -30,11 +30,17 @@ export default {
id: 'rich_text_editor',
default: false,
},
+ {
+ name: "-",
+ id: 'matrix_apps',
+ default: false,
+ },
],
// horrible but it works. The locality makes this somewhat more palatable.
doTranslations: function() {
this.LABS_FEATURES[0].name = _t("New Composer & Autocomplete");
+ this.LABS_FEATURES[1].name = _t("Matrix Apps");
},
loadProfileInfo: function() {
diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js
index 67b523bfaf..ffb0c1243c 100644
--- a/src/components/structures/RoomView.js
+++ b/src/components/structures/RoomView.js
@@ -47,13 +47,12 @@ import UserProvider from '../../autocomplete/UserProvider';
import RoomViewStore from '../../stores/RoomViewStore';
-var DEBUG = false;
+let DEBUG = false;
+let debuglog = function() {};
if (DEBUG) {
// using bind means that we get to keep useful line numbers in the console
- var debuglog = console.log.bind(console);
-} else {
- var debuglog = function() {};
+ debuglog = console.log.bind(console);
}
module.exports = React.createClass({
@@ -113,6 +112,7 @@ module.exports = React.createClass({
callState: null,
guestsCanJoin: false,
canPeek: false,
+ showApps: false,
// error object, as from the matrix client/server API
// If we failed to load information about the room,
@@ -236,6 +236,7 @@ module.exports = React.createClass({
if (room) {
this.setState({
unsentMessageError: this._getUnsentMessageError(room),
+ showApps: this._shouldShowApps(room),
});
this._onRoomLoaded(room);
}
@@ -273,6 +274,11 @@ module.exports = React.createClass({
}
},
+ _shouldShowApps: function(room) {
+ const appsStateEvents = room.currentState.getStateEvents('im.vector.modular.widgets', '');
+ return appsStateEvents && Object.keys(appsStateEvents.getContent()).length > 0;
+ },
+
componentDidMount: function() {
var call = this._getCallForRoom();
var callState = call ? call.call_state : "ended";
@@ -453,9 +459,14 @@ module.exports = React.createClass({
this._updateConfCallNotification();
this.setState({
- callState: callState
+ callState: callState,
});
+ break;
+ case 'appsDrawer':
+ this.setState({
+ showApps: payload.show,
+ });
break;
}
},
@@ -1604,11 +1615,13 @@ module.exports = React.createClass({
var auxPanel = (
+ onResize={this.onChildResize}
+ showApps={this.state.showApps && !this.state.editingRoomSettings} >
{ aux }
);
@@ -1621,8 +1634,14 @@ module.exports = React.createClass({
if (canSpeak) {
messageComposer =
;
+ room={this.state.room}
+ onResize={this.onChildResize}
+ uploadFile={this.uploadFile}
+ callState={this.state.callState}
+ tabComplete={this.tabComplete}
+ opacity={ this.props.opacity }
+ showApps={ this.state.showApps }
+ />;
}
// TODO: Why aren't we storing the term/scope/count in this format
diff --git a/src/components/views/elements/AppTile.js b/src/components/views/elements/AppTile.js
new file mode 100644
index 0000000000..6f4c931ab7
--- /dev/null
+++ b/src/components/views/elements/AppTile.js
@@ -0,0 +1,102 @@
+/*
+Copyright 2017 Vector Creations Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+import React from 'react';
+import MatrixClientPeg from '../../../MatrixClientPeg';
+import { _t } from '../../../languageHandler';
+
+export default React.createClass({
+ displayName: 'AppTile',
+
+ propTypes: {
+ id: React.PropTypes.string.isRequired,
+ url: React.PropTypes.string.isRequired,
+ name: React.PropTypes.string.isRequired,
+ room: React.PropTypes.object.isRequired,
+ },
+
+ getDefaultProps: function() {
+ return {
+ url: "",
+ };
+ },
+
+ _onEditClick: function() {
+ console.log("Edit widget %s", this.props.id);
+ },
+
+ _onDeleteClick: function() {
+ console.log("Delete widget %s", this.props.id);
+ const appsStateEvents = this.props.room.currentState.getStateEvents('im.vector.modular.widgets', '');
+ if (!appsStateEvents) {
+ return;
+ }
+ const appsStateEvent = appsStateEvents.getContent();
+ if (appsStateEvent[this.props.id]) {
+ delete appsStateEvent[this.props.id];
+ MatrixClientPeg.get().sendStateEvent(
+ this.props.room.roomId,
+ 'im.vector.modular.widgets',
+ appsStateEvent,
+ '',
+ ).then(() => {
+ console.log('Deleted widget');
+ }, (e) => {
+ console.error('Failed to delete widget', e);
+ });
+ }
+ },
+
+ formatAppTileName: function() {
+ let appTileName = "No name";
+ if(this.props.name && this.props.name.trim()) {
+ appTileName = this.props.name.trim();
+ appTileName = appTileName[0].toUpperCase() + appTileName.slice(1).toLowerCase();
+ }
+ return appTileName;
+ },
+
+ render: function() {
+ return (
+
+
+ {this.formatAppTileName()}
+
+ {/* Edit widget */}
+ {/* */}
+
+ {/* Delete widget */}
+
+
+
+
+
+
+
+ );
+ },
+});
diff --git a/src/components/views/rooms/AppsDrawer.js b/src/components/views/rooms/AppsDrawer.js
new file mode 100644
index 0000000000..6545ac1ce5
--- /dev/null
+++ b/src/components/views/rooms/AppsDrawer.js
@@ -0,0 +1,223 @@
+/*
+Copyright 2017 Vector Creations Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+import React from 'react';
+import MatrixClientPeg from '../../../MatrixClientPeg';
+import AppTile from '../elements/AppTile';
+import Modal from '../../../Modal';
+import dis from '../../../dispatcher';
+import sdk from '../../../index';
+import SdkConfig from '../../../SdkConfig';
+import ScalarAuthClient from '../../../ScalarAuthClient';
+import ScalarMessaging from '../../../ScalarMessaging';
+import { _t } from '../../../languageHandler';
+
+
+module.exports = React.createClass({
+ displayName: 'AppsDrawer',
+
+ propTypes: {
+ room: React.PropTypes.object.isRequired,
+ },
+
+ getInitialState: function() {
+ return {
+ apps: this._getApps(),
+ };
+ },
+
+ componentWillMount: function() {
+ ScalarMessaging.startListening();
+ MatrixClientPeg.get().on("RoomState.events", this.onRoomStateEvents);
+ },
+
+ componentDidMount: function() {
+ this.scalarClient = null;
+ if (SdkConfig.get().integrations_ui_url && SdkConfig.get().integrations_rest_url) {
+ this.scalarClient = new ScalarAuthClient();
+ this.scalarClient.connect().done(() => {
+ this.forceUpdate();
+ if (this.state.apps && this.state.apps.length < 1) {
+ this.onClickAddWidget();
+ }
+ // TODO -- Handle Scalar errors
+ // },
+ // (err) => {
+ // this.setState({
+ // scalar_error: err,
+ // });
+ });
+ }
+ },
+
+ componentWillUnmount: function() {
+ ScalarMessaging.stopListening();
+ if (MatrixClientPeg.get()) {
+ MatrixClientPeg.get().removeListener("RoomState.events", this.onRoomStateEvents);
+ }
+ },
+
+ /**
+ * Encodes a URI according to a set of template variables. Variables will be
+ * passed through encodeURIComponent.
+ * @param {string} pathTemplate The path with template variables e.g. '/foo/$bar'.
+ * @param {Object} variables The key/value pairs to replace the template
+ * variables with. E.g. { "$bar": "baz" }.
+ * @return {string} The result of replacing all template variables e.g. '/foo/baz'.
+ */
+ encodeUri: function(pathTemplate, variables) {
+ for (const key in variables) {
+ if (!variables.hasOwnProperty(key)) {
+ continue;
+ }
+ pathTemplate = pathTemplate.replace(
+ key, encodeURIComponent(variables[key]),
+ );
+ }
+ return pathTemplate;
+ },
+
+ _initAppConfig: function(appId, app) {
+ const user = MatrixClientPeg.get().getUser(this.props.userId);
+ const params = {
+ '$matrix_user_id': this.props.userId,
+ '$matrix_room_id': this.props.room.roomId,
+ '$matrix_display_name': user ? user.displayName : this.props.userId,
+ '$matrix_avatar_url': user ? MatrixClientPeg.get().mxcUrlToHttp(user.avatarUrl) : '',
+ };
+
+ if(app.data) {
+ Object.keys(app.data).forEach((key) => {
+ params['$' + key] = app.data[key];
+ });
+ }
+
+ app.id = appId;
+ app.name = app.name || app.type;
+ app.url = this.encodeUri(app.url, params);
+
+ // switch(app.type) {
+ // case 'etherpad':
+ // app.queryParams = '?userName=' + this.props.userId +
+ // '&padId=' + this.props.room.roomId;
+ // break;
+ // case 'jitsi': {
+ //
+ // app.queryParams = '?confId=' + app.data.confId +
+ // '&displayName=' + encodeURIComponent(user.displayName) +
+ // '&avatarUrl=' + encodeURIComponent(MatrixClientPeg.get().mxcUrlToHttp(user.avatarUrl)) +
+ // '&email=' + encodeURIComponent(this.props.userId) +
+ // '&isAudioConf=' + app.data.isAudioConf;
+ //
+ // break;
+ // }
+ // case 'vrdemo':
+ // app.queryParams = '?roomAlias=' + encodeURIComponent(app.data.roomAlias);
+ // break;
+ // }
+
+ return app;
+ },
+
+ onRoomStateEvents: function(ev, state) {
+ if (ev.getRoomId() !== this.props.room.roomId || ev.getType() !== 'im.vector.modular.widgets') {
+ return;
+ }
+ this._updateApps();
+ },
+
+ _getApps: function() {
+ const appsStateEvents = this.props.room.currentState.getStateEvents('im.vector.modular.widgets', '');
+ if (!appsStateEvents) {
+ return [];
+ }
+ const appsStateEvent = appsStateEvents.getContent();
+ if (Object.keys(appsStateEvent).length < 1) {
+ return [];
+ }
+
+ return Object.keys(appsStateEvent).map((appId) => {
+ return this._initAppConfig(appId, appsStateEvent[appId]);
+ });
+ },
+
+ _updateApps: function() {
+ const apps = this._getApps();
+ if (apps.length < 1) {
+ dis.dispatch({
+ action: 'appsDrawer',
+ show: false,
+ });
+ }
+ this.setState({
+ apps: apps,
+ });
+ },
+
+ onClickAddWidget: function(e) {
+ if (e) {
+ e.preventDefault();
+ }
+
+ const IntegrationsManager = sdk.getComponent("views.settings.IntegrationsManager");
+ const src = (this.scalarClient !== null && this.scalarClient.hasCredentials()) ?
+ this.scalarClient.getScalarInterfaceUrlForRoom(this.props.room.roomId) :
+ null;
+ Modal.createDialog(IntegrationsManager, {
+ src: src,
+ onFinished: ()=>{
+ if (e) {
+ this.props.onCancelClick(e);
+ }
+ },
+ }, "mx_IntegrationsManager");
+ },
+
+ render: function() {
+ const apps = this.state.apps.map(
+ (app, index, arr) => {
+ return ;
+ });
+
+ const addWidget = this.state.apps && this.state.apps.length < 2 &&
+ (
+ [+] {_t('Add a widget')}
+
);
+
+ return (
+
+
+ {apps}
+
+ {addWidget}
+
+ );
+ },
+});
diff --git a/src/components/views/rooms/AuxPanel.js b/src/components/views/rooms/AuxPanel.js
index acb9c76aa0..a50743a25d 100644
--- a/src/components/views/rooms/AuxPanel.js
+++ b/src/components/views/rooms/AuxPanel.js
@@ -19,7 +19,9 @@ import MatrixClientPeg from "../../../MatrixClientPeg";
import sdk from '../../../index';
import dis from "../../../dispatcher";
import ObjectUtils from '../../../ObjectUtils';
-import { _t, _tJsx} from '../../../languageHandler';
+import AppsDrawer from './AppsDrawer';
+import { _t, _tJsx} from '../../../languageHandler';
+import UserSettingsStore from '../../../UserSettingsStore';
module.exports = React.createClass({
@@ -28,6 +30,8 @@ module.exports = React.createClass({
propTypes: {
// js-sdk room object
room: React.PropTypes.object.isRequired,
+ userId: React.PropTypes.string.isRequired,
+ showApps: React.PropTypes.bool,
// Conference Handler implementation
conferenceHandler: React.PropTypes.object,
@@ -70,10 +74,10 @@ module.exports = React.createClass({
},
render: function() {
- var CallView = sdk.getComponent("voip.CallView");
- var TintableSvg = sdk.getComponent("elements.TintableSvg");
+ const CallView = sdk.getComponent("voip.CallView");
+ const TintableSvg = sdk.getComponent("elements.TintableSvg");
- var fileDropTarget = null;
+ let fileDropTarget = null;
if (this.props.draggingFile) {
fileDropTarget = (
@@ -87,14 +91,13 @@ module.exports = React.createClass({
);
}
- var conferenceCallNotification = null;
+ let conferenceCallNotification = null;
if (this.props.displayConfCallNotification) {
let supportedText = '';
let joinNode;
if (!MatrixClientPeg.get().supportsVoip()) {
supportedText = _t(" (unsupported)");
- }
- else {
+ } else {
joinNode = (
{_tJsx(
"Join as voice or video.",
@@ -105,7 +108,6 @@ module.exports = React.createClass({
]
)}
);
-
}
// XXX: the translation here isn't great: appending ' (unsupported)' is likely to not make sense in many languages,
// but there are translations for this in the languages we do have so I'm leaving it for now.
@@ -118,7 +120,7 @@ module.exports = React.createClass({
);
}
- var callView = (
+ const callView = (
);
+ let appsDrawer = null;
+ if(UserSettingsStore.isFeatureEnabled('matrix_apps') && this.props.showApps) {
+ appsDrawer =
;
+ }
+
return (
+ { appsDrawer }
{ fileDropTarget }
{ callView }
{ conferenceCallNotification }
diff --git a/src/components/views/rooms/MessageComposer.js b/src/components/views/rooms/MessageComposer.js
index 434685e8e1..c83e32d9a8 100644
--- a/src/components/views/rooms/MessageComposer.js
+++ b/src/components/views/rooms/MessageComposer.js
@@ -13,16 +13,15 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
-var React = require('react');
+import React from 'react';
import { _t } from '../../../languageHandler';
-var CallHandler = require('../../../CallHandler');
-var MatrixClientPeg = require('../../../MatrixClientPeg');
-var Modal = require('../../../Modal');
-var sdk = require('../../../index');
-var dis = require('../../../dispatcher');
+import CallHandler from '../../../CallHandler';
+import MatrixClientPeg from '../../../MatrixClientPeg';
+import Modal from '../../../Modal';
+import sdk from '../../../index';
+import dis from '../../../dispatcher';
import Autocomplete from './Autocomplete';
import classNames from 'classnames';
-
import UserSettingsStore from '../../../UserSettingsStore';
@@ -32,6 +31,8 @@ export default class MessageComposer extends React.Component {
this.onCallClick = this.onCallClick.bind(this);
this.onHangupClick = this.onHangupClick.bind(this);
this.onUploadClick = this.onUploadClick.bind(this);
+ this.onShowAppsClick = this.onShowAppsClick.bind(this);
+ this.onHideAppsClick = this.onHideAppsClick.bind(this);
this.onUploadFileSelected = this.onUploadFileSelected.bind(this);
this.uploadFiles = this.uploadFiles.bind(this);
this.onVoiceCallClick = this.onVoiceCallClick.bind(this);
@@ -57,7 +58,6 @@ export default class MessageComposer extends React.Component {
},
showFormatting: UserSettingsStore.getSyncedSetting('MessageComposer.showFormatting', false),
};
-
}
componentDidMount() {
@@ -127,7 +127,7 @@ export default class MessageComposer extends React.Component {
if(shouldUpload) {
// MessageComposer shouldn't have to rely on its parent passing in a callback to upload a file
if (files) {
- for(var i=0; i
console.log('Sent state'), (e) => console.error(e));
+ // }
+ // }
+
onCallClick(ev) {
+ // NOTE -- Will be replaced by Jitsi code (currently commented)
dis.dispatch({
action: 'place_call',
type: ev.shiftKey ? "screensharing" : "video",
room_id: this.props.room.roomId,
});
+ // this._startCallApp(false);
}
onVoiceCallClick(ev) {
+ // NOTE -- Will be replaced by Jitsi code (currently commented)
dis.dispatch({
action: 'place_call',
- type: 'voice',
+ type: "voice",
room_id: this.props.room.roomId,
});
+ // this._startCallApp(true);
+ }
+
+ onShowAppsClick(ev) {
+ dis.dispatch({
+ action: 'appsDrawer',
+ show: true,
+ });
+ }
+
+ onHideAppsClick(ev) {
+ dis.dispatch({
+ action: 'appsDrawer',
+ show: false,
+ });
}
onInputContentChanged(content: string, selection: {start: number, end: number}) {
@@ -216,19 +264,19 @@ export default class MessageComposer extends React.Component {
}
render() {
- var me = this.props.room.getMember(MatrixClientPeg.get().credentials.userId);
- var uploadInputStyle = {display: 'none'};
- var MemberAvatar = sdk.getComponent('avatars.MemberAvatar');
- var TintableSvg = sdk.getComponent("elements.TintableSvg");
- var MessageComposerInput = sdk.getComponent("rooms.MessageComposerInput" +
+ const me = this.props.room.getMember(MatrixClientPeg.get().credentials.userId);
+ const uploadInputStyle = {display: 'none'};
+ const MemberAvatar = sdk.getComponent('avatars.MemberAvatar');
+ const TintableSvg = sdk.getComponent("elements.TintableSvg");
+ const MessageComposerInput = sdk.getComponent("rooms.MessageComposerInput" +
(UserSettingsStore.isFeatureEnabled('rich_text_editor') ? "" : "Old"));
- var controls = [];
+ const controls = [];
controls.push(
-
+ ,
);
let e2eImg, e2eTitle, e2eClass;
@@ -247,16 +295,15 @@ export default class MessageComposer extends React.Component {
controls.push(
+ />,
);
- var callButton, videoCallButton, hangupButton;
+ let callButton, videoCallButton, hangupButton, showAppsButton, hideAppsButton;
if (this.props.callState && this.props.callState !== 'ended') {
hangupButton =
;
- }
- else {
+ } else {
callButton =
@@ -267,14 +314,29 @@ export default class MessageComposer extends React.Component {
;
}
- var canSendMessages = this.props.room.currentState.maySendMessage(
+ // Apps
+ if (UserSettingsStore.isFeatureEnabled('matrix_apps')) {
+ if (this.props.showApps) {
+ hideAppsButton =
+
+
+
;
+ } else {
+ showAppsButton =
+
+
+
;
+ }
+ }
+
+ const canSendMessages = this.props.room.currentState.maySendMessage(
MatrixClientPeg.get().credentials.userId);
if (canSendMessages) {
// This also currently includes the call buttons. Really we should
// check separately for whether we can call, but this is slightly
// complex because of conference calls.
- var uploadButton = (
+ const uploadButton = (
@@ -300,7 +362,7 @@ export default class MessageComposer extends React.Component {
controls.push(
this.messageComposerInput = c}
+ ref={(c) => this.messageComposerInput = c}
key="controls_input"
onResize={this.props.onResize}
room={this.props.room}
@@ -316,13 +378,15 @@ export default class MessageComposer extends React.Component {
uploadButton,
hangupButton,
callButton,
- videoCallButton
+ videoCallButton,
+ showAppsButton,
+ hideAppsButton,
);
} else {
controls.push(
{ _t('You do not have permission to post to this room') }
-
+ ,
);
}
@@ -340,7 +404,7 @@ export default class MessageComposer extends React.Component {
const {style, blockType} = this.state.inputState;
const formatButtons = ["bold", "italic", "strike", "underline", "code", "quote", "bullet", "numbullet"].map(
- name => {
+ (name) => {
const active = style.includes(name) || blockType === name;
const suffix = active ? '-o-n' : '';
const onFormatButtonClicked = this.onFormatButtonClicked.bind(this, name);
@@ -403,5 +467,8 @@ MessageComposer.propTypes = {
uploadFile: React.PropTypes.func.isRequired,
// opacity for dynamic UI fading effects
- opacity: React.PropTypes.number
+ opacity: React.PropTypes.number,
+
+ // string representing the current room app drawer state
+ showApps: React.PropTypes.bool,
};
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json
index 6cf2c63785..397c2ecaaa 100644
--- a/src/i18n/strings/en_EN.json
+++ b/src/i18n/strings/en_EN.json
@@ -1,928 +1,933 @@
{
- "af":"Afrikaans",
- "ar-ae":"Arabic (U.A.E.)",
- "ar-bh":"Arabic (Bahrain)",
- "ar-dz":"Arabic (Algeria)",
- "ar-eg":"Arabic (Egypt)",
- "ar-iq":"Arabic (Iraq)",
- "ar-jo":"Arabic (Jordan)",
- "ar-kw":"Arabic (Kuwait)",
- "ar-lb":"Arabic (Lebanon)",
- "ar-ly":"Arabic (Libya)",
- "ar-ma":"Arabic (Morocco)",
- "ar-om":"Arabic (Oman)",
- "ar-qa":"Arabic (Qatar)",
- "ar-sa":"Arabic (Saudi Arabia)",
- "ar-sy":"Arabic (Syria)",
- "ar-tn":"Arabic (Tunisia)",
- "ar-ye":"Arabic (Yemen)",
- "be":"Belarusian",
- "bg":"Bulgarian",
- "ca":"Catalan",
- "cs":"Czech",
- "da":"Danish",
- "de-at":"German (Austria)",
- "de-ch":"German (Switzerland)",
- "de":"German",
- "de-li":"German (Liechtenstein)",
- "de-lu":"German (Luxembourg)",
- "el":"Greek",
- "en-au":"English (Australia)",
- "en-bz":"English (Belize)",
- "en-ca":"English (Canada)",
- "en":"English",
- "en-gb":"English (United Kingdom)",
- "en-ie":"English (Ireland)",
- "en-jm":"English (Jamaica)",
- "en-nz":"English (New Zealand)",
- "en-tt":"English (Trinidad)",
- "en-us":"English (United States)",
- "en-za":"English (South Africa)",
- "es-ar":"Spanish (Argentina)",
- "es-bo":"Spanish (Bolivia)",
- "es-cl":"Spanish (Chile)",
- "es-co":"Spanish (Colombia)",
- "es-cr":"Spanish (Costa Rica)",
- "es-do":"Spanish (Dominican Republic)",
- "es-ec":"Spanish (Ecuador)",
- "es-gt":"Spanish (Guatemala)",
- "es-hn":"Spanish (Honduras)",
- "es-mx":"Spanish (Mexico)",
- "es-ni":"Spanish (Nicaragua)",
- "es-pa":"Spanish (Panama)",
- "es-pe":"Spanish (Peru)",
- "es-pr":"Spanish (Puerto Rico)",
- "es-py":"Spanish (Paraguay)",
- "es":"Spanish (Spain)",
- "es-sv":"Spanish (El Salvador)",
- "es-uy":"Spanish (Uruguay)",
- "es-ve":"Spanish (Venezuela)",
- "et":"Estonian",
- "eu":"Basque (Basque)",
- "fa":"Farsi",
- "fi":"Finnish",
- "fo":"Faeroese",
- "fr-be":"French (Belgium)",
- "fr-ca":"French (Canada)",
- "fr-ch":"French (Switzerland)",
- "fr":"French",
- "fr-lu":"French (Luxembourg)",
- "ga":"Irish",
- "gd":"Gaelic (Scotland)",
- "he":"Hebrew",
- "hi":"Hindi",
- "hr":"Croatian",
- "hu":"Hungarian",
- "id":"Indonesian",
- "is":"Icelandic",
- "it-ch":"Italian (Switzerland)",
- "it":"Italian",
- "ja":"Japanese",
- "ji":"Yiddish",
- "ko":"Korean",
- "lt":"Lithuanian",
- "lv":"Latvian",
- "mk":"Macedonian (FYROM)",
- "ms":"Malaysian",
- "mt":"Maltese",
- "nl-be":"Dutch (Belgium)",
- "nl":"Dutch",
- "no":"Norwegian",
- "pl":"Polish",
- "pt-br":"Brazilian Portuguese",
- "pt":"Portuguese",
- "rm":"Rhaeto-Romanic",
- "ro-mo":"Romanian (Republic of Moldova)",
- "ro":"Romanian",
- "ru-mo":"Russian (Republic of Moldova)",
- "ru":"Russian",
- "sb":"Sorbian",
- "sk":"Slovak",
- "sl":"Slovenian",
- "sq":"Albanian",
- "sr":"Serbian",
- "sv-fi":"Swedish (Finland)",
- "sv":"Swedish",
- "sx":"Sutu",
- "sz":"Sami (Lappish)",
- "th":"Thai",
- "tn":"Tswana",
- "tr":"Turkish",
- "ts":"Tsonga",
- "uk":"Ukrainian",
- "ur":"Urdu",
- "ve":"Venda",
- "vi":"Vietnamese",
- "xh":"Xhosa",
- "zh-cn":"Chinese (PRC)",
- "zh-hk":"Chinese (Hong Kong SAR)",
- "zh-sg":"Chinese (Singapore)",
- "zh-tw":"Chinese (Taiwan)",
- "zu":"Zulu",
- "a room": "a room",
- "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains",
- "Accept": "Accept",
- "%(targetName)s accepted an invitation.": "%(targetName)s accepted an invitation.",
- "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepted the invitation for %(displayName)s.",
- "Account": "Account",
- "Access Token:": "Access Token:",
- "Active call (%(roomName)s)": "Active call (%(roomName)s)",
- "Add": "Add",
- "Add a topic": "Add a topic",
- "Add email address": "Add email address",
- "Add phone number": "Add phone number",
- "Admin": "Admin",
- "Admin tools": "Admin tools",
- "And %(count)s more...": "And %(count)s more...",
- "VoIP": "VoIP",
- "Missing Media Permissions, click here to request.": "Missing Media Permissions, click here to request.",
- "No Microphones detected": "No Microphones detected",
- "No Webcams detected": "No Webcams detected",
- "No media permissions": "No media permissions",
- "You may need to manually permit Riot to access your microphone/webcam": "You may need to manually permit Riot to access your microphone/webcam",
- "Default Device": "Default Device",
- "Microphone": "Microphone",
- "Camera": "Camera",
- "Advanced": "Advanced",
- "Algorithm": "Algorithm",
- "Hide removed messages": "Hide removed messages",
- "Always show message timestamps": "Always show message timestamps",
- "Authentication": "Authentication",
- "Alias (optional)": "Alias (optional)",
- "all room members": "all room members",
- "all room members, from the point they are invited": "all room members, from the point they are invited",
- "all room members, from the point they joined": "all room members, from the point they joined",
- "and": "and",
- "%(items)s and %(remaining)s others": "%(items)s and %(remaining)s others",
- "%(items)s and one other": "%(items)s and one other",
- "%(items)s and %(lastItem)s": "%(items)s and %(lastItem)s",
- "and %(overflowCount)s others...": "and %(overflowCount)s others...",
- "and one other...": "and one other...",
- "%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing",
- "%(names)s and one other are typing": "%(names)s and one other are typing",
- "%(names)s and %(count)s others are typing": "%(names)s and %(count)s others are typing",
- "An email has been sent to": "An email has been sent to",
- "A new password must be entered.": "A new password must be entered.",
- "%(senderName)s answered the call.": "%(senderName)s answered the call.",
- "anyone": "anyone",
- "An error has occurred.": "An error has occurred.",
- "Anyone": "Anyone",
- "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?": "Are you sure?",
- "Are you sure you want to leave the room '%(roomName)s'?": "Are you sure you want to leave the room '%(roomName)s'?",
- "Are you sure you want to reject the invitation?": "Are you sure you want to reject the invitation?",
- "Are you sure you want to upload the following files?": "Are you sure you want to upload the following files?",
- "Attachment": "Attachment",
- "Autoplay GIFs and videos": "Autoplay GIFs and videos",
- "%(senderName)s banned %(targetName)s.": "%(senderName)s banned %(targetName)s.",
- "Ban": "Ban",
- "Banned users": "Banned users",
- "Bans user with given id": "Bans user with given id",
- "Blacklisted": "Blacklisted",
- "Bug Report": "Bug Report",
- "Bulk Options": "Bulk Options",
- "Call Timeout": "Call Timeout",
- "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.",
- "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.",
- "Can't load user settings": "Can't load user settings",
- "Change Password": "Change Password",
- "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.",
- "%(senderName)s changed their profile picture.": "%(senderName)s changed their profile picture.",
- "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s changed the power level of %(powerLevelDiffText)s.",
- "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s changed the room name to %(roomName)s.",
- "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s removed the room name.",
- "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s changed the topic to \"%(topic)s\".",
- "Changes to who can read history will only apply to future messages in this room": "Changes to who can read history will only apply to future messages in this room",
- "Changes your display nickname": "Changes your display nickname",
- "changing room on a RoomView is not supported": "changing room on a RoomView is not supported",
- "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.",
- "Claimed Ed25519 fingerprint key": "Claimed Ed25519 fingerprint key",
- "Clear Cache and Reload": "Clear Cache and Reload",
- "Clear Cache": "Clear Cache",
- "Click here to join the discussion!": "Click here to join the discussion!",
- "Click here to fix": "Click here to fix",
- "Click to mute audio": "Click to mute audio",
- "Click to mute video": "Click to mute video",
- "click to reveal": "click to reveal",
- "Click to unmute video": "Click to unmute video",
- "Click to unmute audio": "Click to unmute audio",
- "Close": "Close",
- "Command error": "Command error",
- "Commands": "Commands",
- "Conference call failed.": "Conference call failed.",
- "Conference calling is in development and may not be reliable.": "Conference calling is in development and may not be reliable.",
- "Conference calls are not supported in encrypted rooms": "Conference calls are not supported in encrypted rooms",
- "Conference calls are not supported in this client": "Conference calls are not supported in this client",
- "Confirm password": "Confirm password",
- "Confirm your new password": "Confirm your new password",
- "Continue": "Continue",
- "Could not connect to the integration server": "Could not connect to the integration server",
- "%(count)s new messages": {
- "one": "%(count)s new message",
- "other": "%(count)s new messages"
- },
- "Create a new chat or reuse an existing one": "Create a new chat or reuse an existing one",
- "Create an account": "Create an account",
- "Create Room": "Create Room",
- "Cryptography": "Cryptography",
- "Current password": "Current password",
- "Curve25519 identity key": "Curve25519 identity key",
- "Custom": "Custom",
- "Custom level": "Custom level",
- "/ddg is not a command": "/ddg is not a command",
- "Deactivate Account": "Deactivate Account",
- "Deactivate my account": "Deactivate my account",
- "Decline": "Decline",
- "Decrypt %(text)s": "Decrypt %(text)s",
- "Decryption error": "Decryption error",
- "Delete": "Delete",
- "demote": "demote",
- "Deops user with given id": "Deops user with given id",
- "Default": "Default",
- "Define the power level of a user": "Define the power level of a user",
- "Device already verified!": "Device already verified!",
- "Device ID": "Device ID",
- "Device ID:": "Device ID:",
- "device id: ": "device id: ",
- "Device key:": "Device key:",
- "Devices": "Devices",
- "Devices will not yet be able to decrypt history from before they joined the room": "Devices will not yet be able to decrypt history from before they joined the room",
- "Direct Chat": "Direct Chat",
- "Direct chats": "Direct chats",
- "Disable Notifications": "Disable Notifications",
- "disabled": "disabled",
- "Disable inline URL previews by default": "Disable inline URL previews by default",
- "Disable markdown formatting": "Disable markdown formatting",
- "Disinvite": "Disinvite",
- "Display name": "Display name",
- "Displays action": "Displays action",
- "Don't send typing notifications": "Don't send typing notifications",
- "Download %(text)s": "Download %(text)s",
- "Drop File Here": "Drop File Here",
- "Drop here %(toAction)s": "Drop here %(toAction)s",
- "Drop here to tag %(section)s": "Drop here to tag %(section)s",
- "Ed25519 fingerprint": "Ed25519 fingerprint",
- "Email": "Email",
- "Email address": "Email address",
- "Email address (optional)": "Email address (optional)",
- "Email, name or matrix ID": "Email, name or matrix ID",
- "Emoji": "Emoji",
- "Enable automatic language detection for syntax highlighting": "Enable automatic language detection for syntax highlighting",
- "Enable encryption": "Enable encryption",
- "Enable Notifications": "Enable Notifications",
- "enabled": "enabled",
- "Encrypted by a verified device": "Encrypted by a verified device",
- "Encrypted by an unverified device": "Encrypted by an unverified device",
- "Encrypted messages will not be visible on clients that do not yet implement encryption": "Encrypted messages will not be visible on clients that do not yet implement encryption",
- "Encrypted room": "Encrypted room",
- "Encryption is enabled in this room": "Encryption is enabled in this room",
- "Encryption is not enabled in this room": "Encryption is not enabled in this room",
- "%(senderName)s ended the call.": "%(senderName)s ended the call.",
- "End-to-end encryption information": "End-to-end encryption information",
- "End-to-end encryption is in beta and may not be reliable": "End-to-end encryption is in beta and may not be reliable",
- "Enter Code": "Enter Code",
- "Enter passphrase": "Enter passphrase",
- "Error": "Error",
- "Error decrypting attachment": "Error decrypting attachment",
- "Error: Problem communicating with the given homeserver.": "Error: Problem communicating with the given homeserver.",
- "Event information": "Event information",
- "Existing Call": "Existing Call",
- "Export": "Export",
- "Export E2E room keys": "Export E2E room keys",
- "Failed to ban user": "Failed to ban user",
- "Failed to change password. Is your password correct?": "Failed to change password. Is your password correct?",
- "Failed to change power level": "Failed to change power level",
- "Failed to delete device": "Failed to delete device",
- "Failed to fetch avatar URL": "Failed to fetch avatar URL",
- "Failed to forget room %(errCode)s": "Failed to forget room %(errCode)s",
- "Failed to join room": "Failed to join room",
- "Failed to join the room": "Failed to join the room",
- "Failed to kick": "Failed to kick",
- "Failed to leave room": "Failed to leave room",
- "Failed to load timeline position": "Failed to load timeline position",
- "Failed to lookup current room": "Failed to lookup current room",
- "Failed to mute user": "Failed to mute user",
- "Failed to register as guest:": "Failed to register as guest:",
- "Failed to reject invite": "Failed to reject invite",
- "Failed to reject invitation": "Failed to reject invitation",
- "Failed to save settings": "Failed to save settings",
- "Failed to send email": "Failed to send email",
- "Failed to send request.": "Failed to send request.",
- "Failed to set avatar.": "Failed to set avatar.",
- "Failed to set display name": "Failed to set display name",
- "Failed to set up conference call": "Failed to set up conference call",
- "Failed to toggle moderator status": "Failed to toggle moderator status",
- "Failed to unban": "Failed to unban",
- "Failed to upload file": "Failed to upload file",
- "Failed to upload profile picture!": "Failed to upload profile picture!",
- "Failed to verify email address: make sure you clicked the link in the email": "Failed to verify email address: make sure you clicked the link in the email",
- "Failure to create room": "Failure to create room",
- "Favourite": "Favourite",
- "favourite": "favourite",
- "Favourites": "Favourites",
- "Fill screen": "Fill screen",
- "Filter room members": "Filter room members",
- "Forget room": "Forget room",
- "Forgot your password?": "Forgot your password?",
- "For security, this session has been signed out. Please sign in again.": "For security, this session has been signed out. Please sign in again.",
- "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.",
- "Found a bug?": "Found a bug?",
- "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s",
- "Guest access is disabled on this Home Server.": "Guest access is disabled on this Home Server.",
- "Guests can't set avatars. Please register.": "Guests can't set avatars. Please register.",
- "Guest users can't create new rooms. Please register to create room and start a chat.": "Guest users can't create new rooms. Please register to create room and start a chat.",
- "Guest users can't upload files. Please register to upload.": "Guest users can't upload files. Please register to upload.",
- "Guests can't use labs features. Please register.": "Guests can't use labs features. Please register.",
- "Guests cannot join this room even if explicitly invited.": "Guests cannot join this room even if explicitly invited.",
- "had": "had",
- "Hangup": "Hangup",
- "Hide read receipts": "Hide read receipts",
- "Hide Text Formatting Toolbar": "Hide Text Formatting Toolbar",
- "Historical": "Historical",
- "Home": "Home",
- "Homeserver is": "Homeserver is",
- "Identity Server is": "Identity Server is",
- "I have verified my email address": "I have verified my email address",
- "Import": "Import",
- "Import E2E room keys": "Import E2E room keys",
- "Incoming call from %(name)s": "Incoming call from %(name)s",
- "Incoming video call from %(name)s": "Incoming video call from %(name)s",
- "Incoming voice call from %(name)s": "Incoming voice call from %(name)s",
- "Incorrect username and/or password.": "Incorrect username and/or password.",
- "Incorrect verification code": "Incorrect verification code",
- "Interface Language": "Interface Language",
- "Invalid alias format": "Invalid alias format",
- "Invalid address format": "Invalid address format",
- "Invalid Email Address": "Invalid Email Address",
- "Invalid file%(extra)s": "Invalid file%(extra)s",
- "%(senderName)s invited %(targetName)s.": "%(senderName)s invited %(targetName)s.",
- "Invite new room members": "Invite new room members",
- "Invited": "Invited",
- "Invites": "Invites",
- "Invites user with given id to current room": "Invites user with given id to current room",
- "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address",
- "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias",
- "%(displayName)s is typing": "%(displayName)s is typing",
- "Sign in with": "Sign in with",
- "Join as voice or video.": "Join as voice or video.",
- "Join Room": "Join Room",
- "joined and left": "joined and left",
- "joined": "joined",
- "%(targetName)s joined the room.": "%(targetName)s joined the room.",
- "Joins room with given alias": "Joins room with given alias",
- "Jump to first unread message.": "Jump to first unread message.",
- "%(senderName)s kicked %(targetName)s.": "%(senderName)s kicked %(targetName)s.",
- "Kick": "Kick",
- "Kicks user with given id": "Kicks user with given id",
- "Labs": "Labs",
- "Last seen": "Last seen",
- "Leave room": "Leave room",
- "left and rejoined": "left and rejoined",
- "left": "left",
- "%(targetName)s left the room.": "%(targetName)s left the room.",
- "Level:": "Level:",
- "List this room in %(domain)s's room directory?": "List this room in %(domain)s's room directory?",
- "Local addresses for this room:": "Local addresses for this room:",
- "Logged in as:": "Logged in as:",
- "Login as guest": "Login as guest",
- "Logout": "Logout",
- "Low priority": "Low priority",
- "%(senderName)s made future room history visible to": "%(senderName)s made future room history visible to",
- "Manage Integrations": "Manage Integrations",
- "Markdown is disabled": "Markdown is disabled",
- "Markdown is enabled": "Markdown is enabled",
- "matrix-react-sdk version:": "matrix-react-sdk version:",
- "Members only": "Members only",
- "Message not sent due to unknown devices being present": "Message not sent due to unknown devices being present",
- "Missing room_id in request": "Missing room_id in request",
- "Missing user_id in request": "Missing user_id in request",
- "Mobile phone number": "Mobile phone number",
- "Mobile phone number (optional)": "Mobile phone number (optional)",
- "Moderator": "Moderator",
- "Must be viewing a room": "Must be viewing a room",
- "Mute": "Mute",
- "my Matrix ID": "my Matrix ID",
- "Name": "Name",
- "Never send encrypted messages to unverified devices from this device": "Never send encrypted messages to unverified devices from this device",
- "Never send encrypted messages to unverified devices in this room": "Never send encrypted messages to unverified devices in this room",
- "Never send encrypted messages to unverified devices in this room from this device": "Never send encrypted messages to unverified devices in this room from this device",
- "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)",
- "New Composer & Autocomplete": "New Composer & Autocomplete",
- "New password": "New password",
- "New passwords don't match": "New passwords don't match",
- "New passwords must match each other.": "New passwords must match each other.",
- "none": "none",
- "not set": "not set",
- "not specified": "not specified",
- "Notifications": "Notifications",
- "(not supported by this browser)": "(not supported by this browser)",
- "": "",
- "NOT verified": "NOT verified",
- "No devices with registered encryption keys": "No devices with registered encryption keys",
- "No display name": "No display name",
- "No more results": "No more results",
- "No results": "No results",
- "No users have specific privileges in this room": "No users have specific privileges in this room",
- "OK": "OK",
- "olm version:": "olm version:",
- "Once encryption is enabled for a room it cannot be turned off again (for now)": "Once encryption is enabled for a room it cannot be turned off again (for now)",
- "Once you've followed the link it contains, click below": "Once you've followed the link it contains, click below",
- "Only people who have been invited": "Only people who have been invited",
- "Operation failed": "Operation failed",
- "Otherwise, click here to send a bug report.": "Otherwise, click here to send a bug report.",
- "Password": "Password",
- "Password:": "Password:",
- "Passwords can't be empty": "Passwords can't be empty",
- "People": "People",
- "Permissions": "Permissions",
- "Phone": "Phone",
- "%(senderName)s placed a %(callType)s call.": "%(senderName)s placed a %(callType)s call.",
- "Please check your email and click on the link it contains. Once this is done, click continue.": "Please check your email and click on the link it contains. Once this is done, click continue.",
- "Please Register": "Please Register",
- "Power level must be positive integer.": "Power level must be positive integer.",
- "Press": "Press",
- "Press to start a chat with someone": "Press to start a chat with someone",
- "Privacy warning": "Privacy warning",
- "Private Chat": "Private Chat",
- "Privileged Users": "Privileged Users",
- "Profile": "Profile",
- "Public Chat": "Public Chat",
- "Reason": "Reason",
- "Reason: %(reasonText)s": "Reason: %(reasonText)s",
- "Revoke Moderator": "Revoke Moderator",
- "Refer a friend to Riot:": "Refer a friend to Riot:",
- "Register": "Register",
- "rejected": "rejected",
- "%(targetName)s rejected the invitation.": "%(targetName)s rejected the invitation.",
- "Reject invitation": "Reject invitation",
- "Rejoin": "Rejoin",
- "Remote addresses for this room:": "Remote addresses for this room:",
- "Remove Contact Information?": "Remove Contact Information?",
- "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removed their display name (%(oldDisplayName)s).",
- "%(senderName)s removed their profile picture.": "%(senderName)s removed their profile picture.",
- "Remove": "Remove",
- "Remove %(threePid)s?": "Remove %(threePid)s?",
- "%(senderName)s requested a VoIP conference.": "%(senderName)s requested a VoIP conference.",
- "Report it": "Report it",
- "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.",
- "restore": "restore",
- "Results from DuckDuckGo": "Results from DuckDuckGo",
- "Return to app": "Return to app",
- "Return to login screen": "Return to login screen",
- "Riot does not have permission to send you notifications - please check your browser settings": "Riot does not have permission to send you notifications - please check your browser settings",
- "Riot was not given permission to send notifications - please try again": "Riot was not given permission to send notifications - please try again",
- "riot-web version:": "riot-web version:",
- "Room %(roomId)s not visible": "Room %(roomId)s not visible",
- "Room Colour": "Room Colour",
- "Room contains unknown devices": "Room contains unknown devices",
- "Room name (optional)": "Room name (optional)",
- "%(roomName)s does not exist.": "%(roomName)s does not exist.",
- "%(roomName)s is not accessible at this time.": "%(roomName)s is not accessible at this time.",
- "Rooms": "Rooms",
- "Save": "Save",
- "Scroll to bottom of page": "Scroll to bottom of page",
- "Scroll to unread messages": "Scroll to unread messages",
- "Search": "Search",
- "Search failed": "Search failed",
- "Searches DuckDuckGo for results": "Searches DuckDuckGo for results",
- "Searching known users": "Searching known users",
- "Seen by %(userName)s at %(dateTime)s": "Seen by %(userName)s at %(dateTime)s",
- "Send a message (unencrypted)": "Send a message (unencrypted)",
- "Send an encrypted message": "Send an encrypted message",
- "Send anyway": "Send anyway",
- "Sender device information": "Sender device information",
- "Send Invites": "Send Invites",
- "Send Reset Email": "Send Reset Email",
- "sent an image": "sent an image",
- "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sent an image.",
- "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.",
- "sent a video": "sent a video",
- "Server error": "Server error",
- "Server may be unavailable or overloaded": "Server may be unavailable or overloaded",
- "Server may be unavailable, overloaded, or search timed out :(": "Server may be unavailable, overloaded, or search timed out :(",
- "Server may be unavailable, overloaded, or the file too big": "Server may be unavailable, overloaded, or the file too big",
- "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.",
- "Server unavailable, overloaded, or something else went wrong.": "Server unavailable, overloaded, or something else went wrong.",
- "Session ID": "Session ID",
- "%(senderName)s set a profile picture.": "%(senderName)s set a profile picture.",
- "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s set their display name to %(displayName)s.",
- "Set": "Set",
- "Settings": "Settings",
- "Show panel": "Show panel",
- "Show Text Formatting Toolbar": "Show Text Formatting Toolbar",
- "Show timestamps in 12 hour format (e.g. 2:30pm)": "Show timestamps in 12 hour format (e.g. 2:30pm)",
- "Signed Out": "Signed Out",
- "Sign in": "Sign in",
- "Sign out": "Sign out",
- "since the point in time of selecting this option": "since the point in time of selecting this option",
- "since they joined": "since they joined",
- "since they were invited": "since they were invited",
- "Some of your messages have not been sent.": "Some of your messages have not been sent.",
- "Someone": "Someone",
- "Sorry, this homeserver is using a login which is not recognised ": "Sorry, this homeserver is using a login which is not recognised ",
- "Start a chat": "Start a chat",
- "Start authentication": "Start authentication",
- "Start Chat": "Start Chat",
- "Submit": "Submit",
- "Success": "Success",
- "tag as %(tagName)s": "tag as %(tagName)s",
- "tag direct chat": "tag direct chat",
- "Tagged as: ": "Tagged as: ",
- "The default role for new room members is": "The default role for new room members is",
- "The main address for this room is": "The main address for this room is",
- "The phone number entered looks invalid": "The phone number entered looks invalid",
- "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.",
- "This action cannot be performed by a guest user. Please register to be able to do this.": "This action cannot be performed by a guest user. Please register to be able to do this.",
- "This email address is already in use": "This email address is already in use",
- "This email address was not found": "This email address was not found",
- "%(actionVerb)s this person?": "%(actionVerb)s this person?",
- "The email address linked to your account must be entered.": "The email address linked to your account must be entered.",
- "The file '%(fileName)s' exceeds this home server's size limit for uploads": "The file '%(fileName)s' exceeds this home server's size limit for uploads",
- "The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload",
- "The remote side failed to pick up": "The remote side failed to pick up",
- "This Home Server does not support login using email address.": "This Home Server does not support login using email address.",
- "This invitation was sent to an email address which is not associated with this account:": "This invitation was sent to an email address which is not associated with this account:",
- "There was a problem logging in.": "There was a problem logging in.",
- "This room has no local addresses": "This room has no local addresses",
- "This room is not recognised.": "This room is not recognised.",
- "These are experimental features that may break in unexpected ways": "These are experimental features that may break in unexpected ways",
- "The visibility of existing history will be unchanged": "The visibility of existing history will be unchanged",
- "This doesn't appear to be a valid email address": "This doesn't appear to be a valid email address",
- "This is a preview of this room. Room interactions have been disabled": "This is a preview of this room. Room interactions have been disabled",
- "This phone number is already in use": "This phone number is already in use",
- "This room": "This room",
- "This room is not accessible by remote Matrix servers": "This room is not accessible by remote Matrix servers",
- "This room's internal ID is": "This room's internal ID is",
- "times": "times",
- "To ban users": "To ban users",
- "to browse the directory": "to browse the directory",
- "To configure the room": "To configure the room",
- "to demote": "to demote",
- "to favourite": "to favourite",
- "To invite users into the room": "To invite users into the room",
- "To kick users": "To kick users",
- "To link to a room it must have an address.": "To link to a room it must have an address.",
- "to make a room or": "to make a room or",
- "To remove other users' messages": "To remove other users' messages",
- "To reset your password, enter the email address linked to your account": "To reset your password, enter the email address linked to your account",
- "to restore": "to restore",
- "To send events of type": "To send events of type",
- "To send messages": "To send messages",
- "to start a chat with someone": "to start a chat with someone",
- "to tag as %(tagName)s": "to tag as %(tagName)s",
- "to tag direct chat": "to tag direct chat",
- "To use it, just wait for autocomplete results to load and tab through them.": "To use it, just wait for autocomplete results to load and tab through them.",
- "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.",
- "Tried to load a specific point in this room's timeline, but was unable to find it.": "Tried to load a specific point in this room's timeline, but was unable to find it.",
- "Turn Markdown off": "Turn Markdown off",
- "Turn Markdown on": "Turn Markdown on",
- "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).",
- "Unable to add email address": "Unable to add email address",
- "Unable to remove contact information": "Unable to remove contact information",
- "Unable to restore previous session": "Unable to restore previous session",
- "Unable to verify email address.": "Unable to verify email address.",
- "Unban": "Unban",
- "Unbans user with given id": "Unbans user with given id",
- "%(senderName)s unbanned %(targetName)s.": "%(senderName)s unbanned %(targetName)s.",
- "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Unable to ascertain that the address this invite was sent to matches one associated with your account.",
- "Unable to capture screen": "Unable to capture screen",
- "Unable to enable Notifications": "Unable to enable Notifications",
- "Unable to load device list": "Unable to load device list",
- "Undecryptable": "Undecryptable",
- "Unencrypted room": "Unencrypted room",
- "unencrypted": "unencrypted",
- "Unencrypted message": "Unencrypted message",
- "unknown caller": "unknown caller",
- "Unknown command": "Unknown command",
- "unknown device": "unknown device",
- "unknown error code": "unknown error code",
- "Unknown room %(roomId)s": "Unknown room %(roomId)s",
- "Unknown (user, device) pair:": "Unknown (user, device) pair:",
- "unknown": "unknown",
- "Unmute": "Unmute",
- "Unnamed Room": "Unnamed Room",
- "Unrecognised command:": "Unrecognised command:",
- "Unrecognised room alias:": "Unrecognised room alias:",
- "Unverified": "Unverified",
- "Uploading %(filename)s and %(count)s others": {
- "zero": "Uploading %(filename)s",
- "one": "Uploading %(filename)s and %(count)s other",
- "other": "Uploading %(filename)s and %(count)s others"
- },
- "uploaded a file": "uploaded a file",
- "Upload avatar": "Upload avatar",
- "Upload Failed": "Upload Failed",
- "Upload Files": "Upload Files",
- "Upload file": "Upload file",
- "Upload new:": "Upload new:",
- "Usage": "Usage",
- "Use compact timeline layout": "Use compact timeline layout",
- "Use with caution": "Use with caution",
- "User ID": "User ID",
- "User Interface": "User Interface",
- "%(user)s is a": "%(user)s is a",
- "User name": "User name",
- "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (power %(powerLevelNumber)s)",
- "Username invalid: %(errMessage)s": "Username invalid: %(errMessage)s",
- "Users": "Users",
- "User": "User",
- "Verification Pending": "Verification Pending",
- "Verification": "Verification",
- "verified": "verified",
- "Verified": "Verified",
- "Verified key": "Verified key",
- "Video call": "Video call",
- "Voice call": "Voice call",
- "VoIP conference finished.": "VoIP conference finished.",
- "VoIP conference started.": "VoIP conference started.",
- "VoIP is unsupported": "VoIP is unsupported",
- "(could not connect media)": "(could not connect media)",
- "(no answer)": "(no answer)",
- "(unknown failure: %(reason)s)": "(unknown failure: %(reason)s)",
- "(warning: cannot be disabled again!)": "(warning: cannot be disabled again!)",
- "Warning!": "Warning!",
- "WARNING: Device already verified, but keys do NOT MATCH!": "WARNING: Device already verified, but keys do NOT MATCH!",
- "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!",
- "Who can access this room?": "Who can access this room?",
- "Who can read history?": "Who can read history?",
- "Who would you like to add to this room?": "Who would you like to add to this room?",
- "Who would you like to communicate with?": "Who would you like to communicate with?",
- "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s withdrew %(targetName)s's invitation.",
- "Would you like to accept or decline this invitation?": "Would you like to accept or decline this invitation?",
- "You already have existing direct chats with this user:": "You already have existing direct chats with this user:",
- "You are already in a call.": "You are already in a call.",
- "You're not in any rooms yet! Press to make a room or to browse the directory": "You're not in any rooms yet! Press to make a room or to browse the directory",
- "You are trying to access %(roomName)s.": "You are trying to access %(roomName)s.",
- "You cannot place a call with yourself.": "You cannot place a call with yourself.",
- "You cannot place VoIP calls in this browser.": "You cannot place VoIP calls in this browser.",
- "You do not have permission to post to this room": "You do not have permission to post to this room",
- "You have been banned from %(roomName)s by %(userName)s.": "You have been banned from %(roomName)s by %(userName)s.",
- "You have been invited to join this room by %(inviterName)s": "You have been invited to join this room by %(inviterName)s",
- "You have been kicked from %(roomName)s by %(userName)s.": "You have been kicked from %(roomName)s by %(userName)s.",
- "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device",
- "You have disabled URL previews by default.": "You have disabled URL previews by default.",
- "You have enabled URL previews by default.": "You have enabled URL previews by default.",
- "You have entered an invalid contact. Try using their Matrix ID or email address.": "You have entered an invalid contact. Try using their Matrix ID or email address.",
- "You have no visible notifications": "You have no visible notifications",
- "You may wish to login with a different account, or add this email to this account.": "You may wish to login with a different account, or add this email to this account.",
- "you must be a": "you must be a",
- "You must register to use this functionality": "You must register to use this functionality",
- "You need to be able to invite users to do that.": "You need to be able to invite users to do that.",
- "You need to be logged in.": "You need to be logged in.",
- "You need to enter a user name.": "You need to enter a user name.",
- "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Your email address does not appear to be associated with a Matrix ID on this Homeserver.",
- "Your password has been reset": "Your password has been reset",
- "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them",
- "You seem to be in a call, are you sure you want to quit?": "You seem to be in a call, are you sure you want to quit?",
- "You seem to be uploading files, are you sure you want to quit?": "You seem to be uploading files, are you sure you want to quit?",
- "You should not yet trust it to secure data": "You should not yet trust it to secure data",
- "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.",
- "Your home server does not support device management.": "Your home server does not support device management.",
- "Sun": "Sun",
- "Mon": "Mon",
- "Tue": "Tue",
- "Wed": "Wed",
- "Thu": "Thu",
- "Fri": "Fri",
- "Sat": "Sat",
- "Jan": "Jan",
- "Feb": "Feb",
- "Mar": "Mar",
- "Apr": "Apr",
- "May": "May",
- "Jun": "Jun",
- "Jul": "Jul",
- "Aug": "Aug",
- "Sep": "Sep",
- "Oct": "Oct",
- "Nov": "Nov",
- "Dec": "Dec",
- "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(time)s",
- "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s",
- "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s",
- "Set a display name:": "Set a display name:",
- "Set a Display Name": "Set a Display Name",
- "Upload an avatar:": "Upload an avatar:",
- "This server does not support authentication with a phone number.": "This server does not support authentication with a phone number.",
- "Missing password.": "Missing password.",
- "Passwords don't match.": "Passwords don't match.",
- "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Password too short (min %(MIN_PASSWORD_LENGTH)s).",
- "This doesn't look like a valid email address.": "This doesn't look like a valid email address.",
- "This doesn't look like a valid phone number.": "This doesn't look like a valid phone number.",
- "User names may only contain letters, numbers, dots, hyphens and underscores.": "User names may only contain letters, numbers, dots, hyphens and underscores.",
- "An unknown error occurred.": "An unknown error occurred.",
- "I already have an account": "I already have an account",
- "An error occurred: %(error_string)s": "An error occurred: %(error_string)s",
- "Topic": "Topic",
- "Make Moderator": "Make Moderator",
- "Make this room private": "Make this room private",
- "Share message history with new users": "Share message history with new users",
- "Encrypt room": "Encrypt room",
- "There are no visible files in this room": "There are no visible files in this room",
- "Room": "Room",
- "Connectivity to the server has been lost.": "Connectivity to the server has been lost.",
- "Sent messages will be stored until your connection has returned.": "Sent messages will be stored until your connection has returned.",
- "Auto-complete": "Auto-complete",
- "Resend all or cancel all now. You can also select individual messages to resend or cancel.": "Resend all or cancel all now. You can also select individual messages to resend or cancel.",
- "(~%(count)s results)": {
- "one": "(~%(count)s result)",
- "other": "(~%(count)s results)"
- },
- "Cancel": "Cancel",
- "or": "or",
- "Active call": "Active call",
- "Monday": "Monday",
- "Tuesday": "Tuesday",
- "Wednesday": "Wednesday",
- "Thursday": "Thursday",
- "Friday": "Friday",
- "Saturday": "Saturday",
- "Sunday": "Sunday",
- "bold": "bold",
- "italic": "italic",
- "strike": "strike",
- "underline": "underline",
- "code":"code",
- "quote":"quote",
- "bullet":"bullet",
- "numbullet":"numbullet",
- "%(severalUsers)sjoined %(repeats)s times": "%(severalUsers)sjoined %(repeats)s times",
- "%(oneUser)sjoined %(repeats)s times": "%(oneUser)sjoined %(repeats)s times",
- "%(severalUsers)sjoined": "%(severalUsers)sjoined",
- "%(oneUser)sjoined": "%(oneUser)sjoined",
- "%(severalUsers)sleft %(repeats)s times": "%(severalUsers)sleft %(repeats)s times",
- "%(oneUser)sleft %(repeats)s times": "%(oneUser)sleft %(repeats)s times",
- "%(severalUsers)sleft": "%(severalUsers)sleft",
- "%(oneUser)sleft": "%(oneUser)sleft",
- "%(severalUsers)sjoined and left %(repeats)s times": "%(severalUsers)sjoined and left %(repeats)s times",
- "%(oneUser)sjoined and left %(repeats)s times": "%(oneUser)sjoined and left %(repeats)s times",
- "%(severalUsers)sjoined and left": "%(severalUsers)sjoined and left",
- "%(oneUser)sjoined and left": "%(oneUser)sjoined and left",
- "%(severalUsers)sleft and rejoined %(repeats)s times": "%(severalUsers)sleft and rejoined %(repeats)s times",
- "%(oneUser)sleft and rejoined %(repeats)s times": "%(oneUser)sleft and rejoined %(repeats)s times",
- "%(severalUsers)sleft and rejoined": "%(severalUsers)sleft and rejoined",
- "%(oneUser)sleft and rejoined": "%(oneUser)sleft and rejoined",
- "%(severalUsers)srejected their invitations %(repeats)s times": "%(severalUsers)srejected their invitations %(repeats)s times",
- "%(oneUser)srejected their invitation %(repeats)s times": "%(oneUser)srejected their invitation %(repeats)s times",
- "%(severalUsers)srejected their invitations": "%(severalUsers)srejected their invitations",
- "%(oneUser)srejected their invitation": "%(oneUser)srejected their invitation",
- "%(severalUsers)shad their invitations withdrawn %(repeats)s times": "%(severalUsers)shad their invitations withdrawn %(repeats)s times",
- "%(oneUser)shad their invitation withdrawn %(repeats)s times": "%(oneUser)shad their invitation withdrawn %(repeats)s times",
- "%(severalUsers)shad their invitations withdrawn": "%(severalUsers)shad their invitations withdrawn",
- "%(oneUser)shad their invitation withdrawn": "%(oneUser)shad their invitation withdrawn",
- "were invited %(repeats)s times": "were invited %(repeats)s times",
- "was invited %(repeats)s times": "was invited %(repeats)s times",
- "were invited": "were invited",
- "was invited": "was invited",
- "were banned %(repeats)s times": "were banned %(repeats)s times",
- "was banned %(repeats)s times": "was banned %(repeats)s times",
- "were banned": "were banned",
- "was banned": "was banned",
- "were unbanned %(repeats)s times": "were unbanned %(repeats)s times",
- "was unbanned %(repeats)s times": "was unbanned %(repeats)s times",
- "were unbanned": "were unbanned",
- "was unbanned": "was unbanned",
- "were kicked %(repeats)s times": "were kicked %(repeats)s times",
- "was kicked %(repeats)s times": "was kicked %(repeats)s times",
- "were kicked": "were kicked",
- "was kicked": "was kicked",
- "%(severalUsers)schanged their name %(repeats)s times": "%(severalUsers)schanged their name %(repeats)s times",
- "%(oneUser)schanged their name %(repeats)s times": "%(oneUser)schanged their name %(repeats)s times",
- "%(severalUsers)schanged their name": "%(severalUsers)schanged their name",
- "%(oneUser)schanged their name": "%(oneUser)schanged their name",
- "%(severalUsers)schanged their avatar %(repeats)s times": "%(severalUsers)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",
- "%(oneUser)schanged their avatar": "%(oneUser)schanged their avatar",
- "Please select the destination room for this message": "Please select the destination room for this message",
- "Create new room": "Create new room",
- "Welcome page": "Welcome page",
- "Room directory": "Room directory",
- "Start chat": "Start chat",
- "New Password": "New Password",
- "Start automatically after system login": "Start automatically after system login",
- "Desktop specific": "Desktop specific",
- "Analytics": "Analytics",
- "Opt out of analytics": "Opt out of analytics",
- "Options": "Options",
- "Riot collects anonymous analytics to allow us to improve the application.": "Riot collects anonymous analytics to allow us to improve the application.",
- "Passphrases must match": "Passphrases must match",
- "Passphrase must not be empty": "Passphrase must not be empty",
- "Export room keys": "Export room keys",
- "Confirm passphrase": "Confirm passphrase",
- "Import room keys": "Import room keys",
- "File to import": "File to import",
- "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",
- "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 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)s. 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)s. 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",
- "Disable URL previews for this room (affects only you)": "Disable URL previews for this room (affects only you)",
- "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.": "Ongoing conference call%(supportedText)s.",
- "for %(amount)ss": "for %(amount)ss",
- "for %(amount)sm": "for %(amount)sm",
- "for %(amount)sh": "for %(amount)sh",
- "for %(amount)sd": "for %(amount)sd",
- "Online": "Online",
- "Idle": "Idle",
- "Offline": "Offline",
- "Updates": "Updates",
- "Check for update": "Check for update",
- "Start chatting": "Start chatting",
- "Start Chatting": "Start Chatting",
- "Click on the button below to start chatting!": "Click on the button below to start chatting!",
- "$senderDisplayName changed the room avatar to ": "$senderDisplayName changed the room avatar to ",
- "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removed the room avatar.",
- "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s changed the avatar for %(roomName)s",
- "Username available": "Username available",
- "Username not available": "Username not available",
- "Something went wrong!": "Something went wrong!",
- "This will be your account name on the homeserver, or you can pick a different server.": "This will be your account name on the homeserver, or you can pick a different server.",
- "If you already have a Matrix account you can log in instead.": "If you already have a Matrix account you can log in instead.",
- "Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions",
- "Not a valid Riot keyfile": "Not a valid Riot keyfile",
- "Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?",
- "Disable Peer-to-Peer for 1:1 calls": "Disable Peer-to-Peer for 1:1 calls",
- "Do you want to set an email address?": "Do you want to set an email address?",
- "This will allow you to reset your password and receive notifications.": "This will allow you to reset your password and receive notifications.",
- "To return to your account in future you need to set a password": "To return to your account in future you need to set a password",
- "Skip":"Skip",
- "Start verification": "Start verification",
- "Share without verifying": "Share without verifying",
- "Ignore request": "Ignore request",
- "You added a new device '%(displayName)s', which is requesting encryption keys.": "You added a new device '%(displayName)s', which is requesting encryption keys.",
- "Your unverified device '%(displayName)s' is requesting encryption keys.": "Your unverified device '%(displayName)s' is requesting encryption keys.",
- "Encryption key request": "Encryption key request",
- "Autocomplete Delay (ms):": "Autocomplete Delay (ms):"
+ "Add a widget": "Add a widget",
+ "af": "Afrikaans",
+ "ar-ae": "Arabic (U.A.E.)",
+ "ar-bh": "Arabic (Bahrain)",
+ "ar-dz": "Arabic (Algeria)",
+ "ar-eg": "Arabic (Egypt)",
+ "ar-iq": "Arabic (Iraq)",
+ "ar-jo": "Arabic (Jordan)",
+ "ar-kw": "Arabic (Kuwait)",
+ "ar-lb": "Arabic (Lebanon)",
+ "ar-ly": "Arabic (Libya)",
+ "ar-ma": "Arabic (Morocco)",
+ "ar-om": "Arabic (Oman)",
+ "ar-qa": "Arabic (Qatar)",
+ "ar-sa": "Arabic (Saudi Arabia)",
+ "ar-sy": "Arabic (Syria)",
+ "ar-tn": "Arabic (Tunisia)",
+ "ar-ye": "Arabic (Yemen)",
+ "be": "Belarusian",
+ "bg": "Bulgarian",
+ "ca": "Catalan",
+ "cs": "Czech",
+ "da": "Danish",
+ "de-at": "German (Austria)",
+ "de-ch": "German (Switzerland)",
+ "de": "German",
+ "de-li": "German (Liechtenstein)",
+ "de-lu": "German (Luxembourg)",
+ "el": "Greek",
+ "en-au": "English (Australia)",
+ "en-bz": "English (Belize)",
+ "en-ca": "English (Canada)",
+ "en": "English",
+ "en-gb": "English (United Kingdom)",
+ "en-ie": "English (Ireland)",
+ "en-jm": "English (Jamaica)",
+ "en-nz": "English (New Zealand)",
+ "en-tt": "English (Trinidad)",
+ "en-us": "English (United States)",
+ "en-za": "English (South Africa)",
+ "es-ar": "Spanish (Argentina)",
+ "es-bo": "Spanish (Bolivia)",
+ "es-cl": "Spanish (Chile)",
+ "es-co": "Spanish (Colombia)",
+ "es-cr": "Spanish (Costa Rica)",
+ "es-do": "Spanish (Dominican Republic)",
+ "es-ec": "Spanish (Ecuador)",
+ "es-gt": "Spanish (Guatemala)",
+ "es-hn": "Spanish (Honduras)",
+ "es-mx": "Spanish (Mexico)",
+ "es-ni": "Spanish (Nicaragua)",
+ "es-pa": "Spanish (Panama)",
+ "es-pe": "Spanish (Peru)",
+ "es-pr": "Spanish (Puerto Rico)",
+ "es-py": "Spanish (Paraguay)",
+ "es": "Spanish (Spain)",
+ "es-sv": "Spanish (El Salvador)",
+ "es-uy": "Spanish (Uruguay)",
+ "es-ve": "Spanish (Venezuela)",
+ "et": "Estonian",
+ "eu": "Basque (Basque)",
+ "fa": "Farsi",
+ "fi": "Finnish",
+ "fo": "Faeroese",
+ "fr-be": "French (Belgium)",
+ "fr-ca": "French (Canada)",
+ "fr-ch": "French (Switzerland)",
+ "fr": "French",
+ "fr-lu": "French (Luxembourg)",
+ "ga": "Irish",
+ "gd": "Gaelic (Scotland)",
+ "he": "Hebrew",
+ "hi": "Hindi",
+ "hr": "Croatian",
+ "hu": "Hungarian",
+ "id": "Indonesian",
+ "is": "Icelandic",
+ "it-ch": "Italian (Switzerland)",
+ "it": "Italian",
+ "ja": "Japanese",
+ "ji": "Yiddish",
+ "ko": "Korean",
+ "lt": "Lithuanian",
+ "lv": "Latvian",
+ "mk": "Macedonian (FYROM)",
+ "ms": "Malaysian",
+ "mt": "Maltese",
+ "nl-be": "Dutch (Belgium)",
+ "nl": "Dutch",
+ "no": "Norwegian",
+ "pl": "Polish",
+ "pt-br": "Brazilian Portuguese",
+ "pt": "Portuguese",
+ "rm": "Rhaeto-Romanic",
+ "ro-mo": "Romanian (Republic of Moldova)",
+ "ro": "Romanian",
+ "ru-mo": "Russian (Republic of Moldova)",
+ "ru": "Russian",
+ "sb": "Sorbian",
+ "sk": "Slovak",
+ "sl": "Slovenian",
+ "sq": "Albanian",
+ "sr": "Serbian",
+ "sv-fi": "Swedish (Finland)",
+ "sv": "Swedish",
+ "sx": "Sutu",
+ "sz": "Sami (Lappish)",
+ "th": "Thai",
+ "tn": "Tswana",
+ "tr": "Turkish",
+ "ts": "Tsonga",
+ "uk": "Ukrainian",
+ "ur": "Urdu",
+ "ve": "Venda",
+ "vi": "Vietnamese",
+ "xh": "Xhosa",
+ "zh-cn": "Chinese (PRC)",
+ "zh-hk": "Chinese (Hong Kong SAR)",
+ "zh-sg": "Chinese (Singapore)",
+ "zh-tw": "Chinese (Taiwan)",
+ "zu": "Zulu",
+ "a room": "a room",
+ "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains",
+ "Accept": "Accept",
+ "%(targetName)s accepted an invitation.": "%(targetName)s accepted an invitation.",
+ "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepted the invitation for %(displayName)s.",
+ "Account": "Account",
+ "Access Token:": "Access Token:",
+ "Active call (%(roomName)s)": "Active call (%(roomName)s)",
+ "Add": "Add",
+ "Add a topic": "Add a topic",
+ "Add email address": "Add email address",
+ "Add phone number": "Add phone number",
+ "Admin": "Admin",
+ "Admin tools": "Admin tools",
+ "And %(count)s more...": "And %(count)s more...",
+ "VoIP": "VoIP",
+ "Missing Media Permissions, click here to request.": "Missing Media Permissions, click here to request.",
+ "No Microphones detected": "No Microphones detected",
+ "No Webcams detected": "No Webcams detected",
+ "No media permissions": "No media permissions",
+ "You may need to manually permit Riot to access your microphone/webcam": "You may need to manually permit Riot to access your microphone/webcam",
+ "Default Device": "Default Device",
+ "Microphone": "Microphone",
+ "Camera": "Camera",
+ "Advanced": "Advanced",
+ "Algorithm": "Algorithm",
+ "Hide removed messages": "Hide removed messages",
+ "Always show message timestamps": "Always show message timestamps",
+ "Authentication": "Authentication",
+ "Alias (optional)": "Alias (optional)",
+ "all room members": "all room members",
+ "all room members, from the point they are invited": "all room members, from the point they are invited",
+ "all room members, from the point they joined": "all room members, from the point they joined",
+ "and": "and",
+ "%(items)s and %(remaining)s others": "%(items)s and %(remaining)s others",
+ "%(items)s and one other": "%(items)s and one other",
+ "%(items)s and %(lastItem)s": "%(items)s and %(lastItem)s",
+ "and %(overflowCount)s others...": "and %(overflowCount)s others...",
+ "and one other...": "and one other...",
+ "%(names)s and %(lastPerson)s are typing": "%(names)s and %(lastPerson)s are typing",
+ "%(names)s and one other are typing": "%(names)s and one other are typing",
+ "%(names)s and %(count)s others are typing": "%(names)s and %(count)s others are typing",
+ "An email has been sent to": "An email has been sent to",
+ "A new password must be entered.": "A new password must be entered.",
+ "%(senderName)s answered the call.": "%(senderName)s answered the call.",
+ "anyone": "anyone",
+ "An error has occurred.": "An error has occurred.",
+ "Anyone": "Anyone",
+ "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?": "Are you sure?",
+ "Are you sure you want to leave the room '%(roomName)s'?": "Are you sure you want to leave the room '%(roomName)s'?",
+ "Are you sure you want to reject the invitation?": "Are you sure you want to reject the invitation?",
+ "Are you sure you want to upload the following files?": "Are you sure you want to upload the following files?",
+ "Attachment": "Attachment",
+ "Autoplay GIFs and videos": "Autoplay GIFs and videos",
+ "%(senderName)s banned %(targetName)s.": "%(senderName)s banned %(targetName)s.",
+ "Ban": "Ban",
+ "Banned users": "Banned users",
+ "Bans user with given id": "Bans user with given id",
+ "Blacklisted": "Blacklisted",
+ "Bug Report": "Bug Report",
+ "Bulk Options": "Bulk Options",
+ "Call Timeout": "Call Timeout",
+ "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.",
+ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.",
+ "Can't load user settings": "Can't load user settings",
+ "Change Password": "Change Password",
+ "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.",
+ "%(senderName)s changed their profile picture.": "%(senderName)s changed their profile picture.",
+ "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s changed the power level of %(powerLevelDiffText)s.",
+ "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s changed the room name to %(roomName)s.",
+ "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s removed the room name.",
+ "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s changed the topic to \"%(topic)s\".",
+ "Changes to who can read history will only apply to future messages in this room": "Changes to who can read history will only apply to future messages in this room",
+ "Changes your display nickname": "Changes your display nickname",
+ "changing room on a RoomView is not supported": "changing room on a RoomView is not supported",
+ "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.",
+ "Claimed Ed25519 fingerprint key": "Claimed Ed25519 fingerprint key",
+ "Clear Cache and Reload": "Clear Cache and Reload",
+ "Clear Cache": "Clear Cache",
+ "Click here to join the discussion!": "Click here to join the discussion!",
+ "Click here to fix": "Click here to fix",
+ "Click to mute audio": "Click to mute audio",
+ "Click to mute video": "Click to mute video",
+ "click to reveal": "click to reveal",
+ "Click to unmute video": "Click to unmute video",
+ "Click to unmute audio": "Click to unmute audio",
+ "Close": "Close",
+ "Command error": "Command error",
+ "Commands": "Commands",
+ "Conference call failed.": "Conference call failed.",
+ "Conference calling is in development and may not be reliable.": "Conference calling is in development and may not be reliable.",
+ "Conference calls are not supported in encrypted rooms": "Conference calls are not supported in encrypted rooms",
+ "Conference calls are not supported in this client": "Conference calls are not supported in this client",
+ "Confirm password": "Confirm password",
+ "Confirm your new password": "Confirm your new password",
+ "Continue": "Continue",
+ "Could not connect to the integration server": "Could not connect to the integration server",
+ "%(count)s new messages": {
+ "one": "%(count)s new message",
+ "other": "%(count)s new messages"
+ },
+ "Create a new chat or reuse an existing one": "Create a new chat or reuse an existing one",
+ "Create an account": "Create an account",
+ "Create Room": "Create Room",
+ "Cryptography": "Cryptography",
+ "Current password": "Current password",
+ "Curve25519 identity key": "Curve25519 identity key",
+ "Custom": "Custom",
+ "Custom level": "Custom level",
+ "/ddg is not a command": "/ddg is not a command",
+ "Deactivate Account": "Deactivate Account",
+ "Deactivate my account": "Deactivate my account",
+ "Decline": "Decline",
+ "Decrypt %(text)s": "Decrypt %(text)s",
+ "Decryption error": "Decryption error",
+ "Delete": "Delete",
+ "demote": "demote",
+ "Deops user with given id": "Deops user with given id",
+ "Default": "Default",
+ "Define the power level of a user": "Define the power level of a user",
+ "Device already verified!": "Device already verified!",
+ "Device ID": "Device ID",
+ "Device ID:": "Device ID:",
+ "device id: ": "device id: ",
+ "Device key:": "Device key:",
+ "Devices": "Devices",
+ "Devices will not yet be able to decrypt history from before they joined the room": "Devices will not yet be able to decrypt history from before they joined the room",
+ "Direct Chat": "Direct Chat",
+ "Direct chats": "Direct chats",
+ "Disable Notifications": "Disable Notifications",
+ "disabled": "disabled",
+ "Disable inline URL previews by default": "Disable inline URL previews by default",
+ "Disable markdown formatting": "Disable markdown formatting",
+ "Disinvite": "Disinvite",
+ "Display name": "Display name",
+ "Displays action": "Displays action",
+ "Don't send typing notifications": "Don't send typing notifications",
+ "Download %(text)s": "Download %(text)s",
+ "Drop File Here": "Drop File Here",
+ "Drop here %(toAction)s": "Drop here %(toAction)s",
+ "Drop here to tag %(section)s": "Drop here to tag %(section)s",
+ "Ed25519 fingerprint": "Ed25519 fingerprint",
+ "Email": "Email",
+ "Email address": "Email address",
+ "Email address (optional)": "Email address (optional)",
+ "Email, name or matrix ID": "Email, name or matrix ID",
+ "Emoji": "Emoji",
+ "Enable automatic language detection for syntax highlighting": "Enable automatic language detection for syntax highlighting",
+ "Enable encryption": "Enable encryption",
+ "Enable Notifications": "Enable Notifications",
+ "enabled": "enabled",
+ "Encrypted by a verified device": "Encrypted by a verified device",
+ "Encrypted by an unverified device": "Encrypted by an unverified device",
+ "Encrypted messages will not be visible on clients that do not yet implement encryption": "Encrypted messages will not be visible on clients that do not yet implement encryption",
+ "Encrypted room": "Encrypted room",
+ "Encryption is enabled in this room": "Encryption is enabled in this room",
+ "Encryption is not enabled in this room": "Encryption is not enabled in this room",
+ "%(senderName)s ended the call.": "%(senderName)s ended the call.",
+ "End-to-end encryption information": "End-to-end encryption information",
+ "End-to-end encryption is in beta and may not be reliable": "End-to-end encryption is in beta and may not be reliable",
+ "Enter Code": "Enter Code",
+ "Enter passphrase": "Enter passphrase",
+ "Error": "Error",
+ "Error decrypting attachment": "Error decrypting attachment",
+ "Error: Problem communicating with the given homeserver.": "Error: Problem communicating with the given homeserver.",
+ "Event information": "Event information",
+ "Existing Call": "Existing Call",
+ "Export": "Export",
+ "Export E2E room keys": "Export E2E room keys",
+ "Failed to ban user": "Failed to ban user",
+ "Failed to change password. Is your password correct?": "Failed to change password. Is your password correct?",
+ "Failed to change power level": "Failed to change power level",
+ "Failed to delete device": "Failed to delete device",
+ "Failed to fetch avatar URL": "Failed to fetch avatar URL",
+ "Failed to forget room %(errCode)s": "Failed to forget room %(errCode)s",
+ "Failed to join room": "Failed to join room",
+ "Failed to join the room": "Failed to join the room",
+ "Failed to kick": "Failed to kick",
+ "Failed to leave room": "Failed to leave room",
+ "Failed to load timeline position": "Failed to load timeline position",
+ "Failed to lookup current room": "Failed to lookup current room",
+ "Failed to mute user": "Failed to mute user",
+ "Failed to register as guest:": "Failed to register as guest:",
+ "Failed to reject invite": "Failed to reject invite",
+ "Failed to reject invitation": "Failed to reject invitation",
+ "Failed to save settings": "Failed to save settings",
+ "Failed to send email": "Failed to send email",
+ "Failed to send request.": "Failed to send request.",
+ "Failed to set avatar.": "Failed to set avatar.",
+ "Failed to set display name": "Failed to set display name",
+ "Failed to set up conference call": "Failed to set up conference call",
+ "Failed to toggle moderator status": "Failed to toggle moderator status",
+ "Failed to unban": "Failed to unban",
+ "Failed to upload file": "Failed to upload file",
+ "Failed to upload profile picture!": "Failed to upload profile picture!",
+ "Failed to verify email address: make sure you clicked the link in the email": "Failed to verify email address: make sure you clicked the link in the email",
+ "Failure to create room": "Failure to create room",
+ "Favourite": "Favourite",
+ "favourite": "favourite",
+ "Favourites": "Favourites",
+ "Fill screen": "Fill screen",
+ "Filter room members": "Filter room members",
+ "Forget room": "Forget room",
+ "Forgot your password?": "Forgot your password?",
+ "For security, this session has been signed out. Please sign in again.": "For security, this session has been signed out. Please sign in again.",
+ "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.",
+ "Found a bug?": "Found a bug?",
+ "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s",
+ "Guest access is disabled on this Home Server.": "Guest access is disabled on this Home Server.",
+ "Guests can't set avatars. Please register.": "Guests can't set avatars. Please register.",
+ "Guest users can't create new rooms. Please register to create room and start a chat.": "Guest users can't create new rooms. Please register to create room and start a chat.",
+ "Guest users can't upload files. Please register to upload.": "Guest users can't upload files. Please register to upload.",
+ "Guests can't use labs features. Please register.": "Guests can't use labs features. Please register.",
+ "Guests cannot join this room even if explicitly invited.": "Guests cannot join this room even if explicitly invited.",
+ "had": "had",
+ "Hangup": "Hangup",
+ "Hide Apps": "Hide Apps",
+ "Hide read receipts": "Hide read receipts",
+ "Hide Text Formatting Toolbar": "Hide Text Formatting Toolbar",
+ "Historical": "Historical",
+ "Home": "Home",
+ "Homeserver is": "Homeserver is",
+ "Identity Server is": "Identity Server is",
+ "I have verified my email address": "I have verified my email address",
+ "Import": "Import",
+ "Import E2E room keys": "Import E2E room keys",
+ "Incoming call from %(name)s": "Incoming call from %(name)s",
+ "Incoming video call from %(name)s": "Incoming video call from %(name)s",
+ "Incoming voice call from %(name)s": "Incoming voice call from %(name)s",
+ "Incorrect username and/or password.": "Incorrect username and/or password.",
+ "Incorrect verification code": "Incorrect verification code",
+ "Interface Language": "Interface Language",
+ "Invalid alias format": "Invalid alias format",
+ "Invalid address format": "Invalid address format",
+ "Invalid Email Address": "Invalid Email Address",
+ "Invalid file%(extra)s": "Invalid file%(extra)s",
+ "%(senderName)s invited %(targetName)s.": "%(senderName)s invited %(targetName)s.",
+ "Invite new room members": "Invite new room members",
+ "Invited": "Invited",
+ "Invites": "Invites",
+ "Invites user with given id to current room": "Invites user with given id to current room",
+ "'%(alias)s' is not a valid format for an address": "'%(alias)s' is not a valid format for an address",
+ "'%(alias)s' is not a valid format for an alias": "'%(alias)s' is not a valid format for an alias",
+ "%(displayName)s is typing": "%(displayName)s is typing",
+ "Sign in with": "Sign in with",
+ "Join as voice or video.": "Join as voice or video.",
+ "Join Room": "Join Room",
+ "joined and left": "joined and left",
+ "joined": "joined",
+ "%(targetName)s joined the room.": "%(targetName)s joined the room.",
+ "Joins room with given alias": "Joins room with given alias",
+ "Jump to first unread message.": "Jump to first unread message.",
+ "%(senderName)s kicked %(targetName)s.": "%(senderName)s kicked %(targetName)s.",
+ "Kick": "Kick",
+ "Kicks user with given id": "Kicks user with given id",
+ "Labs": "Labs",
+ "Last seen": "Last seen",
+ "Leave room": "Leave room",
+ "left and rejoined": "left and rejoined",
+ "left": "left",
+ "%(targetName)s left the room.": "%(targetName)s left the room.",
+ "Level:": "Level:",
+ "List this room in %(domain)s's room directory?": "List this room in %(domain)s's room directory?",
+ "Local addresses for this room:": "Local addresses for this room:",
+ "Logged in as:": "Logged in as:",
+ "Login as guest": "Login as guest",
+ "Logout": "Logout",
+ "Low priority": "Low priority",
+ "%(senderName)s made future room history visible to": "%(senderName)s made future room history visible to",
+ "Manage Integrations": "Manage Integrations",
+ "Markdown is disabled": "Markdown is disabled",
+ "Markdown is enabled": "Markdown is enabled",
+ "matrix-react-sdk version:": "matrix-react-sdk version:",
+ "Matrix Apps": "Matrix Apps",
+ "Members only": "Members only",
+ "Message not sent due to unknown devices being present": "Message not sent due to unknown devices being present",
+ "Missing room_id in request": "Missing room_id in request",
+ "Missing user_id in request": "Missing user_id in request",
+ "Mobile phone number": "Mobile phone number",
+ "Mobile phone number (optional)": "Mobile phone number (optional)",
+ "Moderator": "Moderator",
+ "Must be viewing a room": "Must be viewing a room",
+ "Mute": "Mute",
+ "my Matrix ID": "my Matrix ID",
+ "Name": "Name",
+ "Never send encrypted messages to unverified devices from this device": "Never send encrypted messages to unverified devices from this device",
+ "Never send encrypted messages to unverified devices in this room": "Never send encrypted messages to unverified devices in this room",
+ "Never send encrypted messages to unverified devices in this room from this device": "Never send encrypted messages to unverified devices in this room from this device",
+ "New address (e.g. #foo:%(localDomain)s)": "New address (e.g. #foo:%(localDomain)s)",
+ "New Composer & Autocomplete": "New Composer & Autocomplete",
+ "New password": "New password",
+ "New passwords don't match": "New passwords don't match",
+ "New passwords must match each other.": "New passwords must match each other.",
+ "none": "none",
+ "not set": "not set",
+ "not specified": "not specified",
+ "Notifications": "Notifications",
+ "(not supported by this browser)": "(not supported by this browser)",
+ "": "",
+ "NOT verified": "NOT verified",
+ "No devices with registered encryption keys": "No devices with registered encryption keys",
+ "No display name": "No display name",
+ "No more results": "No more results",
+ "No results": "No results",
+ "No users have specific privileges in this room": "No users have specific privileges in this room",
+ "OK": "OK",
+ "olm version:": "olm version:",
+ "Once encryption is enabled for a room it cannot be turned off again (for now)": "Once encryption is enabled for a room it cannot be turned off again (for now)",
+ "Once you've followed the link it contains, click below": "Once you've followed the link it contains, click below",
+ "Only people who have been invited": "Only people who have been invited",
+ "Operation failed": "Operation failed",
+ "Otherwise, click here to send a bug report.": "Otherwise, click here to send a bug report.",
+ "Password": "Password",
+ "Password:": "Password:",
+ "Passwords can't be empty": "Passwords can't be empty",
+ "People": "People",
+ "Permissions": "Permissions",
+ "Phone": "Phone",
+ "%(senderName)s placed a %(callType)s call.": "%(senderName)s placed a %(callType)s call.",
+ "Please check your email and click on the link it contains. Once this is done, click continue.": "Please check your email and click on the link it contains. Once this is done, click continue.",
+ "Please Register": "Please Register",
+ "Power level must be positive integer.": "Power level must be positive integer.",
+ "Press": "Press",
+ "Press to start a chat with someone": "Press to start a chat with someone",
+ "Privacy warning": "Privacy warning",
+ "Private Chat": "Private Chat",
+ "Privileged Users": "Privileged Users",
+ "Profile": "Profile",
+ "Public Chat": "Public Chat",
+ "Reason": "Reason",
+ "Reason: %(reasonText)s": "Reason: %(reasonText)s",
+ "Revoke Moderator": "Revoke Moderator",
+ "Refer a friend to Riot:": "Refer a friend to Riot:",
+ "Register": "Register",
+ "rejected": "rejected",
+ "%(targetName)s rejected the invitation.": "%(targetName)s rejected the invitation.",
+ "Reject invitation": "Reject invitation",
+ "Rejoin": "Rejoin",
+ "Remote addresses for this room:": "Remote addresses for this room:",
+ "Remove Contact Information?": "Remove Contact Information?",
+ "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removed their display name (%(oldDisplayName)s).",
+ "%(senderName)s removed their profile picture.": "%(senderName)s removed their profile picture.",
+ "Remove": "Remove",
+ "Remove %(threePid)s?": "Remove %(threePid)s?",
+ "%(senderName)s requested a VoIP conference.": "%(senderName)s requested a VoIP conference.",
+ "Report it": "Report it",
+ "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.",
+ "restore": "restore",
+ "Results from DuckDuckGo": "Results from DuckDuckGo",
+ "Return to app": "Return to app",
+ "Return to login screen": "Return to login screen",
+ "Riot does not have permission to send you notifications - please check your browser settings": "Riot does not have permission to send you notifications - please check your browser settings",
+ "Riot was not given permission to send notifications - please try again": "Riot was not given permission to send notifications - please try again",
+ "riot-web version:": "riot-web version:",
+ "Room %(roomId)s not visible": "Room %(roomId)s not visible",
+ "Room Colour": "Room Colour",
+ "Room contains unknown devices": "Room contains unknown devices",
+ "Room name (optional)": "Room name (optional)",
+ "%(roomName)s does not exist.": "%(roomName)s does not exist.",
+ "%(roomName)s is not accessible at this time.": "%(roomName)s is not accessible at this time.",
+ "Rooms": "Rooms",
+ "Save": "Save",
+ "Scroll to bottom of page": "Scroll to bottom of page",
+ "Scroll to unread messages": "Scroll to unread messages",
+ "Search": "Search",
+ "Search failed": "Search failed",
+ "Searches DuckDuckGo for results": "Searches DuckDuckGo for results",
+ "Searching known users": "Searching known users",
+ "Seen by %(userName)s at %(dateTime)s": "Seen by %(userName)s at %(dateTime)s",
+ "Send a message (unencrypted)": "Send a message (unencrypted)",
+ "Send an encrypted message": "Send an encrypted message",
+ "Send anyway": "Send anyway",
+ "Sender device information": "Sender device information",
+ "Send Invites": "Send Invites",
+ "Send Reset Email": "Send Reset Email",
+ "sent an image": "sent an image",
+ "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sent an image.",
+ "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.",
+ "sent a video": "sent a video",
+ "Server error": "Server error",
+ "Server may be unavailable or overloaded": "Server may be unavailable or overloaded",
+ "Server may be unavailable, overloaded, or search timed out :(": "Server may be unavailable, overloaded, or search timed out :(",
+ "Server may be unavailable, overloaded, or the file too big": "Server may be unavailable, overloaded, or the file too big",
+ "Server may be unavailable, overloaded, or you hit a bug.": "Server may be unavailable, overloaded, or you hit a bug.",
+ "Server unavailable, overloaded, or something else went wrong.": "Server unavailable, overloaded, or something else went wrong.",
+ "Session ID": "Session ID",
+ "%(senderName)s set a profile picture.": "%(senderName)s set a profile picture.",
+ "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s set their display name to %(displayName)s.",
+ "Set": "Set",
+ "Settings": "Settings",
+ "Show Apps": "Show Apps",
+ "Show panel": "Show panel",
+ "Show Text Formatting Toolbar": "Show Text Formatting Toolbar",
+ "Show timestamps in 12 hour format (e.g. 2:30pm)": "Show timestamps in 12 hour format (e.g. 2:30pm)",
+ "Signed Out": "Signed Out",
+ "Sign in": "Sign in",
+ "Sign out": "Sign out",
+ "since the point in time of selecting this option": "since the point in time of selecting this option",
+ "since they joined": "since they joined",
+ "since they were invited": "since they were invited",
+ "Some of your messages have not been sent.": "Some of your messages have not been sent.",
+ "Someone": "Someone",
+ "Sorry, this homeserver is using a login which is not recognised ": "Sorry, this homeserver is using a login which is not recognised ",
+ "Start a chat": "Start a chat",
+ "Start authentication": "Start authentication",
+ "Start Chat": "Start Chat",
+ "Submit": "Submit",
+ "Success": "Success",
+ "tag as %(tagName)s": "tag as %(tagName)s",
+ "tag direct chat": "tag direct chat",
+ "Tagged as: ": "Tagged as: ",
+ "The default role for new room members is": "The default role for new room members is",
+ "The main address for this room is": "The main address for this room is",
+ "The phone number entered looks invalid": "The phone number entered looks invalid",
+ "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.",
+ "This action cannot be performed by a guest user. Please register to be able to do this.": "This action cannot be performed by a guest user. Please register to be able to do this.",
+ "This email address is already in use": "This email address is already in use",
+ "This email address was not found": "This email address was not found",
+ "%(actionVerb)s this person?": "%(actionVerb)s this person?",
+ "The email address linked to your account must be entered.": "The email address linked to your account must be entered.",
+ "The file '%(fileName)s' exceeds this home server's size limit for uploads": "The file '%(fileName)s' exceeds this home server's size limit for uploads",
+ "The file '%(fileName)s' failed to upload": "The file '%(fileName)s' failed to upload",
+ "The remote side failed to pick up": "The remote side failed to pick up",
+ "This Home Server does not support login using email address.": "This Home Server does not support login using email address.",
+ "This invitation was sent to an email address which is not associated with this account:": "This invitation was sent to an email address which is not associated with this account:",
+ "There was a problem logging in.": "There was a problem logging in.",
+ "This room has no local addresses": "This room has no local addresses",
+ "This room is not recognised.": "This room is not recognised.",
+ "These are experimental features that may break in unexpected ways": "These are experimental features that may break in unexpected ways",
+ "The visibility of existing history will be unchanged": "The visibility of existing history will be unchanged",
+ "This doesn't appear to be a valid email address": "This doesn't appear to be a valid email address",
+ "This is a preview of this room. Room interactions have been disabled": "This is a preview of this room. Room interactions have been disabled",
+ "This phone number is already in use": "This phone number is already in use",
+ "This room": "This room",
+ "This room is not accessible by remote Matrix servers": "This room is not accessible by remote Matrix servers",
+ "This room's internal ID is": "This room's internal ID is",
+ "times": "times",
+ "To ban users": "To ban users",
+ "to browse the directory": "to browse the directory",
+ "To configure the room": "To configure the room",
+ "to demote": "to demote",
+ "to favourite": "to favourite",
+ "To invite users into the room": "To invite users into the room",
+ "To kick users": "To kick users",
+ "To link to a room it must have an address.": "To link to a room it must have an address.",
+ "to make a room or": "to make a room or",
+ "To remove other users' messages": "To remove other users' messages",
+ "To reset your password, enter the email address linked to your account": "To reset your password, enter the email address linked to your account",
+ "to restore": "to restore",
+ "To send events of type": "To send events of type",
+ "To send messages": "To send messages",
+ "to start a chat with someone": "to start a chat with someone",
+ "to tag as %(tagName)s": "to tag as %(tagName)s",
+ "to tag direct chat": "to tag direct chat",
+ "To use it, just wait for autocomplete results to load and tab through them.": "To use it, just wait for autocomplete results to load and tab through them.",
+ "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.",
+ "Tried to load a specific point in this room's timeline, but was unable to find it.": "Tried to load a specific point in this room's timeline, but was unable to find it.",
+ "Turn Markdown off": "Turn Markdown off",
+ "Turn Markdown on": "Turn Markdown on",
+ "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).",
+ "Unable to add email address": "Unable to add email address",
+ "Unable to create widget.": "Unable to create widget.",
+ "Unable to remove contact information": "Unable to remove contact information",
+ "Unable to restore previous session": "Unable to restore previous session",
+ "Unable to verify email address.": "Unable to verify email address.",
+ "Unban": "Unban",
+ "Unbans user with given id": "Unbans user with given id",
+ "%(senderName)s unbanned %(targetName)s.": "%(senderName)s unbanned %(targetName)s.",
+ "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Unable to ascertain that the address this invite was sent to matches one associated with your account.",
+ "Unable to capture screen": "Unable to capture screen",
+ "Unable to enable Notifications": "Unable to enable Notifications",
+ "Unable to load device list": "Unable to load device list",
+ "Undecryptable": "Undecryptable",
+ "Unencrypted room": "Unencrypted room",
+ "unencrypted": "unencrypted",
+ "Unencrypted message": "Unencrypted message",
+ "unknown caller": "unknown caller",
+ "Unknown command": "Unknown command",
+ "unknown device": "unknown device",
+ "unknown error code": "unknown error code",
+ "Unknown room %(roomId)s": "Unknown room %(roomId)s",
+ "Unknown (user, device) pair:": "Unknown (user, device) pair:",
+ "unknown": "unknown",
+ "Unmute": "Unmute",
+ "Unnamed Room": "Unnamed Room",
+ "Unrecognised command:": "Unrecognised command:",
+ "Unrecognised room alias:": "Unrecognised room alias:",
+ "Unverified": "Unverified",
+ "Uploading %(filename)s and %(count)s others": {
+ "zero": "Uploading %(filename)s",
+ "one": "Uploading %(filename)s and %(count)s other",
+ "other": "Uploading %(filename)s and %(count)s others"
+ },
+ "uploaded a file": "uploaded a file",
+ "Upload avatar": "Upload avatar",
+ "Upload Failed": "Upload Failed",
+ "Upload Files": "Upload Files",
+ "Upload file": "Upload file",
+ "Upload new:": "Upload new:",
+ "Usage": "Usage",
+ "Use compact timeline layout": "Use compact timeline layout",
+ "Use with caution": "Use with caution",
+ "User ID": "User ID",
+ "User Interface": "User Interface",
+ "%(user)s is a": "%(user)s is a",
+ "User name": "User name",
+ "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (power %(powerLevelNumber)s)",
+ "Username invalid: %(errMessage)s": "Username invalid: %(errMessage)s",
+ "Users": "Users",
+ "User": "User",
+ "Verification Pending": "Verification Pending",
+ "Verification": "Verification",
+ "verified": "verified",
+ "Verified": "Verified",
+ "Verified key": "Verified key",
+ "Video call": "Video call",
+ "Voice call": "Voice call",
+ "VoIP conference finished.": "VoIP conference finished.",
+ "VoIP conference started.": "VoIP conference started.",
+ "VoIP is unsupported": "VoIP is unsupported",
+ "(could not connect media)": "(could not connect media)",
+ "(no answer)": "(no answer)",
+ "(unknown failure: %(reason)s)": "(unknown failure: %(reason)s)",
+ "(warning: cannot be disabled again!)": "(warning: cannot be disabled again!)",
+ "Warning!": "Warning!",
+ "WARNING: Device already verified, but keys do NOT MATCH!": "WARNING: Device already verified, but keys do NOT MATCH!",
+ "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!",
+ "Who can access this room?": "Who can access this room?",
+ "Who can read history?": "Who can read history?",
+ "Who would you like to add to this room?": "Who would you like to add to this room?",
+ "Who would you like to communicate with?": "Who would you like to communicate with?",
+ "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s withdrew %(targetName)s's invitation.",
+ "Would you like to accept or decline this invitation?": "Would you like to accept or decline this invitation?",
+ "You already have existing direct chats with this user:": "You already have existing direct chats with this user:",
+ "You are already in a call.": "You are already in a call.",
+ "You're not in any rooms yet! Press to make a room or to browse the directory": "You're not in any rooms yet! Press to make a room or to browse the directory",
+ "You are trying to access %(roomName)s.": "You are trying to access %(roomName)s.",
+ "You cannot place a call with yourself.": "You cannot place a call with yourself.",
+ "You cannot place VoIP calls in this browser.": "You cannot place VoIP calls in this browser.",
+ "You do not have permission to post to this room": "You do not have permission to post to this room",
+ "You have been banned from %(roomName)s by %(userName)s.": "You have been banned from %(roomName)s by %(userName)s.",
+ "You have been invited to join this room by %(inviterName)s": "You have been invited to join this room by %(inviterName)s",
+ "You have been kicked from %(roomName)s by %(userName)s.": "You have been kicked from %(roomName)s by %(userName)s.",
+ "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device",
+ "You have disabled URL previews by default.": "You have disabled URL previews by default.",
+ "You have enabled URL previews by default.": "You have enabled URL previews by default.",
+ "You have entered an invalid contact. Try using their Matrix ID or email address.": "You have entered an invalid contact. Try using their Matrix ID or email address.",
+ "You have no visible notifications": "You have no visible notifications",
+ "You may wish to login with a different account, or add this email to this account.": "You may wish to login with a different account, or add this email to this account.",
+ "you must be a": "you must be a",
+ "You must register to use this functionality": "You must register to use this functionality",
+ "You need to be able to invite users to do that.": "You need to be able to invite users to do that.",
+ "You need to be logged in.": "You need to be logged in.",
+ "You need to enter a user name.": "You need to enter a user name.",
+ "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Your email address does not appear to be associated with a Matrix ID on this Homeserver.",
+ "Your password has been reset": "Your password has been reset",
+ "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them",
+ "You seem to be in a call, are you sure you want to quit?": "You seem to be in a call, are you sure you want to quit?",
+ "You seem to be uploading files, are you sure you want to quit?": "You seem to be uploading files, are you sure you want to quit?",
+ "You should not yet trust it to secure data": "You should not yet trust it to secure data",
+ "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.",
+ "Your home server does not support device management.": "Your home server does not support device management.",
+ "Sun": "Sun",
+ "Mon": "Mon",
+ "Tue": "Tue",
+ "Wed": "Wed",
+ "Thu": "Thu",
+ "Fri": "Fri",
+ "Sat": "Sat",
+ "Jan": "Jan",
+ "Feb": "Feb",
+ "Mar": "Mar",
+ "Apr": "Apr",
+ "May": "May",
+ "Jun": "Jun",
+ "Jul": "Jul",
+ "Aug": "Aug",
+ "Sep": "Sep",
+ "Oct": "Oct",
+ "Nov": "Nov",
+ "Dec": "Dec",
+ "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(time)s",
+ "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s",
+ "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s",
+ "Set a display name:": "Set a display name:",
+ "Set a Display Name": "Set a Display Name",
+ "Upload an avatar:": "Upload an avatar:",
+ "This server does not support authentication with a phone number.": "This server does not support authentication with a phone number.",
+ "Missing password.": "Missing password.",
+ "Passwords don't match.": "Passwords don't match.",
+ "Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Password too short (min %(MIN_PASSWORD_LENGTH)s).",
+ "This doesn't look like a valid email address.": "This doesn't look like a valid email address.",
+ "This doesn't look like a valid phone number.": "This doesn't look like a valid phone number.",
+ "User names may only contain letters, numbers, dots, hyphens and underscores.": "User names may only contain letters, numbers, dots, hyphens and underscores.",
+ "An unknown error occurred.": "An unknown error occurred.",
+ "I already have an account": "I already have an account",
+ "An error occurred: %(error_string)s": "An error occurred: %(error_string)s",
+ "Topic": "Topic",
+ "Make Moderator": "Make Moderator",
+ "Make this room private": "Make this room private",
+ "Share message history with new users": "Share message history with new users",
+ "Encrypt room": "Encrypt room",
+ "There are no visible files in this room": "There are no visible files in this room",
+ "Room": "Room",
+ "Connectivity to the server has been lost.": "Connectivity to the server has been lost.",
+ "Sent messages will be stored until your connection has returned.": "Sent messages will be stored until your connection has returned.",
+ "Auto-complete": "Auto-complete",
+ "Resend all or cancel all now. You can also select individual messages to resend or cancel.": "Resend all or cancel all now. You can also select individual messages to resend or cancel.",
+ "(~%(count)s results)": {
+ "one": "(~%(count)s result)",
+ "other": "(~%(count)s results)"
+ },
+ "Cancel": "Cancel",
+ "or": "or",
+ "Active call": "Active call",
+ "Monday": "Monday",
+ "Tuesday": "Tuesday",
+ "Wednesday": "Wednesday",
+ "Thursday": "Thursday",
+ "Friday": "Friday",
+ "Saturday": "Saturday",
+ "Sunday": "Sunday",
+ "bold": "bold",
+ "italic": "italic",
+ "strike": "strike",
+ "underline": "underline",
+ "code": "code",
+ "quote": "quote",
+ "bullet": "bullet",
+ "numbullet": "numbullet",
+ "%(severalUsers)sjoined %(repeats)s times": "%(severalUsers)sjoined %(repeats)s times",
+ "%(oneUser)sjoined %(repeats)s times": "%(oneUser)sjoined %(repeats)s times",
+ "%(severalUsers)sjoined": "%(severalUsers)sjoined",
+ "%(oneUser)sjoined": "%(oneUser)sjoined",
+ "%(severalUsers)sleft %(repeats)s times": "%(severalUsers)sleft %(repeats)s times",
+ "%(oneUser)sleft %(repeats)s times": "%(oneUser)sleft %(repeats)s times",
+ "%(severalUsers)sleft": "%(severalUsers)sleft",
+ "%(oneUser)sleft": "%(oneUser)sleft",
+ "%(severalUsers)sjoined and left %(repeats)s times": "%(severalUsers)sjoined and left %(repeats)s times",
+ "%(oneUser)sjoined and left %(repeats)s times": "%(oneUser)sjoined and left %(repeats)s times",
+ "%(severalUsers)sjoined and left": "%(severalUsers)sjoined and left",
+ "%(oneUser)sjoined and left": "%(oneUser)sjoined and left",
+ "%(severalUsers)sleft and rejoined %(repeats)s times": "%(severalUsers)sleft and rejoined %(repeats)s times",
+ "%(oneUser)sleft and rejoined %(repeats)s times": "%(oneUser)sleft and rejoined %(repeats)s times",
+ "%(severalUsers)sleft and rejoined": "%(severalUsers)sleft and rejoined",
+ "%(oneUser)sleft and rejoined": "%(oneUser)sleft and rejoined",
+ "%(severalUsers)srejected their invitations %(repeats)s times": "%(severalUsers)srejected their invitations %(repeats)s times",
+ "%(oneUser)srejected their invitation %(repeats)s times": "%(oneUser)srejected their invitation %(repeats)s times",
+ "%(severalUsers)srejected their invitations": "%(severalUsers)srejected their invitations",
+ "%(oneUser)srejected their invitation": "%(oneUser)srejected their invitation",
+ "%(severalUsers)shad their invitations withdrawn %(repeats)s times": "%(severalUsers)shad their invitations withdrawn %(repeats)s times",
+ "%(oneUser)shad their invitation withdrawn %(repeats)s times": "%(oneUser)shad their invitation withdrawn %(repeats)s times",
+ "%(severalUsers)shad their invitations withdrawn": "%(severalUsers)shad their invitations withdrawn",
+ "%(oneUser)shad their invitation withdrawn": "%(oneUser)shad their invitation withdrawn",
+ "were invited %(repeats)s times": "were invited %(repeats)s times",
+ "was invited %(repeats)s times": "was invited %(repeats)s times",
+ "were invited": "were invited",
+ "was invited": "was invited",
+ "were banned %(repeats)s times": "were banned %(repeats)s times",
+ "was banned %(repeats)s times": "was banned %(repeats)s times",
+ "were banned": "were banned",
+ "was banned": "was banned",
+ "were unbanned %(repeats)s times": "were unbanned %(repeats)s times",
+ "was unbanned %(repeats)s times": "was unbanned %(repeats)s times",
+ "were unbanned": "were unbanned",
+ "was unbanned": "was unbanned",
+ "were kicked %(repeats)s times": "were kicked %(repeats)s times",
+ "was kicked %(repeats)s times": "was kicked %(repeats)s times",
+ "were kicked": "were kicked",
+ "was kicked": "was kicked",
+ "%(severalUsers)schanged their name %(repeats)s times": "%(severalUsers)schanged their name %(repeats)s times",
+ "%(oneUser)schanged their name %(repeats)s times": "%(oneUser)schanged their name %(repeats)s times",
+ "%(severalUsers)schanged their name": "%(severalUsers)schanged their name",
+ "%(oneUser)schanged their name": "%(oneUser)schanged their name",
+ "%(severalUsers)schanged their avatar %(repeats)s times": "%(severalUsers)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",
+ "%(oneUser)schanged their avatar": "%(oneUser)schanged their avatar",
+ "Please select the destination room for this message": "Please select the destination room for this message",
+ "Create new room": "Create new room",
+ "Welcome page": "Welcome page",
+ "Room directory": "Room directory",
+ "Start chat": "Start chat",
+ "New Password": "New Password",
+ "Start automatically after system login": "Start automatically after system login",
+ "Desktop specific": "Desktop specific",
+ "Analytics": "Analytics",
+ "Opt out of analytics": "Opt out of analytics",
+ "Options": "Options",
+ "Riot collects anonymous analytics to allow us to improve the application.": "Riot collects anonymous analytics to allow us to improve the application.",
+ "Passphrases must match": "Passphrases must match",
+ "Passphrase must not be empty": "Passphrase must not be empty",
+ "Export room keys": "Export room keys",
+ "Confirm passphrase": "Confirm passphrase",
+ "Import room keys": "Import room keys",
+ "File to import": "File to import",
+ "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",
+ "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 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)s. 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)s. 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",
+ "Disable URL previews for this room (affects only you)": "Disable URL previews for this room (affects only you)",
+ "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.": "Ongoing conference call%(supportedText)s.",
+ "for %(amount)ss": "for %(amount)ss",
+ "for %(amount)sm": "for %(amount)sm",
+ "for %(amount)sh": "for %(amount)sh",
+ "for %(amount)sd": "for %(amount)sd",
+ "Online": "Online",
+ "Idle": "Idle",
+ "Offline": "Offline",
+ "Updates": "Updates",
+ "Check for update": "Check for update",
+ "Start chatting": "Start chatting",
+ "Start Chatting": "Start Chatting",
+ "Click on the button below to start chatting!": "Click on the button below to start chatting!",
+ "$senderDisplayName changed the room avatar to ": "$senderDisplayName changed the room avatar to ",
+ "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removed the room avatar.",
+ "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s changed the avatar for %(roomName)s",
+ "Username available": "Username available",
+ "Username not available": "Username not available",
+ "Something went wrong!": "Something went wrong!",
+ "This will be your account name on the homeserver, or you can pick a different server.": "This will be your account name on the homeserver, or you can pick a different server.",
+ "If you already have a Matrix account you can log in instead.": "If you already have a Matrix account you can log in instead.",
+ "Your browser does not support the required cryptography extensions": "Your browser does not support the required cryptography extensions",
+ "Not a valid Riot keyfile": "Not a valid Riot keyfile",
+ "Authentication check failed: incorrect password?": "Authentication check failed: incorrect password?",
+ "Disable Peer-to-Peer for 1:1 calls": "Disable Peer-to-Peer for 1:1 calls",
+ "Do you want to set an email address?": "Do you want to set an email address?",
+ "This will allow you to reset your password and receive notifications.": "This will allow you to reset your password and receive notifications.",
+ "To return to your account in future you need to set a password": "To return to your account in future you need to set a password",
+ "Skip": "Skip",
+ "Start verification": "Start verification",
+ "Share without verifying": "Share without verifying",
+ "Ignore request": "Ignore request",
+ "You added a new device '%(displayName)s', which is requesting encryption keys.": "You added a new device '%(displayName)s', which is requesting encryption keys.",
+ "Your unverified device '%(displayName)s' is requesting encryption keys.": "Your unverified device '%(displayName)s' is requesting encryption keys.",
+ "Encryption key request": "Encryption key request",
+ "Autocomplete Delay (ms):": "Autocomplete Delay (ms):"
}
diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json
index e060add84f..4b8b8a5d3c 100644
--- a/src/i18n/strings/en_US.json
+++ b/src/i18n/strings/en_US.json
@@ -1,4 +1,5 @@
{
+ "Add a widget": "Add a widget",
"af": "Afrikaans",
"ar-ae": "Arabic (U.A.E.)",
"ar-bh": "Arabic (Bahrain)",
@@ -311,6 +312,7 @@
"Guests cannot join this room even if explicitly invited.": "Guests cannot join this room even if explicitly invited.",
"had": "had",
"Hangup": "Hangup",
+ "Hide Apps": "Hide Apps",
"Hide read receipts": "Hide read receipts",
"Hide Text Formatting Toolbar": "Hide Text Formatting Toolbar",
"Historical": "Historical",
@@ -362,6 +364,7 @@
"Markdown is disabled": "Markdown is disabled",
"Markdown is enabled": "Markdown is enabled",
"matrix-react-sdk version:": "matrix-react-sdk version:",
+ "Matrix Apps": "Matrix Apps",
"Members only": "Members only",
"Message not sent due to unknown devices being present": "Message not sent due to unknown devices being present",
"Missing room_id in request": "Missing room_id in request",
@@ -464,6 +467,7 @@
"%(senderName)s set a profile picture.": "%(senderName)s set a profile picture.",
"%(senderName)s set their display name to %(displayName)s.": "%(senderName)s set their display name to %(displayName)s.",
"Settings": "Settings",
+ "Show Apps": "Show Apps",
"Show panel": "Show panel",
"Show timestamps in 12 hour format (e.g. 2:30pm)": "Show timestamps in 12 hour format (e.g. 2:30pm)",
"Signed Out": "Signed Out",